spyne 0.22.2 → 0.22.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/publish.yml +13 -16
- package/.github/workflows/tests.yml +28 -0
- package/README.md +1 -2
- package/karma.conf.js +37 -24
- package/lib/spyne.esm.js +2 -2
- package/lib/spyne.esm.js.map +1 -1
- package/lib/spyne.umd.js +2 -2
- package/lib/spyne.umd.js.LICENSE.txt +2 -2
- package/package.json +1 -1
- package/src/spyne/spyne-app.js +2 -2
- package/src/spyne/views/dom-element-template.js +1 -1
package/lib/spyne.umd.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/*! For license information please see spyne.umd.js.LICENSE.txt */
|
|
2
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("rxjs"),require("ramda"),require("dompurify"),require("rxjs").operators):"function"==typeof define&&define.amd?define("spyne",["rxjs","ramda","dompurify","rxjs/operators"],t):"object"==typeof exports?exports.spyne=t(require("rxjs"),require("ramda"),require("dompurify"),require("rxjs").operators):e.spyne=t(e.rxjs,e.R,e.DOMPurify,e.rxjs.operators)}(self,(e,t,r,s)=>(()=>{"use strict";var n={126(e,t,r){r.d(t,{e:()=>i});var s=r(2),n=r(9),o=r(131);class i extends s.c{constructor(e,t={}){i.validateMapMethod(t,e),void 0!==t.map&&(t.mapFn=t.map),t.extendedActionsArr=[`${e}_RESPONSE_EVENT`,[`${e}_REQUEST_EVENT`,"onFetchUpdate"]],t.sendCachedPayload=!0,super(e,t)}static validateMapMethod(e,t,r=!1){const s=(0,o.either)(o.isNil,e=>"function"!=typeof e),n=(0,o.all)(s),i=(0,o.allPass)([n,e=>e.length>=1]);return!(0,o.compose)(i,o.values,(0,o.pick)(["map","mapFn"]))(e)||(!1===r&&console.warn(`Spyne Warning: The map method for ChannelFetch, ${t}, appears to be invalid`),!1)}onRegistered(e=this.props){!0!==e?.pause&&this.startFetch()}addRegisteredActions(e){const t=(0,o.compose)((0,o.defaultTo)([]),(0,o.path)(["props","extendedActionsArr"]));return["CHANNEL_RESPONSE_EVENT",["CHANNEL_UPDATE_RESPONSE_EVENT","onFetchUpdate"],["CHANNEL_FETCH_REQUEST_EVENT","onFetchUpdate"]].concat(t(this))}startFetch(e={},t=this.onFetchReturned.bind(this)){const r=this.consolidateAllFetchProps(e);return new n.G(r,t,!1,this.props.name)}onFetchUpdate(e){const t=this.getPropsForFetch(e);this.startFetch(t)}onFetchReturned(e){return this.createChannelPayloadItem(e)}createChannelPayloadItem(e,t=`${this.props.name}_RESPONSE_EVENT`){const{name:r,sendCachedPayload:s,url:n}=this.props,o={name:r,sendCachedPayload:s,url:n};this.sendChannelPayload(t,e,o)}getPropsForFetch(e){const t=(0,o.path)(["viewStreamInfo","payload"],e);return(0,o.pick)(["mapFn","url","header","body","mode","method","responseType","debug"],t)}consolidateAllFetchProps(e,t=this.props){const r=(0,o.pick)(["mapFn","url","header","body","mode","method","responseType","debug"],t),s=(0,o.reject)(o.isNil);return(0,o.compose)(s,(e,t)=>(0,o.mergeDeepRight)(e,t))(r,e)}get observer(){return this.observer$}}},980(e,t,r){r.d(t,{m:()=>i});var s=r(131),n=r(225),o=r(961);class i{constructor(e,t,r,a,c,l){const d=e;l&&console.time(l);const E={channelName:e,action:t,srcElement:a,event:c},p=i.deepFreeze(r);if(E.payload=p,!0===n.M.debug){if(Object.prototype.hasOwnProperty.call(r,"payload")){const e=JSON.stringify(r);console.warn(`Spyne Warning: the following payload contains a nested payload property which may create conflicts: Action: ${t}, ${e}`)}const e=n.M.getChannelActions(d);i.validateAction(t,d,e)}E.clone=()=>(0,s.mergeAll)([{payload:(0,o.l)(E.payload)},E.payload,{channel:(0,s.clone)(d)},{event:(0,s.clone)(c)},{srcElement:a},(0,s.clone)(E.srcElement),{action:(0,s.clone)(E.action)}]);const h={$dir:{get:()=>E._dir,set:e=>(E._dir=e,e)}};return"CHANNEL_ROUTE"===d&&(h.location={get:()=>i.getLocationData()}),E._dir=void 0,Object.defineProperties(E,h),l&&console.timeEnd(l),E}static validateAction(e,t,r){const o=(0,s.includes)(e,r);return!1===o&&!0===n.M.initialized&&console.warn(`warning: Action: '${e}' is not registered within the ${t} channel!`),o}static getLocationData(){return(0,s.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}static getStreamItem(){}static deepClone(e){const t=(0,s.is)(Array),r=(0,s.is)(Object);var n;return!1===t(n=e)&&!0===r(n)?(0,s.compose)(s.fromPairs,s.toPairs,s.clone)(e):(0,s.clone)(e)}static deepFreeze(e){const t=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));try{Object.freeze(e),Object.getOwnPropertyNames(e).forEach(function(r){!Object.prototype.hasOwnProperty.call(e,r)||!1!==t(e[r])||null===e[r]||"object"!=typeof e[r]&&"function"!=typeof e[r]||Object.isFrozen(e[r])||i.deepFreeze(e[r])})}catch(t){return e}return e}static getMouseEventKeys(){return["altKey","bubbles","cancelBubble","cancelable","clientX","clientY","composed","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","isTrusted","layerX","layerY","metaKey","movementX","movementY","offsetX","offsetY","pageX","pageY","path","relatedTarget","returnValue","screenX","screenY","shiftKey","sourceCapabilities","srcElement","target","timeStamp","toElement","type","view","which","x","y"]}}},683(e,t,r){r.d(t,{w:()=>c});var s=r(2),n=r(225),o=r(968),i=r(131),a=r(64);class c extends s.c{constructor(e,t={}){t.isProxy=!0,super(e,t),this.props=t,this.subject$=new o.Subject,this.replaySub$=new o.ReplaySubject(1),this.observer$=(0,o.merge)(this.subject$,this.replaySub$),!0===n.M.debug&&this.checkIfChannelIsStillProxy(e)}getMergedSubject(e=!1){return!0===e?this.replaySub$:this.subject$}checkIfChannelIsStillProxy(e){const t=e;(0,a.Ir)(()=>{!0!==(0,i.includes)(t,n.M.listRegisteredChannels())&&console.warn(`Spyne Warning: The channel, ${t} does not appear to be registered!`)},1e3)}get replaySubject(){return this.replaySub$}get subject(){return this.subject$}}},2(e,t,r){r.d(t,{c:()=>d});var s=r(584),n=r(980),o=r(225),i=r(521),a=r(968),c=r(531),l=r(131);class d{constructor(e,t={}){this.addRegisteredActions.bind(this),this.createChannelActionsObj(e,t.extendedActionsArr),t.name=e,t.defaultActions=void 0!==t.data?[`${t.name}_EVENT`]:[],this.props=t,this.props.isRegistered=!1,this.props.isProxy=void 0!==this.props.isProxy&&this.props.isProxy;const r=void 0!==this.props.data;void 0!==this.props.replay?this.props.sendCachedPayload=this.props.replay:this.props.sendCachedPayload=void 0===this.props.sendCachedPayload?r:this.props.sendCachedPayload,this.sendPayloadToRouteChannel=new i.g(this),this.createChannelActionMethods(),this.streamsController=o.M.channelsMap;const s=this.getMainObserver();this.checkForPersistentDataMode=d.checkForPersistentDataMode.bind(this),this.observer$=this.props.observer=s;const n=this.streamsController.getStream("DISPATCHER"),a=(0,l.propEq)(t.name,"name");n.pipe((0,c.filter)(a)).subscribe(e=>this.onReceivedObservable(e))}getMainObserver(){return void 0===this.streamsController&&console.warn(`Spyne Warning: The following channel, ${this.props.name}, appears to be registered before Spyne has been initialized.`),!0===this.streamsController.testStream(this.props.name)?this.streamsController.getProxySubject(this.props.name,this.props.sendCachedPayload):!0===this.props.sendCachedPayload?new a.ReplaySubject(1):new a.Subject}onChannelInitialized(){}onRegistered(e=this.props){if(void 0!==e.data){const t=Object.keys(this.channelActions)[0];this.sendChannelPayload(t,e.data)}}get isProxy(){return this.props.isProxy}get channelName(){return this.props.name}get observer(){return this.observer$}checkForTraits(){void 0!==this.props.traits&&(e=>{"Array"!==e.constructor.name&&(e=[e]),e.forEach(e=>new e(this))})(this.props.traits)}initializeStream(){this.checkForTraits(),this.onChannelInitialized(),this.checkForPersistentDataMode(),this.onRegistered(),this.props.isRegistered=!0}static checkForPersistentDataMode(e=this.props,t=this.channelActions){const r=(0,l.isEmpty)(t),s=void 0!==(0,l.prop)("data",e);return!0===r&&!0===s&&(e.sendCachedPayload=!0,t=(()=>{const{name:t}=e,r=`${t}_EVENT`;return{[r]:r}})(),void 0!==this.channelActions&&(this.channelActions=t)),{props:e,actionsObj:t}}setTrace(e){}createChannelActionsObj(e,t=[]){const r=(0,l.ifElse)((0,l.is)(String),l.identity,l.head),s=t.concat(this.addRegisteredActions(e)),n=(0,l.map)(r,s),o=(0,l.mergeAll)((0,l.chain)(e=>(0,l.objOf)(e,e),n));this.channelActions=o}createChannelActionMethods(){const e=(0,l.ifElse)((0,l.is)(String),l.identity,l.head),t=(e,t)=>{window.setTimeout(()=>{"function"!=typeof this[e]&&console.warn(`"${this.props.name}", REQUIRES THE FOLLOWING METHOD ${e} FOR ACTION, ${t[0]}`)},100)},r=(0,l.ifElse)((0,l.is)(String),(0,l.always)("onViewStreamInfo"),e=>{const r=(0,l.view)((0,l.lensIndex)(1),e);return t(r,e),r});this.channelActionMethods=(0,l.fromPairs)((0,l.map)(t=>[e(t),r(t)],this.addRegisteredActions()))}addRegisteredActions(){let e=[];return(0,l.path)(["props","data"],this)&&(e=[`${this.props.name}_EVENT`]),e}onReceivedObservable(e){this.onIncomingObservable(e)}getActionMethodForObservable(e){e.unpacked=!0;const t=this.onViewStreamInfo.bind(this),r=(0,l.path)(["data","action"],e),s=(0,l.prop)(r,this.channelActionMethods);let n=t;return void 0!==s&&"onViewStreamInfo"!==s&&!0==("function"==typeof this[s])&&(n=this[s].bind(this)),n}onIncomingObservable(e){const t=(0,l.equals)(e.name,this.props.name),{action:r,payload:s,srcElement:n}=e.data,o=t=>({clone:()=>{return t=e.data,(0,l.mergeAll)([t,{action:(0,l.prop)("action",t)},(0,l.prop)("payload",t),(0,l.prop)("srcElement",t)]);var t},action:r,payload:s,srcElement:n,event:t});return!0===t?(e=>e.observable.pipe((0,c.map)(o)).subscribe(this.getActionMethodForObservable(e)))(e):void 0}onViewStreamInfo(e){}sendChannelPayload(e,t,r={},s={},o=this.observer$){const i=new n.m(this.props.name,e,t,r,s);o.next(i)}getChannel(e,t){return(0,l.ifElse)(e=>(0,s.ns)().includes(e),r=>{const s=this.streamsController.getStream(r).observer;return s.source?s.source.channelName=e:s.channelName=e,void 0!==t?s.pipe((0,c.filter)(t)):s},e=>console.warn(`channel name ${e} is not within ${s.ns}`))(e)}mergeChannels(e,t=!0){const r=e.map(e=>{if("string"==typeof e){const r=this.getChannel(e);return t?r.pipe((0,c.take)(1)):r}return t?e.pipe((0,c.take)(1)):e});let s;if(t)s=(0,a.forkJoin)(r);else if(0===r.length)s=a.EMPTY;else if(1===r.length)s=r[0];else{const[e,...t]=r;s=e.pipe((0,c.combineLatestWith)(...t))}return s.pipe((0,c.map)(t=>{const r={};return e.forEach((e,s)=>{const n="string"==typeof e?e:`channel_${s}`;r[e?.source?.channelName||e?.source?.source?.channelName||n]=t[s]}),r}))}static checkForNotTrackFlag(e={}){!0===e.doNotTrack&&o.M.doNotTrackChannel(e.channelName)}}},584(e,t,r){r.d(t,{ns:()=>i});var s=r(225),n=r(131),o=r(968);const i=()=>({includes:()=>!0===s.M.initialized?s.M.listRegisteredChannels():["CHANNEL_ROUTE","CHANNEL_UI","CHANNEL_WINDOW","DISPATCHER"]}),a=["LOAD","RENDER","MOUNT","UNMOUNT","DISPOSE","GARBAGE_COLLECT","UPDATE"],c=["parent","self","child","children","view"],l=["Observable","BehaviorSubject","Subject","Observer","Subscriber","FromEventObservable"],d=["subscribe","combineLatest"];let E=[],p=[],h=null,N=null,u=null,m=null,_=null,T=null,A=null;if(void 0!==n.compose&&void 0!==o.Observable){E=[{error:`need to match a valid name within ${l}`,predicate:e=>i().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>void 0!==e.observable.subscribe},{error:"param action must be a registered action",predicate:e=>d.includes(e.action)}],p=[{error:"needs vsid number in srcElement",predicate:(0,n.compose)((0,n.is)(String),(0,n.path)(["data","srcElement","vsid"]))},{error:"needs a id in srcElement",predicate:(0,n.compose)((0,n.is)(String),(0,n.path)(["data","srcElement","id"]))}],h=function(){return[].concat(E).concat(p)};const e=[{error:`need to match a valid name within ${l}`,predicate:e=>i().includes(e.name)},{error:`needs one of the following step strings: ${a}`,predicate:e=>a.includes(e.STEP)},{error:`type needs to one of the following: ${c}`,predicate:e=>c.includes(e.type)},{error:"viewId needs to be added ",predicate:e=>void 0!==e.viewId}];u=function(){return[].concat(e)},m=function(){return[{error:"DISPOSE STEP requires a disposeItem param in the data object",predicate:e=>"DISPOSE"===e.STEP&&void 0!==e.data.disposeItems}].concat(e)},_=function(){return[{error:"UPDATE STEP requires a data object ",predicate:e=>"UPDATE"===e.STEP&&void 0!==e.data}].concat(e)},N=function(){return e.concat(E).concat(p)},T=function(){return[].concat(E).concat(p)},A=function(){const e=[{error:"param 'name' must be of a registered type",predicate:e=>i().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>l.includes((0,e.observable)().constructor.name)},{error:"param action must be a registered action",predicate:e=>d.includes(e.action)}];return{streams:[{init:{name:"DISPATCHER",observable:()=>new o.Subject,action:"subscribe"},structure:{type:String,observable:o.Observable||o.Subject,action:String},validations:e},{init:{name:"UBU",observable:()=>new o.Subject,action:"subscribe"},structure:{type:String,observable:o.Observable||o.Subject,action:String},validations:e}]}}}},470(e,t,r){r.d(t,{H:()=>p});var s=r(68),n=r(303),o=r(597),i=r(205),a=r(59),c=r(968),l=r(683),d=r(131);const E=new Map;class p{constructor(){this.addMixins(),E.set("DISPATCHER",new c.Subject),this.listRegisteredChannels=p.listRegisteredChannels.bind(this),this.getChannelsList=p.getChannelsList.bind(this)}get map(){return E}static getChannelsList(){return Array.from(E,(e,t)=>({key:e[0],val:e[1].constructor.name}))}static listRegisteredChannels(e=!1){const t=this.getChannelsList(),r=(0,d.reject)((0,d.propEq)("ChannelProxy","val")),s=(0,d.filter)((0,d.propEq)("ChannelProxy","val")),n=(!0===e?s:r)(t);return(0,d.pluck)(["key"],n)}listProxyChannels(){return this.listRegisteredChannels(!0)}checkForMissingChannels(){const e=this.getChannelsList(),t=(0,d.filter)((0,d.propEq)("ChannelProxy","val"))(e);if(t.length>=1){const e=`Spyne Warning: The following ${1===t.length?"Channel has":"Channels have"} not been initialized: ${(0,d.compose)((0,d.join)(", "),(0,d.map)((0,d.prop)("key")))(t)}`;console.warn(e)}}init(){this.createMainStreams()}createMainStreams(){this.routeStream=new s.e,E.set("CHANNEL_ROUTE",this.routeStream),this.uiStream=new n.z,E.set("CHANNEL_UI",this.uiStream),this.domStream=new o.x,E.set("CHANNEL_WINDOW",this.domStream),this.viewStreamLifecycle=new i.b,E.set("CHANNEL_LIFECYCLE",this.viewStreamLifecycle),this.aiStream=new a.$,E.set("CHANNEL_AI",this.aiStream),this.routeStream.initializeStream(),this.domStream.initializeStream()}addKeyEvent(e){E.get("UI").addKeyEvent(e)}registerStream(e){const t=e.channelName;E.has(t)&&(0,d.compose)((0,d.pathEq)(["props","isRegistered"],!0))(E.get(t))?console.warn(`Spyne Warning: The Channel, ${t}, has already been registered!`):(E.set(t,e),e.initializeStream())}getChannelActions(e){return E.get(e).addRegisteredActions()}getProxySubject(e,t=!1){const r=!0===t?"replaySubject":"subject";return E.get(e)[r]}testStream(e){return void 0!==E.get(e)}getStream(e){return!1===this.testStream(e)&&E.set(e,new l.w(e)),E.get(e)}addMixins(){}}},59(e,t,r){r.d(t,{$:()=>n});var s=r(2);class n extends s.c{constructor(e={}){super("CHANNEL_AI",e)}addRegisteredActions(){return["CHANNEL_AI_RENDERED_EVENT","CHANNEL_AI_DISPOSED_EVENT"]}onViewStreamInfo(e){const{action:t,srcElement:r}=e,s=r;s.action=t,this.onSendEvent(t,s)}onSendEvent(e,t={}){const r=this.channelActions[e],s={};window.setTimeout(()=>this.sendChannelPayload(r,t,s,void 0),0)}}},205(e,t,r){r.d(t,{b:()=>n});var s=r(2);class n extends s.c{constructor(e={}){super("CHANNEL_LIFECYCLE",e)}addRegisteredActions(){return["CHANNEL_LIFECYCLE_RENDERED_EVENT","CHANNEL_LIFECYCLE_DISPOSED_EVENT"]}onViewStreamInfo(e){const{action:t,srcElement:r}=e,s=r;s.action=t,this.onSendEvent(t,s)}onSendEvent(e,t={}){const r=this.channelActions[e],s={};window.setTimeout(()=>this.sendChannelPayload(r,t,s,void 0),0)}}},68(e,t,r){r.d(t,{e:()=>d});var s=r(2),n=r(511),o=r(167),i=r(225),a=r(968),c=r(531),l=r(131);class d extends s.c{constructor(e="CHANNEL_ROUTE",t={}){t.sendCachedPayload=!0,super("CHANNEL_ROUTE",t),this.createChannelActionsObj(),this.routeConfigJson=this.getRouteConfig(),this.bindStaticMethods(),this.navToStream$=new a.ReplaySubject(1),this.observer$=this.navToStream$.pipe((0,c.map)(e=>this.onMapNext(e))),this.compareRouteKeywords=o.H.compareRouteKeywords()}checkConfigForHash(){!0==("hash"===i.M.config.channels.ROUTE.type)&&(i.M.config.channels.ROUTE.type="slash",i.M.config.channels.ROUTE.isHash=!0)}onRegistered(){this.checkConfigForHash(),this.initStream()}createChannelActionsObj(){const e=this.addRegisteredActions(),t=(0,l.mergeAll)((0,l.chain)(e=>(0,l.objOf)(e,e),e));this.channelActions=t}addRegisteredActions(){return["CHANNEL_ROUTE_DEEPLINK_EVENT","CHANNEL_ROUTE_CHANGE_EVENT","CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",["CHANNEL_ROUTE_UPDATE_CONFIG_EVENT","updateRouteConfig"]]}updateRouteConfig(e){const t=(0,l.pick)(["isHash","isHidden","routes","type"],e.payload);i.M.config.channels.ROUTE=(0,l.mergeRight)(i.M.config.channels.ROUTE,t),i.M.conformRouteConfig();const r=this.getRouteConfig();r.navLinks=[...r?.routeDatasetsArr],this.routeConfigJson=r,this.bindStaticMethodsWithConfigData(),this.sendChannelPayload("CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",r,{},{},this.navToStream$)}getRouteConfig(){const e=i.M.config,t=(0,l.path)(["channels","ROUTE"],e);"query"===t.type&&(t.isHash=!1);const r=o.H.flattenConfigObject(t.routes);return t.paramsArr=r,t}initStream(){this.firstLoadStream$=new a.ReplaySubject(1),this.onIncomingDomEvent(void 0,this.routeConfigJson,"CHANNEL_ROUTE_DEEPLINK_EVENT"),o.H.createPopStateStream(this.onIncomingDomEvent.bind(this)),this.observer$=(0,a.merge)(this.firstLoadStream$,this.navToStream$)}onMapNext(e,t=!1){return e.action="CHANNEL_ROUTE_CHANGE_EVENT",e}static removeSSID(e){const t=(0,l.lensProp)(["routeData"]);return(0,l.over)(t,(0,l.omit)(["vsid"]))(e)}static onIncomingDomEvent(e,t=this.routeConfigJson,r){const s=void 0!==r?r:this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT,n=(0,l.path)(["state","routeCount"],e),o=!0===(0,l.is)(Number,n);let i=this.getDataFromString(t,o);!0===o&&(i.routeCount=n),"CHANNEL_ROUTE_DEEPLINK_EVENT"===r&&(i.navLinks=(0,l.prop)("routeDatasetsArr",t),Object.defineProperty(i,"linksData",{get(){return this.navLinks},set(e){console.warn("set links data is deprecated in ROUTE DEEPLINK DATA, use navLinks")},enumerable:!0}));const a=this.compareRouteKeywords.compare(i.routeData,i.paths);i=(0,l.mergeRight)(i,a),this.sendChannelPayload(s,i,void 0,e,this.navToStream$)}static checkForRouteParamsOverrides(e){return e}static checkForEventMethods(e){const t=(0,l.compose)((0,l.filter)((0,l.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),l.keys,(0,l.prop)("payload"))(e);if(t.length>=1){const r=(0,l.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,l.replace)(/^(event)([A-Z])(.*)([A-Z].*)$/gm,e),n=e=>{const t=s(e);void 0!==r[t]&&r[t]()};t.forEach(n)}}return e}static checkForEndRoute(e,t=this.routeConfigJson,r){if(!0!==(0,l.compose)((0,l.equals)("true"),(0,l.path)(["payload","endRoute"]))(e))return e;const s=void 0!==r?r:!0===i.M.debug,{payload:n}=e;let o=0;const a=(e=[],t)=>{const r=t[1],{routePath:i}=r,c=(0,l.prop)("routeName",i),d=(e=>{const t=(0,l.prop)("routeName",e);if(t){const r=(0,l.compose)(l.keys,(0,l.omit)(["routeName"]))(e),s=n[t],o=e=>new RegExp(`^${e}$`).test(s);return(0,l.find)(o,r)}})(i),E=(0,l.is)(Object,r),p=(0,l.is)(Array,r);if(o+=1,!0===E&&!1===p){const t=i[d];t?(0,l.compose)(l.reverse,(0,l.reduce)(a,e),l.toPairs)({nextRoutePath:t}):1===o?s&&console.warn(`Spyne Warning: use of end route method should add start route value of "${c}".`):e.push(c)}return e},{routes:c}=t,d=(0,l.compose)(l.reverse,(0,l.reduce)(a,[]),l.toPairs)({routes:c});if(1===d.length){const t=d[0];e.payload[t]=""}return e}onViewStreamInfo(e){const t=e.action??this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT;e?.srcElement?.el?.dataset&&(e.payload=function(e){const t={};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(e?.srcElement?.el?.dataset)??e.payload),d.checkForEventMethods(e),e=this.checkForEndRoute(e);let r=this.getDataFromParams(e);const s=(0,l.prop)("srcElement",e),n=(0,l.prop)("event",e),o=!r.isHidden,i=this.compareRouteKeywords.compare(r.routeData,r.paths);r=(0,l.mergeRight)(r,i),this.sendRouteStream(r,o),r=d.removeSSID(r),this.sendChannelPayload(t,r,s,n,this.navToStream$)}static checkAndConvertStrWithRegexTokens(e,t){return(0,l.keys)(t)}sendRouteStream(e,t=!0){!0===t&&this.setWindowLocation(e)}static getRouteState(){return"CHANNEL_ROUTE_CHANGE_EVENT"}static getIsDeepLinkBool(e){return!1===e&&0===this._routeCount}static getRouteCount(e=!1){return void 0===this._routeCount?(this._routeCount=0,this._routeCount):(!1===e&&(this._routeCount+=1),this._routeCount)}static getExtraPayloadParams(e=this.routeConfigJson,t=!1){return{routeCount:this.getRouteCount(t),isDeepLink:this.getIsDeepLinkBool(t),isHash:e.isHash,isHistory:t,isHidden:e.isHidden,routeType:e.type}}static getDataFromParams(e,t=this.routeConfigJson){let r=(0,l.prop)("payload",e);const s=this.getRouteStrFromParams(r,t),o=(e,r)=>(0,l.defaultTo)(r,(0,l.prop)(e,t)),i=o("type","slash"),a=o("isHash",!1),c=n.Q.formatStrAsWindowLocation(s),d=this.getDataFromLocationStr(i,a,c),{pathInnermost:E,paths:p}=d;r=(0,l.mergeRight)(d.routeData,r);const{routeCount:h,isDeepLink:N,isHash:u,isHistory:m,isHidden:_,routeType:T}=this.getExtraPayloadParams(t);return{isDeepLink:N,routeCount:h,pathInnermost:E,paths:p,routeData:r,routeValue:s,isHash:u,isHidden:_,isHistory:m,routeType:T}}static getDataFromString(e=this.routeConfigJson,t=!1){const r=e.type,s=!0===e.isHash,o=n.Q.getLocationStrByType(r,s),{paths:i,pathInnermost:a,routeData:c,routeValue:l}=d.getParamsFromRouteStr(o,e,r),{routeCount:E,isDeepLink:p,isHash:h,routeType:N,isHidden:u}=this.getExtraPayloadParams(e,t);return{isDeepLink:p,routeCount:E,pathInnermost:a,paths:i,routeData:c,routeValue:l,isHash:h,isHidden:u,isHistory:t,routeType:N}}static getDataFromLocationStr(e="slash",t=this.routeConfigJson.isHash,r=window.location){const s=void 0!==this.routeConfigJson?this.routeConfigJson.type:e,o=n.Q.getLocationStrByType(s,t,r),{paths:i,pathInnermost:a,routeData:c,routeValue:l}=this.getParamsFromRouteStr(o,this.routeConfigJson,s);return{paths:i,pathInnermost:a,routeData:c,routeValue:l,action:this.getRouteState()}}static getLocationData(){return(0,l.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}static getRouteStrFromParams(e,t,r){const s=void 0!==r?r:t.type;return n.Q.convertParamsToRoute(e,t,s)}static getParamsFromRouteStr(e,t,r){const s=void 0!==r?r:t.type;return n.Q.convertRouteToParams(e,t,s)}checkEmptyRouteStr(e,t=!1){const r=(0,l.isEmpty)(e);return!0==(!0===r&&!1===t)||!0==(!0===r&&!0===t)?"/":!0==(!1===r&&!0===t)?(0,l.concat)("#",e):e}static removeLastSlash(e){return e.replace(/^(.*)(\/)$/,"$1")}setWindowLocation(e){let{isHash:t,routeValue:r,routeType:s}=e;r=this.checkEmptyRouteStr(r,t);const{routeCount:n}=e;if(!0===t||"query"===s)r=d.removeLastSlash(window.location.pathname)+r,window.history.pushState({routeCount:n},"",r);else{const e=(0,l.when)((0,l.compose)((0,l.complement)((0,l.equals)("/")),l.head),(0,l.concat)("/",l.__));window.history.pushState({routeCount:n},"",e(r))}}getWindowLocation(){return window.location.pathname}bindStaticMethods(){this.checkForEndRoute=d.checkForEndRoute.bind(this),this.getIsDeepLinkBool=d.getIsDeepLinkBool.bind(this),this.getDataFromLocationStr=d.getDataFromLocationStr.bind(this),this.onIncomingDomEvent=d.onIncomingDomEvent.bind(this),this.getDataFromString=d.getDataFromString.bind(this),this.getParamsFromRouteStr=d.getParamsFromRouteStr.bind(this),this.getLocationData=d.getLocationData.bind(this),this.getRouteState=d.getRouteState.bind(this),this.getDataFromParams=d.getDataFromParams.bind(this),this.getRouteCount=d.getRouteCount.bind(this),this.getExtraPayloadParams=d.getExtraPayloadParams.bind(this),this.bindStaticMethodsWithConfigData()}bindStaticMethodsWithConfigData(){const e=(0,l.curryN)(3,d.getRouteStrFromParams);this.getRouteStrFromParams=e(l.__,this.routeConfigJson,this.routeConfigJson.type)}}},303(e,t,r){r.d(t,{z:()=>c});var s=r(2),n=r(968),o=r(531),i=r(131),a=r(672);class c extends s.c{constructor(e="CHANNEL_UI",t={}){t.sendCachedPayload=!1,super(e,t),this.keyEventsLoaded=!1,this.keyCodeArr=[]}addRegisteredActions(){return["CHANNEL_UI_DOMCONTENTLOADED_EVENT","CHANNEL_UI_ABORT_EVENT","CHANNEL_UI_ACTIVATE_EVENT","CHANNEL_UI_ADDTRACK_EVENT","CHANNEL_UI_AFTERPRINT_EVENT","CHANNEL_UI_AFTERSCRIPTEXECUTE_EVENT","CHANNEL_UI_ANIMATIONCANCEL_EVENT","CHANNEL_UI_ANIMATIONEND_EVENT","CHANNEL_UI_ANIMATIONITERATION_EVENT","CHANNEL_UI_ANIMATIONSTART_EVENT","CHANNEL_UI_APPINSTALLED_EVENT","CHANNEL_UI_AUDIOEND_EVENT","CHANNEL_UI_AUDIOSTART_EVENT","CHANNEL_UI_AUXCLICK_EVENT","CHANNEL_UI_BEFOREINPUT_EVENT","CHANNEL_UI_BEFOREPRINT_EVENT","CHANNEL_UI_BEFOREUNLOAD_EVENT","CHANNEL_UI_BEGINEVENT_EVENT","CHANNEL_UI_BLOCKED_EVENT","CHANNEL_UI_BLUR_EVENT","CHANNEL_UI_BOUNDARY_EVENT","CHANNEL_UI_BUFFEREDAMOUNTLOW_EVENT","CHANNEL_UI_CANCEL_EVENT","CHANNEL_UI_CANPLAY_EVENT","CHANNEL_UI_CANPLAYTHROUGH_EVENT","CHANNEL_UI_CHANGE_EVENT","CHANNEL_UI_CLICK_EVENT","CHANNEL_UI_CLOSE_EVENT","CHANNEL_UI_CLOSING_EVENT","CHANNEL_UI_COMPLETE_EVENT","CHANNEL_UI_COMPOSITIONEND_EVENT","CHANNEL_UI_COMPOSITIONSTART_EVENT","CHANNEL_UI_COMPOSITIONUPDATE_EVENT","CHANNEL_UI_CONNECT_EVENT","CHANNEL_UI_CONNECTIONSTATECHANGE_EVENT","CHANNEL_UI_CONTENTDELETE_EVENT","CHANNEL_UI_CONTEXTMENU_EVENT","CHANNEL_UI_COPY_EVENT","CHANNEL_UI_CUECHANGE_EVENT","CHANNEL_UI_CUT_EVENT","CHANNEL_UI_DATACHANNEL_EVENT","CHANNEL_UI_DBLCLICK_EVENT","CHANNEL_UI_DEVICECHANGE_EVENT","CHANNEL_UI_DEVICEMOTION_EVENT","CHANNEL_UI_DEVICEORIENTATION_EVENT","CHANNEL_UI_DRAG_EVENT","CHANNEL_UI_DRAGEND_EVENT","CHANNEL_UI_DRAGENTER_EVENT","CHANNEL_UI_DRAGLEAVE_EVENT","CHANNEL_UI_DRAGOVER_EVENT","CHANNEL_UI_DRAGSTART_EVENT","CHANNEL_UI_DROP_EVENT","CHANNEL_UI_DURATIONCHANGE_EVENT","CHANNEL_UI_EMPTIED_EVENT","CHANNEL_UI_END_EVENT","CHANNEL_UI_ENDEVENT_EVENT","CHANNEL_UI_ENDED_EVENT","CHANNEL_UI_ENTERPICTUREINPICTURE_EVENT","CHANNEL_UI_ERROR_EVENT","CHANNEL_UI_FOCUS_EVENT","CHANNEL_UI_FOCUSIN_EVENT","CHANNEL_UI_FOCUSOUT_EVENT","CHANNEL_UI_FORMDATA_EVENT","CHANNEL_UI_FULLSCREENCHANGE_EVENT","CHANNEL_UI_FULLSCREENERROR_EVENT","CHANNEL_UI_GAMEPADCONNECTED_EVENT","CHANNEL_UI_GAMEPADDISCONNECTED_EVENT","CHANNEL_UI_GATHERINGSTATECHANGE_EVENT","CHANNEL_UI_GESTURECHANGE_EVENT","CHANNEL_UI_GESTUREEND_EVENT","CHANNEL_UI_GESTURESTART_EVENT","CHANNEL_UI_GOTPOINTERCAPTURE_EVENT","CHANNEL_UI_HASHCHANGE_EVENT","CHANNEL_UI_ICECANDIDATE_EVENT","CHANNEL_UI_ICECANDIDATEERROR_EVENT","CHANNEL_UI_ICECONNECTIONSTATECHANGE_EVENT","CHANNEL_UI_ICEGATHERINGSTATECHANGE_EVENT","CHANNEL_UI_INPUT_EVENT","CHANNEL_UI_INPUTSOURCESCHANGE_EVENT","CHANNEL_UI_INSTALL_EVENT","CHANNEL_UI_INVALID_EVENT","CHANNEL_UI_KEYDOWN_EVENT","CHANNEL_UI_KEYUP_EVENT","CHANNEL_UI_LANGUAGECHANGE_EVENT","CHANNEL_UI_LEAVEPICTUREINPICTURE_EVENT","CHANNEL_UI_LOAD_EVENT","CHANNEL_UI_LOADEDDATA_EVENT","CHANNEL_UI_LOADEDMETADATA_EVENT","CHANNEL_UI_LOADEND_EVENT","CHANNEL_UI_LOADSTART_EVENT","CHANNEL_UI_LOSTPOINTERCAPTURE_EVENT","CHANNEL_UI_MARK_EVENT","CHANNEL_UI_MERCHANTVALIDATION_EVENT","CHANNEL_UI_MESSAGE_EVENT","CHANNEL_UI_MESSAGEERROR_EVENT","CHANNEL_UI_MOUSEDOWN_EVENT","CHANNEL_UI_MOUSEENTER_EVENT","CHANNEL_UI_MOUSELEAVE_EVENT","CHANNEL_UI_MOUSEMOVE_EVENT","CHANNEL_UI_MOUSEOUT_EVENT","CHANNEL_UI_MOUSEOVER_EVENT","CHANNEL_UI_MOUSEUP_EVENT","CHANNEL_UI_MUTE_EVENT","CHANNEL_UI_NEGOTIATIONNEEDED_EVENT","CHANNEL_UI_NOMATCH_EVENT","CHANNEL_UI_NOTIFICATIONCLICK_EVENT","CHANNEL_UI_OFFLINE_EVENT","CHANNEL_UI_ONLINE_EVENT","CHANNEL_UI_OPEN_EVENT","CHANNEL_UI_ORIENTATIONCHANGE_EVENT","CHANNEL_UI_PAGEHIDE_EVENT","CHANNEL_UI_PAGESHOW_EVENT","CHANNEL_UI_PASTE_EVENT","CHANNEL_UI_PAUSE_EVENT","CHANNEL_UI_PAYERDETAILCHANGE_EVENT","CHANNEL_UI_PAYMENTMETHODCHANGE_EVENT","CHANNEL_UI_PLAY_EVENT","CHANNEL_UI_PLAYING_EVENT","CHANNEL_UI_POINTERCANCEL_EVENT","CHANNEL_UI_POINTERDOWN_EVENT","CHANNEL_UI_POINTERENTER_EVENT","CHANNEL_UI_POINTERLEAVE_EVENT","CHANNEL_UI_POINTERLOCKCHANGE_EVENT","CHANNEL_UI_POINTERLOCKERROR_EVENT","CHANNEL_UI_POINTERMOVE_EVENT","CHANNEL_UI_POINTEROUT_EVENT","CHANNEL_UI_POINTEROVER_EVENT","CHANNEL_UI_POINTERUP_EVENT","CHANNEL_UI_POPSTATE_EVENT","CHANNEL_UI_PROGRESS_EVENT","CHANNEL_UI_PUSH_EVENT","CHANNEL_UI_PUSHSUBSCRIPTIONCHANGE_EVENT","CHANNEL_UI_RATECHANGE_EVENT","CHANNEL_UI_READYSTATECHANGE_EVENT","CHANNEL_UI_REJECTIONHANDLED_EVENT","CHANNEL_UI_REMOVETRACK_EVENT","CHANNEL_UI_REMOVESTREAM_EVENT","CHANNEL_UI_REPEATEVENT_EVENT","CHANNEL_UI_RESET_EVENT","CHANNEL_UI_RESIZE_EVENT","CHANNEL_UI_RESOURCETIMINGBUFFERFULL_EVENT","CHANNEL_UI_RESULT_EVENT","CHANNEL_UI_RESUME_EVENT","CHANNEL_UI_SCROLL_EVENT","CHANNEL_UI_SEARCH_EVENT","CHANNEL_UI_SEEKED_EVENT","CHANNEL_UI_SEEKING_EVENT","CHANNEL_UI_SELECT_EVENT","CHANNEL_UI_SELECTEDCANDIDATEPAIRCHANGE_EVENT","CHANNEL_UI_SELECTEND_EVENT","CHANNEL_UI_SELECTIONCHANGE_EVENT","CHANNEL_UI_SELECTSTART_EVENT","CHANNEL_UI_SHIPPINGADDRESSCHANGE_EVENT","CHANNEL_UI_SHIPPINGOPTIONCHANGE_EVENT","CHANNEL_UI_SIGNALINGSTATECHANGE_EVENT","CHANNEL_UI_SLOTCHANGE_EVENT","CHANNEL_UI_SOUNDEND_EVENT","CHANNEL_UI_SOUNDSTART_EVENT","CHANNEL_UI_SPEECHEND_EVENT","CHANNEL_UI_SPEECHSTART_EVENT","CHANNEL_UI_SQUEEZE_EVENT","CHANNEL_UI_SQUEEZEEND_EVENT","CHANNEL_UI_SQUEEZESTART_EVENT","CHANNEL_UI_STALLED_EVENT","CHANNEL_UI_START_EVENT","CHANNEL_UI_STATECHANGE_EVENT","CHANNEL_UI_STORAGE_EVENT","CHANNEL_UI_SUBMIT_EVENT","CHANNEL_UI_SUCCESS_EVENT","CHANNEL_UI_SUSPEND_EVENT","CHANNEL_UI_TIMEOUT_EVENT","CHANNEL_UI_TIMEUPDATE_EVENT","CHANNEL_UI_TOGGLE_EVENT","CHANNEL_UI_TONECHANGE_EVENT","CHANNEL_UI_TOUCHCANCEL_EVENT","CHANNEL_UI_TOUCHEND_EVENT","CHANNEL_UI_TOUCHMOVE_EVENT","CHANNEL_UI_TOUCHSTART_EVENT","CHANNEL_UI_TRACK_EVENT","CHANNEL_UI_TRANSITIONCANCEL_EVENT","CHANNEL_UI_TRANSITIONEND_EVENT","CHANNEL_UI_TRANSITIONRUN_EVENT","CHANNEL_UI_TRANSITIONSTART_EVENT","CHANNEL_UI_UNHANDLEDREJECTION_EVENT","CHANNEL_UI_UNLOAD_EVENT","CHANNEL_UI_UNMUTE_EVENT","CHANNEL_UI_UPGRADENEEDED_EVENT","CHANNEL_UI_VERSIONCHANGE_EVENT","CHANNEL_UI_VISIBILITYCHANGE_EVENT","CHANNEL_UI_VOICESCHANGED_EVENT","CHANNEL_UI_VOLUMECHANGE_EVENT","CHANNEL_UI_VRDISPLAYACTIVATE_EVENT","CHANNEL_UI_VRDISPLAYBLUR_EVENT","CHANNEL_UI_VRDISPLAYCONNECT_EVENT","CHANNEL_UI_VRDISPLAYDEACTIVATE_EVENT","CHANNEL_UI_VRDISPLAYDISCONNECT_EVENT","CHANNEL_UI_VRDISPLAYFOCUS_EVENT","CHANNEL_UI_VRDISPLAYPOINTERRESTRICTED_EVENT","CHANNEL_UI_VRDISPLAYPOINTERUNRESTRICTED_EVENT","CHANNEL_UI_VRDISPLAYPRESENTCHANGE_EVENT","CHANNEL_UI_WAITING_EVENT","CHANNEL_UI_WEBGLCONTEXTCREATIONERROR_EVENT","CHANNEL_UI_WEBGLCONTEXTLOST_EVENT","CHANNEL_UI_WEBGLCONTEXTRESTORED_EVENT","CHANNEL_UI_WEBKITMOUSEFORCECHANGED_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEDOWN_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEUP_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEWILLBEGIN_EVENT","CHANNEL_UI_WHEEL_EVENT"]}loadKeyStream(){const e=n.Observable.fromEvent(document,"keyup");this.keyPresses$=e.groupBy(e=>e.keyCode).mergeAll().filter(e=>this.keyCodeArr.indexOf(e.keyCode)>=0).repeat().subscribe(this.onKeyPressed.bind(this))}addKeyEvent(e){!1===this.keyEventsLoaded&&this.loadKeyStream(),this.keyEventsLoaded=!0,this.registerKey(e)}registerKey(e){this.keyCodeArr.push(e)}onKeyPressed(e){}static removeSSID(e){const t=(0,i.lensProp)(["payload"]);return(0,i.over)(t,(0,i.omit)(["vsid"]))(e)}onIncomingObservable(e){const t=(0,i.equals)(e.name,this.props.name);e.data=c.removeSSID(e.data);const{payload:r,srcElement:s}=e.data,n=e=>({payload:r,srcElement:s,event:e});return!0===t?(e=>e.observable.pipe((0,o.map)(n)).subscribe(this.onUIEvent.bind(this)))(e):void 0}getActionState(e){const t=(0,i.path)(["event","type"]),r=(0,i.path)(["event","typeOverRide"]),s=(0,i.compose)(i.toUpper,(0,i.either)(r,t))(e),n="CHANNEL_UI";return void 0!==s?`${n}_${s}_EVENT`:n}static checkForEventMethods(e){const t=(0,i.compose)((0,i.filter)((0,i.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),i.keys,(0,i.prop)("payload"))(e);if(t.length>=1){const r=(0,i.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,i.replace)(/^(event)([A-Z])(.*)([A-Z].*)$/gm,e),n=e=>{const t=s(e);void 0!==r[t]&&"function"==typeof r[t]&&r[t]()};t.forEach(n)}}return e}onUIEvent(e){e.payload=function(e){const t={};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(e?.srcElement?.el?.dataset)??e.payload,c.checkForEventMethods(e),e.action=this.getActionState(e);const t=e.action,{payload:r,srcElement:s}=e,n=e.event;(0,a.v8)(n?.target),this.sendChannelPayload(t,r,s,n)}}},597(e,t,r){r.d(t,{x:()=>E});var s=r(2),n=r(64),o=r(225),i=r(432),a=r(968),c=r(531),l=r(131),d=r(907);class E extends s.c{constructor(e="CHANNEL_WINDOW"){super(e),this.bindStaticMethods(),this.currentScrollY=0}initializeStream(){this.domChannelConfig=o.M.config.channels.WINDOW;const e=this.getActiveObservables(),t=(0,a.merge)(...e);this.dom$=t,t.subscribe(e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n)})}static getMouseWheelMapFn(e){const t=this.channelActions.CHANNEL_WINDOW_WHEEL_EVENT,r=e.deltaY<=0?"up":"down",{deltaX:s,deltaY:n,deltaZ:o}=e;return{action:t,payload:{scrollDir:r,deltaX:s,deltaY:n,deltaZ:o},srcElement:e.srcElement,event:e}}static createCurriedGenericEvent(e){const t=`CHANNEL_WINDOW_${e.toUpperCase()}_EVENT`;return(0,l.curry)(E.mapGenericEvent)(t)}static mapGenericEvent(e,t){return{action:e,payload:t,srcElement:t.srcElement,event:t}}static getResizeMapFn(e){return{action:this.channelActions.CHANNEL_WINDOW_RESIZE_EVENT,payload:(0,l.pick)(["innerWidth","innerHeight","outerWidth","outerHeight"],window),srcElement:e.srcElement,event:e}}static getOrientationMapFn(e){const t=this.channelActions.CHANNEL_WINDOW_ORIENTATION_EVENT,r=window.matchMedia("(orientation: portrait)").matches,s=(0,l.pick)(["innerWidth","innerHeight","outerWidth","outerHeight"],window);return s.orientation=!0===r?"portrait":"landscape",{action:t,payload:s,srcElement:e.srcElement,event:e}}getMediaQueryMapFn(e){return{action:this.channelActions.CHANNEL_WINDOW_MEDIA_QUERY_EVENT,payload:(0,l.pick)(["matches","media","mediaQueryName"],e),srcElement:e.srcElement,event:e}}createMouseWheelObservable(e){const t=e.debounceMSTimeForScroll;return i.Y.createDomObservableFromEvent("wheel",E.getMouseWheelMapFn.bind(this)).pipe((0,c.debounceTime)(t))}static getScrollData(){let e=0;return t=>{const r=e-t;return e=t,{scrollY:t,scrollDistance:r,scrollDir:r>=0?"up":"down"}}}static getScrollY(e){return void 0!==e.pageYOffset?e.pageYOffset:e.scrollTop}static getScrollMapFn(e,t,r,s,n){const o=s(E.getScrollY(n)),{scrollDistance:i}=o;return{action:r,payload:o,srcElement:e.srcElement,scrollDistance:i,event:e}}createScrollObservable(e,t=window,r=!0){const s=e.debounceMSTimeForScroll,n=t,o=t===window,a=void 0!==e.scrollElForVals?e.scrollElForVals:t,d=o?"CHANNEL_WINDOW_SCROLL_EVENT":"CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT",p=E.getScrollData(),h=(0,l.partialRight)(E.getScrollMapFn,[d,p,a,r,n]).bind(this);return i.Y.createDomObservableFromEvent("scroll",h,r,n).pipe((0,c.debounceTime)(s),(0,c.skipWhile)(e=>0===e.scrollDistance),(0,c.map)(e=>{const t=E.getScrollY(n);return e.payload.scrollDistanceAbs=Math.abs(this.currentScrollY-t),this.currentScrollY=t,e}))}createOrientationObservable(e){return i.Y.createDomObservableFromEvent("orientationchange",E.getOrientationMapFn.bind(this))}createResizeObservable(e){const t=e.debounceMSTimeForResize;return i.Y.createDomObservableFromEvent("resize",E.getResizeMapFn.bind(this)).pipe((0,c.debounceTime)(t))}getEventsFromConfig(e=this.domChannelConfig){const t=e.events;return(0,l.map)(e=>{const t=E.createCurriedGenericEvent(e);return i.Y.createDomObservableFromEvent(e,t)},t)}getActiveObservables(e=this.domChannelConfig){let t=[];e.listenForMediaQueries=(0,n.RK)(e.mediaQueries)||(0,n.RK)(e.mediaQueries);const r={listenForResize:this.createResizeObservable.bind(this),listenForOrientation:this.createOrientationObservable.bind(this),listenForScroll:this.createScrollObservable.bind(this),listenForWheel:this.createMouseWheelObservable.bind(this)};(0,l.mapObjIndexed)((r,s,n)=>{e[s]&&t.push(r(e))},r),this.checkForMediaQueries(e.listenForMediaQueries);const s=this.getEventsFromConfig(e);return t=t.concat(s),t}checkForMediaQueries(e){!0===e&&this.getMediaQueryObservable(this.domChannelConfig).subscribe(e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n,this.observer$)})}getMediaQueryObservable(e){const t=this.createMergedObsFromObj(e);return(0,l.apply)(a.merge,t).pipe((0,c.map)(this.getMediaQueryMapFn.bind(this)))}addRegisteredActions(){return["CHANNEL_WINDOW_ABORT_EVENT","CHANNEL_WINDOW_AFTERPRINT_EVENT","CHANNEL_WINDOW_ANIMATIONEND_EVENT","CHANNEL_WINDOW_ANIMATIONITERATION_EVENT","CHANNEL_WINDOW_ANIMATIONSTART_EVENT","CHANNEL_WINDOW_APPINSTALLED_EVENT","CHANNEL_WINDOW_BEFOREPRINT_EVENT","CHANNEL_WINDOW_BEFOREUNLOAD_EVENT","CHANNEL_WINDOW_BEGINEVENT_EVENT","CHANNEL_WINDOW_BLUR_EVENT","CHANNEL_WINDOW_CACHED_EVENT","CHANNEL_WINDOW_CHANGE_EVENT","CHANNEL_WINDOW_CLICK_EVENT","CHANNEL_WINDOW_CLOSE_EVENT","CHANNEL_WINDOW_COMPOSITIONEND_EVENT","CHANNEL_WINDOW_COMPOSITIONSTART_EVENT","CHANNEL_WINDOW_COMPOSITIONUPDATE_EVENT","CHANNEL_WINDOW_COPY_EVENT","CHANNEL_WINDOW_CUT_EVENT","CHANNEL_WINDOW_DBLCLICK_EVENT","CHANNEL_WINDOW_DEVICECHANGE_EVENT","CHANNEL_WINDOW_DEVICELIGHT_EVENT","CHANNEL_WINDOW_DEVICEMOTION_EVENT","CHANNEL_WINDOW_DEVICEORIENTATION_EVENT","CHANNEL_WINDOW_DEVICEPROXIMITY_EVENT","CHANNEL_WINDOW_DOMATTRIBUTENAMECHANGED_EVENT","CHANNEL_WINDOW_DOMATTRMODIFIED_EVENT","CHANNEL_WINDOW_DOMCHARACTERDATAMODIFIED_EVENT","CHANNEL_WINDOW_DOMCONTENTLOADED_EVENT","CHANNEL_WINDOW_DOMCONTENTLOADED_EVENT","CHANNEL_WINDOW_DOMELEMENTNAMECHANGED_EVENT","CHANNEL_WINDOW_DRAGEND_EVENT","CHANNEL_WINDOW_DRAGENTER_EVENT","CHANNEL_WINDOW_DRAGLEAVE_EVENT","CHANNEL_WINDOW_DRAGOVER_EVENT","CHANNEL_WINDOW_DRAGSTART_EVENT","CHANNEL_WINDOW_DRAG_EVENT","CHANNEL_WINDOW_DROP_EVENT","CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT","CHANNEL_WINDOW_ERROR_EVENT","CHANNEL_WINDOW_FOCUSIN_EVENT","CHANNEL_WINDOW_FOCUS_EVENT","CHANNEL_WINDOW_FULLSCREENCHANGE_EVENT","CHANNEL_WINDOW_FULLSCREENERROR_EVENT","CHANNEL_WINDOW_HASHCHANGE_EVENT","CHANNEL_WINDOW_INPUT_EVENT","CHANNEL_WINDOW_INVALID_EVENT","CHANNEL_WINDOW_KEYDOWN_EVENT","CHANNEL_WINDOW_KEYPRESS_EVENT","CHANNEL_WINDOW_KEYUP_EVENT","CHANNEL_WINDOW_LOAD_EVENT","CHANNEL_WINDOW_MEDIA_QUERY_EVENT","CHANNEL_WINDOW_MESSAGE_EVENT","CHANNEL_WINDOW_MOUSEDOWN_EVENT","CHANNEL_WINDOW_MOUSEENTER_EVENT","CHANNEL_WINDOW_MOUSELEAVE_EVENT","CHANNEL_WINDOW_MOUSEMOVE_EVENT","CHANNEL_WINDOW_MOUSEOUT_EVENT","CHANNEL_WINDOW_MOUSEOVER_EVENT","CHANNEL_WINDOW_MOUSEUP_EVENT","CHANNEL_WINDOW_MOUSEWHEEL_EVENT","CHANNEL_WINDOW_OFFLINE_EVENT","CHANNEL_WINDOW_ONLINE_EVENT","CHANNEL_WINDOW_OPEN_EVENT","CHANNEL_WINDOW_ORIENTATION_EVENT","CHANNEL_WINDOW_PAGEHIDE_EVENT","CHANNEL_WINDOW_PAGESHOW_EVENT","CHANNEL_WINDOW_PASTE_EVENT","CHANNEL_WINDOW_POPSTATE_EVENT","CHANNEL_WINDOW_POPSTATE_EVENT","CHANNEL_WINDOW_PROGRESSEVENTS_EVENT","CHANNEL_WINDOW_RESET_EVENT","CHANNEL_WINDOW_RESIZE_EVENT","CHANNEL_WINDOW_SCROLL_ELEMENT_ADDED_EVENT","CHANNEL_WINDOW_SCROLL_EVENT","CHANNEL_WINDOW_SCROLL_LOCK_EVENT",["CHANNEL_WINDOW_SCROLL_LOCK_EVENT","onScrollLockEvent"],["CHANNEL_WINDOW_SET_ELEMENT_TO_SCROLL_EVENT","onSetElementToScroll"],"CHANNEL_WINDOW_STORAGE_EVENT","CHANNEL_WINDOW_SUBMIT_EVENT","CHANNEL_WINDOW_TRANSITIONCANCEL_EVENT","CHANNEL_WINDOW_TRANSITIONEND_EVENT","CHANNEL_WINDOW_TRANSITIONRUN_EVENT","CHANNEL_WINDOW_TRANSITIONSTART_EVENT","CHANNEL_WINDOW_UNLOAD_EVENT","CHANNEL_WINDOW_WHEEL_EVENT"]}onScrollLockEvent(e){}onSetElementToScroll(e){let{config:t,el:r,scrollElement:s}=e.payload;t=t||{},t=(0,d.$)(this.domChannelConfig,t),s=s||r,this.sendChannelPayload("CHANNEL_WINDOW_SCROLL_ELEMENT_ADDED_EVENT",{el:r},r),this.createScrollObservable(t,s).subscribe(e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n)})}bindStaticMethods(){this.createMediaQueryHandler=i.Y.createMediaQueryHandler.bind(this),this.createMergedObsFromObj=i.Y.createMergedObsFromObj.bind(this)}}},713(e,t,r){r.d(t,{D:()=>E});var s=r(470),n=r(173),o=r(167),i=r(225),a=r(49),c=r(672);const l=new s.H,d="0.22.2";let E=new class{constructor(){this.version=d}get channels(){return l}init(e={},t=!1){if(!0===i.M.initialized)return t?"The Spyne Application has already been initialized!":void console.warn("The Spyne Application has already been initialized!");let r={scrollLock:!1,scrollLockX:31,scrollLockY:0,debug:!1,strict:!1,baseHref:void 0,IMG_PATH:"undefined"!=typeof IMG_PATH?IMG_PATH:void 0,pluginMethods:{},plugins:{},tmp:{},ephemeralProps:{},tmpProps:{},channels:{WINDOW:{mediaQueries:{},events:[],listenForResize:!0,listenForOrientation:!0,listenForScroll:!1,listenForMouseWheel:!1,listenForWheel:!1,debounceMSTimeForResize:200,debounceMSTimeForScroll:150},ROUTE:{type:"slash",isHash:!1,isHidden:!1,add404s:!1,routes:{routePath:{routeName:"change"}}}}};if(void 0!==e){const t=o.H;e=i.M.initialize(r,e,l,t)}this.pluginsFn=i.M.getPluginsMethodObj(e.pluginMethods),this.getChannelActions=e=>l.getChannelActions(e),this.registerChannel=e=>l.registerStream(e),this.registerPlugin=e=>i.M.registerPlugin(e),this.registerDataChannel=e=>l.registerStream(e),this.listChannels=()=>Array.from(l.map.keys());let s=new n.A({id:"spyne-null-views"});s.appendToDom(document.body),s.props.el.style.cssText="display:none; opacity:0; pointer-events:none;",l.init(),!0===i.M.config.debug&&(window.Spyne={version:d}),(0,a.D)(i.M.config),(0,c.oG)(i.M.config)}static listChannels(){return Array.from(l.map.keys())}static getChannelActions(e){return l.getChannelActions(e)}static registerChannel(e){if(!1!==i.M.initialized)return l.registerStream(e);console.warn("Spyne has not been initialized")}}},930(e,t,r){r.d(t,{V:()=>a});var s=r(192),n=r(225),o=r(131);let i=n.M;class a{constructor(e={}){let{name:t,config:r,parentEl:s}=e;this.props=e,void 0===r&&(r=(0,o.clone)(e)),this.name=t||"empty",this.props.name=t,r=a.mergeDefaultConfig(r,this.defaultConfig()),this.props.parentEl=s||a.createParentEl(),this.props.config=r,void 0!==this.props.traits&&this.addTraits(this.props.traits)}register(e){i=e,this.props.pluginName=this.props.name,!1!==i.initialized?(this.onBeforeRegistered(),this.props.config=(0,o.clone)(this.props.config),i.addPluginConfig(this.name,this.props.config),this.onRegistered(),this.onRender()):console.warn(`Spyne Warning: SpyneApp has not been initialized yet! Cannot register plugin "${this.name}".`)}get SpyneAppProperties(){return i}static mergeDefaultConfig(e={},t=this.defaultConfig()){return Object.assign(t,e)}static getSpyneApp(e,t){!1===i.initialized?console.warn(`Spyne Warning: Unable to install plugin, ${e}! SpyneApp has not been initialized!`):i.addPluginConfig(e,t)}static updateSpyneConfig(e,t,r){return!0===(0,o.pathSatisfies)((0,o.is)(Object),["config","plugins",t])(e)?(!0===e.config.debug&&console.warn(`Spyne Warning: The plugin, ${t}, already exists`),!1):(e.config.plugins[t]=r,e.config.plugins[t])}static createParentEl(e){return e||document.getElementById("spyne-plugins")||(()=>{const e=new s.r({id:"spyne-plugins"});document.body.appendChild(e.render());const t=document.getElementById("spyne-plugins");return t.style.cssText="position:absolute; top:0;left:0;width:100%;height:100%;min-height:100vh;z-index:1000000; pointer-events:none",t})()}addTraits(e){"Array"!==e.constructor.name&&(e=[e]),e.forEach(e=>new e(this))}onBeforeRegistered(){this.checkForRequiredWindowEvent()}checkForRequiredWindowEvent(){const e=this.props.requiredEvents??[],t=n.M.getChannelConfig("WINDOW"),r=e.filter(e=>!t.events.includes(e));r.length>0&&console.warn(`plugin "${this.props.name}" requires the following config.WINDOW.events, --\x3e ${r.join(", ")} <--`)}defaultConfig(){return{}}onRegistered(){}onRender(){}}},9(e,t,r){r.d(t,{G:()=>a});var s=r(968),n=r(531),o=r(131),i=r(672);class a{constructor(e,t,r,s){(0,i.UO)(!0),this._mapFn=a.setMapFn(e),this._url=a.setUrl(e),this._responseType=a.setResponseType(e),this._serverOptions=a.setServerOptions(e),this._subscriber=void 0!==t?t:e=>console.log("FETCH RETURNED ",e),this.debug=void 0!==e.debug&&e.debug,this.channelName=s;const n={mapFn:this.mapFn,url:this.url,serverOptions:this.serverOptions,responseType:this.responseType,debug:this.debug};!0!==r&&a.startWindowFetch(n,this._subscriber,this.channelName)}static startWindowFetch(e,t,r){const{mapFn:o,url:a,serverOptions:c,responseType:l,debug:d}=e,E=!0===d?e=>console.log("DEBUG FETCH :",e,{url:a,serverOptions:c,responseType:l,channelName:r}):()=>{},p=(0,s.from)(window.fetch(a,c)).pipe((0,n.tap)(E),(0,n.flatMap)(e=>(0,s.from)(e[l]())),(0,n.map)((t=>{const s={channelName:r,url:a,responseType:l,serverOptions:c};return r=>{const n=!0===e?.disableSanitize;if(n){const e="undefined"!=typeof process&&process.env?"production":"development",t=`SPYNE SECURITY WARNING — Sanitization disabled for fetch from ${a}. Data will enter the reactive stream unsanitized. Only use disableSanitize=true for trusted or controlled sources.`;if("production"===e)throw new Error(`SpyneJS security policy violation: disableSanitize=true is not allowed in production (${a}).`);console.warn(`%c${t}`,"color:#f33;font-weight:bold;")}const o=n?r:(0,i.Ay)(r);return t(o,s)}})(o)),(0,n.publish)());p.connect(),p.subscribe(t)}static setMapFn(e){return(0,o.compose)((0,o.defaultTo)(e=>e),(0,o.prop)("mapFn"))(e)}static setUrl(e){const t=(0,o.prop)("url",e);return void 0===t&&console.warn("SPYNE WARNING: URL is undefined for data channel"),t}static setResponseType(e){return(0,o.defaultTo)("json",(0,o.prop)("responseType",e))}get mapFn(){return this._mapFn}get url(){return this._url}get serverOptions(){return this._serverOptions}get responseType(){return this._responseType}static stringifyBodyIfItExists(e){return(0,o.when)((0,o.propIs)(Object,"body"),(0,o.compose)((0,o.over)((0,o.lensProp)("body"),JSON.stringify)))(e)}static updateMethodWhenBodyExists(e){const t=(0,o.has)("body"),r=(0,o.propEq)("GET","method"),s=(0,o.allPass)([t,r]);return(0,o.when)(s,(0,o.assoc)("method","POST"))(e)}static setServerOptions(e){const t=(0,o.pick)(["method","headers","body","mode","credentials","cache","redirect","referrer","referrerPolicy","integrity","keepalive"],e);let r=(0,o.mergeDeepRight)(a.baseOptions(),t);return r=a.updateMethodWhenBodyExists(r),r=a.stringifyBodyIfItExists(r),r}static baseOptions(){return{method:"GET",headers:new Headers({Accept:"application/json, text/plain, */*"}),mode:"cors",credentials:"same-origin",cache:"default",redirect:"follow",referrer:"client",referrerPolicy:"no-referrer-when-downgrade",integrity:"",keepalive:!1}}}},589(e,t,r){r.d(t,{C:()=>E});var s=r(131),n=r(225);const o=(0,s.compose)(s.not,(0,s.is)(Array)),i=(0,s.compose)(s.not,s.isEmpty),a=(0,s.allPass)([(0,s.is)(String),i]),c=(0,s.allPass)([(0,s.is)(Array),i]),l=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)])),d=(0,s.compose)((0,s.allPass)([i,o,(0,s.is)(Object)]));class E{constructor(e,t={},r,o){l(e)&&(t=e,e=(0,s.prop)("selector",t),o=o||(0,s.prop)("testMode",t));const i=[r,(0,s.prop)("debugLabel",t)];r=(0,s.compose)((0,s.find)((0,s.is)(String)))(i);let p=(0,s.omit)(["debugLabel","label","selector","props","testMode","propFilters"],t);void 0!==t.props?p=(0,s.mergeAll)([t.props,p]):void 0!==t.propFilters&&(p=(0,s.mergeAll)([t.propFilters,p])),t.propFilters=p;const{propFilters:h}=t,N=a(e)?E.filterSelector([e],r):void 0,u=c(e)?E.filterSelector(e,r):void 0,m=d(h)?E.filterData(h,r):void 0;let _=(0,s.reject)(s.isNil,[N,u,m]);const T=(0,s.isEmpty)(_);return T&&(_=[(0,s.always)(!1)],!0===n.M.debug&&!0!==o&&console.warn(`Spyne Warning: The Channel Filter, with selector: ${e}, and propFilters:${h} appears to be empty!`)),!0===o?{selector:e,propFilters:h,debugLabel:r,filters:t,testMode:o,filtersAreEmpty:T}:(0,s.allPass)(_)}static filterData(e,t){const r=t;return(()=>{if((0,s.isEmpty)(e))return(0,s.always)(!1);e=(0,s.map)((e,t,r)=>{let n=s.F;if((e=>(0,s.is)(String,e))(e)||(e=>(0,s.is)(Boolean,e))(e)||(e=>(0,s.is)(Number,e))(e))o=e,n=e=>e===o;else{if("function"==typeof e)return e;if((e=>(0,s.is)(Array,e))(e)||l(e))return console.warn(`ChannelPayloadFilter: Property "${e}" is an array/object, which is not allowed. This property will always return false.`),n}var o;return n},e);const t=(0,s.where)(e);return(0,s.compose)(t,t=>{if(void 0===r)return t;const n={};return(0,s.forEachObjIndexed)((e,r)=>{n[r]=e((0,s.prop)(r,t))},e),console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${r}"] - values: `,"color:orange;",{propsBooleans:n,comparedObj:t}),t},(0,s.defaultTo)({}),e=>{const{payload:t,srcElement:r,event:s}=e||{};return Object.assign({},e,r,s,t)})})()}static checkPayloadSelector(e,t,r){const{payload:n,srcElement:o,event:i}=r||{},a=[o,n,(0,s.prop)("srcElement",i),r].reduce((e,t)=>{const r=(0,s.prop)("el",t);return E.elIsDomElement(r)&&void 0===e&&(e=r),e},void 0),c=e=>e.isEqualNode(a),l=e=>{const t=Array.from(document.querySelectorAll(e));return(0,s.map)(c,t)};if(void 0!==t){const r=(0,s.compose)(s.flatten,(0,s.map)(l))(e),n=e;console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${t}"] - selectors: `,"color:orange;",{el:a,selectorsArr:n,nodeArrResultsDebugger:r})}if("object"!=typeof a)return!1;const d=(0,s.compose)(s.flatten,(0,s.map)(l))(e);return!0!==(0,s.isEmpty)(d)&&(0,s.any)((0,s.equals)(!0),d)}static elIsDomElement(e){return(0,s.is)(String,e)&&(e=document.querySelector(e)),(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(e)}static filterSelector(e,t){const r=(0,s.reject)(s.isEmpty,e);return(0,s.curry)(E.checkPayloadSelector)(r,t)}}},907(e,t,r){function s(e){return e&&"object"==typeof e&&"[object RegExp]"!==Object.prototype.toString.call(e)&&"[object Date]"!==Object.prototype.toString.call(e)}function n(e,t){return t&&!0===t.clone&&s(e)?i((r=e,Array.isArray(r)?[]:{}),e,t):e;var r}function o(e,t,r){const o=e.slice();return t.forEach(function(t,a){void 0===o[a]?o[a]=n(t,r):s(t)?o[a]=i(e[a],t,r):-1===e.indexOf(t)&&o.push(n(t,r))}),o}function i(e,t,r){const a=Array.isArray(t),c=(r||{arrayMerge:o}).arrayMerge||o;return a?Array.isArray(e)?c(e,t,r):n(t,r):function(e,t,r){const o={};return s(e)&&Object.keys(e).forEach(function(t){o[t]=n(e[t],r)}),Object.keys(t).forEach(function(a){s(t[a])&&e[a]?o[a]=i(e[a],t[a],r):o[a]=n(t[a],r)}),o}(e,t,r)}r.d(t,{$:()=>i}),i.all=function(e,t){if(!Array.isArray(e)||e.length<2)throw new Error("first argument should be an array with at least two elements");return e.reduce(function(e,r){return i(e,r,t)})}},64(e,t,r){r.d(t,{FZ:()=>i,Ir:()=>n,Lx:()=>a,OZ:()=>o,RK:()=>c,V0:()=>l});var s=r(131);const n=async(e,t)=>{window.setTimeout(async()=>{await new Promise(e=>setTimeout(e,1)),window.requestAnimationFrame(e)},t)},o=e=>{if(void 0!==e.constructor.name)return e.constructor.name;const t=e.toString();return(0,s.defaultTo)(String(t).substr(0,12),(0,s.match)(/^(function\s)(\w+)(\(.*)$/,t)[2])},i=(e,t)=>void 0!==e[t]?t:(0,s.compose)(s.head,(0,s.filter)((0,s.compose)((0,s.test)(s.__,t),e=>new RegExp(e))))((0,s.keys)(e)),a=e=>{const t={};for(const r in e)t[r]=e[r];return t},c=e=>{const t=(0,s.compose)((0,s.complement)(s.isEmpty),s.head,s.values),r=(0,s.compose)((0,s.complement)(s.isNil),s.head,s.values);return(0,s.allPass)([t,r])(e)};function l(e,t=[]){const r=(0,s.concat)(["length","name","prototype","constructor"],t),n=(0,s.compose)((0,s.without)(r),s.uniq),o=n(Object.getOwnPropertyNames(e.constructor.prototype)),i=n(Object.getOwnPropertyNames(e.constructor));return{methods:o,staticMethods:i,allMethods:(0,s.concat)(o,i)}}},158(e,t,r){r.d(t,{gc:()=>n});var s=r(131);function n(){setTimeout(()=>{(0,s.forEach)(e=>{},this)},1)}},445(e,t,r){function s(){return{createpropsMap:function(){const e=new WeakMap,t={vsid:this.props.vsid};return e.set(t,this.props),{key:t,weakMap:e}},gc:function(){for(const e in this)delete this[e]},createId:function(){return Math.random().toString(36).replace(/\d/gm,"").substring(1,8)},setTraceFunc:function(e){return!0===e?console.log:()=>{}}}}r.d(t,{z:()=>s})},643(e,t,r){r.d(t,{N:()=>n});var s=r(54);function n(){return{testFunc:function(e){console.log("stream mixin is ",e)},sendRoutePayload:function(e,t){return new s.u("CHANNEL_ROUTE",e,t,"subscribe")},sendUIPayload:function(e,t){return new s.u("CHANNEL_UI",e,t,"subscribe")}}}},521(e,t,r){r.d(t,{g:()=>o});var s=r(173),n=r(131);class o{constructor(e){const t=String(e.props.name),r=`${t}_ROUTE_UPDATER`;return(0,n.curry)(o.createTemporaryViewStreamObj)({id:r,name:t})}static createTemporaryViewStreamObj(e,t){const{name:r,id:n}=e,o=t,i=new s.A({id:n,name:r,data:t});i.onRendered=()=>{i.sendInfoToChannel("CHANNEL_ROUTE",o)},i.afterBroadcastEvents=()=>{i.disposeViewStream()},i.appendToNull()}}},961(e,t,r){r.d(t,{l:()=>o});var s=r(131),n=r(225);const o=function(e){const{__proxy__proxyName:t}=e;if(void 0!==t){const r=n.M.getProxyReviver(t);if("function"==typeof r)return((e,t)=>{const{__proxy__proxyName:r}=e;void 0===r&&console.error("object is not proxy object ",e);const n=(r,n)=>{const o=(0,s.path)(n,e),{__proxy__isProxy:i,__proxy__props:a}=o;return i?t(r,a):r},o=n((0,s.clone)(e),[]),i=(e,t)=>{const r=t||[];Object.entries(e).forEach(([t,s])=>{const o=(e=>{let t=typeof e;return["number","boolean","string"].includes(t)?t="primitive":"object"===t&&(Array.isArray(e)?t="array":null===e&&(t="undefined")),t})(s),a=[...r];a.push(t),"object"!==o&&"array"!==o||(e[t]=n(s,a),i(s,a))})};return i(o),o})(e,r)}const r=(0,s.is)(Array),o=(0,s.is)(Object);var i;return!1===r(i=e)&&!0===o(i)?(0,s.compose)(s.fromPairs,s.toPairs,s.clone)(e):(0,s.clone)(e)}},672(e,t,r){r.d(t,{Ay:()=>m,UO:()=>u,oG:()=>h,v8:()=>N});var s=r(636),n=r.n(s),o=r(225);let i,a=!1,c=!1;const l={ALLOWED_TAGS:["a","b","i","em","strong","u","p","br","ul","dl","dt","dd","ol","li","hr","blockquote","pre","code","span","div","section","article","aside","header","footer","h1","h2","h3","h4","h5","h6","table","thead","tbody","tr","td","th","img","figure","figcaption","video","source","iframe","input","button","label","link"],ADD_TAGS:["iframe","input","button","link"],ALLOWED_ATTR:["href","src","alt","class","title","width","height","style","target","rel","controls","poster","type","rows","cols"],ALLOW_DATA_ATTR:!0,FORBID_ATTR:["onerror","onload","onclick","onmouseover","onfocus","onblur","onchange"],FORBID_TAGS:["script","object","embed","meta"],SAFE_URL_PATTERN:/^(https?:|mailto:|tel:|data:image\/)/i},d={FORBID_TAGS:["script","iframe","object","embed","form","input","button","link","meta"],FORBID_ATTR:["onerror","onload","onclick","onmouseover","onfocus","onblur","onchange"],ALLOW_DATA_ATTR:!1},E=()=>{try{const e=o.M?.mode||"production";if("authoring"===e||"development"===e)return"richtext"}catch(e){}return"app"};function p(e="app"){const t="richtext"===e?l:d;return r=>{let s=n().sanitize(r,t);return"richtext"===e&&(s=s.replace(/<(a|img)\b([^>]+?)>/gi,e=>e.replace(/\b(href|src)="([^"]*)"/gi,(e,t,r)=>e))),s}}const h=(e={})=>{if(a)return void console.warn("sanitizeData is already configured. Reconfiguration is not allowed.");const{strict:t=!1}=e,r=e=>{const t=p(e),r=e=>{if(Array.isArray(e))return e.map(r);if(e&&"object"==typeof e){const s={};for(const[n,o]of Object.entries(e))s[n]="string"==typeof o?t(o):r(o);return s}return"string"==typeof e?t(e):e};return r};i=(e,s={})=>{const{disableSanitize:n=!1,mode:o}=s,i=o||(c||t?"app":E());return n?e:r(i)(e)},h.sanitizeDataForce=(e,t)=>{const s=t||E();return r(s)(e)},a=!0},N=(e,t)=>{if(!e)return;const r=p(t||E()),s=/<(?:script|object|embed|form|input|button|link|meta)[^>]*>|on\w+=|javascript:/i;if("string"==typeof e.value&&s.test(e.value)){const t=r(e.value);t!==e.value&&(e.value=t)}if(e.isContentEditable&&"string"==typeof e.innerHTML&&s.test(e.innerHTML)){const t=r(e.innerHTML);t!==e.innerHTML&&(e.innerHTML=t)}},u=(e=!0)=>{c=!!e},m=(e,t={})=>{if(!a)throw new Error("sanitizeData is not configured. Call sanitizeDataConfigure() first.");return i(e,t)}},49(e,t,r){r.d(t,{A:()=>c,D:()=>a});var s=r(636),n=r.n(s);let o,i=!1;const a=e=>{if(i)console.warn("sanitizeHTML is already configured. Reconfiguration is not allowed.");else{if(e.strict)if(window.trustedTypes){const e=window.trustedTypes.createPolicy("default",{createHTML:e=>n().sanitize(e,{RETURN_TRUSTED_TYPE:!1})});o=t=>e.createHTML(t)}else o=e=>n().sanitize(e);else o=e=>e;i=!0}},c=e=>{if(!i)throw new Error("sanitizeHTML is not configured. Call sanitizeHTMLConfigure() with appropriate config.");return o(e)}},225(e,t,r){r.d(t,{M:()=>A});var s=r(167),n=r(511),o=r(519),i=r(907);let a,c,l,d,E=!0,p=!1;const h=[];let N,u;const m=[],_=new Map,T=new o.O,A=new class{constructor(){d=!1}get channelsMap(){return l}get initialized(){return d}get config(){return a}get debug(){return E}static listChannels(){return Array.from(c.map.keys())}initialize(e={},t={},r,s){return c=r,a=(0,i.$)(e,t),a.channels&&a.channels.ROUTE&&(a=s.conformRouteObject(a)),u=a?.IMG_PATH,E=void 0!==a.debug?a.debug:E,this.getChannelActions=c.getChannelActions.bind(c),this.listRegisteredChannels=c.listRegisteredChannels.bind(c),d=!0,this._initialized=d,this.setChannelsMap(),t?.baseHref&&this.setHeadBaseHref(t.baseHref),a}setHeadBaseHref(e){const t=document.createElement("base");t.href=e,document.head.appendChild(t)}conformRouteConfig(e=!1){a=s.H.conformRouteObject(a,e)}setChannelsMap(){const e=c.getStream.bind(c),t=c.testStream.bind(c),r=c.getProxySubject.bind(c);l={getStream:e,testStream:t,getProxySubject:r}}setProp(e,t,r=!1){return r?(a.ephemeralProps[e]=t,t):(a.tmpProps[e]=t,e)}getProp(e){if(a.ephemeralProps.hasOwnProperty(e)){const t=a.ephemeralProps[e];return delete a.ephemeralProps[e],t}return a?.tmpProps?.[e]}createTempProp(e){const t=Math.random().toString(36).slice(2,8);return this.setProp(t,e,!0),t}setChannelConfig(e,t){return a.channels[e]=t,a.channels[e]}getChannelConfig(e,t=a){if("CHANNEL_ROUTE"===e?e="ROUTE":"CHANNEL_WINDOW"===e&&(e="WINDOW"),void 0===t||void 0===a.channels)return void console.warn("Spyne warning: Spyne config object is empty!");const r=a.channels[e];if(void 0!==r)return r;console.warn(`Spyne warning: Spyne configuration for channel, ${e} is empty!`)}registerChannel(){}addPluginConfig(e,t={}){void 0===a.plugins&&(a.plugins={}),this.addPluginMethods(t.pluginMethods),a.plugins[e]=t}getPluginsMethodObj(e){return e&&this.addPluginMethods(e),T.pluginMethodsObj}addPluginMethods(e){e&&T.addMethods(e)}doNotTrackChannel(e){m.push(e)}getUntrackedChannelsList(){return m}registerProxyReviver(e,t){_.set(e,t)}registerPlugin(e){this._initialized||console.warn("SpyneApp is not initialized yet. Plugin will not be fully registered."),e.register(this)}getProxyReviver(e){return _.get(e)}getPluginConfigByPluginName(e){return a.plugins[e]}get IMG_PATH(){return u}get excludeChannelsFromConsole(){return h}set excludeChannelsFromConsole(e){"string"==typeof e?h.includes(e)||h.push(e):Array.isArray(e)?e.forEach(e=>{"string"!=typeof e||h.includes(e)||h.push(e)}):console.warn("Invalid value provided to excludeChannelsFromConsole. Only strings or arrays are allowed.")}get linksData(){return console.warn("get links data in SpyneAppProperties is deprecated, use navLinks"),N}set linksData(e){console.warn("set links data in SpyneAppProperties is deprecated, use navLinks")}get navLinks(){return N}set navLinks(e){N=e}get enableCMSProxies(){return p}getHrefFromData(e={}){return n.Q.convertParamsToRoute(e)}set enableCMSProxies(e=!0){p=Boolean(e)}setCMSProxyMethod(e){this.enableCMSProxies=!0,this.formatTemplateForProxyData=e}tempGetChannelsInstance(){}tempGetConfig(){}}},519(e,t,r){r.d(t,{O:()=>a});var s=r(131);const n=Object.create({}),o=(0,s.compose)(s.not,(0,s.is)(Array)),i=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)]));class a{constructor(){n.foo=()=>console.log("used for testing purposes.")}addMethod(e,t,r=!1){if(!0===Object.prototype.hasOwnProperty.call(n,e)){const t=`Spyne Warning: the method name, ${e}, already exists.`;if(r)return t;console.warn(t)}else n[e]=t}addMethods(e={},t=!1){let r;return!1===i(e)?(r=`Spyne Warning: the pluginMethods property, ${JSON.stringify(e)} needs to be an object.`,t?r:void console.warn(r)):(0,s.keys)(e).map(n=>{const o=(0,s.prop)(n,e);if("function"==typeof o)this.addMethod(n,o,t);else{if(r=`the value for ${n} is not a valid function.`,t)return r;console.warn(r)}}).join(",")}checkIfMethodExists(e){}get pluginMethodsObj(){return n}}},732(e,t,r){r.d(t,{g:()=>o});var s=r(64),n=r(131);class o{constructor(e,t="",r=!0){return this.parentContext=e,this.omittedMethods=["autoBinder","initAutoBinder","getEnhancerMethods","checkForMalformedMethods","caller","arguments","bindParentViewStream"],this.prefix=t,!0===r&&this.autoBinder(),this.allMethodsList}initAutoBinder(){this.autoBinder()}getEnhancerMethods(){return(0,s.V0)(this,this.omittedMethods)}checkForMalformedMethods(e){if(""===this.prefix)return void console.warn(`SPYNE WARNING: The following SpyneTrait ${this.constructor.name} needs a prefix`);const t=(0,n.reject)(e=>0===e.indexOf(this.prefix),e);if(t.length>=1){const e=`Spyne Warning: The following method(s) in ${this.constructor.name} require the prefix, "${this.prefix}": [${t.join(", ")}];`;console.warn(e)}}bindParentViewStream(e,t){this.checkForMalformedMethods(e.allMethods);const r={},s=(e,s=!1)=>{const n=!0===s?this.constructor:this;"function"==typeof n[e]&&(r[e]=t[e]=n[e].bind(t))},o=(0,n.curryN)(2,s)(n.__,!0);return(0,n.map)(o,e.staticMethods),(0,n.map)(s,e.methods),r}autoBinder(){const e=this.getEnhancerMethods();return this.allMethodsList=this.bindParentViewStream(e,this.parentContext),this.allMethodsList}}},511(e,t,r){r.d(t,{Q:()=>o});var s=r(131),n=r(225);class o{constructor(){this.checkIfObjIsNotEmptyOrNil=o.checkIfObjIsNotEmptyOrNil.bind(this)}static checkIfObjIsNotEmptyOrNil(e){const t=(0,s.compose)((0,s.complement)(s.isEmpty),s.head,s.values),r=(0,s.compose)((0,s.complement)(s.isNil),s.head,s.values);return(0,s.allPass)([t,r])(e)}static checkIfParamValueMatchesRegex(e,t){const r=(0,s.reject)((0,s.equals)("routeName")),n=(0,s.compose)(r,s.keys),o=(0,s.compose)((0,s.find)(t=>(0,s.test)(new RegExp(t),e)),n)(t);return(0,s.is)(String,o)&&(t=(0,s.assoc)(e,(0,s.prop)(o,t),t)),t}static formatStrAsWindowLocation(e){return{hash:e,search:e,pathname:e}}static getLocationStrByType(e,t=!1,r=window.location){const n={slash:"pathname",query:"search",hash:"hash"}[!0===t?"hash":e];return(0,s.prop)(n,r).replace(/^(\/)?(#)?(\/)?(.*)$/,"$4")}static createRouteArrayFromParams(e,t,r="slash",n){const o=[],i=t=>{const r={},a=t.routeName;let c=void 0!==e[a]?e[a]:(0,s.prop)(a,n);const l=typeof t[c];"string"===l?c=t[c]:"undefined"===l&&(t=this.checkIfParamValueMatchesRegex(c,t)),r[a]=c,this.checkIfObjIsNotEmptyOrNil(r)&&o.push(r);const d=(0,s.is)(Object,t),E=(0,s.has)(c,t),p=(0,s.has)("routePath",t);if(!0===(E&&d)){const e=t[c];(0,s.has)("routePath",e)&&i(e.routePath)}else!0===p&&void 0!==c&&i(t.routePath)};return i(t),o}static createSlashString(e){const t=(0,s.reject)(s.isNil),r=(0,s.when)((0,s.complement)(s.isNil,s.__),(0,s.join)("/")),n=(0,s.replace)(/^(\^*)(.*|^\$)(\$)$/,"$2");return(0,s.compose)(n,r,t,s.flatten,(0,s.map)(s.values))(e)}static createQueryString(e){const t=(0,s.reject)(s.isNil),r=this.checkIfObjIsNotEmptyOrNil,n=(0,s.compose)((0,s.join)("="),s.flatten,s.toPairs),o=(0,s.ifElse)(r,n,(0,s.always)(void 0)),i=(0,s.map)(o),a=(0,s.when)((0,s.complement)(s.isEmpty),(0,s.concat)("?"));return(0,s.compose)(a,(0,s.join)("&"),t,i)(e)}static checkPayloadForRegexOverrides(e,t,r="Value"){const n=(0,s.compose)(e=>(0,s.prop)(`${e}${r}`,t),s.head,s.keys);return(0,s.map)(e=>{const t=n(e);return void 0!==t?(0,s.assoc)((0,s.compose)(s.head,s.keys)(e),t,e):e},e)}static checkForRouteValWithMultipleVals(e){return!0===Array.isArray(e)?e.map(e=>("object"==typeof e&&(e=Object.keys(e).reduce((t,r)=>(t[r]=(e=>{const t=e.match(/^[^|]*/);return t?"^$"===t[0]?"":t[0]:e})(e[r]),t),{})),e)):e}static checkForRouteValsPartMatch(e,t={}){return e.map(e=>{const r={...e};return Object.keys(r).forEach(e=>{var s,n;Object.prototype.hasOwnProperty.call(r,e)&&t[e]&&(r[e]=(s=t[e],(n=r[e]).split("|").some(e=>((e,t)=>{const r=e.replace(/[-/\\^$+?.()|[\]{}]/g,"\\$&").replace(/\*/g,"[\\w\\d_-]*");return new RegExp(`^${r}$`).test(t)})(e,s))?s:n))}),r})}static convertParamsToRoute(e,t=n.M.config.channels.ROUTE,r,s){const i=void 0!==r?r:t.type,a=t.isHash,c=t.routes.routePath,l=void 0!==s?s:this.getLocationStrByType(i,a),d=this.convertRouteToParams(l,t,i).routeData;let E=this.createRouteArrayFromParams(e,c,i,d);return E=o.checkPayloadForRegexOverrides(E,e),E=o.checkForRouteValWithMultipleVals(E),"query"===i?this.createQueryString(E):this.createSlashString(E)}static findIndexOfMatchedStringOrRegex(e,t){const r=t.includes(".+"),n=(0,s.replace)(/^$/,"^$"),o=(0,s.either)((0,s.propEq)(e,"str"),(0,s.compose)((0,s.test)(s.__,e),(0,s.prop)("re")));return(0,s.compose)((0,s.findLastIndex)((0,s.equals)(!0)),(0,s.map)(o),(0,s.map)(e=>{return{str:e,re:(t=e,r&&(t.startsWith("^")||(t="^"+t),t.endsWith("$")||(t+="$")),new RegExp(t))};var t}),(0,s.map)(n))(t)}static checkIfValueShouldMapToParam(e,t,r){const n=(0,s.compose)((0,s.map)(s.last),(0,s.map)((0,s.filter)((0,s.is)(String))),s.toPairs)(e),i=o.findIndexOfMatchedStringOrRegex(t,n);let a=t;if(i>=0){const t=n[i],r=(0,s.invert)(e),o=(0,s.compose)(s.head,(0,s.defaultTo)([]),(0,s.prop)(t))(r);!0===/^([-$\w]*)$/.test(o)&&!0===(0,s.is)(String,o)&&(a=o)}return a}static createArrFromSlashStr(e){return e.replace(/^([/])?(.*)$/,"$2").split("/")}static convertSlashRouteStrToParamsObj(e,t,r){const n=t,o=this.createArrFromSlashStr(t),i=[],a=[];let c=e;(0,s.reduce)((e,t)=>{const n=this.checkIfValueShouldMapToParam(c,t,r);c=this.checkIfParamValueMatchesRegex(t,c);const o=(0,s.either)(s.isEmpty,s.isNil);void 0!==c&&(e=>e!==(0,s.last)(i))(c.routeName)&&!1===o(n)&&(i.push(c.routeName),a.push(n));const l=[t,"routePath"],d=(0,s.path)(l,c),E=(0,s.path)(["routePath"],c);void 0!==d?c=d:void 0!==E&&(c=E)},0,o);const l=(0,s.zipObj)(i,a),d=this.getLastArrVal(i);return{paths:i,pathInnermost:d,routeData:l,routeValue:n}}static getLastArrVal(e){return t=e,void 0!==(0,s.last)(t)?(0,s.last)(t):"";var t}static createDefaultParamFromEmptyStr(e,t){const r={};return r[e.routeName]=this.checkIfValueShouldMapToParam(e,t),r}static convertQueryStrToParams(e,t,r){const n=t,o=t.replace(/^([?])?(.*)$/,"$2"),i=(0,s.compose)((0,s.map)((0,s.split)("=")),(0,s.split)("&"))(o);let a=(0,s.fromPairs)(i),c=(0,s.map)(s.head,i);return!0===(0,s.isEmpty)(t)&&(a=this.createDefaultParamFromEmptyStr(e,t,r),c=(0,s.keys)(a)),{paths:c,pathInnermost:this.getLastArrVal(c),routeData:a,routeValue:n}}static convertRouteToParams(e,t,r){if(void 0===t)return{};const n=void 0!==r?r:t.type,o=(0,s.defaultTo)({},(0,s.prop)("regexTokens",t)),i=t.routes.routePath;return"query"===n?this.convertQueryStrToParams(i,e):(e=e.replace(/\/$|$/,"/"),this.convertSlashRouteStrToParamsObj(i,e,o))}}},167(e,t,r){r.d(t,{H:()=>i});var s=r(968),n=r(131),o=r(511);class i{constructor(){this.createPopStateStream=i.createPopStateStream.bind(this)}static createPopStateStream(e){(0,s.fromEventPattern)(function(e){window.onpopstate=e},function(){window.onpopstate=function(){}}).subscribe(e)}static getLastArrVal(e){return t=e,void 0!==(0,n.last)(t)?(0,n.last)(t):"";var t}static compareRouteKeywords(e={},t){const r=(e,t)=>void 0!==t?(0,n.pick)(t,e):e;let s=r(e,t);return{pickValues:r,compare:(e={},t)=>{const o=r(e,t),i=e=>(0,n.compose)(n.keys,(0,n.filter)((0,n.propEq)(!0,e))),a=(0,n.compose)((0,n.map)(e=>{const t=(0,n.prop)(e,s),r=(0,n.prop)(e,o),i=(0,n.equals)(t,r),a=void 0!==t,c=void 0!==r,l=!i,d=!1===a&&!0===c,E=!0===a&&!1===c,p={};return p[e]={same:i,changed:l,added:d,removed:E,previousExists:a,nextExists:c},p}),n.uniq,(0,n.chain)(n.keys))([s,o]),c=(0,n.chain)(i("changed"),a),l=(0,n.chain)(i("added"),a),d=(0,n.chain)(i("removed"),a);return s=o,{pathsAdded:l,pathsRemoved:d,pathsChanged:c}},getComparer:()=>s}}static getRouteArrData(e,t){const r=(0,n.filter)((0,n.includes)(n.__,e),t);return{paths:r,pathInnermost:i.getLastArrVal(r)}}static flattenConfigObject(e){const t=e=>(0,n.chain)(([e,r])=>"object"!=typeof r||null===r||Array.isArray(r)?[[e,r]]:(0,n.map)(([t,r])=>[`${e}.${t}`,r],t(r)),(0,n.toPairs)(e));return(0,n.values)((0,n.fromPairs)(t(e)))}static addRouteDatasets(e){const{type:t,isHash:r}=e,s=s=>("query"===t?"":!0===r?"#":"/")+o.Q.convertParamsToRoute(s,e).replace(/^(.*\/)([\w-]*\/?)(.*)$/gm,"$1$2"),i=/^([A-Za-z0-9_-])+$/m,a=(e=[],t,r={})=>{let{routeName:o}=t;return(0,n.toPairs)(t).reduce((t,c)=>{const[l,d]=c,E=(0,n.is)(Object,d),p=e=>(0,n.test)(i,e)?(e=>String(e).replace(/([-_])/g," ").toUpperCase())(e):l;if("routeName"===l||"404"===l)return t;o=o||(0,n.prop)("routeName",d);let h=(0,n.clone)(r);if(h[o]=String(l).replace(/([^A-Za-z0-9-_])/g,""),!0===E){if(1===(0,n.keys)(h).length){const e=(0,n.path)(["routePath","routeName"],d);if(e){const o=(0,n.clone)(h);o[e]="",o.navLevel=(0,n.keys)(r).length,o.title=p(l),o.href=s(o),t.push(o)}}h=a(e,d,h)}else h.title=p(l),h.href=s(h);return h.navLevel=(0,n.keys)(r).length,t.push(h),t},[])},c=a([],e.routes);let l=(0,n.flatten)(c);return l=function e(t){return t.map(t=>{for(const r in t)void 0===r||"undefined"===r||void 0===t[r]?delete t[r]:t[r]&&"object"==typeof t[r]&&!Array.isArray(t[r])&&(t[r]=e([t[r]])[0]);return t})}(l),{routeDatasetsArr:l,routeNamesArr:(e=>{const t=(0,n.reject)((0,n.includes)(n.__,["title","href","navLevel","undefined"]));return(0,n.compose)(n.uniq,t,n.flatten,(0,n.map)(n.keys))(e)})(l)}}static conformRouteObject(e={},t=!1){const r=(0,n.path)(["channels","ROUTE"],e);let{add404s:s}=void 0!==r?r:e;s=s||t;const o=e=>{const t=e[1],r=(0,n.is)(Array,t);return""===t?e[1]="^$":r&&(e[1]=t.join("|")),e},a=(0,n.compose)(n.fromPairs,(0,n.map)(e=>{const[t,r]=e,i=s?{404:".+"}:{},c=(0,n.is)(Object,r),l=(0,n.is)(Array,r),d="routePath"===t;return!0===c&&!1===l&&(e[1]=a(e[1]),d&&(e[1]=(0,n.compose)((0,n.mergeDeepRight)(i),n.fromPairs,(0,n.map)(o),n.toPairs)(e[1]))),e}),n.toPairs);if(void 0!==r){e.channels.ROUTE=a(e.channels.ROUTE);const t=i.addRouteDatasets(e.channels.ROUTE);return e.channels.ROUTE=(0,n.mergeRight)(e.channels.ROUTE,t),e}return a(e)}static getLocationData(){return(0,n.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}}},432(e,t,r){r.d(t,{Y:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(){this.createDomObservableFromEvent=i.createDomObservableFromEvent.bind(this)}static createDomObservableFromEvent(e,t,r=!0,o=window){return t=void 0===t?e=>e:t,(0,s.fromEventPattern)(t=>o.addEventListener(e,t,{passive:r}),()=>{o[e]=e=>e}).pipe((0,n.map)(t))}static createMediaQuery(e){const t=window.matchMedia(e);return this.checkIfValidMediaQuery(t,e),!1!==t&&t}static checkIfValidMediaQuery(e,t){const r=e=>e.replace(/\s+/gm,""),s=void 0!==e.matches&&r(e.media).indexOf(r(t))>=0;return!1===s&&(t=>{console.warn(`Spyne Info: the following query string, "${t}", has been optimized to "${e.media}" by the browser and may not be a valid Media Query item!`)})(t),s}static createMediaQueryHandler(e,t){const r=(e=>t=>(t.mediaQueryName=e,t))(t),o=(i=e,{addHandler:e=>{i.addListener(e)},removeHandler:e=>{i.onchange=()=>{}}});var i;return new s.fromEventPattern(o.addHandler,o.removeHandler).pipe((0,n.map)(r))}static createMergedObsFromObj(e){const t=e.mediaQueries||e.mediaQueries,r=[];return(0,o.mapObjIndexed)((e,t,s)=>{const n=i.createMediaQuery(e);return!1!==n&&r.push(i.createMediaQueryHandler(n,t)),r},t),r}}},393(e,t,r){r.d(t,{W:()=>n,d:()=>o});const s=(e=!1,t=1,r="ease",s=!1)=>`${!0===s?"opacity:0;":""}transition: opacity ${t}s ${r}; opacity: ${!0===e?1:0};`;function n(e,t){const r=1*window.getComputedStyle(e).opacity,n=s(!0,t,"ease",1===r);e.style.cssText+=n}function o(e,t,r){const n=s(!1,t,"ease");e.style.cssText+=n,e.addEventListener("transitionend",r,!1)}},518(e,t,r){r.d(t,{j:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(e){this.props.observableStreams=i.createDirectionalObservables()}static createDirectionalFiltersObject(){const e="internal",t="parent",r="child";return{P:[t],C:[r],PCI:[t,e,r],CI:[r,e],PI:[t,e],PC:[t,r]}}static addDefaultDir(e){return(0,o.flip)(o.mergeRight)({$dir:["internal"]},(0,o.clone)(e))}static addDownInternalDir(e,t=["internal","down"]){return(0,o.flip)(o.mergeRight)((0,o.clone)(e),{$dir:t})}static addChildAndInternalDir(e,t=["child","down"]){return(0,o.flip)(o.mergeRight)((0,o.clone)(e),{$dir:t})}static mapToDefaultDir(e){return this.addDefaultDir(e)}static createDirectionalObservables(e=new s.Subject,t,r){void 0!==t&&void 0!==r&&(e.viewName=t,e.vsid=r);const i=e=>(0,o.propSatisfies)(t=>t.includes(e),"$dir"),a=i("parent"),c=i("child"),l=i("internal"),d=e=>(0,o.mergeRight)({from$:e}),E=d("child"),p=d("internal"),h=d("parent"),N=e.pipe((0,n.filter)(e=>void 0!==e&&void 0!==e.action)),u=e.pipe((0,n.filter)(l),(0,n.map)(p)),m=e.pipe((0,n.filter)(a),(0,n.map)(E)),_=e.pipe((0,n.filter)(c),(0,n.map)(h)),T={parent:m,internal:u,child:_};return{raw$:N,toInternal$:u,toParent$:m,toChild$:_,completeAll:()=>{(0,o.forEach)(e=>{e.complete(),e.isStopped=!0},[N,u,m,_])},completeStream:(e=[])=>{void 0!==e&&e.length>=1&&e.forEach(e=>{var t;void 0!==T[e]&&((t=T[e]).complete(),t.isStopped=!0)})}}}}},291(e,t,r){r.d(t,{X:()=>i});var s=r(131),n=r(49),o=r(225);class i{constructor(e,t={},r={}){this.template=this.formatTemplate(e),this.isProxyData=!0===t.__cms__isProxy,this.testMode=r?.testMode,this.template=i.normalizeTripleBrackets(this.template),!0===this.isProxyData&&(!0===o.M.enableCMSProxies?this.template=o.M.formatTemplateForProxyData(this.template):this.template=i.formatTemplateForProxyData(this.template)),(()=>{!0===(0,s.is)(Array,t)&&(t={spyneData:t},this.template=this.template.replace("{{/}}","{{/spyneData}}"),this.template=this.template.replace("{{#}}","{{#spyneData}}"))})(),this.templateData=t,this.currentOuterLoopData=null;const n=i.getStringArray(this.template);let a=this.template.match(i.findTmplLoopsRE());a=null===a?[]:a;const c=i.parseTmplLoopsRE(),l=this.parseTheTmplLoop.bind(this),d=(0,s.includes)(s.__,a),E=(0,s.ifElse)(d,e=>e.replace(c,l),this.addParams.bind(this));this.finalArr=n.map(E)}static isPrimitiveTag(e){return/({{\.\*?}})/.test(e)}static normalizeTripleBrackets(e){return"string"!=typeof e||-1===e.indexOf("{{{")?e:e.replace(/\{\{\{([^{}]+?)\}\}\}/g,"{{$1}}")}static getNestedDataReducer(e={},t=""){return/(\.)/gm.test(String(t))?String(t).split(".").reduce((e,t)=>e[t]?e[t]:"string"==typeof e?e:"",e):e[t]??""}static getStringArray(e){const t=e.split(i.findTmplLoopsRE()),r=/^([\\n\s\W]+)$/,n=t.filter((e,t)=>!(t>=2&&(t-2)%3==0));return(0,s.reject)(e=>e.match(r),n)}static findTmplLoopsRE(){return/({{#([\w.]+)}}[\w\n\s\W]+?{{\/\2}})/gm}static parseTmplLoopsRE(){return/({{#([\w.]+)}})([\w\n\s\W]+?)({{\/\2}})/gm}static innerLoopRE(){return/({{#([\w.]+)}})([\w\n\s\W]+?)({{\/\2}})/gm}static swapParamsForTagsRE(){return/({{)(.*?)(}})/gm}static hasLoop(e){return i.innerLoopRE().test(e)}removeThis(){void 0!==this&&(this.finalArr=void 0,this.templateData=void 0,this.template=void 0)}renderDocFrag(){let e=i.replaceImgPath(this.finalArr.join(""));!0!==this.testMode&&(e=(0,n.A)(e));const t=/^([^>]*?)(<){1}(\b)(thead|col|colgroup|tbody|td|tfoot|tr|th)(\b)([^\0]*)$/.test(e)?e:document.createRange().createContextualFragment(e);return window.setTimeout(this.removeThis,2),t}renderToString(){let e=this.finalArr.join("");return e=i.replaceImgPath(e),window.setTimeout(this.removeThis,2),e}getTemplateString(){return this.finalArr.join("")}formatTemplate(e){return!0===["SCRIPT","TEMPLATE"].includes((0,s.prop)("nodeName",e))?e.innerHTML:e}getDataValFromPathStr(e,t){const r=String(e).split(".");return(0,s.path)(r,t)||""}addParams(e){return e.replace(i.swapParamsForTagsRE(),(e,t,r,s)=>i.getNestedDataReducer(this.templateData,r))}static replaceImgPath(e){const{IMG_PATH:t}=o.M;return void 0!==t?(e=e.replaceAll(/src\s*=\s*(['"])imgs\//g,`src=$1${t}`)).replaceAll(/url\(\s*(['"]?)imgs\//g,`url($1${t}`):e}processInnerLoop(e,t){const r=i.innerLoopRE();return e.replace(r,(e,r,n,a)=>{!0===i.hasLoop(a)&&(!0===o.M.debug&&!0!==this.testMode&&console.warn(`Spyne Warning: DomElementTemplate supports one level of nested array loops. A deeper nested loop was detected inside "{{#${n}}}". Consider restructuring via nested ViewStreams instead.`),a=a.replace(/{{[#/][\w.]+}}/g,""));const c=i.getNestedDataReducer(t,n);if(!0===(0,s.isNil)(c)||(0,s.isEmpty)(c))return"";const l=Array.isArray(c)?c:[c],d=this.currentOuterLoopData;this.currentOuterLoopData=c;const E=l.map((e,t)=>this.substituteForItem(a,e,t)).join("");return this.currentOuterLoopData=d,E})}substituteForItem(e,t,r){if("string"==typeof t){if(i.isPrimitiveTag(e)){const r=t.replace(/\$/g,"$$$$");return e.replace(i.swapParamsForTagsRE(),r)}const s=this.buildStringItemContext(t,r);return this.substituteObject(e,s)}const s=this.buildItemContext(t,r);return this.substituteObject(e,s)}buildStringItemContext(e,t){const r={spyneLoopKey:e,loopIndex:t,loopNum:t+1};if(!0===this.isProxyData){const t=this.currentOuterLoopData;if(t&&"object"==typeof t){r.__cms__dataId=t.__cms__dataId||"";const s=`__cms__keyFor_${e}`;r.origKey=void 0!==t[s]?t[s]:""}else r.__cms__dataId="",r.origKey=""}return r}buildItemContext(e,t){const r=Object.assign({},e,{loopIndex:t,loopNum:t+1});return!0===this.isProxyData&&(r.__cms__dataId=e.__cms__dataId,r.spyneLoopKey=e,r.loopIndex=t,r.loopNum=t+1),r}substituteObject(e,t){const r=/(\.)/gm,s={loopIndex:t.loopIndex,loopNum:t.loopNum};return e.replace(i.swapParamsForTagsRE(),(e,n,o)=>void 0!==s[o]?s[o]:!1===r.test(o)&&void 0!==t[o]?t[o]:this.getDataValFromPathStr(o,t))}parseTheTmplLoop(e,t,r,n){const o=n,a=i.getNestedDataReducer(this.templateData,r);if(!0===(0,s.isNil)(a)||(0,s.isEmpty)(a))return"";const c=this.currentOuterLoopData;this.currentOuterLoopData=a;const l=Array.isArray(a)?a:[a],d=i.hasLoop(o),E=l.map((e,t)=>{const r=d?this.processInnerLoop(o,e):o;return this.substituteForItem(r,e,t)}).join("");return this.currentOuterLoopData=c,E}}},192(e,t,r){r.d(t,{r:()=>a});var s=r(445),n=r(291),o=r(907),i=r(131);class a{constructor(e={},t=!1){var r;e.tagName=(r=e.tagName,(0,i.defaultTo)("div")(r)),e.attributes=void 0!==e.attributes?e.attributes:this.getDomAttributes(e),e.attrs=this.updateAttrs(e.attributes),e.fragment=document.createDocumentFragment(),this.testMode=t,this.props=e,this.addMixins()}setProp(e,t){this.props[e]=t}getProp(e){return this.props[e]}get el(){return this.props.el}setElAttrs(e,t){return this.getProp("attrs").forEach((t,r)=>{"dataset"===r?(0,i.forEachObjIndexed)((t,r)=>{e.dataset[r]=t},t):e.setAttribute(r,t)}),e}updateAttrs(e,t){const r=void 0!==t?t:new Map;return(0,i.mapObjIndexed)((e,t)=>r.set(t,e),e),r}addTemplate(e){const t=this.getProp("template");return void 0!==t?(t=>{let r=this.getProp("data");r=(0,i.is)(Object,r)?r:{};const s=new n.X(t,r,{testMode:this?.testMode}).renderDocFrag();return(0,i.is)(String,s)?e.innerHTML=s:e.appendChild(s),e})(t):e}createElement(e="div"){return document.createElement(e)}addContent(e){const t=this.getProp("data");if(!0===(0,i.is)(String,t)){const r=document.createTextNode(t);e.appendChild(r)}return e}execute(){const e=(0,i.pipe)(this.createElement.bind(this),this.setElAttrs.bind(this),this.addTemplate.bind(this),this.addContent.bind(this))(this.getProp("tagName"));this.props.el=e}render(){return this.execute(),this.props.template=void 0,this.props.data=void 0,this.props.attributes=void 0,this.getProp("el")}renderToHTMLString(){return this.execute(),this.props.template=void 0,this.props.data=void 0,this.props.attributes=void 0,this.getProp("el").outerHTML}returnIfDefined(e,t){if(void 0!==t){const r=void 0===t;e[t]=!1===r?t:(0,o.$)(e[t],t)}}updateprops(e){return this.returnIfDefined(this.props,e),this}updatepropsAndRun(e){return this.updateprops(e),this.execute(),this.getProp("fragment")}unmount(){void 0!==this.props&&(this.getProp("el").remove(),this.props=void 0,this.gc())}updateTag(e="div"){this.updateprops(e)}updateAttributes(e={}){this.updateprops(e)}updateTemplate(e){this.updateprops(e)}updateData(e={}){this.updateprops(e)}addTagAndRender(e="div"){this.updatepropsAndRun(e)}addAttrsibutesAndRender(e={}){this.updatepropsAndRun(e)}addTemplateAndRender(e){this.updatepropsAndRun(e)}addDataAndRender(e={}){this.updatepropsAndRun(e)}addMixins(){const e=(0,s.z)();this.gc=e.gc.bind(this)}getDomAttributes(e){return(0,i.pick)(this.attributesArray,e)}get attributesArray(){return["accept","accept-charset","accesskey","action","align","allow","alt","async","autocapitalize","autocomplete","autofocus","autoplay","bgcolor","border","buffered","challenge","charset","checked","cite","class","code","codebase","color","cols","colspan","content","contenteditable","contextmenu","controls","coords","crossorigin","csp","dataset","datetime","decoding","default","defer","dir","dirname","disabled","download","draggable","dropzone","enctype","for","form","formaction","headers","height","hidden","high","href","hreflang","http-equiv","icon","id","importance","integrity","ismap","itemprop","keytype","kind","label","lang","language","lazyload","list","loop","low","manifest","max","maxlength","minlength","media","method","min","multiple","muted","name","novalidate","open","optimum","pattern","ping","placeholder","poster","preload","radiogroup","readonly","referrerpolicy","rel","required","reversed","rows","rowspan","sandbox","scope","scoped","selected","shape","size","sizes","slot","span","spellcheck","src","srcdoc","srclang","srcset","start","step","style","summary","tabindex","target","title","translate","type","usemap","value","width","wrap"]}}},992(e,t,r){r.d(t,{e:()=>d});var s=r(643),n=r(64),o=r(225),i=r(968),a=r(531),c=r(131);const l=!0===o.M.debug;class d{constructor(e,t){this.addMixins(),this.props=e,this.broadcastFn=t,this.broadcaster(this.broadcastFn)}addDblClickEvt(e){return(0,i.fromEvent)(e,"dblclick").pipe((0,a.map)(e=>{const t=(0,c.clone)(e);return t.typeOverRide="dblclick",t}))}broadcast(e){if(e.length<=0&&!0===l)return void console.warn(`Spyne Warning: The nested array in ${this.props.name}.broadcastEvents appears to be empty --\x3e vsid:${this.props.vsid}!`);const t={UI:this.sendUIPayload,ROUTE:this.sendRoutePayload},[r,s,o]=e;let a,d=this.props.el.querySelectorAll(r);if(d.length<=0){const e=this.props.el,t=t=>{t===e&&(d=[t])};(()=>{const s=(null!==e.parentElement?e.parentElement:document).querySelectorAll(r);s.forEach=Array.prototype.forEach,s.forEach(t)})()}const E=void 0!==o;!0==(void 0===d||d.length<=0)&&!0===l?console.warn(`Spyne Warning: The item ${r}, does not appear to exist in ${this.props.name} --\x3e vsid:${this.props.vsid}!`):(d.forEach=Array.prototype.forEach,d.forEach(e=>{const r="dblClick"!==s?(0,i.fromEvent)(e,s,{preventDefault:()=>!0}):this.addDblClickEvt(e);a=e.dataset.channel;const o={};var l;o.payload=(0,n.Lx)(e.dataset),o.payload=(0,c.omit)(["channel"],o.payload),o.channel=a,o.srcElement={},o.srcElement.id=this.props.id,o.srcElement.vsid=this.props.vsid,o.srcElement.isLocalEvent=E,o.srcElement.srcEvent=s,o.srcElement.el=e,(0,t[l=a,"ROUTE"===l||"CHANNEL_ROUTE"===l?"ROUTE":("UI"!==l&&"CHANNEL_UI"!==l&&void 0!==l&&console.warn(`SpyneJS warning: The channel, ${l}, is not allowed here, only "UI" or "ROUTE" are valid channels, defaulting to CHANNEL_UI`),"UI")])(r,o)}))}broadcaster(e){e().forEach(e=>this.broadcast(e))}addMixins(){const e=(0,s.N)();this.sendUIPayload=e.sendUIPayload,this.sendRoutePayload=e.sendRoutePayload}}},300(e,t,r){r.d(t,{q:()=>l});var s=r(192),n=r(393),o=r(518),i=r(907),a=r(968),c=r(131);class l{constructor(e,t={},r="",s="theName"){this.addMixins(),this._state="INIT",this.vsid=r,this.el=t.el,this.vsName=s,this.defaults={debug:!1,extendedHashMethods:{}},this.options=(0,i.$)(this.defaults,t),this.addActionListeners().forEach(e=>{const[t,r]=e;this.options.extendedHashMethods[t]=e=>this[r](e)}),this.options.hashMethods=this.setHashMethods(this.options.extendedHashMethods),this.sink$=e,this.sink$.subscribe(this.onObsSinkSubscribe.bind(this)),this.$dirs=o.j.createDirectionalFiltersObject(),this.addDefaultDir=o.j.addDefaultDir,this.sourceStreams=o.j.createDirectionalObservables(new a.Subject,this.vsName,this.vsid),this._source$=this.sourceStreams.toInternal$}addActionListeners(){return[]}setHashMethods(e={}){const t={VS_DETRITUS_COLLECT:e=>this.onGarbageCollect(e),READY_FOR_VS_DETRITUS_COLLECT:e=>this.onReadyForGC(e),EXTIRPATE:e=>this.onDispose(e),VS_SPAWN:e=>this.onRender(e),VS_SPAWN_AND_ATTACH_TO_PARENT:e=>this.onRenderAndAttachToParent(e),VS_SPAWN_AND_ATTACH_TO_DOM:e=>this.onRenderAndAttachToDom(e),ATTACH_CHILD_TO_SELF:e=>this.onAttachChildToSelf(e)};return(0,i.$)(t,e)}createDomItem(){this.props=void 0!==this.props?this.props:{};const e=(0,c.filter)(e=>void 0!==e,(0,c.pick)(["id","className"],this.props)),{tagName:t,data:r,template:n}=this.props;return new s.r(t,e,r,n)}onDisposeCompleted(e){}animateInTween(e,t){(0,n.W)(e,t)}animateOutTween(e,t,r){(0,n.d)(e,t,r)}setAnimateIn(e){if(!0===e.animateIn){const t=void 0!==e.el?e.el:this.domItem.el;this.animateInTween(t,e.animateInTime)}}disposeMethod(e){const t=void 0!==e.el.el?e.el.el:e.el,r={action:"READY_FOR_VS_DETRITUS_COLLECT",$dir:this.$dirs.PI,el:t},s=(0,a.bindCallback)((e,r)=>{this.animateOutTween(t,e.animateOutTime,r)}),n=e=>{this._source$.next(r)},o=!0===e.animateOut?e=>(s(e).subscribe(n),{action:"EXTIRPATING",$dir:this.$dirs.CI}):()=>({action:"EXTIRPATE_AND_READY_FOR_VS_DETRITUS_COLLECT",$dir:this.$dirs.CI});return o(e)}onDispose(e){return this.disposeMethod(e)}removeStream(){void 0!==this.sourceStreams&&this.sourceStreams.completeStream(["internal","child"])}onReadyForGC(e){this.removeStream()}onGarbageCollect(e){void 0!==this.domItem&&this.domItem.unmount(),void 0!==this.sourceStreams&&this.sourceStreams.completeStream(["parent"])}getSourceStream(){return this._source$}combineDomItems(e){if(void 0!==this.el)return;const t=(0,c.isNil)(e.query)?e.node:e.query;({appendChild:(e,t)=>e.appendChild(t),after:(e,t)=>e.after(t)}[e.attachType]||((e,t)=>e.insertBefore(t,e.firstChild)))(t,this.domItem.render()),this.setAnimateIn(e)}onAttachChildToSelf(e){const t=e.childRenderData;return this.combineDomItems(t),{action:"CHILD_ATTACHED",$dir:this.$dirs.PI}}onRenderAndAttachToParent(e){return this.onRender(e),this.combineDomItems(e),{action:"VS_SPAWNED_AND_ATTACHED_TO_PARENT",el:this.el||this.domItem.el,$dir:this.$dirs.PI}}renderDomItem(e){const[t,r,n,o]=e;return this.domItem=new s.r({tagName:t,attributes:r,data:n,template:o}),this.domItem}onRender(e){return{action:"VS_SPAWNED",el:this.el||(e=>this.renderDomItem(e))((0,c.props)(["tagName","domAttributes","data","template"],e)),$dir:this.$dirs.I}}extendedMethods(e){}onRenderAndAttachToDom(e){return e.attachData.el=(e=>this.renderDomItem(e))((0,c.props)(["tagName","domAttributes","data","template"],e)),this.combineDomItems(e.attachData),{action:"VS_SPAWNED_AND_ATTACHED_TO_DOM",el:this.el||e.attachData.el.el,$dir:this.$dirs.CI}}onObsSinkSubscribe(e){const t=e.action,r=(0,c.defaultTo)(e=>this.extendedMethods(e)),s=r(this.options.hashMethods[t])(e);void 0!==s&&(e=>{this._source$.next(e)})(Object.freeze(s))}addMixins(){}}},54(e,t,r){r.d(t,{u:()=>a});var s=r(225),n=r(961),o=r(158),i=r(131);class a{constructor(e,t,r,s="subscribe",n=!1){const o={name:e,observable:t,data:r,action:s};this.sendToDirectorStream(o)}sendToDirectorStream(e){const t=s.M.channelsMap.getStream("DISPATCHER"),r=(0,n.l)(e);t.next(r),e=void 0}static deepClone(e){const t=(0,i.is)(Array),r=(0,i.is)(Object);var s;return!1===t(s=e)&&!0===r(s)?(0,i.compose)(i.fromPairs,i.toPairs,i.clone)(e):(0,i.clone)(e)}static getMouseEventKeys(){return["altKey","bubbles","cancelBubble","cancelable","clientX","clientY","composed","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","isTrusted","layerX","layerY","metaKey","movementX","movementY","offsetX","offsetY","pageX","pageY","path","relatedTarget","returnValue","screenX","screenY","shiftKey","sourceCapabilities","srcElement","target","timeStamp","toElement","type","view","which","x","y"]}addMixins(){this.gc=o.gc}}},707(e,t,r){r.d(t,{T:()=>E});var s=r(131),n=r(225);function o(){return!0===n.M.debug}function i(e){return(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(e)}function a(e,t,r=!1){const n=l(e,t,r);return 1===n.length?(0,s.head)(n):n}function c(e,t,r){const n=document.querySelector(e),i=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));if(null===n||!1!==i(n)){if(void 0!==t&&String(t).trim().length>0){function a(e){try{return document.querySelectorAll(e).length>0}catch(e){return!1}}const c=a(t);!0===r&&!0===o()&&!1===c&&console.warn(`Spyne Warning: the selector, ${t} does not exist in this el, ${e}`)}}else console.warn(`Spyne Warning: the el object is not a valid single element, ${n}`)}function l(e,t,r=!1){let s=!1;const n=(r=>{let n=[];try{n=document.querySelectorAll(r)}catch(e){n=[]}try{s=document.querySelector(t)===document.querySelector(e),!0===s&&(n=[document.querySelector(t)])}catch(e){}return n})(void 0!==t?`${e} ${t}`:e);return!0===r&&c(!0===s?"body":e,t,r),n}function d(e,t,r){return l(t,r).forEach(t=>{t.style.cssText=e}),this}function E(e,t){function r(t){return E(e,t)}return c(e="string"==typeof e?e:function(e){let t=`${Math.random().toString(36).replace(/\d/gm,"").substring(1,8)}`;return void 0===e.dataset.vsid?e.dataset.vsid=t:t=e.dataset.vsid,`[data-vsid='${t}']`}(e),t,!1),r.map=r=>Array.from(l(e,t)).map(r),r.forEach=r=>Array.from(l(e,t)).map(r),r.getNodeListArray=()=>l(e,t),r.addClass=r=>(l(e,t).forEach(e=>e.classList.add(r)),this),r.removeClass=r=>(l(e,t).forEach(e=>{e.classList.remove(r)}),this),r.setClass=r=>(l(e,t).forEach(e=>{const t=(0,s.compose)((0,s.reject)(s.isEmpty),(0,s.split)(" "))(e.className),n=r.split(" ");t.forEach(t=>e.classList.remove(t)),n.forEach(t=>e.classList.add(t))}),this),r.unmount=()=>{},r.toggleClass=(r,s)=>(l(e,t).forEach(e=>{(s=void 0!==s?s:!e.classList.contains(r))?e.classList.add(r):e.classList.remove(r)}),this),r.toggle=(e,t)=>(r.toggleClass(e,t),this),r.appendChild=e=>(0!==r.el.length?r.el.appendChild(e):console.warn(`Spyne Warning: The selector, ${t} does not appear to be valid!`),r.el),r.addAnimClass=r=>{requestAnimationFrame(()=>{l(e,t).forEach(e=>{try{e.classList.add(r)}catch(e){}})})},r.setActiveItem2=(r,s)=>{const n=l(e,t),c="string"==typeof s?a(e,s):s;return!0===i(c)?n.forEach(e=>e.isEqualNode(c)?e.classList.add(r):e.classList.remove(r)):!0===o()&&console.warn(`Spyne Warning: The selector, ${s}, does not appear to be a valid item in setActiveItem: ${r}`),this},r.setActiveItem=(r,s)=>{const n=l(e,t),c="string"==typeof s?a(e,s):s;if(n.forEach(e=>e.classList.remove(r)),!0===i(c)){const e=Array.from(n).find(e=>e===c);e?e.classList.add(r):!0===o()&&console.warn(`Spyne Warning: The selector, ${s}, is valid but does not match any item in setActiveItem: ${r}`)}else!0===o()&&console.warn(`Spyne Warning: The selector, ${s}, does not appear to be a valid item in setActiveItem: ${r}`);return this},Object.defineProperty(r,"el",{get:()=>a(e,t,!0)}),Object.defineProperty(r,"els",{get:()=>l(e,t)}),Object.defineProperty(r,"len",{get:()=>l(e,t,!1).length}),Object.defineProperty(r,"exists",{get:()=>l(e,t,!1).length>=1}),Object.defineProperty(r,"exist",{get:()=>l(e,t,!1).length>=1}),Object.defineProperty(r,"nodeList",{get:()=>l(e,t)}),Object.defineProperty(r,"arr",{get:()=>{const r=a(e,t,!0);return void 0===r?[]:void 0===r.length?[r]:Array.from(r)}}),Object.defineProperty(r,"inline",{set:r=>d(r,e,t),get:()=>r}),Object.defineProperty(r,"inlineCss",{set:r=>d(r,e,t),get:()=>r}),r}},173(e,t,r){r.d(t,{A:()=>T});var s=r(445),n=r(225),o=r(907),i=r(961),a=r(64),c=r(300),l=r(584),d=r(992),E=r(54),p=r(589),h=r(518),N=r(707),u=r(968),m=r(531),_=r(131);class T{constructor(e={}){this.vsnum=Math.random(),this.addMixins(),this._postRenderCalled=!1,this.defaults=()=>{const t=this.createId(),r=e.id?e.id:t;return{vsid:t,id:r,tagName:"div",el:void 0,data:void 0,animateIn:!1,animateInTime:.5,animateOut:!1,animateOutTime:.5,sendLifecyleEvents:!1,hashId:`#${r}`,id$:`#${r}`,viewClass:c.q,extendedSourcesHashMethods:{},debug:!1,template:void 0,node:document.createDocumentFragment(),name:(0,a.OZ)(this)}},this._state={},this.$dirs=h.j.createDirectionalFiltersObject(),this.addDefaultDirection=h.j.addDefaultDir,this.addDownInternalDir=h.j.addDownInternalDir,this.props=(0,o.$)(this.defaults(),e),this.sendLifecycleMethod=!0===this.props.sendLifecyleEvents?this.sendLifecycleMethodActive.bind(this):this.sendLifecycleMethodInactive.bind(this);const t=this.attributesArray;this.props.domAttributes=(0,_.pick)(t,this.props),void 0!==this.props.traits&&this.addTraits(this.props.traits),this.loadAllMethods(),this.props.action="LOADED",this.sink$=new u.Subject,this.props.elIsAlreadyRenderedBool=this.elAlreadyExistsFn(this.props);const r=this.props.viewClass;this.view=new r(this.sink$,{el:this.props.el},this.props.vsid,this.props.id),this.sourceStreams=this.view.sourceStreams,this._rawSource$=this.view.getSourceStream(),this._rawSource$.viewName=this.props.name,this.sendEventsDownStream=this.sendEventsDownStreamFn,this.initViewStream(),this.isDevMode=T.isDevMode(),this.props.addedChannels=[],this.checkIfElementAlreadyExists()}get source$(){return this._source$}get attributesArray(){return["accesskey","class","contenteditable","dir","draggable","hidden","id","lang","spellcheck","style","tabindex","title","translate","aria-autocomplete","aria-checked","aria-disabled","aria-expanded","aria-haspopup","aria-hidden","aria-invalid","aria-label","aria-level","aria-multiline","aria-multiselectable","aria-orientation","aria-pressed","aria-readonly","aria-required","aria-selected","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","aria-atomic","aria-busy","aria-live","aria-relevant","aria-dropeffect","aria-grabbed","aria-activedescendant","aria-controls","aria-describedby","aria-flowto","aria-labelledby","aria-owns","aria-posinset","aria-setsize","accept","autocomplete","autofocus","checked","dirname","disabled","form","formaction","formenctype","formmethod","formnovalidate","formtarget","list","max","maxlength","min","minlength","multiple","name","pattern","placeholder","readonly","required","size","step","value","alt","srcset","sizes","usemap","ismap","href","target","download","ping","rel","hreflang","as","media","accept-charset","action","enctype","novalidate","content","charset","http-equiv","async","defer","integrity","nomodule","nonce","referrerpolicy","autocapitalize","autoplay","buffered","challenge","cite","code","codebase","color","cols","colspan","contextmenu","controls","coords","crossorigin","csp","dataset","datetime","decoding","default","for","headers","high","icon","importance","itemprop","keytype","kind","label","language","lazyload","loop","low","manifest","method","muted","open","optimum","poster","preload","radiogroup","reversed","role","rows","rowspan","sandbox","scope","scoped","selected","shape","slot","span","srcdoc","src","type","srclang","start","summary","wrap","width","height"]}static isDevMode(){return n.M.debug}static checkIfActionsAreRegistered(e=[],t){if(t.length>0){const r=t=>{const r=new RegExp(t);if((0,_.findIndex)((0,_.test)(r),s)<0){const r=1===e.length?"from added channel":"from added channels";console.warn(`Spyne Warning: The action, ${t}, in ${this.props.name}, does not match any of the registered actions ${r}, ${e.join(", ")}`)}},s=(e=>{const t=e.map(e=>n.M.getChannelActions(e));return(0,_.flatten)(t)})(e);t.forEach(r)}}static isValidNestedArr(e){const t=(0,_.equals)(!0),r=(0,_.all)(t),s=(0,_.is)(String),n=(0,_.compose)(r,(0,_.map)(s),(0,_.slice)(0,2),(0,_.defaultTo)([]));return(0,_.compose)(r,(0,_.map)(n),(0,_.defaultTo)([]))(e)}static elIsDomElement(e){return(0,_.is)(String,e)&&(e=document.querySelector(e)),(0,_.compose)((0,_.lte)(0),(0,_.defaultTo)(-1),(0,_.prop)("nodeType"))(e)}updatePropsToMatchEl(){const e=(0,_.compose)(_.toLower,(0,_.either)((0,_.prop)("tagName"),(0,_.always)("")));this.props.tagName=e(this.props.el)}elAlreadyExistsFn(e){const t=(0,_.compose)((0,_.lte)(0),(0,_.defaultTo)(-1),(0,_.prop)("nodeType"));return(0,_.propSatisfies)((0,_.allPass)([e=>document.body.contains(e),t]),"el")(e)}checkIfElementAlreadyExists(){!0===this.props.elIsAlreadyRenderedBool?(this.updatePropsToMatchEl(),this.postRender()):null===this.props.el&&console.error(`Spyne Error: The defined element for this ViewStream instance, ${this.constructor.name}, appears to not exist.`)}loadAllMethods(){const e=(0,_.curry)(this.onChannelMethodCall.bind(this));this.addActionListeners().forEach(t=>{let[r,s,n]=t;(0,_.is)(String,n)&&(n=new p.C({selector:n})),this.props.extendedSourcesHashMethods[r]=e(s,n)}),this.props.hashSourceMethods=this.setSourceHashMethods(this.props.extendedSourcesHashMethods)}addActionListeners(){return[]}onChannelMethodCall(e,t,r){if(void 0!==r.$dir&&r.$dir.includes("child")&&!0!==this.deleted){const e=(0,o.$)({},r);e.$dir=this.$dirs.C,this.sourceStreams.raw$.next(e)}!0===(0,_.defaultTo)((0,_.always)(!0),t)(r)&&(t=>{void 0===this[e]?console.warn(`Spyne Warning: The method, ${e} does not appear to exist in ${this.constructor.name}!`):this[e](t)})(r=(0,_.omit)(["$dir"],r))}setSourceHashMethods(e={}){const t={EXTIRPATING:e=>this.checkParentDispose(e),EXTIRPATE:e=>this.disposeViewStream(e),VS_SPAWNED:e=>this.onVSRendered(e),VS_SPAWNED_AND_ATTACHED_TO_DOM:e=>this.onVSRendered(e),VS_SPAWNED_AND_ATTACHED_TO_PARENT:e=>this.onVSRendered(e),READY_FOR_VS_DETRITUS_COLLECT:e=>this.onReadyToGC(e),VS_NULLITY:()=>({})};return o.$.all([{},t,e])}initViewStream(){this._source$=this._rawSource$.pipe((0,m.map)(e=>this.onMapViewSource(e)),(0,m.takeWhile)(this.notGCSTATE)),this.initAutoMergeSourceStreams(),this.updateSourceSubscription(this._source$,!0)}notGCSTATE(e){return!e.action.includes("READY_FOR_VS_DETRITUS_COLLECT")}eqGCSTATE(e){return!e.action.includes("READY_FOR_VS_DETRITUS_COLLECT")}notCOMPLETED(e){return!e.action.includes("COMPLETED")}notGCCOMPLETE(e){return!e.action.includes("GC_COMPLETE")}testVal(e){console.log("TESTING VALL IS ",e)}addParentStream(e,t){this.parent$=e.pipe((0,m.filter)(e=>void 0!==e&&void 0!==e.action),(0,m.map)(e=>{const t=(0,o.$)({},e);return"EXTIRPATE_AND_READY_FOR_VS_DETRITUS_COLLECT"===t.action&&(this.disposeViewStream(t),t.action="READY_FOR_VS_DETRITUS_COLLECT"),t})),this.updateSourceSubscription(this.parent$,!1,"PARENT"),this.renderAndAttachToParent(t)}addChildStream(e){const t=e.pipe((0,m.filter)(e=>void 0!==e&&void 0!==e.action),(0,m.tap)(e=>this.tracer("addChildStraem do ",e)),(0,m.map)(e=>e),(0,m.finalize)(e=>this.onChildCompleted(t.source)));this.updateSourceSubscription(t,!0,"CHILD")}onChildDisposed(e){}onChildCompleted(e){const t=(e=>{const t=e=>{for(;void 0!==e.destination;)e=t(e.destination);return e};return(0,_.pick)(["id","vsid"],t(e))})(e);return this.tracer("onChildCompleted ",this.vsnum,e),this.onChildDisposed(t,e),t}initAutoMergeSourceStreams(){const e={next:this.onSubscribeToSourcesNext.bind(this),error:this.onSubscribeToSourcesError.bind(this),complete:this.onSubscribeToSourcesComplete.bind(this)},t=()=>{this.props.el$=void 0,this.uberSource$.complete(),this.autoSubscriber$.complete(),this.sink$.complete(),this.props=void 0,this.deleted=!0,this.tracer("completeAll",this.deleted,this.props)},r=()=>{s-=1,0===s&&t()};let s=0;this.uberSource$=new u.Subject,this.autoMergeSubject$=this.uberSource$.pipe((0,m.mergeMap)(e=>{const t=e.observable.pipe((0,m.filter)(e=>void 0!==e&&void 0!==e.action),(0,m.map)(e=>{const t=(0,o.$)({},e);return t.action=e.action,this.tracer("autoMergeSubject$",t),t}));return!1===e.autoClosesBool?t:(s+=1,t.pipe((0,m.finalize)(r)))})),this.autoSubscriber$=this.autoMergeSubject$.pipe((0,m.filter)(e=>void 0!==e&&void 0!==e.action)).subscribe(e)}updateSourceSubscription(e,t=!1,r){const s={observable:e,autoClosesBool:t,rel:r};this.tracer("updateSourceSubscription ",this.vsnum,s),this.uberSource$.next(s)}onSubscribeToSourcesNext(e={}){const t=(0,_.defaultTo)(e=>this.sendExtendedStreams(e)),r=(0,a.FZ)(this.props.hashSourceMethods,e.action);t(this.props.hashSourceMethods[r])(e),this.tracer("onSubscribeToSourcesNext",{payload:e})}onSubscribeToSourcesError(e=""){console.log("ALL ERROR ",this.constructor.name,e)}onSubscribeToSourcesComplete(){this.tracer("onSubscribeToSourcesComplete","VS_DETRITUS_COLLECT"),this.openSpigot("VS_DETRITUS_COLLECT")}sendExtendedStreams(e){this.tracer("sendExtendedStreams",e),this.openSpigot(e.action,e)}renderAndAttachToParent(e){this.openSpigot("VS_SPAWN_AND_ATTACH_TO_PARENT",e)}renderView(){this.openSpigot("VS_SPAWN")}renderViewAndAttachToDom(e,t,r){const s={node:e,type:t,attachType:r};this.openSpigot("VS_SPAWN_AND_ATTACH_TO_DOM",{attachData:s})}checkParentDispose(e){"parent"===e.from$&&this.disposeViewStream(e)}onBeforeDispose(){}setTimeout(e,t=0,r=!1){window.setTimeout((...t)=>{if(void 0!==this&&void 0!==this.props){const s=!0===r?e.bind(this):e;(0,_.apply)(s,t)}},t)}disposeViewStream(e){this.onBeforeDispose(),this.openSpigot("EXTIRPATE")}onChildDispose(e){}onParentDisposing(e){this.openSpigot("EXTIRPATE")}onReadyToGC(e){const t=void 0!==e.from$&&"internal"===e.from$;this.tracer("onReadyToGC",t,e)}openSpigot(e,t={}){if(void 0!==this.props){this.props.action=e;const r=(0,_.mergeRight)(this.props,t);this.sink$.next(Object.freeze(r))}}setAttachData(e,t){return{node:this.props.el,type:"ViewStreamObservable",attachType:e,query:(()=>{const e=this.props.el.querySelector(t);return!0===T.isDevMode()&&(0,_.is)(String,t)&&(0,_.isNil)(e)&&console.warn(`Spyne Warning: The appendView query in ${this.props.name}, '${t}', appears to not exist!`),e})()}}getParentEls(e,t){const r=e=>e.parentElement;let s=0,n=e;for(;s<t;)n=r(n),s++;return n}setAttachParentData(e,t,r){t=""!==t?t:void 0;const s=this.getParentEls(this.props.el,r);return{node:s,type:"ViewStreamObservable",attachType:e,query:s.querySelector(t)}}onMapViewSource(e={}){return this.props=(0,_.mergeRight)(this.props,e),e}exchangeViewsWithChild(e,t){this.addChildStream(e.sourceStreams.toParent$),e.addParentStream(this.sourceStreams.toChild$,t)}appendToDom(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be appendedToDom. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","appendChild")}appendToDomAfter(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be appendedToDomAfter. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","after")}prependToDom(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be prependedToDom. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","prependChild")}appendView(e,t){this.exchangeViewsWithChild(e,this.setAttachData("appendChild",t))}appendViewAfter(e,t){this.exchangeViewsWithChild(e,this.setAttachData("after",t))}appendViewToParentEl(e,t,r=1){this.exchangeViewsWithChild(e,this.setAttachParentData("appendChild",t,r))}prependViewToParentEl(e,t,r=1){this.exchangeViewsWithChild(e,this.setAttachParentData("prependChild",t,r))}prependView(e,t){this.exchangeViewsWithChild(e,this.setAttachData("prependChild",t))}appendToNull(){const e=document.getElementById("spyne-null-views");this.renderViewAndAttachToDom(e,"dom","appendChild")}onVSRendered(e){"internal"===e.from$&&this.postRender()}postRender(){if(!0!==this._postRenderedCalled){if(this.beforeAfterRender(),this.afterRender(),this.onRendered(),requestAnimationFrame(()=>this.onAnimFrameAfterRendered()),!0===this.isDevMode){const e=this.broadcastEvents();!1===T.isValidNestedArr(e)&&console.warn(`Spyne Warning: The array returned from broadcastEvents in ${this.props.name}, '${JSON.stringify(e)}', does not appear to be properly formatted!`)}this.initializeChannels(),this.viewsStreamBroadcaster=new d.e(this.props,this.broadcastEvents.bind(this)),this.afterBroadcastEvents(),this._postRenderedCalled=!0}}addTraits(e){"Array"!==e.constructor.name&&(e=[e]),e.forEach(e=>{new e(this)})}afterBroadcastEvents(){if(!0===this.isDevMode){const e=e=>e[0],t=this.addActionListeners(),r=t.map(e);if(!1===T.isValidNestedArr(t))console.warn(`Spyne Warning: The array returned from addActionsListeners in ${this.props.name}, '${JSON.stringify(t)}', does not appear to be properly formatted!`);else{const e=e=>{const t=(0,_.defaultTo)("",e[1]);!1===(0,_.is)(Function,this[t])&&console.warn(`Spyne Warning: The method in addActionListeners nested Array, '${JSON.stringify(e)}', in ${this.props.name}, does not appear to exist!`)};(0,_.compose)((0,_.forEach)(e),(0,_.defaultTo)([]))(t)}const s=()=>{void 0!==(0,_.path)(["props","addedChannels"],this)&&T.checkIfActionsAreRegistered.bind(this)(this.props.addedChannels,r)};this.setTimeout(s,500)}}setDataVSID(){this.props.el.dataset.vsid=this.props.vsid}beforeAfterRender(){this.setDataVSID(),this.props.el$=(0,N.T)(this.props.el)}downStream(){}onRendered(){}onAnimFrameAfterRendered(){}afterRender(){}broadcastEvents(){return[]}getChannel(e){return(0,_.ifElse)(e=>(0,l.ns)().includes(e),e=>n.M.channelsMap.getStream(e).observer.pipe((0,m.takeWhile)(e=>!0!==this.deleted)),e=>console.warn(`channel name ${e} is not within ${l.ns}`))(e)}initializeChannels(){Array.isArray(this?.props?.channels)?this?.props?.channels?.forEach(e=>{const[t,r=!1]=Array.isArray(e)?e:[e];this?.addChannel(t,r)}):Array.isArray(this?.props?.channel)&&console.warn("props.channel is not a ViewStream property. Do you mean props.channels?")}addChannel(e,t=!1,r=!1,s=!1){const n=!0===r?this.$dirs.CI:this.$dirs.I;if(!0===this?.props?.addedChannels?.includes(e))return;const o=(0,_.path)(["srcElement","isLocalEvent"]),i=(0,_.path)(["srcElement","vsid"]),a=[(0,m.map)(e=>{const t=e;return t.$dir=n,t}),(0,m.filter)(e=>{const t=i(e);return!0!==o(e)||t===this.props.vsid})];!0===t&&a.unshift((0,m.skip)(1));const c=this.getChannel(e).pipe(...a);this.updateSourceSubscription(c,!1),this.props.addedChannels.push(e)}checkIfChannelExists(e){const t=n.M.channelsMap.testStream(e);return!0!==t&&console.warn(`SPYNE WARNING: The ChannelPayload from ${this.props.name}, has been sent to a channel, ${e}, that has not been registered!`),t}sendInfoToChannel(e,t={},r){const s=t,n=(0,_.defaultTo)("VIEWSTREAM_EVENT"),o=(0,_.compose)(n,(0,_.prop)(e)),a={payload:s,action:r=r||o({CHANNEL_ROUTE:"CHANNEL_ROUTE_CHANGE_EVENT"})};try{if(a.srcElement=(0,_.compose)((0,_.pick)(["id","vsid","class","tagName"]),(0,_.prop)("props"))(this),!0===this.checkIfChannelExists(e)){!1===/CHANNEL_LIFECYCLE/.test(r)&&Object.defineProperties(a,{payload:{get:()=>(0,i.l)(t)}});const s=(0,u.of)(a);return new E.u(e,s,a)}}catch(e){console.warn("SPYNE WARNING ",e)}}tracer(...e){this.sendLifecycleMethod(...e)}sendLifecycleMethodInactive(){}sendLifecycleMethodActive(e,t){const r="VS_DETRITUS_COLLECT"===t;!0===(0,_.where)({from$:(0,_.equals)("internal"),action:(0,_.equals)("VS_SPAWNED_AND_ATTACHED_TO_PARENT")},t)?this.sendInfoToChannel("CHANNEL_LIFECYCLE",{action:"CHANNEL_LIFECYCLE_RENDERED_EVENT"},"CHANNEL_LIFECYCLE_RENDERED_EVENT"):!0===r&&this.sendInfoToChannel("CHANNEL_LIFECYCLE",{action:"CHANNEL_LIFECYCLE_DISPOSED_EVENT"},"CHANNEL_LIFECYCLE_DISPOSED_EVENT")}createActionFilter(e,t){return new p.C(e,t)}isLocalEvent(e){const t=(0,_.path)(["srcElement","el"],e),r=(0,_.path)(["props","el"],this);return T.elIsDomElement(r)&&T.elIsDomElement(t)&&r.contains(t)}addMixins(){const e=(0,s.z)();this.createId=e.createId}}},636(e){e.exports=r},131(e){e.exports=t},968(t){t.exports=e},531(e){e.exports=s}},o={};function i(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={exports:{}};return n[e](r,r.exports,i),r.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};i.r(a),i.d(a,{Channel:()=>_.c,ChannelFetch:()=>T.e,ChannelFetchUtil:()=>A.G,ChannelPayload:()=>C.m,ChannelPayloadFilter:()=>g.C,ChannelsMap:()=>c.H,DomElement:()=>l.r,DomElementTemplate:()=>d.X,SpyneApp:()=>L.D,SpyneAppProperties:()=>y.M,SpynePlugin:()=>I.V,SpyneTrait:()=>u.g,ViewStream:()=>h.A,ViewStreamBroadcaster:()=>N.e,ViewStreamElement:()=>E.q,ViewStreamPayload:()=>m.u,ViewStreamSelector:()=>p.T,deepMerge:()=>S.$,safeClone:()=>f.l,sanitizeData:()=>O.Ay,sanitizeEventTarget:()=>O.v8});var c=i(470),l=i(192),d=i(291),E=i(300),p=i(707),h=i(173),N=i(992),u=i(732),m=i(54),_=i(2),T=i(126),A=i(9),C=i(980),g=i(589),I=i(930),S=i(907),f=i(961),y=i(225),L=i(713),O=i(672);return a})());
|
|
3
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3B5bmUudW1kLmpzIiwibWFwcGluZ3MiOiI7Q0FBQSxTQUEyQ0EsRUFBTUMsR0FDMUIsaUJBQVpDLFNBQTBDLGlCQUFYQyxPQUN4Q0EsT0FBT0QsUUFBVUQsRUFBUUcsUUFBUSxRQUFTQSxRQUFRLFNBQVVBLFFBQVEsYUFBY0EsUUFBUSxRQUFtQixXQUNwRixtQkFBWEMsUUFBeUJBLE9BQU9DLElBQzlDRCxPQUFPLFFBQVMsQ0FBQyxPQUFRLFFBQVMsWUFBYSxrQkFBbUJKLEdBQ3hDLGlCQUFaQyxRQUNkQSxRQUFlLE1BQUlELEVBQVFHLFFBQVEsUUFBU0EsUUFBUSxTQUFVQSxRQUFRLGFBQWNBLFFBQVEsUUFBbUIsV0FFL0dKLEVBQVksTUFBSUMsRUFBUUQsRUFBVyxLQUFHQSxFQUFRLEVBQUdBLEVBQWdCLFVBQUdBLEVBQVcsS0FBYSxVQUM3RixDQVRELENBU0dPLEtBQU0sQ0FBQ0MsRUFBa0NDLEVBQWtDQyxFQUFrQ0MsSSxpRkNMekcsTUFBTUMsVUFBcUIsSUE0Q2hDLFdBQUFDLENBQVlDLEVBQU1DLEVBQVEsQ0FBQyxHQUd6QkgsRUFBYUksa0JBQWtCRCxFQUFPRCxRQUVwQkcsSUFBZEYsRUFBTUcsTUFDUkgsRUFBTUksTUFBUUosRUFBTUcsS0FFdEJILEVBQU1LLG1CQUFxQixDQUN6QixHQUFHTixtQkFDSCxDQUFDLEdBQUdBLGtCQUFzQixrQkFFNUJDLEVBQU1NLG1CQUFvQixFQUMxQkMsTUFBTVIsRUFBTUMsRUFDZCxDQUVBLHdCQUFPQyxDQUFrQkQsRUFBT0QsRUFBTVMsR0FBVyxHQUMvQyxNQUVNQyxHQUF5QixJQUFBQyxRQUFPLEVBQUFDLE1BRGhCQyxHQUF3QixtQkFBVixHQUU5QkMsR0FBYyxJQUFBQyxLQUFJTCxHQUNsQk0sR0FBOEIsSUFBQUMsU0FBUSxDQUFDSCxFQUoxQkksR0FBT0EsRUFBSUMsUUFBVSxJQU94QyxRQUYyQixJQUFBQyxTQUFRSixFQUE2QixFQUFBSyxRQUFRLElBQUFDLE1BQUssQ0FBQyxNQUFPLFVBQTFELENBQXFFckIsTUFHN0UsSUFBYlEsR0FDRmMsUUFBUUMsS0FBSyxtREFBbUR4Qiw2QkFFM0QsRUFJWCxDQUVBLFlBQUF5QixDQUFheEIsRUFBUXlCLEtBQUt6QixRQUNILElBQWpCQSxHQUFPMEIsT0FDVEQsS0FBS0UsWUFFVCxDQUVBLG9CQUFBQyxDQUFxQjdCLEdBQ25CLE1BTU04QixHQUFjLElBQUFWLFVBQVEsSUFBQVcsV0FBVSxLQUFLLElBQUFDLE1BQUssQ0FBQyxRQUFTLHdCQUMxRCxNQVBZLENBQ1YseUJBQ0EsQ0FBQyxnQ0FBaUMsaUJBQ2xDLENBQUMsOEJBQStCLGtCQUl2QkMsT0FBT0gsRUFBWUosTUFDaEMsQ0FFQSxVQUFBRSxDQUFXTSxFQUFVLENBQUMsRUFBR0MsRUFBYVQsS0FBS1UsZ0JBQWdCQyxLQUFLWCxPQUM5RCxNQUFNWSxFQUFhWixLQUFLYSx5QkFBeUJMLEdBQ2pELE9BQU8sSUFBSSxJQUFpQkksRUFBWUgsR0FBWSxFQUFPVCxLQUFLekIsTUFBTUQsS0FDeEUsQ0FFQSxhQUFBd0MsQ0FBY0MsR0FDWixNQUFNQyxFQUFlaEIsS0FBS2lCLGlCQUFpQkYsR0FDM0NmLEtBQUtFLFdBQVdjLEVBQ2xCLENBRUEsZUFBQU4sQ0FBZ0JRLEdBQ2QsT0FBT2xCLEtBQUttQix5QkFBeUJELEVBQ3ZDLENBRUEsd0JBQUFDLENBQXlCQyxFQUFTQyxFQUFTLEdBQUdyQixLQUFLekIsTUFBTUQsdUJBQ3ZELE1BQU0sS0FBRUEsRUFBSSxrQkFBRU8sRUFBaUIsSUFBRXlDLEdBQVF0QixLQUFLekIsTUFDeENnRCxFQUFhLENBQUVqRCxPQUFNTyxvQkFBbUJ5QyxPQUM5Q3RCLEtBQUt3QixtQkFBbUJILEVBQVFELEVBQVNHLEVBQzNDLENBRUEsZ0JBQUFOLENBQWlCRixHQUNmLE1BQU1VLEdBQVUsSUFBQW5CLE1BQUssQ0FBQyxpQkFBa0IsV0FBWVMsR0FDcEQsT0FBTyxJQUFBbkIsTUFBSyxDQUFDLFFBQVMsTUFBTyxTQUFVLE9BQVEsT0FBUSxTQUFVLGVBQWdCLFNBQVU2QixFQUM3RixDQUVBLHdCQUFBWixDQUF5QkwsRUFBU2pDLEVBQVF5QixLQUFLekIsT0FDN0MsTUFBTXlDLEdBQWUsSUFBQXBCLE1BQUssQ0FBQyxRQUFTLE1BQU8sU0FBVSxPQUFRLE9BQVEsU0FBVSxlQUFnQixTQUFVckIsR0FFbkdtRCxHQUFxQixJQUFBQyxRQUFPLEVBQUF6QyxPQUNsQyxPQUFPLElBQUFRLFNBQVFnQyxFQUZNLENBQUNFLEVBQUlDLEtBQU8sSUFBQUMsZ0JBQWVGLEVBQUlDLEdBRTdDLENBQTBDYixFQUFjUixFQUNqRSxDQUVBLFlBQUl1QixHQUNGLE9BQU8vQixLQUFLZ0MsU0FDZCxFLDZEQ3JISyxNQUFNQyxFQXFCWCxXQUFBNUQsQ0FBWTZELEVBQWFiLEVBQVFELEVBQVNHLEVBQVlZLEVBQU9DLEdBQzNELE1BQU1DLEVBQVVILEVBR1pFLEdBQ0Z2QyxRQUFReUMsS0FBS0YsR0FHZixNQUFNRyxFQUF3QixDQUFFTCxjQUFhYixTQUFRRSxhQUFZWSxTQUUzREssRUFBZ0JQLEVBQWVRLFdBQVdyQixHQWVoRCxHQWRBbUIsRUFBc0JuQixRQUFVb0IsR0FjQyxJQUE3QixJQUFtQkUsTUFBZ0IsQ0FDckMsR0FBSUMsT0FBT0MsVUFBVUMsZUFBZUMsS0FBSzFCLEVBQVMsV0FBWSxDQUM1RCxNQUFNMkIsRUFBYUMsS0FBS0MsVUFBVTdCLEdBQ2xDdkIsUUFBUUMsS0FBSywrR0FBK0d1QixNQUFXMEIsSUFDekksQ0FFQSxNQUFNRyxFQUFvQixJQUFtQkMsa0JBQWtCZCxHQUUvREosRUFBZW1CLGVBQWUvQixFQUFRZ0IsRUFBU2EsRUFDakQsQ0FFQVgsRUFBc0JjLE1BQVEsS0FBTSxJQUFBQyxVQUFTLENBQzNDLENBQUVsQyxTQUFRLE9BQVVtQixFQUFzQm5CLFVBQzFDbUIsRUFBc0JuQixRQUN0QixDQUFFaUIsU0FBUyxJQUFBZ0IsT0FBTWhCLElBQ2pCLENBQUVGLE9BQU8sSUFBQWtCLE9BQU1sQixJQUNmLENBQUVaLGVBQ0YsSUFBQThCLE9BQU1kLEVBQXNCaEIsWUFBYSxDQUFFRixRQUFRLElBQUFnQyxPQUFNZCxFQUFzQmxCLFdBR2pGLE1BQU1rQyxFQUE2QixDQUNqQ0MsS0FBTSxDQUNKQyxJQUFLLElBQU1sQixFQUFzQm1CLEtBQ2pDQyxJQUFNeEUsSUFDSm9ELEVBQXNCbUIsS0FBT3ZFLEVBQ3RCQSxLQXVCYixNQWxCZ0Isa0JBQVprRCxJQUVGa0IsRUFBMkJLLFNBQVcsQ0FDcENILElBQUssSUFBTXhCLEVBQWU0QixvQkFROUJ0QixFQUFzQm1CLFVBQU9qRixFQUU3QmtFLE9BQU9tQixpQkFBaUJ2QixFQUF1QmdCLEdBRTNDbkIsR0FDRnZDLFFBQVFrRSxRQUFRM0IsR0FFWEcsQ0FDVCxDQUVBLHFCQUFPYSxDQUFlL0IsRUFBUWdCLEVBQVM3QyxHQUNyQyxNQUFNd0UsR0FBVSxJQUFBQyxVQUFTNUMsRUFBUTdCLEdBSWpDLE9BSGdCLElBQVp3RSxJQUF3RCxJQUFuQyxJQUFtQkUsYUFDMUNyRSxRQUFRQyxLQUFLLHFCQUFxQnVCLG1DQUF3Q2dCLGNBRXJFMkIsQ0FDVCxDQUVBLHNCQUFPSCxHQVdMLE9BQU8sSUFBQU0sU0FWbUIsQ0FDeEIsT0FDQSxTQUNBLFdBQ0EsT0FDQSxXQUNBLE9BQ0EsV0FDQSxTQUNBLFFBQ2dDQyxPQUFPUixTQUMzQyxDQUVBLG9CQUFPUyxHQUVQLENBRUEsZ0JBQU9DLENBQVVDLEdBQ2YsTUFBTUMsR0FBUSxJQUFBQyxJQUFHQyxPQUNYQyxHQUFRLElBQUFGLElBQUc5QixRQUNGaUMsTUFFZixPQUZtQyxJQUFkSixFQUFOSSxFQUNXTCxLQURnQyxJQUFkSSxFQUFNQyxJQUU5QixJQUFBbEYsU0FBUSxFQUFBbUYsVUFBVyxFQUFBQyxRQUFTLEVBQUF6QixNQUE1QixDQUFtQ2tCLElBQUssSUFBQWxCLE9BQU1rQixFQUNwRSxDQUVBLGlCQUFPOUIsQ0FBVzhCLEdBR2hCLE1BQU1RLEdBQWlCLElBQUFyRixVQUFRLElBQUFzRixLQUFJLElBQUksSUFBQTNFLFlBQVcsSUFBSSxJQUFBNEUsTUFBSyxhQUUzRCxJQUNFdEMsT0FBT3VDLE9BQU9YLEdBQ2Q1QixPQUFPd0Msb0JBQW9CWixHQUFHYSxRQUFRLFNBQVNILElBQ3pDdEMsT0FBT0MsVUFBVUMsZUFBZUMsS0FBS3lCLEVBQUdVLEtBQ1osSUFBNUJGLEVBQWVSLEVBQUVVLEtBQ0wsT0FBWlYsRUFBRVUsSUFDa0IsaUJBQVpWLEVBQUVVLElBQXlDLG1CQUFaVixFQUFFVSxJQUN4Q3RDLE9BQU8wQyxTQUFTZCxFQUFFVSxLQUNyQmhELEVBQWVRLFdBQVc4QixFQUFFVSxHQUVoQyxFQUNGLENBQUUsTUFBT0ssR0FFUCxPQUFPZixDQUNULENBRUEsT0FBT0EsQ0FDVCxDQUVBLHdCQUFPZ0IsR0FDTCxNQUFPLENBQUMsU0FBVSxVQUFXLGVBQWdCLGFBQWMsVUFBVyxVQUFXLFdBQVksVUFBVyxnQkFBaUIsbUJBQW9CLFNBQVUsYUFBYyxjQUFlLFlBQWEsU0FBVSxTQUFVLFVBQVcsWUFBYSxZQUFhLFVBQVcsVUFBVyxRQUFTLFFBQVMsT0FBUSxnQkFBaUIsY0FBZSxVQUFXLFVBQVcsV0FBWSxxQkFBc0IsYUFBYyxTQUFVLFlBQWEsWUFBYSxPQUFRLE9BQVEsUUFBUyxJQUFLLElBQ3BkLEUsNEVDdktLLE1BQU1DLFVBQXFCLElBYWhDLFdBQUFuSCxDQUFZQyxFQUFNQyxFQUFRLENBQUMsR0FDekJBLEVBQU1rSCxTQUFVLEVBQ2hCM0csTUFBTVIsRUFBTUMsR0FDWnlCLEtBQUt6QixNQUFRQSxFQUNieUIsS0FBSzBGLFNBQVcsSUFBSSxFQUFBQyxRQUNwQjNGLEtBQUs0RixXQUFhLElBQUksRUFBQUMsY0FBYyxHQUNwQzdGLEtBQUtnQyxXQUFZLElBQUE4RCxPQUFNOUYsS0FBSzBGLFNBQVUxRixLQUFLNEYsYUFFekIsSUFEQSxJQUFtQmxELE9BRW5DMUMsS0FBSytGLDJCQUEyQnpILEVBRXBDLENBRUEsZ0JBQUEwSCxDQUFpQkMsR0FBYSxHQUM1QixPQUFzQixJQUFmQSxFQUFzQmpHLEtBQUs0RixXQUFhNUYsS0FBSzBGLFFBQ3RELENBRUEsMEJBQUFLLENBQTJCN0QsR0FDekIsTUFBTTVELEVBQU80RCxHQVNiLFFBUHFCLE1BRU4sS0FEQSxJQUFBK0IsVUFBUzNGLEVBQU0sSUFBbUI0SCwyQkFFN0NyRyxRQUFRQyxLQUFLLCtCQUErQnhCLHdDQUl4QixJQUMxQixDQUVBLGlCQUFJNkgsR0FDRixPQUFPbkcsS0FBSzRGLFVBQ2QsQ0FFQSxXQUFJUSxHQUNGLE9BQU9wRyxLQUFLMEYsUUFDZCxFLCtGQzVCSyxNQUFNVyxFQTBDWCxXQUFBaEksQ0FBWWlJLEVBQWMvSCxFQUFRLENBQUMsR0FDakN5QixLQUFLRyxxQkFBcUJRLEtBQUtYLE1BQy9CQSxLQUFLdUcsd0JBQXdCRCxFQUFjL0gsRUFBTUssb0JBR2pETCxFQUFNRCxLQUFPZ0ksRUFDYi9ILEVBQU1pSSxvQkFBZ0MvSCxJQUFmRixFQUFNa0ksS0FBcUIsQ0FBQyxHQUFHbEksRUFBTUQsY0FBZ0IsR0FDNUUwQixLQUFLekIsTUFBUUEsRUFFYnlCLEtBQUt6QixNQUFNbUksY0FBZSxFQUMxQjFHLEtBQUt6QixNQUFNa0gsYUFDY2hILElBQXZCdUIsS0FBS3pCLE1BQU1rSCxTQUFnQ3pGLEtBQUt6QixNQUFNa0gsUUFHeEQsTUFBTWtCLE9BQStDbEksSUFBcEJ1QixLQUFLekIsTUFBTWtJLFVBSVgsSUFBdEJ6RyxLQUFLekIsTUFBTXFJLE9BQ3BCNUcsS0FBS3pCLE1BQU1NLGtCQUFvQm1CLEtBQUt6QixNQUFNcUksT0FFMUM1RyxLQUFLekIsTUFBTU0sdUJBQ3dCSixJQUFqQ3VCLEtBQUt6QixNQUFNTSxrQkFDUDhILEVBQ0EzRyxLQUFLekIsTUFBTU0sa0JBR25CbUIsS0FBSzZHLDBCQUE0QixJQUFJLElBQW9CN0csTUFDekRBLEtBQUs4Ryw2QkFHTDlHLEtBQUsrRyxrQkFBb0IsSUFBbUJDLFlBQzVDLE1BQU1oRixFQUFZaEMsS0FBS2lILGtCQUN2QmpILEtBQUtrSCwyQkFBNkJiLEVBQVFhLDJCQUEyQnZHLEtBQUtYLE1BQzFFQSxLQUFLZ0MsVUFBWWhDLEtBQUt6QixNQUFNd0QsU0FBV0MsRUFHdkMsTUFBTW1GLEVBQW9CbkgsS0FBSytHLGtCQUFrQkssVUFBVSxjQUNyREMsR0FBMkIsSUFBQUMsUUFBTy9JLEVBQU1ELEtBQU0sUUFDcEQ2SSxFQUNHSSxNQUFLLElBQUFDLFFBQU9ILElBQ1pJLFVBQVd0SSxHQUFRYSxLQUFLMEgscUJBQXFCdkksR0FDbEQsQ0FFQSxlQUFBOEgsR0FPRSxZQU4rQnhJLElBQTNCdUIsS0FBSytHLG1CQUNQbEgsUUFBUUMsS0FBSyx5Q0FBeUNFLEtBQUt6QixNQUFNRCxzRUFLL0MsSUFGQTBCLEtBQUsrRyxrQkFBa0JZLFdBQVczSCxLQUFLekIsTUFBTUQsTUFHeEQwQixLQUFLK0csa0JBQWtCYSxnQkFBZ0I1SCxLQUFLekIsTUFBTUQsS0FBTTBCLEtBQUt6QixNQUFNTSxvQkFFbEMsSUFBakNtQixLQUFLekIsTUFBTU0sa0JBQTZCLElBQUksRUFBQWdILGNBQWMsR0FBSyxJQUFJLEVBQUFGLE9BRTlFLENBT0Esb0JBQUFrQyxHQUVBLENBT0EsWUFBQTlILENBQWF4QixFQUFReUIsS0FBS3pCLE9BQ3hCLFFBQW1CRSxJQUFmRixFQUFNa0ksS0FBb0IsQ0FDNUIsTUFBTXBGLEVBQVNzQixPQUFPbUYsS0FBSzlILEtBQUsrSCxnQkFBZ0IsR0FHaEQvSCxLQUFLd0IsbUJBQW1CSCxFQUFROUMsRUFBTWtJLEtBQ3hDLENBQ0YsQ0FFQSxXQUFJaEIsR0FDRixPQUFPekYsS0FBS3pCLE1BQU1rSCxPQUNwQixDQUVBLGVBQUl2RCxHQUNGLE9BQU9sQyxLQUFLekIsTUFBTUQsSUFDcEIsQ0FPQSxZQUFJeUQsR0FDRixPQUFPL0IsS0FBS2dDLFNBQ2QsQ0FFQSxjQUFBZ0csUUFZNEJ2SixJQUF0QnVCLEtBQUt6QixNQUFNMEosUUFYRyxDQUFDQSxJQUNlLFVBQTVCQSxFQUFPNUosWUFBWUMsT0FDckIySixFQUFTLENBQUNBLElBTVpBLEVBQU83QyxRQUpXOEMsR0FDVCxJQUFJQSxFQUFXbEksUUFPeEJtSSxDQUFVbkksS0FBS3pCLE1BQU0wSixPQUV6QixDQUdBLGdCQUFBRyxHQUNFcEksS0FBS2dJLGlCQUNMaEksS0FBSzZILHVCQUNMN0gsS0FBS2tILDZCQUNMbEgsS0FBS0QsZUFDTEMsS0FBS3pCLE1BQU1tSSxjQUFlLENBQzVCLENBRUEsaUNBQU9RLENBQTJCM0ksRUFBUXlCLEtBQUt6QixNQUFPOEosRUFBYXJJLEtBQUsrSCxnQkFDdEUsTUFBTU8sR0FBb0IsSUFBQUMsU0FBUUYsR0FDNUJHLE9BQXNDL0osS0FBeEIsSUFBQXdHLE1BQUssT0FBUTFHLEdBb0JqQyxPQW5CcUQsSUFBdEIrSixJQUE4QyxJQUFoQkUsSUFVM0RqSyxFQUFNTSxtQkFBb0IsRUFDMUJ3SixFQVYyQixNQUMzQixNQUFNLEtBQUUvSixHQUFTQyxFQUNYa0ssRUFBWSxHQUFHbkssVUFDckIsTUFBTyxDQUNMLENBQUNtSyxHQUFhQSxJQU1IQyxRQUVlakssSUFBeEJ1QixLQUFLK0gsaUJBQ1AvSCxLQUFLK0gsZUFBaUJNLElBS25CLENBQUU5SixRQUFPOEosYUFDbEIsQ0FFQSxRQUFBTSxDQUFTQyxHQUNULENBRUEsdUJBQUFyQyxDQUF3QmpJLEVBQU1NLEVBQXFCLElBQ2pELE1BQU1pSyxHQUFlLElBQUFDLFNBQU8sSUFBQXJFLElBQUdzRSxRQUFTLEVBQUFDLFNBQVUsRUFBQUMsTUFDNUNDLEVBQVV0SyxFQUFtQjJCLE9BQU9QLEtBQUtHLHFCQUFxQjdCLElBQzlEa0IsR0FBTSxTQUFLcUosRUFBY0ssR0FFekJDLEdBQU0sSUFBQTdGLFdBQVMsSUFBQThGLE9BREhDLElBQU8sSUFBQUMsT0FBTUQsRUFBS0EsR0FDRTdKLElBQ3RDUSxLQUFLK0gsZUFBaUJvQixDQUN4QixDQUVBLDBCQUFBckMsR0FDRSxNQUNNK0IsR0FBZSxJQUFBQyxTQUFPLElBQUFyRSxJQUFHc0UsUUFBUyxFQUFBQyxTQUFVLEVBQUFDLE1BQzVDTSxFQUFzQyxDQUFDQyxFQUFXckssS0FNdERpRixPQUFPcUYsV0FMUyxLQUNpQixtQkFBcEJ6SixLQUFLd0osSUFDZDNKLFFBQVFDLEtBQUssSUFBSUUsS0FBS3pCLE1BQU1ELHdDQUF3Q2tMLGlCQUF5QnJLLEVBQUksT0FHMUUsTUFTdkJ1SyxHQUFnQixJQUFBWixTQUFPLElBQUFyRSxJQUFHc0UsU0FBUyxJQUFBWSxRQWpCdkIsb0JBV014SyxJQUN0QixNQUFNcUssR0FBWSxJQUFBSSxPQUFLLElBQUFDLFdBQVUsR0FBSTFLLEdBRXJDLE9BREFvSyxFQUFvQ0MsRUFBV3JLLEdBQ3hDcUssSUFXVHhKLEtBQUs4SixzQkFBdUIsSUFBQWpGLFlBQVUsU0FOcEIxRixHQUdULENBRkswSixFQUFhMUosR0FDVHVLLEVBQWF2SyxJQUl1QmEsS0FBS0csd0JBRzdELENBdUJBLG9CQUFBQSxHQUNFLElBQUlYLEVBQU0sR0FJVixPQUhJLElBQUFjLE1BQUssQ0FBQyxRQUFTLFFBQVNOLFFBQzFCUixFQUFNLENBQUMsR0FBR1EsS0FBS3pCLE1BQU1ELGVBRWhCa0IsQ0FDVCxDQUVBLG9CQUFBa0ksQ0FBcUJ5QixHQUNuQm5KLEtBQUsrSixxQkFBcUJaLEVBQzVCLENBRUEsNEJBQUFhLENBQTZCYixHQUMzQkEsRUFBSWMsVUFBVyxFQUNmLE1BQU1DLEVBQVlsSyxLQUFLbUssaUJBQWlCeEosS0FBS1gsTUFFdkN3SixHQUFZLElBQUFsSixNQUFLLENBQUMsT0FBUSxVQUFXNkksR0FDckNpQixHQUFZLElBQUFuRixNQUFLdUUsRUFBV3hKLEtBQUs4SixzQkFFdkMsSUFBSU8sRUFBS0gsRUFTVCxZQVBrQnpMLElBQWQyTCxHQUF5QyxxQkFBZEEsSUFFUixJQUQ2QixtQkFBckJwSyxLQUFLb0ssTUFFaENDLEVBQUtySyxLQUFLb0ssR0FBV3pKLEtBQUtYLE9BSXZCcUssQ0FDVCxDQUVBLG9CQUFBTixDQUFxQlosR0FDbkIsTUFBTW1CLEdBQVUsSUFBQUMsUUFBT3BCLEVBQUk3SyxLQUFNMEIsS0FBS3pCLE1BQU1ELE9BQ3RDLE9BQUUrQyxFQUFNLFFBQUVELEVBQU8sV0FBRUcsR0FBZTRILEVBQUkxQyxLQUd0Q2hGLEVBQVUrSSxJQUFVLENBQ3hCbkgsTUFBTyxLQUFNb0gsT0FGS0MsRUFFTXZCLEVBQUkxQyxNQUZKLElBQUFuRCxVQUFTLENBQUNvSCxFQUFHLENBQUVySixRQUFRLElBQUE0RCxNQUFLLFNBQVV5RixLQUFNLElBQUF6RixNQUFLLFVBQVd5RixJQUFJLElBQUF6RixNQUFLLGFBQWN5RixLQUExRixJQUFDQSxHQUdsQnJKLFNBQ0FELFVBQ0FHLGFBQ0FZLE1BQU9xSSxJQUtULE9BQW1CLElBQVpGLEVBSFcsQ0FBQ25CLEdBQVFBLEVBQUl3QixXQUFXcEQsTUFBSyxJQUFBN0ksS0FBSStDLElBQ2hEZ0csVUFBVXpILEtBQUtnSyw2QkFBNkJiLElBRXJCeUIsQ0FBVXpCLFFBQU8wQixDQUM3QyxDQXFCQSxnQkFBQVYsQ0FBaUJXLEdBQ2pCLENBNEJBLGtCQUFBdEosQ0FBbUJILEVBQVFELEVBQVNHLEVBQWEsQ0FBQyxFQUFHWSxFQUFRLENBQUMsRUFBRzRJLEVBQU8vSyxLQUFLZ0MsV0FHM0UsTUFBTWdKLEVBQXFCLElBQUksSUFBZWhMLEtBQUt6QixNQUFNRCxLQUFNK0MsRUFBUUQsRUFBU0csRUFBWVksR0FNNUY0SSxFQUFLRSxLQUFLRCxFQUNaLENBbUJBLFVBQUFFLENBQVdoSixFQUFhaUosR0FtQnRCLE9BRFcsSUFBQXJDLFFBakJZc0MsSUFBSyxVQUF3Qm5ILFNBQVNtSCxHQUdyQ0EsSUFDdEIsTUFBTUwsRUFBTy9LLEtBQUsrRyxrQkFBa0JLLFVBQVVnRSxHQUFHckosU0FPakQsT0FOSWdKLEVBQUtNLE9BQ1BOLEVBQUtNLE9BQU9uSixZQUFjQSxFQUUxQjZJLEVBQUs3SSxZQUFjQSxPQUdDekQsSUFBbEIwTSxFQUNLSixFQUFLeEQsTUFBSyxJQUFBQyxRQUFPMkQsSUFHbkJKLEdBZEtLLEdBQUt2TCxRQUFRQyxLQUN2QixnQkFBZ0JzTCxtQkFBbUIsUUFnQmhDZixDQUFHbkksRUFDWixDQU9BLGFBQUFvSixDQUFjQyxFQUFhQyxHQUFXLEdBRXBDLE1BQU1DLEVBQXFCRixFQUFZN00sSUFBSWdOLElBQ3pDLEdBQW9CLGlCQUFUQSxFQUFtQixDQUM1QixNQUFNQyxFQUFRM0wsS0FBS2tMLFdBQVdRLEdBQzlCLE9BQU9GLEVBQVdHLEVBQU1wRSxNQUFLLElBQUFxRSxNQUFLLElBQU1ELENBQzFDLENBQ0EsT0FBT0gsRUFBV0UsRUFBS25FLE1BQUssSUFBQXFFLE1BQUssSUFBTUYsSUFJekMsSUFBSUcsRUFDSixHQUFJTCxFQUNGSyxHQUFZLElBQUFDLFVBQVNMLFFBRXJCLEdBQWtDLElBQTlCQSxFQUFtQmhNLE9BQ3JCb00sRUFBWSxFQUFBRSxXQUNQLEdBQWtDLElBQTlCTixFQUFtQmhNLE9BQzVCb00sRUFBWUosRUFBbUIsT0FDMUIsQ0FDTCxNQUFPTyxLQUFXQyxHQUFTUixFQUMzQkksRUFBWUcsRUFBT3pFLE1BQUssSUFBQTJFLHNCQUFxQkQsR0FDL0MsQ0FLRixPQUFPSixFQUFVdEUsTUFDZixJQUFBN0ksS0FBSXlOLElBQ0YsTUFBTWhELEVBQU0sQ0FBQyxFQU9iLE9BTkFvQyxFQUFZbkcsUUFBUSxDQUFDc0csRUFBTVUsS0FDekIsTUFBTUMsRUFBMEIsaUJBQVRYLEVBQW9CQSxFQUFPLFdBQVdVLElBRzdEakQsRUFGY3VDLEdBQU1MLFFBQVFuSixhQUFld0osR0FBTUwsUUFBUUEsUUFBUW5KLGFBQzVDbUssR0FDVkYsRUFBV0MsS0FFakJqRCxJQUdiLENBRUEsMkJBQU9tRCxDQUFxQi9OLEVBQVEsQ0FBQyxJQUNWLElBQXJCQSxFQUFNZ08sWUFDUixJQUFtQkMsa0JBQWtCak8sRUFBTTJELFlBRS9DLEUsOERDM2RGLE1BQU11SyxFQUF3QixLQUFNLENBQ2xDeEksU0FBVyxLQUF5QyxJQUFuQyxJQUFtQkMsWUFBdUIsSUFBbUJnQyx5QkFBMkIsQ0FBQyxnQkFBaUIsYUFBYyxpQkFBa0IsZ0JBS3ZKd0csRUFBa0IsQ0FBQyxPQUFRLFNBQVUsUUFBUyxVQUFXLFVBQVcsa0JBQW1CLFVBQ3ZGQyxFQUE0QixDQUFDLFNBQVUsT0FBUSxRQUFTLFdBQVksUUFDcEVDLEVBQXdCLENBQUMsYUFBYyxrQkFBbUIsVUFBVyxXQUFZLGFBQWMsdUJBQy9GQyxFQUFvQixDQUFDLFlBQWEsaUJBS3hDLElBQUlDLEVBQWtCLEdBQVFDLEVBQXNCLEdBQVFDLEVBQWdCLEtBQ3hFQyxFQUF3QixLQUFRQyxFQUFrQixLQUFRQyxFQUF5QixLQUFRQyxFQUF3QixLQUNuSEMsRUFBbUIsS0FBUUMsRUFBZ0IsS0FFL0MsUUFBZ0I3TyxJQUFaLEVBQUFpQixjQUF3Q2pCLElBQWYsRUFBQThPLFdBQTBCLENBSXJEVCxFQUFrQixDQUNoQixDQUNFVSxNQUFPLHFDQUFxQ1osSUFDNUNhLFVBQVdyTSxHQUFXcUwsSUFBd0J4SSxTQUFTN0MsRUFBUTlDLE9BR2pFLENBQ0VrUCxNQUFPLHFEQUVQQyxVQUFXck0sUUFuQm9DM0MsSUFtQlAyQyxFQUFRdUosV0FuQmZsRCxXQXFCbkMsQ0FDRStGLE1BQU8sMkNBQ1BDLFVBQVdyTSxHQUFXeUwsRUFBa0I1SSxTQUFTN0MsRUFBUUMsVUFPN0QwTCxFQUFzQixDQUNwQixDQUNFUyxNQUFPLGtDQUNQQyxXQUFXLElBQUEvTixVQUFRLElBQUErRSxJQUFHc0UsU0FBUyxJQUFBekksTUFBSyxDQUFDLE9BQVEsYUFBYyxXQUU3RCxDQUNFa04sTUFBTywyQkFDUEMsV0FBVyxJQUFBL04sVUFBUSxJQUFBK0UsSUFBR3NFLFNBQ3BCLElBQUF6SSxNQUFLLENBQUMsT0FBUSxhQUFjLFVBT2xDME0sRUFBZ0IsV0FFZCxNQURzQixHQUNEek0sT0FBT3VNLEdBQWlCdk0sT0FBT3dNLEVBQ3RELEVBR0EsTUFBTVcsRUFBd0IsQ0FFNUIsQ0FDRUYsTUFBTyxxQ0FBcUNaLElBQzVDYSxVQUFXck0sR0FBV3FMLElBQXdCeEksU0FBUzdDLEVBQVE5QyxPQUdqRSxDQUNFa1AsTUFBTyw0Q0FBNENkLElBQ25EZSxVQUFXck0sR0FBV3NMLEVBQWdCekksU0FBUzdDLEVBQVF1TSxPQUV6RCxDQUNFSCxNQUFPLHVDQUF1Q2IsSUFDOUNjLFVBQVdyTSxHQUFXdUwsRUFBMEIxSSxTQUFTN0MsRUFBUXdNLE9BR25FLENBQ0VKLE1BQU8sNEJBQ1BDLFVBQVdyTSxRQUE4QjNDLElBQW5CMkMsRUFBUXlNLFNBSWxDWCxFQUFrQixXQUVoQixNQUR3QixHQUNEM00sT0FBT21OLEVBQ2hDLEVBRUFQLEVBQXlCLFdBUXZCLE1BUDhCLENBQzVCLENBQ0VLLE1BQU8sK0RBQ1BDLFVBQVdyTSxHQUE0QixZQUFqQkEsRUFBUXVNLFdBQ0lsUCxJQUE5QjJDLEVBQVFxRixLQUFLcUgsZUFHUXZOLE9BQU9tTixFQUN0QyxFQUVBTixFQUF3QixXQVF0QixNQVA4QixDQUM1QixDQUNFSSxNQUFPLHNDQUNQQyxVQUFXck0sR0FBNEIsV0FBakJBLEVBQVF1TSxXQUMxQmxQLElBRCtDMkMsRUFBUXFGLE9BSWxDbEcsT0FBT21OLEVBQ3RDLEVBSUFULEVBQXdCLFdBQ3RCLE9BQU9TLEVBQXNCbk4sT0FBT3VNLEdBQ2pDdk0sT0FBT3dNLEVBQ1osRUFJQU0sRUFBbUIsV0FZakIsTUFYeUIsR0FXRDlNLE9BQU91TSxHQUFpQnZNLE9BQU93TSxFQUN6RCxFQU9BTyxFQUFnQixXQUNkLE1BQU1TLEVBQW9CLENBQ3hCLENBQ0VQLE1BQU8sNENBQ1BDLFVBQVdyTSxHQUFXcUwsSUFBd0J4SSxTQUFTN0MsRUFBUTlDLE9BRWpFLENBQ0VrUCxNQUFPLHFEQUNQQyxVQUFXck0sR0FBV3dMLEVBQXNCM0ksVUFDMUMrSixFQUFVNU0sRUFBUXVKLGNBNUlLdE0sWUFBWUMsT0E4SXZDLENBQ0VrUCxNQUFPLDJDQUNQQyxVQUFXck0sR0FBV3lMLEVBQWtCNUksU0FBUzdDLEVBQVFDLFVBSzdELE1BQU8sQ0FDTDRNLFFBQVMsQ0FDUCxDQUNFQyxLQUFNLENBQ0o1UCxLQUFNLGFBQ05xTSxXQUFZLElBQU0sSUFBSSxFQUFBaEYsUUFDdEJ0RSxPQUFRLGFBRVY4TSxVQUFXLENBQ1RQLEtBQU03RSxPQUNONEIsV0FBWSxFQUFBNEMsWUFBYyxFQUFBNUgsUUFDMUJ0RSxPQUFRMEgsUUFFVnFGLFlBQWFMLEdBRWYsQ0FDRUcsS0FBTSxDQUNKNVAsS0FBTSxNQUNOcU0sV0FBWSxJQUFNLElBQUksRUFBQWhGLFFBQ3RCdEUsT0FBUSxhQUVWOE0sVUFBVyxDQUNUUCxLQUFNN0UsT0FDTjRCLFdBQVksRUFBQTRDLFlBQWMsRUFBQTVILFFBQzFCdEUsT0FBUTBILFFBRVZxRixZQUFhTCxJQUlyQixDQUNGLEMsd0dDekxBLE1BQU1NLEVBQU8sSUFBSUMsSUFFVixNQUFNQyxFQVlYLFdBQUFsUSxHQUNFMkIsS0FBS3dPLFlBQ0xILEVBQUsxSyxJQUFJLGFBQWMsSUFBSSxFQUFBZ0MsU0FDM0IzRixLQUFLa0csdUJBQXlCcUksRUFBWXJJLHVCQUF1QnZGLEtBQUtYLE1BQ3RFQSxLQUFLeU8sZ0JBQWtCRixFQUFZRSxnQkFBZ0I5TixLQUFLWCxLQUMxRCxDQUVBLE9BQUl0QixHQUNGLE9BQU8yUCxDQUNULENBRUEsc0JBQU9JLEdBTUwsT0FBTy9KLE1BQU1nSyxLQUFLTCxFQUxFLENBQUNNLEVBQUdDLEtBR2YsQ0FBRUMsSUFGR0YsRUFBRSxHQUVBeFAsSUFERndQLEVBQUUsR0FBR3RRLFlBQVlDLE9BSWpDLENBRUEsNkJBQU80SCxDQUF1QjRJLEdBQWtCLEdBQzlDLE1BQU1DLEVBQVcvTyxLQUFLeU8sa0JBQ2hCTyxHQUFnQixJQUFBck4sU0FBTyxJQUFBMkYsUUFBTyxlQUFnQixRQUM5QzJILEdBQWdCLElBQUF6SCxTQUFPLElBQUFGLFFBQU8sZUFBZ0IsUUFFOUM0SCxJQUR5QixJQUFwQkosRUFBMkJHLEVBQWdCRCxHQUMzQkQsR0FDM0IsT0FBTyxJQUFBSSxPQUFNLENBQUMsT0FBUUQsRUFDeEIsQ0FFQSxpQkFBQUUsR0FDRSxPQUFPcFAsS0FBS2tHLHdCQUF1QixFQUNyQyxDQUVBLHVCQUFBbUosR0FDRSxNQUFNTixFQUFXL08sS0FBS3lPLGtCQUVoQmEsR0FEZ0IsSUFBQTlILFNBQU8sSUFBQUYsUUFBTyxlQUFnQixPQUM3QjJILENBQWNGLEdBRXJDLEdBQUlPLEVBQWU3UCxRQUFVLEVBQUcsQ0FDOUIsTUFFTThQLEVBQXNCLGdDQUZpQixJQUExQkQsRUFBZTdQLE9BQWUsY0FBZ0IsMENBQ2hELElBQUFDLFVBQVEsSUFBQThQLE1BQUssT0FBTyxVQUFLLElBQUF2SyxNQUFLLFFBQTlCLENBQXVDcUssS0FFeER6UCxRQUFRQyxLQUFLeVAsRUFDZixDQUNGLENBRUEsSUFBQXJCLEdBQ0VsTyxLQUFLeVAsbUJBQ1AsQ0FFQSxpQkFBQUEsR0FDRXpQLEtBQUswUCxZQUFjLElBQUksSUFDdkJyQixFQUFLMUssSUFBSSxnQkFBaUIzRCxLQUFLMFAsYUFFL0IxUCxLQUFLMlAsU0FBVyxJQUFJLElBQ3BCdEIsRUFBSzFLLElBQUksYUFBYzNELEtBQUsyUCxVQUU1QjNQLEtBQUs0UCxVQUFZLElBQUksSUFDckJ2QixFQUFLMUssSUFBSSxpQkFBa0IzRCxLQUFLNFAsV0FFaEM1UCxLQUFLNlAsb0JBQXNCLElBQUksSUFDL0J4QixFQUFLMUssSUFBSSxvQkFBcUIzRCxLQUFLNlAscUJBRW5DN1AsS0FBSzhQLFNBQVcsSUFBSSxJQUNwQnpCLEVBQUsxSyxJQUFJLGFBQWMzRCxLQUFLOFAsVUFFNUI5UCxLQUFLMFAsWUFBWXRILG1CQUNqQnBJLEtBQUs0UCxVQUFVeEgsa0JBQ2pCLENBRUEsV0FBQTJILENBQVlsQixHQUNWUixFQUFLNUssSUFBSSxNQUFNc00sWUFBWWxCLEVBQzdCLENBRUEsY0FBQW1CLENBQWU3USxHQUNiLE1BQU1iLEVBQU9hLEVBQUkrQyxZQUNFbU0sRUFBSzRCLElBQUkzUixLQUVDLElBQUFvQixVQUFRLElBQUF3USxRQUFPLENBQUMsUUFBUyxpQkFBaUIsR0FBMUMsQ0FBaUQ3QixFQUFLNUssSUFBSW5GLElBRW5GdUIsUUFBUUMsS0FBSywrQkFBK0J4QixvQ0FLaEQrUCxFQUFLMUssSUFBSXJGLEVBQU1hLEdBQ2ZBLEVBQUlpSixtQkFDTixDQUVBLGlCQUFBakYsQ0FBa0JrRyxHQUNoQixPQUFPZ0YsRUFBSzVLLElBQUk0RixHQUFLbEosc0JBQ3ZCLENBRUEsZUFBQXlILENBQWdCdEosRUFBTTZSLEdBQWtCLEdBQ3RDLE1BQU1DLEdBQWtDLElBQXBCRCxFQUEyQixnQkFBa0IsVUFFakUsT0FBTzlCLEVBQUs1SyxJQUFJbkYsR0FBTThSLEVBQ3hCLENBRUEsVUFBQXpJLENBQVdySixHQUNULFlBQTBCRyxJQUFuQjRQLEVBQUs1SyxJQUFJbkYsRUFDbEIsQ0FFQSxTQUFBOEksQ0FBVTlJLEdBS1IsT0FKOEIsSUFBMUIwQixLQUFLMkgsV0FBV3JKLElBQ2xCK1AsRUFBSzFLLElBQUlyRixFQUFNLElBQUksSUFBYUEsSUFHM0IrUCxFQUFLNUssSUFBSW5GLEVBQ2xCLENBRUEsU0FBQWtRLEdBU0EsRSx3Q0M5SUssTUFBTTZCLFVBQXVCLElBaUJsQyxXQUFBaFMsQ0FBWUUsRUFBUSxDQUFDLEdBQ25CTyxNQUFNLGFBQWNQLEVBQ3RCLENBRUEsb0JBQUE0QixHQUNFLE1BQU8sQ0FDTCw0QkFDQSw0QkFFSixDQUVBLGdCQUFBZ0ssQ0FBaUJoQixHQUNmLE1BQU0sT0FBRTlILEVBQU0sV0FBRUUsR0FBZTRILEVBQ3pCL0gsRUFBVUcsRUFDaEJILEVBQVFDLE9BQVNBLEVBQ2pCckIsS0FBS3NRLFlBQVlqUCxFQUFRRCxFQUMzQixDQUVBLFdBQUFrUCxDQUFZN0gsRUFBV3JILEVBQVUsQ0FBQyxHQUNoQyxNQUFNQyxFQUFTckIsS0FBSytILGVBQWVVLEdBQzdCbEgsRUFBYSxDQUFDLEVBR3BCNkMsT0FBT3FGLFdBRGEsSUFBTXpKLEtBQUt3QixtQkFBbUJILEVBQVFELEVBQVNHLE9BRHJEOUMsR0FFaUIsRUFDakMsRSx5Q0N6Q0ssTUFBTThSLFVBQThCLElBaUJ6QyxXQUFBbFMsQ0FBWUUsRUFBUSxDQUFDLEdBQ25CTyxNQUFNLG9CQUFxQlAsRUFDN0IsQ0FFQSxvQkFBQTRCLEdBQ0UsTUFBTyxDQUNMLG1DQUNBLG1DQUVKLENBRUEsZ0JBQUFnSyxDQUFpQmhCLEdBQ2YsTUFBTSxPQUFFOUgsRUFBTSxXQUFFRSxHQUFlNEgsRUFDekIvSCxFQUFVRyxFQUNoQkgsRUFBUUMsT0FBU0EsRUFDakJyQixLQUFLc1EsWUFBWWpQLEVBQVFELEVBQzNCLENBRUEsV0FBQWtQLENBQVk3SCxFQUFXckgsRUFBVSxDQUFDLEdBQ2hDLE1BQU1DLEVBQVNyQixLQUFLK0gsZUFBZVUsR0FDN0JsSCxFQUFhLENBQUMsRUFHcEI2QyxPQUFPcUYsV0FEYSxJQUFNekosS0FBS3dCLG1CQUFtQkgsRUFBUUQsRUFBU0csT0FEckQ5QyxHQUVpQixFQUNqQyxFLDhGQ0hLLE1BQU0rUixVQUEwQixJQUNyQyxXQUFBblMsQ0FBWUMsRUFBTyxnQkFBaUJDLEVBQVEsQ0FBQyxHQStGM0NBLEVBQU1NLG1CQUFvQixFQUMxQkMsTUFBTSxnQkFBaUJQLEdBQ3ZCeUIsS0FBS3VHLDBCQUNMdkcsS0FBS3lRLGdCQUFrQnpRLEtBQUswUSxpQkFDNUIxUSxLQUFLMlEsb0JBQ0wzUSxLQUFLNFEsYUFBZSxJQUFJLEVBQUEvSyxjQUFjLEdBQ3RDN0YsS0FBS2dDLFVBQVloQyxLQUFLNFEsYUFBYXJKLE1BQUssSUFBQTdJLEtBQUltUyxHQUFRN1EsS0FBSzhRLFVBQVVELEtBQ25FN1EsS0FBSytRLHFCQUF1QixJQUF1QkEsc0JBQ3JELENBRUEsa0JBQUFDLElBR3FCLElBRGtELFNBQWxELElBQW1CQyxPQUFPQyxTQUFTQyxNQUFNdkQsUUFFMUQsSUFBbUJxRCxPQUFPQyxTQUFTQyxNQUFNdkQsS0FBTyxRQUNoRCxJQUFtQnFELE9BQU9DLFNBQVNDLE1BQU1DLFFBQVMsRUFFdEQsQ0FFQSxZQUFBclIsR0FDRUMsS0FBS2dSLHFCQUNMaFIsS0FBS3FSLFlBQ1AsQ0FFQSx1QkFBQTlLLEdBQ0UsTUFBTS9HLEVBQU1RLEtBQUtHLHVCQUVYZ0osR0FBTSxJQUFBN0YsV0FBUyxJQUFBOEYsT0FESEMsSUFBTyxJQUFBQyxPQUFNRCxFQUFLQSxHQUNFN0osSUFDdENRLEtBQUsrSCxlQUFpQm9CLENBQ3hCLENBRUEsb0JBQUFoSixHQUNFLE1BQU8sQ0FDTCwrQkFDQSw2QkFDQSxxQ0FDQSxDQUFDLG9DQUFxQyxxQkFFMUMsQ0FFQSxpQkFBQW1SLENBQWtCaE0sR0FDaEIsTUFBTWlNLEdBQWdCLElBQUEzUixNQUFLLENBQUMsU0FBVSxXQUFZLFNBQVUsUUFBUzBGLEVBQUVsRSxTQUV2RSxJQUFtQjZQLE9BQU9DLFNBQVNDLE9BQVEsSUFBQUssWUFBVyxJQUFtQlAsT0FBT0MsU0FBU0MsTUFBT0ksR0FFaEcsSUFBbUJFLHFCQUVuQixNQUFNQyxFQUFjMVIsS0FBSzBRLGlCQUl6QmdCLEVBQVlDLFNBQVcsSUFBSUQsR0FBYUUsa0JBRXhDNVIsS0FBS3lRLGdCQUFrQmlCLEVBQ3ZCMVIsS0FBSzZSLGtDQUVMN1IsS0FBS3dCLG1CQVJVLHFDQVFpQmtRLEVBQWEsQ0FBQyxFQUFHLENBQUMsRUFBRzFSLEtBQUs0USxhQUM1RCxDQUVBLGNBQUFGLEdBQ0UsTUFBTW9CLEVBQWMsSUFBbUJiLE9BQ2pDUyxHQUFjLElBQUFwUixNQUFLLENBQUMsV0FBWSxTQUFVd1IsR0FDdkIsVUFBckJKLEVBQVk5RCxPQUNkOEQsRUFBWU4sUUFBUyxHQUd2QixNQUFNNVIsRUFBTSxJQUF1QnVTLG9CQUFvQkwsRUFBWU0sUUFFbkUsT0FEQU4sRUFBWU8sVUFBWXpTLEVBQ2pCa1MsQ0FDVCxDQUVBLFVBQUFMLEdBQ0VyUixLQUFLa1MsaUJBQW1CLElBQUksRUFBQXJNLGNBQWMsR0FDMUM3RixLQUFLbVMsd0JBQW1CMVQsRUFBV3VCLEtBQUt5USxnQkFBc0IsZ0NBRTlELElBQXVCMkIscUJBQXFCcFMsS0FBS21TLG1CQUFtQnhSLEtBQUtYLE9BRXpFQSxLQUFLZ0MsV0FBWSxJQUFBOEQsT0FBTTlGLEtBQUtrUyxpQkFDMUJsUyxLQUFLNFEsYUFDVCxDQUVBLFNBQUFFLENBQVVySyxFQUFNNEwsR0FBYyxHQUU1QixPQURBNUwsRUFBS3BGLE9BQVMsNkJBQ1BvRixDQUNULENBRUEsaUJBQU82TCxDQUFXbFIsR0FDaEIsTUFBTW1SLEdBQVksSUFBQUMsVUFBUyxDQUFDLGNBRTVCLE9BRGlCLElBQUFDLE1BQUtGLEdBQVcsSUFBQUcsTUFBSyxDQUFDLFNBQ2hDQyxDQUFTdlIsRUFDbEIsQ0FFQSx5QkFBTytRLENBQW1CcFIsRUFBS2tRLEVBQVNqUixLQUFLeVEsZ0JBQWlCbUMsR0FDNUQsTUFBTXZSLE9BQWtCNUMsSUFBVG1VLEVBQ1hBLEVBQ0E1UyxLQUFLK0gsZUFBZThLLDJCQUdsQkMsR0FBYSxJQUFBeFMsTUFBSyxDQUFDLFFBQVMsY0FBZVMsR0FDM0NnUyxHQUE0QyxLQUEzQixJQUFBdE8sSUFBR3VPLE9BQVFGLEdBQ2xDLElBQUkxUixFQUFVcEIsS0FBS2lULGtCQUFrQmhDLEVBQVE4QixJQUN0QixJQUFuQkEsSUFDRjNSLEVBQVE4UixXQUFhSixHQUdWLGlDQUFURixJQUNGeFIsRUFBUXVRLFVBQVcsSUFBQTFNLE1BQUssbUJBQW9CZ00sR0FLNUN0TyxPQUFPd1EsZUFBZS9SLEVBQVMsWUFBYSxDQUMxQyxHQUFBcUMsR0FFRSxPQUFPekQsS0FBSzJSLFFBQ2QsRUFDQSxHQUFBaE8sQ0FBSXlQLEdBQ0Z2VCxRQUFRQyxLQUFLLG9FQUdmLEVBQ0F1VCxZQUFZLEtBR2hCLE1BQU1DLEVBQWN0VCxLQUFLK1EscUJBQXFCd0MsUUFBUW5TLEVBQVFvUyxVQUFXcFMsRUFBUXFTLE9BQ2pGclMsR0FBVSxnQkFBT0EsRUFBU2tTLEdBQzFCdFQsS0FBS3dCLG1CQUFtQkgsRUFBUUQsT0FBUzNDLEVBQVdzQyxFQUFLZixLQUFLNFEsYUFDaEUsQ0FFQSxtQ0FBTzhDLENBQTZCdFMsR0FDbEMsT0FBT0EsQ0FDVCxDQUVBLDJCQUFPdVMsQ0FBcUI3SSxHQUMxQixNQUVNOEksR0FEYSxJQUFBbFUsVUFBUSxhQUFZLElBQUFtVSxNQUQ1QixrQ0FDdUMsRUFBQS9MLE1BQU0sSUFBQTdDLE1BQUssV0FDMUM2TyxDQUFXaEosR0FDOUIsR0FBSThJLEVBQVduVSxRQUFVLEVBQUcsQ0FDMUIsTUFBTXNCLEdBQU0sSUFBQWtFLE1BQUssUUFBUzZGLEdBQzFCLFFBQVlyTSxJQUFSc0MsRUFBbUIsQ0FDckIsTUFBTWdULEVBQWUsQ0FBQ0MsRUFBT0MsRUFBSUMsRUFBSUMsRUFBSUMsSUFBT3JMLE9BQU9tTCxHQUFJRyxjQUFnQkYsRUFBS0MsRUFDMUVFLEdBQW1CLElBQUFDLFNBQVEsa0NBQW1DUixHQUM5RFMsRUFBYWhMLElBQ2pCLE1BQU1pTCxFQUFJSCxFQUFpQjlLLFFBQ1ovSyxJQUFYc0MsRUFBSTBULElBQW9CMVQsRUFBSTBULE1BRWxDYixFQUFXeE8sUUFBUW9QLEVBQ3JCLENBQ0YsQ0FFQSxPQUFPMUosQ0FDVCxDQUVBLHVCQUFPNEosQ0FBaUJDLEVBQUlsRSxFQUFrQnpRLEtBQUt5USxnQkFBaUJtRSxHQUdsRSxJQUFpQixLQUZBLElBQUFsVixVQUFRLElBQUE2SyxRQUFPLFNBQVMsSUFBQWpLLE1BQUssQ0FBQyxVQUFXLGFBQXpDLENBQXVEcVUsR0FHdEUsT0FBT0EsRUFFVCxNQUFNalMsT0FBc0JqRSxJQUFkbVcsRUFBMEJBLEdBQXlDLElBQTdCLElBQW1CbFMsT0FDakUsUUFBRXRCLEdBQVl1VCxFQWFwQixJQUFJRSxFQUFPLEVBQ1gsTUFBTUMsRUFBcUIsQ0FBQ0MsRUFBTSxHQUFJdlYsS0FFcEMsTUFBTUwsRUFBTUssRUFBSSxJQUNWLFVBQUV3VixHQUFjN1YsRUFDaEI4VixHQUFZLElBQUFoUSxNQUFLLFlBQWErUCxHQUM5QkUsRUFqQlcsQ0FBQ0YsSUFDbEIsTUFBTUMsR0FBWSxJQUFBaFEsTUFBSyxZQUFhK1AsR0FDcEMsR0FBSUMsRUFBVyxDQUNiLE1BQU1FLEdBQVUsSUFBQXpWLFNBQVEsRUFBQW9JLE1BQU0sSUFBQTRLLE1BQUssQ0FBQyxjQUFwQixDQUFtQ3NDLEdBQzdDRSxFQUFlOVQsRUFBUTZULEdBQ3ZCRyxFQUFPQyxHQUFVLElBQUlDLE9BQU8sSUFBSUQsTUFBV3hCLEtBQUtxQixHQUV0RCxPQURpQixJQUFBSyxNQUFLSCxFQUFNRCxFQUU5QixHQVNxQkssQ0FBV1IsR0FDMUJyUSxHQUFRLElBQUFGLElBQUc5QixPQUFReEQsR0FDbkJxRixHQUFRLElBQUFDLElBQUdDLE1BQU92RixHQUd4QixHQURBMFYsR0FBYyxHQURZLElBQVZsUSxJQUE0QixJQUFWSCxFQUVyQixDQUNYLE1BQU1pUixFQUFnQlQsRUFBVUUsR0FFNUJPLEdBQ0YsSUFBQS9WLFNBQVEsRUFBQWdXLFNBQVMsSUFBQUMsUUFBT2IsRUFBb0JDLEdBQU0sRUFBQWpRLFFBQWxELENBQTJELENBQUUyUSxrQkFHaEQsSUFBVFosRUFDRW5TLEdBQ0Y3QyxRQUFRQyxLQUFLLDJFQUEyRW1WLE9BRzFGRixFQUFJYSxLQUFLWCxFQUdmLENBQ0EsT0FBT0YsSUFHSCxPQUFFL0MsR0FBV3ZCLEVBRWJvRixHQUFpQixJQUFBblcsU0FBUSxFQUFBZ1csU0FBUyxJQUFBQyxRQUFPYixFQUFvQixJQUFLLEVBQUFoUSxRQUFqRCxDQUEwRCxDQUFFa04sV0FFbkYsR0FBOEIsSUFBMUI2RCxFQUFlcFcsT0FBYyxDQUMvQixNQUFNcVcsRUFBY0QsRUFBZSxHQUNuQ2xCLEVBQUd2VCxRQUFRMFUsR0FBZSxFQUM1QixDQU1BLE9BQU9uQixDQUNULENBRUEsZ0JBQUF4SyxDQUFpQndLLEdBQ2YsTUFBTXRULEVBQVNzVCxFQUFHdFQsUUFBVXJCLEtBQUsrSCxlQUFlOEssMkJBYTVDOEIsR0FBSXBULFlBQVl3VSxJQUFJQyxVQUN0QnJCLEVBQUd2VCxRQVpMLFNBQThCNlUsR0FDNUIsTUFBTTlNLEVBQU0sQ0FBQyxFQUNiLElBQUssTUFBTTBGLEtBQU9vSCxFQUVadFQsT0FBT0MsVUFBVUMsZUFBZUMsS0FBS21ULEVBQWNwSCxLQUNyRDFGLEVBQUkwRixHQUFPb0gsRUFBYXBILElBRzVCLE9BQU8xRixDQUNULENBR2UrTSxDQUFxQnZCLEdBQUlwVCxZQUFZd1UsSUFBSUMsVUFBWXJCLEVBQUd2VCxTQUt2RW9QLEVBQWtCbUQscUJBQXFCZ0IsR0FDdkNBLEVBQUszVSxLQUFLMFUsaUJBQWlCQyxHQUMzQixJQUFJdlQsRUFBVXBCLEtBQUttVyxrQkFBa0J4QixHQUVyQyxNQUFNcFQsR0FBYSxJQUFBMEQsTUFBSyxhQUFjMFAsR0FDaEN4UyxHQUFRLElBQUE4QyxNQUFLLFFBQVMwUCxHQUN0QnlCLEdBQXNCaFYsRUFBUWlWLFNBQzlCL0MsRUFBY3RULEtBQUsrUSxxQkFBcUJ3QyxRQUFRblMsRUFBUW9TLFVBQVdwUyxFQUFRcVMsT0FFakZyUyxHQUFVLGdCQUFPQSxFQUFTa1MsR0FDMUJ0VCxLQUFLc1csZ0JBQWdCbFYsRUFBU2dWLEdBRTlCaFYsRUFBVW9QLEVBQWtCOEIsV0FBV2xSLEdBRXZDcEIsS0FBS3dCLG1CQUFtQkgsRUFBUUQsRUFBU0csRUFBWVksRUFDbkRuQyxLQUFLNFEsYUFDVCxDQUVBLHdDQUFPMkYsQ0FBa0NDLEVBQVlDLEdBR25ELE9BRnFCLElBQUEzTyxNQUFLMk8sRUFHNUIsQ0FFQSxlQUFBSCxDQUFnQmxWLEVBQVNzVixHQUFrQixJQUNqQixJQUFwQkEsR0FDRjFXLEtBQUsyVyxrQkFBa0J2VixFQUUzQixDQUVBLG9CQUFPd1YsR0FDTCxNQUFPLDRCQUNULENBRUEsd0JBQU9DLENBQWtCQyxHQUN2QixPQUFxQixJQUFkQSxHQUE0QyxJQUFyQjlXLEtBQUsrVyxXQUNyQyxDQUVBLG9CQUFPQyxDQUFjRixHQUFZLEdBQy9CLFlBQXlCclksSUFBckJ1QixLQUFLK1csYUFDUC9XLEtBQUsrVyxZQUFjLEVBQ1ovVyxLQUFLK1csZUFFSSxJQUFkRCxJQUNGOVcsS0FBSytXLGFBQWUsR0FFZi9XLEtBQUsrVyxZQUNkLENBRUEsNEJBQU9FLENBQXNCaEcsRUFBU2pSLEtBQUt5USxnQkFBaUJxRyxHQUFZLEdBTXRFLE1BQU8sQ0FBRTVELFdBTFVsVCxLQUFLZ1gsY0FBY0YsR0FLakJJLFdBSkZsWCxLQUFLNlcsa0JBQWtCQyxHQUlUMUYsT0FIbEJILEVBQU9HLE9BR21CMEYsWUFBV1QsU0FGbkNwRixFQUFPb0YsU0FFc0NjLFVBRDVDbEcsRUFBT3JELEtBRTNCLENBRUEsd0JBQU91SSxDQUFrQnhCLEVBQUkxRCxFQUFTalIsS0FBS3lRLGlCQUN6QyxJQUFJK0MsR0FBWSxJQUFBdk8sTUFBSyxVQUFXMFAsR0FFaEMsTUFBTTZCLEVBQWF4VyxLQUFLb1gsc0JBQXNCNUQsRUFBV3ZDLEdBR25Eb0csRUFBb0IsQ0FBQ0MsRUFBS0MsS0FBVyxJQUFBbFgsV0FBVWtYLEdBQVEsSUFBQXRTLE1BQUtxUyxFQUFLckcsSUFDakV1RyxFQUFhSCxFQUFrQixPQUFRLFNBQ3ZDSSxFQUFlSixFQUFrQixVQUFVLEdBQzNDSyxFQUFnQixJQUEwQkMsMEJBQTBCbkIsR0FDcEVvQixFQUFjNVgsS0FBSzZYLHVCQUF1QkwsRUFBWUMsRUFBY0MsSUFFcEUsY0FBRUksRUFBYSxNQUFFckUsR0FBVW1FLEVBRWpDcEUsR0FBWSxnQkFBT29FLEVBQVlwRSxVQUFXQSxHQUUxQyxNQUFNLFdBQUVOLEVBQVUsV0FBRWdFLEVBQVUsT0FBRTlGLEVBQU0sVUFBRTBGLEVBQVMsU0FBRVQsRUFBUSxVQUFFYyxHQUFjblgsS0FBS2lYLHNCQUM5RWhHLEdBQ0YsTUFBTyxDQUNMaUcsYUFDQWhFLGFBQ0E0RSxnQkFDQXJFLFFBQ0FELFlBQ0FnRCxhQUNBcEYsU0FDQWlGLFdBQ0FTLFlBQ0FLLFlBRUosQ0FFQSx3QkFBT2xFLENBQWtCaEMsRUFBU2pSLEtBQUt5USxnQkFBaUJxRyxHQUFZLEdBQ2xFLE1BQU1sSixFQUFPcUQsRUFBT3JELEtBQ2RtSyxHQUErQixJQUFsQjlHLEVBQU9HLE9BQ3BCL0gsRUFBTSxJQUEwQjJPLHFCQUFxQnBLLEVBQU1tSyxJQUMzRCxNQUFFdEUsRUFBSyxjQUFFcUUsRUFBYSxVQUFFdEUsRUFBUyxXQUFFZ0QsR0FBZWhHLEVBQWtCeUgsc0JBQ3hFNU8sRUFBSzRILEVBQVFyRCxJQUNULFdBQUVzRixFQUFVLFdBQUVnRSxFQUFVLE9BQUU5RixFQUFNLFVBQUUrRixFQUFTLFNBQUVkLEdBQWFyVyxLQUFLaVgsc0JBQ25FaEcsRUFBUTZGLEdBY1YsTUFaWSxDQUNWSSxhQUNBaEUsYUFDQTRFLGdCQUNBckUsUUFDQUQsWUFDQWdELGFBQ0FwRixTQUNBaUYsV0FDQVMsWUFDQUssWUFHSixDQUVBLDZCQUFPVSxDQUF1QkssRUFBSSxRQUFTOUcsRUFBU3BSLEtBQUt5USxnQkFBZ0JXLE9BQVErRyxFQUFNL1QsT0FBT1IsVUFDNUYsTUFBTWdLLE9BQWdDblAsSUFBekJ1QixLQUFLeVEsZ0JBQ2R6USxLQUFLeVEsZ0JBQWdCN0MsS0FDckJzSyxFQUVFN08sRUFBTSxJQUEwQjJPLHFCQUFxQnBLLEVBQU13RCxFQUFRK0csSUFDbkUsTUFBRTFFLEVBQUssY0FBRXFFLEVBQWEsVUFBRXRFLEVBQVMsV0FBRWdELEdBQWV4VyxLQUFLaVksc0JBQzNENU8sRUFBS3JKLEtBQUt5USxnQkFBaUI3QyxHQUU3QixNQUFPLENBQUU2RixRQUFPcUUsZ0JBQWV0RSxZQUFXZ0QsYUFBWW5WLE9BRHZDckIsS0FBSzRXLGdCQUV0QixDQUVBLHNCQUFPL1MsR0FXTCxPQUFPLElBQUFNLFNBVm1CLENBQ3hCLE9BQ0EsU0FDQSxXQUNBLE9BQ0EsV0FDQSxPQUNBLFdBQ0EsU0FDQSxRQUNnQ0MsT0FBT1IsU0FDM0MsQ0FFQSw0QkFBT3dULENBQXNCZ0IsRUFBWTFHLEVBQWF3RyxHQUNwRCxNQUFNdEssT0FBYW5QLElBQU55WixFQUFrQkEsRUFBSXhHLEVBQVk5RCxLQUUvQyxPQURZLElBQTBCeUsscUJBQXFCRCxFQUFZMUcsRUFBYTlELEVBRXRGLENBRUEsNEJBQU9xSyxDQUFzQjVPLEVBQUtxSSxFQUFhd0csR0FDN0MsTUFBTXRLLE9BQWFuUCxJQUFOeVosRUFBa0JBLEVBQUl4RyxFQUFZOUQsS0FFL0MsT0FEWSxJQUEwQjBLLHFCQUFxQmpQLEVBQUtxSSxFQUFhOUQsRUFFL0UsQ0FFQSxrQkFBQTJLLENBQW1CbFAsRUFBSytILEdBQVMsR0FDL0IsTUFBTW9ILEdBQWMsSUFBQWpRLFNBQVFjLEdBSzVCLE9BQTRCLEtBSmdCLElBQWhCbVAsSUFBbUMsSUFBWHBILEtBSVEsS0FIaEIsSUFBaEJvSCxJQUFtQyxJQUFYcEgsR0FJM0MsS0FDbUIsS0FKUyxJQUFoQm9ILElBQW9DLElBQVhwSCxJQUtyQyxJQUFBN1EsUUFBTyxJQUFLOEksR0FFZEEsQ0FDVCxDQUVBLHNCQUFPb1AsQ0FBZ0JwUCxHQUVyQixPQUFPQSxFQUFJa0wsUUFEQSxhQUNZLEtBQ3pCLENBRUEsaUJBQUFvQyxDQUFrQitCLEdBQ2hCLElBQUksT0FBRXRILEVBQU0sV0FBRW9GLEVBQVUsVUFBRVcsR0FBY3VCLEVBQ3hDbEMsRUFBYXhXLEtBQUt1WSxtQkFBbUIvQixFQUFZcEYsR0FDakQsTUFBTSxXQUFFOEIsR0FBZXdGLEVBQ3ZCLElBQWUsSUFBWHRILEdBQWlDLFVBQWQrRixFQUVyQlgsRUFEaUJoRyxFQUFrQmlJLGdCQUFnQnJVLE9BQU9SLFNBQVMrVSxVQUMzQ25DLEVBQ3hCcFMsT0FBT3dVLFFBQVFDLFVBQVUsQ0FBRTNGLGNBQWMsR0FBSXNELE9BQ3hDLENBQ0wsTUFBTXNDLEdBQWdCLElBQUFDLE9BQ3BCLElBQUFyWixVQUFRLElBQUFzWixhQUFXLElBQUF6TyxRQUFPLE1BQU8sRUFBQXRCLE9BQU8sSUFBQTFJLFFBQU8sSUFBSyxFQUFBMFksS0FDdEQ3VSxPQUFPd1UsUUFBUUMsVUFBVSxDQUFFM0YsY0FBYyxHQUFJNEYsRUFBY3RDLEdBQzdELENBQ0YsQ0FFQSxpQkFBQTBDLEdBQ0UsT0FBTzlVLE9BQU9SLFNBQVMrVSxRQUN6QixDQUVBLGlCQUFBaEksR0FDRTNRLEtBQUswVSxpQkFBbUJsRSxFQUFrQmtFLGlCQUFpQi9ULEtBQUtYLE1BQ2hFQSxLQUFLNlcsa0JBQW9CckcsRUFBa0JxRyxrQkFBa0JsVyxLQUFLWCxNQUNsRUEsS0FBSzZYLHVCQUF5QnJILEVBQWtCcUgsdUJBQXVCbFgsS0FDckVYLE1BQ0ZBLEtBQUttUyxtQkFBcUIzQixFQUFrQjJCLG1CQUFtQnhSLEtBQUtYLE1BQ3BFQSxLQUFLaVQsa0JBQW9CekMsRUFBa0J5QyxrQkFBa0J0UyxLQUFLWCxNQUNsRUEsS0FBS2lZLHNCQUF3QnpILEVBQWtCeUgsc0JBQXNCdFgsS0FBS1gsTUFDMUVBLEtBQUs2RCxnQkFBa0IyTSxFQUFrQjNNLGdCQUFnQmxELEtBQUtYLE1BQzlEQSxLQUFLNFcsY0FBZ0JwRyxFQUFrQm9HLGNBQWNqVyxLQUFLWCxNQUMxREEsS0FBS21XLGtCQUFvQjNGLEVBQWtCMkYsa0JBQWtCeFYsS0FBS1gsTUFDbEVBLEtBQUtnWCxjQUFnQnhHLEVBQWtCd0csY0FBY3JXLEtBQUtYLE1BQzFEQSxLQUFLaVgsc0JBQXdCekcsRUFBa0J5RyxzQkFBc0J0VyxLQUFLWCxNQUMxRUEsS0FBSzZSLGlDQUNQLENBRUEsK0JBQUFBLEdBQ0UsTUFBTXNILEdBQWtCLElBQUFDLFFBQU8sRUFBRzVJLEVBQWtCNEcsdUJBQ3BEcFgsS0FBS29YLHNCQUF3QitCLEVBQWdCLEVBQUFGLEdBQUlqWixLQUFLeVEsZ0JBQ3BEelEsS0FBS3lRLGdCQUFnQjdDLEtBQ3pCLEUsNkVDbmtCSyxNQUFNeUwsVUFBdUIsSUFpQmxDLFdBQUFoYixDQUFZQyxFQUFPLGFBQWNDLEVBQVEsQ0FBQyxHQUN4Q0EsRUFBTU0sbUJBQW9CLEVBQzFCQyxNQUFNUixFQUFNQyxHQUNaeUIsS0FBS3NaLGlCQUFrQixFQUN2QnRaLEtBQUt1WixXQUFhLEVBQ3BCLENBRUEsb0JBQUFwWixHQUNFLE1BQU8sQ0FDTCxvQ0FDQSx5QkFDQSw0QkFDQSw0QkFDQSw4QkFDQSxzQ0FDQSxtQ0FDQSxnQ0FDQSxzQ0FDQSxrQ0FDQSxnQ0FDQSw0QkFDQSw4QkFDQSw0QkFDQSwrQkFDQSwrQkFDQSxnQ0FDQSw4QkFDQSwyQkFDQSx3QkFDQSw0QkFDQSxxQ0FDQSwwQkFDQSwyQkFDQSxrQ0FDQSwwQkFDQSx5QkFDQSx5QkFDQSwyQkFDQSw0QkFDQSxrQ0FDQSxvQ0FDQSxxQ0FDQSwyQkFDQSx5Q0FDQSxpQ0FDQSwrQkFDQSx3QkFDQSw2QkFDQSx1QkFDQSwrQkFDQSw0QkFDQSxnQ0FDQSxnQ0FDQSxxQ0FDQSx3QkFDQSwyQkFDQSw2QkFDQSw2QkFDQSw0QkFDQSw2QkFDQSx3QkFDQSxrQ0FDQSwyQkFDQSx1QkFDQSw0QkFDQSx5QkFDQSx5Q0FDQSx5QkFDQSx5QkFDQSwyQkFDQSw0QkFDQSw0QkFDQSxvQ0FDQSxtQ0FDQSxvQ0FDQSx1Q0FDQSx3Q0FDQSxpQ0FDQSw4QkFDQSxnQ0FDQSxxQ0FDQSw4QkFDQSxnQ0FDQSxxQ0FDQSw0Q0FDQSwyQ0FDQSx5QkFDQSxzQ0FDQSwyQkFDQSwyQkFDQSwyQkFDQSx5QkFDQSxrQ0FDQSx5Q0FDQSx3QkFDQSw4QkFDQSxrQ0FDQSwyQkFDQSw2QkFDQSxzQ0FDQSx3QkFDQSxzQ0FDQSwyQkFDQSxnQ0FDQSw2QkFDQSw4QkFDQSw4QkFDQSw2QkFDQSw0QkFDQSw2QkFDQSwyQkFDQSx3QkFDQSxxQ0FDQSwyQkFDQSxxQ0FDQSwyQkFDQSwwQkFDQSx3QkFDQSxxQ0FDQSw0QkFDQSw0QkFDQSx5QkFDQSx5QkFDQSxxQ0FDQSx1Q0FDQSx3QkFDQSwyQkFDQSxpQ0FDQSwrQkFDQSxnQ0FDQSxnQ0FDQSxxQ0FDQSxvQ0FDQSwrQkFDQSw4QkFDQSwrQkFDQSw2QkFDQSw0QkFDQSw0QkFDQSx3QkFDQSwwQ0FDQSw4QkFDQSxvQ0FDQSxvQ0FDQSwrQkFDQSxnQ0FDQSwrQkFDQSx5QkFDQSwwQkFDQSw0Q0FDQSwwQkFDQSwwQkFDQSwwQkFDQSwwQkFDQSwwQkFDQSwyQkFDQSwwQkFDQSwrQ0FDQSw2QkFDQSxtQ0FDQSwrQkFDQSx5Q0FDQSx3Q0FDQSx3Q0FDQSw4QkFDQSw0QkFDQSw4QkFDQSw2QkFDQSwrQkFDQSwyQkFDQSw4QkFDQSxnQ0FDQSwyQkFDQSx5QkFDQSwrQkFDQSwyQkFDQSwwQkFDQSwyQkFDQSwyQkFDQSwyQkFDQSw4QkFDQSwwQkFDQSw4QkFDQSwrQkFDQSw0QkFDQSw2QkFDQSw4QkFDQSx5QkFDQSxvQ0FDQSxpQ0FDQSxpQ0FDQSxtQ0FDQSxzQ0FDQSwwQkFDQSwwQkFDQSxpQ0FDQSxpQ0FDQSxvQ0FDQSxpQ0FDQSxnQ0FDQSxxQ0FDQSxpQ0FDQSxvQ0FDQSx1Q0FDQSx1Q0FDQSxrQ0FDQSw4Q0FDQSxnREFDQSwwQ0FDQSwyQkFDQSw2Q0FDQSxvQ0FDQSx3Q0FDQSwyQ0FDQSx3Q0FDQSxzQ0FDQSw2Q0FDQSx5QkFFSixDQUVBLGFBQUFxWixHQUNFLE1BQU1DLEVBQVMsRUFBQWxNLFdBQVdtTSxVQUFVQyxTQUFVLFNBRTlDM1osS0FBSzRaLFlBQWNILEVBQU9JLFFBQVF2VSxHQUFLQSxFQUFFd1UsU0FDdEN4VyxXQUNBa0UsT0FIZ0JsQyxHQUFLdEYsS0FBS3VaLFdBQVdRLFFBQVF6VSxFQUFFd1UsVUFBWSxHQUkzREUsU0FDQXZTLFVBQVV6SCxLQUFLaWEsYUFBYXRaLEtBQUtYLE1BQ3RDLENBRUEsV0FBQStQLENBQVltSyxJQUNtQixJQUF6QmxhLEtBQUtzWixpQkFDUHRaLEtBQUt3WixnQkFFUHhaLEtBQUtzWixpQkFBa0IsRUFDdkJ0WixLQUFLbWEsWUFBWUQsRUFDbkIsQ0FFQSxXQUFBQyxDQUFZL08sR0FDVnBMLEtBQUt1WixXQUFXM0QsS0FBS3hLLEVBQ3ZCLENBRUEsWUFBQTZPLENBQWFsWixHQUViLENBRUEsaUJBQU91UixDQUFXcUMsR0FDaEIsTUFBTXBDLEdBQVksSUFBQUMsVUFBUyxDQUFDLFlBRTVCLE9BRGlCLElBQUFDLE1BQUtGLEdBQVcsSUFBQUcsTUFBSyxDQUFDLFNBQ2hDQyxDQUFTZ0MsRUFDbEIsQ0FFQSxvQkFBQTVLLENBQXFCWixHQUNuQixNQUFNbUIsR0FBVSxJQUFBQyxRQUFPcEIsRUFBSTdLLEtBQU0wQixLQUFLekIsTUFBTUQsTUFDNUM2SyxFQUFJMUMsS0FBTzRTLEVBQWUvRyxXQUFXbkosRUFBSTFDLE1BQ3pDLE1BQU0sUUFBRXJGLEVBQU8sV0FBRUcsR0FBZTRILEVBQUkxQyxLQUM5QmhGLEVBQVUrSSxJQUFVLENBQUdwSixVQUFTRyxhQUFZWSxNQUFPcUksSUFJekQsT0FBbUIsSUFBWkYsRUFIVyxDQUFDbkIsR0FBUUEsRUFBSXdCLFdBQVdwRCxNQUFLLElBQUE3SSxLQUFJK0MsSUFDaERnRyxVQUFVekgsS0FBS29hLFVBQVV6WixLQUFLWCxPQUVQNEssQ0FBVXpCLFFBQU8wQixDQUM3QyxDQUVBLGNBQUF3UCxDQUFlbGIsR0FDYixNQUFNbWIsR0FBVSxJQUFBaGEsTUFBSyxDQUFDLFFBQVMsU0FDekJpYSxHQUFrQixJQUFBamEsTUFBSyxDQUFDLFFBQVMsaUJBRWpDc04sR0FEWSxJQUFBbE8sU0FBUSxFQUFBOGEsU0FBUyxJQUFBdmIsUUFBT3NiLEVBQWlCRCxHQUM5Q0csQ0FBVXRiLEdBQ2pCdWIsRUFBYSxhQUNuQixZQUFnQmpjLElBQVRtUCxFQUFxQixHQUFHOE0sS0FBYzlNLFVBQWU4TSxDQUM5RCxDQUVBLDJCQUFPL0csQ0FBcUI3SSxHQUMxQixNQUVNOEksR0FEYSxJQUFBbFUsVUFBUSxJQUFBOEgsU0FBTyxJQUFBcU0sTUFEdkIsa0NBQ2tDLEVBQUEvTCxNQUFNLElBQUE3QyxNQUFLLFdBQ3JDNk8sQ0FBV2hKLEdBQzlCLEdBQUk4SSxFQUFXblUsUUFBVSxFQUFHLENBQzFCLE1BQU1zQixHQUFNLElBQUFrRSxNQUFLLFFBQVM2RixHQUMxQixRQUFZck0sSUFBUnNDLEVBQW1CLENBQ3JCLE1BQU1nVCxFQUFlLENBQUNDLEVBQU9DLEVBQUlDLEVBQUlDLEVBQUlDLElBQU9yTCxPQUFPbUwsR0FBSUcsY0FBZ0JGLEVBQUtDLEVBQzFFRSxHQUFtQixJQUFBQyxTQUFRLGtDQUFtQ1IsR0FDOURTLEVBQWFoTCxJQUNqQixNQUFNaUwsRUFBSUgsRUFBaUI5SyxRQUNaL0ssSUFBWHNDLEVBQUkwVCxJQUF3QyxtQkFBWjFULEVBQUkwVCxJQUFzQjFULEVBQUkwVCxNQUVwRWIsRUFBV3hPLFFBQVFvUCxFQUNyQixDQUNGLENBRUEsT0FBTzFKLENBQ1QsQ0FFQSxTQUFBc1AsQ0FBVXRQLEdBWVJBLEVBQUkxSixRQVhKLFNBQThCNlUsR0FDNUIsTUFBTTlNLEVBQU0sQ0FBQyxFQUNiLElBQUssTUFBTTBGLEtBQU9vSCxFQUVadFQsT0FBT0MsVUFBVUMsZUFBZUMsS0FBS21ULEVBQWNwSCxLQUNyRDFGLEVBQUkwRixHQUFPb0gsRUFBYXBILElBRzVCLE9BQU8xRixDQUNULENBRWMrTSxDQUFxQnBMLEdBQUt2SixZQUFZd1UsSUFBSUMsVUFBWWxMLEVBQUkxSixRQUV4RWlZLEVBQWUxRixxQkFBcUI3SSxHQUNwQ0EsRUFBSXpKLE9BQVNyQixLQUFLcWEsZUFBZXZQLEdBQ2pDLE1BQU16SixFQUFTeUosRUFBSXpKLFFBRWIsUUFBRUQsRUFBTyxXQUFFRyxHQUFldUosRUFFMUIzSSxFQUFRMkksRUFBSTNJLE9BQ2xCLFFBQW9CQSxHQUFPd1ksUUFFM0IzYSxLQUFLd0IsbUJBQW1CSCxFQUFRRCxFQUFTRyxFQUFZWSxFQUN2RCxFLHVHQzNVSyxNQUFNeVksVUFBMkIsSUF3QnRDLFdBQUF2YyxDQUFZaUksRUFBZSxrQkFDekJ4SCxNQUFNd0gsR0FDTnRHLEtBQUsyUSxvQkFDTDNRLEtBQUs2YSxlQUFpQixDQUN4QixDQUVBLGdCQUFBelMsR0FDRXBJLEtBQUs4YSxpQkFBbUIsSUFBbUI3SixPQUFPQyxTQUFTNkosT0FDM0QsTUFBTUMsRUFBVWhiLEtBQUtpYix1QkFDZkMsR0FBTyxJQUFBcFYsVUFBU2tWLEdBQ3RCaGIsS0FBS2tiLEtBQU9BLEVBQ1pBLEVBQUt6VCxVQUFVMFQsSUFDYixNQUFNLE9BQUU5WixFQUFNLFFBQUVELEVBQU8sV0FBRUcsRUFBVSxNQUFFWSxHQUFVZ1osRUFDL0NuYixLQUFLd0IsbUJBQW1CSCxFQUFRRCxFQUFTRyxFQUFZWSxJQUV6RCxDQUVBLHlCQUFPaVosQ0FBbUJqWixHQUN4QixNQUFNZCxFQUFTckIsS0FBSytILGVBQWVzVCwyQkFDN0JDLEVBQVluWixFQUFNb1osUUFBVSxFQUFJLEtBQU8sUUFDdkMsT0FBRUMsRUFBTSxPQUFFRCxFQUFNLE9BQUVFLEdBQVd0WixFQUduQyxNQUFPLENBQUVkLFNBQVFELFFBRkQsQ0FBRWthLFlBQVdFLFNBQVFELFNBQVFFLFVBRW5CbGEsV0FEUFksRUFBTVosV0FDYVksUUFDeEMsQ0FFQSxnQ0FBT3VaLENBQTBCalQsR0FDL0IsTUFBTXBILEVBQVMsa0JBQWtCb0gsRUFBVWtULHNCQUUzQyxPQURnQixJQUFBQyxPQUFNaEIsRUFBbUJpQixnQkFDbENDLENBQVF6YSxFQUNqQixDQUVBLHNCQUFPd2EsQ0FBZ0JqSixFQUFNelEsR0FLM0IsTUFBTyxDQUFFZCxPQUhNdVIsRUFHRXhSLFFBRkRlLEVBRVVaLFdBRFBZLEVBQU1aLFdBQ2FZLFFBQ3hDLENBRUEscUJBQU80WixDQUFlNVosR0FLcEIsTUFBTyxDQUFFZCxPQUpNckIsS0FBSytILGVBQWVpVSw0QkFJbEI1YSxTQUhELElBQUF4QixNQUNkLENBQUMsYUFBYyxjQUFlLGFBQWMsZUFBZ0J3RSxRQUVwQzdDLFdBRFBZLEVBQU1aLFdBQ2FZLFFBQ3hDLENBRUEsMEJBQU84WixDQUFvQjlaLEdBQ3pCLE1BQU1kLEVBQVNyQixLQUFLK0gsZUFBZW1VLGlDQUU3QkMsRUFBaUIvWCxPQUFPZ1ksV0FEUCwyQkFDa0NDLFFBQ25EamIsR0FBVSxJQUFBeEIsTUFDZCxDQUFDLGFBQWMsY0FBZSxhQUFjLGVBQWdCd0UsUUFLOUQsT0FKQWhELEVBQVFrYixhQUFpQyxJQUFuQkgsRUFDbEIsV0FDQSxZQUVHLENBQUU5YSxTQUFRRCxVQUFTRyxXQURQWSxFQUFNWixXQUNhWSxRQUN4QyxDQUVBLGtCQUFBb2EsQ0FBbUJwYSxHQUlqQixNQUFPLENBQUVkLE9BSE1yQixLQUFLK0gsZUFBZXlVLGlDQUdsQnBiLFNBRkQsSUFBQXhCLE1BQUssQ0FBQyxVQUFXLFFBQVMsa0JBQW1CdUMsR0FFbkNaLFdBRFBZLEVBQU1aLFdBQ2FZLFFBQ3hDLENBRUEsMEJBQUFzYSxDQUEyQnhMLEdBQ3pCLE1BQU15TCxFQUFZekwsRUFBTzBMLHdCQUV6QixPQUFPLElBQXdCQyw2QkFBNkIsUUFDMURoQyxFQUFtQlEsbUJBQW1CemEsS0FBS1gsT0FDMUN1SCxNQUNDLElBQUFzVixjQUFhSCxHQUVuQixDQUVBLG9CQUFPSSxHQUNMLElBQUlqQyxFQUFpQixFQVFyQixPQU51QmtDLElBQ3JCLE1BQU1DLEVBQWlCbkMsRUFBaUJrQyxFQUd4QyxPQURBbEMsRUFBaUJrQyxFQUNWLENBQUVBLFVBQVNDLGlCQUFnQjFCLFVBRmhCMEIsR0FBa0IsRUFBSSxLQUFPLFFBS25ELENBRUEsaUJBQU9DLENBQVdDLEdBQ2hCLFlBQXFDemUsSUFBOUJ5ZSxFQUFjQyxZQUE0QkQsRUFBY0MsWUFBY0QsRUFBY0UsU0FDN0YsQ0FFQSxxQkFBT0MsQ0FBZWxiLEVBQU9tYixFQUFVamMsRUFBUWtjLEVBQWNMLEdBQzNELE1BQ005YixFQUFVbWMsRUFEQTNDLEVBQW1CcUMsV0FBV0MsS0FFeEMsZUFBRUYsR0FBbUI1YixFQUUzQixNQUFPLENBQUVDLFNBQVFELFVBQVNHLFdBRFBZLEVBQU1aLFdBQ2F5YixpQkFBZ0I3YSxRQUN4RCxDQUVBLHNCQUFBcWIsQ0FBdUJ2TSxFQUFRaU0sRUFBZ0I5WSxPQUFRcVosR0FBWSxHQUNqRSxNQUNNQyxFQUFRek0sRUFBTzBMLHdCQUVmZ0IsRUFBVVQsRUFFVlUsRUFBV1YsSUFBa0I5WSxPQUU3QnlaLE9BQTZDcGYsSUFBM0J3UyxFQUFPNE0sZ0JBQWdDNU0sRUFBTzRNLGdCQUFrQlgsRUFDbEY3YixFQUFTdWMsRUFBVyw4QkFBZ0Msc0NBRXBETCxFQUFlM0MsRUFBbUJrQyxnQkFFbENnQixHQUFjLElBQUFDLGNBQWFuRCxFQUFtQnlDLGVBQWdCLENBQUNoYyxFQUFRa2MsRUFBY00sRUFBaUJKLEVBQVdFLElBQVVoZCxLQUFLWCxNQUl0SSxPQUFPLElBQXdCNGMsNkJBQTZCLFNBQzFEa0IsRUFBYUwsRUFBV0UsR0FDdkJwVyxNQUNDLElBQUFzVixjQUFhYSxJQUNiLElBQUFNLFdBcEJ5QmpkLEdBQThCLElBQXZCQSxFQUFJaWMsaUJBcUJwQyxJQUFBdGUsS0FBSXljLElBQ0YsTUFBTThDLEVBQWFyRCxFQUFtQnFDLFdBQVdVLEdBR2pELE9BRkF4QyxFQUFFL1osUUFBUThjLGtCQUFvQkMsS0FBS0MsSUFBSXBlLEtBQUs2YSxlQUFpQm9ELEdBQzdEamUsS0FBSzZhLGVBQWlCb0QsRUFDZjlDLElBR2YsQ0FFQSwyQkFBQWtELENBQTRCcE4sR0FFMUIsT0FBTyxJQUF3QjJMLDZCQUE2QixvQkFDMURoQyxFQUFtQnFCLG9CQUFvQnRiLEtBQUtYLE1BQ2hELENBRUEsc0JBQUFzZSxDQUF1QnJOLEdBQ3JCLE1BQU15TSxFQUFRek0sRUFBT3NOLHdCQUdyQixPQUFPLElBQXdCM0IsNkJBQTZCLFNBQzFEaEMsRUFBbUJtQixlQUFlcGIsS0FBS1gsT0FBT3VILE1BQUssSUFBQXNWLGNBQWFhLEdBQ3BFLENBRUEsbUJBQUFjLENBQW9Cdk4sRUFBU2pSLEtBQUs4YSxrQkFDaEMsTUFBTUUsRUFBVS9KLEVBQU93TixPQU92QixPQUFPLFNBTHFCcFYsSUFDMUIsTUFBTTFLLEVBQVFpYyxFQUFtQmMsMEJBQTBCclMsR0FDM0QsT0FBTyxJQUF3QnVULDZCQUE2QnZULEVBQUsxSyxJQUdsQ3FjLEVBQ25DLENBRUEsb0JBQUFDLENBQXFCaEssRUFBU2pSLEtBQUs4YSxrQkFDakMsSUFBSUUsRUFBVSxHQUlkL0osRUFBT3lOLHVCQUF3QixRQUM3QnpOLEVBQU8wTixnQkFBaUIsUUFDeEIxTixFQUFPME4sY0FJVCxNQUFNQyxFQUFVLENBQ2RDLGdCQUFpQjdlLEtBQUtzZSx1QkFBdUIzZCxLQUFLWCxNQUNsRDhlLHFCQUFzQjllLEtBQUtxZSw0QkFBNEIxZCxLQUFLWCxNQUM1RCtlLGdCQUFpQi9lLEtBQUt3ZCx1QkFBdUI3YyxLQUFLWCxNQUNsRGdmLGVBQWdCaGYsS0FBS3ljLDJCQUEyQjliLEtBQUtYLFFBVXZELElBQUFpZixlQVAyQixDQUFDQyxFQUFRclEsRUFBS3NRLEtBQ3BCbE8sRUFBT3BDLElBRXhCbU0sRUFBUXBGLEtBQUtzSixFQUFPak8sS0FJVTJOLEdBR2xDNWUsS0FBS29mLHFCQUFxQm5PLEVBQU95Tix1QkFFakMsTUFBTVcsRUFBWXJmLEtBQUt3ZSxvQkFBb0J2TixHQUczQyxPQUZBK0osRUFBVUEsRUFBUXphLE9BQU84ZSxHQUVsQnJFLENBQ1QsQ0FFQSxvQkFBQW9FLENBQXFCeFcsSUFPTixJQUFUQSxHQUNGNUksS0FBS3NmLHdCQUF3QnRmLEtBQUs4YSxrQkFDL0JyVCxVQVJnQjBULElBQ25CLE1BQU0sT0FBRTlaLEVBQU0sUUFBRUQsRUFBTyxXQUFFRyxFQUFVLE1BQUVZLEdBQVVnWixFQUMvQ25iLEtBQUt3QixtQkFBbUJILEVBQVFELEVBQVNHLEVBQVlZLEVBQ25EbkMsS0FBS2dDLFlBT1gsQ0FFQSx1QkFBQXNkLENBQXdCck8sR0FDdEIsTUFBTXpSLEVBQU1RLEtBQUt1Zix1QkFBdUJ0TyxHQUd4QyxPQURhLElBQUF1TyxPQUFNLEVBQUExWixNQUFPdEcsR0FDZCtILE1BQUssSUFBQTdJLEtBQUlzQixLQUFLdWMsbUJBQW1CNWIsS0FBS1gsT0FDcEQsQ0FFQSxvQkFBQUcsR0FDRSxNQUFPLENBQ0wsNkJBQ0Esa0NBQ0Esb0NBQ0EsMENBQ0Esc0NBQ0Esb0NBQ0EsbUNBQ0Esb0NBQ0Esa0NBQ0EsNEJBQ0EsOEJBQ0EsOEJBQ0EsNkJBQ0EsNkJBQ0Esc0NBQ0Esd0NBQ0EseUNBQ0EsNEJBQ0EsMkJBQ0EsZ0NBQ0Esb0NBQ0EsbUNBQ0Esb0NBQ0EseUNBQ0EsdUNBQ0EsK0NBQ0EsdUNBQ0EsZ0RBQ0Esd0NBQ0Esd0NBQ0EsNkNBQ0EsK0JBQ0EsaUNBQ0EsaUNBQ0EsZ0NBQ0EsaUNBQ0EsNEJBQ0EsNEJBQ0Esc0NBQ0EsNkJBQ0EsK0JBQ0EsNkJBQ0Esd0NBQ0EsdUNBQ0Esa0NBQ0EsNkJBQ0EsK0JBQ0EsK0JBQ0EsZ0NBQ0EsNkJBQ0EsNEJBQ0EsbUNBQ0EsK0JBQ0EsaUNBQ0Esa0NBQ0Esa0NBQ0EsaUNBQ0EsZ0NBQ0EsaUNBQ0EsK0JBQ0Esa0NBQ0EsK0JBQ0EsOEJBQ0EsNEJBQ0EsbUNBQ0EsZ0NBQ0EsZ0NBQ0EsNkJBQ0EsZ0NBQ0EsZ0NBQ0Esc0NBQ0EsNkJBQ0EsOEJBQ0EsNENBQ0EsOEJBQ0EsbUNBQ0EsQ0FBQyxtQ0FBb0MscUJBQ3JDLENBQUMsNkNBQThDLHdCQUMvQywrQkFDQSw4QkFDQSx3Q0FDQSxxQ0FDQSxxQ0FDQSx1Q0FDQSw4QkFDQSw2QkFFSixDQUVBLGlCQUFBc2YsQ0FBa0JuYSxHQUVsQixDQUVBLG9CQUFBb2EsQ0FBcUJwYSxHQUNuQixJQUFJLE9BQUUyTCxFQUFNLEdBQUU4RSxFQUFFLGNBQUVtSCxHQUFrQjVYLEVBQUVsRSxRQUN0QzZQLEVBQVNBLEdBQVUsQ0FBQyxFQUNwQkEsR0FBUyxPQUFValIsS0FBSzhhLGlCQUFrQjdKLEdBRTFDaU0sRUFBZ0JBLEdBQWlCbkgsRUFHakMvVixLQUFLd0IsbUJBRFUsNENBQ2lCLENBQUV1VSxNQUFNQSxHQUV4Qy9WLEtBQUt3ZCx1QkFBdUJ2TSxFQUFRaU0sR0FDakN6VixVQUFVMFQsSUFDVCxNQUFNLE9BQUU5WixFQUFNLFFBQUVELEVBQU8sV0FBRUcsRUFBVSxNQUFFWSxHQUFVZ1osRUFDL0NuYixLQUFLd0IsbUJBQW1CSCxFQUFRRCxFQUFTRyxFQUFZWSxJQUUzRCxDQUVBLGlCQUFBd08sR0FDRTNRLEtBQUsyZix3QkFBMEIsSUFBd0JBLHdCQUF3QmhmLEtBQzdFWCxNQUNGQSxLQUFLdWYsdUJBQXlCLElBQXdCQSx1QkFBdUI1ZSxLQUMzRVgsS0FDSixFLHVGQ3JXRixNQUFNNGYsRUFBWSxJQUFJLElBQ2hCQyxFQUFVLFNBOEtULElBQUlDLEVBQVcsSUE1S3RCLE1Bc0JFLFdBQUF6aEIsR0FDRTJCLEtBQUs2ZixRQUFVQSxDQUNqQixDQUVBLFlBQUkzTyxHQUNGLE9BQU8wTyxDQUNULENBRUEsSUFBQTFSLENBQUsrQyxFQUFTLENBQUMsRUFBR2xTLEdBQVcsR0FtQjNCLElBQXNDLElBQW5DLElBQW1CbUYsWUFDcEIsT0FBSW5GLEVBQ0ssMkRBRVBjLFFBQVFDLEtBQUssdURBT2pCLElBQUlpZ0IsRUFBZ0IsQ0FDbEJDLFlBQVksRUFDWkMsWUFBYSxHQUNiQyxZQUFhLEVBQ2J4ZCxPQUFPLEVBQ1B5ZCxRQUFRLEVBQ1JDLGNBQVUzaEIsRUFDVjRoQixTQVJtQyxvQkFBYkEsU0FBNEJBLGNBQVc1aEIsRUFTN0Q2aEIsY0FBYyxDQUVkLEVBQ0FDLFFBQVEsQ0FFUixFQUNBQyxJQUFLLENBQUMsRUFDTkMsZUFBZ0IsQ0FBQyxFQUNqQkMsU0FBVSxDQUFDLEVBQ1h4UCxTQUFVLENBQ1I2SixPQUFRLENBQ040RCxhQUFjLENBRWQsRUFDQUYsT0FBUSxHQUNSSSxpQkFBaUIsRUFDakJDLHNCQUFzQixFQUN0QkMsaUJBQWlCLEVBQ2pCNEIscUJBQXFCLEVBQ3JCM0IsZ0JBQWdCLEVBQ2hCVCx3QkFBeUIsSUFDekI1Qix3QkFBeUIsS0FHM0J4TCxNQUFPLENBQ0x2RCxLQUFNLFFBQ053RCxRQUFRLEVBQ1JpRixVQUFVLEVBQ1Z1SyxTQUFTLEVBQ1Q1TyxPQUFRLENBQ04sVUFBYyxDQUNaLFVBQWMsY0FPeEIsUUFBZXZULElBQVh3UyxFQUFzQixDQUN4QixNQUFNNFAsRUFBYSxJQUNsQjVQLEVBQVMsSUFBbUI2UCxXQUFXZixFQUFlOU8sRUFBUTJPLEVBQVdpQixFQUk1RSxDQUNBN2dCLEtBQUsrZ0IsVUFBWSxJQUFtQkMsb0JBQW9CL1AsRUFBc0IsZUFDOUVqUixLQUFLbUQsa0JBQXFCa0csR0FBUXVXLEVBQVV6YyxrQkFBa0JrRyxHQUM5RHJKLEtBQUtpaEIsZ0JBQW1COWhCLEdBQVF5Z0IsRUFBVTVQLGVBQWU3USxHQUN6RGEsS0FBS2toQixlQUFrQkMsR0FBbUIsSUFBbUJELGVBQWVDLEdBQzVFbmhCLEtBQUtvaEIsb0JBQXVCclcsR0FBUzZVLEVBQVU1UCxlQUFlakYsR0FDOUQvSyxLQUFLcWhCLGFBQWUsSUFBTTNjLE1BQU1nSyxLQUFLa1IsRUFBVWxoQixJQUFJb0osUUFDbkQsSUFBSXdaLEVBQWEsSUFBSSxJQUFXLENBQUVDLEdBQUcscUJBQ3JDRCxFQUFXRSxZQUFZN0gsU0FBUzhILE1BQ2hDSCxFQUFXL2lCLE1BQU13WCxHQUFHMkwsTUFBTUMsUUFBVSxnREFDcEMvQixFQUFVMVIsUUFFNEIsSUFBbEMsSUFBbUIrQyxPQUFPdk8sUUFDM0IwQixPQUFPd2QsTUFBUSxDQUFDL0IsYUFHbkIsT0FBc0IsSUFBbUI1TyxTQUN6QyxRQUFzQixJQUFtQkEsT0FFM0MsQ0FXQSxtQkFBT29RLEdBQ0wsT0FBTzNjLE1BQU1nSyxLQUFLa1IsRUFBVWxoQixJQUFJb0osT0FDbEMsQ0FPQSx3QkFBTzNFLENBQWtCa0csR0FDdkIsT0FBT3VXLEVBQVV6YyxrQkFBa0JrRyxFQUNyQyxDQVNBLHNCQUFPNFgsQ0FBZ0I3VixHQUNyQixJQUF1QyxJQUFuQyxJQUFtQmxILFlBR3JCLE9BQU8wYixFQUFVNVAsZUFBZTVFLEdBRmhDdkwsUUFBUUMsS0FBSyxpQ0FJakIsRSw2REMvS0YsSUFBSStoQixFQUFpQixJQUNkLE1BQU1DLEVBQ1gsV0FBQXpqQixDQUFZRSxFQUFRLENBQUMsR0FDbkIsSUFBSSxLQUFFRCxFQUFJLE9BQUUyUyxFQUFNLFNBQUU4USxHQUFheGpCLEVBQ2pDeUIsS0FBS3pCLE1BQVFBLE9BRUVFLElBQVh3UyxJQUNGQSxHQUFTLElBQUE1TixPQUFNOUUsSUFHakJ5QixLQUFLMUIsS0FBT0EsR0FBUSxRQUNwQjBCLEtBQUt6QixNQUFNRCxLQUFPQSxFQUNsQjJTLEVBQVM2USxFQUFZRSxtQkFBbUIvUSxFQUFRalIsS0FBSytmLGlCQUNyRC9mLEtBQUt6QixNQUFNd2pCLFNBQVdBLEdBQVlELEVBQVlHLGlCQUU5Q2ppQixLQUFLekIsTUFBTTBTLE9BQVNBLE9BQ014UyxJQUF0QnVCLEtBQUt6QixNQUFNMEosUUFDYmpJLEtBQUttSSxVQUFVbkksS0FBS3pCLE1BQU0wSixPQU05QixDQU9BLFFBQUFpYSxDQUFTQyxHQUVQTixFQUFpQk0sRUFDakJuaUIsS0FBS3pCLE1BQU02akIsV0FBYXBpQixLQUFLekIsTUFBTUQsTUFJQSxJQUEvQnVqQixFQUFlM2QsYUFPbkJsRSxLQUFLcWlCLHFCQUdMcmlCLEtBQUt6QixNQUFNMFMsUUFBUyxJQUFBNU4sT0FBTXJELEtBQUt6QixNQUFNMFMsUUFDckM0USxFQUFlUyxnQkFBZ0J0aUIsS0FBSzFCLEtBQU0wQixLQUFLekIsTUFBTTBTLFFBT3JEalIsS0FBS0QsZUFDTEMsS0FBS3VpQixZQWxCSDFpQixRQUFRQyxLQUNKLGlGQUFpRkUsS0FBSzFCLFNBa0I5RixDQUVBLHNCQUFJa2tCLEdBQ0YsT0FBT1gsQ0FDVCxDQUVBLHlCQUFPRyxDQUFtQi9RLEVBQVMsQ0FBQyxFQUFHOE8sRUFBZ0IvZixLQUFLK2YsaUJBQzFELE9BQU9wZCxPQUFPOGYsT0FBTzFDLEVBQWU5TyxFQUN0QyxDQUVBLGtCQUFPeVIsQ0FBWXBrQixFQUFNMlMsSUFDWSxJQUEvQjRRLEVBQWUzZCxZQUNqQnJFLFFBQVFDLEtBQUssNENBQTRDeEIseUNBR3pEdWpCLEVBQWVTLGdCQUFnQmhrQixFQUFNMlMsRUFFekMsQ0FFQSx3QkFBTzBSLENBQWtCQyxFQUFVUixFQUFZUyxHQUc3QyxPQUFtQixLQUZBLElBQUFDLGdCQUFjLElBQUFyZSxJQUFHOUIsUUFBUyxDQUFDLFNBQVUsVUFBV3lmLEdBQWhELENBQTZEUSxLQUdoRCxJQUExQkEsRUFBUzNSLE9BQU92TyxPQUNsQjdDLFFBQVFDLEtBQUssOEJBQThCc2lCLHNCQUV0QyxJQUVUUSxFQUFTM1IsT0FBT3NQLFFBQVE2QixHQUFjUyxFQUMvQkQsRUFBUzNSLE9BQU9zUCxRQUFRNkIsR0FDakMsQ0FFQSxxQkFBT0gsQ0FBZWxNLEdBZ0JwQixPQUFPQSxHQWRZNEQsU0FBU29KLGVBQWUsa0JBRWxCLE1BQ3JCLE1BQU1DLEVBQVcsSUFBSSxJQUFXLENBQzlCekIsR0FBSSxrQkFFTjVILFNBQVM4SCxLQUFLd0IsWUFBWUQsRUFBU0UsVUFDbkMsTUFBTW5OLEVBQUs0RCxTQUFTb0osZUFBZSxpQkFFbkMsT0FEQWhOLEVBQUcyTCxNQUFNQyxRQUFVLCtHQUNaNUwsR0FFVW9OLEVBSXZCLENBRUEsU0FBQWhiLENBQVVGLEdBQ3dCLFVBQTVCQSxFQUFPNUosWUFBWUMsT0FDckIySixFQUFTLENBQUNBLElBTVpBLEVBQU83QyxRQUpXOEMsR0FDVCxJQUFJQSxFQUFXbEksTUFJMUIsQ0FFQSxrQkFBQXFpQixHQUdFcmlCLEtBQUtvakIsNkJBQ1AsQ0FFQSwyQkFBQUEsR0FDRSxNQUFNQyxFQUFpQnJqQixLQUFLekIsTUFBTThrQixnQkFBa0IsR0FDOUNDLEVBQWUsSUFBbUJDLGlCQUFpQixVQUVuREMsRUFBZ0JILEVBQWU3YixPQUFPekcsSUFBUXVpQixFQUFhN0UsT0FBT3hhLFNBQVNsRCxJQUc3RXlpQixFQUFjL2pCLE9BQVMsR0FDekJJLFFBQVFDLEtBQ0osV0FBV0UsS0FBS3pCLE1BQU1ELDZEQUEwRGtsQixFQUFjaFUsS0FBSyxZQUczRyxDQUVBLGFBQUF1USxHQUNFLE1BQU8sQ0FFUCxDQUNGLENBRUEsWUFBQWhnQixHQUVBLENBRUEsUUFBQXdpQixHQUVBLEUsb0VDckpLLE1BQU1rQixFQTZDWCxXQUFBcGxCLENBQVltQyxFQUFTQyxFQUFZMUIsRUFBVXVILElBQ3pDLFNBQTJCLEdBSTNCdEcsS0FBSzBqQixPQUFTRCxFQUFpQkUsU0FBU25qQixHQUN4Q1IsS0FBSzRqQixLQUFPSCxFQUFpQkksT0FBT3JqQixHQUNwQ1IsS0FBSzhqQixjQUFnQkwsRUFBaUJNLGdCQUFnQnZqQixHQUN0RFIsS0FBS2drQixlQUFpQlAsRUFBaUJRLGlCQUFpQnpqQixHQUN4RFIsS0FBS2trQixpQkFBNkJ6bEIsSUFBZmdDLEVBQTJCQSxFQU50QjBhLEdBQU10YixRQUFRc2tCLElBQUksa0JBQW1CaEosR0FPN0RuYixLQUFLMEMsV0FBMEJqRSxJQUFsQitCLEVBQVFrQyxPQUFzQmxDLEVBQVFrQyxNQUNuRDFDLEtBQUtrQyxZQUFjb0UsRUFFbkIsTUFBTTFGLEVBQWEsQ0FDakJqQyxNQUFPcUIsS0FBS3JCLE1BQ1oyQyxJQUFLdEIsS0FBS3NCLElBQ1Y4aUIsY0FBZXBrQixLQUFLb2tCLGNBQ3BCQyxhQUFjcmtCLEtBQUtxa0IsYUFDbkIzaEIsTUFBTzFDLEtBQUswQyxRQUVHLElBQWIzRCxHQUNGMGtCLEVBQWlCYSxpQkFBaUIxakIsRUFBWVosS0FBS2trQixZQUFhbGtCLEtBQUtrQyxZQUV6RSxDQUVBLHVCQUFPb2lCLENBQWlCL2xCLEVBQU9rQyxFQUFZeUIsR0FDekMsTUFBTSxNQUFFdkQsRUFBSyxJQUFFMkMsRUFBRyxjQUFFOGlCLEVBQWEsYUFBRUMsRUFBWSxNQUFFM2hCLEdBQVVuRSxFQUVyRGdtQixHQUFtQixJQUFWN2hCLEVBREt5WSxHQUFLdGIsUUFBUXNrQixJQUFJLGdCQUFpQmhKLEVBQUcsQ0FBRTdaLE1BQUs4aUIsZ0JBQWVDLGVBQWNuaUIsZ0JBQy9DLE9BZ0N4Q3NpQixHQUFZLElBQUE5VixNQUFLdEssT0FBT3FnQixNQUFNbmpCLEVBQUs4aUIsSUFDdEM3YyxNQUFLLElBQUFtZCxLQUFJSCxJQUFTLElBQUFJLFNBQVFDLElBQUssSUFBQWxXLE1BQUtrVyxFQUFFUCxRQUNyQyxJQUFBM2xCLEtBaENlLENBQUNtbUIsSUFDbEIsTUFBTUMsRUFBVyxDQUFFNWlCLGNBQWFaLE1BQUsraUIsZUFBY0QsaUJBRW5ELE9BQVEzZCxJQUNOLE1BQU1zZSxHQUE2QyxJQUEzQnhtQixHQUFPd21CLGdCQUUvQixHQUFJQSxFQUFpQixDQUNuQixNQUFNQyxFQUEwQixvQkFBWkMsU0FBMkJBLFFBQVFELElBQ25ELGFBQ0EsY0FFRUUsRUFBTSxpRUFBaUU1akIsdUhBRTdFLEdBQVksZUFBUjBqQixFQUNGLE1BQU0sSUFBSUcsTUFBTSx5RkFBeUY3akIsT0FFekd6QixRQUFRQyxLQUNOLEtBQUtvbEIsSUFDTCwrQkFHTixDQUVBLE1BQU1FLEVBQWdCTCxFQUFrQnRlLEdBQU8sUUFBYUEsR0FDNUQsT0FBT29lLEVBQVVPLEVBQWVOLEtBUTVCTyxDQUFXMW1CLEtBQ2YsSUFBQTJtQixZQUVKZCxFQUFVZSxVQUVWZixFQUFVL2MsVUFBVWhILEVBQ3RCLENBRUEsZUFBT2tqQixDQUFTNkIsR0FFZCxPQURjLElBQUE5bEIsVUFBUSxJQUFBVyxXQUFXOGEsR0FBTUEsSUFBSSxJQUFBbFcsTUFBSyxTQUN6Q3dnQixDQUFNRCxFQUNmLENBRUEsYUFBTzNCLENBQU8yQixHQUNaLE1BQU1sa0IsR0FBTSxJQUFBMkQsTUFBSyxNQUFPdWdCLEdBSXhCLFlBSFkvbUIsSUFBUjZDLEdBQ0Z6QixRQUFRQyxLQUFLLG9EQUVSd0IsQ0FDVCxDQUVBLHNCQUFPeWlCLENBQWdCeUIsR0FDckIsT0FBTyxJQUFBbmxCLFdBQVUsUUFBUSxJQUFBNEUsTUFBSyxlQUFnQnVnQixHQUNoRCxDQUVBLFNBQUk3bUIsR0FDRixPQUFPcUIsS0FBSzBqQixNQUNkLENBRUEsT0FBSXBpQixHQUNGLE9BQU90QixLQUFLNGpCLElBQ2QsQ0FFQSxpQkFBSVEsR0FDRixPQUFPcGtCLEtBQUtna0IsY0FDZCxDQUVBLGdCQUFJSyxHQUNGLE9BQU9ya0IsS0FBSzhqQixhQUNkLENBRUEsOEJBQU80QixDQUF3QnZjLEdBRzdCLE9BRnNCLElBQUE0UCxPQUFLLElBQUE0TSxRQUFPaGpCLE9BQVEsU0FBUyxJQUFBakQsVUFBUSxJQUFBK1MsT0FBSyxJQUFBRCxVQUFTLFFBQVN4UCxLQUFLQyxZQUVoRjJpQixDQUFjemMsRUFDdkIsQ0FFQSxpQ0FBTzBjLENBQTJCTCxHQUNoQyxNQUFNTSxHQUFVLElBQUE3VixLQUFJLFFBQ2Q4VixHQUFjLElBQUF6ZSxRQUFPLE1BQU8sVUFDNUI4TixHQUFPLElBQUE3VixTQUFRLENBQUN1bUIsRUFBU0MsSUFDL0IsT0FBTyxJQUFBaE4sTUFBSzNELEdBQU0sSUFBQTRRLE9BQU0sU0FBVSxRQUEzQixDQUFvQ1IsRUFDN0MsQ0FFQSx1QkFBT3ZCLENBQWlCdUIsR0FDdEIsTUFBTWhsQixHQUFVLElBQUFaLE1BQUssQ0FDbkIsU0FDQSxVQUNBLE9BQ0EsT0FDQSxjQUNBLFFBQ0EsV0FDQSxXQUNBLGlCQUNBLFlBQ0EsYUFDQzRsQixHQUNILElBQUlTLEdBQWdCLElBQUFua0IsZ0JBQWUyaEIsRUFBaUJ5QyxjQUFlMWxCLEdBR25FLE9BRkF5bEIsRUFBZ0J4QyxFQUFpQm9DLDJCQUEyQkksR0FDNURBLEVBQWdCeEMsRUFBaUJpQyx3QkFBd0JPLEdBQ2xEQSxDQUNULENBRUEsa0JBQU9DLEdBQ0wsTUFBTyxDQUNMaEgsT0FBUSxNQUNSaUgsUUFBUyxJQUFJQyxRQUFRLENBQ25CQyxPQUFRLHNDQUVWQyxLQUFNLE9BQ05DLFlBQWEsY0FDYkMsTUFBTyxVQUNQQyxTQUFVLFNBQ1ZDLFNBQVUsU0FDVkMsZUFBZ0IsNkJBQ2hCQyxVQUFXLEdBQ1hDLFdBQVcsRUFFZixFLG9EQzlLRixNQUFNQyxHQUFXLElBQUFwbkIsU0FBUSxFQUFBcW5CLEtBQUssSUFBQXRpQixJQUFHQyxRQUMzQnNpQixHQUFhLElBQUF0bkIsU0FBUSxFQUFBcW5CLElBQUssRUFBQXhlLFNBQzFCMGUsR0FBZ0IsSUFBQTFuQixTQUFRLEVBQUMsSUFBQWtGLElBQUdzRSxRQUFTaWUsSUFDckNFLEdBQWdCLElBQUEzbkIsU0FBUSxFQUFDLElBQUFrRixJQUFHQyxPQUFRc2lCLElBQ3BDRyxHQUFhLElBQUF6bkIsVUFBUSxJQUFBSCxTQUFRLENBQUN1bkIsR0FBVSxJQUFBcmlCLElBQUc5QixXQUMzQ3lrQixHQUFxQixJQUFBMW5CLFVBQVEsSUFBQUgsU0FBUSxDQUFDeW5CLEVBQVlGLEdBQVUsSUFBQXJpQixJQUFHOUIsV0FPOUQsTUFBTTBrQixFQW1FWCxXQUFBaHBCLENBQVlpcEIsRUFBVUMsRUFBVSxDQUFDLEVBQUdDLEVBQVl6b0IsR0FDeEJvb0IsRUFBV0csS0FHL0JDLEVBQVVELEVBQ1ZBLEdBQVcsSUFBQXJpQixNQUFLLFdBQVlzaUIsR0FDNUJ4b0IsRUFBV0EsSUFBWSxJQUFBa0csTUFBSyxXQUFZc2lCLElBRzFDLE1BQU1FLEVBQWdCLENBQUNELEdBQVksSUFBQXZpQixNQUFLLGFBQWNzaUIsSUFFdERDLEdBQWEsSUFBQTluQixVQUFRLElBQUE2VixPQUFLLElBQUE5USxJQUFHc0UsU0FBaEIsQ0FBMEIwZSxHQUV2QyxJQUFJbHBCLEdBQVEsSUFBQW1VLE1BQUssQ0FBQyxhQUFjLFFBQVMsV0FBWSxRQUFTLFdBQVksZUFBZ0I2VSxRQUNwRTlvQixJQUFsQjhvQixFQUFRaHBCLE1BQ1ZBLEdBQVEsSUFBQStFLFVBQVMsQ0FBQ2lrQixFQUFRaHBCLE1BQU9BLFNBQ0FFLElBQXhCOG9CLEVBQVFHLGNBQ2pCbnBCLEdBQVEsSUFBQStFLFVBQVMsQ0FBQ2lrQixFQUFRRyxZQUFhbnBCLEtBR3pDZ3BCLEVBQVFHLFlBQWNucEIsRUFFdEIsTUFBTSxZQUFFbXBCLEdBQWdCSCxFQUVsQkksRUFBMkJWLEVBQWNLLEdBQVlELEVBQXFCTyxlQUFlLENBQUNOLEdBQVdFLFFBQWMvb0IsRUFDbkhvcEIsRUFBMkJYLEVBQWNJLEdBQVlELEVBQXFCTyxlQUFlTixFQUFVRSxRQUFjL29CLEVBQ2pIcXBCLEVBQWdCVixFQUFtQk0sR0FBZUwsRUFBcUJVLFdBQVdMLEVBQWFGLFFBQWMvb0IsRUFFbkgsSUFBSXVwQixHQUFhLElBQUFybUIsUUFBTyxFQUFBekMsTUFBTyxDQUFDeW9CLEVBQXlCRSxFQUF3QkMsSUFJakYsTUFBTUcsR0FBa0IsSUFBQTFmLFNBQVF5ZixHQVFoQyxPQU5JQyxJQUNGRCxFQUFhLEVBQUMsSUFBQXJlLFNBQU8sS0FDWSxJQUE3QixJQUFtQmpILFFBQStCLElBQWIzRCxHQUN2Q2MsUUFBUUMsS0FBSyxxREFBcUR3bkIsc0JBQTZCSSw0QkFHbEYsSUFBYjNvQixFQUNLLENBQUV1b0IsV0FBVUksY0FBYUYsYUFBWUQsVUFBU3hvQixXQUFVa3BCLG9CQUcxRCxJQUFBMW9CLFNBQVF5b0IsRUFDakIsQ0FFQSxpQkFBT0QsQ0FBV0csRUFBWUMsR0FDNUIsTUFBTVgsRUFBYVcsRUEwRG5CLE1BeERvQixNQUVsQixJQUFJLElBQUE1ZixTQUFRMmYsR0FDVixPQUFPLElBQUF2ZSxTQUFPLEdBdUJoQnVlLEdBQWEsU0FmYyxDQUFDL29CLEVBQUswUCxFQUFLMUYsS0FDcEMsSUFBSWlmLEVBQVEsRUFBQUMsRUFDWixHQXZJVSxDQUFDbHBCLElBQVEsSUFBQXNGLElBQUdzRSxPQUFRNUosR0F1STFCbXBCLENBQVNucEIsSUF0SUgsQ0FBQ0EsSUFBUSxJQUFBc0YsSUFBRzhqQixRQUFTcHBCLEdBc0lWcXBCLENBQVVycEIsSUFySXJCLENBQUNBLElBQVEsSUFBQXNGLElBQUd1TyxPQUFRN1QsR0FxSVNzcEIsQ0FBU3RwQixHQUxwQnVwQixFQU1JdnBCLEVBQTlCaXBCLEVBTnlDL2UsR0FDcENBLElBQVFxZixNQU1SLElBQW1CLG1CQUFSdnBCLEVBQ2hCLE9BQU9BLEVBQ0YsR0F4SUcsQ0FBQ0EsSUFBUSxJQUFBc0YsSUFBR0MsTUFBT3ZGLEdBd0lsQndwQixDQUFVeHBCLElBQVFnb0IsRUFBV2hvQixHQUt0QyxPQUpBVSxRQUFRQyxLQUNKLG1DQUFtQ1gsd0ZBR2hDaXBCLENBQ1QsQ0FmNEJNLE1BZ0I1QixPQUFPTixHQUU2QkYsR0FHdEMsTUFlTVUsR0FBVSxJQUFBQyxPQUFNWCxHQVN0QixPQUFPLElBQUF4b0IsU0FBUWtwQixFQXhCSUUsSUFDakIsUUFBbUJycUIsSUFBZitvQixFQUNGLE9BQU9zQixFQUVULE1BQU1DLEVBQWdCLENBQUMsRUFPdkIsT0FIQSxJQUFBQyxtQkFIaUIsQ0FBQzVWLEVBQU92RSxLQUN2QmthLEVBQWNsYSxHQUFPdUUsR0FBTSxJQUFBbk8sTUFBSzRKLEVBQUtpYSxLQUVYWixHQUM1QnJvQixRQUFRc2tCLElBQUksd0NBQXdDcUQsb0JBQThCLGdCQUFpQixDQUFFdUIsZ0JBQWVELGdCQUU3R0EsSUFhMEIsSUFBQXpvQixXQUFVLENBQUMsR0FQcEJ1TyxJQUN4QixNQUFNLFFBQUV4TixFQUFPLFdBQUVHLEVBQVUsTUFBRVksR0FBVXlNLEdBQUssQ0FBQyxFQUc3QyxPQUZVak0sT0FBTzhmLE9BQU8sQ0FBQyxFQUFHN1QsRUFBR3JOLEVBQVlZLEVBQU9mLE1BUS9DNm5CLEVBQ1QsQ0FFQSwyQkFBT0MsQ0FBcUIxcEIsRUFBS2dvQixFQUFZMkIsR0FFM0MsTUFBTSxRQUFFL25CLEVBQU8sV0FBRUcsRUFBVSxNQUFFWSxHQUFVZ25CLEdBQWMsQ0FBQyxFQVVoRHBULEVBQUssQ0FBQ3hVLEVBQVlILEdBQVMsSUFBQTZELE1BQUssYUFBYzlDLEdBQVFnbkIsR0FBWXhULE9BUm5ELENBQUNaLEVBQUtxVSxLQUN6QixNQUFNclQsR0FBSyxJQUFBOVEsTUFBSyxLQUFNbWtCLEdBSXRCLE9BSEkvQixFQUFxQnRpQixlQUFlZ1IsU0FBZXRYLElBQVJzVyxJQUM3Q0EsRUFBTWdCLEdBRURoQixRQUdvRnRXLEdBR3ZGNHFCLEVBQWNDLEdBQWNBLEVBQVVDLFlBQVksR0FHbERDLEVBQW9CQyxJQUV4QixNQUFNQyxFQUFVaGxCLE1BQU1nSyxLQUFLaUwsU0FBU2dRLGlCQUFpQkYsSUFFckQsT0FBTyxTQUFLSixFQUFZSyxJQUcxQixRQUFtQmpyQixJQUFmK29CLEVBQTBCLENBQzVCLE1BQU1vQyxHQUF5QixJQUFBbHFCLFNBQVEsRUFBQW1xQixTQUFTLFNBQUtMLEdBQXRCLENBQXlDaHFCLEdBQ2xFc3FCLEVBQWV0cUIsRUFDckJLLFFBQVFza0IsSUFBSSx3Q0FBd0NxRCxvQkFBOEIsZ0JBQWlCLENBQUV6UixLQUFJK1QsZUFBY0YsMEJBQ3pILENBR0EsR0FBb0IsaUJBQVQsRUFDVCxPQUFPLEVBSVQsTUFBTUcsR0FBZ0IsSUFBQXJxQixTQUFRLEVBQUFtcUIsU0FBUyxTQUFLTCxHQUF0QixDQUF5Q2hxQixHQUMvRCxPQUErQixLQUEzQixJQUFBK0ksU0FBUXdoQixLQUlMLElBQUFDLE1BQUksSUFBQXpmLFNBQU8sR0FBT3dmLEVBQzNCLENBRUEscUJBQU9obEIsQ0FBZVIsR0FLcEIsT0FKSSxJQUFBRSxJQUFHc0UsT0FBUXhFLEtBQ2JBLEVBQUlvVixTQUFTc1EsY0FBYzFsQixLQUd0QixJQUFBN0UsVUFBUSxJQUFBc0YsS0FBSSxJQUFJLElBQUEzRSxZQUFXLElBQUksSUFBQTRFLE1BQUssWUFBcEMsQ0FBaURWLEVBQzFELENBRUEscUJBQU9xakIsQ0FBZXNDLEVBQWExQyxHQUNqQyxNQUFNaG9CLEdBQU0sSUFBQW1DLFFBQU8sRUFBQTRHLFFBQVMyaEIsR0FFNUIsT0FEcUIsSUFBQXRPLE9BQU15TCxFQUFxQjZCLHFCQUN6Q2lCLENBQWEzcUIsRUFBS2dvQixFQUMzQixFLGFDaFJGLFNBQVM0QyxFQUFrQmpyQixHQUV6QixPQURzQkEsR0FBc0IsaUJBQVJBLEdBQzRCLG9CQUF4Q3dELE9BQU9DLFVBQVV5bkIsU0FBU3ZuQixLQUFLM0QsSUFBc0Usa0JBQXhDd0QsT0FBT0MsVUFBVXluQixTQUFTdm5CLEtBQUszRCxFQUN0SCxDQU1BLFNBQVNtckIsRUFBaUJsWCxFQUFPbVgsR0FFL0IsT0FEY0EsSUFBNkMsSUFBMUJBLEVBQWdCbG5CLE9BQ2hDK21CLEVBQWtCaFgsR0FDL0JvWCxHQVBlcnJCLEVBT09pVSxFQU5uQjFPLE1BQU0rbEIsUUFBUXRyQixHQUFPLEdBQUssQ0FBQyxHQU85QmlVLEVBQU9tWCxHQUNQblgsRUFUTixJQUFxQmpVLENBVXJCLENBRUEsU0FBU3VyQixFQUFrQi9QLEVBQVF0UCxFQUFRa2YsR0FDekMsTUFBTUksRUFBY2hRLEVBQU9pUSxRQVUzQixPQVRBdmYsRUFBT2pHLFFBQVEsU0FBU0UsRUFBRzZaLFFBQ0ssSUFBbkJ3TCxFQUFZeEwsR0FDckJ3TCxFQUFZeEwsR0FBS21MLEVBQWlCaGxCLEVBQUdpbEIsR0FDNUJILEVBQWtCOWtCLEdBQzNCcWxCLEVBQVl4TCxHQUFLcUwsRUFBVTdQLEVBQU93RSxHQUFJN1osRUFBR2lsQixJQUNULElBQXZCNVAsRUFBT1osUUFBUXpVLElBQ3hCcWxCLEVBQVkvVSxLQUFLMFUsRUFBaUJobEIsRUFBR2lsQixHQUV6QyxHQUNPSSxDQUNULENBbUJBLFNBQVNILEVBQVU3UCxFQUFRdFAsRUFBUWtmLEdBQ2pDLE1BQU1NLEVBQVFubUIsTUFBTStsQixRQUFRcGYsR0FFdEJ5ZixHQURVUCxHQUFtQixDQUFFTyxXQUFZSixJQUN0QkksWUFBY0osRUFFekMsT0FBSUcsRUFDS25tQixNQUFNK2xCLFFBQVE5UCxHQUNqQm1RLEVBQVduUSxFQUFRdFAsRUFBUWtmLEdBQzNCRCxFQUFpQmpmLEVBQVFrZixHQXpCakMsU0FBcUI1UCxFQUFRdFAsRUFBUWtmLEdBQ25DLE1BQU1JLEVBQWMsQ0FBQyxFQWFyQixPQVpJUCxFQUFrQnpQLElBQ3BCaFksT0FBT21GLEtBQUs2UyxHQUFRdlYsUUFBUSxTQUFTeUosR0FDbkM4YixFQUFZOWIsR0FBT3liLEVBQWlCM1AsRUFBTzlMLEdBQU0wYixFQUNuRCxHQUVGNW5CLE9BQU9tRixLQUFLdUQsR0FBUWpHLFFBQVEsU0FBU3lKLEdBQzlCdWIsRUFBa0IvZSxFQUFPd0QsS0FBVThMLEVBQU85TCxHQUc3QzhiLEVBQVk5YixHQUFPMmIsRUFBVTdQLEVBQU85TCxHQUFNeEQsRUFBT3dELEdBQU0wYixHQUZ2REksRUFBWTliLEdBQU95YixFQUFpQmpmLEVBQU93RCxHQUFNMGIsRUFJckQsR0FDT0ksQ0FDVCxDQVlXSSxDQUFZcFEsRUFBUXRQLEVBQVFrZixFQUV2QyxDLGlCQUVBQyxFQUFVbnJCLElBQU0sU0FBc0J3ckIsRUFBT04sR0FDM0MsSUFBSzdsQixNQUFNK2xCLFFBQVFJLElBQVVBLEVBQU1wckIsT0FBUyxFQUMxQyxNQUFNLElBQUkwbEIsTUFDUixnRUFJSixPQUFPMEYsRUFBTWxWLE9BQU8sU0FBU3FWLEVBQU0vZixHQUNqQyxPQUFPdWYsRUFBVVEsRUFBTS9mLEVBQU1zZixFQUMvQixFQUNGLEMsd0ZDdkVBLE1BT01VLEVBQVlDLE1BQU03Z0IsRUFBSS9ILEtBVTFCOEIsT0FBT3FGLFdBTGdCeWhCLGdCQUhkLElBQUlDLFFBQVFDLEdBQVczaEIsV0FBVzJoQixFQUk3QixJQUNaaG5CLE9BQU9pbkIsc0JBQXNCaGhCLElBR0cvSCxJQUc5QmdwQixFQUFzQm5pQixJQUMxQixRQUE2QjFLLElBQXpCMEssRUFBSTlLLFlBQVlDLEtBQ2xCLE9BQU82SyxFQUFJOUssWUFBWUMsS0FFekIsTUFDTStLLEVBQU1GLEVBQUlraEIsV0FDaEIsT0FBTyxJQUFBaHFCLFdBQVUwSSxPQUFPTSxHQUFLa2lCLE9BQU8sRUFBRyxLQUFLLElBQUF2WCxPQUZqQyw0QkFFMkMzSyxHQUFLLEtBeUJ2RG1pQixFQUF5QixDQUFDcmlCLEVBQUtFLFNBQ2xCNUssSUFBYjBLLEVBQUlFLEdBQ0NBLEdBR3lCLElBQUEzSixTQUFRLEVBQUF1SixNQUFNLElBQUF6QixTQUFPLElBQUE5SCxVQUFRLElBQUFtVSxNQUFLLEVBQUFvRixHQUFJNVAsR0FEdkRvaUIsR0FBSyxJQUFJblcsT0FBT21XLEtBRTFCQyxFQUEwQixJQUFBNWpCLE1BQUtxQixJQWlCbEN3aUIsRUFBNEJDLElBQ2hDLE1BQU16aUIsRUFBTSxDQUFDLEVBQ2IsSUFBSyxNQUFNdUIsS0FBS2toQixFQUNkemlCLEVBQUl1QixHQUFLa2hCLEVBQU9saEIsR0FFbEIsT0FBT3ZCLEdBNkJIMGlCLEVBQTZCMWlCLElBQ2pDLE1BQU02ZCxHQUFhLElBQUF0bkIsVUFBUSxJQUFBc1osWUFBVyxFQUFBelEsU0FBVSxFQUFBVSxLQUFNLEVBQUF0SixRQUNoRG1zQixHQUFXLElBQUFwc0IsVUFBUSxJQUFBc1osWUFBVyxFQUFBOVosT0FBUSxFQUFBK0osS0FBTSxFQUFBdEosUUFFbEQsT0FEOEIsSUFBQUosU0FBUSxDQUFDeW5CLEVBQVk4RSxHQUM1Q0MsQ0FBc0I1aUIsSUFnQi9CLFNBQVM2aUIsRUFBa0JDLEVBQVVDLEVBQWlCLElBRXBELE1BQ01DLEdBQXlCLElBQUE1ckIsUUFESCxDQUFDLFNBQVUsT0FBUSxZQUFhLGVBQ0QyckIsR0FHckRFLEdBQW1CLElBQUExc0IsVUFBUSxJQUFBMnNCLFNBQVFGLEdBQXlCLEVBQUFHLE1BRzVEMU4sRUFBVXdOLEVBQ2R6cEIsT0FBT3dDLG9CQUFvQjhtQixFQUFTNXRCLFlBQVl1RSxZQUk1QzJwQixFQUFnQkgsRUFDcEJ6cEIsT0FBT3dDLG9CQUFvQjhtQixFQUFTNXRCLGNBS3RDLE1BQU8sQ0FBRXVnQixVQUFTMk4sZ0JBQWVDLFlBRmQsSUFBQWpzQixRQUFPcWUsRUFBUzJOLEdBR3JDLEMsNENDckpPLFNBQVNFLElBS2RoakIsV0FKZ0IsTUFFZCxJQUFBckUsU0FEY3FQLE1BQ0N6VSxPQUVHLEVBQ3RCLEMsYUNQTyxTQUFTMHNCLElBQ2QsTUFBTyxDQUNMQyxlQUFnQixXQUNkLE1BQU1DLEVBQUssSUFBSUMsUUFDVEMsRUFBUyxDQUFFQyxLQUFNL3NCLEtBQUt6QixNQUFNd3VCLE1BRWxDLE9BREFILEVBQUdqcEIsSUFBSW1wQixFQUFROXNCLEtBQUt6QixPQUNiLENBQ0xzUSxJQUFLaWUsRUFDTEUsUUFBU0osRUFFYixFQUNBSCxHQUFJLFdBQ0YsSUFBSyxNQUFNaFksS0FBS3pVLFlBQ1BBLEtBQUt5VSxFQUdoQixFQUNBd1ksU0FBVSxXQUlSLE9BRGtCOU8sS0FBSytPLFNBQVM3QyxTQUFTLElBQUk5VixRQUFRLE9BQVEsSUFBSTRZLFVBQVUsRUFBRyxFQUdoRixFQUNBQyxhQUFjLFNBQVMxcUIsR0FDckIsT0FBaUIsSUFBVkEsRUFDSDdDLFFBQVFza0IsSUFDUixNQUVOLEVBRUosQywwREM3Qk8sU0FBU2tKLElBQ2QsTUFBTyxDQUNMQyxTQUFVLFNBQVNqa0IsR0FDakJ4SixRQUFRc2tCLElBQUksbUJBQW9COWEsRUFDbEMsRUFDQWtrQixpQkFBa0IsU0FBU3ppQixFQUFLckUsR0FFOUIsT0FBTyxJQUFJLElBQWtCLGdCQUFpQnFFLEVBQUtyRSxFQUFNLFlBQzNELEVBQ0ErbUIsY0FBZSxTQUFTMWlCLEVBQUtyRSxHQUMzQixPQUFPLElBQUksSUFBa0IsYUFBY3FFLEVBQUtyRSxFQUFNLFlBQ3hELEVBMEJKLEMsb0RDckNPLE1BQU1nbkIsRUFDWCxXQUFBcHZCLENBQVlxdkIsR0FDVixNQUFNcHZCLEVBQU95SyxPQUFPMmtCLEVBQUludkIsTUFBTUQsTUFDeEJpakIsRUFBSyxHQUFHampCLGtCQUdkLE9BRCtCLElBQUFzZCxPQUFNNlIsRUFBb0JFLDZCQUNsREMsQ0FBdUIsQ0FBRXJNLEtBQUlqakIsUUFDdEMsQ0FFQSxtQ0FBT3F2QixDQUE2QnB2QixFQUFPa0ksR0FDekMsTUFBTSxLQUFFbkksRUFBSSxHQUFFaWpCLEdBQVFoakIsRUFDaEI2QyxFQUFVcUYsRUFDVm9uQixFQUFLLElBQUksSUFBVyxDQUN4QnRNLEtBQUlqakIsT0FBTW1JLFNBR1pvbkIsRUFBR0MsV0FBYSxLQUNkRCxFQUFHRSxrQkFBa0IsZ0JBQWlCM3NCLElBR3hDeXNCLEVBQUdHLHFCQUF1QixLQUN4QkgsRUFBR0kscUJBR0xKLEVBQUdLLGNBQ0wsRSxvREN4QkYsTUFpRGFDLEVBQVksU0FBUzVwQixHQUNoQyxNQUFNLG1CQUFFNnBCLEdBQXVCN3BCLEVBQy9CLFFBQTJCOUYsSUFBdkIydkIsRUFBa0MsQ0FDcEMsTUFBTUMsRUFBcUIsSUFBbUJDLGdCQUFnQkYsR0FDOUQsR0FBa0MsbUJBQXZCQyxFQUNULE1BeEM4QixFQUFDRSxFQUFVRixLQUM3QyxNQUFNLG1CQUFFRCxHQUF1QkcsT0FFSjl2QixJQUF2QjJ2QixHQUNGdnVCLFFBQVEyTixNQUFNLDhCQUErQitnQixHQUcvQyxNQUFNQyxFQUFzQixDQUFDN1QsRUFBUThULEtBQ25DLE1BQU1DLEdBQWlCLElBQUFwdUIsTUFBS211QixFQUFTRixJQUMvQixpQkFBRUksRUFBZ0IsZUFBRUMsR0FBbUJGLEVBQzdDLE9BQU9DLEVBQW1CTixFQUFtQjFULEVBQVFpVSxHQUFrQmpVLEdBR25Fa1UsRUFBVUwsR0FBb0IsSUFBQW5yQixPQUFNa3JCLEdBQVcsSUFFL0NPLEVBQWdCLENBQUNDLEVBQVNDLEtBQzlCLE1BQU1DLEVBQVdELEdBQVksR0FVN0Jyc0IsT0FBT3VzQixRQUFRSCxHQUFTM3BCLFFBVFIsRUFBRXlKLEVBQUs1SixNQUNyQixNQUFNMkksRUFoQ1EsQ0FBQzBKLElBQ25CLElBQUkxSixTQUFjMEosRUFVbEIsTUFUSSxDQUFDLFNBQVUsVUFBVyxVQUFVclQsU0FBUzJKLEdBQzNDQSxFQUFPLFlBQ1csV0FBVEEsSUFDTGxKLE1BQU0rbEIsUUFBUW5ULEdBQ2hCMUosRUFBTyxRQUNVLE9BQVIwSixJQUNUMUosRUFBTyxjQUdKQSxHQXFCVXVoQixDQUFZbHFCLEdBQ25CbXFCLEVBQWEsSUFBSUgsR0FDdkJHLEVBQVd4WixLQUFLL0csR0FDSCxXQUFUakIsR0FBOEIsVUFBVEEsSUFDdkJtaEIsRUFBUWxnQixHQUFPMmYsRUFBb0J2cEIsRUFBTW1xQixHQUN6Q04sRUFBYzdwQixFQUFNbXFCLE9BUzFCLE9BSEFOLEVBQWNELEdBR1BBLEdBUUlRLENBQTRCOXFCLEVBQUc4cEIsRUFFMUMsQ0FFQSxNQUFNN3BCLEdBQVEsSUFBQUMsSUFBR0MsT0FDWEMsR0FBUSxJQUFBRixJQUFHOUIsUUFDRmlDLE1BRWYsT0FGbUMsSUFBZEosRUFBTkksRUFDV0wsS0FEZ0MsSUFBZEksRUFBTUMsSUFFOUIsSUFBQWxGLFNBQVEsRUFBQW1GLFVBQVcsRUFBQUMsUUFBUyxFQUFBekIsTUFBNUIsQ0FBbUNrQixJQUFLLElBQUFsQixPQUFNa0IsRUFDcEUsQyx5RkM5REEsSUFBSStxQixFQUNBQyxHQUFlLEVBQ2ZDLEdBQWMsRUFLbEIsTUFBTUMsRUFBcUIsQ0FDekJDLGFBQWMsQ0FDWixJQUFLLElBQUssSUFBSyxLQUFNLFNBQVUsSUFBSyxJQUFLLEtBQU0sS0FBTSxLQUFNLEtBQU0sS0FBTSxLQUFNLEtBQU0sS0FDbkYsYUFBYyxNQUFPLE9BQVEsT0FBUSxNQUFPLFVBQVcsVUFBVyxRQUNsRSxTQUFVLFNBQVUsS0FBTSxLQUFNLEtBQU0sS0FBTSxLQUFNLEtBQ2xELFFBQVMsUUFBUyxRQUFTLEtBQU0sS0FBTSxLQUFNLE1BQU8sU0FBVSxhQUM5RCxRQUFTLFNBQVUsU0FBVSxRQUFTLFNBQVUsUUFBUyxRQUUzREMsU0FBVSxDQUFDLFNBQVUsUUFBUyxTQUFVLFFBQ3hDQyxhQUFjLENBQ1osT0FBUSxNQUFPLE1BQU8sUUFBUyxRQUFTLFFBQVMsU0FBVSxRQUFTLFNBQVUsTUFDOUUsV0FBWSxTQUFVLE9BQVEsT0FBUSxRQUV4Q0MsaUJBQWlCLEVBQ2pCQyxZQUFhLENBQUMsVUFBVyxTQUFVLFVBQVcsY0FBZSxVQUFXLFNBQVUsWUFDbEZDLFlBQWEsQ0FBQyxTQUFVLFNBQVUsUUFBUyxRQUMzQ0MsaUJBQWtCLHlDQUdkQyxFQUFlLENBQ25CRixZQUFhLENBQUMsU0FBVSxTQUFVLFNBQVUsUUFBUyxPQUFRLFFBQVMsU0FBVSxPQUFRLFFBQ3hGRCxZQUFhLENBQUMsVUFBVyxTQUFVLFVBQVcsY0FBZSxVQUFXLFNBQVUsWUFDbEZELGlCQUFpQixHQU1iSyxFQUFxQixLQUN6QixJQUNFLE1BQU01SixFQUFPLEtBQW9CQSxNQUFRLGFBQ3pDLEdBQWEsY0FBVEEsR0FBaUMsZ0JBQVRBLEVBQXdCLE1BQU8sVUFDN0QsQ0FBRSxNQUFPaGhCLEdBRVQsQ0FDQSxNQUFPLE9BSVQsU0FBUzZxQixFQUFlN0osRUFBTyxPQUs3QixNQUFNOEosRUFBZSxhQUFUOUosRUFBc0JtSixFQUFxQlEsRUFFdkQsT0FBUUksSUFDTixJQUFJQyxFQUFRLGFBQW1CRCxFQUFNRCxHQVVyQyxNQVBhLGFBQVQ5SixJQUNGZ0ssRUFBUUEsRUFBTS9iLFFBQVEsd0JBQTBCUCxHQUN2Q0EsRUFBTU8sUUFBUSwyQkFBNEIsQ0FBQ0UsRUFBRzhiLEVBQU1weEIsSUFDbERzVixLQUlONmIsRUFFWCxDQUtBLE1BQU1FLEVBQXdCLENBQUN2ZixFQUFTLENBQUMsS0FDdkMsR0FBSXNlLEVBRUYsWUFEQTF2QixRQUFRQyxLQUFLLHVFQUlmLE1BQU0sT0FBRXFnQixHQUFTLEdBQVVsUCxFQUNyQndmLEVBQWtCbkssSUFDdEIsTUFBTW9LLEVBQWNQLEVBQWU3SixHQUM3QnJCLEVBQVc5bEIsSUFDZixHQUFJdUYsTUFBTStsQixRQUFRdHJCLEdBQU0sT0FBT0EsRUFBSVQsSUFBSXVtQixHQUN2QyxHQUFJOWxCLEdBQXNCLGlCQUFSQSxFQUFrQixDQUNsQyxNQUFNd3hCLEVBQU0sQ0FBQyxFQUNiLElBQUssTUFBT2hpQixFQUFHQyxLQUFNak0sT0FBT3VzQixRQUFRL3ZCLEdBQ2xDd3hCLEVBQUloaUIsR0FBbUIsaUJBQU5DLEVBQWtCOGhCLEVBQVk5aEIsR0FBS3FXLEVBQVFyVyxHQUU5RCxPQUFPK2hCLENBQ1QsQ0FDQSxNQUF1QixpQkFBUnh4QixFQUFvQnV4QixFQUFZdnhCLEdBQU9BLEdBRXhELE9BQU84bEIsR0FHVHFLLEVBQWdCLENBQUM3b0IsRUFBTStlLEVBQU8sQ0FBQyxLQUM3QixNQUFNLGdCQUFFVCxHQUFrQixFQUFLLEtBQUV1QixHQUFTZCxFQUVwQ29MLEVBQWdCdEssSUFERGtKLEdBQWVyUCxFQUNVLE1BQVErUCxLQUN0RCxPQUFJbkwsRUFBd0J0ZSxFQUNyQmdxQixFQUFlRyxFQUFmSCxDQUE4QmhxQixJQUd2QytwQixFQUFzQkssa0JBQW9CLENBQUNwcUIsRUFBTTZmLEtBQy9DLE1BQU13SyxFQUFZeEssR0FBUTRKLElBQzFCLE9BQU9PLEVBQWVLLEVBQWZMLENBQTBCaHFCLElBR25DOG9CLEdBQWUsR0E0Qlh3QixFQUFzQixDQUFDaGIsRUFBSXVRLEtBQy9CLElBQUt2USxFQUFJLE9BQ1QsTUFDTTJhLEVBQWNQLEVBREU3SixHQUFRNEosS0FHeEJjLEVBQVksaUZBQ2xCLEdBQXdCLGlCQUFiamIsRUFBRzNDLE9BQXNCNGQsRUFBVW5kLEtBQUtrQyxFQUFHM0MsT0FBUSxDQUM1RCxNQUFNa2QsRUFBUUksRUFBWTNhLEVBQUczQyxPQUN6QmtkLElBQVV2YSxFQUFHM0MsUUFBTzJDLEVBQUczQyxNQUFRa2QsRUFDckMsQ0FDQSxHQUFJdmEsRUFBR2tiLG1CQUE2QyxpQkFBakJsYixFQUFHbWIsV0FBMEJGLEVBQVVuZCxLQUFLa0MsRUFBR21iLFdBQVksQ0FDNUYsTUFBTVosRUFBUUksRUFBWTNhLEVBQUdtYixXQUN6QlosSUFBVXZhLEVBQUdtYixZQUFXbmIsRUFBR21iLFVBQVlaLEVBQzdDLEdBSUlhLEVBQTZCLENBQUN2b0IsR0FBTyxLQUFXNG1CLElBQWdCNW1CLEdBU3RFLEVBaERxQixDQUFDbkMsRUFBTStlLEVBQU8sQ0FBQyxLQUNsQyxJQUFLK0osRUFDSCxNQUFNLElBQUlwSyxNQUFNLHVFQUdsQixPQUFPbUssRUFBYzdvQixFQUFNK2UsRywyREN4SDdCLElBQUk0TCxFQUNBN0IsR0FBZSxFQUVuQixNQUFNOEIsRUFBeUJwZ0IsSUFDN0IsR0FBS3NlLEVBZ0JIMXZCLFFBQVFDLEtBQUssMkVBaEJJLENBQ2pCLEdBQUltUixFQUFPa1AsT0FDVCxHQUFJL2IsT0FBT2t0QixhQUFjLENBQ3ZCLE1BQU1DLEVBQVNudEIsT0FBT2t0QixhQUFhRSxhQUFhLFVBQVcsQ0FDekRDLFdBQWFDLEdBQWMsYUFBbUJBLEVBQVcsQ0FBRUMscUJBQXFCLE1BR2xGUCxFQUFpQmYsR0FBU2tCLEVBQU9FLFdBQVdwQixFQUM5QyxNQUNFZSxFQUFpQmYsR0FBUyxhQUFtQkEsUUFHL0NlLEVBQWlCZixHQUFTQSxFQUU1QmQsR0FBZSxDQUNqQixHQWFGLEVBUnNCYyxJQUNwQixJQUFLZCxFQUNILE1BQU0sSUFBSXBLLE1BQU0seUZBRWxCLE9BQU9pTSxFQUFjZixHLHNFQ3pCdkIsSUFBSXVCLEVBQ0FoUyxFQUNBaVMsRUFDQUMsRUFDQUMsR0FBUyxFQUNUQyxHQUFvQixFQUN4QixNQUFNQyxFQUE4QixHQUVwQyxJQUNJQyxFQUNBQyxFQUNKLE1BQU1DLEVBQXlCLEdBQ3pCQyxFQUFjLElBQUkvakIsSUFPbEJna0IsRUFBc0IsSUFBSSxJQW9SbkI5UCxFQUFxQixJQWxSbEMsTUFDRSxXQUFBbmtCLEdBQ0V5ekIsR0FBZSxDQUNqQixDQUVBLGVBQUk5cUIsR0FDRixPQUFPNnFCLENBQ1QsQ0FFQSxlQUFJM3RCLEdBQ0YsT0FBTzR0QixDQUNULENBRUEsVUFBSTdnQixHQUNGLE9BQU8yZ0IsQ0FDVCxDQUVBLFNBQUlsdkIsR0FDRixPQUFPcXZCLENBQ1QsQ0FXQSxtQkFBTzFRLEdBQ0wsT0FBTzNjLE1BQU1nSyxLQUFLa1IsRUFBVWxoQixJQUFJb0osT0FDbEMsQ0FFQSxVQUFBZ1osQ0FBV2YsRUFBZ0IsQ0FBQyxFQUFHOU8sRUFBUyxDQUFDLEVBQUdqSyxFQUFhNlosR0FrQnZELE9BakJBakIsRUFBWTVZLEVBQ1o0cUIsR0FBVSxPQUFVN1IsRUFBZTlPLEdBRS9CMmdCLEVBQVExZ0IsVUFBWTBnQixFQUFRMWdCLFNBQVNDLFFBRXZDeWdCLEVBQVUvUSxFQUFXMFIsbUJBQW1CWCxJQUUxQ08sRUFBWVAsR0FBU3ZSLFNBQ3JCMFIsT0FBMkJ0ekIsSUFBbEJtekIsRUFBUWx2QixNQUFzQmt2QixFQUFRbHZCLE1BQVFxdkIsRUFDdkQveEIsS0FBS21ELGtCQUFvQnljLEVBQVV6YyxrQkFBa0J4QyxLQUFLaWYsR0FDMUQ1ZixLQUFLa0csdUJBQXlCMFosRUFBVTFaLHVCQUF1QnZGLEtBQUtpZixHQUNwRWtTLEdBQWUsRUFDZjl4QixLQUFLOHhCLGFBQWVBLEVBQ3BCOXhCLEtBQUt3eUIsaUJBQ0R2aEIsR0FBUW1QLFVBQ1ZwZ0IsS0FBS3l5QixnQkFBZ0J4aEIsRUFBT21QLFVBRXZCd1IsQ0FDVCxDQUVBLGVBQUFhLENBQWdCcHBCLEdBRWQsTUFBTXFwQixFQUFVL1ksU0FBU2daLGNBQWMsUUFFdkNELEVBQVFFLEtBQU92cEIsRUFFZnNRLFNBQVMxUSxLQUFLZ2EsWUFBWXlQLEVBQzVCLENBRUEsa0JBQUFqaEIsQ0FBbUJvaEIsR0FBYyxHQU0vQmpCLEVBQVUsSUFBdUJXLG1CQUFtQlgsRUFBU2lCLEVBQy9ELENBRUEsY0FBQUwsR0FDRSxNQUFNcHJCLEVBQVl3WSxFQUFVeFksVUFBVXpHLEtBQUtpZixHQUNyQ2pZLEVBQWNpWSxFQUFValksV0FBV2hILEtBQUtpZixHQUN4Q2hZLEVBQWtCZ1ksRUFBVWhZLGdCQUFnQmpILEtBQUtpZixHQUV2RGlTLEVBQWUsQ0FBRXpxQixZQUFXTyxhQUFZQyxrQkFDMUMsQ0FFQSxPQUFBa3JCLENBQVFqa0IsRUFBSzFQLEVBQUs0ekIsR0FBUyxHQUN6QixPQUFJQSxHQUNGbkIsRUFBUW5SLGVBQWU1UixHQUFPMVAsRUFDdkJBLElBRVB5eUIsRUFBUWxSLFNBQVM3UixHQUFPMVAsRUFFbEIwUCxFQUNWLENBRUEsT0FBQW1rQixDQUFRbmtCLEdBQ04sR0FBSStpQixFQUFRblIsZUFBZTVkLGVBQWVnTSxHQUFNLENBQzlDLE1BQU1va0IsRUFBVXJCLEVBQVFuUixlQUFlNVIsR0FFdkMsY0FETytpQixFQUFRblIsZUFBZTVSLEdBQ3ZCb2tCLENBQ1QsQ0FDQSxPQUFPckIsR0FBU2xSLFdBQVc3UixFQUM3QixDQUVBLGNBQUFxa0IsQ0FBZTlmLEdBQ2IsTUFBTXZFLEVBMUdEc1AsS0FBSytPLFNBQVM3QyxTQUFTLElBQUlPLE1BQU0sRUFBRyxHQTRHekMsT0FEQTVxQixLQUFLOHlCLFFBQVFqa0IsRUFBS3VFLEdBQU8sR0FDbEJ2RSxDQUNULENBR0EsZ0JBQUFza0IsQ0FBaUJqeEIsRUFBYStPLEdBRTVCLE9BREEyZ0IsRUFBUTFnQixTQUFTaFAsR0FBZStPLEVBQ3pCMmdCLEVBQVExZ0IsU0FBU2hQLEVBQzFCLENBV0EsZ0JBQUFxaEIsQ0FBaUJyaEIsRUFBYStPLEVBQVMyZ0IsR0FPckMsR0FOb0Isa0JBQWhCMXZCLEVBQ0ZBLEVBQWMsUUFDVyxtQkFBaEJBLElBQ1RBLEVBQWMsZUFHRHpELElBQVh3UyxRQUE2Q3hTLElBQXJCbXpCLEVBQVExZ0IsU0FFbEMsWUFEQXJSLFFBQVFDLEtBQUssZ0RBSWYsTUFBTXN6QixFQUFnQnhCLEVBQVExZ0IsU0FBU2hQLEdBRXZDLFFBQXNCekQsSUFBbEIyMEIsRUFLSixPQUFPQSxFQUpMdnpCLFFBQVFDLEtBQUssbURBQW1Eb0MsY0FLcEUsQ0FFQSxlQUFBK2UsR0FFQSxDQUVBLGVBQUFxQixDQUFnQkYsRUFBWVMsRUFBZSxDQUFDLFFBQ2xCcGtCLElBQXBCbXpCLEVBQVFyUixVQUNWcVIsRUFBUXJSLFFBQVUsQ0FBQyxHQUVyQnZnQixLQUFLcXpCLGlCQUFpQnhRLEVBQWF2QyxlQUVuQ3NSLEVBQVFyUixRQUFRNkIsR0FBY1MsQ0FDaEMsQ0FFQSxtQkFBQTdCLENBQW9Cc1MsR0FLbEIsT0FKSUEsR0FDRnR6QixLQUFLcXpCLGlCQUFpQkMsR0FHakJoQixFQUFvQmdCLGdCQUM3QixDQUVBLGdCQUFBRCxDQUFpQi9TLEdBQ1hBLEdBQ0ZnUyxFQUFvQmlCLFdBQVdqVCxFQUVuQyxDQUVBLGlCQUFBOVQsQ0FBa0J0SyxHQUNoQmt3QixFQUF1QnhjLEtBQUsxVCxFQUM5QixDQUVBLHdCQUFBc3hCLEdBQ0UsT0FBT3BCLENBQ1QsQ0FFQSxvQkFBQXFCLENBQXFCbjFCLEVBQU00Z0IsR0FDekJtVCxFQUFZMXVCLElBQUlyRixFQUFNNGdCLEVBRXhCLENBR0EsY0FBQWdDLENBQWVDLEdBQ1JuaEIsS0FBSzh4QixjQUNSanlCLFFBQVFDLEtBQUsseUVBSWZxaEIsRUFBZWUsU0FBU2xpQixLQUMxQixDQUVBLGVBQUFzdUIsQ0FBZ0JvRixHQUNkLE9BQU9yQixFQUFZNXVCLElBQUlpd0IsRUFDekIsQ0FFQSwyQkFBQUMsQ0FBNEJ2UixHQUMxQixPQUFPd1AsRUFBUXJSLFFBQVE2QixFQUN6QixDQUVBLFlBQUkvQixHQUNGLE9BQU84UixDQUNULENBRUEsOEJBQUl5QixHQUNGLE9BQU8zQixDQUNULENBR0EsOEJBQUkyQixDQUEyQnhnQixHQUNSLGlCQUFWQSxFQUVKNmUsRUFBNEJodUIsU0FBU21QLElBQ3hDNmUsRUFBNEJyYyxLQUFLeEMsR0FFMUIxTyxNQUFNK2xCLFFBQVFyWCxHQUV2QkEsRUFBTWhPLFFBQVFzRyxJQUNRLGlCQUFUQSxHQUFzQnVtQixFQUE0Qmh1QixTQUFTeUgsSUFDcEV1bUIsRUFBNEJyYyxLQUFLbEssS0FJckM3TCxRQUFRQyxLQUFLLDRGQUVqQixDQUVBLGFBQUkrekIsR0FFRixPQURBaDBCLFFBQVFDLEtBQUssb0VBQ05veUIsQ0FDVCxDQUVBLGFBQUkyQixDQUFVcjBCLEdBQ1pLLFFBQVFDLEtBQUssbUVBQ2YsQ0FFQSxZQUFJNlIsR0FDRixPQUFPdWdCLENBQ1QsQ0FFQSxZQUFJdmdCLENBQVNuUyxHQUNYMHlCLEVBQVkxeUIsQ0FDZCxDQUVBLG9CQUFJczBCLEdBQ0YsT0FBTzlCLENBQ1QsQ0FFQSxlQUFBK0IsQ0FBZ0JDLEVBQVcsQ0FBQyxHQUUxQixPQUFPLElBQTBCM2IscUJBQXFCMmIsRUFFeEQsQ0FFQSxvQkFBSUYsQ0FBaUJsckIsR0FBSyxHQUN4Qm9wQixFQUFvQnpKLFFBQVEzZixFQUM5QixDQUVBLGlCQUFBcXJCLENBQWtCNXBCLEdBQ2hCckssS0FBSzh6QixrQkFBbUIsRUFDeEI5ekIsS0FBS2swQiwyQkFBNkI3cEIsQ0FFcEMsQ0FFQSx1QkFBQThwQixHQUVBLENBRUEsYUFBQUMsR0FFQSxFLDJDQ3ZTRixNQUFNQyxFQUFvQjF4QixPQUFPMnhCLE9BQU8sQ0FBQyxHQUVuQ3hOLEdBQVcsSUFBQXBuQixTQUFRLEVBQUFxbkIsS0FBSyxJQUFBdGlCLElBQUdDLFFBSTNCeWlCLEdBQWEsSUFBQXpuQixVQUFRLElBQUFILFNBQVEsQ0FBQ3VuQixHQUFVLElBQUFyaUIsSUFBRzlCLFdBRzFDLE1BQU00eEIsRUFDWCxXQUFBbDJCLEdBQ0VnMkIsRUFBa0JHLElBQU0sSUFBTTMwQixRQUFRc2tCLElBQUksNkJBQzVDLENBRUEsU0FBQXNRLENBQVU1bEIsRUFBS3hFLEVBQUl3SixHQUFPLEdBQ3hCLElBQXFFLElBQWpFbFIsT0FBT0MsVUFBVUMsZUFBZUMsS0FBS3V4QixFQUFtQnhsQixHQUFlLENBQ3pFLE1BQU02bEIsRUFBVSxtQ0FBbUM3bEIscUJBQ25ELEdBQUlnRixFQUNGLE9BQU82Z0IsRUFFVDcwQixRQUFRQyxLQUFLNDBCLEVBQ2YsTUFDRUwsRUFBa0J4bEIsR0FBT3hFLENBRTdCLENBRUEsVUFBQWtwQixDQUFXb0IsRUFBYSxDQUFDLEVBQUc5Z0IsR0FBTyxHQUNqQyxJQUFJNmdCLEVBSUosT0FBYyxJQUZBdk4sRUFBV3dOLElBR3ZCRCxFQUFVLDhDQUE4QzF4QixLQUFLQyxVQUFVMHhCLDRCQUNuRTlnQixFQUNLNmdCLE9BRVQ3MEIsUUFBUUMsS0FBSzQwQixLQXFCSSxJQUFBNXNCLE1BQUs2c0IsR0FFTmoyQixJQW5Ca0JrMkIsSUFDbEMsTUFBTXhxQixHQUFZLElBQUFuRixNQUFLMnZCLEVBQVFELEdBSS9CLEdBRjBDLG1CQUFoQixFQUd4QjMwQixLQUFLeTBCLFVBQVVHLEVBQVF4cUIsRUFBV3lKLE9BQzdCLENBRUwsR0FEQTZnQixFQUFVLGlCQUFpQkUsNkJBQ3ZCL2dCLEVBQ0YsT0FBTzZnQixFQUVQNzBCLFFBQVFDLEtBQUs0MEIsRUFFakIsSUFLZ0RsbEIsS0FBSyxJQUN6RCxDQUVBLG1CQUFBcWxCLENBQW9CaG1CLEdBRXBCLENBRUEsb0JBQUl5a0IsR0FDRixPQUFPZSxDQUNULEUsbURDbkVLLE1BQU1TLEVBZVgsV0FBQXoyQixDQUFZMDJCLEVBQWVDLEVBQVMsR0FBSUMsR0FBVyxHQWdCakQsT0FmQWoxQixLQUFLKzBCLGNBQWdCQSxFQUNyQi8wQixLQUFLa3NCLGVBQWlCLENBQ3BCLGFBQ0EsaUJBQ0EscUJBQ0EsMkJBQ0EsU0FDQSxZQUNBLHdCQUVGbHNCLEtBQUtnMUIsT0FBU0EsR0FFRyxJQUFiQyxHQUNGajFCLEtBQUtrMUIsYUFFQWwxQixLQUFLbTFCLGNBQ2QsQ0FFQSxjQUFBQyxHQUNFcDFCLEtBQUtrMUIsWUFDUCxDQUVBLGtCQUFBRyxHQUNFLE9BQU8sUUFBa0JyMUIsS0FBTUEsS0FBS2tzQixlQUN0QyxDQUVBLHdCQUFBb0osQ0FBeUIxaEIsR0FDdkIsR0FBb0IsS0FBaEI1VCxLQUFLZzFCLE9BRVAsWUFEQW4xQixRQUFRQyxLQUFLLDJDQUEyQ0UsS0FBSzNCLFlBQVlDLHVCQUszRSxNQUVNaTNCLEdBQXNCLElBQUE1ekIsUUFGVDBILEdBQXFDLElBQTdCQSxFQUFJMFEsUUFBUS9aLEtBQUtnMUIsUUFFRXBoQixHQUM5QyxHQUFJMmhCLEVBQW9COTFCLFFBQVUsRUFBRyxDQUNuQyxNQUFNKzFCLEVBQWEsNkNBQTZDeDFCLEtBQUszQixZQUFZQyw2QkFBNkIwQixLQUFLZzFCLGFBQWFPLEVBQW9CL2xCLEtBQUssVUFDekozUCxRQUFRQyxLQUFLMDFCLEVBQ2YsQ0FDRixDQUVBLG9CQUFBQyxDQUFxQmQsRUFBWWUsR0FDL0IxMUIsS0FBS3MxQix5QkFBeUJYLEVBQVduSSxZQUN6QyxNQUFNcmpCLEVBQU0sQ0FBQyxFQUNQd3NCLEVBQWdDLENBQUN0c0IsRUFBS3VzQixHQUFXLEtBQ3JELE1BQU1DLEdBQStCLElBQWJELEVBQW9CNTFCLEtBQUszQixZQUFjMkIsS0FFMUMsbUJBRFE2MUIsRUFBZ0J4c0IsS0FFM0NGLEVBQUlFLEdBQU9xc0IsRUFBUXJzQixHQUFPd3NCLEVBQWdCeHNCLEdBQUsxSSxLQUFLKzBCLEtBS2xESSxHQURZLElBQUExYyxRQUFPLEVBQUd1YyxFQUNnQkksQ0FBVSxFQUFBOWMsSUFBSSxHQUsxRCxPQUhBLElBQUF2YSxLQUFJbzNCLEVBQXFDbkIsRUFBV3BJLGdCQUVwRCxJQUFBN3RCLEtBQUlpM0IsRUFBK0JoQixFQUFXL1YsU0FDdkN6VixDQUNULENBRUEsVUFBQStyQixHQUNFLE1BQU0xSSxFQUFheHNCLEtBQUtxMUIscUJBR3hCLE9BREFyMUIsS0FBS20xQixlQUFpQm4xQixLQUFLeTFCLHFCQUFxQmpKLEVBQVl4c0IsS0FBSyswQixlQUMxRC8wQixLQUFLbTFCLGNBQ2QsRSxvRENuRkssTUFBTWEsRUFDWCxXQUFBMzNCLEdBU0UyQixLQUFLNnJCLDBCQUE0Qm1LLEVBQTBCbkssMEJBQTBCbHJCLEtBQUtYLEtBQzVGLENBRUEsZ0NBQU82ckIsQ0FBMEIxaUIsR0FDL0IsTUFBTTZkLEdBQWEsSUFBQXRuQixVQUFRLElBQUFzWixZQUFXLEVBQUF6USxTQUFVLEVBQUFVLEtBQU0sRUFBQXRKLFFBQ2hEbXNCLEdBQVcsSUFBQXBzQixVQUFRLElBQUFzWixZQUFXLEVBQUE5WixPQUFRLEVBQUErSixLQUFNLEVBQUF0SixRQUVsRCxPQUQ4QixJQUFBSixTQUFRLENBQUN5bkIsRUFBWThFLEdBQzVDQyxDQUFzQjVpQixFQUMvQixDQUVBLG9DQUFPOHNCLENBQThCQyxFQUFZQyxHQUMvQyxNQUFNQyxHQUFpQixJQUFBejBCLFNBQU8sSUFBQTRJLFFBQU8sY0FDL0I0SyxHQUFVLElBQUF6VixTQUFRMDJCLEVBQWdCLEVBQUF0dUIsTUFHbEN1dUIsR0FEVSxJQUFBMzJCLFVBQVEsSUFBQTZWLE1BREVsTSxJQUFPLElBQUF3SyxNQUFLLElBQUl5QixPQUFPak0sR0FBTTZzQixJQUNOL2dCLEVBQzNCbWhCLENBQVFILEdBSTlCLE9BSEksSUFBQTF4QixJQUFHc0UsT0FBUXN0QixLQUNiRixHQUFXLElBQUFuUSxPQUFNa1EsR0FBWSxJQUFBanhCLE1BQUtveEIsRUFBZUYsR0FBV0EsSUFFdkRBLENBQ1QsQ0FFQSxnQ0FBT3hlLENBQTBCdE8sR0FJL0IsTUFBTyxDQUFFa3RCLEtBSElsdEIsRUFHRW10QixPQUZBbnRCLEVBRVFzUCxTQUROdFAsRUFFbkIsQ0FFQSwyQkFBTzJPLENBQXFCRSxFQUFHOUcsR0FBUyxFQUFPK0csRUFBTS9ULE9BQU9SLFVBQzFELE1BT002eUIsRUFMVSxDQUNkQyxNQUFPLFdBQ1BDLE1BQU8sU0FDUEosS0FBTSxTQUxnQixJQUFYbmxCLEVBQWtCLE9BQVM4RyxHQVd4QyxPQUhhLElBQUFqVCxNQUFLd3hCLEVBQVN0ZSxHQUdoQjVELFFBRmtCLHVCQUVZLEtBQzNDLENBRUEsaUNBQU9xaUIsQ0FBMkJud0IsRUFBTW93QixFQUFPM2UsRUFBSSxRQUFTNGUsR0FDMUQsTUFBTUMsRUFBUyxHQUNUQyxFQUFvQmIsSUFDeEIsTUFBTWMsRUFBUyxDQUFDLEVBQ1ZDLEVBQVVmLEVBQVNsaEIsVUFDekIsSUFBSWtpQixPQUFxQzE0QixJQUFsQmdJLEVBQUt5d0IsR0FBeUJ6d0IsRUFBS3l3QixJQUFXLElBQUFqeUIsTUFBS2l5QixFQUFTSixHQUNuRixNQUFNTSxTQUF1QmpCLEVBQVNnQixHQUVqQixXQUFqQkMsRUFDRkQsRUFBbUJoQixFQUFTZ0IsR0FDRixjQUFqQkMsSUFDVGpCLEVBQVduMkIsS0FBS2kyQiw4QkFBOEJrQixFQUFrQmhCLElBR2xFYyxFQUFPQyxHQUFXQyxFQUVkbjNCLEtBQUs2ckIsMEJBQTBCb0wsSUFDakNGLEVBQU9uaEIsS0FBS3FoQixHQUdkLE1BQU1JLEdBQVcsSUFBQTV5QixJQUFHOUIsT0FBUXd6QixHQUN0Qm1CLEdBQW9CLElBQUFybkIsS0FBSWtuQixFQUFrQmhCLEdBQzFDb0IsR0FBc0IsSUFBQXRuQixLQUFJLFlBQWFrbUIsR0FFN0MsSUFBZ0MsS0FEQW1CLEdBQXFCRCxHQUNmLENBQ3BDLE1BQU1HLEVBQVNyQixFQUFTZ0IsSUFDcEIsSUFBQWxuQixLQUFJLFlBQWF1bkIsSUFDbkJSLEVBQWlCUSxFQUFPeGlCLFVBRTVCLE1BQW1DLElBQXhCdWlCLFFBQXFEOTRCLElBQXJCMDRCLEdBQ3pDSCxFQUFpQmIsRUFBU25oQixZQU05QixPQUZBZ2lCLEVBQWlCSCxHQUVWRSxDQUNULENBRUEsd0JBQU9VLENBQWtCajRCLEdBQ3ZCLE1BQU1rNEIsR0FBVyxJQUFBLzFCLFFBQU8sRUFBQXpDLE9BQ2xCeTRCLEdBQWUsSUFBQTVlLE9BQUssSUFBQUMsWUFBVyxFQUFBOVosTUFBTyxFQUFBK1osS0FBSyxJQUFBekosTUFBSyxNQUNoRG9vQixHQUFhLElBQUFyakIsU0FBUSxzQkFBdUIsTUFFbEQsT0FEZSxJQUFBN1UsU0FBUWs0QixFQUFZRCxFQUFjRCxFQUFVLEVBQUE3TixTQUFTLElBQUFuckIsS0FBSSxFQUFBaUIsUUFDakVrNEIsQ0FBT3I0QixFQUNoQixDQUVBLHdCQUFPczRCLENBQWtCdDRCLEdBQ3ZCLE1BQU1rNEIsR0FBVyxJQUFBLzFCLFFBQU8sRUFBQXpDLE9BRWxCNnNCLEVBQXdCL3JCLEtBQUs2ckIsMEJBRTdCa00sR0FBYSxJQUFBcjRCLFVBQ2pCLElBQUE4UCxNQUFLLEtBQ0wsRUFBQXFhLFFBQ0EsRUFBQS9rQixTQUVJa3pCLEdBQVksSUFBQWx2QixRQUNoQmlqQixFQUNBZ00sR0FDQSxJQUFBcHVCLGFBQU9sTCxJQUdIdzVCLEdBQWtCLElBQUF2NUIsS0FBSXM1QixHQUV0QkUsR0FBb0IsSUFBQW5mLE9BQ3hCLElBQUFDLFlBQVcsRUFBQXpRLFVBQ1gsSUFBQWhJLFFBQU8sTUFRVCxPQU5pQixJQUFBYixTQUNmdzRCLEdBQ0EsSUFBQTFvQixNQUFLLEtBQ0xrb0IsRUFDQU8sRUFFS0UsQ0FBUzM0QixFQUNsQixDQUVBLG9DQUFPNDRCLENBQThCQyxFQUFTNXhCLEVBQU02eEIsRUFBYyxTQUVoRSxNQUdNQyxHQUFpQixJQUFBNzRCLFNBSEttUCxJQUFRLElBQUE1SixNQUFLLEdBQUc0SixJQUFNeXBCLElBQWU3eEIsR0FHZCxFQUFBd0MsS0FBTSxFQUFBbkIsTUFlekQsT0FBTyxJQUFBcEosS0FaY3VHLElBQ25CLE1BQU11ekIsRUFBY0QsRUFBZXR6QixHQUluQyxZQUFvQnhHLElBQWhCKzVCLEdBQ0ssSUFBQXhTLFFBQU0sSUFBQXRtQixTQUFRLEVBQUF1SixLQUFNLEVBQUFuQixLQUFkLENBQW9CN0MsR0FBT3V6QixFQUFhdnpCLEdBR2hEQSxHQUdlb3pCLEVBQzFCLENBRUEsdUNBQU9JLENBQWlDSixHQW1CdEMsT0FBK0IsSUFBM0IzekIsTUFBTStsQixRQUFRNE4sR0FDVEEsRUFBUTM1QixJQWJLeUssSUFNRCxpQkFBUkEsSUFDVEEsRUFBTXhHLE9BQU9tRixLQUFLcUIsR0FBS3dNLE9BTkwsQ0FBQ1osRUFBS2xHLEtBQ3hCa0csRUFBSWxHLEdBUG9CLENBQUM2cEIsSUFDM0IsTUFBTTFrQixFQUFRMGtCLEVBQU0xa0IsTUFBTSxVQUMxQixPQUFPQSxFQUFzQixPQUFiQSxFQUFNLEdBQWMsR0FBS0EsRUFBTSxHQUFNMGtCLEdBS3hDQyxDQUFvQnh2QixFQUFJMEYsSUFDNUJrRyxHQUlvQyxDQUFDLElBRXZDNUwsSUFPRmt2QixDQUNULENBRUEsaUNBQU9PLENBQTJCUCxFQUFTNXhCLEVBQU8sQ0FBQyxHQThDakQsT0FBTzR4QixFQUFRMzVCLElBakJrQnlLLElBQy9CLE1BQU0wdkIsRUFBYSxJQUFLMXZCLEdBWXhCLE9BRkF4RyxPQUFPbUYsS0FBSyt3QixHQUFZenpCLFFBUFN5SixJQXpCVixJQUFDeEYsRUFBS3l2QixFQTBCdkJuMkIsT0FBT0MsVUFBVUMsZUFBZUMsS0FBSysxQixFQUFZaHFCLElBQVFwSSxFQUFLb0ksS0FDaEVncUIsRUFBV2hxQixJQTNCU3hGLEVBMkJlNUMsRUFBS29JLElBM0JmaXFCLEVBMkJxQkQsRUFBV2hxQixJQWhCaENrcUIsTUFBTSxLQUdUQyxLQUFNQyxHQWJQLEVBQUNBLEVBQVM3bEIsS0FDakMsTUFBTThsQixFQUFpQkQsRUFDcEIxa0IsUUFBUSx1QkFBd0IsUUFDaENBLFFBQVEsTUFBTyxlQUdsQixPQURxQixJQUFJZSxPQUFPLElBQUk0akIsTUFDaEJybEIsS0FBS1QsSUFPaUIrbEIsQ0FBaUJGLEVBQVM1dkIsSUFHcERBLEVBQU15dkIsTUFpQmpCRCxHQUtYLENBRUEsMkJBQU94Z0IsQ0FBcUI1UixFQUFNbWUsRUFBSSxJQUFtQjNULE9BQU9DLFNBQVNDLE1BQU8rRyxFQUFHa2hCLEdBQ2pGLE1BQU1DLE9BQWdCNTZCLElBQU55WixFQUFrQkEsRUFBSTBNLEVBQUVoWCxLQUNsQ3dELEVBQVN3VCxFQUFFeFQsT0FDWHlsQixFQUFRalMsRUFBRTVTLE9BQU9nRCxVQUNqQnNrQixPQUF5Qjc2QixJQUFYMjZCLEVBQXVCQSxFQUFTcDVCLEtBQUtnWSxxQkFBcUJxaEIsRUFBU2pvQixHQUNqRm1vQixFQUE0QnY1QixLQUFLc1kscUJBQXFCZ2hCLEVBQWExVSxFQUFHeVUsR0FBUzdsQixVQUNyRixJQUFJdWpCLEVBQVMvMkIsS0FBSzQyQiwyQkFBMkJud0IsRUFBTW93QixFQUFPd0MsRUFBU0UsR0FTbkUsT0FQQXhDLEVBQVNmLEVBQTBCb0MsOEJBQThCckIsRUFBUXR3QixHQUN6RXN3QixFQUFTZixFQUEwQnlDLGlDQUFpQzFCLEdBTXBELFVBQVpzQyxFQUNLcjVCLEtBQUs4M0Isa0JBQWtCZixHQUd6Qi8yQixLQUFLeTNCLGtCQUFrQlYsRUFDaEMsQ0FFQSxzQ0FBT3lDLENBQWdDQyxFQUFTeG5CLEdBQzlDLE1BQU15bkIsRUFBUXpuQixFQUFVaE8sU0FBUyxNQWUzQjAxQixHQUFpQixJQUFBcGxCLFNBQVEsS0FBTSxNQVEvQnFsQixHQUE4QixJQUFBMzZCLFNBQ2xDLElBQUFxSSxRQUFPbXlCLEVBQVMsUUFBUSxJQUFBLzVCLFVBQVEsSUFBQW1VLE1BQUssRUFBQW9GLEdBQUl3Z0IsSUFBVSxJQUFBeDBCLE1BQUssUUFLMUQsT0FGdUIsSUFBQXZGLFVBQVEsSUFBQW02QixnQkFBYyxJQUFBdHZCLFNBQU8sS0FBUSxJQUFBN0wsS0FBSWs3QixJQUE2QixJQUFBbDdCLEtBWGpFMkssSUFDMUIsTUFBTyxDQUNMQSxNQUNBeXdCLElBakJVck8sRUFpQkRwaUIsRUFoQlBxd0IsSUFDR2pPLEVBQUVzTyxXQUFXLE9BQ2hCdE8sRUFBSSxJQUFNQSxHQUVQQSxFQUFFdU8sU0FBUyxPQUNkdk8sR0FBUSxNQUlMLElBQUluVyxPQUFPbVcsS0FWUCxJQUFDQSxLQXlCd0csSUFBQS9zQixLQUFJaTdCLEdBRW5ITSxDQUFlaG9CLEVBQ3hCLENBRUEsbUNBQU9pb0IsQ0FBNkIvd0IsRUFBS0UsRUFBSzh3QixHQWU1QyxNQUdNbG9CLEdBSG1CLElBQUF2UyxVQUFRLElBQUFoQixLQUFJLEVBQUEwN0IsT0FBTyxJQUFBMTdCLE1BQUksSUFBQThJLFNBQU8sSUFBQS9DLElBQUdzRSxVQUFXLEVBQUFqRSxRQUduRHUxQixDQUFpQmx4QixHQUs3Qm14QixFQUFhdEUsRUFBMEJ3RCxnQ0FBZ0Nud0IsRUFBSzRJLEdBR2xGLElBQUlzb0IsRUFBV2x4QixFQUlmLEdBQUlpeEIsR0FBYyxFQUFHLENBQ25CLE1BQU1FLEVBQVF2b0IsRUFBVXFvQixHQUNsQkcsR0FBYyxJQUFBQyxRQUFPdnhCLEdBSXJCd3hCLEdBRG1CLElBQUFqN0IsU0FBUSxFQUFBdUosTUFBTSxJQUFBNUksV0FBVSxLQUFLLElBQUE0RSxNQUFLdTFCLEdBQ3JDSSxDQUFpQkgsSUFLdEIsSUFITCxjQUNTNW1CLEtBQUs4bUIsS0FFNkIsS0FBOUIsSUFBQWwyQixJQUFHc0UsT0FBUTR4QixLQUNsQ0osRUFBV0ksRUFFZixDQUVBLE9BQU9KLENBQ1QsQ0FFQSw0QkFBT00sQ0FBc0J4eEIsR0FFM0IsT0FBT0EsRUFBSWtMLFFBREssZUFDWSxNQUFNd2tCLE1BQU0sSUFDMUMsQ0FFQSxzQ0FBTytCLENBQWdDQyxFQUFlMXhCLEVBQUs4d0IsR0FDekQsTUFBTTNqQixFQUFhbk4sRUFDYjJ4QixFQUFZaDdCLEtBQUs2NkIsc0JBQXNCeHhCLEdBQ3ZDb0ssRUFBUSxHQUNSd25CLEVBQWtCLEdBQ3hCLElBQUlDLEVBQVlILEdBeUJoQixJQUFBcGxCLFFBeEI0QixDQUFDd2xCLEVBQU9DLEtBQ2xDLE1BQU1DLEVBQWdCcjdCLEtBQUtrNkIsNkJBQTZCZ0IsRUFBV0UsRUFBY2pCLEdBRWpGZSxFQUFZbDdCLEtBQUtpMkIsOEJBQThCbUYsRUFBY0YsR0FDN0QsTUFFTUksR0FBZSxJQUFBcjhCLFFBQU8sRUFBQXNKLFFBQVMsRUFBQXJKLFlBRW5CVCxJQUFkeThCLEdBSjZCLENBQUM3eEIsR0FBUUEsS0FBUSxJQUFBK3dCLE1BQUszbUIsR0FJeEI4bkIsQ0FBeUJMLEVBQVVqbUIsYUFBOEMsSUFBaENxbUIsRUFBYUQsS0FDM0Y1bkIsRUFBTW1DLEtBQUtzbEIsRUFBVWptQixXQUNyQmdtQixFQUFnQnJsQixLQUFLeWxCLElBRXZCLE1BQU1HLEVBQVUsQ0FBQ0osRUFBYyxhQUV6QkssR0FBZ0IsSUFBQW43QixNQUFLazdCLEVBQVNOLEdBQzlCUSxHQUF1QixJQUFBcDdCLE1BRk4sQ0FBQyxhQUUwQjQ2QixRQUU1Qno4QixJQUFsQmc5QixFQUNGUCxFQUFZTyxPQUNzQmg5QixJQUF6Qmk5QixJQUNUUixFQUFZUSxJQUlZLEVBQUdWLEdBQy9CLE1BQU14bkIsR0FBWSxJQUFBbW9CLFFBQU9sb0IsRUFBT3duQixHQUMxQm5qQixFQUFnQjlYLEtBQUs0N0IsY0FBY25vQixHQUN6QyxNQUFPLENBQUVBLFFBQU9xRSxnQkFBZXRFLFlBQVdnRCxhQUM1QyxDQUVBLG9CQUFPb2xCLENBQWNwOEIsR0FFbkIsT0FEc0JxOEIsRUFDRnI4QixPQURvQmYsS0FBWixJQUFBMjdCLE1BQUt5QixJQUFtQixJQUFBekIsTUFBS3lCLEdBQUssR0FBekMsSUFBQ0EsQ0FFeEIsQ0FFQSxxQ0FBT0MsQ0FBK0JmLEVBQWUxeEIsR0FDbkQsTUFBTUYsRUFBTSxDQUFDLEVBR2IsT0FEQUEsRUFEZ0I0eEIsRUFBYzlsQixXQUNmalYsS0FBS2s2Qiw2QkFBNkJhLEVBQWUxeEIsR0FDekRGLENBQ1QsQ0FFQSw4QkFBTzR5QixDQUF3QmhCLEVBQWUxeEIsRUFBSzh3QixHQUNqRCxNQUNNM2pCLEVBQWFuTixFQUNiMnlCLEVBQVMzeUIsRUFBSWtMLFFBRkgsZUFFb0IsTUFFOUJ0QyxHQURrQixJQUFBdlMsVUFBUSxJQUFBaEIsTUFBSSxJQUFBcTZCLE9BQU0sT0FBTyxJQUFBQSxPQUFNLEtBQ3JDa0QsQ0FBZ0JELEdBQ2xDLElBQUl4b0IsR0FBWSxJQUFBM08sV0FBVW9OLEdBRXRCd0IsR0FBUSxJQUFBL1UsS0FBSSxFQUFBdUssS0FBTWdKLEdBUXRCLE9BTnFCLEtBQWpCLElBQUExSixTQUFRYyxLQUNWbUssRUFBWXhULEtBQUs4N0IsK0JBQStCZixFQUFlMXhCLEVBQUs4d0IsR0FDcEUxbUIsR0FBUSxJQUFBM0wsTUFBSzBMLElBSVIsQ0FBRUMsUUFBT3FFLGNBRk05WCxLQUFLNDdCLGNBQWNub0IsR0FFVkQsWUFBV2dELGFBQzVDLENBRUEsMkJBQU84QixDQUFxQmpQLEVBQUtxSSxFQUFhd0csR0FFNUMsUUFBb0J6WixJQUFoQmlULEVBQ0YsTUFBTyxDQUFDLEVBRVYsTUFBTTlELE9BQWFuUCxJQUFOeVosRUFBa0JBLEVBQUl4RyxFQUFZOUQsS0FDekN1c0IsR0FBYyxJQUFBOTVCLFdBQVUsQ0FBQyxHQUFHLElBQUE0RSxNQUFLLGNBQWV5TSxJQUNoRHFwQixFQUFnQnJwQixFQUFZTSxPQUFPZ0QsVUFFekMsTUFBYSxVQUFUcEgsRUFDSzVOLEtBQUsrN0Isd0JBQXdCaEIsRUFBZTF4QixJQUVyREEsRUFBZUEsRUFYZWtMLFFBQVEsUUFBUyxLQWF4Q3ZVLEtBQUs4NkIsZ0NBQWdDQyxFQUFlMXhCLEVBQUs4d0IsR0FDbEUsRSw2RENwYUssTUFBTStCLEVBQ1gsV0FBQTc5QixHQVVFMkIsS0FBS29TLHFCQUF1QjhwQixFQUF1QjlwQixxQkFBcUJ6UixLQUFLWCxLQUMvRSxDQUVBLDJCQUFPb1MsQ0FBcUIrcEIsSUFPUixJQUFBQyxrQkFOQyxTQUFTQyxHQUMxQmo0QixPQUFPazRCLFdBQWFELENBQ3RCLEVBQ3NCLFdBQ3BCajRCLE9BQU9rNEIsV0FBYSxXQUFZLENBQ2xDLEdBR1U3MEIsVUFBVTAwQixFQUN0QixDQUVBLG9CQUFPUCxDQUFjcDhCLEdBRW5CLE9BRHNCcThCLEVBQ0ZyOEIsT0FEb0JmLEtBQVosSUFBQTI3QixNQUFLeUIsSUFBbUIsSUFBQXpCLE1BQUt5QixHQUFLLEdBQXpDLElBQUNBLENBRXhCLENBRUEsMkJBQU85cUIsQ0FBcUI1SCxFQUFNLENBQUMsRUFBRzNKLEdBQ3BDLE1BQU0rOEIsRUFBYSxDQUFDaDRCLEVBQUdzM0IsU0FBWXA5QixJQUFObzlCLEdBQWtCLElBQUFqOEIsTUFBS2k4QixFQUFHdDNCLEdBQUtBLEVBQzVELElBQUlpNEIsRUFBT0QsRUFBV3B6QixFQUFLM0osR0FDM0IsTUFBTyxDQUNMKzhCLGFBQ0FocEIsUUFBUyxDQUFDcEssRUFBTSxDQUFDLEVBQUczSixLQUNsQixNQUFNaTlCLEVBQU9GLEVBQVdwekIsRUFBSzNKLEdBZ0J2Qms5QixFQUFhdmhCLElBQUssSUFBQXpiLFNBQVEsRUFBQW9JLE1BQU0sSUFBQU4sU0FBTyxJQUFBRixTQUFPLEVBQU02VCxLQUVwRHdoQixHQUFnQixJQUFBajlCLFVBQVEsSUFBQWhCLEtBakJUeWMsSUFDbkIsTUFBTWxILEdBQUssSUFBQWhQLE1BQUtrVyxFQUFHcWhCLEdBQ2J0b0IsR0FBSyxJQUFBalAsTUFBS2tXLEVBQUdzaEIsR0FDYkcsR0FBTyxJQUFBcnlCLFFBQU8wSixFQUFJQyxHQUNsQjJvQixPQUF3QnArQixJQUFQd1YsRUFDakI2b0IsT0FBb0JyK0IsSUFBUHlWLEVBQ2I2b0IsR0FBV0gsRUFDWEksR0FBMkIsSUFBbkJILElBQTJDLElBQWZDLEVBQ3BDRyxHQUE2QixJQUFuQkosSUFBMEMsSUFBZkMsRUFFckMzekIsRUFBTSxDQUFDLEVBRWIsT0FEQUEsRUFBSWdTLEdBQUssQ0FBRXloQixPQUFNRyxVQUFTQyxRQUFPQyxVQUFTSixpQkFBZ0JDLGNBQ25EM3pCLElBS3dDLEVBQUFtakIsTUFBTSxJQUFBbGpCLE9BQU0sRUFBQXRCLE1BQXZDLENBQThDLENBQUMwMEIsRUFBTUMsSUFDckVTLEdBQWUsSUFBQTl6QixPQUFNc3pCLEVBQVcsV0FBWUMsR0FDNUNRLEdBQWEsSUFBQS96QixPQUFNc3pCLEVBQVcsU0FBVUMsR0FDeENTLEdBQWUsSUFBQWgwQixPQUFNc3pCLEVBQVcsV0FBWUMsR0FFbEQsT0FEQUgsRUFBT0MsRUFDQSxDQUFFVSxhQUFZQyxlQUFjRixpQkFHckNHLFlBQWEsSUFBTWIsRUFHdkIsQ0FFQSxzQkFBT2MsQ0FBZ0JDLEVBQVV0ckIsR0FDL0IsTUFBTXdCLEdBQVMsSUFBQWpNLFNBQU8sSUFBQXZELFVBQVMsRUFBQWdWLEdBQUlza0IsR0FBV3RyQixHQUc5QyxNQUFPLENBQUV3QixRQUFPcUUsY0FGTW9rQixFQUF1Qk4sY0FBY25vQixHQUc3RCxDQUVBLDBCQUFPMUIsQ0FBb0I1SSxHQUN6QixNQUFNcTBCLEVBQU1DLElBQVMsSUFBQXIwQixPQUFNLEVBQUV1RixFQUFHQyxLQUNiLGlCQUFOQSxHQUF3QixPQUFOQSxHQUFlbEssTUFBTStsQixRQUFRN2IsR0FHakQsQ0FBQyxDQUFDRCxFQUFHQyxLQUZMLElBQUFsUSxLQUFJLEVBQUVnL0IsRUFBSUMsS0FBUSxDQUFDLEdBQUdodkIsS0FBSyt1QixJQUFNQyxHQUFLSCxFQUFHNXVCLEtBSWpELElBQUE5SixTQUFRMjRCLElBR1gsT0FBTyxJQUFBOTlCLFNBQU8sSUFBQWtGLFdBQVUyNEIsRUFBR3IwQixJQUM3QixDQUVBLHVCQUFPeTBCLENBQWlCQyxHQWlCdEIsTUFBTSxLQUFFandCLEVBQUksT0FBRXdELEdBQVd5c0IsRUFHbkJDLEVBQVczMEIsSUFTYSxVQUFUeUUsRUFBbUIsSUFBZ0IsSUFBWHdELEVBQWtCLElBQU0sS0FDbEQsSUFBMEJpSCxxQkFBcUJsUCxFQUFLMDBCLEdBTnpEdHBCLFFBRkssNEJBRVcsUUFjeEJ3cEIsRUFBZSxzQkFFZkMsRUFBcUIsQ0FBQ0MsRUFBVSxHQUFJQyxFQUFjQyxFQUFTLENBQUMsS0FDaEUsSUFBSSxVQUFFbHBCLEdBQWNpcEIsRUEwQ3BCLE9BQU8sSUFBQXA1QixTQUFRbzVCLEdBQWN2b0IsT0F4Q1IsQ0FBQ1osRUFBS3FwQixLQUN6QixNQUFPdnZCLEVBQUsxUCxHQUFPaS9CLEVBQ2IvRyxHQUFXLElBQUE1eUIsSUFBRzlCLE9BQVF4RCxHQUl0QmsvQixFQUFjaDFCLElBQU8sSUFBQXdLLE1BQUtrcUIsRUFBYzEwQixHQUYxQixDQUFDQSxHQUFRTixPQUFPTSxHQUFLa0wsUUFBUSxVQUFXLEtBQUtvSCxjQUVaMmlCLENBQVlqMUIsR0FBT3dGLEVBRXhFLEdBQVksY0FBUkEsR0FBK0IsUUFBUkEsRUFDekIsT0FBT2tHLEVBR1RFLEVBQVlBLElBQWEsSUFBQWhRLE1BQUssWUFBYTlGLEdBRzNDLElBQUlvRixHQUFJLElBQUFsQixPQUFNODZCLEdBR2QsR0FGQTU1QixFQUFFMFEsR0F4QnVCbE0sT0F3QkU4RixHQXhCVTBGLFFBQVEsb0JBQXFCLEtBMEJqRCxJQUFiOGlCLEVBQW1CLENBQ3JCLEdBQXVCLEtBQW5CLElBQUF2dkIsTUFBS3ZELEdBQUc5RSxPQUFjLENBQ3hCLE1BQU04K0IsR0FBZSxJQUFBaitCLE1BQUssQ0FBQyxZQUFhLGFBQWNuQixHQUN0RCxHQUFJby9CLEVBQWMsQ0FDaEIsTUFBTUMsR0FBUSxJQUFBbjdCLE9BQU1rQixHQUNwQmk2QixFQUFNRCxHQUFnQixHQUN0QkMsRUFBTUMsVUFBVyxJQUFBMzJCLE1BQUtxMkIsR0FBUTErQixPQUM5QisrQixFQUFNRSxNQUFRTCxFQUFZeHZCLEdBQzFCMnZCLEVBQU01TCxLQUFPa0wsRUFBUVUsR0FDckJ6cEIsRUFBSWEsS0FBSzRvQixFQUNYLENBQ0YsQ0FDQWo2QixFQUFJeTVCLEVBQW1CQyxFQUFTOStCLEVBQUtvRixFQUN2QyxNQUNFQSxFQUFFbTZCLE1BQVFMLEVBQVl4dkIsR0FDdEJ0SyxFQUFFcXVCLEtBQU9rTCxFQUFRdjVCLEdBSW5CLE9BRkFBLEVBQUVrNkIsVUFBVyxJQUFBMzJCLE1BQUtxMkIsR0FBUTErQixPQUMxQnNWLEVBQUlhLEtBQUtyUixHQUNGd1EsR0FHeUMsS0FHOUM0cEIsRUFBYVgsRUFBbUIsR0FBSUgsRUFBZ0I3ckIsUUFDMUQsSUFBSUosR0FBbUIsSUFBQWlZLFNBQVE4VSxHQVUvQixPQVRBL3NCLEVBckZBLFNBQVNndEIsRUFBZ0JwL0IsR0FDdkIsT0FBT0EsRUFBSWQsSUFBSXlLLElBQ2IsSUFBSyxNQUFNMEYsS0FBTzFGLE9BQ0oxSyxJQUFSb1EsR0FBNkIsY0FBUkEsUUFBb0NwUSxJQUFiMEssRUFBSTBGLFVBQzNDMUYsRUFBSTBGLEdBQ0YxRixFQUFJMEYsSUFBNEIsaUJBQWIxRixFQUFJMEYsS0FBc0JuSyxNQUFNK2xCLFFBQVF0aEIsRUFBSTBGLE1BRXhFMUYsRUFBSTBGLEdBQU8rdkIsRUFBZ0IsQ0FBQ3oxQixFQUFJMEYsS0FBTyxJQUczQyxPQUFPMUYsR0FFWCxDQXlFbUJ5MUIsQ0FBZ0JodEIsR0FTNUIsQ0FBRUEsbUJBQWtCaXRCLGNBUFAsQ0FBQ0MsSUFDbkIsTUFBTUMsR0FBVSxJQUFBcDlCLFNBQU8sSUFBQXNDLFVBQVMsRUFBQWdWLEdBQUksQ0FBQyxRQUFTLE9BQVEsV0FBWSxlQUVsRSxPQURvQixJQUFBdlosU0FBUSxFQUFBNHNCLEtBQU15UyxFQUFTLEVBQUFsVixTQUFTLElBQUFuckIsS0FBSSxFQUFBb0osTUFDakRrM0IsQ0FBWUYsSUFFQ0csQ0FBWXJ0QixHQUdwQyxDQUVBLHlCQUFPMmdCLENBQW1Cc0wsRUFBa0IsQ0FBQyxFQUFHaEwsR0FBYyxHQUM1RCxNQUFNcU0sR0FBb0IsSUFBQTUrQixNQUFLLENBQUMsV0FBWSxTQUFVdTlCLEdBQ3RELElBQUksUUFBRWpkLFFBQWtDbmlCLElBQXRCeWdDLEVBQWtDQSxFQUFvQnJCLEVBQ3hFamQsRUFBVUEsR0FBV2lTLEVBQ3JCLE1BQU1zTSxFQUFrQnRELElBQ3RCLE1BQU0xOEIsRUFBTTA4QixFQUFFLEdBQ1JyM0IsR0FBUSxJQUFBQyxJQUFHQyxNQUFPdkYsR0FNeEIsTUFMWSxLQUFSQSxFQUNGMDhCLEVBQUUsR0FBSyxLQUNFcjNCLElBQ1RxM0IsRUFBRSxHQUFLMThCLEVBQUlxUSxLQUFLLE1BRVhxc0IsR0FtQkh1RCxHQUFpQixJQUFBMS9CLFNBQVEsRUFBQW1GLFdBQVcsSUFBQW5HLEtBaEJqQmMsSUFDdkIsTUFBT3FQLEVBQUsxUCxHQUFPSyxFQUNiNi9CLEVBQVN6ZSxFQUFVLENBQUUsSUFBSyxNQUFTLENBQUMsRUFDcENqYyxHQUFRLElBQUFGLElBQUc5QixPQUFReEQsR0FDbkJxRixHQUFRLElBQUFDLElBQUdDLE1BQU92RixHQUVsQm1nQyxFQUFzQixjQUFSendCLEVBT3BCLE9BUjBCLElBQVZsSyxJQUE0QixJQUFWSCxJQUdoQ2hGLEVBQUksR0FBSzQvQixFQUFlNS9CLEVBQUksSUFDeEI4L0IsSUFDRjkvQixFQUFJLElBQUssSUFBQUUsVUFBUSxJQUFBb0MsZ0JBQWV1OUIsR0FBUyxFQUFBeDZCLFdBQVcsSUFBQW5HLEtBQUl5Z0MsR0FBaUIsRUFBQXI2QixRQUFoRSxDQUF5RXRGLEVBQUksTUFHbkZBLElBR3VELEVBQUFzRixTQUVoRSxRQUEwQnJHLElBQXRCeWdDLEVBQWlDLENBQ25DckIsRUFBZ0Izc0IsU0FBU0MsTUFBUWl1QixFQUFldkIsRUFBZ0Izc0IsU0FBU0MsT0FDekUsTUFBTW91QixFQUFpQnJELEVBQXVCMEIsaUJBQWlCQyxFQUFnQjNzQixTQUFTQyxPQUV4RixPQURBMHNCLEVBQWdCM3NCLFNBQVNDLE9BQVEsSUFBQUssWUFBV3FzQixFQUFnQjNzQixTQUFTQyxNQUFPb3VCLEdBQ3JFMUIsQ0FDVCxDQUVBLE9BQU91QixFQUFldkIsRUFDeEIsQ0FFQSxzQkFBT2g2QixHQVdMLE9BQU8sSUFBQU0sU0FWbUIsQ0FDeEIsT0FDQSxTQUNBLFdBQ0EsT0FDQSxXQUNBLE9BQ0EsV0FDQSxTQUNBLFFBQ2dDQyxPQUFPUixTQUMzQyxFLDZEQ25QSyxNQUFNNDdCLEVBV1gsV0FBQW5oQyxHQUNFMkIsS0FBSzRjLDZCQUErQjRpQixFQUF3QjVpQiw2QkFBNkJqYyxLQUN2RlgsS0FDSixDQUVBLG1DQUFPNGMsQ0FBNkI2aUIsRUFBVzlnQyxFQUFPOGUsR0FBWSxFQUFNRSxFQUFVdlosUUFLaEYsT0FEQXpGLE9BQWtCRixJQUFWRSxFQUF1QndjLEdBQU1BLEVBQUl4YyxHQUNsQyxJQUFBeTlCLGtCQUpZQyxHQUFXMWUsRUFBUStoQixpQkFBaUJELEVBQVdwRCxFQUNoRSxDQUFFc0QsUUFBU2xpQixJQUNTLEtBQVFFLEVBQVE4aEIsR0FBY3RrQixHQUFNQSxJQUVQNVQsTUFBSyxJQUFBN0ksS0FBSUMsR0FDOUQsQ0FHQSx1QkFBT2loQyxDQUFpQnYyQixHQUN0QixNQUFNdzJCLEVBQUt6N0IsT0FBT2dZLFdBQVcvUyxHQUU3QixPQURBckosS0FBSzgvQix1QkFBdUJELEVBQUl4MkIsSUFDbEIsSUFBUHcyQixHQUFlQSxDQUN4QixDQUVBLDZCQUFPQyxDQUF1QkQsRUFBSXgyQixHQUNoQyxNQUFNMDJCLEVBQVcxMkIsR0FBT0EsRUFBSWtMLFFBQVEsUUFBUyxJQUN2Q3lyQixPQUE2QnZoQyxJQUFmb2hDLEVBQUd4akIsU0FBeUIwakIsRUFBU0YsRUFBR0ksT0FBT2xtQixRQUFRZ21CLEVBQVMxMkIsS0FBUyxFQUs3RixPQUhvQixJQUFoQjIyQixHQURZMzJCLEtBQU94SixRQUFRQyxLQUFLLDRDQUE0Q3VKLDhCQUFnQ3cyQixFQUFHSSxtRUFFakhDLENBQVE3MkIsR0FFSDIyQixDQUNULENBRUEsOEJBQU9yZ0IsQ0FBd0JnWCxFQUFPOW5CLEdBQ3BDLE1BS01zeEIsRUFMUXR4QixJQUFPc00sSUFDbkJBLEVBQUVpbEIsZUFBaUJ2eEIsRUFDWnNNLEdBR01rbEIsQ0FBTXh4QixHQVFmeXhCLEdBTllDLEVBTWlCNUosRUFMMUIsQ0FDTDZKLFdBQWFuRSxJQUFja0UsRUFBRUUsWUFBWXBFLElBQ3pDcUUsY0FBZ0JyRSxJQUFja0UsRUFBRUksU0FBVyxVQUg5QixJQUFDSixFQVFsQixPQUFPLElBQUksRUFBQW5FLGlCQUNUa0UsRUFBa0JFLFdBQ2xCRixFQUFrQkksZUFDakJuNUIsTUFBSyxJQUFBN0ksS0FBSXloQyxHQUNkLENBRUEsNkJBQU81Z0IsQ0FBdUJ0TyxHQUM1QixNQUFNMnZCLEVBQWtCM3ZCLEVBQU8wTixjQUFnQjFOLEVBQU8wTixhQUNoRG5mLEVBQU0sR0FXWixPQURBLElBQUF5ZixlQVJvQixDQUFDOWYsRUFBSzBQLEVBQUsxRixLQUM3QixNQUFNMDJCLEVBQUtMLEVBQXdCSSxpQkFBaUJ6Z0MsR0FJcEQsT0FIVyxJQUFQMGdDLEdBQ0ZyZ0MsRUFBSW9XLEtBQUs0cEIsRUFBd0I3Zix3QkFBd0JrZ0IsRUFBSWh4QixJQUV4RHJQLEdBR2tCb2hDLEdBQ3BCcGhDLENBQ1QsRSxzQ0NqRkYsTUFBTXFoQyxFQUF3QixDQUFDQyxHQUFXLEVBQU81b0IsRUFBSSxFQUFHNVMsRUFBSSxPQUFReTdCLEdBQWdCLElBRzNFLElBRm1DLElBQWxCQSxFQUF5QixhQUFlLHlCQUVoQjdvQixNQUFNNVMsZ0JBRHpCLElBQWJ3N0IsRUFBb0IsRUFBSSxLQUduQyxTQUFTRSxFQUFPanJCLEVBQUltQyxHQUN6QixNQUFNK29CLEVBQXVELEVBQXRDNzhCLE9BQU84OEIsaUJBQWlCbnJCLEdBQUlvckIsUUFFN0NDLEVBQVlQLEdBQXNCLEVBQU0zb0IsRUFBRyxPQURWLElBQW5CK29CLEdBRXBCbHJCLEVBQUcyTCxNQUFNQyxTQUFXeWYsQ0FDdEIsQ0FDTyxTQUFTQyxFQUFRdHJCLEVBQUltQyxFQUFHb3BCLEdBQzdCLE1BQU1GLEVBQVlQLEdBQXNCLEVBQU8zb0IsRUFBRyxRQUNsRG5DLEVBQUcyTCxNQUFNQyxTQUFXeWYsRUFHcEJyckIsRUFBRzJwQixpQkFBaUIsZ0JBQWlCNEIsR0FBVSxFQUNqRCxDLDZEQ2RPLE1BQU1DLEVBQ1gsV0FBQWxqQyxDQUFZRSxHQVNWeUIsS0FBS3pCLE1BQU1pakMsa0JBQW9CRCxFQUFxQkUsOEJBQ3RELENBRUEscUNBQU9DLEdBQ0wsTUFBTUMsRUFBYyxXQUNkQyxFQUFZLFNBQ1pDLEVBQVcsUUFDakIsTUFBTyxDQUNMQyxFQUFHLENBQUNGLEdBQ0pHLEVBQUcsQ0FBQ0YsR0FDSkcsSUFBSyxDQUFDSixFQUFXRCxFQUFhRSxHQUM5QkksR0FBSSxDQUFDSixFQUFVRixHQUNmTyxHQUFJLENBQUNOLEVBQVdELEdBQ2hCUSxHQUFJLENBQUNQLEVBQVdDLEdBRXBCLENBRUEsb0JBQU9PLENBQWNqNUIsR0FFbkIsT0FEaUIsSUFBQWs1QixNQUFLLEVBQUE3d0IsV0FDZjh3QixDQUFTLENBQUU5K0IsS0FBSyxDQUFDLGNBQWUsSUFBQUgsT0FBTThGLEdBQy9DLENBRUEseUJBQU9vNUIsQ0FBbUJwNUIsRUFBSzNKLEVBQU0sQ0FBQyxXQUFZLFNBRWhELE9BRGlCLElBQUE2aUMsTUFBSyxFQUFBN3dCLFdBQ2Y4d0IsRUFBUyxJQUFBai9CLE9BQU04RixHQUFNLENBQUUzRixLQUFLaEUsR0FDckMsQ0FFQSw2QkFBT2dqQyxDQUF1QnI1QixFQUFLM0osRUFBTSxDQUFDLFFBQVMsU0FFakQsT0FEaUIsSUFBQTZpQyxNQUFLLEVBQUE3d0IsV0FDZjh3QixFQUFTLElBQUFqL0IsT0FBTThGLEdBQU0sQ0FBRTNGLEtBQUtoRSxHQUNyQyxDQUVBLHNCQUFPaWpDLENBQWdCdG5CLEdBQ3JCLE9BQU9uYixLQUFLb2lDLGNBQWNqbkIsRUFDNUIsQ0FFQSxtQ0FBT3NtQixDQUE2QjEyQixFQUFPLElBQUksRUFBQXBGLFFBQVcrOEIsRUFBVTNWLFFBQ2pEdHVCLElBQWJpa0MsUUFBbUNqa0MsSUFBVHN1QixJQUM1QmhpQixFQUFLMjNCLFNBQVdBLEVBQ2hCMzNCLEVBQUtnaUIsS0FBT0EsR0FHZCxNQUFNNFYsRUFBZ0J4akMsSUFBTyxJQUFBeWpDLGVBQWNDLEdBQVdBLEVBQVE1K0IsU0FBUzlFLEdBQU0sUUFDdkUyakMsRUFBZUgsRUFBYyxVQUM3QkksRUFBY0osRUFBYyxTQUM1QkssRUFBaUJMLEVBQWMsWUFFL0JNLEVBQVdDLElBQVUsSUFBQTF4QixZQUFXLENBQUUyeEIsTUFBTUQsSUFDeENFLEVBQWlCSCxFQUFTLFNBQzFCSSxFQUFtQkosRUFBUyxZQUM1QkssRUFBZ0JMLEVBQVMsVUFFekJNLEVBQVF4NEIsRUFDWHhELE1BQUssSUFBQUMsUUFBUXBHLFFBQXdCM0MsSUFBWjJDLFFBQTRDM0MsSUFBbkIyQyxFQUFRQyxTQUV2RG1pQyxFQUFjejRCLEVBQUt4RCxNQUFLLElBQUFDLFFBQU93N0IsSUFBaUIsSUFBQXRrQyxLQUFJMmtDLElBQ3BESSxFQUFZMTRCLEVBQUt4RCxNQUFLLElBQUFDLFFBQU9zN0IsSUFBZSxJQUFBcGtDLEtBQUkwa0MsSUFDaERNLEVBQVczNEIsRUFBS3hELE1BQUssSUFBQUMsUUFBT3U3QixJQUFjLElBQUFya0MsS0FBSTRrQyxJQUU5Q0ssRUFBWSxDQUNoQkMsT0FBUUgsRUFDUkksU0FBVUwsRUFDVk0sTUFBT0osR0E0QlQsTUFBTyxDQUNMSCxPQUFNQyxjQUFhQyxZQUFXQyxXQUFVSyxZQVR0QixNQUtsQixJQUFBMytCLFNBSnVCYixJQUNyQkEsRUFBRXkvQixXQUNGei9CLEVBQUUwL0IsV0FBWSxHQUVRLENBQUNWLEVBQU1DLEVBQWFDLEVBQVdDLEtBSUZRLGVBMUJoQyxDQUFDMWtDLEVBQU0sV0FhaEJmLElBQVJlLEdBQXFCQSxFQUFJQyxRQUFVLEdBQ3JDRCxFQUFJNEYsUUFScUJpRSxJQUxUOUUsV0FNTzlGLElBQW5Ca2xDLEVBQVV0NkIsTUFORTlFLEVBT0RvL0IsRUFBVXQ2QixJQU52QjI2QixXQUNGei9CLEVBQUUwL0IsV0FBWSxNQXlCcEIsRSw0REMxRUssTUFBTUUsRUFDWCxXQUFBOWxDLENBQVkrbEMsRUFBVTM5QixFQUFPLENBQUMsRUFBRytlLEVBQU8sQ0FBQyxHQUN2Q3hsQixLQUFLb2tDLFNBQVdwa0MsS0FBS3FrQyxlQUFlRCxHQUNwQ3BrQyxLQUFLc2tDLGFBQXNDLElBQXhCNzlCLEVBQUs4OUIsZUFDeEJ2a0MsS0FBS2pCLFNBQVd5bUIsR0FBTXptQixTQWN0QmlCLEtBQUtva0MsU0FBV0QsRUFBbUJLLHdCQUF3QnhrQyxLQUFLb2tDLFdBRXZDLElBQXJCcGtDLEtBQUtza0MsZUFDcUMsSUFBeEMsSUFBbUJ4USxpQkFDckI5ekIsS0FBS29rQyxTQUFXLElBQW1CbFEsMkJBQTJCbDBCLEtBQUtva0MsVUFFbkVwa0MsS0FBS29rQyxTQUFXRCxFQUFtQmpRLDJCQUEyQmwwQixLQUFLb2tDLFdBSTdDLE9BQ0EsS0FBcEIsSUFBQTMvQixJQUFHQyxNQUFPK0IsS0FDWkEsRUFBTyxDQUFFZytCLFVBQVVoK0IsR0FDbkJ6RyxLQUFLb2tDLFNBQVdwa0MsS0FBS29rQyxTQUFTN3ZCLFFBQVEsUUFBUyxrQkFDL0N2VSxLQUFLb2tDLFNBQVdwa0MsS0FBS29rQyxTQUFTN3ZCLFFBQVEsUUFBUyxvQkFJbkRtd0IsR0FFQTFrQyxLQUFLMmtDLGFBQWVsK0IsRUFPcEJ6RyxLQUFLNGtDLHFCQUF1QixLQUU1QixNQUFNNUksRUFBU21JLEVBQW1CVSxlQUFlN2tDLEtBQUtva0MsVUFFdEQsSUFBSVUsRUFBYTlrQyxLQUFLb2tDLFNBQVNwd0IsTUFBTW13QixFQUFtQlksbUJBQ3hERCxFQUE0QixPQUFmQSxFQUFzQixHQUFLQSxFQUV4QyxNQUFNRSxFQUFtQmIsRUFBbUJhLG1CQUV0Q0MsRUFBa0JqbEMsS0FBS2tsQyxpQkFBaUJ2a0MsS0FBS1gsTUFNN0NtbEMsR0FBb0IsSUFBQWxoQyxVQUFTLEVBQUFnVixHQUFJNnJCLEdBQ2pDTSxHQUFrQixJQUFBdDhCLFFBQ3RCcThCLEVBTm1COTdCLEdBQ1pBLEVBQUlrTCxRQUFReXdCLEVBQWtCQyxHQU9yQ2psQyxLQUFLcWxDLFVBQVUxa0MsS0FBS1gsT0FFdEJBLEtBQUtzbEMsU0FBV3RKLEVBQU90OUIsSUFBSTBtQyxFQUM3QixDQUVBLHFCQUFPRyxDQUFlbDhCLEdBQ3BCLE1BQU8sY0FBY3dLLEtBQUt4SyxFQUM1QixDQXVCQSw4QkFBT203QixDQUF3QkosR0FDN0IsTUFBd0IsaUJBQWJBLElBQXNELElBQTdCQSxFQUFTcnFCLFFBQVEsT0FDNUNxcUIsRUFLRkEsRUFBUzd2QixRQUFRLHlCQUEwQixTQUNwRCxDQUdBLDJCQUFPaXhCLENBQXFCLytCLEVBQU8sQ0FBQyxFQUFHK3pCLEVBQVEsSUFRN0MsTUFBTyxTQUFTM21CLEtBQUs5SyxPQUFPeXhCLElBQVV6eEIsT0FBT3l4QixHQUFPekIsTUFBTSxLQUFLcGpCLE9BUDNDLENBQUM4dkIsRUFBWXA4QixJQUMzQm84QixFQUFXcDhCLEdBQ05vOEIsRUFBV3A4QixHQUVTLGlCQUFmbzhCLEVBQTBCQSxFQUFhLEdBRzRCaC9CLEdBQVFBLEVBQUsrekIsSUFBVSxFQUM1RyxDQUVBLHFCQUFPcUssQ0FBZVQsR0FDcEIsTUFBTXBJLEVBQVNvSSxFQUFTckwsTUFBTW9MLEVBQW1CWSxtQkFDM0NXLEVBQVUsaUJBZVZDLEVBQWUzSixFQUFPeDBCLE9BQU8sQ0FBQ28rQixFQUFHem1CLE1BQVFBLEdBQUssSUFBTUEsRUFBSSxHQUFLLEdBQU0sSUFJekUsT0FGaUIsSUFBQXhkLFFBRGE4cEIsR0FBS0EsRUFBRXpYLE1BQU0weEIsR0FDSUMsRUFHakQsQ0FRQSxzQkFBT1osR0FDTCxNQUFPLHVDQUNULENBRUEsdUJBQU9DLEdBQ0wsTUFBTywyQ0FDVCxDQU9BLGtCQUFPYSxHQUNMLE1BQU8sMkNBQ1QsQ0FFQSwwQkFBT0MsR0FDTCxNQUFPLGlCQUNULENBT0EsY0FBT0MsQ0FBUTE4QixHQUNiLE9BQU84NkIsRUFBbUIwQixjQUFjaHlCLEtBQUt4SyxFQUMvQyxDQUVBLFVBQUEyOEIsUUFDZXZuQyxJQUFUdUIsT0FDRkEsS0FBS3NsQyxjQUFXN21DLEVBQ2hCdUIsS0FBSzJrQyxrQkFBZWxtQyxFQUNwQnVCLEtBQUtva0MsY0FBVzNsQyxFQUVwQixDQUtBLGFBQUF3bkMsR0FDRSxJQUFJNVYsRUFBTzhULEVBQW1CK0IsZUFBZWxtQyxLQUFLc2xDLFNBQVM5MUIsS0FBSyxNQUMxQyxJQUFsQnhQLEtBQUtqQixXQUNQc3hCLEdBQU8sT0FBYUEsSUFFdEIsTUFDTXRhLEVBRGdCLDRFQUE0RWxDLEtBQUt3YyxHQUM1RUEsRUFBTzFXLFNBQVN3c0IsY0FBY0MseUJBQXlCL1YsR0FHbEYsT0FEQWpzQixPQUFPcUYsV0FBV3pKLEtBQUtnbUMsV0FBWSxHQUM1Qmp3QixDQUNULENBRUEsY0FBQXN3QixHQUNFLElBQUloVyxFQUFPcndCLEtBQUtzbEMsU0FBUzkxQixLQUFLLElBRzlCLE9BRkE2Z0IsRUFBTzhULEVBQW1CK0IsZUFBZTdWLEdBQ3pDanNCLE9BQU9xRixXQUFXekosS0FBS2dtQyxXQUFZLEdBQzVCM1YsQ0FDVCxDQUVBLGlCQUFBaVcsR0FDRSxPQUFPdG1DLEtBQUtzbEMsU0FBUzkxQixLQUFLLEdBQzVCLENBRUEsY0FBQTYwQixDQUFlRCxHQUNiLE9BQXVFLElBQWhFLENBQUMsU0FBVSxZQUFZbmdDLFVBQVMsSUFBQWdCLE1BQUssV0FBWW0vQixJQUFzQkEsRUFBU2xULFVBQVlrVCxDQUNyRyxDQUVBLHFCQUFBbUMsQ0FBc0JDLEVBQVNDLEdBQzdCLE1BQU1oWSxFQUFVMWxCLE9BQU95OUIsR0FBU3pOLE1BQU0sS0FFdEMsT0FEaUIsSUFBQXo0QixNQUFLbXVCLEVBQVNnWSxJQUNaLEVBQ3JCLENBRUEsU0FBQXBCLENBQVVoOEIsR0FJUixPQUFPQSxFQUFJa0wsUUFBUTR2QixFQUFtQjJCLHNCQUhsQixDQUFDejhCLEVBQUs0SyxFQUFJQyxFQUFJQyxJQUN6Qmd3QixFQUFtQnFCLHFCQUFxQnhsQyxLQUFLMmtDLGFBQWN6d0IsR0FHdEUsQ0FFQSxxQkFBT2d5QixDQUFlUSxHQUNwQixNQUFNLFNBQUVybUIsR0FBYSxJQUNyQixZQUFpQjVoQixJQUFiNGhCLEdBQ0ZxbUIsRUFBY0EsRUFBWUMsV0FBVywwQkFBMkIsU0FBU3RtQixNQUN0RHNtQixXQUFXLHlCQUEwQixTQUFTdG1CLEtBRTVEcW1CLENBQ1QsQ0FXQSxnQkFBQUUsQ0FBaUJDLEVBQVNDLEdBQ3hCLE1BQU1DLEVBQVU1QyxFQUFtQjBCLGNBRW5DLE9BQU9nQixFQUFRdHlCLFFBQVF3eUIsRUFBUyxDQUFDQyxFQUFXQyxFQUFTQyxFQUFVQyxNQUVmLElBQTFDaEQsRUFBbUI0QixRQUFRb0IsTUFDSSxJQUE3QixJQUFtQnprQyxRQUFvQyxJQUFsQjFDLEtBQUtqQixVQUM1Q2MsUUFBUUMsS0FFTiw0SEFBZ0RvbkMsZ0VBTXBEQyxFQUFZQSxFQUFVNXlCLFFBQVEsa0JBQW1CLEtBR25ELE1BQU02eUIsRUFBWWpELEVBQW1CcUIscUJBQXFCc0IsRUFBWUksR0FFdEUsSUFBeUIsS0FBckIsSUFBQWhvQyxPQUFNa29DLEtBQXVCLElBQUE3K0IsU0FBUTYrQixHQUN2QyxNQUFPLEdBR1QsTUFBTUMsRUFBVzNpQyxNQUFNK2xCLFFBQVEyYyxHQUFhQSxFQUFZLENBQUNBLEdBTW5ERSxFQUFnQnRuQyxLQUFLNGtDLHFCQUMzQjVrQyxLQUFLNGtDLHFCQUF1QndDLEVBRTVCLE1BQU1HLEVBQVdGLEVBQVMzb0MsSUFBSSxDQUFDOG9DLEVBQVdDLElBQ2pDem5DLEtBQUswbkMsa0JBQWtCUCxFQUFXSyxFQUFXQyxJQUNuRGo0QixLQUFLLElBR1IsT0FEQXhQLEtBQUs0a0MscUJBQXVCMEMsRUFDckJDLEdBRVgsQ0F5QkEsaUJBQUFHLENBQWtCcitCLEVBQUtxQyxFQUFNaThCLEdBRTNCLEdBQW9CLGlCQUFUajhCLEVBQW1CLENBQzVCLEdBQUl5NEIsRUFBbUJvQixlQUFlbDhCLEdBQU0sQ0FDMUMsTUFBTXUrQixFQUFVbDhCLEVBQUs2SSxRQUFRLE1BQU8sUUFDcEMsT0FBT2xMLEVBQUlrTCxRQUFRNHZCLEVBQW1CMkIsc0JBQXVCOEIsRUFDL0QsQ0FHQSxNQUFNQyxFQUFNN25DLEtBQUs4bkMsdUJBQXVCcDhCLEVBQU1pOEIsR0FDOUMsT0FBTzNuQyxLQUFLK25DLGlCQUFpQjErQixFQUFLdytCLEVBQ3BDLENBR0EsTUFBTXBtQyxFQUFVekIsS0FBS2dvQyxpQkFBaUJ0OEIsRUFBTWk4QixHQUM1QyxPQUFPM25DLEtBQUsrbkMsaUJBQWlCMStCLEVBQUs1SCxFQUNwQyxDQWdCQSxzQkFBQXFtQyxDQUF1QnA4QixFQUFNaThCLEdBQzNCLE1BQU1qUyxFQUFVLENBQ2R1UyxhQUFjdjhCLEVBQ2R3OEIsVUFBV1AsRUFDWFEsUUFBU1IsRUFBUSxHQUduQixJQUF5QixJQUFyQjNuQyxLQUFLc2tDLFlBQXNCLENBQzdCLE1BQU04RCxFQUFZcG9DLEtBQUs0a0MscUJBQ3ZCLEdBQUl3RCxHQUFrQyxpQkFBZEEsRUFBd0IsQ0FDOUMxUyxFQUFRMlMsY0FBZ0JELEVBQVVDLGVBQWlCLEdBQ25ELE1BQU1DLEVBQVcsaUJBQWlCNThCLElBQ2xDZ3FCLEVBQVE2UyxhQUFrQzlwQyxJQUF4QjJwQyxFQUFVRSxHQUEwQkYsRUFBVUUsR0FBWSxFQUM5RSxNQUNFNVMsRUFBUTJTLGNBQWdCLEdBQ3hCM1MsRUFBUTZTLFFBQVUsRUFFdEIsQ0FFQSxPQUFPN1MsQ0FDVCxDQU1BLGdCQUFBc1MsQ0FBaUJ0OEIsRUFBTWk4QixHQUNyQixNQUFNalMsRUFBVS95QixPQUFPOGYsT0FBTyxDQUFDLEVBQUcvVyxFQUFNLENBQ3RDdzhCLFVBQVdQLEVBQ1hRLFFBQVNSLEVBQVEsSUFVbkIsT0FQeUIsSUFBckIzbkMsS0FBS3NrQyxjQUNQNU8sRUFBUTJTLGNBQWdCMzhCLEVBQUsyOEIsY0FDN0IzUyxFQUFRdVMsYUFBZXY4QixFQUN2QmdxQixFQUFRd1MsVUFBWVAsRUFDcEJqUyxFQUFReVMsUUFBVVIsRUFBUSxHQUdyQmpTLENBQ1QsQ0FLQSxnQkFBQXFTLENBQWlCMStCLEVBQUt3K0IsR0FDcEIsTUFBTVcsRUFBUSxTQUNSQyxFQUFhLENBQUVQLFVBQVdMLEVBQUlLLFVBQVdDLFFBQVNOLEVBQUlNLFNBZTVELE9BQU85K0IsRUFBSWtMLFFBQVE0dkIsRUFBbUIyQixzQkFickIsQ0FBQzl4QixFQUFPQyxFQUFJQyxTQUVKelYsSUFBbkJncUMsRUFBV3YwQixHQUEwQnUwQixFQUFXdjBCLElBRzdCLElBQW5CczBCLEVBQU0zMEIsS0FBS0ssU0FBNkJ6VixJQUFab3BDLEVBQUkzekIsR0FDM0IyekIsRUFBSTN6QixHQUlObFUsS0FBS3VtQyxzQkFBc0JyeUIsRUFBSTJ6QixHQUkxQyxDQU9BLGdCQUFBM0MsQ0FBaUI3N0IsRUFBSzRLLEVBQUlDLEVBQUlDLEdBQzVCLE1BQU11MEIsRUFBWXYwQixFQUNadzBCLEVBQVN4RSxFQUFtQnFCLHFCQUFxQnhsQyxLQUFLMmtDLGFBQWN6d0IsR0FFMUUsSUFBc0IsS0FBbEIsSUFBQWhWLE9BQU15cEMsS0FBb0IsSUFBQXBnQyxTQUFRb2dDLEdBQ3BDLE1BQU8sR0FNVCxNQUFNckIsRUFBZ0J0bkMsS0FBSzRrQyxxQkFDM0I1a0MsS0FBSzRrQyxxQkFBdUIrRCxFQUU1QixNQUFNQyxFQUFRbGtDLE1BQU0rbEIsUUFBUWtlLEdBQVVBLEVBQVMsQ0FBQ0EsR0FJMUNFLEVBQW1CMUUsRUFBbUI0QixRQUFRMkMsR0FFOUNuQixFQUFXcUIsRUFBTWxxQyxJQUFJLENBQUNnTixFQUFNaThCLEtBQ2hDLE1BQU1sbUIsRUFBT29uQixFQUNUN29DLEtBQUs0bUMsaUJBQWlCOEIsRUFBV2g5QixHQUNqQ2c5QixFQUVKLE9BQU8xb0MsS0FBSzBuQyxrQkFBa0JqbUIsRUFBTS9WLEVBQU1pOEIsS0FDekNuNEIsS0FBSyxJQUdSLE9BREF4UCxLQUFLNGtDLHFCQUF1QjBDLEVBQ3JCQyxDQUNULEUsc0VDcmRGLE1BQU11QixFQXNCSixXQUFBenFDLENBQVlFLEVBQVEsQ0FBQyxFQUFHUSxHQUFXLEdBQ1osSUFBT0ksRUFFNUJaLEVBQU13cUMsU0FGc0I1cEMsRUFFUVosRUFBTXdxQyxTQUZOLElBQUExb0MsV0FFUCxNQUZPLENBQWdCbEIsSUFJcERaLEVBQU15cUMsZ0JBQWtDdnFDLElBQXJCRixFQUFNeXFDLFdBQTJCenFDLEVBQU15cUMsV0FBYWhwQyxLQUFLaXBDLGlCQUFpQjFxQyxHQUM3RkEsRUFBTTJxQyxNQUFRbHBDLEtBQUttcEMsWUFBWTVxQyxFQUFNeXFDLFlBRXJDenFDLEVBQU02cUMsU0FBV3p2QixTQUFTMHZCLHlCQUMxQnJwQyxLQUFLakIsU0FBV0EsRUFDaEJpQixLQUFLekIsTUFBUUEsRUFFYnlCLEtBQUt3TyxXQUNQLENBRUEsT0FBQXNrQixDQUFRamtCLEVBQUsxUCxHQUNYYSxLQUFLekIsTUFBTXNRLEdBQU8xUCxDQUNwQixDQUVBLE9BQUE2ekIsQ0FBUTd6QixHQUNOLE9BQU9hLEtBQUt6QixNQUFNWSxFQUNwQixDQUVBLE1BQUk0VyxHQUNGLE9BQU8vVixLQUFLekIsTUFBTXdYLEVBQ3BCLENBRUEsVUFBQXV6QixDQUFXdnpCLEVBQUl3ekIsR0FVYixPQURBdnBDLEtBQUtnekIsUUFBUSxTQUFTNXRCLFFBUkEsQ0FBQ2pHLEVBQUswUCxLQUVkLFlBQVJBLEdBQ0YsSUFBQW1hLG1CQUZtQixDQUFDN3BCLEVBQUswUCxLQUFVa0gsRUFBR0MsUUFBUW5ILEdBQU8xUCxHQUVyQkEsR0FFaEM0VyxFQUFHeXpCLGFBQWEzNkIsRUFBSzFQLEtBSWxCNFcsQ0FDVCxDQUVBLFdBQUFvekIsQ0FBWUksRUFBUTkwQixHQUNsQixNQUFNZzFCLE9BQWVockMsSUFBTmdXLEVBQWtCQSxFQUFJLElBQUluRyxJQUd6QyxPQURBLElBQUEyUSxlQURzQixDQUFDOWYsRUFBSzBQLElBQVE0NkIsRUFBTzlsQyxJQUFJa0wsRUFBSzFQLEdBQ3ZCb3FDLEdBQ3RCRSxDQUNULENBRUEsV0FBQUMsQ0FBWTN6QixHQUNWLE1BQU1xdUIsRUFBV3BrQyxLQUFLZ3pCLFFBQVEsWUFXOUIsWUFBb0J2MEIsSUFBYjJsQyxFQVRTLENBQUNBLElBQ2YsSUFBSTM5QixFQUFPekcsS0FBS2d6QixRQUFRLFFBQ3hCdnNCLEdBQU8sSUFBQWhDLElBQUc5QixPQUFROEQsR0FBUUEsRUFBTyxDQUFDLEVBQ2xDLE1BQU1rakMsRUFBTyxJQUFJLElBQW1CdkYsRUFBVTM5QixFQUFNLENBQUUxSCxTQUFVaUIsTUFBTWpCLFdBQVlrbkMsZ0JBR2xGLE9BRnFCLElBQUF4aEMsSUFBR3NFLE9BQVE0Z0MsR0FDakI1ekIsRUFBR21iLFVBQVl5WSxFQUFPNXpCLEVBQUdrTixZQUFZMG1CLEdBQzdDNXpCLEdBR3VCNnpCLENBQVF4RixHQUFzQnJ1QixDQUNoRSxDQUVBLGFBQUE0YyxDQUFjb1csRUFBVSxPQUN0QixPQUFPcHZCLFNBQVNnWixjQUFjb1csRUFDaEMsQ0FFQSxVQUFBYyxDQUFXOXpCLEdBQ1QsTUFBTSt6QixFQUFROXBDLEtBQUtnekIsUUFBUSxRQUUzQixJQUFlLEtBREEsSUFBQXZ1QixJQUFHc0UsT0FBUStnQyxHQUNMLENBQ25CLE1BQU1DLEVBQU1wd0IsU0FBU3F3QixlQUFlRixHQUNwQy96QixFQUFHa04sWUFBWThtQixFQUNqQixDQUNBLE9BQU9oMEIsQ0FDVCxDQUVBLE9BQUFrMEIsR0FDRSxNQUFNbDBCLEdBQUssSUFBQXhPLE1BQ1R2SCxLQUFLMnlCLGNBQWNoeUIsS0FBS1gsTUFDeEJBLEtBQUtzcEMsV0FBVzNvQyxLQUFLWCxNQUNyQkEsS0FBSzBwQyxZQUFZL29DLEtBQUtYLE1BQ3RCQSxLQUFLNnBDLFdBQVdscEMsS0FBS1gsTUFKWixDQUtUQSxLQUFLZ3pCLFFBQVEsWUFFZmh6QixLQUFLekIsTUFBTXdYLEdBQUtBLENBQ2xCLENBTUEsTUFBQW1OLEdBS0UsT0FKQWxqQixLQUFLaXFDLFVBQ0xqcUMsS0FBS3pCLE1BQU02bEMsY0FBVzNsQyxFQUN0QnVCLEtBQUt6QixNQUFNa0ksVUFBT2hJLEVBQ2xCdUIsS0FBS3pCLE1BQU15cUMsZ0JBQWF2cUMsRUFDakJ1QixLQUFLZ3pCLFFBQVEsS0FDdEIsQ0FFQSxrQkFBQWtYLEdBS0UsT0FKQWxxQyxLQUFLaXFDLFVBQ0xqcUMsS0FBS3pCLE1BQU02bEMsY0FBVzNsQyxFQUN0QnVCLEtBQUt6QixNQUFNa0ksVUFBT2hJLEVBQ2xCdUIsS0FBS3pCLE1BQU15cUMsZ0JBQWF2cUMsRUFDakJ1QixLQUFLZ3pCLFFBQVEsTUFBTW1YLFNBQzVCLENBRUEsZUFBQUMsQ0FBZ0JqaEMsRUFBS2hLLEdBQ25CLFFBQVlWLElBQVJVLEVBQW1CLENBQ3JCLE1BQU13RixPQUF5QixJQUFWLEVBQ0h3RSxFQUFJaEssSUFBWixJQUFWd0YsRUFBNkJ4RixHQUFpQixPQUFVZ0ssRUFBSWhLLEdBQU1BLEVBQ3BFLENBQ0YsQ0FFQSxXQUFBa3JDLENBQVlsckMsR0FFVixPQURBYSxLQUFLb3FDLGdCQUFnQnBxQyxLQUFLekIsTUFBT1ksR0FDMUJhLElBQ1QsQ0FFQSxpQkFBQXNxQyxDQUFrQm5yQyxHQUdoQixPQUZBYSxLQUFLcXFDLFlBQVlsckMsR0FDakJhLEtBQUtpcUMsVUFDRWpxQyxLQUFLZ3pCLFFBQVEsV0FDdEIsQ0FFQSxPQUFBdVgsUUFDcUI5ckMsSUFBZnVCLEtBQUt6QixRQUNQeUIsS0FBS2d6QixRQUFRLE1BQU13WCxTQUNuQnhxQyxLQUFLekIsV0FBUUUsRUFDYnVCLEtBQUt5c0IsS0FFVCxDQUVBLFNBQUFnZSxDQUFVMUIsRUFBVSxPQUFTL29DLEtBQUtxcUMsWUFBWXRCLEVBQVMsQ0FDdkQsZ0JBQUEyQixDQUFpQnhCLEVBQVEsQ0FBQyxHQUFLbHBDLEtBQUtxcUMsWUFBWW5CLEVBQU8sQ0FDdkQsY0FBQXlCLENBQWV2RyxHQUFZcGtDLEtBQUtxcUMsWUFBWWpHLEVBQVUsQ0FDdEQsVUFBQXdHLENBQVdua0MsRUFBTyxDQUFDLEdBQUt6RyxLQUFLcXFDLFlBQVk1akMsRUFBTSxDQUMvQyxlQUFBb2tDLENBQWdCOUIsRUFBVSxPQUFTL29DLEtBQUtzcUMsa0JBQWtCdkIsRUFBUyxDQUNuRSx1QkFBQStCLENBQXdCNUIsRUFBUSxDQUFDLEdBQUtscEMsS0FBS3NxQyxrQkFBa0JwQixFQUFPLENBQ3BFLG9CQUFBNkIsQ0FBcUIzRyxHQUFZcGtDLEtBQUtzcUMsa0JBQWtCbEcsRUFBVSxDQUNsRSxnQkFBQTRHLENBQWlCdmtDLEVBQU8sQ0FBQyxHQUFLekcsS0FBS3NxQyxrQkFBa0I3akMsRUFBTSxDQUkzRCxTQUFBK0gsR0FDRSxNQUFNeThCLEdBQWEsU0FDbkJqckMsS0FBS3lzQixHQUFLd2UsRUFBV3hlLEdBQUc5ckIsS0FBS1gsS0FDL0IsQ0FFQSxnQkFBQWlwQyxDQUFpQjFxQyxHQUNmLE9BQU8sSUFBQXFCLE1BQUtJLEtBQUtrckMsZ0JBQWlCM3NDLEVBQ3BDLENBRUEsbUJBQUkyc0MsR0FDRixNQUFPLENBQ0wsU0FDQSxpQkFDQSxZQUNBLFNBQ0EsUUFDQSxRQUNBLE1BQ0EsUUFDQSxpQkFDQSxlQUNBLFlBQ0EsV0FDQSxVQUNBLFNBQ0EsV0FDQSxZQUNBLFVBQ0EsVUFDQSxPQUNBLFFBQ0EsT0FDQSxXQUNBLFFBQ0EsT0FDQSxVQUNBLFVBQ0Esa0JBQ0EsY0FDQSxXQUNBLFNBQ0EsY0FDQSxNQUNBLFVBQ0EsV0FDQSxXQUNBLFVBQ0EsUUFDQSxNQUNBLFVBQ0EsV0FDQSxXQUNBLFlBQ0EsV0FDQSxVQUNBLE1BQ0EsT0FDQSxhQUNBLFVBQ0EsU0FDQSxTQUNBLE9BQ0EsT0FDQSxXQUNBLGFBQ0EsT0FDQSxLQUNBLGFBQ0EsWUFDQSxRQUNBLFdBQ0EsVUFDQSxPQUNBLFFBQ0EsT0FDQSxXQUNBLFdBQ0EsT0FDQSxPQUNBLE1BQ0EsV0FDQSxNQUNBLFlBQ0EsWUFDQSxRQUNBLFNBQ0EsTUFDQSxXQUNBLFFBQ0EsT0FDQSxhQUNBLE9BQ0EsVUFDQSxVQUNBLE9BQ0EsY0FDQSxTQUNBLFVBQ0EsYUFDQSxXQUNBLGlCQUNBLE1BQ0EsV0FDQSxXQUNBLE9BQ0EsVUFDQSxVQUNBLFFBQ0EsU0FDQSxXQUNBLFFBQ0EsT0FDQSxRQUNBLE9BQ0EsT0FDQSxhQUNBLE1BQ0EsU0FDQSxVQUNBLFNBQ0EsUUFDQSxPQUNBLFFBQ0EsVUFDQSxXQUNBLFNBQ0EsUUFDQSxZQUNBLE9BQ0EsU0FDQSxRQUNBLFFBQ0EsT0FFSixFLHVGQzNTRixNQUFNQyxHQUF5QyxJQUE3QixJQUFtQnpvQyxNQUU5QixNQUFNMG9DLEVBV1gsV0FBQS9zQyxDQUFZRSxFQUFPOHNDLEdBQ2pCcnJDLEtBQUt3TyxZQUNMeE8sS0FBS3pCLE1BQVFBLEVBQ2J5QixLQUFLcXJDLFlBQWNBLEVBQ25CcnJDLEtBQUtzckMsWUFBWXRyQyxLQUFLcXJDLFlBQ3hCLENBRUEsY0FBQUUsQ0FBZWhMLEdBVWIsT0FUa0IsSUFBQTdtQixXQUFVNm1CLEVBQUcsWUFFTGg1QixNQUN4QixJQUFBN0ksS0FBSXljLElBQ0YsTUFBTTFVLEdBQU8sSUFBQXBELE9BQU04WCxHQUduQixPQURBMVUsRUFBSytrQyxhQUFlLFdBQ2Iva0MsSUFHYixDQUtBLFNBQUFnbEMsQ0FBVUMsR0FDUixHQUFJQSxFQUFLanNDLFFBQVUsSUFBbUIsSUFBZDByQyxFQUV0QixZQURBdHJDLFFBQVFDLEtBQUssc0NBQXNDRSxLQUFLekIsTUFBTUQsd0RBQXFEMEIsS0FBS3pCLE1BQU13dUIsU0FJaEksTUFBTTRlLEVBQWtCLENBQ3RCQyxHQUFJNXJDLEtBQUt3dEIsY0FDVHJjLE1BQU9uUixLQUFLdXRCLG1CQUdQakcsRUFBVW5sQixFQUFPMHBDLEdBQVNILEVBRWpDLElBQUlycEMsRUFDQXMwQixFQUFRMzJCLEtBQUt6QixNQUFNd1gsR0FBRzRULGlCQUFpQnJDLEdBRTNDLEdBQUlxUCxFQUFNbDNCLFFBQVUsRUFBRyxDQUNyQixNQUFNc1csRUFBSy9WLEtBQUt6QixNQUFNd1gsR0FDaEIrMUIsRUFBa0JudUIsSUFDbEJBLElBQVk1SCxJQUNkNGdCLEVBQVEsQ0FBQ2haLEtBSWEsTUFDeEIsTUFDTW91QixHQURnQyxPQUFyQmgyQixFQUFHaTJCLGNBQXlCajJCLEVBQUdpMkIsY0FBZ0JyeUIsVUFDcENnUSxpQkFBaUJyQyxHQUM3Q3lrQixFQUFXM21DLFFBQVVWLE1BQU05QixVQUFVd0MsUUFDckMybUMsRUFBVzNtQyxRQUFRMG1DLElBR3JCRyxFQUNGLENBRUEsTUFBTUMsT0FBeUJ6dEMsSUFBVm90QyxHQXNDRixTQURVcHRDLElBQVZrNEIsR0FBdUJBLEVBQU1sM0IsUUFBVSxLQUNqQixJQUFkMHJDLEVBQ3pCdHJDLFFBQVFDLEtBQUssMkJBQTJCd25CLGtDQUF5Q3RuQixLQUFLekIsTUFBTUQsb0JBQWlCMEIsS0FBS3pCLE1BQU13dUIsVUFJeEg0SixFQUFNdnhCLFFBQVVWLE1BQU05QixVQUFVd0MsUUFDaEN1eEIsRUFBTXZ4QixRQTNDZW03QixJQUVyQixNQUFNNTFCLEVBQXVCLGFBQVZ4SSxHQUNmLElBQUF1WCxXQUFVNm1CLEVBQUdwK0IsRUFBTyxDQUFFZ3FDLGVBQWdCLEtBQU0sSUFDNUNuc0MsS0FBS3VyQyxlQUFlaEwsR0FFeEJsK0IsRUFBVWsrQixFQUFFdnFCLFFBQVEzVCxRQUNwQixNQUFNb0UsRUFBTyxDQUFDLEVBZWQsSUFBeUIybEMsRUFkekIzbEMsRUFBS3JGLFNBQVUsUUFBeUJtL0IsRUFBRXZxQixTQUMxQ3ZQLEVBQUtyRixTQUFVLElBQUFzUixNQUFLLENBQUMsV0FBWWpNLEVBQUtyRixTQUN0Q3FGLEVBQUtwRSxRQUFVQSxFQUdmb0UsRUFBS2xGLFdBQWEsQ0FBQyxFQUNuQmtGLEVBQUtsRixXQUFXZ2dCLEdBQUt2aEIsS0FBS3pCLE1BQU1nakIsR0FDaEM5YSxFQUFLbEYsV0FBV3dyQixLQUFPL3NCLEtBQUt6QixNQUFNd3VCLEtBQ2xDdG1CLEVBQUtsRixXQUFXMnFDLGFBQWVBLEVBRS9CemxDLEVBQUtsRixXQUFXOHFDLFNBQVdscUMsRUFDM0JzRSxFQUFLbEYsV0FBV3dVLEdBQUt3cUIsR0FlckI3bkIsRUFGdUJpekIsRUFWRVMsRUFVOEIvcEMsRUFUMUMsVUFBUCtwQyxHQUF5QixrQkFBUEEsRUFDYixTQUVFLE9BQVBBLEdBQXNCLGVBQVBBLFFBQThCM3RDLElBQVAydEMsR0FDeEN2c0MsUUFBUUMsS0FBSyxpQ0FBaUNzc0MsNkZBRXpDLFFBS016aEMsRUFBWWxFLEtBVy9CLENBRUEsV0FBQTZrQyxDQUFZZ0IsR0FDV0EsSUFDUmxuQyxRQUFRc21DLEdBQVExckMsS0FBS3lyQyxVQUFVQyxHQUM5QyxDQUdBLFNBQUFsOUIsR0FJRSxNQUFNKzlCLEdBQWUsU0FDckJ2c0MsS0FBS3d0QixjQUFnQitlLEVBQWEvZSxjQUNsQ3h0QixLQUFLdXRCLGlCQUFtQmdmLEVBQWFoZixnQkFDdkMsRSx3RkNsSUssTUFBTWlmLEVBY1gsV0FBQW51QyxDQUFZb3VDLEVBQU9DLEVBQVksQ0FBQyxFQUFHM2YsRUFBTyxHQUFJNGYsRUFBUyxXQUNyRDNzQyxLQUFLd08sWUFDTHhPLEtBQUs0c0MsT0FBUyxPQUNkNXNDLEtBQUsrc0IsS0FBT0EsRUFDWi9zQixLQUFLK1YsR0FBSzIyQixFQUFVMzJCLEdBQ3BCL1YsS0FBSzJzQyxPQUFTQSxFQUNkM3NDLEtBQUtzaUMsU0FBVyxDQUNkNS9CLE9BQU0sRUFDTm1xQyxvQkFBcUIsQ0FBQyxHQUV4QjdzQyxLQUFLUSxTQUFVLE9BQVVSLEtBQUtzaUMsU0FBVW9LLEdBS3hDMXNDLEtBQUs4c0MscUJBQXFCMW5DLFFBSk81RixJQUMvQixNQUFPNkIsRUFBUTByQyxHQUFXdnRDLEVBQzFCUSxLQUFLUSxRQUFRcXNDLG9CQUFvQnhyQyxHQUFXOFosR0FBTW5iLEtBQUsrc0MsR0FBUzV4QixLQUdsRW5iLEtBQUtRLFFBQVF3c0MsWUFBY2h0QyxLQUFLaXRDLGVBQWVqdEMsS0FBS1EsUUFBUXFzQyxxQkFDNUQ3c0MsS0FBS3lzQyxNQUFRQSxFQUNienNDLEtBQUt5c0MsTUFDRmhsQyxVQUFVekgsS0FBS2t0QyxtQkFBbUJ2c0MsS0FBS1gsT0FFMUNBLEtBQUttdEMsTUFBUSxJQUFxQnpMLGlDQUNsQzFoQyxLQUFLb2lDLGNBQWdCLElBQXFCQSxjQUMxQ3BpQyxLQUFLb3RDLGNBQWdCLElBQXFCM0wsNkJBQTZCLElBQUksRUFBQTk3QixRQUFXM0YsS0FBSzJzQyxPQUFRM3NDLEtBQUsrc0IsTUFDeEcvc0IsS0FBS3F0QyxTQUFXcnRDLEtBQUtvdEMsY0FBYzVKLFdBQ3JDLENBRUEsa0JBQUFzSixHQUNFLE1BQU8sRUFDVCxDQUVBLGNBQUFHLENBQWVLLEVBQXlCLENBQUMsR0FDdkMsTUFBTUMsRUFBcUIsQ0FDekJDLG9CQUFzQ3J5QixHQUFNbmIsS0FBS3l0QyxpQkFBaUJ0eUIsR0FDbEV1eUIsOEJBQW1EdnlCLEdBQU1uYixLQUFLMnRDLGFBQWF4eUIsR0FDM0V5eUIsVUFBb0N6eUIsR0FBTW5iLEtBQUs2dEMsVUFBVTF5QixHQUN6RDJ5QixTQUFvQzN5QixHQUFNbmIsS0FBS3VpQixTQUFTcEgsR0FDeEQ0eUIsOEJBQW9DNXlCLEdBQU1uYixLQUFLZ3VDLDBCQUEwQjd5QixHQUN6RTh5QiwyQkFBb0M5eUIsR0FBTW5iLEtBQUtrdUMsdUJBQXVCL3lCLEdBQ3RFZ3pCLHFCQUFrQ2h6QixHQUFNbmIsS0FBS291QyxvQkFBb0JqekIsSUFFbkUsT0FBTyxPQUFVb3lCLEVBQW9CRCxFQUN2QyxDQUVBLGFBQUFlLEdBQ0VydUMsS0FBS3pCLFdBQXVCRSxJQUFmdUIsS0FBS3pCLE1BQXNCeUIsS0FBS3pCLE1BQVEsQ0FBQyxFQUN0RCxNQUNNMnFDLEdBQVEsSUFBQTFoQyxRQURPckksUUFBZ0JWLElBQVJVLEdBQ0ssSUFBQVMsTUFBSyxDQUFDLEtBQU0sYUFBY0ksS0FBS3pCLFNBQzNELFFBQUV3cUMsRUFBTyxLQUFFdGlDLEVBQUksU0FBRTI5QixHQUFhcGtDLEtBQUt6QixNQUN6QyxPQUFPLElBQUksSUFBV3dxQyxFQUFTRyxFQUFPemlDLEVBQU0yOUIsRUFDOUMsQ0FFQSxrQkFBQWtLLENBQW1CNWpDLEdBRW5CLENBRUEsY0FBQTZqQyxDQUFleDRCLEVBQUl6VCxJQUNqQixPQUFPeVQsRUFBSXpULEVBQ2IsQ0FFQSxlQUFBa3NDLENBQWdCejRCLEVBQUl6VCxFQUFNZy9CLElBRXhCLE9BQVF2ckIsRUFBSXpULEVBQU1nL0IsRUFDcEIsQ0FFQSxZQUFBbU4sQ0FBYS9qQyxHQUNYLElBQW9CLElBQWhCQSxFQUFFZ2tDLFVBQW9CLENBQ3hCLE1BQU0zNEIsT0FBY3RYLElBQVRpTSxFQUFFcUwsR0FBbUJyTCxFQUFFcUwsR0FBSy9WLEtBQUsydUMsUUFBUTU0QixHQUNwRC9WLEtBQUt1dUMsZUFBZXg0QixFQUFJckwsRUFBRWtrQyxjQUM1QixDQUNGLENBUUEsYUFBQUMsQ0FBY25rQyxHQUNaLE1BQU1xTCxPQUFpQnRYLElBQVppTSxFQUFFcUwsR0FBR0EsR0FBbUJyTCxFQUFFcUwsR0FBR0EsR0FBS3JMLEVBQUVxTCxHQUV6Qys0QixFQUFTLENBQUV6dEMsT0FBTyxnQ0FBaUNtQyxLQUFLeEQsS0FBS210QyxNQUFNakwsR0FBSW5zQixNQU12RWc1QixHQUFhLElBQUFDLGNBSkEsQ0FBQ3RrQyxFQUFHNDJCLEtBQ3JCdGhDLEtBQUt3dUMsZ0JBQWdCejRCLEVBQUlyTCxFQUFFdWtDLGVBQWdCM04sS0FJdkM0TixFQUFzQjVwQyxJQUMxQnRGLEtBQUtxdEMsU0FBU3BpQyxLQUFLNmpDLElBU2Z6a0MsR0FBc0IsSUFBakJLLEVBQUV5a0MsV0FOU3prQyxJQUNwQnFrQyxFQUFXcmtDLEdBQ1JqRCxVQUFVeW5DLEdBQ04sQ0FBRTd0QyxPQUFPLGNBQWVtQyxLQUFLeEQsS0FBS210QyxNQUFNbEwsS0FFOUIsS0FBTSxDQUFHNWdDLE9BQU8sOENBQStDbUMsS0FBS3hELEtBQUttdEMsTUFBTWxMLEtBRWxHLE9BQU81M0IsRUFBR0ssRUFDWixDQUVBLFNBQUFtakMsQ0FBVW5qQyxHQUNSLE9BQU8xSyxLQUFLNnVDLGNBQWNua0MsRUFDNUIsQ0FFQSxZQUFBMGtDLFFBRTZCM3dDLElBQXZCdUIsS0FBS290QyxlQUNQcHRDLEtBQUtvdEMsY0FBY2xKLGVBQWUsQ0FBQyxXQUFZLFNBRW5ELENBRUEsWUFBQXlKLENBQWF4eUIsR0FDWG5iLEtBQUtvdkMsY0FDUCxDQUVBLGdCQUFBM0IsQ0FBaUJ0eUIsUUFDTTFjLElBQWpCdUIsS0FBSzJ1QyxTQUNQM3VDLEtBQUsydUMsUUFBUXBFLGVBR1k5ckMsSUFBdkJ1QixLQUFLb3RDLGVBQ1BwdEMsS0FBS290QyxjQUFjbEosZUFBZSxDQUFDLFVBSXZDLENBRUEsZUFBQW1MLEdBQ0UsT0FBT3J2QyxLQUFLcXRDLFFBQ2QsQ0FFQSxlQUFBaUMsQ0FBZ0I1a0MsR0FDZCxRQUFnQmpNLElBQVp1QixLQUFLK1YsR0FDUCxPQUdGLE1BQU13NUIsR0FBYSxJQUFBcndDLE9BQU13TCxFQUFFaXNCLE9BQVNqc0IsRUFBRThrQyxLQUFPOWtDLEVBQUVpc0IsT0FNeEIsQ0FDckIxVCxZQUxhLENBQUN1c0IsRUFBTTlqQyxJQUFTOGpDLEVBQUt2c0IsWUFBWXZYLEdBTTlDK2pDLE1BTFksQ0FBQ0QsRUFBTTlqQyxJQUFTOGpDLEVBQUtDLE1BQU0vakMsSUFVUGhCLEVBQUVnbEMsYUFacEIsRUFBQ0YsRUFBTTlqQyxJQUFTOGpDLEVBQUtHLGFBQWFqa0MsRUFBTThqQyxFQUFLSSxjQWFsREwsRUFBV3Z2QyxLQUFLMnVDLFFBQVF6ckIsVUFDbkNsakIsS0FBS3l1QyxhQUFhL2pDLEVBQ3BCLENBUUEsbUJBQUEwakMsQ0FBb0JqekIsR0FDbEIsTUFBTTFVLEVBQU8wVSxFQUFFMDBCLGdCQUVmLE9BREE3dkMsS0FBS3N2QyxnQkFBZ0I3b0MsR0FDZCxDQUNMcEYsT0FBUSxpQkFDUm1DLEtBQU14RCxLQUFLbXRDLE1BQU1qTCxHQUVyQixDQU9BLHlCQUFBOEwsQ0FBMEJ0akMsR0FHeEIsT0FGQTFLLEtBQUt1aUIsU0FBUzdYLEdBQ2QxSyxLQUFLc3ZDLGdCQUFnQjVrQyxHQUNkLENBQ0xySixPQUFRLG9DQUNSMFUsR0FBSS9WLEtBQUsrVixJQUFNL1YsS0FBSzJ1QyxRQUFRNTRCLEdBQzVCdlMsS0FBTXhELEtBQUttdEMsTUFBTWpMLEdBRXJCLENBRUEsYUFBQTROLENBQWNwbEMsR0FDWixNQUFPcStCLEVBQVNDLEVBQVl2aUMsRUFBTTI5QixHQUFZMTVCLEVBRTlDLE9BREExSyxLQUFLMnVDLFFBQVUsSUFBSSxJQUFXLENBQUU1RixVQUFTQyxhQUFZdmlDLE9BQU0yOUIsYUFDcERwa0MsS0FBSzJ1QyxPQUNkLENBRUEsUUFBQXBzQixDQUFTN1gsR0FHUCxNQUFPLENBQ0xySixPQUFRLGFBQ1IwVSxHQUhTL1YsS0FBSytWLElBREYsQ0FBQ3RQLEdBQVN6RyxLQUFLOHZDLGNBQWNycEMsR0FDckJzcEMsRUFBTSxJQUFBeHhDLE9BQU0sQ0FBQyxVQUFXLGdCQUFpQixPQUFRLFlBQWFtTSxJQUlsRmxILEtBQU14RCxLQUFLbXRDLE1BQU02QyxFQUVyQixDQUVBLGVBQUFDLENBQWdCeHBDLEdBQ2hCLENBUUEsc0JBQUF5bkMsQ0FBdUJ4akMsR0FJckIsT0FGQUEsRUFBRXdsQyxXQUFXbjZCLEdBREMsQ0FBQ3RQLEdBQVN6RyxLQUFLOHZDLGNBQWNycEMsR0FDekJzcEMsRUFBTSxJQUFBeHhDLE9BQU0sQ0FBQyxVQUFXLGdCQUFpQixPQUFRLFlBQWFtTSxJQUNoRjFLLEtBQUtzdkMsZ0JBQWdCNWtDLEVBQUV3bEMsWUFDaEIsQ0FDTDd1QyxPQUFRLGlDQUNSMFUsR0FBTS9WLEtBQUsrVixJQUFNckwsRUFBRXdsQyxXQUFXbjZCLEdBQUdBLEdBQ2pDdlMsS0FBTXhELEtBQUttdEMsTUFBTWxMLEdBRXJCLENBUUEsa0JBQUFpTCxDQUFtQjlyQyxHQUNqQixNQUFNQyxFQUFTRCxFQUFRQyxPQUNqQjh1QyxHQUFjLElBQUE5dkMsV0FBV29HLEdBQVN6RyxLQUFLaXdDLGdCQUFnQnhwQyxJQUV2REEsRUFESzBwQyxFQUFZbndDLEtBQUtRLFFBQVF3c0MsWUFBWTNyQyxHQUNuQ2dKLENBQUdqSixRQUVIM0MsSUFBVGdJLEdBRGEsQ0FBQ2lFLElBQU0xSyxLQUFLcXRDLFNBQVNwaUMsS0FBS1AsSUFFekMwbEMsQ0FBU3p0QyxPQUFPdUMsT0FBT3VCLEdBRTNCLENBRUEsU0FBQStILEdBS0EsRSxxRUM5UEssTUFBTTZoQyxFQWVYLFdBQUFoeUMsQ0FBWUMsRUFBTXFNLEVBQVlsRSxFQUFNcEYsRUFBUyxZQUFhcUIsR0FBUSxHQUVoRSxNQUFNbEMsRUFBVSxDQUNkbEMsT0FDQXFNLGFBQ0FsRSxPQUNBcEYsVUFFRnJCLEtBQUtzd0MscUJBQXFCOXZDLEVBQzVCLENBRUEsb0JBQUE4dkMsQ0FBcUJsdkMsR0FDbkIsTUFBTW12QyxFQUFrQixJQUFtQnZwQyxZQUFZSSxVQUFVLGNBQzNENUUsR0FBZ0IsT0FBVXBCLEdBRWhDbXZDLEVBQWdCdGxDLEtBQUt6SSxHQUNyQnBCLE9BQVUzQyxDQUdaLENBRUEsZ0JBQU82RixDQUFVQyxHQUNmLE1BQU1DLEdBQVEsSUFBQUMsSUFBR0MsT0FDWEMsR0FBUSxJQUFBRixJQUFHOUIsUUFDRmlDLE1BRWYsT0FGbUMsSUFBZEosRUFBTkksRUFDV0wsS0FEZ0MsSUFBZEksRUFBTUMsSUFFOUIsSUFBQWxGLFNBQVEsRUFBQW1GLFVBQVcsRUFBQUMsUUFBUyxFQUFBekIsTUFBNUIsQ0FBbUNrQixJQUFLLElBQUFsQixPQUFNa0IsRUFDcEUsQ0FFQSx3QkFBT2dCLEdBQ0wsTUFBTyxDQUFDLFNBQVUsVUFBVyxlQUFnQixhQUFjLFVBQVcsVUFBVyxXQUFZLFVBQVcsZ0JBQWlCLG1CQUFvQixTQUFVLGFBQWMsY0FBZSxZQUFhLFNBQVUsU0FBVSxVQUFXLFlBQWEsWUFBYSxVQUFXLFVBQVcsUUFBUyxRQUFTLE9BQVEsZ0JBQWlCLGNBQWUsVUFBVyxVQUFXLFdBQVkscUJBQXNCLGFBQWMsU0FBVSxZQUFhLFlBQWEsT0FBUSxPQUFRLFFBQVMsSUFBSyxJQUNwZCxDQUVBLFNBQUFpSixHQUNFeE8sS0FBS3lzQixHQUFLLEVBQUFBLEVBQ1osRSxvREMvQ0YsU0FBUzBlLElBQ1AsT0FBb0MsSUFBN0IsSUFBbUJ6b0MsS0FDNUIsQ0FFQSxTQUFTOHRDLEVBQWN6NkIsR0FFckIsT0FEa0IsSUFBQXJXLFVBQVEsSUFBQXNGLEtBQUksSUFBSSxJQUFBM0UsWUFBVyxJQUFJLElBQUE0RSxNQUFLLFlBQy9Dd3JDLENBQVUxNkIsRUFDbkIsQ0FFQSxTQUFTMjZCLEVBQVloakIsRUFBS2pFLEVBQUtrbkIsR0FBYyxHQUMzQyxNQUFNQyxFQUFPQyxFQUFpQm5qQixFQUFLakUsRUFBS2tuQixHQUN4QyxPQUF1QixJQUFoQkMsRUFBS254QyxRQUFlLElBQUF3SixNQUFLMm5DLEdBQVFBLENBQzFDLENBRUEsU0FBU0UsRUFBY3BqQixFQUFLakUsRUFBS2tuQixHQUMvQixNQUFNNTZCLEVBQUs0RCxTQUFTc1EsY0FBY3lELEdBRTVCM29CLEdBQWlCLElBQUFyRixVQUFRLElBQUFzRixLQUFJLElBQUksSUFBQTNFLFlBQVcsSUFBSSxJQUFBNEUsTUFBSyxhQUUzRCxHQUFXLE9BQVA4USxJQUFzQyxJQUF2QmhSLEVBQWVnUixJQUtsQyxRQUFZdFgsSUFBUmdyQixHQUFxQjFnQixPQUFPMGdCLEdBQUtzbkIsT0FBT3R4QyxPQUFTLEVBQUcsQ0FDdEQsU0FBU3V4QyxFQUFnQjFwQixHQUN2QixJQUVFLE9BRGlCM04sU0FBU2dRLGlCQUFpQnJDLEdBQzNCN25CLE9BQVMsQ0FDM0IsQ0FBRSxNQUFPNkYsR0FDUCxPQUFPLENBQ1QsQ0FDRixDQUVBLE1BQU0yckMsRUFBc0JELEVBQWdCdm5CLElBQ3hCLElBQWhCa25CLElBQXdDLElBQWhCeEYsTUFBZ0QsSUFBeEI4RixHQUNsRHB4QyxRQUFRQyxLQUFLLGdDQUFnQzJwQixnQ0FBa0NpRSxJQUVuRixPQWxCRTd0QixRQUFRQyxLQUFLLCtEQUErRGlXLElBbUJoRixDQUVBLFNBQVM4NkIsRUFBaUJuakIsRUFBS2pFLEVBQUtrbkIsR0FBYyxHQUVoRCxJQUFJTyxHQUFXLEVBRWYsTUFnQk10SSxFQWhCd0IsQ0FBQ3RoQixJQUM3QixJQUFJOW5CLEVBQU0sR0FDVixJQUNFQSxFQUFNbWEsU0FBU2dRLGlCQUFpQnJDLEVBQ2xDLENBQUUsTUFBT2hpQixHQUFLOUYsRUFBTSxFQUFHLENBQ3ZCLElBQ0UweEMsRUFBV3YzQixTQUFTc1EsY0FBY1IsS0FBUzlQLFNBQVNzUSxjQUFjeUQsSUFDakQsSUFBYndqQixJQUNGMXhDLEVBQU0sQ0FBQ21hLFNBQVNzUSxjQUFjUixJQUVsQyxDQUFFLE1BQU9ua0IsR0FFVCxDQUNBLE9BQU85RixHQUdNMnhDLE1BbkJVMXlDLElBQVJnckIsRUFBb0IsR0FBR2lFLEtBQU9qRSxJQUFRaUUsR0EwQnZELE9BTG9CLElBQWhCaWpCLEdBRUZHLEdBRDZCLElBQWJJLEVBQW9CLE9BQVN4akIsRUFDdEJqRSxFQUFLa25CLEdBR3ZCL0gsQ0FDVCxDQUVBLFNBQVN3SSxFQUFhanlDLEVBQUt1dUIsRUFBS2pFLEdBTTlCLE9BTFlvbkIsRUFBaUJuakIsRUFBS2pFLEdBSTlCcmtCLFFBSGlCc0csSUFDbkJBLEVBQUtnVyxNQUFNQyxRQUFVeGlCLElBR2hCYSxJQUNULENBYUEsU0FBU3F4QyxFQUFtQjNqQixFQUFLakUsR0FJL0IsU0FBU25DLEVBQVNtQyxHQUNoQixPQUFPNG5CLEVBQW1CM2pCLEVBQUtqRSxFQUNqQyxDQStPQSxPQW5QQXFuQixFQURBcGpCLEVBQXVCLGlCQUFWLEVBQXFCQSxFQXZHcEMsU0FBaUMzWCxHQUUvQixJQUFJZ1gsRUFBTyxHQURPNU8sS0FBSytPLFNBQVM3QyxTQUFTLElBQUk5VixRQUFRLE9BQVEsSUFBSTRZLFVBQVUsRUFBRyxLQU85RSxZQUx3QjF1QixJQUFwQnNYLEVBQUdDLFFBQVErVyxLQUNiaFgsRUFBR0MsUUFBUStXLEtBQU9BLEVBRWxCQSxFQUFPaFgsRUFBR0MsUUFBUStXLEtBRWIsZUFBZUEsS0FDeEIsQ0E4RjBDdWtCLENBQXdCNWpCLEdBQzdDakUsR0FBSyxHQVl4Qm5DLEVBQVM1b0IsSUFBTzJMLEdBQU8zRixNQUFNZ0ssS0FBS21pQyxFQUFpQm5qQixFQUFLakUsSUFBTS9xQixJQUFJMkwsR0FRbEVpZCxFQUFTbGlCLFFBQVdpRixHQUFPM0YsTUFBTWdLLEtBQUttaUMsRUFBaUJuakIsRUFBS2pFLElBQU0vcUIsSUFBSTJMLEdBRXRFaWQsRUFBU3VwQixpQkFBbUIsSUFBTUEsRUFBaUJuakIsRUFBS2pFLEdBV3hEbkMsRUFBU2lxQixTQUFZbm1DLElBQ1B5bEMsRUFBaUJuakIsRUFBS2pFLEdBRTlCcmtCLFFBRGFzRyxHQUFRQSxFQUFLOGxDLFVBQVVDLElBQUlybUMsSUFFckNwTCxNQVFUc25CLEVBQVNvcUIsWUFBZXRtQyxJQUNWeWxDLEVBQWlCbmpCLEVBQUtqRSxHQUk5QnJrQixRQUhnQnNHLElBQ2xCQSxFQUFLOGxDLFVBQVVoSCxPQUFPcC9CLEtBR2pCcEwsTUFRVHNuQixFQUFTcXFCLFNBQVl2bUMsSUFDUHlsQyxFQUFpQm5qQixFQUFLakUsR0FlOUJya0IsUUFSZ0JzRyxJQUNsQixNQUFNa21DLEdBQW9CLElBQUFseUMsVUFBUSxJQUFBaUMsUUFBTyxFQUFBNEcsVUFBVSxJQUFBd3dCLE9BQU0sS0FBL0IsQ0FBcUNydEIsRUFBS21tQyxXQUM5REMsRUFBYzFtQyxFQUFFMnRCLE1BQU0sS0FHNUI2WSxFQUFrQnhzQyxRQUZGcW1CLEdBQUsvZixFQUFLOGxDLFVBQVVoSCxPQUFPL2UsSUFHM0NxbUIsRUFBWTFzQyxRQUZFcWtCLEdBQU8vZCxFQUFLOGxDLFVBQVVDLElBQUlob0IsTUFLbkN6cEIsTUFHVHNuQixFQUFTaWpCLFFBQVUsT0FjbkJqakIsRUFBU3lxQixZQUFjLENBQUMzbUMsRUFBR3hDLEtBQ2Jpb0MsRUFBaUJuakIsRUFBS2pFLEdBSzlCcmtCLFFBSmdCc0csS0FDbEI5QyxPQUFnQm5LLElBQVRtSyxFQUFxQkEsR0FBUThDLEVBQUs4bEMsVUFBVVEsU0FBUzVtQyxJQUNyRE0sRUFBSzhsQyxVQUFVQyxJQUFJcm1DLEdBQUtNLEVBQUs4bEMsVUFBVWhILE9BQU9wL0IsS0FHaERwTCxNQUdUc25CLEVBQVMycUIsT0FBUyxDQUFDN21DLEVBQUd4QyxLQUNwQjBlLEVBQVN5cUIsWUFBWTNtQyxFQUFHeEMsR0FDakI1SSxNQU9Uc25CLEVBQVNyRSxZQUFlaXZCLElBQ0ssSUFBdkI1cUIsRUFBU3ZSLEdBQUd0VyxPQUNkNm5CLEVBQVN2UixHQUFHa04sWUFBWWl2QixHQUV4QnJ5QyxRQUFRQyxLQUFLLGdDQUFnQzJwQixrQ0FHeENuQyxFQUFTdlIsSUFRbEJ1UixFQUFTNnFCLGFBQWdCL21DLElBV3ZCaWdCLHNCQVZzQixLQUNSd2xCLEVBQWlCbmpCLEVBQUtqRSxHQU85QnJrQixRQU5hc0csSUFDZixJQUNFQSxFQUFLOGxDLFVBQVVDLElBQUlybUMsRUFDckIsQ0FBRSxNQUFPOUYsR0FDVCxPQWNOZ2lCLEVBQVM4cUIsZUFBaUIsQ0FBQ2huQyxFQUFHaW5DLEtBQzVCLE1BQU03eUMsRUFBTXF4QyxFQUFpQm5qQixFQUFLakUsR0FDNUI2b0IsRUFBK0IsaUJBQVosRUFBdUI1QixFQUFZaGpCLEVBQUsya0IsR0FBU0EsRUFRMUUsT0FOaUMsSUFBN0I3QixFQUFjOEIsR0FDaEI5eUMsRUFBSTRGLFFBRmFzRyxHQUFRQSxFQUFLNmQsWUFBWStvQixHQUFhNW1DLEVBQUs4bEMsVUFBVUMsSUFBSXJtQyxHQUFLTSxFQUFLOGxDLFVBQVVoSCxPQUFPcC9CLEtBRzVFLElBQWhCKy9CLEtBRVR0ckMsUUFBUUMsS0FBSyxnQ0FBZ0N1eUMsMkRBQStEam5DLEtBRXZHcEwsTUFHVHNuQixFQUFTaXJCLGNBQWdCLENBQUNubkMsRUFBR2luQyxLQUMzQixNQUFNN3lDLEVBQU1xeEMsRUFBaUJuakIsRUFBS2pFLEdBQzVCNm9CLEVBQTZCLGlCQUFWRCxFQUNyQjNCLEVBQVloakIsRUFBSzJrQixHQUNqQkEsRUFJSixHQUZBN3lDLEVBQUk0RixRQUFRc0csR0FBUUEsRUFBSzhsQyxVQUFVaEgsT0FBT3AvQixLQUVULElBQTdCb2xDLEVBQWM4QixHQUFxQixDQUNyQyxNQUFNRSxFQUFhOXRDLE1BQU1nSyxLQUFLbFAsR0FBSytWLEtBQUs3SixHQUFRQSxJQUFTNG1DLEdBRXJERSxFQUNGQSxFQUFXaEIsVUFBVUMsSUFBSXJtQyxJQUNBLElBQWhCKy9CLEtBQ1R0ckMsUUFBUUMsS0FDTixnQ0FBZ0N1eUMsNkRBQWlFam5DLElBR3ZHLE1BQTJCLElBQWhCKy9CLEtBQ1R0ckMsUUFBUUMsS0FDTixnQ0FBZ0N1eUMsMkRBQStEam5DLEtBSW5HLE9BQU9wTCxNQW9DVDJDLE9BQU93USxlQUFlbVUsRUFBVSxLQUFNLENBQUU3akIsSUFBSyxJQUFNaXRDLEVBQVloakIsRUFBS2pFLEdBQUssS0FDekU5bUIsT0FBT3dRLGVBQWVtVSxFQUFVLE1BQU8sQ0FBRTdqQixJQUFLLElBQU1vdEMsRUFBaUJuakIsRUFBS2pFLEtBQzFFOW1CLE9BQU93USxlQUFlbVUsRUFBVSxNQUFPLENBQUU3akIsSUFBSyxJQUFNb3RDLEVBQWlCbmpCLEVBQUtqRSxHQUFLLEdBQU9ocUIsU0FDdEZrRCxPQUFPd1EsZUFBZW1VLEVBQVUsU0FBVSxDQUFFN2pCLElBQUssSUFBTW90QyxFQUFpQm5qQixFQUFLakUsR0FBSyxHQUFPaHFCLFFBQVUsSUFDbkdrRCxPQUFPd1EsZUFBZW1VLEVBQVUsUUFBUyxDQUFFN2pCLElBQUssSUFBTW90QyxFQUFpQm5qQixFQUFLakUsR0FBSyxHQUFPaHFCLFFBQVUsSUFDbEdrRCxPQUFPd1EsZUFBZW1VLEVBQVUsV0FBWSxDQUFFN2pCLElBQUssSUFBTW90QyxFQUFpQm5qQixFQUFLakUsS0FDL0U5bUIsT0FBT3dRLGVBQWVtVSxFQUFVLE1BQU8sQ0FDckM3akIsSUFBSyxLQUNILE1BQU1zUyxFQUFLMjZCLEVBQVloakIsRUFBS2pFLEdBQUssR0FDakMsWUFBV2hyQixJQUFQc1gsRUFDSyxRQUNnQnRYLElBQWRzWCxFQUFHdFcsT0FDTCxDQUFDc1csR0FFRHJSLE1BQU1nSyxLQUFLcUgsTUFLeEJwVCxPQUFPd1EsZUFBZW1VLEVBQVUsU0FBVSxDQUFFM2pCLElBQU14RSxHQUFRaXlDLEVBQWFqeUMsRUFBS3V1QixFQUFLakUsR0FBTWhtQixJQUFLLElBQU02akIsSUFDbEcza0IsT0FBT3dRLGVBQWVtVSxFQUFVLFlBQWEsQ0FBRTNqQixJQUFNeEUsR0FBUWl5QyxFQUFhanlDLEVBQUt1dUIsRUFBS2pFLEdBQU1obUIsSUFBSyxJQUFNNmpCLElBRTlGQSxDQUNULEMsdUtDaFRPLE1BQU1tckIsRUFVWCxXQUFBcDBDLENBQVlFLEVBQVEsQ0FBQyxHQUNuQnlCLEtBQUsweUMsTUFBUXYwQixLQUFLK08sU0FDbEJsdEIsS0FBS3dPLFlBQ0x4TyxLQUFLMnlDLG1CQUFvQixFQUN6QjN5QyxLQUFLc2lDLFNBQVcsS0FDZCxNQUFNdlYsRUFBTy9zQixLQUFLaXRCLFdBQ1oxTCxFQUFLaGpCLEVBQU1nakIsR0FBS2hqQixFQUFNZ2pCLEdBQUt3TCxFQUNqQyxNQUFPLENBQ0xBLE9BQ0F4TCxLQUNBd25CLFFBQVMsTUFDVGh6QixRQUFJdFgsRUFDSmdJLFVBQU1oSSxFQUNOaXdDLFdBQVcsRUFDWEUsY0FBZSxHQUNmTyxZQUFZLEVBQ1pGLGVBQWdCLEdBQ2hCMkQsb0JBQW9CLEVBQ3BCQyxPQUFRLElBQUl0eEIsSUFDWnV4QixJQUFLLElBQUl2eEIsSUFDVHd4QixVQUFXLElBQ1hDLDJCQUE0QixDQUFDLEVBQzdCdHdDLE9BQU8sRUFDUDBoQyxjQUFVM2xDLEVBQ1Yrd0MsS0FBTTcxQixTQUFTMHZCLHlCQUNmL3FDLE1BQU0sUUFBbUIwQixRQUc3QkEsS0FBSzRzQyxPQUFTLENBQUMsRUFDZjVzQyxLQUFLbXRDLE1BQVEsSUFBcUJ6TCxpQ0FDbEMxaEMsS0FBS2l6QyxvQkFBc0IsSUFBcUI3USxjQUNoRHBpQyxLQUFLdWlDLG1CQUFxQixJQUFxQkEsbUJBRS9DdmlDLEtBQUt6QixPQUFRLE9BQVV5QixLQUFLc2lDLFdBQVkvakMsR0FDeEN5QixLQUFLa3pDLHFCQUF3RCxJQUFsQ2x6QyxLQUFLekIsTUFBTXEwQyxtQkFBOEI1eUMsS0FBS216QywwQkFBMEJ4eUMsS0FBS1gsTUFBUUEsS0FBS296Qyw0QkFBNEJ6eUMsS0FBS1gsTUFDdEosTUFBTXF6QyxFQUFnQnJ6QyxLQUFLa3JDLGdCQUUzQmxyQyxLQUFLekIsTUFBTSswQyxlQUFnQixJQUFBMXpDLE1BQUt5ekMsRUFBZXJ6QyxLQUFLekIsWUFDMUJFLElBQXRCdUIsS0FBS3pCLE1BQU0wSixRQUNiakksS0FBS21JLFVBQVVuSSxLQUFLekIsTUFBTTBKLFFBRTVCakksS0FBS3V6QyxpQkFDTHZ6QyxLQUFLekIsTUFBTThDLE9BQVMsU0FDcEJyQixLQUFLeXNDLE1BQVEsSUFBSSxFQUFBOW1DLFFBQ2pCM0YsS0FBS3pCLE1BQU1pMUMsd0JBQTBCeHpDLEtBQUt5ekMsa0JBQWtCenpDLEtBQUt6QixPQUNqRSxNQUFNbTFDLEVBQVkxekMsS0FBS3pCLE1BQU13MEMsVUFDN0IveUMsS0FBSzRKLEtBQU8sSUFBSThwQyxFQUFVMXpDLEtBQUt5c0MsTUFBTyxDQUFFMTJCLEdBQUcvVixLQUFLekIsTUFBTXdYLElBQU0vVixLQUFLekIsTUFBTXd1QixLQUFNL3NCLEtBQUt6QixNQUFNZ2pCLElBQ3hGdmhCLEtBQUtvdEMsY0FBZ0JwdEMsS0FBSzRKLEtBQUt3akMsY0FDL0JwdEMsS0FBSzJ6QyxZQUFjM3pDLEtBQUs0SixLQUFLeWxDLGtCQUM3QnJ2QyxLQUFLMnpDLFlBQVlqUixTQUFXMWlDLEtBQUt6QixNQUFNRCxLQUN2QzBCLEtBQUs0ekMscUJBQXVCNXpDLEtBQUs2ekMsdUJBQ2pDN3pDLEtBQUs4ekMsaUJBQ0w5ekMsS0FBS21yQyxVQUFZc0gsRUFBV3RILFlBQzVCbnJDLEtBQUt6QixNQUFNdzFDLGNBQWdCLEdBQzNCL3pDLEtBQUtnMEMsNkJBQ1AsQ0FHQSxXQUFJQyxHQUNGLE9BQU9qMEMsS0FBS3F0QyxRQUNkLENBRUEsbUJBQUluQyxHQUNGLE1BQU8sQ0FFTCxZQUFhLFFBQVMsa0JBQW1CLE1BQU8sWUFBYSxTQUFVLEtBQU0sT0FBUSxhQUFjLFFBQVMsV0FBWSxRQUFTLFlBR2pJLG9CQUFxQixlQUFnQixnQkFBaUIsZ0JBQWlCLGdCQUFpQixjQUFlLGVBQWdCLGFBQWMsYUFBYyxpQkFBa0IsdUJBQXdCLG1CQUFvQixlQUFnQixnQkFBaUIsZ0JBQWlCLGdCQUFpQixZQUFhLGdCQUFpQixnQkFBaUIsZ0JBQWlCLGlCQUFrQixjQUFlLFlBQWEsWUFBYSxnQkFBaUIsa0JBQW1CLGVBQWdCLHdCQUF5QixnQkFBaUIsbUJBQW9CLGNBQWUsa0JBQW1CLFlBQWEsZ0JBQWlCLGVBR2prQixTQUFVLGVBQWdCLFlBQWEsVUFBVyxVQUFXLFdBQVksT0FBUSxhQUNqRixjQUFlLGFBQWMsaUJBQWtCLGFBQWMsT0FBUSxNQUFPLFlBQzVFLE1BQU8sWUFBYSxXQUFZLE9BQVEsVUFBVyxjQUFlLFdBQVksV0FBWSxPQUFRLE9BQVEsUUFHMUcsTUFBTyxTQUFVLFFBQVMsU0FBVSxRQUdwQyxPQUFRLFNBQVUsV0FBWSxPQUFRLE1BQU8sV0FBWSxLQUFNLFFBRy9ELGlCQUFrQixTQUFVLFVBQVcsYUFHdkMsVUFBVyxVQUFXLGFBR3RCLFFBQVMsUUFBUyxZQUFhLFdBQVksUUFBUyxpQkFHcEQsaUJBQWtCLFdBQVksV0FBWSxZQUFhLE9BQVEsT0FBUSxXQUFZLFFBQVMsT0FBUSxVQUFXLGNBQWUsV0FBWSxTQUFVLGNBQWUsTUFBTyxVQUFXLFdBQVksV0FBWSxVQUFXLE1BQU8sVUFBVyxPQUFRLE9BQVEsYUFBYyxXQUFZLFVBQVcsT0FBUSxRQUFTLFdBQVksV0FBWSxPQUFRLE1BQU8sV0FBWSxTQUFVLFFBQVMsT0FBUSxVQUFXLFNBQVUsVUFBVyxhQUFjLFdBQVksT0FBUSxPQUFRLFVBQVcsVUFBVyxRQUFTLFNBQVUsV0FBWSxRQUFTLE9BQVEsT0FBUSxTQUFVLE1BQU8sT0FBUSxVQUFXLFFBQVMsVUFBVyxPQUFRLFFBQVMsU0FFbm1CLENBRUEsZ0JBQU9DLEdBQ0wsT0FBTyxJQUFtQnpvQyxLQUM1QixDQUVBLGtDQUFPd3hDLENBQTRCM29DLEVBQWMsR0FBSTRvQyxHQUNuRCxHQUFJQSxFQUFXMTBDLE9BQVMsRUFBRyxDQUN6QixNQUtNMjBDLEVBQWlCQyxJQUNyQixNQUFNdmEsRUFBSyxJQUFJeGtCLE9BQU8rK0IsR0FFdEIsSUFEb0IsSUFBQUMsWUFBVSxJQUFBemdDLE1BQUtpbUIsR0FBS3lhLEdBQ3RCLEVBQUcsQ0FDbkIsTUFBTUMsRUFBdUMsSUFBdkJqcEMsRUFBWTlMLE9BQWUscUJBQXVCLHNCQUN4RUksUUFBUUMsS0FBSyw4QkFBOEJ1MEMsU0FBZ0JyMEMsS0FBS3pCLE1BQU1ELHNEQUFzRGsyQyxNQUFrQmpwQyxFQUFZaUUsS0FBSyxRQUNqSyxHQUdJK2tDLEVBZGdCLENBQUMxWSxJQUNyQixNQUNNcjhCLEVBQU9xOEIsRUFBRW45QixJQURrQjJLLEdBQVEsSUFBbUJsRyxrQkFBa0JrRyxJQUU5RSxPQUFPLElBQUF3Z0IsU0FBUXJxQixJQVdRaTFDLENBQWNscEMsR0FDdkM0b0MsRUFBVy91QyxRQUFRZ3ZDLEVBQ3JCLENBQ0YsQ0FtQkEsdUJBQU9NLENBQWlCcjFCLEdBQ3RCLE1BQU1zMUIsR0FBUyxJQUFBcHFDLFNBQU8sR0FDaEJxcUMsR0FBWSxJQUFBdjFDLEtBQUlzMUMsR0FDaEJyc0IsR0FBVyxJQUFBN2pCLElBQUdzRSxRQUNkOHJDLEdBQWEsSUFBQW4xQyxTQUFRazFDLEdBQVcsU0FBS3RzQixJQUFXLElBQUFzQyxPQUFNLEVBQUcsSUFBSSxJQUFBdnFCLFdBQVUsS0FFN0UsT0FEdUIsSUFBQVgsU0FBUWsxQyxHQUFXLFNBQUtDLElBQWEsSUFBQXgwQyxXQUFVLElBQy9EeTBDLENBQWV6MUIsRUFDeEIsQ0FFQSxxQkFBT3RhLENBQWVSLEdBS3BCLE9BSkksSUFBQUUsSUFBR3NFLE9BQVF4RSxLQUNiQSxFQUFJb1YsU0FBU3NRLGNBQWMxbEIsS0FHdEIsSUFBQTdFLFVBQVEsSUFBQXNGLEtBQUksSUFBSSxJQUFBM0UsWUFBVyxJQUFJLElBQUE0RSxNQUFLLFlBQXBDLENBQWlEVixFQUMxRCxDQUVBLG9CQUFBd3dDLEdBQ0UsTUFBTUMsR0FBYSxJQUFBdDFDLFNBQVEsRUFBQXUxQyxTQUFTLElBQUFoMkMsU0FBTyxJQUFBZ0csTUFBSyxZQUFZLElBQUEwRSxRQUFPLE1BQ25FM0osS0FBS3pCLE1BQU13cUMsUUFBVWlNLEVBQVdoMUMsS0FBS3pCLE1BQU13WCxHQUM3QyxDQUlBLGlCQUFBMDlCLENBQWtCbDFDLEdBQ2hCLE1BQU13RyxHQUFpQixJQUFBckYsVUFBUSxJQUFBc0YsS0FBSSxJQUFJLElBQUEzRSxZQUFXLElBQUksSUFBQTRFLE1BQUssYUFFM0QsT0FBTyxJQUFBMjlCLGdCQUFjLElBQUFyakMsU0FBUSxDQURSd1csR0FBTTRELFNBQVM4SCxLQUFLdXdCLFNBQVNqOEIsR0FDTmhSLElBQWtCLEtBQXZELENBQTZEeEcsRUFDdEUsQ0FFQSwyQkFBQXkxQyxJQUM2QyxJQUF2Q2gwQyxLQUFLekIsTUFBTWkxQyx5QkFDYnh6QyxLQUFLKzBDLHVCQUNMLzBDLEtBQUtrMUMsY0FDc0IsT0FBbEJsMUMsS0FBS3pCLE1BQU13WCxJQUNwQmxXLFFBQVEyTixNQUFNLGtFQUFrRXhOLEtBQUszQixZQUFZQyw4QkFFckcsQ0FFQSxjQUFBaTFDLEdBQ0UsTUFBTTRCLEdBQVksSUFBQXY1QixPQUFNNWIsS0FBS28xQyxvQkFBb0J6MEMsS0FBS1gsT0FTdERBLEtBQUs4c0MscUJBQXFCMW5DLFFBUk81RixJQUMvQixJQUFLNkIsRUFBUTByQyxFQUFTc0ksR0FBZ0I3MUMsR0FDbEMsSUFBQWlGLElBQUdzRSxPQUFRc3NDLEtBQ2JBLEVBQWUsSUFBSSxFQUFBdFQsRUFBcUIsQ0FBRXphLFNBQVMrdEIsS0FFckRyMUMsS0FBS3pCLE1BQU15MEMsMkJBQTJCM3hDLEdBQVU4ekMsRUFBVXBJLEVBQ3hEc0ksS0FHSnIxQyxLQUFLekIsTUFBTSsyQyxrQkFBb0J0MUMsS0FBS3UxQyxxQkFDbEN2MUMsS0FBS3pCLE1BQU15MEMsMkJBQ2YsQ0FtQkEsa0JBQUFsRyxHQUNFLE1BQU8sRUFDVCxDQUVBLG1CQUFBc0ksQ0FBb0IvckMsRUFBS2dzQyxFQUFjbDZCLEdBU3JDLFFBQWUxYyxJQUFYMGMsRUFBRTNYLE1BQXNCMlgsRUFBRTNYLEtBQUtTLFNBQVMsV0FDdkIsSUFBakJqRSxLQUFLdzFDLFFBQWtCLENBQ3pCLE1BQU1yc0MsR0FBTSxPQUFVLENBQUMsRUFBR2dTLEdBQzFCaFMsRUFBSTNGLEtBQU94RCxLQUFLbXRDLE1BQU1wTCxFQUN0Qi9oQyxLQUFLb3RDLGNBQWM3SixLQUFLdDRCLEtBQUs5QixFQUMvQixFQUd5QixLQUZILElBQUE5SSxZQUFVLElBQUFzSixTQUFPLEdBQU8wckMsRUFFMUNJLENBQWN0NkIsSUFoQkYsQ0FBQy9aLFNBQ0czQyxJQUFkdUIsS0FBS3FKLEdBQ1B4SixRQUFRQyxLQUFLLDhCQUE4QnVKLGlDQUFtQ3JKLEtBQUszQixZQUFZQyxTQUUvRjBCLEtBQUtxSixHQUFLakksSUFjWnMwQyxDQURBdjZCLEdBQUksSUFBQXpJLE1BQUssQ0FBQyxRQUFTeUksR0FHdkIsQ0FFQSxvQkFBQW82QixDQUFxQnZDLEVBQTZCLENBQUMsR0FDakQsTUFBTTJDLEVBQWlCLENBQ3JCQyxZQUFjejZCLEdBQU1uYixLQUFLNjFDLG1CQUFtQjE2QixHQUM1Q3l5QixVQUFZenlCLEdBQU1uYixLQUFLaXVCLGtCQUFrQjlTLEdBRXpDMjZCLFdBQWEzNkIsR0FBTW5iLEtBQUsrMUMsYUFBYTU2QixHQUNyQzY2QiwrQkFBaUM3NkIsR0FBTW5iLEtBQUsrMUMsYUFBYTU2QixHQUN6RDg2QixrQ0FBb0M5NkIsR0FBTW5iLEtBQUsrMUMsYUFBYTU2QixHQUU1RHV5Qiw4QkFBZ0N2eUIsR0FBTW5iLEtBQUtrMkMsWUFBWS82QixHQUN2RGc3QixXQUFZLEtBQU0sQ0FBRyxJQUV2QixPQUFPLElBQVU5MkMsSUFBSSxDQUFDLENBQUMsRUFBR3MyQyxFQUFnQjNDLEdBQzVDLENBR0EsY0FBQWMsR0FDRTl6QyxLQUFLcXRDLFNBQVdydEMsS0FBSzJ6QyxZQUFZcHNDLE1BQUssSUFBQTdJLEtBQ25DMEMsR0FBWXBCLEtBQUtvMkMsZ0JBQWdCaDFDLEtBQVcsSUFBQWkxQyxXQUFVcjJDLEtBQUtzMkMsYUFFOUR0MkMsS0FBS3UyQyw2QkFDTHYyQyxLQUFLdzJDLHlCQUF5QngyQyxLQUFLcXRDLFVBQVUsRUFDL0MsQ0FFQSxVQUFBaUosQ0FBV243QixHQUNULE9BQVFBLEVBQUU5WixPQUFPNEMsU0FBUyxnQ0FDNUIsQ0FFQSxTQUFBd3lDLENBQVV0N0IsR0FDUixPQUFRQSxFQUFFOVosT0FBTzRDLFNBQVMsZ0NBQzVCLENBRUEsWUFBQXl5QyxDQUFhdjdCLEdBQ1gsT0FBUUEsRUFBRTlaLE9BQU80QyxTQUFTLFlBQzVCLENBRUEsYUFBQTB5QyxDQUFjeDdCLEdBQ1osT0FBUUEsRUFBRTlaLE9BQU80QyxTQUFTLGNBQzVCLENBRUEsT0FBQTJ5QyxDQUFRejdCLEdBQ050YixRQUFRc2tCLElBQUksbUJBQW9CaEosRUFDbEMsQ0FFQSxlQUFBMDdCLENBQWdCL3JDLEVBQUtvbEMsR0FhbkJsd0MsS0FBSzgyQyxRQUFVaHNDLEVBQUl2RCxNQUNqQixJQUFBQyxRQWJ5QmYsUUFBa0JoSSxJQUFUZ0ksUUFDaENoSSxJQURzRGdJLEVBQUtwRixTQWM3RCxJQUFBM0MsS0FaK0JnTSxJQUMvQixNQUFNakUsR0FBTyxPQUFVLENBQUMsRUFBR2lFLEdBTTNCLE1BSm9CLGdEQUFoQmpFLEVBQUtwRixTQUNQckIsS0FBS2l1QixrQkFBa0J4bkIsR0FDdkJBLEVBQUtwRixPQUFTLGlDQUVUb0YsS0FNVHpHLEtBQUt3MkMseUJBQXlCeDJDLEtBQUs4MkMsU0FBUyxFQUFPLFVBQ25EOTJDLEtBQUsrMkMsd0JBQXdCN0csRUFDL0IsQ0FFQSxjQUFBOEcsQ0FBZWpzQyxHQUNiLE1BRU1rc0MsRUFBU2xzQyxFQUFLeEQsTUFDbEIsSUFBQUMsUUFIeUJmLFFBQWtCaEksSUFBVGdJLFFBQ2hDaEksSUFEc0RnSSxFQUFLcEYsU0FJN0QsSUFBQXFqQixLQUFJdkosR0FBS25iLEtBQUtrM0MsT0FBTyxxQkFBc0IvN0IsS0FDM0MsSUFBQXpjLEtBQUt5YyxHQUNJQSxJQUVULElBQUFnOEIsVUFBU2g4QixHQUFLbmIsS0FBS28zQyxpQkFBaUJILEVBQU81ckMsVUFDN0NyTCxLQUFLdzJDLHlCQUF5QlMsR0FBUSxFQUFNLFFBQzlDLENBRUEsZUFBQUksQ0FBZ0JsOEIsR0FFaEIsQ0FJQSxnQkFBQWk4QixDQUFpQmo4QixHQUNmLE1BU01tOEIsRUFUVyxDQUFDQyxJQUNoQixNQUFNQyxFQUFhQyxJQUNqQixVQUF5Qmg1QyxJQUFsQmc1QyxFQUFFOXNCLGFBQ1A4c0IsRUFBSUQsRUFBVUMsRUFBRTlzQixhQUVsQixPQUFPOHNCLEdBRVQsT0FBTyxJQUFBNzNDLE1BQUssQ0FBQyxLQUFNLFFBQVM0M0MsRUFBVUQsS0FFYkcsQ0FBU3Y4QixHQUlwQyxPQUhBbmIsS0FBS2szQyxPQUFPLG9CQUFxQmwzQyxLQUFLMHlDLE1BQU92M0IsR0FFN0NuYixLQUFLcTNDLGdCQUFnQkMsRUFBb0JuOEIsR0FDbENtOEIsQ0FDVCxDQUVBLDBCQUFBZixHQUVFLE1BQU05MUMsRUFBYSxDQUNqQndLLEtBQU1qTCxLQUFLMjNDLHlCQUF5QmgzQyxLQUFLWCxNQUN6Q3dOLE1BQU94TixLQUFLNDNDLDBCQUEwQmozQyxLQUFLWCxNQUMzQ2drQyxTQUFVaGtDLEtBQUs2M0MsNkJBQTZCbDNDLEtBQUtYLE9BTzdDK2pDLEVBQWMsS0FDbEIvakMsS0FBS3pCLE1BQU11NUMsU0FBTXI1QyxFQUNqQnVCLEtBQUsrM0MsWUFBWS9ULFdBQ2pCaGtDLEtBQUtnNEMsZ0JBQWdCaFUsV0FDckJoa0MsS0FBS3lzQyxNQUFNekksV0FDWGhrQyxLQUFLekIsV0FBUUUsRUFDYnVCLEtBQUt3MUMsU0FBVSxFQUNmeDFDLEtBQUtrM0MsT0FBTyxjQUFlbDNDLEtBQUt3MUMsUUFBU3gxQyxLQUFLekIsUUFFMUMwNUMsRUFBOEIsS0FDbENDLEdBQVksRUFDSyxJQUFiQSxHQUNGblUsS0FLSixJQUFJbVUsRUFBVyxFQUNmbDRDLEtBQUsrM0MsWUFBYyxJQUFJLEVBQUFweUMsUUFHdkIzRixLQUFLbTRDLGtCQUFvQm40QyxLQUFLKzNDLFlBQVl4d0MsTUFBSyxJQUFBNndDLFVBQVVDLElBQ3ZELE1BQU1DLEVBQW9CRCxFQUFRMXRDLFdBQVdwRCxNQUFLLElBQUFDLFFBQy9DMlQsUUFBWTFjLElBQU4wYyxRQUFnQzFjLElBQWIwYyxFQUFFOVosU0FBdUIsSUFBQTNDLEtBQUl5YyxJQUV2RCxNQUFNL1osR0FBVSxPQUFVLENBQUMsRUFBRytaLEdBRzlCLE9BRkEvWixFQUFRQyxPQUFTOFosRUFBRTlaLE9BQ25CckIsS0FBS2szQyxPQUFPLG9CQUFxQjkxQyxHQUMxQkEsS0FHVCxPQUErQixJQUEzQmkzQyxFQUFRRSxlQUNIRCxHQVpvQ0osR0FBWSxFQWVoREksRUFBa0Ivd0MsTUFBSyxJQUFBNHZDLFVBQVNjLFFBSTNDajRDLEtBQUtnNEMsZ0JBQWtCaDRDLEtBQUttNEMsa0JBRXpCNXdDLE1BQUssSUFBQUMsUUFBUTJULFFBQVkxYyxJQUFOMGMsUUFBZ0MxYyxJQUFiMGMsRUFBRTlaLFNBQ3hDb0csVUFBVWhILEVBQ2YsQ0FHQSx3QkFBQSsxQyxDQUF5QnpyQyxFQUFNd3RDLEdBQWlCLEVBQU9DLEdBRXJELE1BQU1ydkMsRUFBTSxDQUNWd0IsV0FBWUksRUFDWnd0QyxpQkFDQUMsT0FFRng0QyxLQUFLazNDLE9BQU8sNEJBQTZCbDNDLEtBQUsweUMsTUFBT3ZwQyxHQUNyRG5KLEtBQUsrM0MsWUFBWTlzQyxLQUFLOUIsRUFDeEIsQ0FHQSx3QkFBQXd1QyxDQUF5QnYyQyxFQUFVLENBQUMsR0FDbEMsTUFBTSt1QyxHQUFjLElBQUE5dkMsV0FBVzhhLEdBQU1uYixLQUFLeTRDLG9CQUFvQnQ5QixJQUl4RHU5QixHQUFnQixRQUF1QjE0QyxLQUFLekIsTUFBTSsyQyxrQkFDdERsMEMsRUFBUUMsUUFJQzh1QyxFQUhRbndDLEtBQUt6QixNQUFNKzJDLGtCQUFrQm9ELEdBT2hEcnVDLENBQUdqSixHQUlIcEIsS0FBS2szQyxPQUFPLDJCQUE0QixDQUFFOTFDLFdBQzVDLENBRUEseUJBQUF3MkMsQ0FBMEJ4MkMsRUFBVSxJQUNsQ3ZCLFFBQVFza0IsSUFBSSxjQUFlbmtCLEtBQUszQixZQUFZQyxLQUFNOEMsRUFDcEQsQ0FVQSw0QkFBQXkyQyxHQUVFNzNDLEtBQUtrM0MsT0FBTywrQkFBZ0MsdUJBRTVDbDNDLEtBQUsyNEMsV0FBVyxzQkFDbEIsQ0FFQSxtQkFBQUYsQ0FBb0JyM0MsR0FDbEJwQixLQUFLazNDLE9BQU8sc0JBQXVCOTFDLEdBRW5DcEIsS0FBSzI0QyxXQUFXdjNDLEVBQVFDLE9BQVFELEVBQ2xDLENBR0EsdUJBQUEyMUMsQ0FBd0I3RyxHQUV0Qmx3QyxLQUFLMjRDLFdBQVcsZ0NBQWlDekksRUFDbkQsQ0FFQSxVQUFBMEksR0FDRTU0QyxLQUFLMjRDLFdBQVcsV0FDbEIsQ0FFQSx3QkFBQUUsQ0FBeUJySixFQUFNNWhDLEVBQU04aEMsR0FDbkMsTUFBTVEsRUFBYSxDQUFFVixPQUFNNWhDLE9BQU04aEMsY0FDakMxdkMsS0FBSzI0QyxXQUFXLDZCQUE4QixDQUFFekksY0FDbEQsQ0FHQSxrQkFBQTJGLENBQW1CMTZCLEdBQ0QsV0FBWkEsRUFBRWdvQixPQUNKbmpDLEtBQUtpdUIsa0JBQWtCOVMsRUFFM0IsQ0FFQSxlQUFBMjlCLEdBRUEsQ0FhQSxVQUFBcnZDLENBQVdZLEVBQUkwdUMsRUFBSyxFQUFHcDRDLEdBQU8sR0FPNUJ5RCxPQUFPcUYsV0FOZSxJQUFJaWlDLEtBQ3hCLFFBQWFqdEMsSUFBVHVCLFdBQXFDdkIsSUFBZnVCLEtBQUt6QixNQUFxQixDQUNsRCxNQUFNeTZDLEdBQW9CLElBQVRyNEMsRUFBZ0IwSixFQUFHMUosS0FBS1gsTUFBUXFLLEdBQ2pELElBQUFtVixPQUFNdzVCLEVBQVV0TixFQUNsQixHQUUrQnFOLEVBQ25DLENBTUEsaUJBQUE5cUIsQ0FBa0I5UyxHQUVoQm5iLEtBQUs4NEMsa0JBQ0w5NEMsS0FBSzI0QyxXQUFXLFlBQ2xCLENBRUEsY0FBQU0sQ0FBZTk5QixHQUNmLENBRUEsaUJBQUErOUIsQ0FBa0IvOUIsR0FFaEJuYixLQUFLMjRDLFdBQVcsWUFDbEIsQ0FFQSxXQUFBekMsQ0FBWS82QixHQUNWLE1BQU1nK0IsT0FBeUIxNkMsSUFBWjBjLEVBQUVnb0IsT0FBbUMsYUFBWmhvQixFQUFFZ29CLE1BSTlDbmpDLEtBQUtrM0MsT0FBTyxjQUFlaUMsRUFBWWgrQixFQUN6QyxDQUVBLFVBQUF3OUIsQ0FBV3QzQyxFQUFROEgsRUFBTSxDQUFDLEdBQ3hCLFFBQW1CMUssSUFBZnVCLEtBQUt6QixNQUFxQixDQUM1QnlCLEtBQUt6QixNQUFNOEMsT0FBU0EsRUFDcEIsTUFBTW9GLEdBQU8sSUFBQStLLFlBQVd4UixLQUFLekIsTUFBTzRLLEdBR3BDbkosS0FBS3lzQyxNQUFNeGhDLEtBQUt0SSxPQUFPdUMsT0FBT3VCLEdBQ2hDLENBQ0YsQ0FFQSxhQUFBMnlDLENBQWMxSixFQUFZL1ksR0FVeEIsTUFBTyxDQUNMNlksS0FBTXh2QyxLQUFLekIsTUFBTXdYLEdBQ2pCbkksS0FBTSx1QkFDTjhoQyxhQUNBL1ksTUFiaUIsTUFDakIsTUFBTTRKLEVBQUl2Z0MsS0FBS3pCLE1BQU13WCxHQUFHa1UsY0FBYzBNLEdBS3RDLE9BSGtCLElBREE4YixFQUFXdEgsY0FDSCxJQUFBMW1DLElBQUdzRSxPQUFRNHRCLEtBQVUsSUFBQXozQixPQUFNcWhDLElBQ25EMWdDLFFBQVFDLEtBQUssMENBQTBDRSxLQUFLekIsTUFBTUQsVUFBVXE0Qiw2QkFFdkU0SixHQU9BOFksR0FFWCxDQUVBLFlBQUFDLENBQWF2akMsRUFBSW1FLEdBQ2YsTUFBTXEvQixFQUFVeGpDLEdBQU1BLEVBQUdpMkIsY0FDekIsSUFBSW4zQixFQUFPLEVBQ1BrTixFQUFXaE0sRUFDZixLQUFPbEIsRUFBT3FGLEdBQ1o2SCxFQUFXdzNCLEVBQVF4M0IsR0FDbkJsTixJQUVGLE9BQU9rTixDQUNULENBRUEsbUJBQUF5M0IsQ0FBb0I5SixFQUFZL1ksRUFBTzhpQixHQUNyQzlpQixFQUFrQixLQUFWQSxFQUFlQSxPQUFRbDRCLEVBQy9CLE1BQU0rd0MsRUFBT3h2QyxLQUFLczVDLGFBQWF0NUMsS0FBS3pCLE1BQU13WCxHQUFJMGpDLEdBQzlDLE1BQU8sQ0FDTGpLLE9BQ0E1aEMsS0FBTSx1QkFDTjhoQyxhQUNBL1ksTUFBTzZZLEVBQUt2bEIsY0FBYzBNLEdBRTlCLENBRUEsZUFBQXlmLENBQWdCaDFDLEVBQVUsQ0FBQyxHQUV6QixPQURBcEIsS0FBS3pCLE9BQVEsSUFBQWlULFlBQVd4UixLQUFLekIsTUFBTzZDLEdBQzdCQSxDQUNULENBR0Esc0JBQUFzNEMsQ0FBdUJDLEVBQVd6SixHQUNoQ2x3QyxLQUFLZzNDLGVBQWUyQyxFQUFVdk0sY0FBYzNKLFdBQzVDa1csRUFBVTlDLGdCQUFnQjcyQyxLQUFLb3RDLGNBQWMxSixTQUFVd00sRUFDekQsQ0FlQSxXQUFBMXVCLENBQVlndUIsUUFFWS93QyxJQUFsQnVCLEtBQUt6QixNQUFNd1gsSUFDYmxXLFFBQVFDLEtBQUssa0NBQWtDRSxLQUFLekIsTUFBTUQseUJBQXlCMEIsS0FBS3pCLE1BQU13WCw4R0FFaEcvVixLQUFLNjRDLHlCQUF5QnJKLEVBQU0sTUFBTyxjQUM3QyxDQUVBLGdCQUFBb0ssQ0FBaUJwSyxRQUNPL3dDLElBQWxCdUIsS0FBS3pCLE1BQU13WCxJQUNibFcsUUFBUUMsS0FBSyxrQ0FBa0NFLEtBQUt6QixNQUFNRCx5QkFBeUIwQixLQUFLekIsTUFBTXdYLG1IQUVoRy9WLEtBQUs2NEMseUJBQXlCckosRUFBTSxNQUFPLFFBQzdDLENBV0EsWUFBQXFLLENBQWFySyxRQUNXL3dDLElBQWxCdUIsS0FBS3pCLE1BQU13WCxJQUNibFcsUUFBUUMsS0FBSyxrQ0FBa0NFLEtBQUt6QixNQUFNRCx5QkFBeUIwQixLQUFLekIsTUFBTXdYLCtHQUVoRy9WLEtBQUs2NEMseUJBQXlCckosRUFBTSxNQUFPLGVBQzdDLENBdUJBLFVBQUFzSyxDQUFXbHJDLEVBQUcrbkIsR0FDWjMyQixLQUFLMDVDLHVCQUF1QjlxQyxFQUFHNU8sS0FBS281QyxjQUFjLGNBQWV6aUIsR0FDbkUsQ0FFQSxlQUFBb2pCLENBQWdCbnJDLEVBQUcrbkIsR0FDakIzMkIsS0FBSzA1Qyx1QkFBdUI5cUMsRUFBRzVPLEtBQUtvNUMsY0FBYyxRQUFTemlCLEdBQzdELENBeUJBLG9CQUFBcWpCLENBQXFCcHJDLEVBQUcrbkIsRUFBTzhpQixFQUFRLEdBQ3JDejVDLEtBQUswNUMsdUJBQXVCOXFDLEVBQzFCNU8sS0FBS3c1QyxvQkFBb0IsY0FBZTdpQixFQUFPOGlCLEdBQ25ELENBb0JBLHFCQUFBUSxDQUFzQnJyQyxFQUFHK25CLEVBQU84aUIsRUFBUSxHQUN0Q3o1QyxLQUFLMDVDLHVCQUF1QjlxQyxFQUMxQjVPLEtBQUt3NUMsb0JBQW9CLGVBQWdCN2lCLEVBQU84aUIsR0FDcEQsQ0F5QkEsV0FBQVMsQ0FBWXRyQyxFQUFHK25CLEdBQ2IzMkIsS0FBSzA1Qyx1QkFBdUI5cUMsRUFBRzVPLEtBQUtvNUMsY0FBYyxlQUFnQnppQixHQUNwRSxDQUtBLFlBQUF6SSxHQUNFLE1BQU1zaEIsRUFBTzcxQixTQUFTb0osZUFBZSxvQkFDckMvaUIsS0FBSzY0Qyx5QkFBeUJySixFQUFNLE1BQU8sY0FDN0MsQ0FFQSxZQUFBdUcsQ0FBYTMwQyxHQUVXLGFBQWxCQSxFQUFRK2hDLE9BR1ZuakMsS0FBS2sxQyxZQUdULENBRUEsVUFBQUEsR0FDRSxJQUFpQyxJQUE3QmwxQyxLQUFLbTZDLG9CQUFULENBV0EsR0FQQW42QyxLQUFLbzZDLG9CQUNMcDZDLEtBQUtxNkMsY0FFTHI2QyxLQUFLOHRCLGFBRUx6QyxzQkFEb0MsSUFBTXJyQixLQUFLczZDLDZCQUd4QixJQUFuQnQ2QyxLQUFLbXJDLFVBQW9CLENBQzNCLE1BQU05ckIsRUFBWXJmLEtBQUt1NkMsbUJBRUosSUFEQTlILEVBQVdpQyxpQkFBaUJyMUIsSUFFN0N4ZixRQUFRQyxLQUFLLDZEQUE2REUsS0FBS3pCLE1BQU1ELFVBQVUwRSxLQUFLQyxVQUFVb2MsaURBRWxILENBQ0FyZixLQUFLdzZDLHFCQUNMeDZDLEtBQUt5NkMsdUJBQXlCLElBQUksSUFBc0J6NkMsS0FBS3pCLE1BQU95QixLQUFLdTZDLGdCQUFnQjU1QyxLQUFLWCxPQUM5RkEsS0FBS2d1Qix1QkFFTGh1QixLQUFLbTZDLHFCQUFzQixDQXBCM0IsQ0FxQkYsQ0FFQSxTQUFBaHlDLENBQVVGLEdBQ3dCLFVBQTVCQSxFQUFPNUosWUFBWUMsT0FDckIySixFQUFTLENBQUNBLElBTVpBLEVBQU83QyxRQUpXOEMsSUFDaEIsSUFBSUEsRUFBV2xJLE9BSW5CLENBSUEsb0JBQUFndUIsR0FDRSxJQUF1QixJQUFuQmh1QixLQUFLbXJDLFVBQW9CLENBQzNCLE1BQU11UCxFQUF1Qmw3QyxHQUFRQSxFQUFJLEdBQ25DbTdDLEVBQW1CMzZDLEtBQUs4c0MscUJBRXhCcUgsRUFBYXdHLEVBQWlCajhDLElBQUlnOEMsR0FJeEMsSUFBbUIsSUFGQWpJLEVBQVdpQyxpQkFBaUJpRyxHQUc3Qzk2QyxRQUFRQyxLQUFLLGlFQUFpRUUsS0FBS3pCLE1BQU1ELFVBQVUwRSxLQUFLQyxVQUFVMDNDLHNEQUM3RyxDQUNMLE1BQU1DLEVBQTBCcDdDLElBQzlCLE1BQU0wZixHQUFTLElBQUE3ZSxXQUFVLEdBQUliLEVBQUksS0FFaEIsS0FEQSxJQUFBaUYsSUFBR28yQyxTQUFVNzZDLEtBQUtrZixLQUVqQ3JmLFFBQVFDLEtBQUssa0VBQWtFa0QsS0FBS0MsVUFBVXpELFdBQWFRLEtBQUt6QixNQUFNRCxxQ0FHMUgsSUFBQW9CLFVBQVEsSUFBQTBGLFNBQVF3MUMsSUFBeUIsSUFBQXY2QyxXQUFVLElBQW5ELENBQXdEczZDLEVBQzFELENBRUEsTUFBTUcsRUFBNkIsVUFDY3I4QyxLQUEzQyxJQUFBNkIsTUFBSyxDQUFDLFFBQVMsaUJBQWtCTixPQUNuQ3l5QyxFQUFXeUIsNEJBQTRCdnpDLEtBQUtYLEtBQTVDeXlDLENBQWtEenlDLEtBQUt6QixNQUFNdzFDLGNBQWVJLElBR2hGbjBDLEtBQUt5SixXQUFXcXhDLEVBQTRCLElBQzlDLENBQ0YsQ0FFQSxXQUFBQyxHQUNFLzZDLEtBQUt6QixNQUFNd1gsR0FBR0MsUUFBUStXLEtBQU8vc0IsS0FBS3pCLE1BQU13dUIsSUFDMUMsQ0FFQSxpQkFBQXF0QixHQVFFcDZDLEtBQUsrNkMsY0FDTC82QyxLQUFLekIsTUFBTXU1QyxLQUFNLE9BQW1COTNDLEtBQUt6QixNQUFNd1gsR0FHakQsQ0FHQSxVQUFBaWxDLEdBRUEsQ0FRQSxVQUFBbHRCLEdBQ0EsQ0FRQSx3QkFBQXdzQixHQUNBLENBUUEsV0FBQUQsR0FDQSxDQUVBLGVBQUFFLEdBRUUsTUFBTyxFQUNULENBaUJBLFVBQUFydkMsQ0FBVzdJLEdBWVQsT0FGVyxJQUFBeUcsUUFUWXNDLElBQUssVUFBd0JuSCxTQUFTbUgsR0FHckNBLEdBQ1QsSUFBbUJwRSxZQUFZSSxVQUFVZ0UsR0FBR3JKLFNBRTdDd0YsTUFBSyxJQUFBOHVDLFdBQVVsN0IsSUFBc0IsSUFBakJuYixLQUFLdzFDLFVBTHpCcHFDLEdBQUt2TCxRQUFRQyxLQUN2QixnQkFBZ0JzTCxtQkFBbUIsUUFTaENmLENBQUdoSSxFQUNaLENBS0Esa0JBQUFtNEMsR0FLTTkxQyxNQUFNK2xCLFFBQVF6cUIsTUFBTXpCLE9BQU8yUyxVQUM3QmxSLE1BQU16QixPQUFPMlMsVUFBVTlMLFFBTEwvQyxJQUNsQixNQUFPSCxFQUFhKzRDLEdBQVksR0FBU3YyQyxNQUFNK2xCLFFBQVFwb0IsR0FBV0EsRUFBVSxDQUFDQSxHQUM3RXJDLE1BQU1rN0MsV0FBV2g1QyxFQUFhKzRDLEtBSXJCdjJDLE1BQU0rbEIsUUFBUXpxQixNQUFNekIsT0FBTzhELFVBQ3BDeEMsUUFBUUMsS0FBSywwRUFFakIsQ0E2QkEsVUFBQW83QyxDQUFXaDVDLEVBQWErNEMsR0FBWSxFQUFPRSxHQUFpQixFQUFPdnlDLEdBQU8sR0FDeEUsTUFBTXd5QyxHQUFrQyxJQUFuQkQsRUFBMEJuN0MsS0FBS210QyxNQUFNbEwsR0FBS2ppQyxLQUFLbXRDLE1BQU02QyxFQVMxRSxJQUEwRCxJQUF0RGh3QyxNQUFNekIsT0FBT3cxQyxlQUFlOXZDLFNBQVMvQixHQUV2QyxPQUVGLE1BQU1tNUMsR0FBb0IsSUFBQS82QyxNQUFLLENBQUMsYUFBYyxpQkFDeENnN0MsR0FBVyxJQUFBaDdDLE1BQUssQ0FBQyxhQUFjLFNBUy9CaTdDLEVBQVUsRUFBQyxJQUFBNzhDLEtBdEJJeWMsSUFFbkIsTUFBTXhHLEVBQUt3RyxFQUVYLE9BREF4RyxFQUFHblIsS0FBTzQzQyxFQUNIem1DLEtBa0IyQixJQUFBbk4sUUFSakIyVCxJQUNqQixNQUFNNFIsRUFBT3V1QixFQUFTbmdDLEdBSXRCLE9BRnFDLElBRGhCa2dDLEVBQWtCbGdDLElBQ000UixJQUFTL3NCLEtBQUt6QixNQUFNd3VCLFNBTWpELElBQWRrdUIsR0FDRk0sRUFBUUMsU0FBUSxJQUFBQyxNQUFLLElBR3ZCLE1BQU1DLEVBQVcxN0MsS0FBS2tMLFdBQVdoSixHQUFhcUYsUUFBUWcwQyxHQUN0RHY3QyxLQUFLdzJDLHlCQUF5QmtGLEdBQVUsR0FDeEMxN0MsS0FBS3pCLE1BQU13MUMsY0FBY24rQixLQUFLMVQsRUFDaEMsQ0FFQSxvQkFBQXk1QyxDQUFxQno1QyxHQUNuQixNQUFNMDVDLEVBQWdCLElBQW1CNTBDLFlBQVlXLFdBQVd6RixHQUloRSxPQUhzQixJQUFsQjA1QyxHQUNGLzdDLFFBQVFDLEtBQUssMENBQTBDRSxLQUFLekIsTUFBTUQscUNBQXFDNEQsb0NBRWxHMDVDLENBQ1QsQ0FnQkEsaUJBQUE3dEIsQ0FBa0I3ckIsRUFBYXlTLEVBQUssQ0FBQyxFQUFHdFQsR0FDdEMsTUFBTUQsRUFBVXVULEVBRVZrbkMsR0FBa0IsSUFBQXg3QyxXQUFVLG9CQUk1Qnk3QyxHQUFjLElBQUFwOEMsU0FBUW04QyxHQUFpQixJQUFBNTJDLE1BQUsvQyxJQUk1Q3VFLEVBQU8sQ0FBRXJGLFVBQVNDLE9BRnhCQSxFQUFTQSxHQUFVeTZDLEVBTGMsQ0FDL0JDLGNBQWUsZ0NBUWpCLElBRUUsR0FEQXQxQyxFQUFLbEYsWUFBYSxJQUFBN0IsVUFBUSxJQUFBRSxNQUFLLENBQUMsS0FBTSxPQUFRLFFBQVMsYUFBYSxJQUFBcUYsTUFBSyxTQUF2RCxDQUFpRWpGLE9BQ3BDLElBQTNDQSxLQUFLMjdDLHFCQUFxQno1QyxHQUF1QixFQUNWLElBQXJDLG9CQUFvQjJSLEtBQUt4UyxJQUMzQnNCLE9BQU9tQixpQkFBaUIyQyxFQUFNLENBQzVCckYsUUFBUyxDQUNQcUMsSUFBSyxLQUFNLE9BQVVrUixNQUkzQixNQUFNNUosR0FBTyxJQUFBaXhDLElBQUd2MUMsR0FDaEIsT0FBTyxJQUFJLElBQWtCdkUsRUFBYTZJLEVBQU10RSxFQUNsRCxDQUNGLENBQUUsTUFBT25CLEdBQ1B6RixRQUFRQyxLQUFLLGlCQUFrQndGLEVBQ2pDLENBQ0YsQ0FFQSxNQUFBNHhDLElBQVV4TCxHQUNSMXJDLEtBQUtrekMsdUJBQXVCeEgsRUFDOUIsQ0FFQSwyQkFBQTBILEdBRUEsQ0FFQSx5QkFBQUQsQ0FBMEJoMEMsRUFBS2djLEdBQzdCLE1BSU04Z0MsRUFBbUIsd0JBQU45Z0MsR0FDQSxLQUxBLElBQUEwTixPQUFNLENBQ3ZCc2EsT0FBTyxJQUFBNTRCLFFBQU8sWUFDZGxKLFFBQVEsSUFBQWtKLFFBQU8sc0NBQ2Q0USxHQUdEbmIsS0FBSyt0QixrQkFBa0Isb0JBQXFCLENBQUUxc0IsT0FBTyxvQ0FBc0MscUNBQ25FLElBQWY0NkMsR0FDVGo4QyxLQUFLK3RCLGtCQUFrQixvQkFBcUIsQ0FBRTFzQixPQUFPLG9DQUFzQyxtQ0FFL0YsQ0FFQSxrQkFBQTY2QyxDQUFtQkMsRUFBVzExQyxHQUM1QixPQUFPLElBQUksRUFBQXM3QixFQUFxQm9hLEVBQVcxMUMsRUFDN0MsQ0FFQSxZQUFBeWxDLENBQWFsaEMsR0FDWCxNQUFNb3hDLEdBQVMsSUFBQTk3QyxNQUFLLENBQUMsYUFBYyxNQUFPMEssR0FDcENxeEMsR0FBUyxJQUFBLzdDLE1BQUssQ0FBQyxRQUFTLE1BQU9OLE1BRXJDLE9BQU95eUMsRUFBVzF0QyxlQUFlczNDLElBQVc1SixFQUFXMXRDLGVBQWVxM0MsSUFBV0MsRUFBT3JLLFNBQVNvSyxFQUNuRyxDQUdBLFNBQUE1dEMsR0FJRSxNQUFNeThCLEdBQWEsU0FDbkJqckMsS0FBS2l0QixTQUFXZ2UsRUFBV2hlLFFBQzdCLEUsU0M5bUNGdHZCLEVBQU9ELFFBQVVRLEMsU0NBakJQLEVBQU9ELFFBQVVPLEMsU0NBakJOLEVBQU9ELFFBQVVNLEMsU0NBakJMLEVBQU9ELFFBQVVTLEMsR0NDYm0rQyxFQUEyQixDQUFDLEVBR2hDLFNBQVNDLEVBQW9CQyxHQUU1QixJQUFJQyxFQUFlSCxFQUF5QkUsR0FDNUMsUUFBcUIvOUMsSUFBakJnK0MsRUFDSCxPQUFPQSxFQUFhLytDLFFBR3JCLElBQUlDLEVBQVMyK0MsRUFBeUJFLEdBQVksQ0FHakQ5K0MsUUFBUyxDQUFDLEdBT1gsT0FIQWcvQyxFQUFvQkYsR0FBVTcrQyxFQUFRQSxFQUFPRCxRQUFTNitDLEdBRy9DNStDLEVBQU9ELE9BQ2YsQ0NyQkE2K0MsRUFBb0JJLEVBQUtoL0MsSUFDeEIsSUFBSWkvQyxFQUFTai9DLEdBQVVBLEVBQU9rL0MsV0FDN0IsSUFBT2wvQyxFQUFpQixRQUN4QixJQUFNLEVBRVAsT0FEQTQrQyxFQUFvQjd4QyxFQUFFa3lDLEVBQVEsQ0FBRS9nQixFQUFHK2dCLElBQzVCQSxHQ0xSTCxFQUFvQjd4QyxFQUFJLENBQUNoTixFQUFTby9DLEtBQ2pDLElBQUksSUFBSWp1QyxLQUFPaXVDLEVBQ1hQLEVBQW9CaDRDLEVBQUV1NEMsRUFBWWp1QyxLQUFTMHRDLEVBQW9CaDRDLEVBQUU3RyxFQUFTbVIsSUFDNUVsTSxPQUFPd1EsZUFBZXpWLEVBQVNtUixFQUFLLENBQUV3RSxZQUFZLEVBQU01UCxJQUFLcTVDLEVBQVdqdUMsTUNKM0UwdEMsRUFBb0JoNEMsRUFBSSxDQUFDNEUsRUFBS2xFLElBQVV0QyxPQUFPQyxVQUFVQyxlQUFlQyxLQUFLcUcsRUFBS2xFLEdDQ2xGczNDLEVBQW9CMzNCLEVBQUtsbkIsSUFDSCxvQkFBWHEvQyxRQUEwQkEsT0FBT0MsYUFDMUNyNkMsT0FBT3dRLGVBQWV6VixFQUFTcS9DLE9BQU9DLFlBQWEsQ0FBRTVwQyxNQUFPLFdBRTdEelEsT0FBT3dRLGVBQWV6VixFQUFTLGFBQWMsQ0FBRTBWLE9BQU8sSyIsInNvdXJjZXMiOlsid2VicGFjazovL3NweW5lL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLWZldGNoLWNsYXNzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWwtcGF5bG9hZC1jbGFzcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLXByb3h5LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWwuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbHMtY29uZmlnLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWxzLW1hcC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLWFpLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtbGlmZWN5Y2xlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtcm91dGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC11aS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLXdpbmRvdy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9zcHluZS1hcHAuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvc3B5bmUtcGx1Z2lucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9jaGFubmVsLWZldGNoLXV0aWwuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvY2hhbm5lbC1wYXlsb2FkLWZpbHRlci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9kZWVwLW1lcmdlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2ZycC10b29scy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9nYy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9taXhpbnMvYmFzZS1jb3JlLW1peGlucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9taXhpbnMvYmFzZS1zdHJlYW1zLW1peGlucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9yb3V0ZS1jaGFubmVsLXVwZGF0ZXIuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc2FmZS1jbG9uZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zYW5pdGl6ZS1kYXRhLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3Nhbml0aXplLWh0bWwuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtcGx1Z2lucy1tZXRob2RzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXRyYWl0LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUtdXJsLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC13aW5kb3cuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvdmlld3N0cmVhbS1hbmltYXRpb25zLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3ZpZXdzdHJlYW0tb2JzZXJ2YWJsZXMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3MvZG9tLWVsZW1lbnQtdGVtcGxhdGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3MvZG9tLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tYnJvYWRjYXN0ZXIuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tZWxlbWVudC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS1wYXlsb2FkLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLXNlbGVjdG9yLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLmpzIiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOlwiZG9tcHVyaWZ5XCIsXCJjb21tb25qczJcIjpcImRvbXB1cmlmeVwiLFwiYW1kXCI6XCJkb21wdXJpZnlcIixcInJvb3RcIjpcIkRPTVB1cmlmeVwifSIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcInJhbWRhXCIsXCJjb21tb25qczJcIjpcInJhbWRhXCIsXCJhbWRcIjpcInJhbWRhXCIsXCJyb290XCI6XCJSXCJ9Iiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOlwicnhqc1wiLFwiY29tbW9uanMyXCI6XCJyeGpzXCIsXCJhbWRcIjpcInJ4anNcIixcInJvb3RcIjpcInJ4anNcIn0iLCJ3ZWJwYWNrOi8vc3B5bmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6W1wicnhqc1wiLFwib3BlcmF0b3JzXCJdLFwiY29tbW9uanMyXCI6W1wicnhqc1wiLFwib3BlcmF0b3JzXCJdLFwiYW1kXCI6XCJyeGpzL29wZXJhdG9yc1wiLFwicm9vdFwiOltcInJ4anNcIixcIm9wZXJhdG9yc1wiXX0iLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJyeGpzXCIpLCByZXF1aXJlKFwicmFtZGFcIiksIHJlcXVpcmUoXCJkb21wdXJpZnlcIiksIHJlcXVpcmUoXCJyeGpzXCIpW1wib3BlcmF0b3JzXCJdKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwic3B5bmVcIiwgW1wicnhqc1wiLCBcInJhbWRhXCIsIFwiZG9tcHVyaWZ5XCIsIFwicnhqcy9vcGVyYXRvcnNcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wic3B5bmVcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJyeGpzXCIpLCByZXF1aXJlKFwicmFtZGFcIiksIHJlcXVpcmUoXCJkb21wdXJpZnlcIiksIHJlcXVpcmUoXCJyeGpzXCIpW1wib3BlcmF0b3JzXCJdKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJzcHluZVwiXSA9IGZhY3Rvcnkocm9vdFtcInJ4anNcIl0sIHJvb3RbXCJSXCJdLCByb290W1wiRE9NUHVyaWZ5XCJdLCByb290W1wicnhqc1wiXVtcIm9wZXJhdG9yc1wiXSk7XG59KShzZWxmLCAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fOTY4X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzEzMV9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX182MzZfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTMxX18pID0+IHtcbnJldHVybiAiLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgQ2hhbm5lbEZldGNoVXRpbCB9IGZyb20gJy4uL3V0aWxzL2NoYW5uZWwtZmV0Y2gtdXRpbC5qcydcbmltcG9ydCB7IHBhdGgsIHBpY2ssIG1lcmdlRGVlcFJpZ2h0LCBhbGwsIGFsbFBhc3MsIGVpdGhlciwgdmFsdWVzLCBkZWZhdWx0VG8sIHJlamVjdCwgY29tcG9zZSwgaXNOaWwgfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxGZXRjaCBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsRmV0Y2hcbiAgICogQHR5cGUgZXh0ZW5kYWJsZVxuICAgKiBAZGVzY1xuICAgKiA8cD5DaGFubmVsRmV0Y2ggZXh0ZW5kcyBDaGFubmVsIGFuZCBpcyBkZXNpZ25lZCB0byBjcmVhdGUgYSBDaGFubmVsIGZyb20gZmV0Y2hlZCBodHRwIGRhdGEuPC9wPlxuICAgKiA8cD5BIENoYW5uZWxGZXRjaCBpbnN0YW5jZSBjYW4gYmUgY3JlYXRlZCB3aXRoIGp1c3QgdGhlIGNoYW5uZWwgbmFtZSBhbmQgdXJsIHByb3BlcnRpZXMuPC9wPlxuICAgKiA8cD5UaGUgZGF0YSBpcyBmZXRjaGVkIG9uY2UsIGJ1dCB0aGUgQ2hhbm5lbEZldGNoJ3MgZGF0YSBpcyBhbHdheXMgYXZhaWxhYmxlIHRvIG90aGVyIENoYW5uZWwgYW5kIFZpZXdTdHJlYW0gaW5zdGFuY2VzPC9wPlxuICAgKlxuICAgKiA8aDM+VGhlIENoYW5uZWxGZXRjaCBDbGFzczwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkV4dGVuZHMgQ2hhbm5lbCBhbmQgdXNlcyB0aGUgQ2hhbm5lbEZldGNoVXRpbCB0byBtYWtlIGFueSB0eXBlIG9mIGh0dHAocykgcmVxdWVzdC48L2xpPlxuICAgKiA8bGk+UmVxdWlyZXMgYSB1cmwgcHJvcGVydHkgYXQgaW5zdGFudGlhdGlvbi48L2xpPlxuICAgKiA8bGk+VGhlIHJlc3BvbnNlIGRhdGEgaXMgcHVibGlzaGVkIGFzIGEgQ2hhbm5lbFBheWxvYWQuPC9saT5cbiAgICogPGxpPlRoZSBhY3Rpb24gZm9yIHRoZSByZXR1cm5lZCBDaGFubmVsRmV0Y2ggZGF0YSBpcyBhbHdheXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQsIFwiQ0hBTk5FTF9OQU1FX1JFU1BPTlNFX0VWRU5UXCI8L2xpPlxuICAgKiA8bGk+VGhlIGRlZmF1bHQgcmVxdWVzdCB0eXBlIGlzIGEgR0VUIHJlcXVlc3QgdGhhdCByZXR1cm5zIGEgSlNPTiBvYmplY3QuPC9saT5cbiAgICogPGxpPkhvd2V2ZXIsIGFueSB0eXBlIG9mIHJlcXVlc3QgYW5kIHJldHVybiB0eXBlIGNhbiBiZSBjb25maWd1cmVkIGJ5IHVzaW5nIHRoZSBib2R5IHByb3BlcnR5IHdoZW4gY3JlYXRpbmcgdGhlIGluc3RhbmNlLjwvbGk+XG4gICAqIDxsaT5UaGUgbWFwRm4gZ2l2ZXMgYWNjZXNzIHRvIHRoZSByZXR1cm5lZCByZXNwb25zZSBhbmQgY2FuIGJlIHVzZSB0byBwYXJzZSB0aGUgZGF0YSBiZWZvcmUgaXQgaXMgcHVibGlzaGVkIHRvIG90aGVyIENoYW5uZWxzIGFuZCBWaWV3U3RyZWFtIGluc3RhbmNlcy48L2xpPlxuICAgKiA8bGk+Q2hhbm5lbCBGZXRjaCB3aWxsIHNlbmQgdGhlIGxhc3QgcmVzcG9uc2UgdG8gZnV0dXJlIHN1YnNjcmliZXJzLCBhbmQgd2lsbCBub3QgbWFrZSBmdXJ0aGVyIGh0dHAocykgcmVxdWVzdHMgdW5sZXNzIGRpcmVjdGVkIHRvIGRvICBzby48L2xpPlxuICAgKiA8bGk+RGF0YSBjYW4gYmUgRmV0Y2hlZCBhZ2FpbiwgYnkgc2VuZGluZyBhIFwiQ0hBTk5FTF9OQU1FX1VQREFURV9SRVNQT05TRV9FVkVOVFwiIGFjdGlvbiBmcm9tIGEgVmlld1N0cmVhbSdzIHNlbmRJbmZvVG9DaGFubmVsIG1ldGhvZC48L2xpPlxuICAgKiA8L3VsPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIC0gPSB1bmRlZmluZWQ7IFRoZSByZWdpc3RlcmVkIG5hbWUgZm9yIHRoZSBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gcHJvcHMudXJsIC0gPSB1bmRlZmluZWQ7IFRoZSB1cmwgdG8gYmUgZmV0Y2hlZC5cbiAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gcHJvcHMubWFwRm4gLSA9IHVuZGVmaW5lZDsgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmZXRjaGVkIHJlc3BvbnNlIGFuZCBiZWhhdmVzIGxpa2UgYW55IG1hcCBtZXRob2QuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wcy5ib2R5IC0gPSB1bmRlZmluZWQ7IFRoaXMgd2lsbCB1cGRhdGUgdGhlIG9wdGlvbnMsIGluY2x1ZGluZyBoZWFkZXIgb3B0aW9ucywgc2VudCBhbG9uZyB3aXRoIHRoZSBmZXRjaCByZXF1ZXN0LiBEZWZhdWx0IG9wdGlvbnMgdXNlcyBhIEdFVCByZXF1ZXN0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVtcIjxoND5BIFZpZXdTdHJlYW0gSW5zdGFuY2UgU2VuZGluZyBBIEZldGNoIFVwZGF0ZSBSZXF1ZXN0PC9oND5cIl1cbiAgICogY29uc3QgYWN0aW9uID0gXCJDSEFOTkVMX0ZFVENIQ0hBTk5FTF9OQU1FX1VQREFURV9SRVNQT05TRV9FVkVOVFwiO1xuICAgKiBjb25zdCB1cmwgPSBcIi8vc2l0ZS5jb20vanNvbi9cIjtcbiAgICogY29uc3QgYm9keSA9IHtcbiAgICogICAgIG1ldGhvZDogXCJQT1NUXCJcbiAgICogfVxuICAgKlxuICAgKiB0aGlzLnNlbmRJbmZvVG9DaGFubmVsKFwiQ0hBTk5FTF9GRVRDSENIQU5ORUxfTkFNRVwiLCB7YWN0aW9uLCB1cmwsIGJvZHl9KTtcbiAgICpcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IobmFtZSwgcHJvcHMgPSB7fSkge1xuICAgIC8vIEFMTE9XIEZPUiBHRU5FUklDIE1BUCBQUk9QRVJUWVxuXG4gICAgQ2hhbm5lbEZldGNoLnZhbGlkYXRlTWFwTWV0aG9kKHByb3BzLCBuYW1lKVxuXG4gICAgaWYgKHByb3BzLm1hcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcm9wcy5tYXBGbiA9IHByb3BzLm1hcFxuICAgIH1cbiAgICBwcm9wcy5leHRlbmRlZEFjdGlvbnNBcnIgPSBbXG4gICAgICBgJHtuYW1lfV9SRVNQT05TRV9FVkVOVGAsXG4gICAgICBbYCR7bmFtZX1fUkVRVUVTVF9FVkVOVGAsICdvbkZldGNoVXBkYXRlJ11cbiAgICBdXG4gICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0cnVlXG4gICAgc3VwZXIobmFtZSwgcHJvcHMpXG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVNYXBNZXRob2QocHJvcHMsIG5hbWUsIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICBjb25zdCBpc05vdEVtcHR5ID0gYXJyID0+IGFyci5sZW5ndGggPj0gMVxuICAgIGNvbnN0IGlzTm90RnVuY3Rpb24gPSB2YWwgPT4gdHlwZW9mICh2YWwpICE9PSAnZnVuY3Rpb24nXG4gICAgY29uc3QgaXNVbmRlZmluZWRPcldyb25nVHlwZSA9IGVpdGhlcihpc05pbCwgaXNOb3RGdW5jdGlvbilcbiAgICBjb25zdCBpc1VuZGVmaW5lZCA9IGFsbChpc1VuZGVmaW5lZE9yV3JvbmdUeXBlKVxuICAgIGNvbnN0IGlzTm90VW5kZWZpbmVkQW5kSXNOb3RFbXB0eSA9IGFsbFBhc3MoW2lzVW5kZWZpbmVkLCBpc05vdEVtcHR5XSlcbiAgICBjb25zdCBtYXBNZXRob2RJc0ludmFsaWQgPSBjb21wb3NlKGlzTm90VW5kZWZpbmVkQW5kSXNOb3RFbXB0eSwgdmFsdWVzLCBwaWNrKFsnbWFwJywgJ21hcEZuJ10pKShwcm9wcylcblxuICAgIGlmIChtYXBNZXRob2RJc0ludmFsaWQpIHtcbiAgICAgIGlmICh0ZXN0TW9kZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbWFwIG1ldGhvZCBmb3IgQ2hhbm5lbEZldGNoLCAke25hbWV9LCBhcHBlYXJzIHRvIGJlIGludmFsaWRgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIG9uUmVnaXN0ZXJlZChwcm9wcyA9IHRoaXMucHJvcHMpIHtcbiAgICBpZiAocHJvcHM/LnBhdXNlICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLnN0YXJ0RmV0Y2goKVxuICAgIH1cbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKG5hbWUpIHtcbiAgICBjb25zdCBhcnIgPSBbXG4gICAgICAnQ0hBTk5FTF9SRVNQT05TRV9FVkVOVCcsXG4gICAgICBbJ0NIQU5ORUxfVVBEQVRFX1JFU1BPTlNFX0VWRU5UJywgJ29uRmV0Y2hVcGRhdGUnXSxcbiAgICAgIFsnQ0hBTk5FTF9GRVRDSF9SRVFVRVNUX0VWRU5UJywgJ29uRmV0Y2hVcGRhdGUnXVxuICAgIF1cblxuICAgIGNvbnN0IGV4dGVuZGVkQXJyID0gY29tcG9zZShkZWZhdWx0VG8oW10pLCBwYXRoKFsncHJvcHMnLCAnZXh0ZW5kZWRBY3Rpb25zQXJyJ10pKVxuICAgIHJldHVybiBhcnIuY29uY2F0KGV4dGVuZGVkQXJyKHRoaXMpKVxuICB9XG5cbiAgc3RhcnRGZXRjaChvcHRpb25zID0ge30sIHN1YnNjcmliZXIgPSB0aGlzLm9uRmV0Y2hSZXR1cm5lZC5iaW5kKHRoaXMpKSB7XG4gICAgY29uc3QgZmV0Y2hQcm9wcyA9IHRoaXMuY29uc29saWRhdGVBbGxGZXRjaFByb3BzKG9wdGlvbnMpXG4gICAgcmV0dXJuIG5ldyBDaGFubmVsRmV0Y2hVdGlsKGZldGNoUHJvcHMsIHN1YnNjcmliZXIsIGZhbHNlLCB0aGlzLnByb3BzLm5hbWUpXG4gIH1cblxuICBvbkZldGNoVXBkYXRlKGV2dCkge1xuICAgIGNvbnN0IHByb3BzT3B0aW9ucyA9IHRoaXMuZ2V0UHJvcHNGb3JGZXRjaChldnQpXG4gICAgdGhpcy5zdGFydEZldGNoKHByb3BzT3B0aW9ucylcbiAgfVxuXG4gIG9uRmV0Y2hSZXR1cm5lZChzdHJlYW1JdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ2hhbm5lbFBheWxvYWRJdGVtKHN0cmVhbUl0ZW0pXG4gIH1cblxuICBjcmVhdGVDaGFubmVsUGF5bG9hZEl0ZW0ocGF5bG9hZCwgYWN0aW9uID0gYCR7dGhpcy5wcm9wcy5uYW1lfV9SRVNQT05TRV9FVkVOVGApIHtcbiAgICBjb25zdCB7IG5hbWUsIHNlbmRDYWNoZWRQYXlsb2FkLCB1cmwgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCBzcmNFbGVtZW50ID0geyBuYW1lLCBzZW5kQ2FjaGVkUGF5bG9hZCwgdXJsIH1cbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQpXG4gIH1cblxuICBnZXRQcm9wc0ZvckZldGNoKGV2dCkge1xuICAgIGNvbnN0IGRhdGFPYmogPSBwYXRoKFsndmlld1N0cmVhbUluZm8nLCAncGF5bG9hZCddLCBldnQpXG4gICAgcmV0dXJuIHBpY2soWydtYXBGbicsICd1cmwnLCAnaGVhZGVyJywgJ2JvZHknLCAnbW9kZScsICdtZXRob2QnLCAncmVzcG9uc2VUeXBlJywgJ2RlYnVnJ10sIGRhdGFPYmopXG4gIH1cblxuICBjb25zb2xpZGF0ZUFsbEZldGNoUHJvcHMob3B0aW9ucywgcHJvcHMgPSB0aGlzLnByb3BzKSB7XG4gICAgY29uc3QgcHJvcHNPcHRpb25zID0gcGljayhbJ21hcEZuJywgJ3VybCcsICdoZWFkZXInLCAnYm9keScsICdtb2RlJywgJ21ldGhvZCcsICdyZXNwb25zZVR5cGUnLCAnZGVidWcnXSwgcHJvcHMpXG4gICAgY29uc3QgbWVyZ2VPcHRpb25zID0gKG8xLCBvMikgPT4gbWVyZ2VEZWVwUmlnaHQobzEsIG8yKVxuICAgIGNvbnN0IGZpbHRlck91dFVuZGVmaW5lZCA9IHJlamVjdChpc05pbClcbiAgICByZXR1cm4gY29tcG9zZShmaWx0ZXJPdXRVbmRlZmluZWQsIG1lcmdlT3B0aW9ucykocHJvcHNPcHRpb25zLCBvcHRpb25zKVxuICB9XG5cbiAgZ2V0IG9ic2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVyJFxuICB9XG59XG4iLCJpbXBvcnQge1xuICBtZXJnZUFsbCxcbiAgY2xvbmUsXG4gIGZyb21QYWlycyxcbiAgdG9QYWlycyxcbiAgY29tcG9zZSxcbiAgaW5jbHVkZXMsXG4gIHBpY2tBbGwsXG4gIGx0ZSxcbiAgZGVmYXVsdFRvLFxuICBwcm9wLFxuICBpc1xufSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgc2FmZUNsb25lIH0gZnJvbSAnLi4vdXRpbHMvc2FmZS1jbG9uZS5qcydcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxQYXlsb2FkIHtcbiAgLyoqXG4gICAqXG4gICAqIEFsbCBDaGFubmVsIGRhdGEgaXMgcHVibGlzaGVkIHVzaW5nIHRoaXMgaW50ZXJmYWNlLlxuICAgKiBAbW9kdWxlIENoYW5uZWxQYXlsb2FkXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2hhbm5lbE5hbWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHNyY0VsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGNoYW5uZWxOYW1lIC0gPSB1bmRlZmluZWQ7IFRoZSBuYW1lIG9mIHRoZSBDaGFubmVsIHRoYXQgaXMgc2VuZGluZyB0aGUgcGF5bG9hZC5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGFjdGlvbiAtID0gdW5kZWZpbmVkOyBBbiBhY3Rpb24gc3RyaW5nIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoaW4gdGhlIENoYW5uZWwncyBhZGRSZWdpc3RlcmVkQWN0aW9ucyBtZXRob2QuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXlsb2FkIC0gPSB1bmRlZmluZWQ7IFRoZSBkYXRhIG9iamVjdC5cbiAgICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gc3JjRWxlbWVudCAtID0ge307IFRoaXMgaXMgcG9wdWxhdGVkIHdoZW4gdHJpZ2dlcmVkIGZyb20gYSBWaWV3U3RyZWFtIGluc3RhbmNlLlxuICAgKiBAcHJvcGVydHkge1VJRXZlbnR9IGV2ZW50IC0gPSB1bmRlZmluZWQ7IFRoZSBVSUV2ZW50LCBpZiBhbnkuXG4gICAqIEByZXR1cm5zIFZhbGlkYXRlZCBDaGFubmVsUGF5bG9hZCBqc29uIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoY2hhbm5lbE5hbWUsIGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQsIHRpbWVMYWJlbCkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSBjaGFubmVsTmFtZVxuICAgIC8vIHBheWxvYWQgPSBDaGFubmVsUGF5bG9hZC5kZWVwRnJlZXplKHBheWxvYWQpO1xuXG4gICAgaWYgKHRpbWVMYWJlbCkge1xuICAgICAgY29uc29sZS50aW1lKHRpbWVMYWJlbClcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsUGF5bG9hZEl0ZW1PYmogPSB7IGNoYW5uZWxOYW1lLCBhY3Rpb24sIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgICAvLyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2hhbm5lbFBheWxvYWRJdGVtT2JqLCAncGF5bG9hZCcsIHtnZXQ6ICgpID0+IGNsb25lKHBheWxvYWQpfSk7XG4gICAgY29uc3QgZnJvemVuUGF5bG9hZCA9IENoYW5uZWxQYXlsb2FkLmRlZXBGcmVlemUocGF5bG9hZClcbiAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmoucGF5bG9hZCA9IGZyb3plblBheWxvYWRcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaGVscHMgd2l0aCBkZXN0cnVjdHVyaW5nIGJ5IG1lcmdpbmcgYWxsIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqIEpTT04gT2JqZWN0XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFWyc8aDQ+RGVzdHJ1Y3R1cmluZyBQcm9wZXJ0aWVzIHVzaW5nIHRoZSBDaGFubmVsUGF5bG9hZCBwcm9wcyBNZXRob2Q8L2g0PiddXG4gICAgICogbGV0IHtlbCwgYWN0aW9uLCBteVZhbH0gPSBwYXlsb2FkLnByb3BzKCk7XG4gICAgICpcbiAgICAgKlxuICAgICAqL1xuXG4gICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXlsb2FkLCAncGF5bG9hZCcpKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWRTdHIgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBmb2xsb3dpbmcgcGF5bG9hZCBjb250YWlucyBhIG5lc3RlZCBwYXlsb2FkIHByb3BlcnR5IHdoaWNoIG1heSBjcmVhdGUgY29uZmxpY3RzOiBBY3Rpb246ICR7YWN0aW9ufSwgJHtwYXlsb2FkU3RyfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxBY3Rpb25zQXJyID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmdldENoYW5uZWxBY3Rpb25zKGNoYW5uZWwpXG5cbiAgICAgIENoYW5uZWxQYXlsb2FkLnZhbGlkYXRlQWN0aW9uKGFjdGlvbiwgY2hhbm5lbCwgY2hhbm5lbEFjdGlvbnNBcnIpXG4gICAgfVxuXG4gICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLmNsb25lID0gKCkgPT4gbWVyZ2VBbGwoW1xuICAgICAgeyBwYXlsb2FkOnNhZmVDbG9uZShjaGFubmVsUGF5bG9hZEl0ZW1PYmoucGF5bG9hZCkgfSxcbiAgICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5wYXlsb2FkLFxuICAgICAgeyBjaGFubmVsOiBjbG9uZShjaGFubmVsKSB9LFxuICAgICAgeyBldmVudDogY2xvbmUoZXZlbnQpIH0sXG4gICAgICB7IHNyY0VsZW1lbnQgfSxcbiAgICAgIGNsb25lKGNoYW5uZWxQYXlsb2FkSXRlbU9iai5zcmNFbGVtZW50KSwgeyBhY3Rpb246IGNsb25lKGNoYW5uZWxQYXlsb2FkSXRlbU9iai5hY3Rpb24pIH1cbiAgICBdKVxuXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHMgPSB7XG4gICAgICAkZGlyOiB7XG4gICAgICAgIGdldDogKCkgPT4gY2hhbm5lbFBheWxvYWRJdGVtT2JqLl9kaXIsXG4gICAgICAgIHNldDogKHZhbCkgPT4ge1xuICAgICAgICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5fZGlyID0gdmFsXG4gICAgICAgICAgcmV0dXJuIHZhbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5uZWwgPT09ICdDSEFOTkVMX1JPVVRFJykge1xuICAgICAgLy8gY2hhbm5lbFBheWxvYWRJdGVtT2JqWydsb2NhdGlvbiddID0gQ2hhbm5lbFBheWxvYWQuZ2V0TG9jYXRpb25EYXRhKCk7XG4gICAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcy5sb2NhdGlvbiA9IHtcbiAgICAgICAgZ2V0OiAoKSA9PiBDaGFubmVsUGF5bG9hZC5nZXRMb2NhdGlvbkRhdGEoKVxuICAgICAgfVxuICAgICAgLyogY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHNbJ3JvdXRlRGF0YSddID0ge1xuICAgICAgICBnZXQ6ICgpPT5wcm9wKCdyb3V0ZURhdGEnLCBmcm96ZW5QYXlsb2FkKVxuICAgICAgfVxuKi9cbiAgICB9XG5cbiAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmouX2RpciA9IHVuZGVmaW5lZFxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY2hhbm5lbFBheWxvYWRJdGVtT2JqLCBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcylcblxuICAgIGlmICh0aW1lTGFiZWwpIHtcbiAgICAgIGNvbnNvbGUudGltZUVuZCh0aW1lTGFiZWwpXG4gICAgfVxuICAgIHJldHVybiBjaGFubmVsUGF5bG9hZEl0ZW1PYmpcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUFjdGlvbihhY3Rpb24sIGNoYW5uZWwsIGFycikge1xuICAgIGNvbnN0IGlzSW5BcnIgPSBpbmNsdWRlcyhhY3Rpb24sIGFycilcbiAgICBpZiAoaXNJbkFyciA9PT0gZmFsc2UgJiYgU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYHdhcm5pbmc6IEFjdGlvbjogJyR7YWN0aW9ufScgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aGluIHRoZSAke2NoYW5uZWx9IGNoYW5uZWwhYClcbiAgICB9XG4gICAgcmV0dXJuIGlzSW5BcnJcbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvbkRhdGEoKSB7XG4gICAgY29uc3QgbG9jYXRpb25QYXJhbXNBcnIgPSBbXG4gICAgICAnaHJlZicsXG4gICAgICAnb3JpZ2luJyxcbiAgICAgICdwcm90b2NvbCcsXG4gICAgICAnaG9zdCcsXG4gICAgICAnaG9zdG5hbWUnLFxuICAgICAgJ3BvcnQnLFxuICAgICAgJ3BhdGhuYW1lJyxcbiAgICAgICdzZWFyY2gnLFxuICAgICAgJ2hhc2gnXVxuICAgIHJldHVybiBwaWNrQWxsKGxvY2F0aW9uUGFyYW1zQXJyLCB3aW5kb3cubG9jYXRpb24pXG4gIH1cblxuICBzdGF0aWMgZ2V0U3RyZWFtSXRlbSgpIHtcblxuICB9XG5cbiAgc3RhdGljIGRlZXBDbG9uZShvKSB7XG4gICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSlcbiAgICBjb25zdCBpc09iaiA9IGlzKE9iamVjdClcbiAgICBjb25zdCBpc0l0ZXIgPSBvYiA9PiBpc0FycihvYikgPT09IGZhbHNlICYmIGlzT2JqKG9iKSA9PT0gdHJ1ZVxuICAgIGNvbnN0IGlzSXRlcmFibGUgPSBpc0l0ZXIobylcbiAgICByZXR1cm4gaXNJdGVyYWJsZSA/IGNvbXBvc2UoZnJvbVBhaXJzLCB0b1BhaXJzLCBjbG9uZSkobykgOiBjbG9uZShvKVxuICB9XG5cbiAgc3RhdGljIGRlZXBGcmVlemUobykge1xuICAgIC8vIHJldHVybiBvO1xuICAgIC8vIHJldHVybiBPYmplY3QuZnJlZXplKG8pO1xuICAgIGNvbnN0IGVsSXNEb21FbGVtZW50ID0gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpXG5cbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShvKVxuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobykuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcHJvcCkgJiZcbiAgICAgICAgICAgIGVsSXNEb21FbGVtZW50KG9bcHJvcF0pID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgb1twcm9wXSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgKHR5cGVvZiBvW3Byb3BdID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb1twcm9wXSA9PT0gJ2Z1bmN0aW9uJykgJiZcbiAgICAgICAgICAgICFPYmplY3QuaXNGcm96ZW4ob1twcm9wXSkpIHtcbiAgICAgICAgICBDaGFubmVsUGF5bG9hZC5kZWVwRnJlZXplKG9bcHJvcF0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJGUkVFWkUgRVJSIFwiLHtvLGV9KTtcbiAgICAgIHJldHVybiBvXG4gICAgfVxuXG4gICAgcmV0dXJuIG9cbiAgfVxuXG4gIHN0YXRpYyBnZXRNb3VzZUV2ZW50S2V5cygpIHtcbiAgICByZXR1cm4gWydhbHRLZXknLCAnYnViYmxlcycsICdjYW5jZWxCdWJibGUnLCAnY2FuY2VsYWJsZScsICdjbGllbnRYJywgJ2NsaWVudFknLCAnY29tcG9zZWQnLCAnY3RybEtleScsICdjdXJyZW50VGFyZ2V0JywgJ2RlZmF1bHRQcmV2ZW50ZWQnLCAnZGV0YWlsJywgJ2V2ZW50UGhhc2UnLCAnZnJvbUVsZW1lbnQnLCAnaXNUcnVzdGVkJywgJ2xheWVyWCcsICdsYXllclknLCAnbWV0YUtleScsICdtb3ZlbWVudFgnLCAnbW92ZW1lbnRZJywgJ29mZnNldFgnLCAnb2Zmc2V0WScsICdwYWdlWCcsICdwYWdlWScsICdwYXRoJywgJ3JlbGF0ZWRUYXJnZXQnLCAncmV0dXJuVmFsdWUnLCAnc2NyZWVuWCcsICdzY3JlZW5ZJywgJ3NoaWZ0S2V5JywgJ3NvdXJjZUNhcGFiaWxpdGllcycsICdzcmNFbGVtZW50JywgJ3RhcmdldCcsICd0aW1lU3RhbXAnLCAndG9FbGVtZW50JywgJ3R5cGUnLCAndmlldycsICd3aGljaCcsICd4JywgJ3knXVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBTdWJqZWN0LCBSZXBsYXlTdWJqZWN0LCBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBpbmNsdWRlcyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgZGVsYXlDYWxsIH0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzLmpzJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFByb3h5IGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxQcm94eVxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIEEgcHJveHkgY2hhbm5lbCBpcyBjcmVhdGVkIHdoZW4gYSBjaGFubmVsIGlzIHN1YnNjcmliZWQgdG8gYmVmb3JlIGl0IGlzIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihuYW1lLCBwcm9wcyA9IHt9KSB7XG4gICAgcHJvcHMuaXNQcm94eSA9IHRydWVcbiAgICBzdXBlcihuYW1lLCBwcm9wcylcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgICB0aGlzLnN1YmplY3QkID0gbmV3IFN1YmplY3QoKVxuICAgIHRoaXMucmVwbGF5U3ViJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpXG4gICAgdGhpcy5vYnNlcnZlciQgPSBtZXJnZSh0aGlzLnN1YmplY3QkLCB0aGlzLnJlcGxheVN1YiQpXG4gICAgY29uc3QgaXNEZXZNb2RlID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnXG4gICAgaWYgKGlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jaGVja0lmQ2hhbm5lbElzU3RpbGxQcm94eShuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGdldE1lcmdlZFN1YmplY3QocGVyaXN0RGF0YSA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHBlcmlzdERhdGEgPT09IHRydWUgPyB0aGlzLnJlcGxheVN1YiQgOiB0aGlzLnN1YmplY3QkXG4gIH1cblxuICBjaGVja0lmQ2hhbm5lbElzU3RpbGxQcm94eShjaGFubmVsTmFtZSkge1xuICAgIGNvbnN0IG5hbWUgPSBjaGFubmVsTmFtZVxuXG4gICAgY29uc3QgY2hlY2tJZlByb3h5ID0gKCkgPT4ge1xuICAgICAgY29uc3QgYm9vbCA9IGluY2x1ZGVzKG5hbWUsIFNweW5lQXBwUHJvcGVydGllcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzKCkpXG4gICAgICBpZiAoYm9vbCAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBjaGFubmVsLCAke25hbWV9IGRvZXMgbm90IGFwcGVhciB0byBiZSByZWdpc3RlcmVkIWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVsYXlDYWxsKGNoZWNrSWZQcm94eSwgMTAwMClcbiAgfVxuXG4gIGdldCByZXBsYXlTdWJqZWN0KCkge1xuICAgIHJldHVybiB0aGlzLnJlcGxheVN1YiRcbiAgfVxuXG4gIGdldCBzdWJqZWN0KCkge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3QkXG4gIH1cbn1cbiIsImltcG9ydCB7IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcyB9IGZyb20gJy4vY2hhbm5lbHMtY29uZmlnLmpzJ1xuaW1wb3J0IHsgQ2hhbm5lbFBheWxvYWQgfSBmcm9tICcuL2NoYW5uZWwtcGF5bG9hZC1jbGFzcy5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgUm91dGVDaGFubmVsVXBkYXRlciB9IGZyb20gJy4uL3V0aWxzL3JvdXRlLWNoYW5uZWwtdXBkYXRlci5qcydcblxuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgZm9ya0pvaW4sIEVNUFRZIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YWtlLCBjb21iaW5lTGF0ZXN0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHtcbiAgaWZFbHNlLFxuICBpZGVudGl0eSxcbiAgaGVhZCxcbiAgbWVyZ2VBbGwsXG4gIG9iak9mLFxuICB2aWV3LFxuICBpcyxcbiAgY2hhaW4sXG4gIGxlbnNJbmRleCxcbiAgYWx3YXlzLFxuICBmcm9tUGFpcnMsXG4gIHBhdGgsXG4gIGlzRW1wdHksXG4gIGVxdWFscyxcbiAgcHJvcCxcbiAgcHJvcEVxXG4gICwgbWFwIGFzIHJNYXBcbn0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbFxuICAgKiBAdHlwZSBleHRlbmRhYmxlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoZSBDaGFubmVsIGNvbXBvbmVudCB3cmFwcyBtZXRob2RzIGFuZCBmdW5jdGlvbmFsaXR5IGFyb3VuZCBhbiBSeEpzIFN1YmplY3QsIHRvIGNyZWF0ZSBhIG9uZS13YXkgZGF0YSBmbG93IGJldHdlZW4gaXRzZWxmIGFuZCBvdGhlciBDaGFubmVscyBhbmQgVmlld1N0cmVhbXMuPC9wPlxuICAgKiA8cD5DaGFubmVscyBnZXQgZGF0YSBieSBpbXBvcnRpbmcganNvbiBvYmplY3RzLCBzdWJzY3JpYmluZyB0byBvdGhlciBDaGFubmVscyBhbmQgYnkgcGFyc2luZyBWaWV3U3RyZWFtIGluZm8uPC9wPlxuICAgKiA8aDM+VGhlIEJhc2ljIENoYW5uZWwgU3RydWN0dXJlPC9oMz5cbiAgICogPHVsPlxuICAgKiA8bGk+Q2hhbm5lbHMgcmVxdWlyZXMgYSB1bmlxdWUgbmFtZSwgZm9yIGV4YW1wbGUsIDxiPkNIQU5ORUxfTVlDSEFOTkVMPC9iPiwgd2hpY2ggY29tcG9uZW50cyB1c2UgdG8gc2VsZWN0IGFuZCBzdWJzY3JpYmUgdG8gYW55IGNoYW5uZWwuPC9saT5cbiAgICogPGxpPkNoYW5uZWxzIGFyZSBpbnN0YW50aWF0ZWQgYW5kICdyZWdpc3RlcmVkJyB3aXRoIHRoZSBMSU5LWydTcHluZUFwcCcsICdzcHluZS1hcHAnXS48L2xpPlxuICAgKiA8bGk+Q2hhbm5lbHMgcmVtYWluIHBlcnNpc3RlbnQgYW5kIGFyZSBub3QgZGVsZXRlZC48L2xpPlxuICAgKiA8L3VsPlxuICAgKiA8aDM+Q29tcG9uZW50cyB0aGF0IGV4dGVuZCBDaGFubmVsPC9oMz5cbiAgICogPHVsPlxuICAgKiA8bGk+VGhlIGZvdXIgU3B5bmUgQ2hhbm5lbHMsIExJTktbJ1NweW5lQ2hhbm5lbFVJJywgJ3NweW5lLWNoYW5uZWwtdS1pJ10sIExJTktbJ1NweW5lQ2hhbm5lbFdpbmRvdycsICdzcHluZS1jaGFubmVsLXdpbmRvdyddLCBMSU5LWydTcHluZUNoYW5uZWxSb3V0ZScsICdzcHluZS1jaGFubmVsLXJvdXRlJ10gYW5kIExJTktbJ1NweW5lQ2hhbm5lbExpZmVjeWNsZScsICdzcHluZS1jaGFubmVsLWxpZmVjeWNsZSddLCBhbGwgZXh0ZW5kIENoYW5uZWwuPC9saT5cbiAgICogPGxpPkNoYW5uZWxGZXRjaCBhbHNvIGV4dGVuZHMgQ2hhbm5lbCwgYWRkcyBhIENoYW5uZWxGZXRjaFV0aWwgY29tcG9uZW50IHRvIGltbWVkaWF0ZWx5IHB1Ymxpc2ggZmV0Y2hlZCByZXNwb25zZXMuPC9saT5cbiAgICogPC91bD5cbiAgICogPGgzPlNlbmRpbmcgQ2hhbm5lbFBheWxvYWRzPC9oMz5cbiAgICogICA8cD5DaGFubmVscyBzZW5kIGRhdGEgdXNpbmcgdGhlIDxhIGNsYXNzPSdsaW5rZXInIGRhdGEtY2hhbm5lbD1cIlJPVVRFXCIgIGRhdGEtZXZlbnQtcHJldmVudC1kZWZhdWx0PVwidHJ1ZVwiIGRhdGEtbWVudS1pdGVtPVwiY2hhbm5lbC1zZW5kLWNoYW5uZWwtcGF5bG9hZFwiICBocmVmPVwiL2d1aWRlL3JlZmVyZW5jZS9jaGFubmVsLXNlbmQtY2hhbm5lbC1wYXlsb2FkXCIgPnNlbmRDaGFubmVsUGF5bG9hZDwvYT5cbiAgIG1ldGhvZC48L3A+XG4gICAqXG4gICAqXG4gICAqIDxoMz5SZWNlaXZpbmcgRGF0YSBmcm9tIFZpZXdTdHJlYW0gSW5zdGFuY2VzPC9oMz5cbiAgICogPHA+Vmlld1N0cmVhbXMgY2FuIHNlbmQgZGF0YSB0byBhbnkgY3VzdG9tIGNoYW5uZWwgdXNpbmcgdGhlIDxhIGNsYXNzPSdsaW5rZXInIGRhdGEtY2hhbm5lbD1cIlJPVVRFXCIgIGRhdGEtZXZlbnQtcHJldmVudC1kZWZhdWx0PVwidHJ1ZVwiIGRhdGEtbWVudS1pdGVtPVwidmlldy1zdHJlYW0tc2VuZC1pbnRvLXRvLWNoYW5uZWxcIiAgaHJlZj1cIi9ndWlkZS9yZWZlcmVuY2Uvdmlldy1zdHJlYW0tc2VuZC1pbmZvLXRvLWNoYW5uZWxcIiA+c2VuZEluZm9Ub0NoYW5uZWw8L2E+XG4gICBtZXRob2QuIENoYW5uZWxzIGNhbSBsaXN0ZW4gdG8gYW55IFZpZXdTdHJlYW0gZGF0YSBkaXJlY3RlZCB0byBpdHNlbGYgdGhyb3VnaCB0aGUgZGVmYXVsdCBtZXRob2QsIDxhIGNsYXNzPSdsaW5rZXInIGRhdGEtY2hhbm5lbD1cIlJPVVRFXCIgIGRhdGEtZXZlbnQtcHJldmVudC1kZWZhdWx0PVwidHJ1ZVwiIGRhdGEtbWVudS1pdGVtPVwiY2hhbm5lbC1vbi12aWV3LXN0cmVhbS1pbmZvXCIgIGhyZWY9XCIvZ3VpZGUvcmVmZXJlbmNlL2NoYW5uZWwtb24tdmlldy1zdHJlYW0taW5mb1wiID5vblZpZXdTdHJlYW1JbmZvPC9hPi4gPC9wPlxuICAgKlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVtcIjxoND5SZWdpc3RlcmluZyBhIE5ldyBDaGFubmVsIEluc3RhbmNlPC9oND5cIl1cbiAgICogU3B5bmVBcHAucmVnaXN0ZXIobmV3IENoYW5uZWwoXCJDSEFOTkVMX01ZQ0hBTk5FTFwiKTtcbiAgICpcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDSEFOTkVMX05BTUVcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoaXMganNvbiBvYmplY3QgdGFrZXMgaW4gcGFyYW1ldGVycyB0byBpbml0aWFsaXplIHRoZSBjaGFubmVsXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBDSEFOTkVMX05BTUUgLSA9IHVuZGVmaW5lZDsgVGhpcyB3aWxsIGJlIHRoZSByZWdpc3RlcmVkIG5hbWUgZm9yIHRoaXMgY2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BzIC0gPSB7fTsgVGhlIHByb3BzIG9iamVjdHMgYWxsb3dzIGZvciBjdXN0b20gcHJvcGVydGllcyBmb3IgdGhlIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCAtID0gZmFsc2U7IFB1Ymxpc2hlcyBpdHMgbW9zdCBjdXJyZW50IHBheWxvYWQgdG8gbGF0ZSBzdWJzY3JpYmVycywgd2hlbiBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKENIQU5ORUxfTkFNRSwgcHJvcHMgPSB7fSkge1xuICAgIHRoaXMuYWRkUmVnaXN0ZXJlZEFjdGlvbnMuYmluZCh0aGlzKVxuICAgIHRoaXMuY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmooQ0hBTk5FTF9OQU1FLCBwcm9wcy5leHRlbmRlZEFjdGlvbnNBcnIpXG5cbiAgICAvLyBCYXNpYyBwcm9wcyBzZXR1cFxuICAgIHByb3BzLm5hbWUgPSBDSEFOTkVMX05BTUVcbiAgICBwcm9wcy5kZWZhdWx0QWN0aW9ucyA9IHByb3BzLmRhdGEgIT09IHVuZGVmaW5lZCA/IFtgJHtwcm9wcy5uYW1lfV9FVkVOVGBdIDogW11cbiAgICB0aGlzLnByb3BzID0gcHJvcHNcblxuICAgIHRoaXMucHJvcHMuaXNSZWdpc3RlcmVkID0gZmFsc2VcbiAgICB0aGlzLnByb3BzLmlzUHJveHkgPVxuICAgICAgdGhpcy5wcm9wcy5pc1Byb3h5ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRoaXMucHJvcHMuaXNQcm94eVxuXG4gICAgLy8gRGV0ZXJtaW5lIGEgZGVmYXVsdCBmcm9tIHByZXNlbmNlIG9mIHByb3BzLmRhdGFcbiAgICBjb25zdCBkZWZhdWx0Q2FjaGVkUGF5bG9hZEJvb2wgPSB0aGlzLnByb3BzLmRhdGEgIT09IHVuZGVmaW5lZFxuXG4gICAgLy8gSWYgcHJvcHMucmVwbGF5IGlzIGRlZmluZWQsIG92ZXJyaWRlIHNlbmRDYWNoZWRQYXlsb2FkIHdpdGggaXQuXG4gICAgLy8gT3RoZXJ3aXNlLCB1c2UgdGhlIGV4aXN0aW5nIHNlbmRDYWNoZWRQYXlsb2FkIHByb3BlcnR5IG9yIGRlZmF1bHQuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnJlcGxheSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0aGlzLnByb3BzLnJlcGxheVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID1cbiAgICAgICAgdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBkZWZhdWx0Q2FjaGVkUGF5bG9hZEJvb2xcbiAgICAgICAgICA6IHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWRcbiAgICB9XG5cbiAgICB0aGlzLnNlbmRQYXlsb2FkVG9Sb3V0ZUNoYW5uZWwgPSBuZXcgUm91dGVDaGFubmVsVXBkYXRlcih0aGlzKVxuICAgIHRoaXMuY3JlYXRlQ2hhbm5lbEFjdGlvbk1ldGhvZHMoKVxuXG4gICAgLy8gU2V0IHVwIHN0cmVhbXNcbiAgICB0aGlzLnN0cmVhbXNDb250cm9sbGVyID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNoYW5uZWxzTWFwXG4gICAgY29uc3Qgb2JzZXJ2ZXIkID0gdGhpcy5nZXRNYWluT2JzZXJ2ZXIoKVxuICAgIHRoaXMuY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUgPSBDaGFubmVsLmNoZWNrRm9yUGVyc2lzdGVudERhdGFNb2RlLmJpbmQodGhpcylcbiAgICB0aGlzLm9ic2VydmVyJCA9IHRoaXMucHJvcHMub2JzZXJ2ZXIgPSBvYnNlcnZlciRcblxuICAgIC8vIFN1YnNjcmliZSB0byBESVNQQVRDSEVSXG4gICAgY29uc3QgZGlzcGF0Y2hlclN0cmVhbSQgPSB0aGlzLnN0cmVhbXNDb250cm9sbGVyLmdldFN0cmVhbSgnRElTUEFUQ0hFUicpXG4gICAgY29uc3QgcGF5bG9hZFByZWRCeUNoYW5uZWxOYW1lID0gcHJvcEVxKHByb3BzLm5hbWUsICduYW1lJylcbiAgICBkaXNwYXRjaGVyU3RyZWFtJFxuICAgICAgLnBpcGUoZmlsdGVyKHBheWxvYWRQcmVkQnlDaGFubmVsTmFtZSkpXG4gICAgICAuc3Vic2NyaWJlKCh2YWwpID0+IHRoaXMub25SZWNlaXZlZE9ic2VydmFibGUodmFsKSlcbiAgfVxuXG4gIGdldE1haW5PYnNlcnZlcigpIHtcbiAgICBpZiAodGhpcy5zdHJlYW1zQ29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBmb2xsb3dpbmcgY2hhbm5lbCwgJHt0aGlzLnByb3BzLm5hbWV9LCBhcHBlYXJzIHRvIGJlIHJlZ2lzdGVyZWQgYmVmb3JlIFNweW5lIGhhcyBiZWVuIGluaXRpYWxpemVkLmApXG4gICAgfVxuXG4gICAgY29uc3QgcHJveHlFeGlzdHMgPSB0aGlzLnN0cmVhbXNDb250cm9sbGVyLnRlc3RTdHJlYW0odGhpcy5wcm9wcy5uYW1lKVxuXG4gICAgaWYgKHByb3h5RXhpc3RzID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW1zQ29udHJvbGxlci5nZXRQcm94eVN1YmplY3QodGhpcy5wcm9wcy5uYW1lLCB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9PT0gdHJ1ZSA/IG5ldyBSZXBsYXlTdWJqZWN0KDEpIDogbmV3IFN1YmplY3QoKVxuICAgIH1cbiAgfVxuXG4gIC8vICBPVkVSUklERSBJTklUSUFMSVpBVElPTiBNRVRIT0RcbiAgLyoqXG4gICAqIDxwPihEZXByZWNhdGVkLiBVc2Ugb25SZWdpc3RlcmVkKS4gVGhpcyBtZXRob2QgaXMgZW1wdHkgYW5kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBDaGFubmVsIGhhcyBiZWVuIHJlZ2lzdGVyZWQuPC9wPlxuICAgKiA8cD5UYXNrcyBzdWNoIGFzIHN1YnNjcmliaW5nIHRvIG90aGVyIGNoYW5uZWxzLCBhbmQgc2VuZGluZyBpbml0aWFsIHBheWxvYWRzIGNhbiBiZSBhZGRlZCBoZXJlLjwvcD5cbiAgICovXG4gIG9uQ2hhbm5lbEluaXRpYWxpemVkKCkge1xuXG4gIH1cblxuICAvLyAgT1ZFUlJJREUgSU5JVElBTElaQVRJT04gTUVUSE9EXG4gIC8qKlxuICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBlbXB0eSBhbmQgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIENoYW5uZWwgaGFzIGJlZW4gcmVnaXN0ZXJlZC48L3A+XG4gICAqIDxwPlRhc2tzIHN1Y2ggYXMgc3Vic2NyaWJpbmcgdG8gb3RoZXIgY2hhbm5lbHMsIGFuZCBzZW5kaW5nIGluaXRpYWwgcGF5bG9hZHMgY2FuIGJlIGFkZGVkIGhlcmUuPC9wPlxuICAgKi9cbiAgb25SZWdpc3RlcmVkKHByb3BzID0gdGhpcy5wcm9wcykge1xuICAgIGlmIChwcm9wcy5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IE9iamVjdC5rZXlzKHRoaXMuY2hhbm5lbEFjdGlvbnMpWzBdXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkNIQU5ORUxTIEFDVElPTlMgSVMgXCIsdGhpcy5jaGFubmVsQWN0aW9ucyk7XG4gICAgICAvLyBPYmplY3QodGhpcy5jaGFubmVsQWN0aW9ucykua2V5c1swXTtcbiAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcHJvcHMuZGF0YSlcbiAgICB9XG4gIH1cblxuICBnZXQgaXNQcm94eSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pc1Byb3h5XG4gIH1cblxuICBnZXQgY2hhbm5lbE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMubmFtZVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIHJldHVybnMgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIGZvciB0aGUgY2hhbm5lbFxuICAgKi9cbiAgZ2V0IG9ic2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVyJFxuICB9XG5cbiAgY2hlY2tGb3JUcmFpdHMoKSB7XG4gICAgY29uc3QgYWRkVHJhaXRzID0gKHRyYWl0cykgPT4ge1xuICAgICAgaWYgKHRyYWl0cy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnQXJyYXknKSB7XG4gICAgICAgIHRyYWl0cyA9IFt0cmFpdHNdXG4gICAgICB9XG4gICAgICBjb25zdCBhZGRUcmFpdCA9IChUcmFpdENsYXNzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhaXRDbGFzcyh0aGlzKVxuICAgICAgfVxuXG4gICAgICB0cmFpdHMuZm9yRWFjaChhZGRUcmFpdClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy50cmFpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWRkVHJhaXRzKHRoaXMucHJvcHMudHJhaXRzKVxuICAgIH1cbiAgfVxuXG4gIC8vIERPIE5PVCBPVkVSUklERSBUSElTIE1FVEhPRFxuICBpbml0aWFsaXplU3RyZWFtKCkge1xuICAgIHRoaXMuY2hlY2tGb3JUcmFpdHMoKVxuICAgIHRoaXMub25DaGFubmVsSW5pdGlhbGl6ZWQoKVxuICAgIHRoaXMuY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUoKVxuICAgIHRoaXMub25SZWdpc3RlcmVkKClcbiAgICB0aGlzLnByb3BzLmlzUmVnaXN0ZXJlZCA9IHRydWVcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZShwcm9wcyA9IHRoaXMucHJvcHMsIGFjdGlvbnNPYmogPSB0aGlzLmNoYW5uZWxBY3Rpb25zKSB7XG4gICAgY29uc3QgYWN0aW9uc09iaklzRW1wdHkgPSBpc0VtcHR5KGFjdGlvbnNPYmopXG4gICAgY29uc3QgZGF0YUlzQWRkZWQgPSBwcm9wKCdkYXRhJywgcHJvcHMpICE9PSB1bmRlZmluZWRcbiAgICBjb25zdCBhdXRvU2V0VG9DYWNoZWRQYXlsb2FkID0gYWN0aW9uc09iaklzRW1wdHkgPT09IHRydWUgJiYgZGF0YUlzQWRkZWQgPT09IHRydWVcbiAgICBjb25zdCBzZXREZWZhdWx0QWN0aW9uc09iaiA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcHJvcHNcbiAgICAgIGNvbnN0IGFjdGlvblN0ciA9IGAke25hbWV9X0VWRU5UYFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2FjdGlvblN0cl0gOiBhY3Rpb25TdHJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYXV0b1NldFRvQ2FjaGVkUGF5bG9hZCkge1xuICAgICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0cnVlXG4gICAgICBhY3Rpb25zT2JqID0gc2V0RGVmYXVsdEFjdGlvbnNPYmooKVxuXG4gICAgICBpZiAodGhpcy5jaGFubmVsQWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBhY3Rpb25zT2JqXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJQUk9QUyBJUyBcIix7YWN0aW9uc09iaklzRW1wdHksIGRhdGFJc0FkZGVkLCBwcm9wcywgYWN0aW9uc09ian0sIHRoaXMuY2hhbm5lbEFjdGlvbnMpXG4gICAgcmV0dXJuIHsgcHJvcHMsIGFjdGlvbnNPYmogfVxuICB9XG5cbiAgc2V0VHJhY2UoYm9vbCkge1xuICB9XG5cbiAgY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmoobmFtZSwgZXh0ZW5kZWRBY3Rpb25zQXJyID0gW10pIHtcbiAgICBjb25zdCBnZXRBY3Rpb25WYWwgPSBpZkVsc2UoaXMoU3RyaW5nKSwgaWRlbnRpdHksIGhlYWQpXG4gICAgY29uc3QgbWFpbkFyciA9IGV4dGVuZGVkQWN0aW9uc0Fyci5jb25jYXQodGhpcy5hZGRSZWdpc3RlcmVkQWN0aW9ucyhuYW1lKSlcbiAgICBjb25zdCBhcnIgPSByTWFwKGdldEFjdGlvblZhbCwgbWFpbkFycilcbiAgICBjb25zdCBjb252ZXJ0ZXIgPSBzdHIgPT4gb2JqT2Yoc3RyLCBzdHIpXG4gICAgY29uc3Qgb2JqID0gbWVyZ2VBbGwoY2hhaW4oY29udmVydGVyLCBhcnIpKVxuICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBvYmpcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxBY3Rpb25NZXRob2RzKCkge1xuICAgIGNvbnN0IGRlZmF1bHRGbiA9ICdvblZpZXdTdHJlYW1JbmZvJ1xuICAgIGNvbnN0IGdldEFjdGlvblZhbCA9IGlmRWxzZShpcyhTdHJpbmcpLCBpZGVudGl0eSwgaGVhZClcbiAgICBjb25zdCBkZWxheUNoZWNrSWZUcmFpdE1ldGhvZEhhc0JlZW5BZGRlZCA9IChtZXRob2RTdHIsIHZhbCkgPT4ge1xuICAgICAgY29uc3QgZGVsYXllciA9ICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzW21ldGhvZFN0cl0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFwiJHt0aGlzLnByb3BzLm5hbWV9XCIsIFJFUVVJUkVTIFRIRSBGT0xMT1dJTkcgTUVUSE9EICR7bWV0aG9kU3RyfSBGT1IgQUNUSU9OLCAke3ZhbFswXX1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aW5kb3cuc2V0VGltZW91dChkZWxheWVyLCAxMDApXG4gICAgfVxuXG4gICAgY29uc3QgZ2V0Q3VzdG9tTWV0aG9kID0gdmFsID0+IHtcbiAgICAgIGNvbnN0IG1ldGhvZFN0ciA9IHZpZXcobGVuc0luZGV4KDEpLCB2YWwpXG4gICAgICBkZWxheUNoZWNrSWZUcmFpdE1ldGhvZEhhc0JlZW5BZGRlZChtZXRob2RTdHIsIHZhbClcbiAgICAgIHJldHVybiBtZXRob2RTdHJcbiAgICB9XG5cbiAgICBjb25zdCBnZXRBcnJNZXRob2QgPSAgaWZFbHNlKGlzKFN0cmluZyksIGFsd2F5cyhkZWZhdWx0Rm4pLCBnZXRDdXN0b21NZXRob2QpXG5cbiAgICBjb25zdCBjcmVhdGVPYmogPSB2YWwgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZ2V0QWN0aW9uVmFsKHZhbClcbiAgICAgIGNvbnN0IG1ldGhvZCA9ICBnZXRBcnJNZXRob2QodmFsKVxuICAgICAgcmV0dXJuIFtrZXksIG1ldGhvZF1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWxBY3Rpb25NZXRob2RzID0gZnJvbVBhaXJzKHJNYXAoY3JlYXRlT2JqLCB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkpKVxuXG4gICAgLy8gY29uc29sZS5sb2coJ3RoZSBjaGFubmVsIGFjdGlvbiBtZXRob2RzICcsdGhpcy5jaGFubmVsQWN0aW9uTWV0aG9kcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+Q2hhbm5lbHMgc2VuZCBhbG9uZyBBY3Rpb24gbmFtZXMgYWxvbmcgd2l0aCBpdHMgcGF5bG9hZC48L3A+XG4gICAqIDxwPkJlZm9yZSBhbnkgYWN0aW9uIGNhbiBiZSB1c2VkLCB0aGF0IGFjdGlvbiBuZWVkcyB0byBiZSByZWdpc3RlcmVkIHVzaW5nIHRoaXMgbWV0aG9kLjwvcD5cbiAgICogPHA+Vmlld1N0cmVhbSBpbnN0YW5jZXMgY2FuIGZpbHRlciBDaGFubmVsUGF5bG9hZHMgYnkgYmluZGluZyBzcGVjaWZpYyBMSU5LWydhY3Rpb25zIHRvIGxvY2FsIG1ldGhvZHMnLCAndmlldy1zdHJlYW0tYWRkLWFjdGlvbi1saXN0ZW5lcnMnXS48L3A+XG4gICAqIDxwPkZvcmNpbmcgcmVnaXN0cmF0aW9uIG9mIGFjdGlvbnMgYWxsb3dzIFNweW5lIHRvIHZhbGlkYXRlIEFjdGlvbnMsIGFuZCBpcyBhbHNvIGEgdXNlZnVsIHdheSB0byBrZWVwIHRyYWNrIG9mIGFsbCBBY3Rpb25zIHRoYXQgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQuPC9wPlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBBcnJheSBvZiBTdHJpbmdzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlJlZ2lzdGVyaW5nIEFjdGlvbnMgaW4gdGhlIGFkZFJlZ2lzdGVyZWRBY3Rpb25zIG1ldGhvZDwvaDQ+XCJdXG4gICAqICAgIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgKiAgICAgcmV0dXJuIFtcbiAgICogICAgICAgICdDSEFOTkVMX01ZX0NIQU5ORUxfRVZFTlQnLFxuICAgKiAgICAgICAgJ0NIQU5ORUxfTVlfQ0hBTk5FTF9VUERBVEVfRVZFTlQnXG4gICAqICAgICAgIF07XG4gICAqICAgICAgfVxuICAgKlxuICAgKi9cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgbGV0IGFyciA9IFtdXG4gICAgaWYgKHBhdGgoWydwcm9wcycsICdkYXRhJ10sIHRoaXMpKSB7XG4gICAgICBhcnIgPSBbYCR7dGhpcy5wcm9wcy5uYW1lfV9FVkVOVGBdXG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIG9uUmVjZWl2ZWRPYnNlcnZhYmxlKG9iaikge1xuICAgIHRoaXMub25JbmNvbWluZ09ic2VydmFibGUob2JqKVxuICB9XG5cbiAgZ2V0QWN0aW9uTWV0aG9kRm9yT2JzZXJ2YWJsZShvYmopIHtcbiAgICBvYmoudW5wYWNrZWQgPSB0cnVlXG4gICAgY29uc3QgZGVmYXVsdEZuID0gdGhpcy5vblZpZXdTdHJlYW1JbmZvLmJpbmQodGhpcylcblxuICAgIGNvbnN0IG1ldGhvZFN0ciA9IHBhdGgoWydkYXRhJywgJ2FjdGlvbiddLCBvYmopXG4gICAgY29uc3QgbWV0aG9kVmFsID0gcHJvcChtZXRob2RTdHIsIHRoaXMuY2hhbm5lbEFjdGlvbk1ldGhvZHMpXG5cbiAgICBsZXQgZm4gPSBkZWZhdWx0Rm5cblxuICAgIGlmIChtZXRob2RWYWwgIT09IHVuZGVmaW5lZCAmJiBtZXRob2RWYWwgIT09ICdvblZpZXdTdHJlYW1JbmZvJykge1xuICAgICAgY29uc3QgbWV0aG9kRXhpc3RzID0gdHlwZW9mICh0aGlzW21ldGhvZFZhbF0pID09PSAnZnVuY3Rpb24nXG4gICAgICBpZiAobWV0aG9kRXhpc3RzID09PSB0cnVlKSB7XG4gICAgICAgIGZuID0gdGhpc1ttZXRob2RWYWxdLmJpbmQodGhpcylcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZm5cbiAgfVxuXG4gIG9uSW5jb21pbmdPYnNlcnZhYmxlKG9iaikge1xuICAgIGNvbnN0IGVxc05hbWUgPSBlcXVhbHMob2JqLm5hbWUsIHRoaXMucHJvcHMubmFtZSlcbiAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCB9ID0gb2JqLmRhdGFcbiAgICAvLyBjb25zb2xlLmxvZyhcIklOQ09NSU5HIFwiLHthY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnR9LCB7b2JqfSk7XG4gICAgY29uc3QgbWVyZ2VQcm9wcyA9IChkKSA9PiBtZXJnZUFsbChbZCwgeyBhY3Rpb246IHByb3AoJ2FjdGlvbicsIGQpIH0sIHByb3AoJ3BheWxvYWQnLCBkKSwgcHJvcCgnc3JjRWxlbWVudCcsIGQpXSlcbiAgICBjb25zdCBkYXRhT2JqID0gb2JzVmFsID0+ICh7XG4gICAgICBjbG9uZTogKCkgPT4gbWVyZ2VQcm9wcyhvYmouZGF0YSksXG4gICAgICBhY3Rpb24sXG4gICAgICBwYXlsb2FkLFxuICAgICAgc3JjRWxlbWVudCxcbiAgICAgIGV2ZW50OiBvYnNWYWxcbiAgICB9KVxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChvYmopID0+IG9iai5vYnNlcnZhYmxlLnBpcGUobWFwKGRhdGFPYmopKVxuICAgICAgLnN1YnNjcmliZSh0aGlzLmdldEFjdGlvbk1ldGhvZEZvck9ic2VydmFibGUob2JqKSlcbiAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge31cbiAgICByZXR1cm4gZXFzTmFtZSA9PT0gdHJ1ZSA/IG9uU3VjY2VzcyhvYmopIDogb25FcnJvcigpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogPHA+Vmlld1N0ZWFtIGluc3RhbmNlcyBjYW4gc2VuZCBpbmZvIHRvIGNoYW5uZWxzIHRocm91Z2ggaXRzIExJTktbJ3NlbmRJbmZvVG9DaGFubmVsLCAndmlldy1zdHJlYW0tc2VuZC1pbmZvLXRvLWNoYW5uZWwnXSBtZXRob2QuPC9wPlxuICAgKiA8cD5EYXRhIHJlY2VpdmVkIGZyb20gVmlld1N0cmVhbXMgYXJlIGRpcmVjdGVkIHRvIHRoaXMgbWV0aG9kLjwvcD5cbiAgICogPHA+Vmlld1N0cmVhbXMgc2VuZCBkYXRhIHVzaW5nIHRoZSBMSU5LWydWaWV3U3RyZWFtUGF5bG9hZCcsICd2aWV3LXN0cmVhbS1wYXlsb2FkJ10gZm9ybWF0LjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtUGF5bG9hZH0gb2JqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlBhcnNpbmcgRGF0YSBSZXR1cm5lZCBmcm9tIGEgVmlld1N0cmVhbSBJbnN0YW5jZTwvaDQ+XCJdXG4gICAqIG9uVmlld1N0cmVhbUluZm8ob2JqKXtcbiAgICogICAgIGxldCBkYXRhID0gb2JqLnZpZXdTdHJlYW1JbmZvO1xuICAgKiAgICAgbGV0IGFjdGlvbiA9IGRhdGEuYWN0aW9uO1xuICAgKiAgICAgbGV0IG5ld1BheWxvYWQgPSB0aGlzLnBhcnNlVmlld1N0cmVhbURhdGEoZGF0YSk7XG4gICAqICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIG5ld1BheWxvYWQpO1xuICAgKiB9XG4gICAqXG4gICAqXG4gICAqL1xuICBvblZpZXdTdHJlYW1JbmZvKG9icykge1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqXG4gICAqIDxwPlRoaXMgbWV0aG9kIHRha2VzIGFuIGFjdGlvbiwgYSBkYXRhIG9iamVjdCBhbmQgb3RoZXIgcHJvcGVydGllcyB0byBjcmVhdGUgYW5kIHB1Ymxpc2ggYSBMSU5LWydDaGFubmVsUGF5bG9hZCcsICdjaGFubmVsLXBheWxvYWQnXSBvYmplY3QuPC9wPlxuICAgKiA8cD5PbmNlIHRoZSBhY3Rpb24gYW5kIHBheWxvYWQgaXMgdmFsaWRhdGVkLCB0aGlzIG1ldGhvZCB3aWxsIHB1Ymxpc2ggdGhlIGRhdGEgYnkgdXNpbmcgdGhlIGNoYW5uZWwncyBzb3VyY2UgU3ViamVjdCBuZXh0KCkgbWV0aG9kLlxuICAgKiA8cD5UaGlzIGNvbnNpc3RlbnQgZm9ybWF0IGFsbG93cyBzdWJzY3JpYmVycyB0byB1bmRlcnN0YW5kIGhvdyB0byBwYXJzZSBhbnkgaW5jb21pbmcgY2hhbm5lbCBkYXRhLjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBzcmNFbGVtZW50XG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gb2JzJFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gYWN0aW9uIC0gPSB1bmRlZmluZWQ7IFJlcXVpcmVkLiBBbiBhY3Rpb24gaXMgYSBzdHJpbmcsIHR5cGljYWxseSBpbiB0aGUgZm9ybWF0IG9mIFwiQ0hBTk5FTF9OQU1FX0FDVElPTl9OQU1FX0VWRU5UXCIsIGFuZCB0aGF0IGhhcyBiZWVuIGFkZGVkIGluIHRoZSBhZGRSZWdpc3RlcmVkQWN0aW9ucyBtZXRob2QuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXlsb2FkIC0gPSB1bmRlZmluZWQ7IFJlcXVpcmVkLiBUaGlzIGNhbiBiZSBhbnkgamF2YXNjcmlwdCBvYmplY3QgYW5kIGlzIHVzZWQgdG8gc2VuZCBhbnkgY3VzdG9tIGRhdGEuXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IHNyY0VsZW1lbnQgLSA9IE5vdCBSZXF1aXJlZC4gdW5kZWZpbmVkOyBUaGlzIGNhbiBiZSBlaXRoZXIgdGhlIGVsZW1lbnQgcmV0dXJuZWQgZnJvbSB0aGUgVUkgQ2hhbm5lbCwgb3IgdGhlIHNyY0VsZW1lbnQgZnJvbSBhIFZpZXdTdHJlYW0gaW5zdGFuY2UuXG4gICAqIEBwcm9wZXJ0eSB7VUlFdmVudH0gZXZlbnQgLSA9IHVuZGVmaW5lZDsgTm90IFJlcXVpcmVkLiBUaGlzIHdpbGwgYmUgZGVmaW5lZCBpZiB0aGUgZXZlbnQgaXMgZnJvbSB0aGUgVUkgQ2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtPYnNlcnZhYmxlfSBvYnMkIC0gPSB0aGlzLm9ic2VydmVyOyBUaGlzIGRlZmF1bHQgaXMgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIGZvciB0aGlzIGNoYW5uZWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+UHVibGlzaGluZyBhIENoYW5uZWxQYXlsb2FkPC9oND4nXVxuICAgKiBsZXQgYWN0aW9uID0gXCJDSEFOTkVMX01ZX0NIQU5ORUxfUkVHSVNURVJFRF9BQ1RJT05fRVZFTlRcIjtcbiAgICogbGV0IGRhdGEgPSB7Zm9vOlwiYmFyXCJ9O1xuICAgKiB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIGRhdGEpO1xuICAgKlxuICAgKi9cbiAgc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCA9IHt9LCBldmVudCA9IHt9LCBvYnMkID0gdGhpcy5vYnNlcnZlciQpIHtcbiAgICAvLyBNQUtFUyBBTEwgQ0hBTk5FTCBCQVNFIEFORCBEQVRBIFNUUkVBTVMgQ09OU0lTVEVOVFxuXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRJdGVtID0gbmV3IENoYW5uZWxQYXlsb2FkKHRoaXMucHJvcHMubmFtZSwgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICAvLyBjb25zb2xlLmxvZyhcIkNIQU5ORUwgU1RSRUVNIElURU0gXCIsY2hhbm5lbFBheWxvYWRJdGVtKTtcblxuICAgIC8vIGNvbnN0IG9uTmV4dEZyYW1lID0gKCk9Pm9icyQubmV4dChjaGFubmVsUGF5bG9hZEl0ZW0pO1xuICAgIC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZShvbk5leHRGcmFtZSlcblxuICAgIG9icyQubmV4dChjaGFubmVsUGF5bG9hZEl0ZW0pXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogPHA+QWxsb3dzIGNoYW5uZWxzIHRvIHN1YnNjcmliZSB0byBvdGhlciBjaGFubmVscy48L3A+XG4gICAqIDxwPlRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNvdXJjZSByeGpzIFN1YmplY3QgZm9yIHRoZSByZXF1ZXN0ZWQgQ2hhbm5lbCwgd2hpY2ggY2FuIGJlIGxpc3RlbmVkIHRvIGJ5IGNhbGxpbmcgaXRzIHN1YnNjcmliZSBtZXRob2QuPC9wPlxuICAgKiA8cD5Lbm93bGVkZ2Ugb2YgcnhqcyBpcyBub3QgcmVxdWlyZWQgdG8gc3Vic2NyaWJlIHRvIGFuZCBwYXJzZSBDaGFubmVsIGRhdGEuPC9wPlxuICAgKiA8cD5CdXQgYWNjZXNzaW5nIHRoZSByeGpzIFN1YmplY3QgZ2l2ZXMgZGV2ZWxvcGVycyB0aGUgYWJpbGl0eSB0byB1c2UgYWxsIG9mIHRoZSBhdmFpbGFibGUgcnhqcyBtYXBwaW5nIGFuZCBvYnNlcnZhYmxlIHRvb2xzLjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lIFRoZSByZWdpc3RlcmVkIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBjaGFubmVsLlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgc291cmNlIHJ4anMgU3ViamVjdCBvZiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwuXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlN1YnNjcmliaW5nIHRvIGEgQ2hhbm5lbCBVc2luZyB0aGUgZ2V0Q2hhbm5lbCBtZXRob2Q8L2g0PlwiXVxuICAgKiBsZXQgcm91dGUkID0gdGhpcy5nZXRDaGFubmVsKFwiQ0hBTk5FTF9ST1VURVwiKVxuICAgKiByb3V0ZSQuc3Vic2NyaWJlKGxvY2FsTWV0aG9kKTtcbiAgICpcbiAgICpcbiAgICovXG4gIGdldENoYW5uZWwoY2hhbm5lbE5hbWUsIHBheWxvYWRGaWx0ZXIpIHtcbiAgICBjb25zdCBpc1ZhbGlkQ2hhbm5lbCA9IGMgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMoYylcbiAgICBjb25zdCBlcnJvciA9IGMgPT4gY29uc29sZS53YXJuKFxuICAgICAgICBgY2hhbm5lbCBuYW1lICR7Y30gaXMgbm90IHdpdGhpbiAke3JlZ2lzdGVyZWRTdHJlYW1OYW1lc31gKVxuICAgIGNvbnN0IHN0YXJ0U3Vic2NyaWJlID0gKGMpID0+IHtcbiAgICAgIGNvbnN0IG9icyQgPSB0aGlzLnN0cmVhbXNDb250cm9sbGVyLmdldFN0cmVhbShjKS5vYnNlcnZlclxuICAgICAgaWYgKG9icyQuc291cmNlKSB7XG4gICAgICAgIG9icyQuc291cmNlLmNoYW5uZWxOYW1lID0gY2hhbm5lbE5hbWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9icyQuY2hhbm5lbE5hbWUgPSBjaGFubmVsTmFtZVxuICAgICAgfVxuXG4gICAgICBpZiAocGF5bG9hZEZpbHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBvYnMkLnBpcGUoZmlsdGVyKHBheWxvYWRGaWx0ZXIpKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JzJFxuICAgIH1cbiAgICBjb25zdCBmbiA9IGlmRWxzZShpc1ZhbGlkQ2hhbm5lbCwgc3RhcnRTdWJzY3JpYmUsIGVycm9yKVxuICAgIHJldHVybiBmbihjaGFubmVsTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSBDaGFubmVscyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBmb3JrSm9pbiBDaGFubmVsLm9ic2VydmVyJFxuICAgKlxuICAgKiAqL1xuXG4gIG1lcmdlQ2hhbm5lbHMoY2hhbm5lbHNBcnIsIGVtaXRPbmNlID0gdHJ1ZSkge1xuICAgIC8vIDEpIE5vcm1hbGl6ZSBpbnB1dHMgdG8gT2JzZXJ2YWJsZXNcbiAgICBjb25zdCBjaGFubmVsT2JzZXJ2YWJsZXMgPSBjaGFubmVsc0Fyci5tYXAoaXRlbSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGNoYW4kID0gdGhpcy5nZXRDaGFubmVsKGl0ZW0pXG4gICAgICAgIHJldHVybiBlbWl0T25jZSA/IGNoYW4kLnBpcGUodGFrZSgxKSkgOiBjaGFuJFxuICAgICAgfVxuICAgICAgcmV0dXJuIGVtaXRPbmNlID8gaXRlbS5waXBlKHRha2UoMSkpIDogaXRlbVxuICAgIH0pXG5cbiAgICAvLyAyKSBDb21iaW5lIHRoZW1cbiAgICBsZXQgY29tYmluZWQkXG4gICAgaWYgKGVtaXRPbmNlKSB7IC8vIG9uZeKAkXNob3Q6IHNuYXBzaG90IHRoZW4gY29tcGxldGVcbiAgICAgIGNvbWJpbmVkJCA9IGZvcmtKb2luKGNoYW5uZWxPYnNlcnZhYmxlcylcbiAgICB9IGVsc2UgeyAvLyBsaXZlIHVwZGF0ZXM6IGNvbWJpbmVMYXRlc3RXaXRoXG4gICAgICBpZiAoY2hhbm5lbE9ic2VydmFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb21iaW5lZCQgPSBFTVBUWVxuICAgICAgfSBlbHNlIGlmIChjaGFubmVsT2JzZXJ2YWJsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbWJpbmVkJCA9IGNoYW5uZWxPYnNlcnZhYmxlc1swXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0JCwgLi4ucmVzdCRdID0gY2hhbm5lbE9ic2VydmFibGVzXG4gICAgICAgIGNvbWJpbmVkJCA9IGZpcnN0JC5waXBlKGNvbWJpbmVMYXRlc3RXaXRoKC4uLnJlc3QkKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzKSBNYXAgYXJyYXkg4oaSIGtleWVkIG9iamVjdFxuICAgIC8vIHJldHVybiBjb21iaW5lZCQ7XG4gICAgcmV0dXJuIGNvbWJpbmVkJC5waXBlKFxuICAgICAgbWFwKHJlc3VsdHNBcnIgPT4ge1xuICAgICAgICBjb25zdCBvYmogPSB7fVxuICAgICAgICBjaGFubmVsc0Fyci5mb3JFYWNoKChpdGVtLCBpZHgpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVyS2V5ID0gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnID8gaXRlbSA6IGBjaGFubmVsXyR7aWR4fWBcbiAgICAgICAgICBjb25zdCBjbktleSA9IGl0ZW0/LnNvdXJjZT8uY2hhbm5lbE5hbWUgfHwgaXRlbT8uc291cmNlPy5zb3VyY2U/LmNoYW5uZWxOYW1lXG4gICAgICAgICAgY29uc3Qga2V5ID0gY25LZXkgfHwgaXRlcktleVxuICAgICAgICAgIG9ialtrZXldID0gcmVzdWx0c0FycltpZHhdXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBvYmpcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yTm90VHJhY2tGbGFnKHByb3BzID0ge30pIHtcbiAgICBpZiAocHJvcHMuZG9Ob3RUcmFjayA9PT0gdHJ1ZSkge1xuICAgICAgU3B5bmVBcHBQcm9wZXJ0aWVzLmRvTm90VHJhY2tDaGFubmVsKHByb3BzLmNoYW5uZWxOYW1lKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBjb21wb3NlLCBwYXRoLCBpcyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5cbi8vIGNvbnNvbGUubG9nKCdjaGFubmVscyBjb25maWcgbG9hZGVkICcsUixSeCk7XG5jb25zdCByZWdpc3RlcmVkU3RyZWFtTmFtZXMgPSAoKSA9PiAoe1xuICBpbmNsdWRlczogICgpID0+IFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSA/IFNweW5lQXBwUHJvcGVydGllcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzKCkgOiBbJ0NIQU5ORUxfUk9VVEUnLCAnQ0hBTk5FTF9VSScsICdDSEFOTkVMX1dJTkRPVycsICdESVNQQVRDSEVSJ11cblxufSlcblxuLy8gZ2V0R2xvYmFsT2JqKCkuY2hhbm5lbHNMaXN0QXJyO1xuY29uc3QgcmVnaXN0ZXJlZFN0ZXBzID0gWydMT0FEJywgJ1JFTkRFUicsICdNT1VOVCcsICdVTk1PVU5UJywgJ0RJU1BPU0UnLCAnR0FSQkFHRV9DT0xMRUNUJywgJ1VQREFURSddXG5jb25zdCByZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzID0gWydwYXJlbnQnLCAnc2VsZicsICdjaGlsZCcsICdjaGlsZHJlbicsICd2aWV3J11cbmNvbnN0IHJlZ2lzdGVyZWRTdHJlYW1UeXBlcyA9IFsnT2JzZXJ2YWJsZScsICdCZWhhdmlvclN1YmplY3QnLCAnU3ViamVjdCcsICdPYnNlcnZlcicsICdTdWJzY3JpYmVyJywgJ0Zyb21FdmVudE9ic2VydmFibGUnXVxuY29uc3QgcmVnaXN0ZXJlZEFjdGlvbnMgPSBbJ3N1YnNjcmliZScsICdjb21iaW5lTGF0ZXN0J11cbmNvbnN0IGdldFJ4VHlwZSA9IChvYnMpID0+IG9icygpLmNvbnN0cnVjdG9yLm5hbWVcbi8vIGxldCBnZXRPYnNlcnZhYmxlVHlwZSA9IChvYnMpID0+IG9icy5jb25zdHJ1Y3Rvci5uYW1lO1xuY29uc3QgY29uZmlybU9ic2VydmFibGUgPSAob2JzKSA9PiBvYnMuc3Vic2NyaWJlICE9PSB1bmRlZmluZWRcbi8vIGxldCBwdWxsTWFpblJvdXRlID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoL14oXFwvPykoLiopKFxcLykoLiopL2csICckMicpO1xubGV0IGJhc2VWYWxpZGF0aW9ucyA9IFtdOyBsZXQgdmlld0luZm9WYWxpZGF0aW9ucyA9IFtdOyBsZXQgdWlWYWxpZGF0aW9ucyA9IFtdXG5sZXQgbGlmZXN0cmVhbVZhbGlkYXRpb25zID0gW107IGxldCBzdGVwVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtdXG5sZXQgcm91dGVWYWxpZGF0aW9ucyA9IFtdOyBsZXQgU3RyZWFtc0NvbmZpZyA9IFtdXG5cbmlmIChjb21wb3NlICE9PSB1bmRlZmluZWQgJiYgT2JzZXJ2YWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4vLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFMTCBWQUxJREFUSU9OUyBBREQgVEhFIEJBU0UgVkFMSURBVElPTlMgVEhST1VHSCBDT05DQVRFTkFUSU9OXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYmFzZVZhbGlkYXRpb25zID0gW1xuICAgIHtcbiAgICAgIGVycm9yOiBgbmVlZCB0byBtYXRjaCBhIHZhbGlkIG5hbWUgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgIH0sXG5cbiAgICB7XG4gICAgICBlcnJvcjogJ3BhcmFtIFxcJ29ic2VydmFibGVcXCcgbXVzdCBjb250YWluIGEgdmFsaWQgT2JzZXJ2YWJsZScsXG4gICAgICAvLyBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbVR5cGVzLmluY2x1ZGVzKGdldE9ic2VydmFibGVUeXBlKHBheWxvYWQub2JzZXJ2YWJsZSkpXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gY29uZmlybU9ic2VydmFibGUocGF5bG9hZC5vYnNlcnZhYmxlKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6ICdwYXJhbSBhY3Rpb24gbXVzdCBiZSBhIHJlZ2lzdGVyZWQgYWN0aW9uJyxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkQWN0aW9ucy5pbmNsdWRlcyhwYXlsb2FkLmFjdGlvbilcbiAgICB9XG5cbiAgXVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRIRVNFIFZBTElEQVRJT05TIEFSRSBDT05DQVRFTkFURUQgV0hFTiBUSEUgT0JTRVJWQUJMRSBSRUZFUlMgVE8gQSBWSUVXXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmlld0luZm9WYWxpZGF0aW9ucyA9IFtcbiAgICB7XG4gICAgICBlcnJvcjogJ25lZWRzIHZzaWQgbnVtYmVyIGluIHNyY0VsZW1lbnQnLFxuICAgICAgcHJlZGljYXRlOiBjb21wb3NlKGlzKFN0cmluZyksIHBhdGgoWydkYXRhJywgJ3NyY0VsZW1lbnQnLCAndnNpZCddKSlcbiAgICB9LFxuICAgIHtcbiAgICAgIGVycm9yOiAnbmVlZHMgYSBpZCBpbiBzcmNFbGVtZW50JyxcbiAgICAgIHByZWRpY2F0ZTogY29tcG9zZShpcyhTdHJpbmcpLFxuICAgICAgICBwYXRoKFsnZGF0YScsICdzcmNFbGVtZW50JywgJ2lkJ10pKVxuICAgIH1cbiAgXVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTk8gU1BFQ0lGSUMgVUkgVkFMSURBVElPTlMgQVQgVEhJUyBUSU1FIC0tIElUIEpVU1QgQUREIE9USEVSU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHVpVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCB1aVZhbGlkYXRpb25zID0gW11cbiAgICByZXR1cm4gdWlWYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKS5jb25jYXQodmlld0luZm9WYWxpZGF0aW9ucylcbiAgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5PIFNQRUNJRklDIExJRkVTVFJFQU0gVkFMSURBVElPTlMgQVQgVEhJUyBUSU1FIC0tIElUIEpVU1QgQUREIE9USEVSU1xuICBjb25zdCBsaWZlU3RyZWFtVmFsaWRhdGlvbnMgPSBbXG5cbiAgICB7XG4gICAgICBlcnJvcjogYG5lZWQgdG8gbWF0Y2ggYSB2YWxpZCBuYW1lIHdpdGhpbiAke3JlZ2lzdGVyZWRTdHJlYW1UeXBlc31gLFxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcygpLmluY2x1ZGVzKHBheWxvYWQubmFtZSlcbiAgICB9LFxuXG4gICAge1xuICAgICAgZXJyb3I6IGBuZWVkcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdGVwIHN0cmluZ3M6ICR7cmVnaXN0ZXJlZFN0ZXBzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0ZXBzLmluY2x1ZGVzKHBheWxvYWQuU1RFUClcbiAgICB9LFxuICAgIHtcbiAgICAgIGVycm9yOiBgdHlwZSBuZWVkcyB0byBvbmUgb2YgdGhlIGZvbGxvd2luZzogJHtyZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZExpZmVTdHJlYW1UeXBlcy5pbmNsdWRlcyhwYXlsb2FkLnR5cGUpXG4gICAgfSxcblxuICAgIHtcbiAgICAgIGVycm9yOiAndmlld0lkIG5lZWRzIHRvIGJlIGFkZGVkICcsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC52aWV3SWQgIT09IHVuZGVmaW5lZFxuICAgIH1cbiAgXVxuXG4gIHN0ZXBWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBWYWxpZGF0aW9ucyA9IFtdXG4gICAgcmV0dXJuIHN0ZXBWYWxpZGF0aW9ucy5jb25jYXQobGlmZVN0cmVhbVZhbGlkYXRpb25zKVxuICB9XG5cbiAgc3RlcERpc3Bvc2VWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdESVNQT1NFIFNURVAgcmVxdWlyZXMgYSBkaXNwb3NlSXRlbSBwYXJhbSBpbiB0aGUgZGF0YSBvYmplY3QnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC5TVEVQID09PSAnRElTUE9TRScgJiZcbiAgICAgICAgICAgIHBheWxvYWQuZGF0YS5kaXNwb3NlSXRlbXMgIT09IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIF1cbiAgICByZXR1cm4gc3RlcFVwZGF0ZVZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cblxuICBzdGVwVXBkYXRlVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzdGVwVXBkYXRlVmFsaWRhdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIGVycm9yOiAnVVBEQVRFIFNURVAgcmVxdWlyZXMgYSBkYXRhIG9iamVjdCAnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC5TVEVQID09PSAnVVBEQVRFJyAmJiBwYXlsb2FkLmRhdGEgIT09XG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgIH1cbiAgICBdXG4gICAgcmV0dXJuIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucy5jb25jYXQobGlmZVN0cmVhbVZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gbGlmZXN0cmVhbVZhbGlkYXRpb25zXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGlmZXN0cmVhbVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGxpZmVTdHJlYW1WYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKVxuICAgICAgLmNvbmNhdCh2aWV3SW5mb1ZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSEVSRSBJUyBUSEUgUk9VVEUgVkFMSURBVElPTlNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByb3V0ZVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgcm91dGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIC8qXG4gICAgICAqXG4gICAgICB7XG4gICAgICAgICAgZXJyb3I6IGBuZWVkcyBhIHZhbGlkIHJvdXRlIHN0cmluZyB3aXRoaW4gWyR7cmVnaXN0ZXJlZFJvdXRlc31dYCxcbiAgICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFJvdXRlcy5pbmNsdWRlcyhwdWxsTWFpblJvdXRlKHBheWxvYWQuZGF0YS5uYXZpZ2F0ZVRvKSlcbiAgICAgIH1cbiAgICAgICpcbiAgICAgICovXG5cbiAgICBdXG4gICAgcmV0dXJuIHJvdXRlVmFsaWRhdGlvbnMuY29uY2F0KGJhc2VWYWxpZGF0aW9ucykuY29uY2F0KHZpZXdJbmZvVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKlxuICAqIFRIRSBJREVBIE9GIFN0cmVhbXNDb25maWcgSVMgVE8gQ09NUExFVEVMWSBHRU5FUkFURSBBTEwgQVBQIFNUUkVBTVMgVVNJTkcgVEhJUyBPQkpFQ1RcbiAgKiBUSElTIEhBUyBOT1QgQkVFTiBJTVBMRU1FTlRFRCAtLSBNQVkgQkUgQURERUQgSU4gQSBGVVRVUkUgVkVSU0lPTlxuICAqL1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFN0cmVhbXNDb25maWcgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzdHJlYW1WYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBcXCduYW1lXFwnIG11c3QgYmUgb2YgYSByZWdpc3RlcmVkIHR5cGUnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBcXCdvYnNlcnZhYmxlXFwnIG11c3QgY29udGFpbiBhIHZhbGlkIE9ic2VydmFibGUnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbVR5cGVzLmluY2x1ZGVzKFxuICAgICAgICAgIGdldFJ4VHlwZShwYXlsb2FkLm9ic2VydmFibGUpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBhY3Rpb24gbXVzdCBiZSBhIHJlZ2lzdGVyZWQgYWN0aW9uJyxcbiAgICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRBY3Rpb25zLmluY2x1ZGVzKHBheWxvYWQuYWN0aW9uKVxuICAgICAgfVxuXG4gICAgXVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmVhbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGluaXQ6IHtcbiAgICAgICAgICAgIG5hbWU6ICdESVNQQVRDSEVSJyxcbiAgICAgICAgICAgIG9ic2VydmFibGU6ICgpID0+IG5ldyBTdWJqZWN0KCksXG4gICAgICAgICAgICBhY3Rpb246ICdzdWJzY3JpYmUnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIG9ic2VydmFibGU6IE9ic2VydmFibGUgfHwgU3ViamVjdCxcbiAgICAgICAgICAgIGFjdGlvbjogU3RyaW5nXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2YWxpZGF0aW9uczogc3RyZWFtVmFsaWRhdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGluaXQ6IHtcbiAgICAgICAgICAgIG5hbWU6ICdVQlUnLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogKCkgPT4gbmV3IFN1YmplY3QoKSxcbiAgICAgICAgICAgIGFjdGlvbjogJ3N1YnNjcmliZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0cnVjdHVyZToge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZSB8fCBTdWJqZWN0LFxuICAgICAgICAgICAgYWN0aW9uOiBTdHJpbmdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZhbGlkYXRpb25zOiBzdHJlYW1WYWxpZGF0aW9uc1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9XG59XG5leHBvcnQge1xuICBzdGVwRGlzcG9zZVZhbGlkYXRpb25zLCBzdGVwVXBkYXRlVmFsaWRhdGlvbnMsIHN0ZXBWYWxpZGF0aW9ucywgdWlWYWxpZGF0aW9ucywgcm91dGVWYWxpZGF0aW9ucywgbGlmZXN0cmVhbVZhbGlkYXRpb25zLCByZWdpc3RlcmVkU3RyZWFtTmFtZXMsIFN0cmVhbXNDb25maWdcbn1cbiIsImltcG9ydCB7IFNweW5lQ2hhbm5lbFJvdXRlIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLXJvdXRlLmpzJ1xuaW1wb3J0IHsgU3B5bmVDaGFubmVsVUkgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtdWkuanMnXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxXaW5kb3cgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtd2luZG93LmpzJ1xuaW1wb3J0IHsgU3B5bmVDaGFubmVsTGlmZWN5Y2xlIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLWxpZmVjeWNsZS5qcydcbmltcG9ydCB7IFNweW5lQ2hhbm5lbEFJIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLWFpLmpzJ1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IENoYW5uZWxQcm94eSB9IGZyb20gJy4vY2hhbm5lbC1wcm94eS5qcydcbmltcG9ydCB7IHByb3BFcSwgcGx1Y2ssIHByb3AsIGZpbHRlciwgcGF0aEVxLCByZWplY3QsIGNvbXBvc2UsIGpvaW4sIG1hcCBhcyByTWFwIH0gZnJvbSAncmFtZGEnXG5cbmNvbnN0IF9tYXAgPSBuZXcgTWFwKClcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxzTWFwIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbHNEZWxlZ2F0b3JcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGRlc2NcbiAgICogVGhpcyBvYmplY3QgY3JlYXRlcyB0aGUgbG9naWMgc28gdGhhdCBDaGFubmVscyBhbmQgVmlld1N0cmVhbXMgY2FuIGNvbW11bmljYXRlIHdpdGggZWFjaCBvdGhlclxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIF9tYXAuc2V0KCdESVNQQVRDSEVSJywgbmV3IFN1YmplY3QoKSlcbiAgICB0aGlzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMgPSBDaGFubmVsc01hcC5saXN0UmVnaXN0ZXJlZENoYW5uZWxzLmJpbmQodGhpcylcbiAgICB0aGlzLmdldENoYW5uZWxzTGlzdCA9IENoYW5uZWxzTWFwLmdldENoYW5uZWxzTGlzdC5iaW5kKHRoaXMpXG4gIH1cblxuICBnZXQgbWFwKCkge1xuICAgIHJldHVybiBfbWFwXG4gIH1cblxuICBzdGF0aWMgZ2V0Q2hhbm5lbHNMaXN0KCkge1xuICAgIGNvbnN0IHByb3h5TWFwRm4gPSAgKGssIHYpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGtbMF1cbiAgICAgIGNvbnN0IHZhbCA9IGtbMV0uY29uc3RydWN0b3IubmFtZVxuICAgICAgcmV0dXJuIHsga2V5LCB2YWwgfVxuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbShfbWFwLCBwcm94eU1hcEZuKVxuICB9XG5cbiAgc3RhdGljIGxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoc2hvd09ubHlQcm94aWVzID0gZmFsc2UpIHtcbiAgICBjb25zdCBwcm94eU1hcCA9IHRoaXMuZ2V0Q2hhbm5lbHNMaXN0KClcbiAgICBjb25zdCByZWplY3RQcm94eUZuID0gcmVqZWN0KHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZpbHRlclByb3h5Rm4gPSBmaWx0ZXIocHJvcEVxKCdDaGFubmVsUHJveHknLCAndmFsJykpXG4gICAgY29uc3QgZm4gPSBzaG93T25seVByb3hpZXMgPT09IHRydWUgPyBmaWx0ZXJQcm94eUZuIDogcmVqZWN0UHJveHlGblxuICAgIGNvbnN0IHJlbW92ZWRQcm94eUFyciA9IGZuKHByb3h5TWFwKVxuICAgIHJldHVybiBwbHVjayhbJ2tleSddLCByZW1vdmVkUHJveHlBcnIpXG4gIH1cblxuICBsaXN0UHJveHlDaGFubmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzKHRydWUpXG4gIH1cblxuICBjaGVja0Zvck1pc3NpbmdDaGFubmVscygpIHtcbiAgICBjb25zdCBwcm94eU1hcCA9IHRoaXMuZ2V0Q2hhbm5lbHNMaXN0KClcbiAgICBjb25zdCBmaWx0ZXJQcm94eUZuID0gZmlsdGVyKHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZpbHRlclByb3h5QXJyID0gZmlsdGVyUHJveHlGbihwcm94eU1hcClcblxuICAgIGlmIChmaWx0ZXJQcm94eUFyci5sZW5ndGggPj0gMSkge1xuICAgICAgY29uc3QgY2hhbm5lbFN0ciA9IGZpbHRlclByb3h5QXJyLmxlbmd0aCA9PT0gMSA/ICdDaGFubmVsIGhhcycgOiAnQ2hhbm5lbHMgaGF2ZSdcbiAgICAgIGNvbnN0IGNoYW5uZWxzID0gY29tcG9zZShqb2luKCcsICcpLCByTWFwKHByb3AoJ2tleScpKSkoZmlsdGVyUHJveHlBcnIpXG4gICAgICBjb25zdCBmaWx0ZXJQcmVmaXhXYXJuaW5nID0gYFNweW5lIFdhcm5pbmc6IFRoZSBmb2xsb3dpbmcgJHtjaGFubmVsU3RyfSBub3QgYmVlbiBpbml0aWFsaXplZDogJHtjaGFubmVsc31gXG4gICAgICBjb25zb2xlLndhcm4oZmlsdGVyUHJlZml4V2FybmluZylcbiAgICB9XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuY3JlYXRlTWFpblN0cmVhbXMoKVxuICB9XG5cbiAgY3JlYXRlTWFpblN0cmVhbXMoKSB7XG4gICAgdGhpcy5yb3V0ZVN0cmVhbSA9IG5ldyBTcHluZUNoYW5uZWxSb3V0ZSgpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfUk9VVEUnLCB0aGlzLnJvdXRlU3RyZWFtKVxuXG4gICAgdGhpcy51aVN0cmVhbSA9IG5ldyBTcHluZUNoYW5uZWxVSSgpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfVUknLCB0aGlzLnVpU3RyZWFtKVxuXG4gICAgdGhpcy5kb21TdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsV2luZG93KClcbiAgICBfbWFwLnNldCgnQ0hBTk5FTF9XSU5ET1cnLCB0aGlzLmRvbVN0cmVhbSlcblxuICAgIHRoaXMudmlld1N0cmVhbUxpZmVjeWNsZSA9IG5ldyBTcHluZUNoYW5uZWxMaWZlY3ljbGUoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX0xJRkVDWUNMRScsIHRoaXMudmlld1N0cmVhbUxpZmVjeWNsZSlcblxuICAgIHRoaXMuYWlTdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsQUkoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX0FJJywgdGhpcy5haVN0cmVhbSlcblxuICAgIHRoaXMucm91dGVTdHJlYW0uaW5pdGlhbGl6ZVN0cmVhbSgpXG4gICAgdGhpcy5kb21TdHJlYW0uaW5pdGlhbGl6ZVN0cmVhbSgpXG4gIH1cblxuICBhZGRLZXlFdmVudChrZXkpIHtcbiAgICBfbWFwLmdldCgnVUknKS5hZGRLZXlFdmVudChrZXkpXG4gIH1cblxuICByZWdpc3RlclN0cmVhbSh2YWwpIHtcbiAgICBjb25zdCBuYW1lID0gdmFsLmNoYW5uZWxOYW1lXG4gICAgY29uc3QgbmFtZUV4aXN0cyA9IF9tYXAuaGFzKG5hbWUpXG4gICAgaWYgKG5hbWVFeGlzdHMpIHtcbiAgICAgIGNvbnN0IGlzQWxyZWFkeVJlZ2lzdGVyZCA9IGNvbXBvc2UocGF0aEVxKFsncHJvcHMnLCAnaXNSZWdpc3RlcmVkJ10sIHRydWUpKShfbWFwLmdldChuYW1lKSlcbiAgICAgIGlmIChpc0FscmVhZHlSZWdpc3RlcmQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgQ2hhbm5lbCwgJHtuYW1lfSwgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIWApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIF9tYXAuc2V0KG5hbWUsIHZhbClcbiAgICB2YWwuaW5pdGlhbGl6ZVN0cmVhbSgpXG4gIH1cblxuICBnZXRDaGFubmVsQWN0aW9ucyhzdHIpIHtcbiAgICByZXR1cm4gX21hcC5nZXQoc3RyKS5hZGRSZWdpc3RlcmVkQWN0aW9ucygpXG4gIH1cblxuICBnZXRQcm94eVN1YmplY3QobmFtZSwgaXNSZXBsYXlTdWJqZWN0ID0gZmFsc2UpIHtcbiAgICBjb25zdCBzdWJqZWN0VHlwZSA9IGlzUmVwbGF5U3ViamVjdCA9PT0gdHJ1ZSA/ICdyZXBsYXlTdWJqZWN0JyA6ICdzdWJqZWN0J1xuXG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpW3N1YmplY3RUeXBlXVxuICB9XG5cbiAgdGVzdFN0cmVhbShuYW1lKSB7XG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpICE9PSB1bmRlZmluZWRcbiAgfVxuXG4gIGdldFN0cmVhbShuYW1lKSB7XG4gICAgaWYgKHRoaXMudGVzdFN0cmVhbShuYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgIF9tYXAuc2V0KG5hbWUsIG5ldyBDaGFubmVsUHJveHkobmFtZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpXG4gIH1cblxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIENPUkUgREVDT1JBVE9SU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gbGV0IGNvcmVNaXhpbnMgPSAgYmFzZUNvcmVNaXhpbnMoKTtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgU1RSRUFNUyBERUNPUkFUT1JTXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBsZXQgc3RyZWFtc01peGlucyA9IEJhc2VTdHJlYW1zTWl4aW5zKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxBSSBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxBSVxuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIEludGVybmFsIENoYW5uZWwgdGhhdCBwdWJsaXNoZXMgcmVuZGVyaW5nIGFuZCBkaXNwb3NpbmcgZXZlbnRzIG9mIGFsbCBWaWV3U3RyZWFtcyB3aG9zZSBwcm9wZXJ0eSwgcHJvcGVyLnNlbmRBSUV2ZW50cyBpcyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogPGgzPlRoZSB0d28gYWN0aW9ucyB0aGF0IGFyZSByZWdzaXRlcmVkIGZvciB0aGlzIGNoYW5uZWwgYXJlOjwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkNIQU5ORUxfQUlfUkVOREVSRURfRVZFTlQ8L2xpPlxuICAgKiA8bGk+Q0hBTk5FTF9BSV9ESVNQT1NFRF9FVkVOVDwvbGk+XG4gICAqICA8L3VsPlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfQUknO1xuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoJ0NIQU5ORUxfQUknLCBwcm9wcylcbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnQ0hBTk5FTF9BSV9SRU5ERVJFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9BSV9ESVNQT1NFRF9FVkVOVCdcbiAgICBdXG4gIH1cblxuICBvblZpZXdTdHJlYW1JbmZvKG9iaikge1xuICAgIGNvbnN0IHsgYWN0aW9uLCBzcmNFbGVtZW50IH0gPSBvYmpcbiAgICBjb25zdCBwYXlsb2FkID0gc3JjRWxlbWVudFxuICAgIHBheWxvYWQuYWN0aW9uID0gYWN0aW9uXG4gICAgdGhpcy5vblNlbmRFdmVudChhY3Rpb24sIHBheWxvYWQpXG4gIH1cblxuICBvblNlbmRFdmVudChhY3Rpb25TdHIsIHBheWxvYWQgPSB7fSkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnNbYWN0aW9uU3RyXVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSB7fVxuICAgIGNvbnN0IGV2ZW50ID0gdW5kZWZpbmVkXG4gICAgY29uc3QgZGVsYXlTdHJlYW0gPSAoKSA9PiB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KGRlbGF5U3RyZWFtLCAwKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsTGlmZWN5Y2xlIGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFNweW5lQ2hhbm5lbExpZmVjeWNsZVxuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIEludGVybmFsIENoYW5uZWwgdGhhdCBwdWJsaXNoZXMgcmVuZGVyaW5nIGFuZCBkaXNwb3NpbmcgZXZlbnRzIG9mIGFsbCBWaWV3U3RyZWFtcyB3aG9zZSBwcm9wZXJ0eSwgcHJvcGVyLnNlbmRMaWZlY3ljbGVFdmVudHMgaXMgc2V0IHRvIHRydWUuXG4gICAqXG4gICAqIDxoMz5UaGUgdHdvIGFjdGlvbnMgdGhhdCBhcmUgcmVnc2l0ZXJlZCBmb3IgdGhpcyBjaGFubmVsIGFyZTo8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5DSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVDwvbGk+XG4gICAqIDxsaT5DSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVDwvbGk+XG4gICAqICA8L3VsPlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfTElGRUNZQ0xFJztcbiAgICovXG5cbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKCdDSEFOTkVMX0xJRkVDWUNMRScsIHByb3BzKVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9MSUZFQ1lDTEVfRElTUE9TRURfRVZFTlQnXG4gICAgXVxuICB9XG5cbiAgb25WaWV3U3RyZWFtSW5mbyhvYmopIHtcbiAgICBjb25zdCB7IGFjdGlvbiwgc3JjRWxlbWVudCB9ID0gb2JqXG4gICAgY29uc3QgcGF5bG9hZCA9IHNyY0VsZW1lbnRcbiAgICBwYXlsb2FkLmFjdGlvbiA9IGFjdGlvblxuICAgIHRoaXMub25TZW5kRXZlbnQoYWN0aW9uLCBwYXlsb2FkKVxuICB9XG5cbiAgb25TZW5kRXZlbnQoYWN0aW9uU3RyLCBwYXlsb2FkID0ge30pIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zW2FjdGlvblN0cl1cbiAgICBjb25zdCBzcmNFbGVtZW50ID0ge31cbiAgICBjb25zdCBldmVudCA9IHVuZGVmaW5lZFxuICAgIGNvbnN0IGRlbGF5U3RyZWFtID0gKCkgPT4gdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICB3aW5kb3cuc2V0VGltZW91dChkZWxheVN0cmVhbSwgMClcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwgfSBmcm9tICcuLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybC5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGUgfSBmcm9tICcuLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuaW1wb3J0IHtcbiAgcGljayxcbiAgZmluZCxcbiAgb21pdCxcbiAgb3ZlcixcbiAgbWVyZ2VSaWdodCxcbiAgaXMsXG4gIG9iak9mLFxuICBtZXJnZUFsbCxcbiAgcGF0aCxcbiAga2V5cyxcbiAgcHJvcCxcbiAgZXF1YWxzLFxuICBoZWFkLFxuICBjb21wb3NlLFxuICBsZW5zUHJvcCxcbiAgY2hhaW4sXG4gIHBpY2tBbGwsXG4gIGRlZmF1bHRUbyxcbiAgaXNFbXB0eSxcbiAgY29uY2F0LFxuICB3aGVuLFxuICBjb21wbGVtZW50LFxuICByZXZlcnNlLFxuICBjdXJyeU4sXG4gIF9fLFxuICB0ZXN0LFxuICByZXBsYWNlLFxuICB0b1BhaXJzLFxuICByZWR1Y2VcbiAgLCBmaWx0ZXIgYXMgcmFtZGFGaWx0ZXIsIG1lcmdlUmlnaHQgYXMgck1lcmdlXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsUm91dGUgZXh0ZW5kcyBDaGFubmVsIHtcbiAgY29uc3RydWN0b3IobmFtZSA9ICdDSEFOTkVMX1JPVVRFJywgcHJvcHMgPSB7fSkge1xuICAgIC8qKlxuICAgICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsUm91dGVcbiAgICAgKiBAdHlwZSBjb3JlXG4gICAgICpcbiAgICAgKiBAZGVzY1xuICAgICAqXG4gICAgICogPHA+VGhlIFNweW5lQ2hhbm5lbFJvdXRlIGhhcyB0aGUgdHdvIG1haW4gZHV0aWVzOlxuICAgICAqICA8dWw+XG4gICAgICogICA8bGk+Q29tYmluZSBkYXRhIHdpdGggdGhlIGN1cnJlbnQgd2luZG93IGxvY2F0aW9uIHRvIHVwZGF0ZSB0aGUgbG9jYXRpb24ncyBwYXRobmFtZS48L2xpPlxuICAgICAqICAgPGxpPkxpc3RlbiB0byB3aW5kb3cgbG9jYXRpb24gY2hhbmdlcyB0byB0cmFuc2xhdGUgdGhlIGxvY2F0aW9uIHBhdGhuYW1lIGludG8gYSBzZXJpZXMgb2YgbW9kZWwgcHJvcGVydGllcy48L2xpPlxuICAgICAqIDwvdWw+XG4gICAgICogPHA+SW4gYm90aCBjYXNlcywgdGhpcyBjaGFubmVsIHNlbmRzIGEgQ2hhbm5lbFBheWxvYWQgY29udGFpbmluZyB1cGRhdGVkIHJvdXRlIHByb3BlcnRpZXMuPC9wPlxuICAgICAqXG4gICAgICogPGgzPlRoZSB0d28gYWN0aW9ucyB0aGF0IGFyZSByZWdzaXRlcmVkIGZvciB0aGUgUm91dGUgY2hhbm5lbCBhcmU6PC9oMz5cbiAgICAgKiA8dWw+XG4gICAgICogPGxpPkNIQU5ORUxfUk9VVEVfREVFUExJTktfRVZFTlQ8L2xpPlxuICAgICAqIDxsaT5DSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVDwvbGk+XG4gICAgICogIDwvdWw+XG4gICAgICpcbiAgICAgKiAgICA8aDM+VGhlIFJvdXRlcyBDb25maWd1cmF0aW9uIE9iamVjdDwvaDM+XG4gICAgICogICAgPHA+VGhyIHJvdXRlcyBjb25maWd1cmF0aW9uIG9iamVjdCBpcyB1c2VkIHRvIG1hcCB0aGUgbG9jYXRpb24gc3RyaW5nIHRvIGFuZCBmcm9tIGEgcm91dGUgbW9kZWwuPC9wPlxuICAgICAqXG4gICAgICogICAgIDxwcmU+ICAgICAgICAgICB7XG4gICAgICogICAgICAgICAgICAgICAgcm91dGVQYXRoOiB7XG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU5hbWU6ICdsZXZlbE9uZVByb3AnLFxuICAgICAqICAgICAgICAgICAgICAgICAgcm91dGVPcHRpb24xOiAnYnJhbmNoaW5nLWVuZHMtaGVyZScsXG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU9wdGlvbjI6IHtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHJvdXRlUGF0aDoge1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZU5hbWU6ICdsZXZlbFR3b1Byb3AnLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MZXZlbDI6ICdsZXZlbC0yLWJyYW5jaC1lbmRzLWhlcmUnXG4gICAgICpcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgKiAgICAgICAgICAgICAgICB9XG4gICAgICogICAgICAgICAgICB9XG4gICAgICpcbiAgICAgKiAgICAgICAgICA8L3ByZT5cbiAgICAgKiAgICAgPHA+VGhpcyBjb25maWcgb2JqZWN0IGNvbnNpc3RzIG9mIG5lc3RlZCByb3V0ZVBhdGggb2JqZWN0cyB0aGF0IGNvcnJlc3BvbmRzIHRvIGFsbCBvZiB0aGUgYnJhbmNoaW5nIHBvc3NpYmxpdGllcyBmb3IgdGhlIGFwcC48L3A+XG4gICAgICogICAgPHA+VGhlIHJvdXRlTmFtZSB2YWx1ZSBpcyB0aGUgcHJvcGVydHkgbmFtZSBmb3IgZWFjaCByb3V0ZVBhdGguPC9wPlxuICAgICAqICAgIDxoMz5Sb3V0ZSBPcHRpb25zPC9oMz5cbiAgICAgKiAgICA8cD5BIHJvdXRlUGF0aCBtYXkgY29udGFpbiBzZXZlcmFsIHJvdXRlIG9wdGlvbiBrZXktdmFsdWUgcGFpcnMsIHdoaWNoIGlzIHVzZWQgdG8gbWFwIGJldHdlZW4gZGF0YSBhbmQgdGhlIHdpbmRvdyBsb2NhdGlvbi48L3A+XG4gICAgICogICAgPHVsIGNsYXNzPSdiYXNpYyc+XG4gICAgICogICAgICA8bGk+XG4gICAgICogICAgICAgICA8aDUgY2xhc3M9J2Jhc2ljJz5UaGUgUm91dGUgT3B0aW9uIEtleSAob3IgbGVmdCB2YWx1ZSk8L2g1PlxuICAgICAqICAgICAgICAgPHVsIGNsYXNzPSdkZWNpbWFsJz5cbiAgICAgKiAgICAgICAgIDxsaT5NYXBzIHRoZSB3aW5kb3cgbG9jYXRpb24gdG8gcm91dGUgZGF0YSBwcm9wZXJ0aWVzPC9saT5cbiAgICAgKiAgICAgICAgIDxsaT5UaGlzIGNoYW5uZWwgY2FuICdmaWxsIGluIHRoZSBibGFua3MnIHNvIHRoYXQgb25seSB0aGUgdXBkYXRlZCBsZXZlbCByb3V0ZU5hbWVzIGFyZSByZXF1aXJlZCB0byByZXZpc2UgdGhlIHdpbmRvdyBsb2NhdGlvbjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkNhbiBiZSBhIHJlZ2V4IHBhdHRlcm4gc28gdGhhdCBtdWx0aXBsZSBkYXRhIHByb3BlcnRpZXMgY2FuIHNoYXJlIHRoZSBzYW1lIGJyYW5jaGluZyBsb2dpYzwvbGk+XG4gICAgICogICAgICAgICAgPC91bD5cbiAgICAgKiAgICAgIDwvbGk+XG4gICAgICpcbiAgICAgKiAgICAgIDxsaT5cbiAgICAgKiAgICAgICAgICAgPGg1IGNsYXNzPSdiYXNpYyc+VGhlIFJvdXRlIE9wdGlvbiBWYWx1ZSAob3IgcmlnaHQgdmFsdWUpPC9oNT5cbiAgICAgKiAgICAgICAgICAgPHVsIGNsYXNzPSdkZWNpbWFsJz5cbiAgICAgKiAgICAgICAgICAgPGxpPk1hcHMgZGF0YSBwcm9wZXJ0aWVzIHRvIHBhcnQgb2YgYSB3aW5kb3cgbG9jYXRpb248L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5EZXRlcm1pbmVzIHRoZSBzdHJpbmcgdmFsdWUgZm9yIGl0cyBsZXZlbCBvZiB0aGUgd2luZG93IGxvY2F0aW9uPC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+VGhlIHZhbHVlIGNhbiBiZSBhIHJlZ2V4IHBhdHRlcm4gc28gdGhhdCBtdWx0aXBsZSBsb2NhdGlvbnMgY2FuIG1hcCB0byBzYW1lIHJvdXRlRGF0YSBwcm9wZXJ0eTwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkJyYW5jaGluZyBlbmRzIGZvciB0aGUgcm91dGUgb3B0aW9uIHdoZW4gdGhpcyB2YWx1ZSBpcyBhIGVpdGhlciBhIFN0cmluZyBvciBhIHJlZ2V4IHBhdHRlcm48L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5CcmFuY2hpbmcgY29udGludWVzIGZvciB0aGUgcm91dGUgb3B0aW9uIHdoZW4gdGhpcyB2YWx1ZSBpcyBhIG5lc3RlZCByb3V0ZVBhdGggb2JqZWN0PC9saT5cbiAgICAgKiAgICAgICAgICA8L3VsPlxuICAgICAqICAgICAgPC9saT5cbiAgICAgKiAgICAgIDwvdWw+XG4gICAgICpcbiAgICAgKiAgICAgIDxoMz5FbmhhbmNpbmcgVGhlIEFwcCdzIFJvdXRpbmcgTG9naWM8L2gzPlxuICAgICAqICAgICAgPHA+VGhlIGJlc3QgcHJhY3RpY2UgZm9yIGEgU3B5bmUgQXBwIGlzIHRvIGhhdmUgb25lIGNvbXBvbmVudCwgYSBjdXN0b20gY2hhbm5lbCwgbGlzdGVuIHRvIHRoZSBTcHluZVJvdXRlQ2hhbm5lbC4gQWxsIG90aGVyIGNvbXBvbmVudHMgd2lsbCB0aGVuIGxpc3RlbiB0byB0aGUgY3VzdG9tIHJvdXRlIGNoYW5uZWwuIFRoaXMgYWxsb3dzIHRoZSBjdXN0b20gcm91dGUgY2hhbm5lbCB0byBlbmhhbmNlIHJvdXRpbmcgbG9naWMgd2l0aCBtb3JlIGRhdGEgYW5kIGN1c3RvbSBhY3Rpb25zLjwvcD5cbiAgICAgKiAgICAgIDxwPllvdSBjYW4gc2VlIHRoaXMgY3VzdG9tIHJvdXRpbmcgY2hhbm5lbCBpbiBhY3Rpb24gaW4gdGhlIFNweW5lIFN0YXJ0ZXIgQXBwPC9wPlxuICAgICAqXG4gICAgICogICAgICA8aDQgY2xhc3M9J2Jhc2ljJz5FeGFtaW5pbmcgdGhpcyBTaXRlJ3MgUm91dGUgQ29uZmlndXJhdGlvbjwvaDQ+XG4gICAgICogICAgICA8YXJ0aWNsZSBjbGFzcz0nY29kZS1leGFtcGxlJyBpZD0ncm91dGVzLWNvbmZpZy1leGFtcGxlJz48L2FydGljbGU+XG4gICAgICogICAgICA8cD5Zb3UgY2FuIHNlZSB0aGlzIHNpdGUgcm91dGluZyBpbiBhY3Rpb24gYnkgb3BlbmluZyB1cCB0aGUgY29uc29sZSdzIHJvdXRlcyBwYW5lbDwvcD5cbiAgICAgKiAgICAgIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUnIGRhdGEtdHlwZT1cImNvbnNvbGVcIiBkYXRhLXZhbHVlPVwib3BlblwiIGRhdGEtY2hhbm5lbC10eXBlPVwicm91dGVcIj5DTElDSyBUTyBPUEVOIFJPVVRFIFBBTkVMPC9kaXY+XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFW1wiPGg0PkJpbmRpbmcgVUkgRUxlbWVudHMgdG8gdGhlIFJvdXRlIENoYW5uZWw8L2g0PlwiXVxuICAgICAqIC8vIFRoaXMgYWxzbyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byBvdmVycmlkZSB0aGUgUm91dGVPcHRpb24gdmFsdWUgKHVzZWZ1bCB3aGVuIHRoZSB2YWx1ZSBpcyBhIHJlZ2V4IHBhdHRlcm4pXG4gICAgICogPGRpdiBjbGFzcz0nYnRuJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiIGRhdGEtcGFnZS1pZD0naG9tZScgZGF0YS1wYWdlLWlkLXZhbHVlPScnPkhPTUU8L2Rpdj5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbXCI8aDQ+VXBkYXRpbmcgdGhlIFJvdXRlIENoYW5uZWwgdXNpbmcgVmlld1N0cmVhbSZyc3F1bztzIHNlbmRJbmZvVG9DaGFubmVsPC9oND5cIl1cbiAgICAgKiBjb25zdCBkYXRhVXBkYXRlT2JqID0ge3BhZ2VJZDonZ3VpZGUnLCBzZWN0aW9uOidyZWZlcmVuY2UnLCBtZW51SXRlbTonc3B5bmUtcm91dGUtY2hhbm5lbCd9O1xuICAgICAqIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoXCJDSEFOTkVMX1JPVVRFXCIsIGRhdGFVcGRhdGVPYmopO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVtcIjxoND5VcGRhdGluZyB0aGUgUm91dGUgQ2hhbm5lbCB1c2luZyBDaGFubmVsJnJzcXVvO3Mgc2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbDwvaDQ+XCJdXG4gICAgICogY29uc3QgZGF0YVVwZGF0ZU9iaiA9IHtwYWdlSWQ6J2d1aWRlJywgc2VjdGlvbjoncmVmZXJlbmNlJywgbWVudUl0ZW06J3NweW5lLXJvdXRlLWNoYW5uZWwnfTtcbiAgICAgKiB0aGlzLnNlbmRQYXlsb2FkVG9Sb3V0ZUNoYW5uZWwoZGF0YVVwZGF0ZU9iaik7XG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGNvbmZpZy50eXBlIC0gPSAnc2xhc2gnOyBUaGlzIHByb3BlcnR5IGRldGVybWluZXMgdGhlIHVybCBzdHJ1Y3R1cmUgYnkgY29uZm9ybWluZyB0aGUgd2luZG93IHBhdGhuYW1lIHRvIGVpdGhlciB0aGUgc2xhc2gsIHF1ZXJ5IG9yIGhhc2ggZm9ybWF0cy5cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnLnJvdXRlcyAtID0ge3JvdXRlUGF0aDoge3JvdXRlTmFtZTonY2hhbmdlJ307IFRoaXMgbmVzdGVkIE9iamVjdCBpcyB1c2VkIHRvIGNvbnRydWN0IHRoZSB3aW5kb3cgcGF0aG5hbWUgYW5kIHRvIGV4cHJlc3MgdGhlIHdpbmRvdyBsb2NhdGlvbiBhcyBtb2RlbCB2YXJpYWJsZXMuXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfUk9VVEUnO1xuICAgICAqXG4gICAgICovXG4gICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0cnVlXG4gICAgc3VwZXIoJ0NIQU5ORUxfUk9VVEUnLCBwcm9wcylcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKClcbiAgICB0aGlzLnJvdXRlQ29uZmlnSnNvbiA9IHRoaXMuZ2V0Um91dGVDb25maWcoKVxuICAgIHRoaXMuYmluZFN0YXRpY01ldGhvZHMoKVxuICAgIHRoaXMubmF2VG9TdHJlYW0kID0gbmV3IFJlcGxheVN1YmplY3QoMSlcbiAgICB0aGlzLm9ic2VydmVyJCA9IHRoaXMubmF2VG9TdHJlYW0kLnBpcGUobWFwKGluZm8gPT4gdGhpcy5vbk1hcE5leHQoaW5mbykpKVxuICAgIHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNvbXBhcmVSb3V0ZUtleXdvcmRzKClcbiAgfVxuXG4gIGNoZWNrQ29uZmlnRm9ySGFzaCgpIHtcbiAgICAvLyBMRUdBQ1kgQ0hFQ0sgVE8gU0lNUExJRlkgQ09ORklHIEZPUiBIQVNIO1xuICAgIGNvbnN0IGlzSGFzaFR5cGUgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLnR5cGUgPT09ICdoYXNoJ1xuICAgIGlmIChpc0hhc2hUeXBlID09PSB0cnVlKSB7XG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLnR5cGUgPSAnc2xhc2gnXG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLmlzSGFzaCA9IHRydWVcbiAgICB9XG4gIH1cblxuICBvblJlZ2lzdGVyZWQoKSB7XG4gICAgdGhpcy5jaGVja0NvbmZpZ0Zvckhhc2goKVxuICAgIHRoaXMuaW5pdFN0cmVhbSgpXG4gIH1cblxuICBjcmVhdGVDaGFubmVsQWN0aW9uc09iaigpIHtcbiAgICBjb25zdCBhcnIgPSB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zKClcbiAgICBjb25zdCBjb252ZXJ0ZXIgPSBzdHIgPT4gb2JqT2Yoc3RyLCBzdHIpXG4gICAgY29uc3Qgb2JqID0gbWVyZ2VBbGwoY2hhaW4oY29udmVydGVyLCBhcnIpKVxuICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBvYmpcbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfUk9VVEVfQ09ORklHX1VQREFURURfRVZFTlQnLFxuICAgICAgWydDSEFOTkVMX1JPVVRFX1VQREFURV9DT05GSUdfRVZFTlQnLCAndXBkYXRlUm91dGVDb25maWcnXVxuICAgIF1cbiAgfVxuXG4gIHVwZGF0ZVJvdXRlQ29uZmlnKGUpIHtcbiAgICBjb25zdCBuZXdSb3V0ZXNPYmogID0gcGljayhbJ2lzSGFzaCcsICdpc0hpZGRlbicsICdyb3V0ZXMnLCAndHlwZSddLCBlLnBheWxvYWQpXG5cbiAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFID0gbWVyZ2VSaWdodChTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLCBuZXdSb3V0ZXNPYmopXG5cbiAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZm9ybVJvdXRlQ29uZmlnKClcblxuICAgIGNvbnN0IHJvdXRlQ29uZmlnID0gdGhpcy5nZXRSb3V0ZUNvbmZpZygpXG4gICAgY29uc3QgYWN0aW9uID0gJ0NIQU5ORUxfUk9VVEVfQ09ORklHX1VQREFURURfRVZFTlQnXG5cbiAgICAvLyByZXZlcnNlIGJlY2F1c2Ugcm91dGVEYXRhc2V0c0FyciB0dXJucyBvdXQgdGhhdCB3YXlcbiAgICByb3V0ZUNvbmZpZy5uYXZMaW5rcyA9IFsuLi5yb3V0ZUNvbmZpZz8ucm91dGVEYXRhc2V0c0Fycl1cblxuICAgIHRoaXMucm91dGVDb25maWdKc29uID0gcm91dGVDb25maWdcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKVxuXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCByb3V0ZUNvbmZpZywge30sIHt9LCB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIGdldFJvdXRlQ29uZmlnKCkge1xuICAgIGNvbnN0IHNweW5lQ29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZ1xuICAgIGNvbnN0IHJvdXRlQ29uZmlnID0gcGF0aChbJ2NoYW5uZWxzJywgJ1JPVVRFJ10sIHNweW5lQ29uZmlnKVxuICAgIGlmIChyb3V0ZUNvbmZpZy50eXBlID09PSAncXVlcnknKSB7XG4gICAgICByb3V0ZUNvbmZpZy5pc0hhc2ggPSBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IGFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuZmxhdHRlbkNvbmZpZ09iamVjdChyb3V0ZUNvbmZpZy5yb3V0ZXMpXG4gICAgcm91dGVDb25maWcucGFyYW1zQXJyID0gYXJyXG4gICAgcmV0dXJuIHJvdXRlQ29uZmlnXG4gIH1cblxuICBpbml0U3RyZWFtKCkge1xuICAgIHRoaXMuZmlyc3RMb2FkU3RyZWFtJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpXG4gICAgdGhpcy5vbkluY29taW5nRG9tRXZlbnQodW5kZWZpbmVkLCB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgJycgKyAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcpXG5cbiAgICBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNyZWF0ZVBvcFN0YXRlU3RyZWFtKHRoaXMub25JbmNvbWluZ0RvbUV2ZW50LmJpbmQodGhpcykpXG5cbiAgICB0aGlzLm9ic2VydmVyJCA9IG1lcmdlKHRoaXMuZmlyc3RMb2FkU3RyZWFtJCxcbiAgICAgIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgb25NYXBOZXh0KGRhdGEsIGZpcnN0TG9hZGVkID0gZmFsc2UpIHtcbiAgICBkYXRhLmFjdGlvbiA9ICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCdcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgc3RhdGljIHJlbW92ZVNTSUQocGF5bG9hZCkge1xuICAgIGNvbnN0IHJvdXRlTGVucyA9IGxlbnNQcm9wKFsncm91dGVEYXRhJ10pXG4gICAgY29uc3Qgb21pdFNTSUQgPSBvdmVyKHJvdXRlTGVucywgb21pdChbJ3ZzaWQnXSkpXG4gICAgcmV0dXJuIG9taXRTU0lEKHBheWxvYWQpXG4gIH1cblxuICBzdGF0aWMgb25JbmNvbWluZ0RvbUV2ZW50KGV2dCwgY29uZmlnID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIGFjdG4pIHtcbiAgICBjb25zdCBhY3Rpb24gPSBhY3RuICE9PSB1bmRlZmluZWRcbiAgICAgID8gYWN0blxuICAgICAgOiB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UXG5cbiAgICAvLyBDSEVDSyBJRiBUSElTIElTIEEgSElTVE9SWSBFVkVOVCBCWSBVU0lORyBUSEUgcm91dGVDb3VudCBQUk9QRVJUWVxuICAgIGNvbnN0IGV2ZW50Q291bnQgPSBwYXRoKFsnc3RhdGUnLCAncm91dGVDb3VudCddLCBldnQpXG4gICAgY29uc3QgaXNIaXN0b3J5Q291bnQgPSBpcyhOdW1iZXIsIGV2ZW50Q291bnQpID09PSB0cnVlXG4gICAgbGV0IHBheWxvYWQgPSB0aGlzLmdldERhdGFGcm9tU3RyaW5nKGNvbmZpZywgaXNIaXN0b3J5Q291bnQpXG4gICAgaWYgKGlzSGlzdG9yeUNvdW50ID09PSB0cnVlKSB7XG4gICAgICBwYXlsb2FkLnJvdXRlQ291bnQgPSBldmVudENvdW50XG4gICAgfVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGlmIChhY3RuID09PSAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcpIHtcbiAgICAgIHBheWxvYWQubmF2TGlua3MgPSBwcm9wKCdyb3V0ZURhdGFzZXRzQXJyJywgY29uZmlnKVxuICAgICAgLy8gcGF5bG9hZC5saW5rc0RhdGEgPSBwYXlsb2FkLm5hdkxpbmtzXG4gICAgICAvLyBTcHluZUFwcFByb3BlcnRpZXMubGlua3NEYXRhID0gcGF5bG9hZC5uYXZMaW5rc1xuXG4gICAgICAvLyBkZWZpbmUgYW4gYWxpYXMgcHJvcGVydHkgdXNpbmcgT2JqZWN0LmRlZmluZVByb3BlcnR5XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGF5bG9hZCwgJ2xpbmtzRGF0YScsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIC8vIGNvbnNvbGUud2FybignZ2V0IGxpbmtzIGRhdGEgaXMgZGVwcmVjYXRlZCBpbiBST1VURSBERUVQTElOSyBEQVRBLCB1c2UgbmF2TGlua3MnKVxuICAgICAgICAgIHJldHVybiB0aGlzLm5hdkxpbmtzXG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgIGNvbnNvbGUud2Fybignc2V0IGxpbmtzIGRhdGEgaXMgZGVwcmVjYXRlZCBpbiBST1VURSBERUVQTElOSyBEQVRBLCB1c2UgbmF2TGlua3MnKVxuXG4gICAgICAgICAgLy8gdGhpcy5uYXZMaW5rcyA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBrZXl3b3JkQXJycyA9IHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMuY29tcGFyZShwYXlsb2FkLnJvdXRlRGF0YSwgcGF5bG9hZC5wYXRocylcbiAgICBwYXlsb2FkID0gck1lcmdlKHBheWxvYWQsIGtleXdvcmRBcnJzKVxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgdW5kZWZpbmVkLCBldnQsIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUm91dGVQYXJhbXNPdmVycmlkZXMocGF5bG9hZCkge1xuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JFdmVudE1ldGhvZHMob2JzKSB7XG4gICAgY29uc3QgcmUgPSAvXihldmVudCkoW0EtWl0uKikoW0EtWl0uKikkL2dtXG4gICAgY29uc3QgZ2V0TWV0aG9kcyA9IGNvbXBvc2UocmFtZGFGaWx0ZXIodGVzdChyZSkpLCBrZXlzLCBwcm9wKCdwYXlsb2FkJykpXG4gICAgY29uc3QgbWV0aG9kc0FyciA9IGdldE1ldGhvZHMob2JzKVxuICAgIGlmIChtZXRob2RzQXJyLmxlbmd0aCA+PSAxKSB7XG4gICAgICBjb25zdCBldnQgPSBwcm9wKCdldmVudCcsIG9icylcbiAgICAgIGlmIChldnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtZXRob2RVcGRhdGUgPSAobWF0Y2gsIHAxLCBwMiwgcDMsIHA0KSA9PiBTdHJpbmcocDIpLnRvTG93ZXJDYXNlKCkgKyBwMyArIHA0XG4gICAgICAgIGNvbnN0IG1ldGhvZFN0clJlcGxhY2UgPSByZXBsYWNlKC9eKGV2ZW50KShbQS1aXSkoLiopKFtBLVpdLiopJC9nbSwgbWV0aG9kVXBkYXRlKVxuICAgICAgICBjb25zdCBydW5NZXRob2QgPSAobWV0aG9kU3RyKSA9PiB7XG4gICAgICAgICAgY29uc3QgbSA9IG1ldGhvZFN0clJlcGxhY2UobWV0aG9kU3RyKVxuICAgICAgICAgIGlmIChldnRbbV0gIT09IHVuZGVmaW5lZCkgeyBldnRbbV0oKSB9XG4gICAgICAgIH1cbiAgICAgICAgbWV0aG9kc0Fyci5mb3JFYWNoKHJ1bk1ldGhvZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JzXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JFbmRSb3V0ZShwbCwgcm91dGVDb25maWdKc29uID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIGRlYnVnQm9vbCkge1xuICAgIGNvbnN0IGVuZFJvdXRlID0gY29tcG9zZShlcXVhbHMoJ3RydWUnKSwgcGF0aChbJ3BheWxvYWQnLCAnZW5kUm91dGUnXSkpKHBsKVxuXG4gICAgaWYgKGVuZFJvdXRlICE9PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcGxcbiAgICB9XG4gICAgY29uc3QgZGVidWcgPSBkZWJ1Z0Jvb2wgIT09IHVuZGVmaW5lZCA/IGRlYnVnQm9vbCA6IFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZVxuICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gcGxcblxuICAgIGNvbnN0IGdldFByb3BWYWwgPSAocm91dGVQYXRoKSA9PiB7XG4gICAgICBjb25zdCByb3V0ZU5hbWUgPSBwcm9wKCdyb3V0ZU5hbWUnLCByb3V0ZVBhdGgpXG4gICAgICBpZiAocm91dGVOYW1lKSB7XG4gICAgICAgIGNvbnN0IGtleXNBcnIgPSBjb21wb3NlKGtleXMsIG9taXQoWydyb3V0ZU5hbWUnXSkpKHJvdXRlUGF0aClcbiAgICAgICAgY29uc3Qgcm91dGVOYW1lVmFsID0gcGF5bG9hZFtyb3V0ZU5hbWVdXG4gICAgICAgIGNvbnN0IHByZWQgPSBhcnJTdHIgPT4gbmV3IFJlZ0V4cChgXiR7YXJyU3RyfSRgKS50ZXN0KHJvdXRlTmFtZVZhbClcbiAgICAgICAgY29uc3Qgcm91dGVWYWwgPSBmaW5kKHByZWQsIGtleXNBcnIpXG4gICAgICAgIHJldHVybiByb3V0ZVZhbFxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBpdGVyID0gMFxuICAgIGNvbnN0IG9uUmVkdWNlUm91dGVQYXRocyA9IChhY2MgPSBbXSwgYXJyKSA9PiB7XG4gICAgICAvLyBjb25zdCBba2V5LCB2YWxdID0gYXJyXG4gICAgICBjb25zdCB2YWwgPSBhcnJbMV1cbiAgICAgIGNvbnN0IHsgcm91dGVQYXRoIH0gPSB2YWxcbiAgICAgIGNvbnN0IHJvdXRlTmFtZSA9IHByb3AoJ3JvdXRlTmFtZScsIHJvdXRlUGF0aClcbiAgICAgIGNvbnN0IHJvdXRlTmFtZVZhbCA9IGdldFByb3BWYWwocm91dGVQYXRoKVxuICAgICAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QsIHZhbClcbiAgICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXksIHZhbClcbiAgICAgIGNvbnN0IGl0ZXJPYmogPSBpc09iaiA9PT0gdHJ1ZSAmJiBpc0FyciA9PT0gZmFsc2VcbiAgICAgIGl0ZXIgPSBpdGVyICsgMVxuICAgICAgaWYgKGl0ZXJPYmopIHtcbiAgICAgICAgY29uc3QgbmV4dFJvdXRlUGF0aCA9IHJvdXRlUGF0aFtyb3V0ZU5hbWVWYWxdXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdrZXkgaXMgJyx7aXRlcixhY2Msa2V5LCByb3V0ZU5hbWUsIHJvdXRlTmFtZVZhbCwgaXRlck9iaiwgbmV4dFJvdXRlUGF0aH0pO1xuICAgICAgICBpZiAobmV4dFJvdXRlUGF0aCkge1xuICAgICAgICAgIGNvbXBvc2UocmV2ZXJzZSwgcmVkdWNlKG9uUmVkdWNlUm91dGVQYXRocywgYWNjKSwgdG9QYWlycykoeyBuZXh0Um91dGVQYXRoIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJLRVkgSVMgXCIse2l0ZXIsa2V5LCByb3V0ZU5hbWUsIHJvdXRlTmFtZVZhbH0pXG4gICAgICAgICAgaWYgKGl0ZXIgPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHVzZSBvZiBlbmQgcm91dGUgbWV0aG9kIHNob3VsZCBhZGQgc3RhcnQgcm91dGUgdmFsdWUgb2YgXCIke3JvdXRlTmFtZX1cIi5gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2MucHVzaChyb3V0ZU5hbWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjXG4gICAgfVxuXG4gICAgY29uc3QgeyByb3V0ZXMgfSA9IHJvdXRlQ29uZmlnSnNvblxuXG4gICAgY29uc3QgZW5kUm91dGVWYWxBcnIgPSBjb21wb3NlKHJldmVyc2UsIHJlZHVjZShvblJlZHVjZVJvdXRlUGF0aHMsIFtdKSwgdG9QYWlycykoeyByb3V0ZXMgfSlcbiAgICAvLyBjb25zb2xlLmxvZygnZW5kIHJvdXRlIHZhbCBhcnIgJyxlbmRSb3V0ZVZhbEFycik7XG4gICAgaWYgKGVuZFJvdXRlVmFsQXJyLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZW5kUm91dGVWYWwgPSBlbmRSb3V0ZVZhbEFyclswXVxuICAgICAgcGwucGF5bG9hZFtlbmRSb3V0ZVZhbF0gPSAnJ1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB0aGUgZW5kIHJvdXRlIHBhcmFtIGRpZCBub3QgeWllbGQgYW55IHJlc3VsdHMgZm9yICR7SlNPTi5zdHJpbmdpZnkocGF5bG9hZCl9IGApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwbFxuICB9XG5cbiAgb25WaWV3U3RyZWFtSW5mbyhwbCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHBsLmFjdGlvbiA/PyB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UXG5cbiAgICBmdW5jdGlvbiBkb21TdHJpbmdNYXBUb09iamVjdChkb21TdHJpbmdNYXApIHtcbiAgICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBkb21TdHJpbmdNYXApIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXTigJlzIGEgZGlyZWN0IHByb3BlcnR5ICh0aG91Z2ggZGF0YXNldCByYXJlbHkgaGFzIGFueXRoaW5nIG9uIHRoZSBwcm90b3R5cGUpOlxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvbVN0cmluZ01hcCwga2V5KSkge1xuICAgICAgICAgIG9ialtrZXldID0gZG9tU3RyaW5nTWFwW2tleV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialxuICAgIH1cblxuICAgIGlmIChwbD8uc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpIHtcbiAgICAgIHBsLnBheWxvYWQgPSBkb21TdHJpbmdNYXBUb09iamVjdChwbD8uc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpID8/IHBsLnBheWxvYWRcbiAgICB9XG5cbiAgICAvLyBjb25zb2xlLmxvZygnUk9VVEUgQ0hBTk5FTCBWU0kgJywgeyBwbCB9KVxuXG4gICAgU3B5bmVDaGFubmVsUm91dGUuY2hlY2tGb3JFdmVudE1ldGhvZHMocGwpXG4gICAgcGwgPSB0aGlzLmNoZWNrRm9yRW5kUm91dGUocGwpXG4gICAgbGV0IHBheWxvYWQgPSB0aGlzLmdldERhdGFGcm9tUGFyYW1zKHBsKVxuXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IHByb3AoJ3NyY0VsZW1lbnQnLCBwbClcbiAgICBjb25zdCBldmVudCA9IHByb3AoJ2V2ZW50JywgcGwpXG4gICAgY29uc3QgY2hhbmdlTG9jYXRpb25Cb29sID0gIXBheWxvYWQuaXNIaWRkZW5cbiAgICBjb25zdCBrZXl3b3JkQXJycyA9IHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMuY29tcGFyZShwYXlsb2FkLnJvdXRlRGF0YSwgcGF5bG9hZC5wYXRocylcblxuICAgIHBheWxvYWQgPSByTWVyZ2UocGF5bG9hZCwga2V5d29yZEFycnMpXG4gICAgdGhpcy5zZW5kUm91dGVTdHJlYW0ocGF5bG9hZCwgY2hhbmdlTG9jYXRpb25Cb29sKVxuXG4gICAgcGF5bG9hZCA9IFNweW5lQ2hhbm5lbFJvdXRlLnJlbW92ZVNTSUQocGF5bG9hZClcblxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQsXG4gICAgICB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0FuZENvbnZlcnRTdHJXaXRoUmVnZXhUb2tlbnMocm91dGVWYWx1ZSwgcmVnZXhUb2tlbk9iaikge1xuICAgIGNvbnN0IHRva2VuS2V5c0FyciA9IGtleXMocmVnZXhUb2tlbk9iailcblxuICAgIHJldHVybiB0b2tlbktleXNBcnJcbiAgfVxuXG4gIHNlbmRSb3V0ZVN0cmVhbShwYXlsb2FkLCBjaGFuZ2VXaW5kb3dMb2MgPSB0cnVlKSB7XG4gICAgaWYgKGNoYW5nZVdpbmRvd0xvYyA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zZXRXaW5kb3dMb2NhdGlvbihwYXlsb2FkKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZVN0YXRlKCkge1xuICAgIHJldHVybiAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnXG4gIH1cblxuICBzdGF0aWMgZ2V0SXNEZWVwTGlua0Jvb2woaXNIaXN0b3J5KSB7XG4gICAgcmV0dXJuIGlzSGlzdG9yeSA9PT0gZmFsc2UgJiYgdGhpcy5fcm91dGVDb3VudCA9PT0gMFxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlQ291bnQoaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5fcm91dGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9yb3V0ZUNvdW50ID0gMFxuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlQ291bnRcbiAgICB9XG4gICAgaWYgKGlzSGlzdG9yeSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3JvdXRlQ291bnQgKz0gMVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcm91dGVDb3VudFxuICB9XG5cbiAgc3RhdGljIGdldEV4dHJhUGF5bG9hZFBhcmFtcyhjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBjb25zdCByb3V0ZUNvdW50ID0gdGhpcy5nZXRSb3V0ZUNvdW50KGlzSGlzdG9yeSlcbiAgICBjb25zdCBpc0RlZXBMaW5rID0gdGhpcy5nZXRJc0RlZXBMaW5rQm9vbChpc0hpc3RvcnkpXG4gICAgY29uc3QgaXNIYXNoID0gY29uZmlnLmlzSGFzaFxuICAgIGNvbnN0IGlzSGlkZGVuID0gY29uZmlnLmlzSGlkZGVuXG4gICAgY29uc3Qgcm91dGVUeXBlID0gY29uZmlnLnR5cGVcbiAgICByZXR1cm4geyByb3V0ZUNvdW50LCBpc0RlZXBMaW5rLCBpc0hhc2gsIGlzSGlzdG9yeSwgaXNIaWRkZW4sIHJvdXRlVHlwZSB9XG4gIH1cblxuICBzdGF0aWMgZ2V0RGF0YUZyb21QYXJhbXMocGwsIGNvbmZpZyA9IHRoaXMucm91dGVDb25maWdKc29uKSB7XG4gICAgbGV0IHJvdXRlRGF0YSA9IHByb3AoJ3BheWxvYWQnLCBwbClcblxuICAgIGNvbnN0IHJvdXRlVmFsdWUgPSB0aGlzLmdldFJvdXRlU3RyRnJvbVBhcmFtcyhyb3V0ZURhdGEsIGNvbmZpZylcblxuICAgIC8vIFdJTkRPVyBMT0NBVElPTiBIQVNOJ1QgQkVFTiBDSEFOR0VEIFlFVCwgU08gV0lMTCBHRVQgU1RSIFBBUkFNU1xuICAgIGNvbnN0IGdldFByb3BGcm9tQ29uZmlnID0gKHBycCwgZGVmYWx0KSA9PiBkZWZhdWx0VG8oZGVmYWx0LCBwcm9wKHBycCwgY29uZmlnKSlcbiAgICBjb25zdCB0eXBlRm9yU3RyID0gZ2V0UHJvcEZyb21Db25maWcoJ3R5cGUnLCAnc2xhc2gnKVxuICAgIGNvbnN0IGlzSGFzaEZvclN0ciA9IGdldFByb3BGcm9tQ29uZmlnKCdpc0hhc2gnLCBmYWxzZSlcbiAgICBjb25zdCBuZXh0V2luZG93TG9jID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5mb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uKHJvdXRlVmFsdWUpXG4gICAgY29uc3QgZGF0YUZyb21TdHIgPSB0aGlzLmdldERhdGFGcm9tTG9jYXRpb25TdHIodHlwZUZvclN0ciwgaXNIYXNoRm9yU3RyLCBuZXh0V2luZG93TG9jKVxuXG4gICAgY29uc3QgeyBwYXRoSW5uZXJtb3N0LCBwYXRocyB9ID0gZGF0YUZyb21TdHJcblxuICAgIHJvdXRlRGF0YSA9IHJNZXJnZShkYXRhRnJvbVN0ci5yb3V0ZURhdGEsIHJvdXRlRGF0YSlcblxuICAgIGNvbnN0IHsgcm91dGVDb3VudCwgaXNEZWVwTGluaywgaXNIYXNoLCBpc0hpc3RvcnksIGlzSGlkZGVuLCByb3V0ZVR5cGUgfSA9IHRoaXMuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zKFxuICAgICAgY29uZmlnKVxuICAgIHJldHVybiB7XG4gICAgICBpc0RlZXBMaW5rLFxuICAgICAgcm91dGVDb3VudCxcbiAgICAgIHBhdGhJbm5lcm1vc3QsXG4gICAgICBwYXRocyxcbiAgICAgIHJvdXRlRGF0YSxcbiAgICAgIHJvdXRlVmFsdWUsXG4gICAgICBpc0hhc2gsXG4gICAgICBpc0hpZGRlbixcbiAgICAgIGlzSGlzdG9yeSxcbiAgICAgIHJvdXRlVHlwZVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXREYXRhRnJvbVN0cmluZyhjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBjb25zdCB0eXBlID0gY29uZmlnLnR5cGVcbiAgICBjb25zdCBoYXNoSXNUcnVlID0gY29uZmlnLmlzSGFzaCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHN0ciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuZ2V0TG9jYXRpb25TdHJCeVR5cGUodHlwZSwgaGFzaElzVHJ1ZSlcbiAgICBjb25zdCB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfSA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldFBhcmFtc0Zyb21Sb3V0ZVN0cihcbiAgICAgIHN0ciwgY29uZmlnLCB0eXBlKVxuICAgIGNvbnN0IHsgcm91dGVDb3VudCwgaXNEZWVwTGluaywgaXNIYXNoLCByb3V0ZVR5cGUsIGlzSGlkZGVuIH0gPSB0aGlzLmdldEV4dHJhUGF5bG9hZFBhcmFtcyhcbiAgICAgIGNvbmZpZywgaXNIaXN0b3J5KVxuXG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgaXNEZWVwTGluayxcbiAgICAgIHJvdXRlQ291bnQsXG4gICAgICBwYXRoSW5uZXJtb3N0LFxuICAgICAgcGF0aHMsXG4gICAgICByb3V0ZURhdGEsXG4gICAgICByb3V0ZVZhbHVlLFxuICAgICAgaXNIYXNoLFxuICAgICAgaXNIaWRkZW4sXG4gICAgICBpc0hpc3RvcnksXG4gICAgICByb3V0ZVR5cGVcbiAgICB9XG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgc3RhdGljIGdldERhdGFGcm9tTG9jYXRpb25TdHIodCA9ICdzbGFzaCcsIGlzSGFzaCA9IHRoaXMucm91dGVDb25maWdKc29uLmlzSGFzaCwgbG9jID0gd2luZG93LmxvY2F0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMucm91dGVDb25maWdKc29uICE9PSB1bmRlZmluZWRcbiAgICAgID8gdGhpcy5yb3V0ZUNvbmZpZ0pzb24udHlwZVxuICAgICAgOiB0XG5cbiAgICBjb25zdCBzdHIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmdldExvY2F0aW9uU3RyQnlUeXBlKHR5cGUsIGlzSGFzaCwgbG9jKVxuICAgIGNvbnN0IHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9ID0gdGhpcy5nZXRQYXJhbXNGcm9tUm91dGVTdHIoXG4gICAgICBzdHIsIHRoaXMucm91dGVDb25maWdKc29uLCB0eXBlKVxuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuZ2V0Um91dGVTdGF0ZSgpXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSwgYWN0aW9uIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvbkRhdGEoKSB7XG4gICAgY29uc3QgbG9jYXRpb25QYXJhbXNBcnIgPSBbXG4gICAgICAnaHJlZicsXG4gICAgICAnb3JpZ2luJyxcbiAgICAgICdwcm90b2NvbCcsXG4gICAgICAnaG9zdCcsXG4gICAgICAnaG9zdG5hbWUnLFxuICAgICAgJ3BvcnQnLFxuICAgICAgJ3BhdGhuYW1lJyxcbiAgICAgICdzZWFyY2gnLFxuICAgICAgJ2hhc2gnXVxuICAgIHJldHVybiBwaWNrQWxsKGxvY2F0aW9uUGFyYW1zQXJyLCB3aW5kb3cubG9jYXRpb24pXG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVTdHJGcm9tUGFyYW1zKHBhcmFtc0RhdGEsIHJvdXRlQ29uZmlnLCB0KSB7XG4gICAgY29uc3QgdHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByb3V0ZUNvbmZpZy50eXBlXG4gICAgY29uc3Qgb2JqID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jb252ZXJ0UGFyYW1zVG9Sb3V0ZShwYXJhbXNEYXRhLCByb3V0ZUNvbmZpZywgdHlwZSlcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBzdGF0aWMgZ2V0UGFyYW1zRnJvbVJvdXRlU3RyKHN0ciwgcm91dGVDb25maWcsIHQpIHtcbiAgICBjb25zdCB0eXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHJvdXRlQ29uZmlnLnR5cGVcbiAgICBjb25zdCBvYmogPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRSb3V0ZVRvUGFyYW1zKHN0ciwgcm91dGVDb25maWcsIHR5cGUpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgY2hlY2tFbXB0eVJvdXRlU3RyKHN0ciwgaXNIYXNoID0gZmFsc2UpIHtcbiAgICBjb25zdCBpc0VtcHR5Qm9vbCA9IGlzRW1wdHkoc3RyKVxuICAgIGNvbnN0IHBhdGhOYW1lSXNFbXB0eUJvb2wgPSBpc0VtcHR5Qm9vbCA9PT0gdHJ1ZSAmJiBpc0hhc2ggPT09IGZhbHNlXG4gICAgY29uc3QgaGFzaE5hbWVJc0VtcHR5Qm9vbCA9IGlzRW1wdHlCb29sID09PSB0cnVlICYmIGlzSGFzaCA9PT0gdHJ1ZVxuICAgIGNvbnN0IGhhc2hOYW1lQm9vbCA9IGlzRW1wdHlCb29sID09PSBmYWxzZSAmJiBpc0hhc2ggPT09IHRydWVcblxuICAgIGlmIChwYXRoTmFtZUlzRW1wdHlCb29sID09PSB0cnVlIHx8IGhhc2hOYW1lSXNFbXB0eUJvb2wgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiAnLydcbiAgICB9IGVsc2UgaWYgKGhhc2hOYW1lQm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGNvbmNhdCgnIycsIHN0cilcbiAgICB9XG4gICAgcmV0dXJuIHN0clxuICB9XG5cbiAgc3RhdGljIHJlbW92ZUxhc3RTbGFzaChzdHIpIHtcbiAgICBjb25zdCByZSA9IC9eKC4qKShcXC8pJC9cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UocmUsICckMScpXG4gIH1cblxuICBzZXRXaW5kb3dMb2NhdGlvbihjaGFubmVsUGF5bG9hZCkge1xuICAgIGxldCB7IGlzSGFzaCwgcm91dGVWYWx1ZSwgcm91dGVUeXBlIH0gPSBjaGFubmVsUGF5bG9hZFxuICAgIHJvdXRlVmFsdWUgPSB0aGlzLmNoZWNrRW1wdHlSb3V0ZVN0cihyb3V0ZVZhbHVlLCBpc0hhc2gpXG4gICAgY29uc3QgeyByb3V0ZUNvdW50IH0gPSBjaGFubmVsUGF5bG9hZFxuICAgIGlmIChpc0hhc2ggPT09IHRydWUgfHwgcm91dGVUeXBlID09PSAncXVlcnknKSB7XG4gICAgICBjb25zdCBwYXRoTmFtZSA9IFNweW5lQ2hhbm5lbFJvdXRlLnJlbW92ZUxhc3RTbGFzaCh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpXG4gICAgICByb3V0ZVZhbHVlID0gcGF0aE5hbWUgKyByb3V0ZVZhbHVlXG4gICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoeyByb3V0ZUNvdW50IH0sICcnLCByb3V0ZVZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjaGVja0ZvclNsYXNoID0gd2hlbihcbiAgICAgICAgY29tcG9zZShjb21wbGVtZW50KGVxdWFscygnLycpKSwgaGVhZCksIGNvbmNhdCgnLycsIF9fKSlcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7IHJvdXRlQ291bnQgfSwgJycsIGNoZWNrRm9yU2xhc2gocm91dGVWYWx1ZSkpXG4gICAgfVxuICB9XG5cbiAgZ2V0V2luZG93TG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSAvLyBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgod2luZG93LmxvY2F0aW9uLmhhc2gpO1xuICB9XG5cbiAgYmluZFN0YXRpY01ldGhvZHMoKSB7XG4gICAgdGhpcy5jaGVja0ZvckVuZFJvdXRlID0gU3B5bmVDaGFubmVsUm91dGUuY2hlY2tGb3JFbmRSb3V0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRJc0RlZXBMaW5rQm9vbCA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldElzRGVlcExpbmtCb29sLmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tTG9jYXRpb25TdHIgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXREYXRhRnJvbUxvY2F0aW9uU3RyLmJpbmQoXG4gICAgICB0aGlzKVxuICAgIHRoaXMub25JbmNvbWluZ0RvbUV2ZW50ID0gU3B5bmVDaGFubmVsUm91dGUub25JbmNvbWluZ0RvbUV2ZW50LmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tU3RyaW5nID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0RGF0YUZyb21TdHJpbmcuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyLmJpbmQodGhpcylcbiAgICB0aGlzLmdldExvY2F0aW9uRGF0YSA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldExvY2F0aW9uRGF0YS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRSb3V0ZVN0YXRlID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0Um91dGVTdGF0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXREYXRhRnJvbVBhcmFtcyA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldERhdGFGcm9tUGFyYW1zLmJpbmQodGhpcylcbiAgICB0aGlzLmdldFJvdXRlQ291bnQgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRSb3V0ZUNvdW50LmJpbmQodGhpcylcbiAgICB0aGlzLmdldEV4dHJhUGF5bG9hZFBhcmFtcyA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldEV4dHJhUGF5bG9hZFBhcmFtcy5iaW5kKHRoaXMpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kc1dpdGhDb25maWdEYXRhKClcbiAgfVxuXG4gIGJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKSB7XG4gICAgY29uc3QgY3VycmllZEdldFJvdXRlID0gY3VycnlOKDMsIFNweW5lQ2hhbm5lbFJvdXRlLmdldFJvdXRlU3RyRnJvbVBhcmFtcylcbiAgICB0aGlzLmdldFJvdXRlU3RyRnJvbVBhcmFtcyA9IGN1cnJpZWRHZXRSb3V0ZShfXywgdGhpcy5yb3V0ZUNvbmZpZ0pzb24sXG4gICAgICB0aGlzLnJvdXRlQ29uZmlnSnNvbi50eXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGVxdWFscywgcGF0aCwgY29tcG9zZSwgcHJvcCwgZmlsdGVyLCByZXBsYWNlLCBsZW5zUHJvcCwgb3Zlciwgb21pdCwgdGVzdCwga2V5cywgZWl0aGVyLCB0b1VwcGVyIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBzYW5pdGl6ZUV2ZW50VGFyZ2V0IH0gZnJvbSAnLi4vdXRpbHMvc2FuaXRpemUtZGF0YS5qcydcblxuZXhwb3J0IGNsYXNzIFNweW5lQ2hhbm5lbFVJIGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFNweW5lQ2hhbm5lbFVJXG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+VGhpcyBDaGFubmVsIGxpc3RlbnMgdG8gYWxsIFVzZXIgRXZlbnRzIHRoYXQgaGF2ZSBiZWVuIHNldCB0byBicm9hZGNhc3QgYnkgVmlld1N0cmVhbSBpbnN0YW5jZXMsIHVzaW5nIHRoZSBicm9hZENhc3RFdmVudHMgbWV0aG9kLjwvcD5cbiAgICogPHA+SFRNTCBFbGVtZW50cyB0aGF0IGhhdmUgdGhlaXIgZGF0YSBjaGFubmVsIHByb3BlcnR5IHNldCB0byBcIlJPVVRFXCIgd2lsbCBicm9hZGNhc3QgdGhlaXIgdWkgZXZlbnQgdG8gdGhhdCBjaGFubmVsIGluc3RlYWQuPC9wPlxuICAgKiA8ZGl2IGNsYXNzPSdidG4gYnRuLWJsdWUtcmVmIGJ0bi1jb25zb2xlIG1vZGFsLWJ0bicgIGRhdGEtdHlwZT0nbW9kYWwtd2luZG93JyBkYXRhLXZhbHVlPSd1aUV2ZW50cyc+VmlldyBVSSBFdmVudHM8L2Rpdj48L2JyPjwvYnI+XG4gICAqIDxwPlNlZSBMSU5LWydWaWV3U3RyZWFtJywgJ3ZpZXctc3RyZWFtJ10gZm9yIGFuIGV4YW1wbGUgb24gaG93IHRvIGJpbmQgSFRNTCBFbGVtZW50cyB0byB0aGUgVUkgQ2hhbm5lbC48L3A+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9VSSc7XG4gICAqXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUgPSAnQ0hBTk5FTF9VSScsIHByb3BzID0ge30pIHtcbiAgICBwcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IGZhbHNlXG4gICAgc3VwZXIobmFtZSwgcHJvcHMpXG4gICAgdGhpcy5rZXlFdmVudHNMb2FkZWQgPSBmYWxzZVxuICAgIHRoaXMua2V5Q29kZUFyciA9IFtdXG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ0NIQU5ORUxfVUlfRE9NQ09OVEVOVExPQURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BQk9SVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BQ1RJVkFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BRERUUkFDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BRlRFUlBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FGVEVSU0NSSVBURVhFQ1VURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BTklNQVRJT05DQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTklURVJBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BTklNQVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BUFBJTlNUQUxMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQVVESU9FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQVVESU9TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BVVhDTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CRUZPUkVJTlBVVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CRUZPUkVQUklOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CRUZPUkVVTkxPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVHSU5FVkVOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CTE9DS0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JMVVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQk9VTkRBUllfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQlVGRkVSRURBTU9VTlRMT1dfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NBTlBMQVlfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0FOUExBWVRIUk9VR0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NMT1NFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NMT1NJTkdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09NUExFVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09NUE9TSVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09NUE9TSVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT01QT1NJVElPTlVQREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT05ORUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTk5FQ1RJT05TVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT05URU5UREVMRVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTlRFWFRNRU5VX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPUFlfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ1VFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NVVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EQVRBQ0hBTk5FTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EQkxDTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9ERVZJQ0VDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREVWSUNFTU9USU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RFVklDRU9SSUVOVEFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHRU5URVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR0xFQVZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUk9QX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RVUkFUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VNUFRJRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VOREVWRU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VOREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VOVEVSUElDVFVSRUlOUElDVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GT0NVU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GT0NVU0lOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZPQ1VTT1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZPUk1EQVRBX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZVTExTQ1JFRU5DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRlVMTFNDUkVFTkVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dBTUVQQURDT05ORUNURURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0FNRVBBRERJU0NPTk5FQ1RFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HQVRIRVJJTkdTVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HRVNUVVJFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dFU1RVUkVFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0VTVFVSRVNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dPVFBPSU5URVJDQVBUVVJFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0hBU0hDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFQ0FORElEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lDRUNBTkRJREFURUVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lDRUNPTk5FQ1RJT05TVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VHQVRIRVJJTkdTVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JTlBVVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JTlBVVFNPVVJDRVNDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5TVEFMTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JTlZBTElEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0tFWURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfS0VZVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTEFOR1VBR0VDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTEVBVkVQSUNUVVJFSU5QSUNUVVJFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BREVEREFUQV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FERURNRVRBREFUQV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FERU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT1NUUE9JTlRFUkNBUFRVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTUFSS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NRVJDSEFOVFZBTElEQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTUVTU0FHRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NRVNTQUdFRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFRU5URVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRU1PVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTVVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9ORUdPVElBVElPTk5FRURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9OT01BVENIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX05PVElGSUNBVElPTkNMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX09GRkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfT05MSU5FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX09QRU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfT1JJRU5UQVRJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUEFHRUhJREVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUEFHRVNIT1dfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUEFTVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUEFVU0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUEFZRVJERVRBSUxDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUEFZTUVOVE1FVEhPRENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QTEFZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BMQVlJTkdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkNBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSRU5URVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkxFQVZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJMT0NLQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJMT0NLRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUk1PVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUk9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVST1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9QU1RBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUFJPR1JFU1NfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUFVTSF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QVVNIU1VCU0NSSVBUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVBRFlTVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRUpFQ1RJT05IQU5ETEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFTU9WRVRSQUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFTU9WRVNUUkVBTV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVBFQVRFVkVOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNFVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNJWkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTT1VSQ0VUSU1JTkdCVUZGRVJGVUxMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU1VMVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNVTUVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0NST0xMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFQVJDSF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUVLRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VFS0lOR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNURURDQU5ESURBVEVQQUlSQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVEVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNUU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0hJUFBJTkdBRERSRVNTQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NISVBQSU5HT1BUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NJR05BTElOR1NUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NMT1RDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU09VTkRFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU09VTkRTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUEVFQ0hFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1BFRUNIU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1FVRUVaRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUVVFRVpFRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NRVUVFWkVTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVEFMTEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NUT1JBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1VCTUlUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NVQ0NFU1NfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1VTUEVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9USU1FT1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RJTUVVUERBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9HR0xFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPTkVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9VQ0hDQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9VQ0hFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9VQ0hNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNIU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBTlNJVElPTkNBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05SVU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBTlNJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1VOSEFORExFRFJFSkVDVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VTkxPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVU5NVVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1VQR1JBREVORUVERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVkVSU0lPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WSVNJQklMSVRZQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZPSUNFU0NIQU5HRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVk9MVU1FQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWUFDVElWQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWUJMVVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZQ09OTkVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlERUFDVElWQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWURJU0NPTk5FQ1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZRk9DVVNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZUE9JTlRFUlJFU1RSSUNURURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZUE9JTlRFUlVOUkVTVFJJQ1RFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlQUkVTRU5UQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dBSVRJTkdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCR0xDT05URVhUQ1JFQVRJT05FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJHTENPTlRFWFRMT1NUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQkdMQ09OVEVYVFJFU1RPUkVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQktJVE1PVVNFRk9SQ0VDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQktJVE1PVVNFRk9SQ0VET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQktJVE1PVVNFRk9SQ0VVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFV0lMTEJFR0lOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dIRUVMX0VWRU5UJ1xuICAgIF1cbiAgfVxuXG4gIGxvYWRLZXlTdHJlYW0oKSB7XG4gICAgY29uc3Qga2V5VXBzID0gT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdrZXl1cCcpXG4gICAgY29uc3QgZmlsdGVyS2V5cyA9IGUgPT4gdGhpcy5rZXlDb2RlQXJyLmluZGV4T2YoZS5rZXlDb2RlKSA+PSAwXG4gICAgdGhpcy5rZXlQcmVzc2VzJCA9IGtleVVwcy5ncm91cEJ5KGUgPT4gZS5rZXlDb2RlKVxuICAgICAgLm1lcmdlQWxsKClcbiAgICAgIC5maWx0ZXIoZmlsdGVyS2V5cylcbiAgICAgIC5yZXBlYXQoKVxuICAgICAgLnN1YnNjcmliZSh0aGlzLm9uS2V5UHJlc3NlZC5iaW5kKHRoaXMpKVxuICB9XG5cbiAgYWRkS2V5RXZlbnQobnVtKSB7XG4gICAgaWYgKHRoaXMua2V5RXZlbnRzTG9hZGVkID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2FkS2V5U3RyZWFtKClcbiAgICB9XG4gICAgdGhpcy5rZXlFdmVudHNMb2FkZWQgPSB0cnVlXG4gICAgdGhpcy5yZWdpc3RlcktleShudW0pXG4gIH1cblxuICByZWdpc3RlcktleShjKSB7XG4gICAgdGhpcy5rZXlDb2RlQXJyLnB1c2goYylcbiAgfVxuXG4gIG9uS2V5UHJlc3NlZChldnQpIHtcbiAgICAvLyBjb25zb2xlLmxvZygna2V5IGlzICcsIGV2dCk7XG4gIH1cblxuICBzdGF0aWMgcmVtb3ZlU1NJRChwbCkge1xuICAgIGNvbnN0IHJvdXRlTGVucyA9IGxlbnNQcm9wKFsncGF5bG9hZCddKVxuICAgIGNvbnN0IG9taXRTU0lEID0gb3Zlcihyb3V0ZUxlbnMsIG9taXQoWyd2c2lkJ10pKVxuICAgIHJldHVybiBvbWl0U1NJRChwbClcbiAgfVxuXG4gIG9uSW5jb21pbmdPYnNlcnZhYmxlKG9iaikge1xuICAgIGNvbnN0IGVxc05hbWUgPSBlcXVhbHMob2JqLm5hbWUsIHRoaXMucHJvcHMubmFtZSlcbiAgICBvYmouZGF0YSA9IFNweW5lQ2hhbm5lbFVJLnJlbW92ZVNTSUQob2JqLmRhdGEpXG4gICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50IH0gPSBvYmouZGF0YVxuICAgIGNvbnN0IGRhdGFPYmogPSBvYnNWYWwgPT4gKHsgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQ6IG9ic1ZhbCB9KVxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChvYmopID0+IG9iai5vYnNlcnZhYmxlLnBpcGUobWFwKGRhdGFPYmopKVxuICAgICAgLnN1YnNjcmliZSh0aGlzLm9uVUlFdmVudC5iaW5kKHRoaXMpKVxuICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7fVxuICAgIHJldHVybiBlcXNOYW1lID09PSB0cnVlID8gb25TdWNjZXNzKG9iaikgOiBvbkVycm9yKClcbiAgfVxuXG4gIGdldEFjdGlvblN0YXRlKHZhbCkge1xuICAgIGNvbnN0IHR5cGVWYWwgPSBwYXRoKFsnZXZlbnQnLCAndHlwZSddKVxuICAgIGNvbnN0IHR5cGVPdmVyUmlkZVZhbCA9IHBhdGgoWydldmVudCcsICd0eXBlT3ZlclJpZGUnXSlcbiAgICBjb25zdCBldmVudFR5cGUgPSBjb21wb3NlKHRvVXBwZXIsIGVpdGhlcih0eXBlT3ZlclJpZGVWYWwsIHR5cGVWYWwpKVxuICAgIGNvbnN0IHR5cGUgPSBldmVudFR5cGUodmFsKVxuICAgIGNvbnN0IG1haW5BY3Rpb24gPSAnQ0hBTk5FTF9VSSdcbiAgICByZXR1cm4gdHlwZSAhPT0gdW5kZWZpbmVkID8gYCR7bWFpbkFjdGlvbn1fJHt0eXBlfV9FVkVOVGAgOiBtYWluQWN0aW9uXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JFdmVudE1ldGhvZHMob2JzKSB7XG4gICAgY29uc3QgcmUgPSAvXihldmVudCkoW0EtWl0uKikoW0EtWl0uKikkL2dtXG4gICAgY29uc3QgZ2V0TWV0aG9kcyA9IGNvbXBvc2UoZmlsdGVyKHRlc3QocmUpKSwga2V5cywgcHJvcCgncGF5bG9hZCcpKVxuICAgIGNvbnN0IG1ldGhvZHNBcnIgPSBnZXRNZXRob2RzKG9icylcbiAgICBpZiAobWV0aG9kc0Fyci5sZW5ndGggPj0gMSkge1xuICAgICAgY29uc3QgZXZ0ID0gcHJvcCgnZXZlbnQnLCBvYnMpXG4gICAgICBpZiAoZXZ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kVXBkYXRlID0gKG1hdGNoLCBwMSwgcDIsIHAzLCBwNCkgPT4gU3RyaW5nKHAyKS50b0xvd2VyQ2FzZSgpICsgcDMgKyBwNFxuICAgICAgICBjb25zdCBtZXRob2RTdHJSZXBsYWNlID0gcmVwbGFjZSgvXihldmVudCkoW0EtWl0pKC4qKShbQS1aXS4qKSQvZ20sIG1ldGhvZFVwZGF0ZSlcbiAgICAgICAgY29uc3QgcnVuTWV0aG9kID0gKG1ldGhvZFN0cikgPT4ge1xuICAgICAgICAgIGNvbnN0IG0gPSBtZXRob2RTdHJSZXBsYWNlKG1ldGhvZFN0cilcbiAgICAgICAgICBpZiAoZXZ0W21dICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIChldnRbbV0pID09PSAnZnVuY3Rpb24nKSB7IGV2dFttXSgpIH1cbiAgICAgICAgfVxuICAgICAgICBtZXRob2RzQXJyLmZvckVhY2gocnVuTWV0aG9kKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYnNcbiAgfVxuXG4gIG9uVUlFdmVudChvYnMpIHtcbiAgICBmdW5jdGlvbiBkb21TdHJpbmdNYXBUb09iamVjdChkb21TdHJpbmdNYXApIHtcbiAgICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBkb21TdHJpbmdNYXApIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXTigJlzIGEgZGlyZWN0IHByb3BlcnR5ICh0aG91Z2ggZGF0YXNldCByYXJlbHkgaGFzIGFueXRoaW5nIG9uIHRoZSBwcm90b3R5cGUpOlxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvbVN0cmluZ01hcCwga2V5KSkge1xuICAgICAgICAgIG9ialtrZXldID0gZG9tU3RyaW5nTWFwW2tleV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialxuICAgIH1cblxuICAgIG9icy5wYXlsb2FkID0gZG9tU3RyaW5nTWFwVG9PYmplY3Qob2JzPy5zcmNFbGVtZW50Py5lbD8uZGF0YXNldCkgPz8gb2JzLnBheWxvYWRcblxuICAgIFNweW5lQ2hhbm5lbFVJLmNoZWNrRm9yRXZlbnRNZXRob2RzKG9icylcbiAgICBvYnMuYWN0aW9uID0gdGhpcy5nZXRBY3Rpb25TdGF0ZShvYnMpXG4gICAgY29uc3QgYWN0aW9uID0gb2JzLmFjdGlvbi8vIHRoaXMuZ2V0QWN0aW9uU3RhdGUob2JzKTtcbiAgICAvLyBjb25zdCB7IHNyY0VsZW1lbnQgfSA9IG9ic1xuICAgIGNvbnN0IHsgcGF5bG9hZCwgc3JjRWxlbWVudCB9ID0gb2JzXG5cbiAgICBjb25zdCBldmVudCA9IG9icy5ldmVudFxuICAgIHNhbml0aXplRXZlbnRUYXJnZXQoZXZlbnQ/LnRhcmdldClcbiAgICAvLyBjb25zdCBwYXlsb2FkID0gZG9tU3RyaW5nTWFwVG9PYmplY3Qoc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpID8/IG9icy5wYXlsb2FkXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcbmltcG9ydCB7IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgfSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsV2luZG93IH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC13aW5kb3cuanMnXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAsIGRlYm91bmNlVGltZSwgc2tpcFdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBjdXJyeSwgcGljaywgcGFydGlhbFJpZ2h0LCBtYXBPYmpJbmRleGVkLCBhcHBseSwgbWFwIGFzIHJNYXAgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4uL3V0aWxzL2RlZXAtbWVyZ2UuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxXaW5kb3cgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsV2luZG93XG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGRlc2NcbiAgICogVGhlIFdpbmRvdyBDaGFubmVsIHdpbGwgbGlzdGVuIHRvIHdpbmRvdyBhbmQgZG9jdW1lbnQgZXZlbnRzIHRoYXQgYXJlIHNldCBpbiBpdHMgY29uZmlndXJhdGlvbiBmaWxlXG4gICAqIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUgbW9kYWwtYnRuJyAgZGF0YS10eXBlPSdtb2RhbC13aW5kb3cnIGRhdGEtdmFsdWU9J3dpbmRvd0V2ZW50cyc+VmlldyBXaW5kb3cgRXZlbnRzPC9kaXY+PC9icj48L2JyPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IENIQU5ORUxfTkFNRVxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcgLSA9IHt9OyBUaGUgY29uZmlnIGhhcyBzZXZlcmFsIG9wdGlvbnMgdXNlZCB0byBsaXN0ZW4gdG8gd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IGNvbmZpZy5ldmVudHMgLSA9IFtdOyBBbnkgd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMgY2FuIGJlIGFkZGVkIGhlcmUuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcubWVkaWFRdWVyaWVzIC0gPSB7fTsgTWVkaWEgcXVlcmllcyBhcmUgYWRkZWQgYXMga2V5LHZhbHVlIHBhaXJzOyB0aGUga2V5IGlzIHRoZSBuYW1lIG9mIHRoZSBib29sZWFuIGZvciB0aGUgcXVlcnksIHRoZSB2YWx1ZSBpcyB0aGUgcXVlcnkgaXRzZWxmLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5saXN0ZW5Gb3JSZXNpemUgLSA9IHRydWU7IFRoaXMgaXMgZGVmYXVsdCBsaXN0ZW5pbmcgZm9yIHJlc2l6ZSBldmVudC5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcubGlzdGVuRm9yT3JpZW50YXRpb24gLSA9IHRydWU7IExpc3RlbiBmb3IgaG9yaXpvbnRhbCBhbmQgbGFuZHNjYXBlIG9yaWVudGF0aW9uIGNoYW5nZXMgb24gbW9iaWxlIGRldmljZXMuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29uZmlnLmxpc3RlbkZvck1vdXNlV2hlZWwgLSA9IGZhbHNlOyBJZiBzZXQgdG8gdHJ1ZSwgd2lsbCBsaXN0ZW4gZm9yIG1vdXNlV2hlZWwgYW5kIHdpbGwgYWRkIGRpcmVjdGlvbiBhbmQgZGlzdGFuY2UgcGFyYW1ldGVycy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JSZXNpemUgLSA9IDIwMDsgVGhlIHRpbWUgYmV0d2VlbiByZXNpemUgZXZlbnRzIGluIG1pbGxpc2Vjb25kcy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGwgLSA9IDE1MDsgVGhlIHRpbWUgYmV0d2VlbiBzY3JvbGwgZXZlbnRzIGluIG1pbGxpc2Vjb25kcy5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfV0lORE9XJztcbiAgICpcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKENIQU5ORUxfTkFNRSA9ICdDSEFOTkVMX1dJTkRPVycpIHtcbiAgICBzdXBlcihDSEFOTkVMX05BTUUpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kcygpXG4gICAgdGhpcy5jdXJyZW50U2Nyb2xsWSA9IDBcbiAgfVxuXG4gIGluaXRpYWxpemVTdHJlYW0oKSB7XG4gICAgdGhpcy5kb21DaGFubmVsQ29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5jaGFubmVscy5XSU5ET1dcbiAgICBjb25zdCBvYnMkQXJyID0gdGhpcy5nZXRBY3RpdmVPYnNlcnZhYmxlcygpXG4gICAgY29uc3QgZG9tJCA9IG1lcmdlKC4uLm9icyRBcnIpXG4gICAgdGhpcy5kb20kID0gZG9tJFxuICAgIGRvbSQuc3Vic2NyaWJlKHAgPT4ge1xuICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBwXG4gICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgZ2V0TW91c2VXaGVlbE1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19XSEVFTF9FVkVOVFxuICAgIGNvbnN0IHNjcm9sbERpciA9IGV2ZW50LmRlbHRhWSA8PSAwID8gJ3VwJyA6ICdkb3duJ1xuICAgIGNvbnN0IHsgZGVsdGFYLCBkZWx0YVksIGRlbHRhWiB9ID0gZXZlbnRcbiAgICBjb25zdCBwYXlsb2FkID0geyBzY3JvbGxEaXIsIGRlbHRhWCwgZGVsdGFZLCBkZWx0YVogfVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQ3VycmllZEdlbmVyaWNFdmVudChhY3Rpb25TdHIpIHtcbiAgICBjb25zdCBhY3Rpb24gPSBgQ0hBTk5FTF9XSU5ET1dfJHthY3Rpb25TdHIudG9VcHBlckNhc2UoKX1fRVZFTlRgXG4gICAgY29uc3QgY3VycnlGbiA9IGN1cnJ5KFNweW5lQ2hhbm5lbFdpbmRvdy5tYXBHZW5lcmljRXZlbnQpXG4gICAgcmV0dXJuIGN1cnJ5Rm4oYWN0aW9uKVxuICB9XG5cbiAgc3RhdGljIG1hcEdlbmVyaWNFdmVudChhY3RuLCBldmVudCkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwibWFwIGdlbmVyaWMgZXZlbnQgXCIsYWN0bik7XG4gICAgY29uc3QgYWN0aW9uID0gYWN0blxuICAgIGNvbnN0IHBheWxvYWQgPSBldmVudFxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgZ2V0UmVzaXplTWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX1JFU0laRV9FVkVOVFxuICAgIGNvbnN0IHBheWxvYWQgPSBwaWNrKFxuICAgICAgWydpbm5lcldpZHRoJywgJ2lubmVySGVpZ2h0JywgJ291dGVyV2lkdGgnLCAnb3V0ZXJIZWlnaHQnXSwgd2luZG93KVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgZ2V0T3JpZW50YXRpb25NYXBGbihldmVudCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9XSU5ET1dfT1JJRU5UQVRJT05fRVZFTlRcbiAgICBjb25zdCBvcmllbnRhdGlvblN0ciA9ICcob3JpZW50YXRpb246IHBvcnRyYWl0KSdcbiAgICBjb25zdCBpc1BvcnRyYWl0Qm9vbCA9IHdpbmRvdy5tYXRjaE1lZGlhKG9yaWVudGF0aW9uU3RyKS5tYXRjaGVzXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soXG4gICAgICBbJ2lubmVyV2lkdGgnLCAnaW5uZXJIZWlnaHQnLCAnb3V0ZXJXaWR0aCcsICdvdXRlckhlaWdodCddLCB3aW5kb3cpXG4gICAgcGF5bG9hZC5vcmllbnRhdGlvbiA9IGlzUG9ydHJhaXRCb29sID09PSB0cnVlXG4gICAgICA/ICdwb3J0cmFpdCdcbiAgICAgIDogJ2xhbmRzY2FwZSdcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICB9XG5cbiAgZ2V0TWVkaWFRdWVyeU1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19NRURJQV9RVUVSWV9FVkVOVFxuICAgIGNvbnN0IHBheWxvYWQgPSBwaWNrKFsnbWF0Y2hlcycsICdtZWRpYScsICdtZWRpYVF1ZXJ5TmFtZSddLCBldmVudClcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICB9XG5cbiAgY3JlYXRlTW91c2VXaGVlbE9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgY29uc3QgZGVib3VuY2VUID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsXG5cbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgnd2hlZWwnLFxuICAgICAgU3B5bmVDaGFubmVsV2luZG93LmdldE1vdXNlV2hlZWxNYXBGbi5iaW5kKHRoaXMpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZShkZWJvdW5jZVQpXG4gICAgICApXG4gIH1cblxuICBzdGF0aWMgZ2V0U2Nyb2xsRGF0YSgpIHtcbiAgICBsZXQgY3VycmVudFNjcm9sbFkgPSAwXG5cbiAgICBjb25zdCBnZXRTY3JvbGxEYXRhID0gKHNjcm9sbFkpID0+IHtcbiAgICAgIGNvbnN0IHNjcm9sbERpc3RhbmNlID0gY3VycmVudFNjcm9sbFkgLSBzY3JvbGxZXG4gICAgICBjb25zdCBzY3JvbGxEaXIgPSBzY3JvbGxEaXN0YW5jZSA+PSAwID8gJ3VwJyA6ICdkb3duJ1xuICAgICAgY3VycmVudFNjcm9sbFkgPSBzY3JvbGxZXG4gICAgICByZXR1cm4geyBzY3JvbGxZLCBzY3JvbGxEaXN0YW5jZSwgc2Nyb2xsRGlyIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFNjcm9sbERhdGFcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxZKHNjcm9sbEVsZW1lbnQpIHtcbiAgICByZXR1cm4gc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldCAhPT0gdW5kZWZpbmVkID8gc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldCA6IHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wXG4gIH1cblxuICBzdGF0aWMgZ2V0U2Nyb2xsTWFwRm4oZXZlbnQsIGludGVydmFsLCBhY3Rpb24sIHNjcm9sbERhdGFGbiwgc2Nyb2xsRWxlbWVudCkge1xuICAgIGNvbnN0IHNjcm9sbFkgPSBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0U2Nyb2xsWShzY3JvbGxFbGVtZW50KVxuICAgIGNvbnN0IHBheWxvYWQgPSBzY3JvbGxEYXRhRm4oc2Nyb2xsWSlcbiAgICBjb25zdCB7IHNjcm9sbERpc3RhbmNlIH0gPSBwYXlsb2FkXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIHNjcm9sbERpc3RhbmNlLCBldmVudCB9XG4gIH1cblxuICBjcmVhdGVTY3JvbGxPYnNlcnZhYmxlKGNvbmZpZywgc2Nyb2xsRWxlbWVudCA9IHdpbmRvdywgaXNQYXNzaXZlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHNraXBXaGVuRGlySXNNaXNzaW5nID0gZXZ0ID0+IGV2dC5zY3JvbGxEaXN0YW5jZSA9PT0gMFxuICAgIGNvbnN0IGRUaW1lID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsXG5cbiAgICBjb25zdCBlbGVtZW50ID0gc2Nyb2xsRWxlbWVudFxuXG4gICAgY29uc3QgaXNXaW5kb3cgPSBzY3JvbGxFbGVtZW50ID09PSB3aW5kb3dcblxuICAgIGNvbnN0IHNjcm9sbEVsRm9yVmFscyA9IGNvbmZpZy5zY3JvbGxFbEZvclZhbHMgIT09IHVuZGVmaW5lZCA/IGNvbmZpZy5zY3JvbGxFbEZvclZhbHMgOiBzY3JvbGxFbGVtZW50XG4gICAgY29uc3QgYWN0aW9uID0gaXNXaW5kb3cgPyAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VWRU5UJyA6ICdDSEFOTkVMX1dJTkRPV19FTEVNRU5UX1NDUk9MTF9FVkVOVCdcblxuICAgIGNvbnN0IHNjcm9sbERhdGFGbiA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxEYXRhKClcbiAgICAvLyBjb25zb2xlLmxvZyhcIlNDUk9MTCBFTEVNRU5UIFwiLGFjdGlvbixzY3JvbGxFbGVtZW50LCBzY3JvbGxFbEZvclZhbHMpO1xuICAgIGNvbnN0IHNjcm9sbE1hcEZuID0gcGFydGlhbFJpZ2h0KFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxNYXBGbiwgW2FjdGlvbiwgc2Nyb2xsRGF0YUZuLCBzY3JvbGxFbEZvclZhbHMsIGlzUGFzc2l2ZSwgZWxlbWVudF0pLmJpbmQodGhpcylcblxuICAgIC8vIGNvbnNvbGUubG9nKFwiY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZSBcIiwge3Njcm9sbE1hcEZuLCBzY3JvbGxEYXRhRm4sIGFjdGlvbiwgY29uZmlnLCBzY3JvbGxFbGVtZW50LCBlbGVtZW50fSlcblxuICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KCdzY3JvbGwnLFxuICAgICAgc2Nyb2xsTWFwRm4sIGlzUGFzc2l2ZSwgZWxlbWVudClcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoZFRpbWUpLFxuICAgICAgICBza2lwV2hpbGUoc2tpcFdoZW5EaXJJc01pc3NpbmcpLFxuICAgICAgICBtYXAocCA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3U2Nyb2xsWSA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxZKGVsZW1lbnQpXG4gICAgICAgICAgcC5wYXlsb2FkLnNjcm9sbERpc3RhbmNlQWJzID0gTWF0aC5hYnModGhpcy5jdXJyZW50U2Nyb2xsWSAtIG5ld1Njcm9sbFkpXG4gICAgICAgICAgdGhpcy5jdXJyZW50U2Nyb2xsWSA9IG5ld1Njcm9sbFlcbiAgICAgICAgICByZXR1cm4gcFxuICAgICAgICB9KVxuICAgICAgKVxuICB9XG5cbiAgY3JlYXRlT3JpZW50YXRpb25PYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiYWRkIG9yaWVudGF0aW9uXCIpO29yaWVudGF0aW9uY2hhbmdlXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ29yaWVudGF0aW9uY2hhbmdlJyxcbiAgICAgIFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRPcmllbnRhdGlvbk1hcEZuLmJpbmQodGhpcykpXG4gIH1cblxuICBjcmVhdGVSZXNpemVPYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIGNvbnN0IGRUaW1lID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yUmVzaXplXG4gICAgLy8gY29uc29sZS5sb2coJ3Jlc2l6ZSB0aGlzICcsIHRoaXMpO1xuXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ3Jlc2l6ZScsXG4gICAgICBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0UmVzaXplTWFwRm4uYmluZCh0aGlzKSkucGlwZShkZWJvdW5jZVRpbWUoZFRpbWUpKVxuICB9XG5cbiAgZ2V0RXZlbnRzRnJvbUNvbmZpZyhjb25maWcgPSB0aGlzLmRvbUNoYW5uZWxDb25maWcpIHtcbiAgICBjb25zdCBvYnMkQXJyID0gY29uZmlnLmV2ZW50c1xuXG4gICAgY29uc3QgYWRkV2luZG93RXZlbnRUb0FyciA9IHN0ciA9PiB7XG4gICAgICBjb25zdCBtYXBGbiA9IFNweW5lQ2hhbm5lbFdpbmRvdy5jcmVhdGVDdXJyaWVkR2VuZXJpY0V2ZW50KHN0cilcbiAgICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KHN0ciwgbWFwRm4pXG4gICAgfVxuXG4gICAgcmV0dXJuIHJNYXAoYWRkV2luZG93RXZlbnRUb0Fyciwgb2JzJEFycilcbiAgfVxuXG4gIGdldEFjdGl2ZU9ic2VydmFibGVzKGNvbmZpZyA9IHRoaXMuZG9tQ2hhbm5lbENvbmZpZykge1xuICAgIGxldCBvYnMkQXJyID0gW11cblxuICAgIC8vIENIRUNLIFRPIEFERCBNRURJQSBRVUVSWSBPQlNFUlZBQkxFXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uZmlnLmxpc3RlbkZvck1lZGlhUXVlcmllcyA9IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwoXG4gICAgICBjb25maWcubWVkaWFRdWVyaWVzKSB8fCBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsKFxuICAgICAgY29uZmlnLm1lZGlhUXVlcmllcylcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBjb25zdCBtZXRob2RzID0ge1xuICAgICAgbGlzdGVuRm9yUmVzaXplOiB0aGlzLmNyZWF0ZVJlc2l6ZU9ic2VydmFibGUuYmluZCh0aGlzKSxcbiAgICAgIGxpc3RlbkZvck9yaWVudGF0aW9uOiB0aGlzLmNyZWF0ZU9yaWVudGF0aW9uT2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgbGlzdGVuRm9yU2Nyb2xsOiB0aGlzLmNyZWF0ZVNjcm9sbE9ic2VydmFibGUuYmluZCh0aGlzKSxcbiAgICAgIGxpc3RlbkZvcldoZWVsOiB0aGlzLmNyZWF0ZU1vdXNlV2hlZWxPYnNlcnZhYmxlLmJpbmQodGhpcylcbiAgICB9XG5cbiAgICBjb25zdCBhZGRPYnNlcnZhYmxlVG9BcnIgPSAobWV0aG9kLCBrZXksIGkpID0+IHtcbiAgICAgIGNvbnN0IGFkZE9ic0Jvb2wgPSBjb25maWdba2V5XVxuICAgICAgaWYgKGFkZE9ic0Jvb2wpIHtcbiAgICAgICAgb2JzJEFyci5wdXNoKG1ldGhvZChjb25maWcpKVxuICAgICAgfVxuICAgIH1cblxuICAgIG1hcE9iakluZGV4ZWQoYWRkT2JzZXJ2YWJsZVRvQXJyLCBtZXRob2RzKVxuXG4gICAgLy8gJ2xpc3RlbkZvck1lZGlhUXVlcmllcycgOiB0aGlzLmdldE1lZGlhUXVlcnlPYnNlcnZhYmxlLmJpbmQodGhpcylcbiAgICB0aGlzLmNoZWNrRm9yTWVkaWFRdWVyaWVzKGNvbmZpZy5saXN0ZW5Gb3JNZWRpYVF1ZXJpZXMpXG5cbiAgICBjb25zdCBldmVudHNBcnIgPSB0aGlzLmdldEV2ZW50c0Zyb21Db25maWcoY29uZmlnKVxuICAgIG9icyRBcnIgPSBvYnMkQXJyLmNvbmNhdChldmVudHNBcnIpXG5cbiAgICByZXR1cm4gb2JzJEFyclxuICB9XG5cbiAgY2hlY2tGb3JNZWRpYVF1ZXJpZXMoYm9vbCkge1xuICAgIGNvbnN0IHNlbmRNUVN0cmVhbSA9IHAgPT4ge1xuICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBwXG4gICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50LFxuICAgICAgICB0aGlzLm9ic2VydmVyJClcbiAgICB9XG5cbiAgICBpZiAoYm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5nZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZSh0aGlzLmRvbUNoYW5uZWxDb25maWcpXG4gICAgICAgIC5zdWJzY3JpYmUoc2VuZE1RU3RyZWFtKVxuICAgIH1cbiAgfVxuXG4gIGdldE1lZGlhUXVlcnlPYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIGNvbnN0IGFyciA9IHRoaXMuY3JlYXRlTWVyZ2VkT2JzRnJvbU9iaihjb25maWcpXG4gICAgLy8gY29uc29sZS5sb2coXCJBUlIgSVMgXCIse2Fycn0pO1xuICAgIGNvbnN0IG9icyQgPSBhcHBseShtZXJnZSwgYXJyKVxuICAgIHJldHVybiBvYnMkLnBpcGUobWFwKHRoaXMuZ2V0TWVkaWFRdWVyeU1hcEZuLmJpbmQodGhpcykpKVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BQk9SVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQUZURVJQUklOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQU5JTUFUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BTklNQVRJT05JVEVSQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FOSU1BVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BUFBJTlNUQUxMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JFRk9SRVBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19CRUZPUkVVTkxPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JFR0lORVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JMVVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NBQ0hFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0xPU0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPTVBPU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT01QT1NJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT01QT1NJVElPTlVQREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ09QWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EQkxDTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VMSUdIVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFTU9USU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VPUklFTlRBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFUFJPWElNSVRZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01BVFRSSUJVVEVOQU1FQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQVRUUk1PRElGSUVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01DSEFSQUNURVJEQVRBTU9ESUZJRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUVMRU1FTlROQU1FQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR0VOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RST1BfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0VMRU1FTlRfU0NST0xMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRk9DVVNJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRk9DVVNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0ZVTExTQ1JFRU5DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0ZVTExTQ1JFRU5FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfSEFTSENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0lOVkFMSURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0tFWURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0tFWVBSRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19LRVlVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTUVESUFfUVVFUllfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01FU1NBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRU9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRVdIRUVMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19PRkZMSU5FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19PTkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09QRU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09SSUVOVEFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QQUdFSElERV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUEFHRVNIT1dfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BBU1RFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QT1BTVEFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUE9QU1RBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BST0dSRVNTRVZFTlRTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19SRVNFVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRUxFTUVOVF9BRERFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfTE9DS19FVkVOVCcsXG4gICAgICBbJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9MT0NLX0VWRU5UJywgJ29uU2Nyb2xsTG9ja0V2ZW50J10sXG4gICAgICBbJ0NIQU5ORUxfV0lORE9XX1NFVF9FTEVNRU5UX1RPX1NDUk9MTF9FVkVOVCcsICdvblNldEVsZW1lbnRUb1Njcm9sbCddLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NUT1JBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NVQk1JVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTkNBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTlJVTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19VTkxPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1dIRUVMX0VWRU5UJ1xuICAgIF1cbiAgfVxuXG4gIG9uU2Nyb2xsTG9ja0V2ZW50KGUpIHtcbiAgICAvLyBERVBSRUNBVEVEIC0tIE1PVkVEIFRPIHNweW5lLXBsdWdpbi1zY3JvbGwtbG9jaztcbiAgfVxuXG4gIG9uU2V0RWxlbWVudFRvU2Nyb2xsKGUpIHtcbiAgICBsZXQgeyBjb25maWcsIGVsLCBzY3JvbGxFbGVtZW50IH0gPSBlLnBheWxvYWRcbiAgICBjb25maWcgPSBjb25maWcgfHwge31cbiAgICBjb25maWcgPSBkZWVwTWVyZ2UodGhpcy5kb21DaGFubmVsQ29uZmlnLCBjb25maWcpXG5cbiAgICBzY3JvbGxFbGVtZW50ID0gc2Nyb2xsRWxlbWVudCB8fCBlbFxuXG4gICAgY29uc3QgYWN0aW9uID0gJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9FTEVNRU5UX0FEREVEX0VWRU5UJ1xuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgeyBlbCB9LCBlbClcblxuICAgIHRoaXMuY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZShjb25maWcsIHNjcm9sbEVsZW1lbnQpXG4gICAgICAuc3Vic2NyaWJlKHAgPT4ge1xuICAgICAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHBcbiAgICAgICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICAgIH0pXG4gIH1cblxuICBiaW5kU3RhdGljTWV0aG9kcygpIHtcbiAgICB0aGlzLmNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVkaWFRdWVyeUhhbmRsZXIuYmluZChcbiAgICAgIHRoaXMpXG4gICAgdGhpcy5jcmVhdGVNZXJnZWRPYnNGcm9tT2JqID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVyZ2VkT2JzRnJvbU9iai5iaW5kKFxuICAgICAgdGhpcylcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbHNNYXAgfSBmcm9tICcuL2NoYW5uZWxzL2NoYW5uZWxzLW1hcC5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW0gfSBmcm9tICcuL3ZpZXdzL3ZpZXctc3RyZWFtLmpzJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4vdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBzYW5pdGl6ZUhUTUxDb25maWd1cmUgfSBmcm9tICcuL3V0aWxzL3Nhbml0aXplLWh0bWwuanMnXG5pbXBvcnQgeyBzYW5pdGl6ZURhdGFDb25maWd1cmUgfSBmcm9tICcuL3V0aWxzL3Nhbml0aXplLWRhdGEuanMnXG5cbmNvbnN0IF9jaGFubmVscyA9IG5ldyBDaGFubmVsc01hcCgpXG5jb25zdCB2ZXJzaW9uID0gJzAuMjIuMidcblxuY2xhc3MgU3B5bmVBcHBsaWNhdGlvbiB7XG4gIC8qKlxuICAgKlxuICAgKiBTcHluZUFwcCBjcmVhdGVzIHRoZSBnbG9iYWwgU3B5bmUgb2JqZWN0LCBhbmQgY3JlYXRlcyB0aGUgZm9sbG93aW5nIGl0ZW1zXG4gICAqIDx1bD5cbiAgICpcbiAgICogPGxpPkxJTktbJ0NoYW5uZWxzTWFwJywgJ2NoYW5uZWxzLWNvbnRyb2xsZXInXSB0aGF0IGRpcmVjdHMgdGhlIGZsb3cgb2YgZGF0YSB0byBhbGwgQ2hhbm5lbHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsVUknLCAnc3B5bmUtY2hhbm5lbC11LWknXSwgdGhhdCBicm9hZGNhc3QgYWxsIHVzZXIgaW50ZXJhY3Rpb24gZXZlbnRzPC9saT5cbiAgICogPGxpPkxJTktbJ1NweW5lQ2hhbm5lbFJvdXRlJywgJ3NweW5lLWNoYW5uZWwtcm91dGUnXSwgdGhhdCBicm9hZGNhc3Qgd2luZG93IGxvY2F0aW9uIGNoYW5nZXMgYW5kIGlzIHRoZSBvbmx5IG90aGVyIGNoYW5uZWwgdGhhdCBjYW4gYmUgYm91bmQgdG8gdXNlciBldmVudHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsV2luZG93JywgJ3NweW5lLWNoYW5uZWwtd2luZG93J10sIHRoYXQgYnJvYWRjYXN0IGFsbCByZXF1ZXN0ZWQgd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMsIHN1Y2ggYXMgc2Nyb2xsaW5nLCByZXNpemluZyBhbmQgbWVkaWEgcXVlcmllczwvbGk+XG4gICAqIDxsaT5MSU5LWydTcHluZUNoYW5uZWxMaWZlY3ljbGUnLCAnc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUnXSwgdGhhdCBicm9hZGNhc3RzIHJlbmRlcmluZyBhbmQgcmVtb3Zpbmcgb2YgVmlld1N0cmVhbSBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBkaXJlY3RlZCB0byBicm9hZGNhc3QgdGhlaXIgbGlmZWN5Y2xlIGV2ZW50czwvbGk+XG4gICAqIDwvdWw+XG4gICAqXG4gICAqXG4gICAqIEBtb2R1bGUgU3B5bmVBcHBcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xuICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnIC0gPSB7fTsgVGhpcyBnbG9iYWwgY29uZmlnIG9iamVjdCBpcyBtYWlubHkgdXNlZCB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgdHdvIFNweW5lQ2hhbm5lbHMsIENIQU5ORUxfUk9VVEUgYW5kIENIQU5ORUxfV0lORE9XLlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uXG4gIH1cblxuICBnZXQgY2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIF9jaGFubmVsc1xuICB9XG5cbiAgaW5pdChjb25maWcgPSB7fSwgdGVzdE1vZGUgPSBmYWxzZSkge1xuICAgIC8vIHRoaXMuY2hhbm5lbHMgPSBuZXcgQ2hhbm5lbHNNYXAoKTtcbiAgICAvKiFcbiAgICAgKiBTcHluZSAwLjIyLjJcbiAgICAgKiBodHRwczovL3NweW5lanMub3JnXG4gICAgICpcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCAyMDE3LTIwMjUsIEZyYW5rIEJhdGlzdGEsXG4gICAgICogUmVsZXZhbnQgQ29udGV4dCwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICAgICAqXG4gICAgICogTGljZW5zZWQgdW5kZXIgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgICAqIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICAgKiBBIGNvcHkgb2YgdGhlIExpY2Vuc2UgaXMgbG9jYXRlZCBpbiB0aGUgcHJvamVjdCByb290LCBvciBhdDpcbiAgICAgKiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xncGwtMy4wLmh0bWxcbiAgICAgKlxuICAgICAqIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IGRpc3RyaWJ1dGlvbi5cbiAgICAgKi9cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG4gICAgaWYoU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSB0cnVlKXtcbiAgICAgIGlmICh0ZXN0TW9kZSl7XG4gICAgICAgIHJldHVybiAnVGhlIFNweW5lIEFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQhJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVGhlIFNweW5lIEFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQhJyk7XG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvL2NvbnN0IGltZ1BhdGggPSBJTUdfUEFUSCB8fCB1bmRlZmluZWQ7XG4gICAgY29uc3QgaW1nUGF0aCA9ICh0eXBlb2YgSU1HX1BBVEggIT09ICd1bmRlZmluZWQnKSA/IElNR19QQVRIIDogdW5kZWZpbmVkO1xuICAgIGxldCBkZWZhdWx0Q29uZmlnID0ge1xuICAgICAgc2Nyb2xsTG9jazogZmFsc2UsXG4gICAgICBzY3JvbGxMb2NrWDogMzEsXG4gICAgICBzY3JvbGxMb2NrWTogMCxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICBiYXNlSHJlZjogdW5kZWZpbmVkLFxuICAgICAgSU1HX1BBVEg6IGltZ1BhdGgsXG4gICAgICBwbHVnaW5NZXRob2RzOntcblxuICAgICAgfSxcbiAgICAgIHBsdWdpbnM6e1xuXG4gICAgICB9LFxuICAgICAgdG1wOiB7fSxcbiAgICAgIGVwaGVtZXJhbFByb3BzOiB7fSxcbiAgICAgIHRtcFByb3BzOiB7fSxcbiAgICAgIGNoYW5uZWxzOiB7XG4gICAgICAgIFdJTkRPVzoge1xuICAgICAgICAgIG1lZGlhUXVlcmllczoge1xuXG4gICAgICAgICAgfSxcbiAgICAgICAgICBldmVudHM6IFtdLFxuICAgICAgICAgIGxpc3RlbkZvclJlc2l6ZTogdHJ1ZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JPcmllbnRhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JTY3JvbGw6IGZhbHNlLFxuICAgICAgICAgIGxpc3RlbkZvck1vdXNlV2hlZWw6IGZhbHNlLFxuICAgICAgICAgIGxpc3RlbkZvcldoZWVsOiBmYWxzZSxcbiAgICAgICAgICBkZWJvdW5jZU1TVGltZUZvclJlc2l6ZTogMjAwLFxuICAgICAgICAgIGRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsOiAxNTBcbiAgICAgICAgfSxcblxuICAgICAgICBST1VURToge1xuICAgICAgICAgIHR5cGU6ICdzbGFzaCcsXG4gICAgICAgICAgaXNIYXNoOiBmYWxzZSxcbiAgICAgICAgICBpc0hpZGRlbjogZmFsc2UsXG4gICAgICAgICAgYWRkNDA0czogZmFsc2UsXG4gICAgICAgICAgcm91dGVzOiB7XG4gICAgICAgICAgICAncm91dGVQYXRoJyA6IHtcbiAgICAgICAgICAgICAgJ3JvdXRlTmFtZScgOiAnY2hhbmdlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoY29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHJvdXRlVXRpbHMgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlO1xuICAgICAgIGNvbmZpZyA9IFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplKGRlZmF1bHRDb25maWcsIGNvbmZpZywgX2NoYW5uZWxzLCByb3V0ZVV0aWxzKTtcbiAgICAgICAvL2NvbnNvbGUubG9nKFwiU1BZTkUgQVBQIFBST1BTIFwiLFNweW5lQXBwUHJvcGVydGllcyk7XG4gICAgICAvL3dpbmRvdy5TcHluZSA9IHRoaXM7XG4gICAgICAvL3dpbmRvdy5TcHluZVsnY29uZmlnJ10gPSBkZWVwTWVyZ2UoZGVmYXVsdENvbmZpZywgY29uZmlnKVxuICAgIH1cbiAgICB0aGlzLnBsdWdpbnNGbiA9IFNweW5lQXBwUHJvcGVydGllcy5nZXRQbHVnaW5zTWV0aG9kT2JqKGNvbmZpZ1sncGx1Z2luTWV0aG9kcyddKTtcbiAgICB0aGlzLmdldENoYW5uZWxBY3Rpb25zID0gKHN0cikgPT4gX2NoYW5uZWxzLmdldENoYW5uZWxBY3Rpb25zKHN0cik7XG4gICAgdGhpcy5yZWdpc3RlckNoYW5uZWwgPSAodmFsKSA9PiBfY2hhbm5lbHMucmVnaXN0ZXJTdHJlYW0odmFsKTtcbiAgICB0aGlzLnJlZ2lzdGVyUGx1Z2luID0gKHBsdWdpbkluc3RhbmNlKSA9PiBTcHluZUFwcFByb3BlcnRpZXMucmVnaXN0ZXJQbHVnaW4ocGx1Z2luSW5zdGFuY2UpO1xuICAgIHRoaXMucmVnaXN0ZXJEYXRhQ2hhbm5lbCA9IChvYnMkKSA9PiBfY2hhbm5lbHMucmVnaXN0ZXJTdHJlYW0ob2JzJCk7XG4gICAgdGhpcy5saXN0Q2hhbm5lbHMgPSAoKSA9PiBBcnJheS5mcm9tKF9jaGFubmVscy5tYXAua2V5cygpKTtcbiAgICBsZXQgbnVsbEhvbGRlciA9IG5ldyBWaWV3U3RyZWFtKHsgaWQ6J3NweW5lLW51bGwtdmlld3MnIH0pO1xuICAgIG51bGxIb2xkZXIuYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAgbnVsbEhvbGRlci5wcm9wcy5lbC5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6bm9uZTsgb3BhY2l0eTowOyBwb2ludGVyLWV2ZW50czpub25lOyc7XG4gICAgX2NoYW5uZWxzLmluaXQoKTtcblxuICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmRlYnVnPT09dHJ1ZSl7XG4gICAgICAgd2luZG93LlNweW5lID0ge3ZlcnNpb259O1xuICAgIH1cblxuICAgIHNhbml0aXplSFRNTENvbmZpZ3VyZShTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnKTtcbiAgICBzYW5pdGl6ZURhdGFDb25maWd1cmUoU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZylcblxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgbW9zdGx5IHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0Pkxpc3RpbmcgdGhlIHJlZ2lzdGVyZWVkIENoYW5uZWxzIGluIHRoZSBicm93c2VyIGNvbnNvbGU8L2g0PiddXG4gICAqIFNweW5lQXBwLmxpc3RDaGFubmVscygpO1xuICAgKlxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgY2hhbm5lbHNcbiAgICovXG4gIHN0YXRpYyBsaXN0Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oX2NoYW5uZWxzLm1hcC5rZXlzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byBjaGVjayBpbiB0aGUgY29uc29sZSBvciBpbiB0aGUgY29kZSB3aGF0IGFjdGlvbnMgYXJlIGF2YWlsYWJsZSB0byBiZSBsaXN0ZW5lZCB0by5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7QXJyYXl9IEFuIGFycmF5IG9mIEFjdGlvbnMgdGhhdCBjYW4gYmUgbGlzdGVuZWQgdG9cbiAgICovXG4gIHN0YXRpYyBnZXRDaGFubmVsQWN0aW9ucyhzdHIpIHtcbiAgICByZXR1cm4gX2NoYW5uZWxzLmdldENoYW5uZWxBY3Rpb25zKHN0cik7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBhZGQgdGhlIGNoYW5uZWwgdG8gdGhlIHJlZ2lzdGVyZWQgbGlzdCBzbyB0aGF0IGl0IGNhbiBzdWJzY3JpYmVkIGJ5IGFsbCBWaWV3U3RyZWFtIGFuZCBDaGFubmVsIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHtDaGFubmVsfSBjXG4gICAqXG4gICAqXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJDaGFubmVsKGMpIHtcbiAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKCdTcHluZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF9jaGFubmVscy5yZWdpc3RlclN0cmVhbShjKTtcbiAgICB9XG4gIH1cbn1cblxuXG5leHBvcnQgbGV0IFNweW5lQXBwID0gbmV3IFNweW5lQXBwbGljYXRpb24oKTtcbiIsImltcG9ydCB7IERvbUVsZW1lbnQgfSBmcm9tICcuL3ZpZXdzL2RvbS1lbGVtZW50LmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IGlzLCBjbG9uZSwgcGF0aFNhdGlzZmllcyB9IGZyb20gJ3JhbWRhJ1xubGV0IF9zcHluZUFwcFByb3BzID0gU3B5bmVBcHBQcm9wZXJ0aWVzXG5leHBvcnQgY2xhc3MgU3B5bmVQbHVnaW4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgbGV0IHsgbmFtZSwgY29uZmlnLCBwYXJlbnRFbCB9ID0gcHJvcHNcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcblxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnID0gY2xvbmUocHJvcHMpXG4gICAgfVxuXG4gICAgdGhpcy5uYW1lID0gbmFtZSB8fCAnZW1wdHknXG4gICAgdGhpcy5wcm9wcy5uYW1lID0gbmFtZVxuICAgIGNvbmZpZyA9IFNweW5lUGx1Z2luLm1lcmdlRGVmYXVsdENvbmZpZyhjb25maWcsIHRoaXMuZGVmYXVsdENvbmZpZygpKVxuICAgIHRoaXMucHJvcHMucGFyZW50RWwgPSBwYXJlbnRFbCB8fCBTcHluZVBsdWdpbi5jcmVhdGVQYXJlbnRFbCgpXG4gICAgLy8gU3B5bmVQbHVnaW4uZ2V0U3B5bmVBcHAobmFtZSwgY29uZmlnKVxuICAgIHRoaXMucHJvcHMuY29uZmlnID0gY29uZmlnXG4gICAgaWYgKHRoaXMucHJvcHMudHJhaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYWRkVHJhaXRzKHRoaXMucHJvcHMudHJhaXRzKVxuICAgIH1cblxuICAgIC8vIHRoaXMub25CZWZvcmVSZWdpc3RlcmVkKClcbiAgICAvLyB0aGlzLm9uUmVnaXN0ZXJlZCgpXG4gICAgLy8gdGhpcy5vblJlbmRlcigpXG4gIH1cblxuICAvKipcbiAgICogTm93IHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGFwcCBkZWNpZGVzIHRvIHJlZ2lzdGVyIHRoZSBwbHVnaW4uXG4gICAqIFRoaXMgd2F5LCB0aGUgcGx1Z2luIG5vIGxvbmdlciBoYXMgdG8gaW1wb3J0IG9yIHJlbHkgb24gaXRzIG93biB2ZXJzaW9uXG4gICAqIG9mIFNweW5lQXBwUHJvcGVydGllcy4gSW5zdGVhZCwgaXQgaXMgKnBhc3NlZCogdGhlIGF1dGhvcml0YXRpdmUgaW5zdGFuY2UuXG4gICAqL1xuICByZWdpc3RlcihzcHluZUFwcFByb3BzKSB7XG4gICAgLy8gMS4gU2F2ZSBhIHJlZmVyZW5jZSB0byB0aGUgcmVhbCBTcHluZUFwcFByb3BlcnRpZXNcbiAgICBfc3B5bmVBcHBQcm9wcyA9IHNweW5lQXBwUHJvcHNcbiAgICB0aGlzLnByb3BzLnBsdWdpbk5hbWUgPSB0aGlzLnByb3BzLm5hbWVcblxuICAgIC8vIHRoaXMucHJvcHMuY29uZmlnID0gX3NweW5lQXBwUHJvcHMuZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lKHRoaXMucHJvcHMucGx1Z2luTmFtZSlcblxuICAgIGlmIChfc3B5bmVBcHBQcm9wcy5pbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgU3B5bmUgV2FybmluZzogU3B5bmVBcHAgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldCEgQ2Fubm90IHJlZ2lzdGVyIHBsdWdpbiBcIiR7dGhpcy5uYW1lfVwiLmBcbiAgICAgIClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMub25CZWZvcmVSZWdpc3RlcmVkKClcblxuICAgIC8vIDIuIEFkZCBwbHVnaW4gY29uZmlnIGluIHRoZSByZWFsIFNweW5lQXBwUHJvcGVydGllc1xuICAgIHRoaXMucHJvcHMuY29uZmlnID0gY2xvbmUodGhpcy5wcm9wcy5jb25maWcpXG4gICAgX3NweW5lQXBwUHJvcHMuYWRkUGx1Z2luQ29uZmlnKHRoaXMubmFtZSwgdGhpcy5wcm9wcy5jb25maWcpXG5cbiAgICAvLyBJZiB5b3UgaGF2ZSBwbHVnaW4tbGV2ZWwgbG9naWMgdGhhdCBkZXBlbmRzIG9uIHRoZSByZWFsIHNweW5lQXBwLFxuICAgIC8vIHlvdSBjYW4gYWRkIGl0IGhlcmUsIGUuZy46XG4gICAgLy8gc3B5bmVBcHBQcm9wcy5hZGRQbHVnaW5NZXRob2RzKHRoaXMucHJvcHMuY29uZmlnLnBsdWdpbk1ldGhvZHMpXG5cbiAgICAvLyAzLiBJZiB5b3UgaGF2ZSBvdGhlciBwbHVnaW4gbGlmZWN5Y2xlIG1ldGhvZHNcbiAgICB0aGlzLm9uUmVnaXN0ZXJlZCgpXG4gICAgdGhpcy5vblJlbmRlcigpXG4gIH1cblxuICBnZXQgU3B5bmVBcHBQcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiBfc3B5bmVBcHBQcm9wc1xuICB9XG5cbiAgc3RhdGljIG1lcmdlRGVmYXVsdENvbmZpZyhjb25maWcgPSB7fSwgZGVmYXVsdENvbmZpZyA9IHRoaXMuZGVmYXVsdENvbmZpZygpKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZGVmYXVsdENvbmZpZywgY29uZmlnKVxuICB9XG5cbiAgc3RhdGljIGdldFNweW5lQXBwKG5hbWUsIGNvbmZpZykge1xuICAgIGlmIChfc3B5bmVBcHBQcm9wcy5pbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVW5hYmxlIHRvIGluc3RhbGwgcGx1Z2luLCAke25hbWV9ISBTcHluZUFwcCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhYClcbiAgICAgIC8vIFNweW5lQXBwLmluaXQoKVxuICAgIH0gZWxzZSB7XG4gICAgICBfc3B5bmVBcHBQcm9wcy5hZGRQbHVnaW5Db25maWcobmFtZSwgY29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB1cGRhdGVTcHluZUNvbmZpZyhzcHluZUFwcCwgcGx1Z2luTmFtZSwgcGx1Z2luQ29uZmlnKSB7XG4gICAgY29uc3QgcGF0aEV4aXN0cyA9IHBhdGhTYXRpc2ZpZXMoaXMoT2JqZWN0KSwgWydjb25maWcnLCAncGx1Z2lucycsIHBsdWdpbk5hbWVdKShzcHluZUFwcClcblxuICAgIGlmIChwYXRoRXhpc3RzID09PSB0cnVlKSB7XG4gICAgICBpZiAoc3B5bmVBcHAuY29uZmlnLmRlYnVnID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIHBsdWdpbiwgJHtwbHVnaW5OYW1lfSwgYWxyZWFkeSBleGlzdHNgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHNweW5lQXBwLmNvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdID0gcGx1Z2luQ29uZmlnXG4gICAgcmV0dXJuIHNweW5lQXBwLmNvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUGFyZW50RWwoZWwpIHtcbiAgICBjb25zdCBjcmVhdGVQbHVnaW5QYXJlbnRFbCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHBsdWdpbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NweW5lLXBsdWdpbnMnKVxuXG4gICAgICBjb25zdCBjcmVhdGVQbHVnaW5FbCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcGx1Z2luRWwgPSBuZXcgRG9tRWxlbWVudCh7XG4gICAgICAgICAgaWQ6ICdzcHluZS1wbHVnaW5zJ1xuICAgICAgICB9KVxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBsdWdpbkVsLnJlbmRlcigpKVxuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcHluZS1wbHVnaW5zJylcbiAgICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7bWluLWhlaWdodDoxMDB2aDt6LWluZGV4OjEwMDAwMDA7IHBvaW50ZXItZXZlbnRzOm5vbmUnXG4gICAgICAgIHJldHVybiBlbFxuICAgICAgfVxuICAgICAgcmV0dXJuIHBsdWdpbkVsIHx8IGNyZWF0ZVBsdWdpbkVsKClcbiAgICB9XG5cbiAgICByZXR1cm4gZWwgfHwgY3JlYXRlUGx1Z2luUGFyZW50RWwoKVxuICB9XG5cbiAgYWRkVHJhaXRzKHRyYWl0cykge1xuICAgIGlmICh0cmFpdHMuY29uc3RydWN0b3IubmFtZSAhPT0gJ0FycmF5Jykge1xuICAgICAgdHJhaXRzID0gW3RyYWl0c11cbiAgICB9XG4gICAgY29uc3QgYWRkVHJhaXQgPSAoVHJhaXRDbGFzcykgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBUcmFpdENsYXNzKHRoaXMpXG4gICAgfVxuXG4gICAgdHJhaXRzLmZvckVhY2goYWRkVHJhaXQpXG4gIH1cblxuICBvbkJlZm9yZVJlZ2lzdGVyZWQoKSB7XG4gICAgLy8gdGhpcy5wcm9wcy5wbHVnaW5OYW1lID0gdGhpcy5wcm9wcy5uYW1lXG4gICAgLy8gdGhpcy5wcm9wcy5jb25maWcgPSBfc3B5bmVBcHBQcm9wcy5nZXRQbHVnaW5Db25maWdCeVBsdWdpbk5hbWUodGhpcy5wcm9wcy5wbHVnaW5OYW1lKVxuICAgIHRoaXMuY2hlY2tGb3JSZXF1aXJlZFdpbmRvd0V2ZW50KClcbiAgfVxuXG4gIGNoZWNrRm9yUmVxdWlyZWRXaW5kb3dFdmVudCgpIHtcbiAgICBjb25zdCByZXF1aXJlZEV2ZW50cyA9IHRoaXMucHJvcHMucmVxdWlyZWRFdmVudHMgPz8gW11cbiAgICBjb25zdCB3aW5kb3dDb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0Q2hhbm5lbENvbmZpZygnV0lORE9XJylcblxuICAgIGNvbnN0IG1pc3NpbmdFdmVudHMgPSByZXF1aXJlZEV2ZW50cy5maWx0ZXIoZXZ0ID0+ICF3aW5kb3dDb25maWcuZXZlbnRzLmluY2x1ZGVzKGV2dCkpXG5cbiAgICAvLyBJZiBhbnkgYXJlIG1pc3NpbmcsIGxvZyBhIHNpbmdsZSB3YXJuaW5nIGxpc3RpbmcgdGhlbVxuICAgIGlmIChtaXNzaW5nRXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgcGx1Z2luIFwiJHt0aGlzLnByb3BzLm5hbWV9XCIgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBjb25maWcuV0lORE9XLmV2ZW50cywgLS0+ICR7bWlzc2luZ0V2ZW50cy5qb2luKCcsICcpfSA8LS1gXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgZGVmYXVsdENvbmZpZygpIHtcbiAgICByZXR1cm4ge1xuXG4gICAgfVxuICB9XG5cbiAgb25SZWdpc3RlcmVkKCkge1xuXG4gIH1cblxuICBvblJlbmRlcigpIHtcblxuICB9XG59XG4iLCJpbXBvcnQgeyBmcm9tIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZsYXRNYXAsIG1hcCwgcHVibGlzaCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBjb21wb3NlLCBwcm9wLCBkZWZhdWx0VG8sIG92ZXIsIGxlbnNQcm9wLCBoYXMsIHByb3BFcSwgd2hlbiwgcHJvcElzLCBhbGxQYXNzLCBhc3NvYywgcGljaywgbWVyZ2VEZWVwUmlnaHQgfSBmcm9tICdyYW1kYSdcbmltcG9ydCBzYW5pdGl6ZURhdGEsIHsgc2V0U2FuaXRpemVEYXRhRm9yY2VTdHJpY3QgfSBmcm9tICcuL3Nhbml0aXplLWRhdGEuanMnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsRmV0Y2hVdGlsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbEZldGNoVXRpbFxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIFRoaXMgaXMgdGhlIGNvcmUgb2JqZWN0IHVzZWQgZm9yIENoYW5uZWxGZXRjaC4gVGhpcyB1dGlsaXR5IHdyYXBzIHRoZSBqYXZhc2NyaXB0IGZldGNoIGFwaSBpbnRvIGFuIG9ic2VydmFibGUuXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBQcm9wZXJ0aWVzIHVzZWQgdG8gY3JlYXRlIHRoZSBmZXRjaCByZXF1ZXN0XG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1YnNjcmliZXIgQSBtZXRob2QgYXNzaWduZWQgdG8gbGlzdGVuIHRvIHRoZSByZXN1bHRcbiAgICogQHBhcmFtIHtCb29sZWFufSB0ZXN0TW9kZSBDb250cm9scyB0aGUgaW5pdGlhbGl6dGlvbiBmb3IgdW5pdCB0ZXN0c1xuICAgKlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy51cmwgLSA9IHVuZGVmaW5lZDsgVGhlIHVybCB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy5zZXJ2ZXJPcHRpb25zIC0gPSB1bmRlZmluZWQ7IFRoZSBwcm9wZXJ0aWVzLCBoZWFkZXIsIGJvZHksIG1vZGUsIG1ldGhvZCwgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLm1hcEZuIC0gPSB1bmRlZmluZWQ7IEEgbWV0aG9kIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGFyc2UgdGhlIGRhdGEgYmVmb3JlIGl0J3MgcmV0dXJuZWRcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMucmVzcG9uc2VUeXBlIC0gPSAnanNvbic7IERlZmF1bHQgaXMganNvblxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy5kZWJ1ZyAtID0gZmFsc2U7IHdpbGwgdHJhY2UgdGhlIGZldGNoIHJlc3BvbnNlIHRvIHRoZSBjb25zb2xlIGJlZm9yIHRoZSBvYnNlcnZhYmxlIGNvbXBsZXRlc1xuICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBTdWJzY3JpYmVyIC0gPSB1bmRlZmluZWQ7IHRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBmZXRjaCBpcyBjb21wbGV0ZS5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSB0ZXN0TW9kZSAtID0gZmFsc2U7IFVzZWQgZm9yIHVuaXQgdGVzdGluZy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGZldGNoZWQgcmVzcG9uc2UgcGFyc2VkIGJ5IHRoZSBzZXQgcGFyYW1ldGVycy5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5Vc2luZyBDaGFubmVsRmV0Y2hVdGlsIHRvIFJldHJpZXZlIGFuIEltYWdlPC9oND4nXVxuICAgKlxuICAgKiAgIGNvbnN0IHVybCA9IFwiL3N0YXRpYy9pbWFnZXMvbXlpbWFnZS5qcGdcIjtcbiAgICogICBjb25zdCByZXNwb25zZVR5cGUgPSBcImJsb2JcIjtcbiAgICogICBjb25zdCBvbkltZ0Jsb2JSZXR1cm5lZCA9IChibG9iKT0+e1xuICAgKiAgICAgICAgbGV0IGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgKiAgICAgICAgdGhpcy5hcHBlbmRWaWV3KFxuICAgKiAgICAgICAgICAgIG5ldyBWaWV3U3RyZWFtKHtcbiAgICogICAgICAgICAgICAgIHRhZ05hbWU6ICdpbWcnLFxuICAgKiAgICAgICAgICAgICAgc3JjOiBibG9iVXJsLFxuICAgKiAgICAgICAgICAgICAgd2lkdGg6MzAwXG4gICAqICAgICAgICAgICAgfSlcbiAgICogICAgICAgICAgICl9XG4gICAqXG4gICAqICAgbmV3IENoYW5uZWxGZXRjaFV0aWwoe3VybCwgcmVzcG9uc2VUeXBlfSwgb25JbWdCbG9iUmV0dXJuZWQpO1xuICAgKlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zLCBzdWJzY3JpYmVyLCB0ZXN0TW9kZSwgQ0hBTk5FTF9OQU1FKSB7XG4gICAgc2V0U2FuaXRpemVEYXRhRm9yY2VTdHJpY3QodHJ1ZSlcblxuICAgIGNvbnN0IHRlc3RTdWJzY3JpYmVyID0gKHApID0+IGNvbnNvbGUubG9nKCdGRVRDSCBSRVRVUk5FRCAnLCBwKVxuXG4gICAgdGhpcy5fbWFwRm4gPSBDaGFubmVsRmV0Y2hVdGlsLnNldE1hcEZuKG9wdGlvbnMpXG4gICAgdGhpcy5fdXJsID0gQ2hhbm5lbEZldGNoVXRpbC5zZXRVcmwob3B0aW9ucylcbiAgICB0aGlzLl9yZXNwb25zZVR5cGUgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFJlc3BvbnNlVHlwZShvcHRpb25zKVxuICAgIHRoaXMuX3NlcnZlck9wdGlvbnMgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFNlcnZlck9wdGlvbnMob3B0aW9ucylcbiAgICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlciAhPT0gdW5kZWZpbmVkID8gc3Vic2NyaWJlciA6IHRlc3RTdWJzY3JpYmVyXG4gICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVidWcgOiBmYWxzZVxuICAgIHRoaXMuY2hhbm5lbE5hbWUgPSBDSEFOTkVMX05BTUVcblxuICAgIGNvbnN0IGZldGNoUHJvcHMgPSB7XG4gICAgICBtYXBGbjogdGhpcy5tYXBGbixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICBzZXJ2ZXJPcHRpb25zOiB0aGlzLnNlcnZlck9wdGlvbnMsXG4gICAgICByZXNwb25zZVR5cGU6IHRoaXMucmVzcG9uc2VUeXBlLFxuICAgICAgZGVidWc6IHRoaXMuZGVidWdcbiAgICB9XG4gICAgaWYgKHRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICBDaGFubmVsRmV0Y2hVdGlsLnN0YXJ0V2luZG93RmV0Y2goZmV0Y2hQcm9wcywgdGhpcy5fc3Vic2NyaWJlciwgdGhpcy5jaGFubmVsTmFtZSlcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgc3RhcnRXaW5kb3dGZXRjaChwcm9wcywgc3Vic2NyaWJlciwgY2hhbm5lbE5hbWUpIHtcbiAgICBjb25zdCB7IG1hcEZuLCB1cmwsIHNlcnZlck9wdGlvbnMsIHJlc3BvbnNlVHlwZSwgZGVidWcgfSA9IHByb3BzXG4gICAgY29uc3QgdGFwTG9nRGVidWcgPSBwID0+IGNvbnNvbGUubG9nKCdERUJVRyBGRVRDSCA6JywgcCwgeyB1cmwsIHNlcnZlck9wdGlvbnMsIHJlc3BvbnNlVHlwZSwgY2hhbm5lbE5hbWUgfSlcbiAgICBjb25zdCB0YXBMb2cgPSBkZWJ1ZyA9PT0gdHJ1ZSA/IHRhcExvZ0RlYnVnIDogKCkgPT4ge31cblxuICAgIGNvbnN0IG1hcFdyYXBwZXIgPSAobWFwTWV0aG9kKSA9PiB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IHsgY2hhbm5lbE5hbWUsIHVybCwgcmVzcG9uc2VUeXBlLCBzZXJ2ZXJPcHRpb25zIH1cblxuICAgICAgcmV0dXJuIChkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpc2FibGVTYW5pdGl6ZSA9IHByb3BzPy5kaXNhYmxlU2FuaXRpemUgPT09IHRydWVcblxuICAgICAgICBpZiAoZGlzYWJsZVNhbml0aXplKSB7XG4gICAgICAgICAgY29uc3QgZW52ID0gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOVilcbiAgICAgICAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlZcbiAgICAgICAgICAgIDogJ2RldmVsb3BtZW50J1xuXG4gICAgICAgICAgY29uc3QgbXNnID0gYFNQWU5FIFNFQ1VSSVRZIFdBUk5JTkcg4oCUIFNhbml0aXphdGlvbiBkaXNhYmxlZCBmb3IgZmV0Y2ggZnJvbSAke3VybH0uIERhdGEgd2lsbCBlbnRlciB0aGUgcmVhY3RpdmUgc3RyZWFtIHVuc2FuaXRpemVkLiBPbmx5IHVzZSBkaXNhYmxlU2FuaXRpemU9dHJ1ZSBmb3IgdHJ1c3RlZCBvciBjb250cm9sbGVkIHNvdXJjZXMuYFxuXG4gICAgICAgICAgaWYgKGVudiA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNweW5lSlMgc2VjdXJpdHkgcG9saWN5IHZpb2xhdGlvbjogZGlzYWJsZVNhbml0aXplPXRydWUgaXMgbm90IGFsbG93ZWQgaW4gcHJvZHVjdGlvbiAoJHt1cmx9KS5gKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGAlYyR7bXNnfWAsXG4gICAgICAgICAgICAgICdjb2xvcjojZjMzO2ZvbnQtd2VpZ2h0OmJvbGQ7J1xuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNhbml0aXplZERhdGEgPSBkaXNhYmxlU2FuaXRpemUgPyBkYXRhIDogc2FuaXRpemVEYXRhKGRhdGEpXG4gICAgICAgIHJldHVybiBtYXBNZXRob2Qoc2FuaXRpemVkRGF0YSwgbWV0YWRhdGEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coJ1NFUlZFUiBPUFRJT05TICcsIHsgcHJvcHMsIHNlcnZlck9wdGlvbnMgfSlcblxuICAgIGNvbnN0IHJlc3BvbnNlJCA9IGZyb20od2luZG93LmZldGNoKHVybCwgc2VydmVyT3B0aW9ucykpXG4gICAgICAucGlwZSh0YXAodGFwTG9nKSwgZmxhdE1hcChyID0+IGZyb20ocltyZXNwb25zZVR5cGVdKCkpKSxcbiAgICAgICAgbWFwKG1hcFdyYXBwZXIobWFwRm4pKSxcbiAgICAgICAgcHVibGlzaCgpKVxuXG4gICAgcmVzcG9uc2UkLmNvbm5lY3QoKVxuXG4gICAgcmVzcG9uc2UkLnN1YnNjcmliZShzdWJzY3JpYmVyKVxuICB9XG5cbiAgc3RhdGljIHNldE1hcEZuKG9wdHMpIHtcbiAgICBjb25zdCBnZXRGbiA9IGNvbXBvc2UoZGVmYXVsdFRvKChwKSA9PiBwKSwgcHJvcCgnbWFwRm4nKSlcbiAgICByZXR1cm4gZ2V0Rm4ob3B0cylcbiAgfVxuXG4gIHN0YXRpYyBzZXRVcmwob3B0cykge1xuICAgIGNvbnN0IHVybCA9IHByb3AoJ3VybCcsIG9wdHMpXG4gICAgaWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NQWU5FIFdBUk5JTkc6IFVSTCBpcyB1bmRlZmluZWQgZm9yIGRhdGEgY2hhbm5lbCcpXG4gICAgfVxuICAgIHJldHVybiB1cmxcbiAgfVxuXG4gIHN0YXRpYyBzZXRSZXNwb25zZVR5cGUob3B0cykge1xuICAgIHJldHVybiBkZWZhdWx0VG8oJ2pzb24nLCBwcm9wKCdyZXNwb25zZVR5cGUnLCBvcHRzKSlcbiAgfVxuXG4gIGdldCBtYXBGbigpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwRm5cbiAgfVxuXG4gIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybFxuICB9XG5cbiAgZ2V0IHNlcnZlck9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlck9wdGlvbnNcbiAgfVxuXG4gIGdldCByZXNwb25zZVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlVHlwZVxuICB9XG5cbiAgc3RhdGljIHN0cmluZ2lmeUJvZHlJZkl0RXhpc3RzKG9iaikge1xuICAgIGNvbnN0IGNvbnZlcnRUb0pTT04gPSB3aGVuKHByb3BJcyhPYmplY3QsICdib2R5JyksIGNvbXBvc2Uob3ZlcihsZW5zUHJvcCgnYm9keScpLCBKU09OLnN0cmluZ2lmeSkpKVxuXG4gICAgcmV0dXJuIGNvbnZlcnRUb0pTT04ob2JqKVxuICB9XG5cbiAgc3RhdGljIHVwZGF0ZU1ldGhvZFdoZW5Cb2R5RXhpc3RzKG9wdHMpIHtcbiAgICBjb25zdCBoYXNCb2R5ID0gaGFzKCdib2R5JylcbiAgICBjb25zdCBtZXRob2RJc0dldCA9IHByb3BFcSgnR0VUJywgJ21ldGhvZCcpXG4gICAgY29uc3QgcHJlZCA9IGFsbFBhc3MoW2hhc0JvZHksIG1ldGhvZElzR2V0XSlcbiAgICByZXR1cm4gd2hlbihwcmVkLCBhc3NvYygnbWV0aG9kJywgJ1BPU1QnKSkob3B0cylcbiAgfVxuXG4gIHN0YXRpYyBzZXRTZXJ2ZXJPcHRpb25zKG9wdHMpIHtcbiAgICBjb25zdCBvcHRpb25zID0gcGljayhbXG4gICAgICAnbWV0aG9kJyxcbiAgICAgICdoZWFkZXJzJyxcbiAgICAgICdib2R5JyxcbiAgICAgICdtb2RlJyxcbiAgICAgICdjcmVkZW50aWFscycsXG4gICAgICAnY2FjaGUnLFxuICAgICAgJ3JlZGlyZWN0JyxcbiAgICAgICdyZWZlcnJlcicsXG4gICAgICAncmVmZXJyZXJQb2xpY3knLFxuICAgICAgJ2ludGVncml0eScsXG4gICAgICAna2VlcGFsaXZlJ1xuICAgIF0sIG9wdHMpXG4gICAgbGV0IG1lcmdlZE9wdGlvbnMgPSBtZXJnZURlZXBSaWdodChDaGFubmVsRmV0Y2hVdGlsLmJhc2VPcHRpb25zKCksIG9wdGlvbnMpXG4gICAgbWVyZ2VkT3B0aW9ucyA9IENoYW5uZWxGZXRjaFV0aWwudXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMobWVyZ2VkT3B0aW9ucylcbiAgICBtZXJnZWRPcHRpb25zID0gQ2hhbm5lbEZldGNoVXRpbC5zdHJpbmdpZnlCb2R5SWZJdEV4aXN0cyhtZXJnZWRPcHRpb25zKVxuICAgIHJldHVybiBtZXJnZWRPcHRpb25zXG4gIH1cblxuICBzdGF0aWMgYmFzZU9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsIC8vIERlZmF1bHQgbWV0aG9kXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKidcbiAgICAgIH0pLFxuICAgICAgbW9kZTogJ2NvcnMnLCAvLyBEZWZhdWx0IG1vZGVcbiAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLCAvLyBEZWZhdWx0IGNyZWRlbnRpYWxzIHBvbGljeVxuICAgICAgY2FjaGU6ICdkZWZhdWx0JywgLy8gRGVmYXVsdCBjYWNoZSBwb2xpY3lcbiAgICAgIHJlZGlyZWN0OiAnZm9sbG93JywgLy8gRGVmYXVsdCByZWRpcmVjdCBwb2xpY3lcbiAgICAgIHJlZmVycmVyOiAnY2xpZW50JywgLy8gRGVmYXVsdCByZWZlcnJlciBwb2xpY3lcbiAgICAgIHJlZmVycmVyUG9saWN5OiAnbm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGUnLCAvLyBEZWZhdWx0IHJlZmVycmVyIHBvbGljeVxuICAgICAgaW50ZWdyaXR5OiAnJywgLy8gRGVmYXVsdCBpbnRlZ3JpdHlcbiAgICAgIGtlZXBhbGl2ZTogZmFsc2UgLy8gRGVmYXVsdCBrZWVwYWxpdmVcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGlzLFxuICByZWplY3QsXG4gIGlzTmlsLFxuICBmaW5kLFxuICBhbGxQYXNzLFxuICBmb3JFYWNoT2JqSW5kZXhlZCxcbiAgbm90LFxuICBpc0VtcHR5LFxuICBhbHdheXMsXG4gIGNvbXBvc2UsXG4gIGVxdWFscyxcbiAgcHJvcCxcbiAgd2hlcmUsXG4gIGRlZmF1bHRUbyxcbiAgbWVyZ2VBbGwsXG4gIEYsXG4gIG9taXQsXG4gIGZsYXR0ZW4sXG4gIGFueSxcbiAgY3VycnksXG4gIGx0ZVxuICAsIG1hcCBhcyByTWFwXG59IGZyb20gJ3JhbWRhJ1xuXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5jb25zdCBpc05vdEFyciA9IGNvbXBvc2Uobm90LCBpcyhBcnJheSkpXG5jb25zdCBpc05vdEVtcHR5ID0gY29tcG9zZShub3QsIGlzRW1wdHkpXG5jb25zdCBpc05vbkVtcHR5U3RyID0gYWxsUGFzcyhbaXMoU3RyaW5nKSwgaXNOb3RFbXB0eV0pXG5jb25zdCBpc05vbkVtcHR5QXJyID0gYWxsUGFzcyhbaXMoQXJyYXkpLCBpc05vdEVtcHR5XSlcbmNvbnN0IGlzT2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90QXJyLCBpcyhPYmplY3QpXSkpXG5jb25zdCBpc05vbkVtcHR5T2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90QXJyLCBpcyhPYmplY3QpXSkpXG5cbmNvbnN0IGlzU3RyaW5nICA9ICh2YWwpID0+IGlzKFN0cmluZywgdmFsKVxuY29uc3QgaXNCb29sZWFuID0gKHZhbCkgPT4gaXMoQm9vbGVhbiwgdmFsKVxuY29uc3QgaXNOdW1iZXIgID0gKHZhbCkgPT4gaXMoTnVtYmVyLCB2YWwpXG5jb25zdCBpc0FycmF5Rm4gPSAodmFsKSA9PiBpcyhBcnJheSwgdmFsKVxuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFBheWxvYWRGaWx0ZXIge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsUGF5bG9hZEZpbHRlclxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgdXRpbGl0eSBmaWx0ZXJzIENoYW5uZWxQYXlsb2FkIG9iamVjdHMgYnkgdXNpbmcgcXVlcnkgc2VsZWN0b3JzIGFuZC9vciBieSBjb21wYXJpbmcgZGF0YSBwcm9wZXJ0aWVzPC9wPlxuICAgKiA8aDM+VGhlIENoYW5uZWxQYXlsb2FkRmlsdGVyIGZlYXR1cmVzPC9oMz5cbiAgICogPHVsPlxuICAgKiAgIDxsaT5DYW4gYmUgdXNlZCBieSBDaGFubmVscyBhbmQgVmlld1N0cmVhbXM8L2xpPlxuICAgKiAgIDxsaT5DaGFubmVsUGF5bG9hZEZpbHRlciBpbnN0YW5jZXMgY2FuIGJlIHVzZWQgYXMgdGhlIHRoaXJkIHBhcmFtZXRlciB3aGVuIGJpbmRpbmcgYWN0aW9ucyB0byBWaWV3U3RyZWFtIG1ldGhvZHMuPC9saT5cbiAgICogICA8bGk+U2VsZWN0b3JzIGNhbiBiZSBhIHF1ZXJ5IHN0cmluZywgYW4gYXJyYXkgb2Ygc2VsZWN0b3Igc3RyaW5ncywgb3IgdGhlIHNlbGVjdG9yIGNhbiBiZSBhbiBhY3R1YWwgZG9tIGVsZW1lbnQuPC9saT5cbiAgICogICA8bGk+U2VsZWN0b3JzIGFyZSBub3QgcmVxdWlyZWQgYW5kIGNhbiBiZSBkaXNyZWdhcmRlZCBieSBhZGRpbmcgXCJcIiBvciB1bmRlZmluZWQgYXMgdGhlIHNlbGVjdG9yIHByb3BlcnR5LjwvbGk+XG4gICAqICAgPGxpPlRoZSBkYXRhIG9iamVjdCBjb21wYXJlcyB0aGUgdmFsdWVzIGZyb20gdGhlIHByb3BzKCkgbWV0aG9kIG9mIGEgQ2hhbm5lbFBheWxvYWQgb2JqZWN0PC9saT5cbiAgICogICA8bGk+SW50ZXJuYWxseSwgVGhlIGRhdGEgb2JqZWN0IGlzIGNvbmZvcm1lZCB0byBhIHNwZWMgb2JqZWN0IGZvciByYW1kYSZyc3F1bztzIEVYVFsnd2hlcmUnLCAnLy9yYW1kYWpzLmNvbS9kb2NzLyN3aGVyZSddIG1ldGhvZDwvbGk+XG4gICAqICAgPC91bD5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfEFycmF5fEhUTUxFbGVtZW50fSBzZWxlY3RvciBUaGUgbWF0Y2hpbmcgZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gZmlsdGVycyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0b3IsIHByb3BzLCBhbmQgZGVidWdMYWJlbCBwYXJhbXMuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wRmlsdGVycyBBIGpzb24gb2JqZWN0IGNvbnRhaW5pbmcgZmlsdGVyaW5nIG1ldGhvZHMgZm9yIGNoYW5uZWwgcHJvcHMgdmFyaWFibGVzLlxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ3xBcnJheXxIVE1MRWxlbWVudH0gc2VsZWN0b3IgLSA9ICcnOyBUaGUgbWF0Y2hpbmcgZWxlbWVudC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BGaWx0ZXJzIC0gPSB7fTsgQSBqc29uIG9iamVjdCBjb250YWluaW5nIGNvbXByYXRvcnMgZm9yIGFueSBleHBlY3RlZCBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIEJvb2xlYW5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5GaWx0ZXJpbmcgdXNpbmcgU2VsZWN0b3JzIGFuZCBhIFByb3BlcnR5IENvbXBhcmF0b3IgV2l0aGluIGEgVmlld1N0cmVhbSBJbnN0YW5jZTwvaDQ+J11cbiAgICogICAgY29uc3QgbXlTZWxlY3RvcnMgPSBbJ3VsJywgJ2xpOmZpcnN0LWNoaWxkJ107XG4gICAqICAgIGNvbnN0IHByb3BGaWx0ZXJzID0ge1xuICAgKiAgICAgIGxpbmtUeXBlOiBcImV4dGVybmFsXCJcbiAgICogICAgfTtcbiAgICogICAgY29uc3QgbXlGaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIobXlTZWxlY3RvcnMsIHByb3BGaWx0ZXJzKTtcbiAgICpcbiAgICogICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgIHJldHVybiBbXG4gICAqICAgICAgICAgICAgICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCBteUZpbHRlcl1cbiAgICogICAgICAgICAgICAgXVxuICAgKiAgICAgICAgICB9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+RmlsdGVyaW5nIFVzaW5nIE1ldGhvZCBhbmQgU3RyaW5nIENvbXBhcmF0b3JzIFdpdGhpbiBhIFZpZXdTdHJlYW0gSW5zdGFuY2U8L2g0PiddXG4gICAqICAgIGNvbnN0IHByb3BGaWx0ZXJzID0ge1xuICAgKiAgICAgIHR5cGU6IFwic2Nyb2xsaW5nLWVsZW1lbnRcIixcbiAgICogICAgICBzY3JvbGxOdW06ICAobik9Pm4+PTEyMDAgJiYgbjw9NTAwMDtcbiAgICogICAgfTtcbiAgICogICAgY29uc3QgbXlGaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIoJycsIHByb3BGaWx0ZXJzKTtcbiAgICpcbiAgICogICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgIHJldHVybiBbXG4gICAqICAgICAgICAgICAgICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCBteUZpbHRlcl1cbiAgICogICAgICAgICAgICAgXVxuICAgKiAgICAgICAgICB9XG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+QSBTaW1wbGUgUHJvcGVydHkgRmlsdGVyaW5nIEV4YW1wbGUgV2l0aGluIGEgQ2hhbm5lbCBJbnN0YW5jZTwvaDQ+J11cbiAgICogLy8gRmlsdGVyIGZvciBhIGJ1dHRvbiB3aXRoIGEgZGF0YSB0eXBlIG9mICdsaW5rJ1xuICAgKiBjb25zdCBteUZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcignJyB7dHlwZTogXCJsaW5rXCJ9KTtcbiAgICpcbiAgICogdGhpcy5nZXRDaGFubmVsKFwiQ0hBTk5FTF9VSVwiKVxuICAgKiAucGlwZShmaWx0ZXIobXlGaWx0ZXIpKVxuICAgKiAuc3Vic2NyaWJlKG15Q2hhbm5lbE1ldGhvZCk7XG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzZWxlY3RvciwgZmlsdGVycyA9IHt9LCBkZWJ1Z0xhYmVsLCB0ZXN0TW9kZSkge1xuICAgIGNvbnN0IHNlbGVjdG9ySXNPYmogPSBpc09iamVjdEZuKHNlbGVjdG9yKVxuXG4gICAgaWYgKHNlbGVjdG9ySXNPYmopIHtcbiAgICAgIGZpbHRlcnMgPSBzZWxlY3RvclxuICAgICAgc2VsZWN0b3IgPSBwcm9wKCdzZWxlY3RvcicsIGZpbHRlcnMpXG4gICAgICB0ZXN0TW9kZSA9IHRlc3RNb2RlIHx8IHByb3AoJ3Rlc3RNb2RlJywgZmlsdGVycylcbiAgICB9XG5cbiAgICBjb25zdCBkZWJ1Z0xhYmVsQXJyID0gW2RlYnVnTGFiZWwsIHByb3AoJ2RlYnVnTGFiZWwnLCBmaWx0ZXJzKV1cblxuICAgIGRlYnVnTGFiZWwgPSBjb21wb3NlKGZpbmQoaXMoU3RyaW5nKSkpKGRlYnVnTGFiZWxBcnIpXG5cbiAgICBsZXQgcHJvcHMgPSBvbWl0KFsnZGVidWdMYWJlbCcsICdsYWJlbCcsICdzZWxlY3RvcicsICdwcm9wcycsICd0ZXN0TW9kZScsICdwcm9wRmlsdGVycyddLCBmaWx0ZXJzKVxuICAgIGlmIChmaWx0ZXJzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BzID0gbWVyZ2VBbGwoW2ZpbHRlcnMucHJvcHMsIHByb3BzXSlcbiAgICB9IGVsc2UgaWYgKGZpbHRlcnMucHJvcEZpbHRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMgPSBtZXJnZUFsbChbZmlsdGVycy5wcm9wRmlsdGVycywgcHJvcHNdKVxuICAgIH1cblxuICAgIGZpbHRlcnMucHJvcEZpbHRlcnMgPSBwcm9wc1xuXG4gICAgY29uc3QgeyBwcm9wRmlsdGVycyB9ID0gZmlsdGVyc1xuXG4gICAgY29uc3QgYWRkU3RyaW5nU2VsZWN0b3JGaWx0ZXIgPSAgaXNOb25FbXB0eVN0cihzZWxlY3RvcikgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJTZWxlY3Rvcihbc2VsZWN0b3JdLCBkZWJ1Z0xhYmVsKSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGFkZEFycmF5U2VsZWN0b3JGaWx0ZXIgPSAgIGlzTm9uRW1wdHlBcnIoc2VsZWN0b3IpID8gQ2hhbm5lbFBheWxvYWRGaWx0ZXIuZmlsdGVyU2VsZWN0b3Ioc2VsZWN0b3IsIGRlYnVnTGFiZWwpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgYWRkRGF0YUZpbHRlciA9IGlzTm9uRW1wdHlPYmplY3RGbihwcm9wRmlsdGVycykgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJEYXRhKHByb3BGaWx0ZXJzLCBkZWJ1Z0xhYmVsKSA6IHVuZGVmaW5lZFxuXG4gICAgbGV0IGZpbHRlcnNBcnIgPSByZWplY3QoaXNOaWwsIFthZGRTdHJpbmdTZWxlY3RvckZpbHRlciwgYWRkQXJyYXlTZWxlY3RvckZpbHRlciwgYWRkRGF0YUZpbHRlcl0pXG5cbiAgICAvLyBJRiBBUlJBWSBJUyBFTVBUWSBBTFdBWVMgUkVUVVJOIEZBTFNFO1xuXG4gICAgY29uc3QgZmlsdGVyc0FyZUVtcHR5ID0gaXNFbXB0eShmaWx0ZXJzQXJyKVxuXG4gICAgaWYgKGZpbHRlcnNBcmVFbXB0eSkge1xuICAgICAgZmlsdGVyc0FyciA9IFthbHdheXMoZmFsc2UpXVxuICAgICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZSAmJiB0ZXN0TW9kZSAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBDaGFubmVsIEZpbHRlciwgd2l0aCBzZWxlY3RvcjogJHtzZWxlY3Rvcn0sIGFuZCBwcm9wRmlsdGVyczoke3Byb3BGaWx0ZXJzfSBhcHBlYXJzIHRvIGJlIGVtcHR5IWApXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0ZXN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IsIHByb3BGaWx0ZXJzLCBkZWJ1Z0xhYmVsLCBmaWx0ZXJzLCB0ZXN0TW9kZSwgZmlsdGVyc0FyZUVtcHR5IH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUGFzcyhmaWx0ZXJzQXJyKVxuICB9XG5cbiAgc3RhdGljIGZpbHRlckRhdGEoZmlsdGVySnNvbiwgZmlsdGVyZGVidWdMYWJlbCkge1xuICAgIGNvbnN0IGRlYnVnTGFiZWwgPSBmaWx0ZXJkZWJ1Z0xhYmVsXG5cbiAgICBjb25zdCBjb21wYXJlRGF0YSA9ICgpID0+IHtcbiAgICAgIC8vIERPIE5PVCBBTExPVyBBTiBFTVBUWSBPQkpFQ1QgVE8gUkVUVVJOIFRSVUVzXG4gICAgICBpZiAoaXNFbXB0eShmaWx0ZXJKc29uKSkge1xuICAgICAgICByZXR1cm4gYWx3YXlzKGZhbHNlKVxuICAgICAgfVxuXG4gICAgICAvLyAgQ0hFQ0tTIEFMTCBWQUxVRVMgSU4gSlNPTiBUTyBERVRFUk1JTkUgSUYgVEhFUkUgQVJFIEZJTFRFUklORyBNRVRIT0RTXG5cbiAgICAgIGNvbnN0IGNyZWF0ZUN1cnJ5Q29tcGFyYXRvciA9IGNvbXBhcmVTdHIgPT4gKHN0cikgPT4ge1xuICAgICAgICByZXR1cm4gc3RyID09PSBjb21wYXJlU3RyXG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja1RvQ29udmVydFRvRm4gPSAodmFsLCBrZXksIG9iaikgPT4ge1xuICAgICAgICBsZXQgZm5WYWwgPSBGXG4gICAgICAgIGlmIChpc1N0cmluZyh2YWwpIHx8IGlzQm9vbGVhbih2YWwpIHx8IGlzTnVtYmVyKHZhbCkpIHtcbiAgICAgICAgICBmblZhbCA9IGNyZWF0ZUN1cnJ5Q29tcGFyYXRvcih2YWwpXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiB2YWxcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5Rm4odmFsKSB8fCBpc09iamVjdEZuKHZhbCkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBDaGFubmVsUGF5bG9hZEZpbHRlcjogUHJvcGVydHkgXCIke3ZhbH1cIiBpcyBhbiBhcnJheS9vYmplY3QsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiBgICtcbiAgICAgICAgICAgICAgJ1RoaXMgcHJvcGVydHkgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLidcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIGZuVmFsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuVmFsXG4gICAgICB9XG4gICAgICBmaWx0ZXJKc29uID0gck1hcChjaGVja1RvQ29udmVydFRvRm4sIGZpbHRlckpzb24pXG5cbiAgICAgIC8vIFRBUCBMT0dHRVJcbiAgICAgIGNvbnN0IHRhcExvZ2dlciA9IChjb21wYXJlZE9iaikgPT4ge1xuICAgICAgICBpZiAoZGVidWdMYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmVkT2JqXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvcHNCb29sZWFucyA9IHt9XG4gICAgICAgIGNvbnN0IG1hcEJvb2xzID0gKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBwcm9wc0Jvb2xlYW5zW2tleV0gPSB2YWx1ZShwcm9wKGtleSwgY29tcGFyZWRPYmopKVxuICAgICAgICB9XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKG1hcEJvb2xzLCBmaWx0ZXJKc29uKVxuICAgICAgICBjb25zb2xlLmxvZyhgJWMgQ0hBTk5FTCBQQVlMT0FEIEZJTFRFUiBERUJVR0dFUiBbXCIke2RlYnVnTGFiZWx9XCJdIC0gdmFsdWVzOiAgICBgLCAnY29sb3I6b3JhbmdlOycsIHsgcHJvcHNCb29sZWFucywgY29tcGFyZWRPYmogfSlcblxuICAgICAgICByZXR1cm4gY29tcGFyZWRPYmpcbiAgICAgIH1cblxuICAgICAgLy8gRU5EIFRBUCBMT0dHRVJcbiAgICAgIGNvbnN0IGZNZXRob2QgPSB3aGVyZShmaWx0ZXJKc29uKVxuXG4gICAgICBjb25zdCBnZXRGaWx0ZXJpbmdPYmogPSAgKHYpID0+IHtcbiAgICAgICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gdiB8fCB7fVxuICAgICAgICBjb25zdCBvID0gT2JqZWN0LmFzc2lnbih7fSwgdiwgc3JjRWxlbWVudCwgZXZlbnQsIHBheWxvYWQpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdvIGlzICcsbyk7XG4gICAgICAgIHJldHVybiBvXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wb3NlKGZNZXRob2QsIHRhcExvZ2dlciwgZGVmYXVsdFRvKHt9KSwgZ2V0RmlsdGVyaW5nT2JqKVxuICAgIH1cblxuICAgIHJldHVybiBjb21wYXJlRGF0YSgpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tQYXlsb2FkU2VsZWN0b3IoYXJyLCBkZWJ1Z0xhYmVsLCBzcmNQYXlsb2FkKSB7XG4gICAgLy8gRUxFTUVOVCBGUk9NIFBBWUxPQURzXG4gICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gc3JjUGF5bG9hZCB8fCB7fVxuXG4gICAgY29uc3QgcmVkdWNlRmluZEVsID0gKGFjYywgc3JjKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IHByb3AoJ2VsJywgc3JjKVxuICAgICAgaWYgKENoYW5uZWxQYXlsb2FkRmlsdGVyLmVsSXNEb21FbGVtZW50KGVsKSAmJiBhY2MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY2MgPSBlbFxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cblxuICAgIGNvbnN0IGVsID0gW3NyY0VsZW1lbnQsIHBheWxvYWQsIHByb3AoJ3NyY0VsZW1lbnQnLCBldmVudCksIHNyY1BheWxvYWRdLnJlZHVjZShyZWR1Y2VGaW5kRWwsIHVuZGVmaW5lZClcblxuICAgIC8vIFJFVFVSTiBCT09MRUFOIE1BVENIIFdJVEggUEFZTE9BRCBFTFxuICAgIGNvbnN0IGNvbXBhcmVFbHMgPSAoZWxDb21wYXJlKSA9PiBlbENvbXBhcmUuaXNFcXVhbE5vZGUoKGVsKSlcblxuICAgIC8vIExPT1AgVEhST1VHSCBOT0RFUyBJTiBxdWVyeVNlbGVjdG9yQWxsKClcbiAgICBjb25zdCBtYXBOb2RlQXJyV2l0aEVsID0gKHNlbCkgPT4ge1xuICAgICAgLy8gY29udmVydCBub2RlbGlzdCB0byBhcnJheSBvZiBlbHNcbiAgICAgIGNvbnN0IG5vZGVBcnIgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsKSlcbiAgICAgIC8vIGVscyBhcnJheSB0byBib29sZWFuIGFycmF5XG4gICAgICByZXR1cm4gck1hcChjb21wYXJlRWxzLCBub2RlQXJyKVxuICAgIH1cblxuICAgIGlmIChkZWJ1Z0xhYmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG5vZGVBcnJSZXN1bHRzRGVidWdnZXIgPSBjb21wb3NlKGZsYXR0ZW4sIHJNYXAobWFwTm9kZUFycldpdGhFbCkpKGFycilcbiAgICAgIGNvbnN0IHNlbGVjdG9yc0FyciA9IGFyclxuICAgICAgY29uc29sZS5sb2coYCVjIENIQU5ORUwgUEFZTE9BRCBGSUxURVIgREVCVUdHRVIgW1wiJHtkZWJ1Z0xhYmVsfVwiXSAtIHNlbGVjdG9yczogYCwgJ2NvbG9yOm9yYW5nZTsnLCB7IGVsLCBzZWxlY3RvcnNBcnIsIG5vZGVBcnJSZXN1bHRzRGVidWdnZXIgfSlcbiAgICB9XG5cbiAgICAvLyBDSEVDSyBJRiBQQVlMT0FEIEVMIEVYSVNUU1xuICAgIGlmICh0eXBlb2YgKGVsKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIExPT1AgVEhST1VHSCBBTEwgU0VMRUNUT1JTIElOIE1BSU4gQVJSQVlcbiAgICBjb25zdCBub2RlQXJyUmVzdWx0ID0gY29tcG9zZShmbGF0dGVuLCByTWFwKG1hcE5vZGVBcnJXaXRoRWwpKShhcnIpXG4gICAgaWYgKGlzRW1wdHkobm9kZUFyclJlc3VsdCkgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiBhbnkoZXF1YWxzKHRydWUpLCBub2RlQXJyUmVzdWx0KVxuICB9XG5cbiAgc3RhdGljIGVsSXNEb21FbGVtZW50KG8pIHtcbiAgICBpZiAoaXMoU3RyaW5nLCBvKSkge1xuICAgICAgbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobylcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpKG8pXG4gIH1cblxuICBzdGF0aWMgZmlsdGVyU2VsZWN0b3Ioc2VsZWN0b3JBcnIsIGRlYnVnTGFiZWwpIHtcbiAgICBjb25zdCBhcnIgPSByZWplY3QoaXNFbXB0eSwgc2VsZWN0b3JBcnIpXG4gICAgY29uc3QgcGF5bG9hZENoZWNrID0gY3VycnkoQ2hhbm5lbFBheWxvYWRGaWx0ZXIuY2hlY2tQYXlsb2FkU2VsZWN0b3IpXG4gICAgcmV0dXJuIHBheWxvYWRDaGVjayhhcnIsIGRlYnVnTGFiZWwpXG4gIH1cbn1cbiIsImZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbCkge1xuICBjb25zdCBub25OdWxsT2JqZWN0ID0gdmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnXG4gIHJldHVybiBub25OdWxsT2JqZWN0ICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpICE9PSAnW29iamVjdCBSZWdFeHBdJyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSAhPT0gJ1tvYmplY3QgRGF0ZV0nXG59XG5cbmZ1bmN0aW9uIGVtcHR5VGFyZ2V0KHZhbCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gW10gOiB7fVxufVxuXG5mdW5jdGlvbiBjbG9uZUlmTmVjZXNzYXJ5KHZhbHVlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgY29uc3QgY2xvbmUgPSBvcHRpb25zQXJndW1lbnQgJiYgb3B0aW9uc0FyZ3VtZW50LmNsb25lID09PSB0cnVlXG4gIHJldHVybiAoY2xvbmUgJiYgaXNNZXJnZWFibGVPYmplY3QodmFsdWUpKVxuICAgID8gZGVlcE1lcmdlKGVtcHR5VGFyZ2V0KHZhbHVlKSxcbiAgICAgIHZhbHVlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgOiB2YWx1ZVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gdGFyZ2V0LnNsaWNlKClcbiAgc291cmNlLmZvckVhY2goZnVuY3Rpb24oZSwgaSkge1xuICAgIGlmICh0eXBlb2YgZGVzdGluYXRpb25baV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBkZXN0aW5hdGlvbltpXSA9IGNsb25lSWZOZWNlc3NhcnkoZSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QoZSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2ldID0gZGVlcE1lcmdlKHRhcmdldFtpXSwgZSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSBpZiAodGFyZ2V0LmluZGV4T2YoZSkgPT09IC0xKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGNsb25lSWZOZWNlc3NhcnkoZSwgb3B0aW9uc0FyZ3VtZW50KSlcbiAgICB9XG4gIH0pXG4gIHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBtZXJnZU9iamVjdCh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0ge31cbiAgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldCkpIHtcbiAgICBPYmplY3Qua2V5cyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gY2xvbmVJZk5lY2Vzc2FyeSh0YXJnZXRba2V5XSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0pXG4gIH1cbiAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICghaXNNZXJnZWFibGVPYmplY3Qoc291cmNlW2tleV0pIHx8ICF0YXJnZXRba2V5XSkge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGNsb25lSWZOZWNlc3Nhcnkoc291cmNlW2tleV0sIG9wdGlvbnNBcmd1bWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGRlZXBNZXJnZSh0YXJnZXRba2V5XSwgc291cmNlW2tleV0sIG9wdGlvbnNBcmd1bWVudClcbiAgICB9XG4gIH0pXG4gIHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudCkge1xuICBjb25zdCBhcnJheSA9IEFycmF5LmlzQXJyYXkoc291cmNlKVxuICBjb25zdCBvcHRpb25zID0gb3B0aW9uc0FyZ3VtZW50IHx8IHsgYXJyYXlNZXJnZTogZGVmYXVsdEFycmF5TWVyZ2UgfVxuICBjb25zdCBhcnJheU1lcmdlID0gb3B0aW9ucy5hcnJheU1lcmdlIHx8IGRlZmF1bHRBcnJheU1lcmdlXG5cbiAgaWYgKGFycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGFyZ2V0KVxuICAgICAgPyBhcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgICA6IGNsb25lSWZOZWNlc3Nhcnkoc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gIH1cbn1cblxuZGVlcE1lcmdlLmFsbCA9IGZ1bmN0aW9uIGRlZXBtZXJnZUFsbChhcnJheSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJheSkgfHwgYXJyYXkubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXkgd2l0aCBhdCBsZWFzdCB0d28gZWxlbWVudHMnKVxuICB9XG5cbiAgLy8gd2UgYXJlIHN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IDIgdmFsdWVzLCBzbyBpdCBpcyBzYWZlIHRvIGhhdmUgbm8gaW5pdGlhbCB2YWx1ZVxuICByZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uKHByZXYsIG5leHQpIHtcbiAgICByZXR1cm4gZGVlcE1lcmdlKHByZXYsIG5leHQsIG9wdGlvbnNBcmd1bWVudClcbiAgfSlcbn1cblxuZXhwb3J0IHsgZGVlcE1lcmdlIH1cbiIsImltcG9ydCB7IGRlZmF1bHRUbywgbWF0Y2gsIGZvckVhY2gsIHRlc3QsIGluY2x1ZGVzLCB3aXRob3V0LCBjb21wbGVtZW50LCBpc0VtcHR5LCB2YWx1ZXMsIGlzTmlsLCBmaWx0ZXIsIF9fLCBrZXlzLCBjb21wb3NlLCBoZWFkLCBtYXAsIGNvbmQsIFQsIGFsbFBhc3MsIGNvbmNhdCwgdW5pcSB9IGZyb20gJ3JhbWRhJ1xuY29uc3QgaXNJT1MgPSAoKSA9PiB7XG4gIGNvbnN0IHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKClcbiAgLy8gbGV0IHNhZmFyaSA9IC9zYWZhcmkvLnRlc3QodXNlckFnZW50KTtcbiAgY29uc3QgaW9zID0gL2lwaG9uZXxpcG9kfGlwYWQvLnRlc3QodXNlckFnZW50KVxuICByZXR1cm4gaW9zID09PSB0cnVlXG59XG5cbmNvbnN0IGRlbGF5Q2FsbCA9IGFzeW5jKGZuLCB0aW1lKSA9PiB7XG4gIGZ1bmN0aW9uIHNsZWVwKG1zKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG4gIH1cblxuICBjb25zdCB0aW1lb3V0SGFuZGxlciA9IGFzeW5jKCkgPT4ge1xuICAgIGF3YWl0IHNsZWVwKDEpXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbilcbiAgfVxuXG4gIHdpbmRvdy5zZXRUaW1lb3V0KHRpbWVvdXRIYW5kbGVyLCB0aW1lKVxufVxuXG5jb25zdCBnZXRDb25zdHJ1Y3Rvck5hbWUgPSAob2JqKSA9PiB7XG4gIGlmIChvYmouY29uc3RydWN0b3IubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG9iai5jb25zdHJ1Y3Rvci5uYW1lXG4gIH1cbiAgY29uc3QgcmUgPSAvXihmdW5jdGlvblxccykoXFx3KykoXFwoLiopJC9cbiAgY29uc3Qgc3RyID0gb2JqLnRvU3RyaW5nKClcbiAgcmV0dXJuIGRlZmF1bHRUbyhTdHJpbmcoc3RyKS5zdWJzdHIoMCwgMTIpLCBtYXRjaChyZSwgc3RyKVsyXSlcbn1cblxuY29uc3QgYXJyRnJvbU1hcEtleXMgPSAobWFwKSA9PiB7XG4gIGNvbnN0IGFyciA9IFtdXG4gIGNvbnN0IGFkZEtleXNUb0FyciA9ICh2LCBrLCBpKSA9PiBhcnIucHVzaChrKVxuICBmb3JFYWNoKGFkZEtleXNUb0FyciwgbWFwKVxuICByZXR1cm4gYXJyXG59XG5cbmNvbnN0IGZpbmRTdHJGcm9tUmVnZXhBcnIgPSAob2JqLCBzdHIpID0+IHtcbiAgaWYgKG9ialtzdHJdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cbiAgY29uc3QgY2hlY2tJZk1hdGNoID0gcyA9PiB0ZXN0KG5ldyBSZWdFeHAocyksIHN0cilcbiAgY29uc3QgY2hlY2tTdHJNYXRjaCA9IGluY2x1ZGVzKHN0cilcbiAgY29uc3QgY2hlY2tJZlJlZ0V4TWF0Y2ggPSBjb21wb3NlKGluY2x1ZGVzKHRydWUpLCBtYXAoY2hlY2tJZk1hdGNoKSlcbiAgY29uc3QgcnVuTWF0Y2hDaGVja3MgPSBjb25kKFtcbiAgICBbY2hlY2tTdHJNYXRjaCwgKCkgPT4gc3RyXSxcbiAgICBbY2hlY2tJZlJlZ0V4TWF0Y2gsICgpID0+IHN0cl0sXG4gICAgW1QsICgpID0+IHVuZGVmaW5lZF1cbiAgXSlcbiAgcmV0dXJuIHJ1bk1hdGNoQ2hlY2tzKG9iailcbn1cblxuY29uc3QgZmluZFN0ck9yUmVnZXhNYXRjaFN0ciA9IChvYmosIHN0cikgPT4ge1xuICBpZiAob2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdHJcbiAgfVxuICBjb25zdCBjcmVhdGVSZSA9IHMgPT4gbmV3IFJlZ0V4cChzKVxuICBjb25zdCBjaGVja2VySWZSZWdleE1hdGNoRXhpc3RzID0gY29tcG9zZShoZWFkLCBmaWx0ZXIoY29tcG9zZSh0ZXN0KF9fLCBzdHIpLCBjcmVhdGVSZSkpKVxuICByZXR1cm4gY2hlY2tlcklmUmVnZXhNYXRjaEV4aXN0cyhrZXlzKG9iaikpXG59XG5cbmNvbnN0IGNsb3Nlc3QgPSAoYXJyYXksIG51bSkgPT4ge1xuICBsZXQgaSA9IDBcbiAgbGV0IG1pbkRpZmYgPSAxMDAwXG4gIGxldCBhbnNcbiAgZm9yIChpIGluIGFycmF5KSB7XG4gICAgY29uc3QgbSA9IE1hdGguYWJzKG51bSAtIGFycmF5W2ldKVxuICAgIGlmIChtIDwgbWluRGlmZikge1xuICAgICAgbWluRGlmZiA9IG1cbiAgICAgIGFucyA9IGFycmF5W2ldXG4gICAgfVxuICB9XG4gIHJldHVybiBhbnNcbn1cblxuY29uc3QgY29udmVydERvbVN0cmluZ01hcFRvT2JqID0gKGRvbU1hcCkgPT4ge1xuICBjb25zdCBvYmogPSB7fVxuICBmb3IgKGNvbnN0IGQgaW4gZG9tTWFwKSB7XG4gICAgb2JqW2RdID0gZG9tTWFwW2RdXG4gIH1cbiAgcmV0dXJuIG9ialxufVxuXG4vLyBjb25zdCBwYXNzUGFnZURhdGEgPSBwaWNrKFsncGFyYW1zJywgJ3JvdXRlSWQnLCAnZGF0YSddLCBfXyk7XG5cbmNvbnN0IHN1YnNjcmliZUZuID0ge1xuICBuZXh0OiAgICAgeCA9PiBjb25zb2xlLmxvZyhgbmV4dCAgICAgICR7eH1gKSxcbiAgZXJyb3I6ICAgIHggPT4gY29uc29sZS5sb2coYGVycm9yICAgICAke3h9YCksXG4gIGNvbXBsZXRlOiB4ID0+IGNvbnNvbGUubG9nKGBjb21wbGV0ZSAgJHt4fWApXG59XG5cbmNvbnN0IHJpZ2h0ID0geCA9PiAoe1xuICBtYXA6IGYgPT4gcmlnaHQoZih4KSksXG4gIGZvbGQ6IChmLCBnKSA9PiBnKHgpLFxuICBpbnNwZWN0OiAoKSA9PiBgcmlnaHQoJHt4fSlgXG5cbn0pXG5cbmNvbnN0IGlmTmlsVGhlblVwZGF0ZSA9ICh2YWwsIG5ld1ZhbCkgPT4ge1xuICBjb25zdCBpc05pbEJvb2wgPSBpc05pbCh2YWwpXG4gIHJldHVybiBpc05pbEJvb2wgPyBuZXdWYWwgOiB2YWxcbn1cblxuY29uc3QgbGVmdCA9IHggPT4gKHtcbiAgbWFwOiBmID0+IGxlZnQoeCksXG4gIGZvbGQ6IChmLCBnKSA9PiBmKHgpLFxuICBpbnNwZWN0OiAoKSA9PiBgbGVmdCgke3h9KWBcbn0pXG5cbmNvbnN0IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgPSAob2JqKSA9PiB7XG4gIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNFbXB0eSksIGhlYWQsIHZhbHVlcylcbiAgY29uc3QgaXNOb3ROaWwgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNOaWwpLCBoZWFkLCB2YWx1ZXMpXG4gIGNvbnN0IGlzTm90TmlsQW5kSXNOb3RFbXB0eSA9IGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90TmlsXSlcbiAgcmV0dXJuIGlzTm90TmlsQW5kSXNOb3RFbXB0eShvYmopXG59XG5cbmNvbnN0IGZyb21OdWxsYWJsZSA9IHggPT4geCAhPT0gbnVsbCA/IHJpZ2h0KHgpIDogbGVmdChudWxsKVxuXG5jb25zdCBmaW5kSW5PYmogPSAob2JqLCB2YWwsIGVycm9yID0gbnVsbCkgPT4ge1xuICBjb25zdCBmb3VuZCA9IG9ialt2YWxdXG4gIHJldHVybiBmb3VuZCA/IHJpZ2h0KGZvdW5kKSA6IGxlZnQoZXJyb3IpXG59XG5jb25zdCBwdWxsUm91dGVJbmZvID0gKCkgPT4ge1xuICBjb25zdCBzdHIgPSBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgod2luZG93LmxvY2F0aW9uLmhhc2gpXG4gIGNvbnN0IHJvdXRlSWQgPSBwdWxsTWFpblJvdXRlKHN0cilcbiAgY29uc3QgcGFyYW1zID0gcHVsbFBhcmFtcyhzdHIpXG4gIHJldHVybiB7IHJvdXRlSWQsIHBhcmFtcyB9XG59XG5cbmZ1bmN0aW9uIGdldEFsbE1ldGhvZE5hbWVzKGluc3RhbmNlLCBvbWl0dGVkTWV0aG9kcyA9IFtdKSB7XG4gIC8vIE9wdGlvbmFsbHkgcmVuYW1lIGBpbnN0YW5jZWAgdG8gc29tZXRoaW5nIG1vcmUgZGVzY3JpcHRpdmU6XG4gIGNvbnN0IGJhc2VDbGFzc01ldGhvZHNBcnIgPSBbJ2xlbmd0aCcsICduYW1lJywgJ3Byb3RvdHlwZScsICdjb25zdHJ1Y3RvciddXG4gIGNvbnN0IGNvbWJpbmVkT21pdHRlZE1ldGhvZHMgPSBjb25jYXQoYmFzZUNsYXNzTWV0aG9kc0Fyciwgb21pdHRlZE1ldGhvZHMpXG5cbiAgLy8gRmlsdGVyIG91dCBvbWl0dGVkXG4gIGNvbnN0IG9taXRQcm9wc0Zyb21BcnIgPSBjb21wb3NlKHdpdGhvdXQoY29tYmluZWRPbWl0dGVkTWV0aG9kcyksIHVuaXEpXG5cbiAgLy8gUHVsbCBvdXQgaW5zdGFuY2UgbWV0aG9kc1xuICBjb25zdCBtZXRob2RzID0gb21pdFByb3BzRnJvbUFycihcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbnN0YW5jZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpXG4gIClcblxuICAvLyBQdWxsIG91dCBzdGF0aWMgbWV0aG9kc1xuICBjb25zdCBzdGF0aWNNZXRob2RzID0gb21pdFByb3BzRnJvbUFycihcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbnN0YW5jZS5jb25zdHJ1Y3RvcilcbiAgKVxuXG4gIGNvbnN0IGFsbE1ldGhvZHMgPSBjb25jYXQobWV0aG9kcywgc3RhdGljTWV0aG9kcylcblxuICByZXR1cm4geyBtZXRob2RzLCBzdGF0aWNNZXRob2RzLCBhbGxNZXRob2RzIH1cbn1cblxuLyogY29uc3QgZ2V0QWxsTWV0aG9kTmFtZXMzID0gKF90aGlzID0gdGhpcywgb21pdHRlZE1ldGhvZHMgPSBbXSkgPT4ge1xuICBjb25zdCBnZXRQcm9wTmFtZXNBcnIgPSAob2JqID0gdGhpcywgb21pdHRlZE1ldGhvZHMgPSBbXSkgPT4ge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopXG4gIH1cbiAgLy8gRmlsdGVyIE1ldGhvZHNcbiAgY29uc3QgYmFzZUNsYXNzTWV0aG9kc0FyciA9IFsnbGVuZ3RoJywgJ25hbWUnLCAncHJvdG90eXBlJywgJ2NvbnN0cnVjdG9yJ11cbiAgb21pdHRlZE1ldGhvZHMgPSBjb25jYXQoYmFzZUNsYXNzTWV0aG9kc0Fyciwgb21pdHRlZE1ldGhvZHMpXG4gIGNvbnN0IG9taXRQcm9wc0Zyb21BcnIgPSBjb21wb3NlKHdpdGhvdXQob21pdHRlZE1ldGhvZHMpLCB1bmlxKVxuXG4gIC8vIFBVTEwgT1VUIE1FVEhPRCBOQU1FU1xuICBjb25zdCBtZXRob2RzID0gb21pdFByb3BzRnJvbUFycihPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhfdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpKVxuICBjb25zdCBzdGF0aWNNZXRob2RzID0gb21pdFByb3BzRnJvbUFycihnZXRQcm9wTmFtZXNBcnIoX3RoaXMuY29uc3RydWN0b3IpKVxuICBjb25zdCBhbGxNZXRob2RzID0gY29uY2F0KG1ldGhvZHMsIHN0YXRpY01ldGhvZHMpXG5cbiAgcmV0dXJuIHsgbWV0aG9kcywgc3RhdGljTWV0aG9kcywgYWxsTWV0aG9kcyB9XG4gIC8vIHJldHVybiAnZm4nO1xufSAqL1xuXG4vLyBST1VURSBSRUdFWCBFWFBSRVNTSU9OU1xuY29uc3QgcmVtb3ZlU2xhc2hlcyA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihcXC8pKC4qKS9nLCAnJDInKVxuY29uc3Qgcm91dGVSRSA9IC9eKFxcLz8pKFxcdyopKFxcLz8pKC4qKS9nXG5jb25zdCBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGggPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXigjXFwvPykoLiopLywgJyQyJylcbmNvbnN0IHB1bGxTbGFzaEZyb21QYXRoID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoL14oXFwvPykoLiopLywgJyQyJylcbmNvbnN0IHB1bGxNYWluUm91dGUgPSAoc3RyKSA9PiBzdHIucmVwbGFjZShyb3V0ZVJFLCAnJDInKVxuY29uc3QgcHVsbFBhcmFtcyA9ICAgIChzdHIpID0+IHN0ci5yZXBsYWNlKHJvdXRlUkUsICckNCcpXG5jb25zdCBwdWxsVHJhbnNsYXRlWCA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihtYXRyaXgpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKikoLC4qKS8sICckNicpXG5jb25zdCBwdWxsVHJhbnNsYXRlWSA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihtYXRyaXgpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKSguKikvLCAnJDcnKVxuY29uc3QgcHVsbFRyYW5zbGF0ZVlGcm9tSGVhZGVyID0gc3RyID0+IHN0ci5yZXBsYWNlKC9eKHRyYW5zZm9ybTogbWF0cml4KSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCopKFxcKS4qOykvLCAnJDYnKVxuZXhwb3J0IHsgZ2V0Q29uc3RydWN0b3JOYW1lLCBhcnJGcm9tTWFwS2V5cywgZ2V0QWxsTWV0aG9kTmFtZXMsIGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIsIGZpbmRTdHJGcm9tUmVnZXhBcnIsIGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwsIGlzSU9TLCBwdWxsUm91dGVJbmZvLCBwdWxsVHJhbnNsYXRlWUZyb21IZWFkZXIsIHB1bGxTbGFzaEZyb21QYXRoLCBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgsIGNsb3Nlc3QsIHB1bGxUcmFuc2xhdGVZLCBwdWxsVHJhbnNsYXRlWCwgcHVsbE1haW5Sb3V0ZSwgcHVsbFBhcmFtcywgcmlnaHQsIGxlZnQsIGZyb21OdWxsYWJsZSwgZmluZEluT2JqLCBpZk5pbFRoZW5VcGRhdGUsIHJlbW92ZVNsYXNoZXMsIHN1YnNjcmliZUZuLCBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmosIGRlbGF5Q2FsbCB9XG4iLCJpbXBvcnQgeyBmb3JFYWNoIH0gZnJvbSAncmFtZGEnXG5leHBvcnQgZnVuY3Rpb24gZ2MoKSB7XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc3QgbG9vcE0gPSBtID0+IHVuZGVmaW5lZFxuICAgIGZvckVhY2gobG9vcE0sIHRoaXMpXG4gIH1cbiAgc2V0VGltZW91dChjbGVhbnVwLCAxKVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJhc2VDb3JlTWl4aW5zKCkge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZXByb3BzTWFwOiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHdtID0gbmV3IFdlYWtNYXAoKVxuICAgICAgY29uc3Qgb2JqS2V5ID0geyB2c2lkOiB0aGlzLnByb3BzLnZzaWQgfVxuICAgICAgd20uc2V0KG9iaktleSwgdGhpcy5wcm9wcylcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogb2JqS2V5LFxuICAgICAgICB3ZWFrTWFwOiB3bVxuICAgICAgfVxuICAgIH0sXG4gICAgZ2M6IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yIChjb25zdCBtIGluIHRoaXMpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbbV1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzXG4gICAgfSxcbiAgICBjcmVhdGVJZDogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBsZXQgbnVtID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgxMDAwMDAwMCkgKiAxMDAwMDAwMCk7XG4gICAgICAvLyBjb25zdCBudW0gPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOCk7O1xuICAgICAgY29uc3QgbnVtID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvXFxkL2dtLCAnJykuc3Vic3RyaW5nKDEsIDgpXG4gICAgICByZXR1cm4gbnVtKClcbiAgICAgIC8vIHJldHVybiBgdnNpZC0ke251bSgpfWA7XG4gICAgfSxcbiAgICBzZXRUcmFjZUZ1bmM6IGZ1bmN0aW9uKGRlYnVnKSB7XG4gICAgICByZXR1cm4gZGVidWcgPT09IHRydWVcbiAgICAgICAgPyBjb25zb2xlLmxvZ1xuICAgICAgICA6ICgpID0+IHtcbiAgICAgICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWaWV3U3RyZWFtUGF5bG9hZCB9IGZyb20gJy4uLy4uL3ZpZXdzL3ZpZXctc3RyZWFtLXBheWxvYWQuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlU3RyZWFtc01peGlucygpIHtcbiAgcmV0dXJuIHtcbiAgICB0ZXN0RnVuYzogZnVuY3Rpb24oc3RyKSB7XG4gICAgICBjb25zb2xlLmxvZygnc3RyZWFtIG1peGluIGlzICcsIHN0cilcbiAgICB9LFxuICAgIHNlbmRSb3V0ZVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgLyoqIFRPRE86IEFERCBBIENIRUNLIEZPUiBFTkQgUk9VVEUgQU5EIFRSQU5TRk9STSBUTyBFTVBUWSAqL1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnQ0hBTk5FTF9ST1VURScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpXG4gICAgfSxcbiAgICBzZW5kVUlQYXlsb2FkOiBmdW5jdGlvbihvYnMsIGRhdGEpIHtcbiAgICAgIHJldHVybiBuZXcgVmlld1N0cmVhbVBheWxvYWQoJ0NIQU5ORUxfVUknLCBvYnMsIGRhdGEsICdzdWJzY3JpYmUnKVxuICAgIH1cbiAgICAvKlxuICAgIHNlbmRJbmZvVG9DaGFubmVsOiBmdW5jdGlvbihjaGFubmVsTmFtZSwgcGF5bG9hZCkge1xuICAgICAgY29uc3QgZ2V0UHJvcCA9IHN0ciA9PiBwcm9wKHN0ciwgdGhpcy5wcm9wcyk7XG4gICAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbE5hbWU7XG4gICAgICBsZXQgc3JjRWxlbWVudCA9IHtcbiAgICAgICAgdnNpZDogZ2V0UHJvcCgndnNpZCcpLFxuICAgICAgICBlbDogZ2V0UHJvcCgnZWwnKSxcbiAgICAgICAgdmlld05hbWU6IGdldFByb3AoJ25hbWUnKVxuICAgICAgfTtcbiAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICBwYXlsb2FkLCBjaGFubmVsLCBzcmNFbGVtZW50XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZChjaGFubmVsTmFtZSwgbmV3IG9mKCcnKSwgZGF0YSxcbiAgICAgICAgJ3N1YnNjcmliZScpO1xuICAgIH0sXG4gICAgKi9cbiAgICAvKiAgICBzZW5kTGlmZVN0cmVhbVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnTElGRVNUUkVBTScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpO1xuICAgIH0sXG5cbiAgICBjcmVhdGVMaWZlU3RyZWFtUGF5bG9hZDogZnVuY3Rpb24oU1RFUCwgZGF0YSA9IHt9LCB0eXBlID0gJ3BhcmVudCcpIHtcbiAgICAgIGxldCB2aWV3SWQgPSBgJHt0aGlzLnByb3BzLm5hbWV9OiAke3RoaXMucHJvcHMudnNpZH1gO1xuICAgICAgcmV0dXJuIG5ldyBMaWZlc3RyZWFtUGF5bG9hZCgnTElGRVNUUkVBTScsIFNURVAsIHR5cGUsIHZpZXdJZCwgZGF0YSkuZGF0YTtcbiAgICB9ICovXG4gIH1cbn1cbiIsImltcG9ydCB7IFZpZXdTdHJlYW0gfSBmcm9tICcuLi92aWV3cy92aWV3LXN0cmVhbS5qcydcbmltcG9ydCB7IGN1cnJ5IH0gZnJvbSAncmFtZGEnXG5leHBvcnQgY2xhc3MgUm91dGVDaGFubmVsVXBkYXRlciB7XG4gIGNvbnN0cnVjdG9yKGN4dCkge1xuICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcoY3h0LnByb3BzLm5hbWUpXG4gICAgY29uc3QgaWQgPSBgJHtuYW1lfV9ST1VURV9VUERBVEVSYFxuXG4gICAgY29uc3Qgc2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSA9IGN1cnJ5KFJvdXRlQ2hhbm5lbFVwZGF0ZXIuY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iailcbiAgICByZXR1cm4gc2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSh7IGlkLCBuYW1lIH0pXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iaihwcm9wcywgZGF0YSkge1xuICAgIGNvbnN0IHsgbmFtZSwgaWQgfSAgPSBwcm9wc1xuICAgIGNvbnN0IHBheWxvYWQgPSBkYXRhXG4gICAgY29uc3QgdnMgPSBuZXcgVmlld1N0cmVhbSh7XG4gICAgICBpZCwgbmFtZSwgZGF0YVxuICAgIH0pXG5cbiAgICB2cy5vblJlbmRlcmVkID0gKCkgPT4ge1xuICAgICAgdnMuc2VuZEluZm9Ub0NoYW5uZWwoJ0NIQU5ORUxfUk9VVEUnLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIHZzLmFmdGVyQnJvYWRjYXN0RXZlbnRzID0gKCkgPT4ge1xuICAgICAgdnMuZGlzcG9zZVZpZXdTdHJlYW0oKVxuICAgIH1cblxuICAgIHZzLmFwcGVuZFRvTnVsbCgpXG4gIH1cbn1cbiIsImltcG9ydCB7IGNsb25lLCBjb21wb3NlLCBmcm9tUGFpcnMsIGlzLCBwYXRoLCB0b1BhaXJzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5jb25zdCBnZXRQcm9wVHlwZSA9IChwcnApID0+IHtcbiAgbGV0IHR5cGUgPSB0eXBlb2YgcHJwXG4gIGlmIChbJ251bWJlcicsICdib29sZWFuJywgJ3N0cmluZyddLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgdHlwZSA9ICdwcmltaXRpdmUnXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcnApKSB7XG4gICAgICB0eXBlID0gJ2FycmF5J1xuICAgIH0gZWxzZSBpZiAocHJwID09PSBudWxsKSB7XG4gICAgICB0eXBlID0gJ3VuZGVmaW5lZCdcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHR5cGVcbn1cblxuY29uc3QgY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqID0gKHByb3h5T2JqLCBwcm94eVJldml2ZXJNZXRob2QpID0+IHtcbiAgY29uc3QgeyBfX3Byb3h5X19wcm94eU5hbWUgfSA9IHByb3h5T2JqXG5cbiAgaWYgKF9fcHJveHlfX3Byb3h5TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5lcnJvcignb2JqZWN0IGlzIG5vdCBwcm94eSBvYmplY3QgJywgcHJveHlPYmopXG4gIH1cblxuICBjb25zdCBjbG9uZU5lc3RlZFByb3h5T2JqID0gKHRhcmdldCwgcGF0aEFycikgPT4ge1xuICAgIGNvbnN0IG5lc3RlZFByb3h5T2JqID0gcGF0aChwYXRoQXJyLCBwcm94eU9iailcbiAgICBjb25zdCB7IF9fcHJveHlfX2lzUHJveHksIF9fcHJveHlfX3Byb3BzIH0gPSBuZXN0ZWRQcm94eU9ialxuICAgIHJldHVybiBfX3Byb3h5X19pc1Byb3h5ID8gcHJveHlSZXZpdmVyTWV0aG9kKHRhcmdldCwgX19wcm94eV9fcHJvcHMpIDogdGFyZ2V0XG4gIH1cblxuICBjb25zdCByb290T2JqID0gY2xvbmVOZXN0ZWRQcm94eU9iaihjbG9uZShwcm94eU9iaiksIFtdKVxuXG4gIGNvbnN0IHByb3h5SXRlcmFibGUgPSAoaXRlck9iaiwgaXRlclBhdGgpID0+IHtcbiAgICBjb25zdCBkYXRhUGF0aCA9IGl0ZXJQYXRoIHx8IFtdXG4gICAgY29uc3QgbG9vcE9iaiA9IChba2V5LCBwcm9wXSkgPT4ge1xuICAgICAgY29uc3QgdHlwZSA9IGdldFByb3BUeXBlKHByb3ApXG4gICAgICBjb25zdCBjbG9uZWRQYXRoID0gWy4uLmRhdGFQYXRoXVxuICAgICAgY2xvbmVkUGF0aC5wdXNoKGtleSlcbiAgICAgIGlmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGl0ZXJPYmpba2V5XSA9IGNsb25lTmVzdGVkUHJveHlPYmoocHJvcCwgY2xvbmVkUGF0aClcbiAgICAgICAgcHJveHlJdGVyYWJsZShwcm9wLCBjbG9uZWRQYXRoKVxuICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuZW50cmllcyhpdGVyT2JqKS5mb3JFYWNoKGxvb3BPYmopXG4gIH1cblxuICBwcm94eUl0ZXJhYmxlKHJvb3RPYmopXG4gIC8vIGNvbnNvbGUudGltZUVuZCgncHJveGlmeTInKTtcblxuICByZXR1cm4gcm9vdE9ialxufVxuXG5leHBvcnQgY29uc3Qgc2FmZUNsb25lID0gZnVuY3Rpb24obykge1xuICBjb25zdCB7IF9fcHJveHlfX3Byb3h5TmFtZSB9ID0gb1xuICBpZiAoX19wcm94eV9fcHJveHlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBwcm94eVJldml2ZXJNZXRob2QgPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0UHJveHlSZXZpdmVyKF9fcHJveHlfX3Byb3h5TmFtZSlcbiAgICBpZiAodHlwZW9mIHByb3h5UmV2aXZlck1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGNtc0RhdGFSZXZpdmVOZXN0ZWRQcm94eU9iaihvLCBwcm94eVJldml2ZXJNZXRob2QpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSlcbiAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QpXG4gIGNvbnN0IGlzSXRlciA9IG9iID0+IGlzQXJyKG9iKSA9PT0gZmFsc2UgJiYgaXNPYmoob2IpID09PSB0cnVlXG4gIGNvbnN0IGlzSXRlcmFibGUgPSBpc0l0ZXIobylcbiAgcmV0dXJuIGlzSXRlcmFibGUgPyBjb21wb3NlKGZyb21QYWlycywgdG9QYWlycywgY2xvbmUpKG8pIDogY2xvbmUobylcbn1cbiIsIi8vIHNyYy91dGlscy9zYW5pdGl6ZS1kYXRhLmpzXG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmxldCBfc2FuaXRpemVEYXRhXG5sZXQgaXNDb25maWd1cmVkID0gZmFsc2VcbmxldCBmb3JjZVN0cmljdCA9IGZhbHNlIC8vIGxlZ2FjeSBjb21wYXRpYmlsaXR5IHRvZ2dsZVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIE1vZGUgY29uZmlndXJhdGlvbnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IFNBRkVfRk9SX1JJQ0hfVEVYVCA9IHtcbiAgQUxMT1dFRF9UQUdTOiBbXG4gICAgJ2EnLCAnYicsICdpJywgJ2VtJywgJ3N0cm9uZycsICd1JywgJ3AnLCAnYnInLCAndWwnLCAnZGwnLCAnZHQnLCAnZGQnLCAnb2wnLCAnbGknLCAnaHInLFxuICAgICdibG9ja3F1b3RlJywgJ3ByZScsICdjb2RlJywgJ3NwYW4nLCAnZGl2JywgJ3NlY3Rpb24nLCAnYXJ0aWNsZScsICdhc2lkZScsXG4gICAgJ2hlYWRlcicsICdmb290ZXInLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLFxuICAgICd0YWJsZScsICd0aGVhZCcsICd0Ym9keScsICd0cicsICd0ZCcsICd0aCcsICdpbWcnLCAnZmlndXJlJywgJ2ZpZ2NhcHRpb24nLFxuICAgICd2aWRlbycsICdzb3VyY2UnLCAnaWZyYW1lJywgJ2lucHV0JywgJ2J1dHRvbicsICdsYWJlbCcsICdsaW5rJ1xuICBdLFxuICBBRERfVEFHUzogWydpZnJhbWUnLCAnaW5wdXQnLCAnYnV0dG9uJywgJ2xpbmsnXSxcbiAgQUxMT1dFRF9BVFRSOiBbXG4gICAgJ2hyZWYnLCAnc3JjJywgJ2FsdCcsICdjbGFzcycsICd0aXRsZScsICd3aWR0aCcsICdoZWlnaHQnLCAnc3R5bGUnLCAndGFyZ2V0JywgJ3JlbCcsXG4gICAgJ2NvbnRyb2xzJywgJ3Bvc3RlcicsICd0eXBlJywgJ3Jvd3MnLCAnY29scydcbiAgXSxcbiAgQUxMT1dfREFUQV9BVFRSOiB0cnVlLFxuICBGT1JCSURfQVRUUjogWydvbmVycm9yJywgJ29ubG9hZCcsICdvbmNsaWNrJywgJ29ubW91c2VvdmVyJywgJ29uZm9jdXMnLCAnb25ibHVyJywgJ29uY2hhbmdlJ10sXG4gIEZPUkJJRF9UQUdTOiBbJ3NjcmlwdCcsICdvYmplY3QnLCAnZW1iZWQnLCAnbWV0YSddLFxuICBTQUZFX1VSTF9QQVRURVJOOiAvXihodHRwcz86fG1haWx0bzp8dGVsOnxkYXRhOmltYWdlXFwvKS9pXG59XG5cbmNvbnN0IFNBRkVfRk9SX0FQUCA9IHtcbiAgRk9SQklEX1RBR1M6IFsnc2NyaXB0JywgJ2lmcmFtZScsICdvYmplY3QnLCAnZW1iZWQnLCAnZm9ybScsICdpbnB1dCcsICdidXR0b24nLCAnbGluaycsICdtZXRhJ10sXG4gIEZPUkJJRF9BVFRSOiBbJ29uZXJyb3InLCAnb25sb2FkJywgJ29uY2xpY2snLCAnb25tb3VzZW92ZXInLCAnb25mb2N1cycsICdvbmJsdXInLCAnb25jaGFuZ2UnXSxcbiAgQUxMT1dfREFUQV9BVFRSOiBmYWxzZVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIERldGVybWluZSBzYW5pdGl6YXRpb24gbW9kZSBmcm9tIFNweW5lQXBwUHJvcGVydGllc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgcmVzb2x2ZURlZmF1bHRNb2RlID0gKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IG1vZGUgPSBTcHluZUFwcFByb3BlcnRpZXM/Lm1vZGUgfHwgcHJvY2Vzcz8uZW52Py5OT0RFX0VOVlxuICAgIGlmIChtb2RlID09PSAnYXV0aG9yaW5nJyB8fCBtb2RlID09PSAnZGV2ZWxvcG1lbnQnKSByZXR1cm4gJ3JpY2h0ZXh0J1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gRmFsbGJhY2s6IGFzc3VtZSBwcm9kdWN0aW9uIHN0cmljdCBtb2RlXG4gIH1cbiAgcmV0dXJuICdhcHAnXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gbWFrZVNhbml0aXplRm4obW9kZSA9ICdhcHAnKSB7XG4gIGlmIChwcm9jZXNzPy5lbnY/Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgbW9kZSA9ICdyaWNodGV4dCdcbiAgfVxuXG4gIGNvbnN0IGNmZyA9IG1vZGUgPT09ICdyaWNodGV4dCcgPyBTQUZFX0ZPUl9SSUNIX1RFWFQgOiBTQUZFX0ZPUl9BUFBcblxuICByZXR1cm4gKGh0bWwpID0+IHtcbiAgICBsZXQgY2xlYW4gPSBET01QdXJpZnkuc2FuaXRpemUoaHRtbCwgY2ZnKVxuXG4gICAgLy8gSW4gcmljaHRleHQgbW9kZSwgZW5mb3JjZSBzYWZlIFVSTCBzY2hlbWVzIGZvciBocmVmL3NyY1xuICAgIGlmIChtb2RlID09PSAncmljaHRleHQnKSB7XG4gICAgICBjbGVhbiA9IGNsZWFuLnJlcGxhY2UoLzwoYXxpbWcpXFxiKFtePl0rPyk+L2dpLCAobWF0Y2gpID0+IHtcbiAgICAgICAgcmV0dXJuIG1hdGNoLnJlcGxhY2UoL1xcYihocmVmfHNyYyk9XCIoW15cIl0qKVwiL2dpLCAobSwgYXR0ciwgdmFsKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBjbGVhblxuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uZmlndXJlIG9uY2UgKGtlcHQgZm9yIGNvbXBhdGliaWxpdHkpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBzYW5pdGl6ZURhdGFDb25maWd1cmUgPSAoY29uZmlnID0ge30pID0+IHtcbiAgaWYgKGlzQ29uZmlndXJlZCkge1xuICAgIGNvbnNvbGUud2Fybignc2FuaXRpemVEYXRhIGlzIGFscmVhZHkgY29uZmlndXJlZC4gUmVjb25maWd1cmF0aW9uIGlzIG5vdCBhbGxvd2VkLicpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IHN0cmljdCA9IGZhbHNlIH0gPSBjb25maWdcbiAgY29uc3QgcHJvY2Vzc0ZhY3RvcnkgPSAobW9kZSkgPT4ge1xuICAgIGNvbnN0IHNhbml0aXplU3RyID0gbWFrZVNhbml0aXplRm4obW9kZSlcbiAgICBjb25zdCBwcm9jZXNzID0gKHZhbCkgPT4ge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIHZhbC5tYXAocHJvY2VzcylcbiAgICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0ge31cbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsKSkge1xuICAgICAgICAgIG91dFtrXSA9ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpID8gc2FuaXRpemVTdHIodikgOiBwcm9jZXNzKHYpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dFxuICAgICAgfVxuICAgICAgcmV0dXJuICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgPyBzYW5pdGl6ZVN0cih2YWwpIDogdmFsXG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzXG4gIH1cblxuICBfc2FuaXRpemVEYXRhID0gKGRhdGEsIG9wdHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgZGlzYWJsZVNhbml0aXplID0gZmFsc2UsIG1vZGUgfSA9IG9wdHNcbiAgICBjb25zdCBsZWdhY3lTdHJpY3QgPSBmb3JjZVN0cmljdCB8fCBzdHJpY3RcbiAgICBjb25zdCBlZmZlY3RpdmVNb2RlID0gbW9kZSB8fCAobGVnYWN5U3RyaWN0ID8gJ2FwcCcgOiByZXNvbHZlRGVmYXVsdE1vZGUoKSlcbiAgICBpZiAoZGlzYWJsZVNhbml0aXplKSByZXR1cm4gZGF0YVxuICAgIHJldHVybiBwcm9jZXNzRmFjdG9yeShlZmZlY3RpdmVNb2RlKShkYXRhKVxuICB9XG5cbiAgc2FuaXRpemVEYXRhQ29uZmlndXJlLnNhbml0aXplRGF0YUZvcmNlID0gKGRhdGEsIG1vZGUpID0+IHtcbiAgICBjb25zdCBlZmZlY3RpdmUgPSBtb2RlIHx8IHJlc29sdmVEZWZhdWx0TW9kZSgpXG4gICAgcmV0dXJuIHByb2Nlc3NGYWN0b3J5KGVmZmVjdGl2ZSkoZGF0YSlcbiAgfVxuXG4gIGlzQ29uZmlndXJlZCA9IHRydWVcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb25maWd1cmFibGUgcnVudGltZSBzYW5pdGl6ZXJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNhbml0aXplRGF0YSA9IChkYXRhLCBvcHRzID0ge30pID0+IHtcbiAgaWYgKCFpc0NvbmZpZ3VyZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nhbml0aXplRGF0YSBpcyBub3QgY29uZmlndXJlZC4gQ2FsbCBzYW5pdGl6ZURhdGFDb25maWd1cmUoKSBmaXJzdC4nKVxuICB9XG4gIC8vIHJldHVybiBkYXRhO1xuICByZXR1cm4gX3Nhbml0aXplRGF0YShkYXRhLCBvcHRzKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFsd2F5cy1vbiBzYW5pdGl6ZXIgd2l0aCBlbnZpcm9ubWVudCBkZWZhdWx0XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBzYW5pdGl6ZURhdGFGb3JjZSA9IChkYXRhLCBtb2RlKSA9PiB7XG4gIGlmICghaXNDb25maWd1cmVkIHx8ICFzYW5pdGl6ZURhdGFDb25maWd1cmUuc2FuaXRpemVEYXRhRm9yY2UpIHtcbiAgICBjb25zdCBzYW5pdGl6ZVN0ciA9IG1ha2VTYW5pdGl6ZUZuKG1vZGUgfHwgcmVzb2x2ZURlZmF1bHRNb2RlKCkpXG4gICAgcmV0dXJuICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpID8gc2FuaXRpemVTdHIoZGF0YSkgOiBkYXRhXG4gIH1cbiAgcmV0dXJuIHNhbml0aXplRGF0YUNvbmZpZ3VyZS5zYW5pdGl6ZURhdGFGb3JjZShkYXRhLCBtb2RlKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZW50LXRhcmdldCBzYW5pdGl6ZXJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNhbml0aXplRXZlbnRUYXJnZXQgPSAoZWwsIG1vZGUpID0+IHtcbiAgaWYgKCFlbCkgcmV0dXJuXG4gIGNvbnN0IGVmZmVjdGl2ZU1vZGUgPSBtb2RlIHx8IHJlc29sdmVEZWZhdWx0TW9kZSgpXG4gIGNvbnN0IHNhbml0aXplU3RyID0gbWFrZVNhbml0aXplRm4oZWZmZWN0aXZlTW9kZSlcbiAgLy8gY29uc3QgVU5TQUZFX1JFID0gLzwoPzpzY3JpcHR8aWZyYW1lfG9iamVjdHxlbWJlZHxmb3JtfGlucHV0fGJ1dHRvbnxsaW5rfG1ldGEpW14+XSo+fG9uXFx3Kz18amF2YXNjcmlwdDovaVxuICBjb25zdCBVTlNBRkVfUkUgPSAvPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8Zm9ybXxpbnB1dHxidXR0b258bGlua3xtZXRhKVtePl0qPnxvblxcdys9fGphdmFzY3JpcHQ6L2lcbiAgaWYgKHR5cGVvZiBlbC52YWx1ZSA9PT0gJ3N0cmluZycgJiYgVU5TQUZFX1JFLnRlc3QoZWwudmFsdWUpKSB7XG4gICAgY29uc3QgY2xlYW4gPSBzYW5pdGl6ZVN0cihlbC52YWx1ZSlcbiAgICBpZiAoY2xlYW4gIT09IGVsLnZhbHVlKSBlbC52YWx1ZSA9IGNsZWFuXG4gIH1cbiAgaWYgKGVsLmlzQ29udGVudEVkaXRhYmxlICYmIHR5cGVvZiBlbC5pbm5lckhUTUwgPT09ICdzdHJpbmcnICYmIFVOU0FGRV9SRS50ZXN0KGVsLmlubmVySFRNTCkpIHtcbiAgICBjb25zdCBjbGVhbiA9IHNhbml0aXplU3RyKGVsLmlubmVySFRNTClcbiAgICBpZiAoY2xlYW4gIT09IGVsLmlubmVySFRNTCkgZWwuaW5uZXJIVE1MID0gY2xlYW5cbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNldFNhbml0aXplRGF0YUZvcmNlU3RyaWN0ID0gKGJvb2wgPSB0cnVlKSA9PiB7IGZvcmNlU3RyaWN0ID0gISFib29sIH1cblxuZXhwb3J0IHtcbiAgc2FuaXRpemVEYXRhQ29uZmlndXJlLFxuICBzYW5pdGl6ZURhdGEsXG4gIHNhbml0aXplRGF0YUZvcmNlLFxuICBzYW5pdGl6ZUV2ZW50VGFyZ2V0LFxuICBzZXRTYW5pdGl6ZURhdGFGb3JjZVN0cmljdFxufVxuZXhwb3J0IGRlZmF1bHQgc2FuaXRpemVEYXRhXG4iLCJpbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSdcblxubGV0IF9zYW5pdGl6ZUhUTUxcbmxldCBpc0NvbmZpZ3VyZWQgPSBmYWxzZVxuXG5jb25zdCBzYW5pdGl6ZUhUTUxDb25maWd1cmUgPSAoY29uZmlnKSA9PiB7XG4gIGlmICghaXNDb25maWd1cmVkKSB7XG4gICAgaWYgKGNvbmZpZy5zdHJpY3QpIHtcbiAgICAgIGlmICh3aW5kb3cudHJ1c3RlZFR5cGVzKSB7XG4gICAgICAgIGNvbnN0IHBvbGljeSA9IHdpbmRvdy50cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCdkZWZhdWx0Jywge1xuICAgICAgICAgIGNyZWF0ZUhUTUw6ICh0b19lc2NhcGUpID0+IERPTVB1cmlmeS5zYW5pdGl6ZSh0b19lc2NhcGUsIHsgUkVUVVJOX1RSVVNURURfVFlQRTogZmFsc2UgfSlcbiAgICAgICAgfSlcblxuICAgICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IHBvbGljeS5jcmVhdGVIVE1MKGh0bWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IERPTVB1cmlmeS5zYW5pdGl6ZShodG1sKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IGh0bWwgLy8gTm8gc2FuaXRpemF0aW9uIGlmIG5vdCByZXF1aXJlZFxuICAgIH1cbiAgICBpc0NvbmZpZ3VyZWQgPSB0cnVlXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS53YXJuKCdzYW5pdGl6ZUhUTUwgaXMgYWxyZWFkeSBjb25maWd1cmVkLiBSZWNvbmZpZ3VyYXRpb24gaXMgbm90IGFsbG93ZWQuJylcbiAgfVxufVxuXG5jb25zdCBzYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4ge1xuICBpZiAoIWlzQ29uZmlndXJlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2FuaXRpemVIVE1MIGlzIG5vdCBjb25maWd1cmVkLiBDYWxsIHNhbml0aXplSFRNTENvbmZpZ3VyZSgpIHdpdGggYXBwcm9wcmlhdGUgY29uZmlnLicpXG4gIH1cbiAgcmV0dXJuIF9zYW5pdGl6ZUhUTUwoaHRtbClcbn1cblxuZXhwb3J0IHsgc2FuaXRpemVIVE1MQ29uZmlndXJlIH1cbmV4cG9ydCBkZWZhdWx0IHNhbml0aXplSFRNTFxuIiwiaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4vc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwgfSBmcm9tICcuL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUtdXJsLmpzJ1xuaW1wb3J0IHsgU3B5bmVQbHVnaW5zTWV0aG9kcyB9IGZyb20gJy4vc3B5bmUtcGx1Z2lucy1tZXRob2RzLmpzJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi9kZWVwLW1lcmdlLmpzJ1xuXG5sZXQgX2NvbmZpZ1xubGV0IF9jaGFubmVsc1xubGV0IF9jaGFubmVsc01hcFxubGV0IF9pbml0aWFsaXplZFxubGV0IF9kZWJ1ZyA9IHRydWVcbmxldCBfZW5hYmxlQ01TUHJveGllcyA9IGZhbHNlXG5jb25zdCBfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUgPSBbXVxuLyogZXNsaW50LWRpc2FibGUgKi9cbmxldCBfbGlua3NEYXRhXG5sZXQgX25hdkxpbmtzXG5sZXQgX0lNR19QQVRIXG5jb25zdCBfZG9Ob3RUcmFja0NoYW5uZWxzQXJyID0gW11cbmNvbnN0IF9wcm94aWVzTWFwID0gbmV3IE1hcCgpXG5cbmZ1bmN0aW9uIHJhbmRvbTZDaGFycygpIHtcbiAgLy8gRm9yIHNpbXBsaWNpdHk6IHNsaWNlKDIsIDgpIGdldHMgNiByYW5kb20gY2hhcnMgZnJvbSB0aGUgc3Vic3RyaW5nXG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KTtcbn1cblxuY29uc3QgX3NweW5lUGx1Z2luTWV0aG9kcyA9IG5ldyBTcHluZVBsdWdpbnNNZXRob2RzKClcblxuY2xhc3MgU3B5bmVBcHBQcm9wZXJ0aWVzQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBfaW5pdGlhbGl6ZWQgPSBmYWxzZVxuICB9XG5cbiAgZ2V0IGNoYW5uZWxzTWFwKCkge1xuICAgIHJldHVybiBfY2hhbm5lbHNNYXBcbiAgfVxuXG4gIGdldCBpbml0aWFsaXplZCgpIHtcbiAgICByZXR1cm4gX2luaXRpYWxpemVkXG4gIH1cblxuICBnZXQgY29uZmlnKCkge1xuICAgIHJldHVybiBfY29uZmlnXG4gIH1cblxuICBnZXQgZGVidWcoKSB7XG4gICAgcmV0dXJuIF9kZWJ1Z1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgbW9zdGx5IHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0Pkxpc3RpbmcgdGhlIHJlZ2lzdGVyZWVkIENoYW5uZWxzIGluIHRoZSBicm93c2VyIGNvbnNvbGU8L2g0PiddXG4gICAqIFNweW5lQXBwLmxpc3RDaGFubmVscygpO1xuICAgKlxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgY2hhbm5lbHNcbiAgICovXG4gIHN0YXRpYyBsaXN0Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oX2NoYW5uZWxzLm1hcC5rZXlzKCkpXG4gIH1cblxuICBpbml0aWFsaXplKGRlZmF1bHRDb25maWcgPSB7fSwgY29uZmlnID0ge30sIGNoYW5uZWxzTWFwLCByb3V0ZVV0aWxzKSB7XG4gICAgX2NoYW5uZWxzID0gY2hhbm5lbHNNYXBcbiAgICBfY29uZmlnID0gZGVlcE1lcmdlKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgICAvLyBjb25zb2xlLmxvZyhcImNvbmZpZyBpcyBcIiwgeyBkZWZhdWx0Q29uZmlnLGNvbmZpZyB9KTtcbiAgICBpZiAoX2NvbmZpZy5jaGFubmVscyAmJiBfY29uZmlnLmNoYW5uZWxzLlJPVVRFKSB7XG4gICAgICAvLyBfY29uZmlnID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5jb25mb3JtUm91dGVPYmplY3QoX2NvbmZpZylcbiAgICAgIF9jb25maWcgPSByb3V0ZVV0aWxzLmNvbmZvcm1Sb3V0ZU9iamVjdChfY29uZmlnKVxuICAgIH1cbiAgICBfSU1HX1BBVEggPSBfY29uZmlnPy5JTUdfUEFUSFxuICAgIF9kZWJ1ZyA9IF9jb25maWcuZGVidWcgIT09IHVuZGVmaW5lZCA/IF9jb25maWcuZGVidWcgOiBfZGVidWdcbiAgICB0aGlzLmdldENoYW5uZWxBY3Rpb25zID0gX2NoYW5uZWxzLmdldENoYW5uZWxBY3Rpb25zLmJpbmQoX2NoYW5uZWxzKVxuICAgIHRoaXMubGlzdFJlZ2lzdGVyZWRDaGFubmVscyA9IF9jaGFubmVscy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzLmJpbmQoX2NoYW5uZWxzKVxuICAgIF9pbml0aWFsaXplZCA9IHRydWVcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IF9pbml0aWFsaXplZFxuICAgIHRoaXMuc2V0Q2hhbm5lbHNNYXAoKVxuICAgIGlmIChjb25maWc/LmJhc2VIcmVmKSB7XG4gICAgICB0aGlzLnNldEhlYWRCYXNlSHJlZihjb25maWcuYmFzZUhyZWYpXG4gICAgfVxuICAgIHJldHVybiBfY29uZmlnXG4gIH1cblxuICBzZXRIZWFkQmFzZUhyZWYoc3RyKSB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGJhc2UgZWxlbWVudFxuICAgIGNvbnN0IGJhc2VUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiYXNlJylcbiAgICAvLyBTZXQgdGhlIGhyZWYgYXR0cmlidXRlIHRvIHRoZSBkZXNpcmVkIGJhc2UgVVJMXG4gICAgYmFzZVRhZy5ocmVmID0gc3RyIC8vIFlvdSBjYW4gc2V0IHRoaXMgdG8gYW55IGJhc2UgVVJMXG4gICAgLy8gQXBwZW5kIHRoZSBiYXNlIGVsZW1lbnQgdG8gdGhlIGhlYWQgc2VjdGlvbiBvZiB0aGUgZG9jdW1lbnRcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGJhc2VUYWcpXG4gIH1cblxuICBjb25mb3JtUm91dGVDb25maWcoYWRkNDA0UHJvcHMgPSBmYWxzZSkge1xuICAgIC8qKlxuICAgICAqIFRISVMgTUVUSE9EIElTIFBSSU1BUklMWSBVU0VEIEZPUiBTUEEgR0VOIFNJVEUgR0VORVJBVElPTlxuICAgICAqL1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgX2NvbmZpZyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY29uZm9ybVJvdXRlT2JqZWN0KF9jb25maWcsIGFkZDQwNFByb3BzKVxuICB9XG5cbiAgc2V0Q2hhbm5lbHNNYXAoKSB7XG4gICAgY29uc3QgZ2V0U3RyZWFtID0gX2NoYW5uZWxzLmdldFN0cmVhbS5iaW5kKF9jaGFubmVscylcbiAgICBjb25zdCB0ZXN0U3RyZWFtID0gIF9jaGFubmVscy50ZXN0U3RyZWFtLmJpbmQoX2NoYW5uZWxzKVxuICAgIGNvbnN0IGdldFByb3h5U3ViamVjdCA9IF9jaGFubmVscy5nZXRQcm94eVN1YmplY3QuYmluZChfY2hhbm5lbHMpXG5cbiAgICBfY2hhbm5lbHNNYXAgPSB7IGdldFN0cmVhbSwgdGVzdFN0cmVhbSwgZ2V0UHJveHlTdWJqZWN0IH1cbiAgfVxuXG4gIHNldFByb3Aoa2V5LCB2YWwsIGlzVGVtcCA9IGZhbHNlKSB7XG4gICAgaWYgKGlzVGVtcCkge1xuICAgICAgX2NvbmZpZy5lcGhlbWVyYWxQcm9wc1trZXldID0gdmFsO1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgX2NvbmZpZy50bXBQcm9wc1trZXldID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gIGtleTtcbiAgfVxuXG4gIGdldFByb3Aoa2V5KSB7XG4gICAgaWYgKF9jb25maWcuZXBoZW1lcmFsUHJvcHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgY29uc3QgdGVtcFZhbCA9IF9jb25maWcuZXBoZW1lcmFsUHJvcHNba2V5XTtcbiAgICAgIGRlbGV0ZSBfY29uZmlnLmVwaGVtZXJhbFByb3BzW2tleV07XG4gICAgICByZXR1cm4gdGVtcFZhbDtcbiAgICB9XG4gICAgcmV0dXJuIF9jb25maWc/LnRtcFByb3BzPy5ba2V5XTtcbiAgfVxuXG4gIGNyZWF0ZVRlbXBQcm9wKHZhbHVlKSB7XG4gICAgY29uc3Qga2V5ID0gcmFuZG9tNkNoYXJzKCk7XG4gICAgdGhpcy5zZXRQcm9wKGtleSwgdmFsdWUsIHRydWUpOyAvLyBpc1RlbXAgPSB0cnVlXG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG5cbiAgc2V0Q2hhbm5lbENvbmZpZyhjaGFubmVsTmFtZSwgY29uZmlnKSB7XG4gICAgX2NvbmZpZy5jaGFubmVsc1tjaGFubmVsTmFtZV0gPSBjb25maWdcbiAgICByZXR1cm4gX2NvbmZpZy5jaGFubmVsc1tjaGFubmVsTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gY2hlY2sgaW4gdGhlIGNvbnNvbGUgb3IgaW4gdGhlIGNvZGUgd2hhdCBhY3Rpb25zIGFyZSBhdmFpbGFibGUgdG8gYmUgbGlzdGVuZWQgdG8uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZVxuICAgKiBAcmV0dXJucyB7QXJyYXl9IEFuIGFycmF5IG9mIEFjdGlvbnMgdGhhdCBjYW4gYmUgbGlzdGVuZWQgdG9cbiAgICovXG4gIC8qICBnZXRDaGFubmVsQWN0aW9ucyhjaGFubmVsTmFtZSkge1xuICAgIHJldHVybiBfY2hhbm5lbHMuZ2V0Q2hhbm5lbEFjdGlvbnMoY2hhbm5lbE5hbWUpO1xuICB9ICovXG5cbiAgZ2V0Q2hhbm5lbENvbmZpZyhjaGFubmVsTmFtZSwgY29uZmlnID0gX2NvbmZpZykge1xuICAgIGlmIChjaGFubmVsTmFtZSA9PT0gJ0NIQU5ORUxfUk9VVEUnKSB7XG4gICAgICBjaGFubmVsTmFtZSA9ICdST1VURSdcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWxOYW1lID09PSAnQ0hBTk5FTF9XSU5ET1cnKSB7XG4gICAgICBjaGFubmVsTmFtZSA9ICdXSU5ET1cnXG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkIHx8IF9jb25maWcuY2hhbm5lbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKCdTcHluZSB3YXJuaW5nOiBTcHluZSBjb25maWcgb2JqZWN0IGlzIGVtcHR5IScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsQ29uZmlnID0gX2NvbmZpZy5jaGFubmVsc1tjaGFubmVsTmFtZV1cblxuICAgIGlmIChjaGFubmVsQ29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgd2FybmluZzogU3B5bmUgY29uZmlndXJhdGlvbiBmb3IgY2hhbm5lbCwgJHtjaGFubmVsTmFtZX0gaXMgZW1wdHkhYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJldHVybiBjaGFubmVsQ29uZmlnXG4gIH1cblxuICByZWdpc3RlckNoYW5uZWwoKSB7XG5cbiAgfVxuXG4gIGFkZFBsdWdpbkNvbmZpZyhwbHVnaW5OYW1lLCBwbHVnaW5Db25maWcgPSB7fSkge1xuICAgIGlmIChfY29uZmlnLnBsdWdpbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgX2NvbmZpZy5wbHVnaW5zID0ge31cbiAgICB9XG4gICAgdGhpcy5hZGRQbHVnaW5NZXRob2RzKHBsdWdpbkNvbmZpZy5wbHVnaW5NZXRob2RzKVxuXG4gICAgX2NvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdID0gcGx1Z2luQ29uZmlnXG4gIH1cblxuICBnZXRQbHVnaW5zTWV0aG9kT2JqKHBsdWdpbk1ldGhvZHNPYmopIHtcbiAgICBpZiAocGx1Z2luTWV0aG9kc09iaikge1xuICAgICAgdGhpcy5hZGRQbHVnaW5NZXRob2RzKHBsdWdpbk1ldGhvZHNPYmopXG4gICAgfVxuXG4gICAgcmV0dXJuIF9zcHluZVBsdWdpbk1ldGhvZHMucGx1Z2luTWV0aG9kc09ialxuICB9XG5cbiAgYWRkUGx1Z2luTWV0aG9kcyhwbHVnaW5NZXRob2RzKSB7XG4gICAgaWYgKHBsdWdpbk1ldGhvZHMpIHtcbiAgICAgIF9zcHluZVBsdWdpbk1ldGhvZHMuYWRkTWV0aG9kcyhwbHVnaW5NZXRob2RzKVxuICAgIH1cbiAgfVxuXG4gIGRvTm90VHJhY2tDaGFubmVsKGNoYW5uZWxOYW1lKSB7XG4gICAgX2RvTm90VHJhY2tDaGFubmVsc0Fyci5wdXNoKGNoYW5uZWxOYW1lKVxuICB9XG5cbiAgZ2V0VW50cmFja2VkQ2hhbm5lbHNMaXN0KCkge1xuICAgIHJldHVybiBfZG9Ob3RUcmFja0NoYW5uZWxzQXJyXG4gIH1cblxuICByZWdpc3RlclByb3h5UmV2aXZlcihuYW1lLCBtZXRob2QpIHtcbiAgICBfcHJveGllc01hcC5zZXQobmFtZSwgbWV0aG9kKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiUkVHSVNURVJEIFBST1hZIFJFVklWRVJcIixfcHJveGllc01hcCwgX3Byb3hpZXNNYXAuZ2V0KG5hbWUpKTtcbiAgfVxuXG4gIC8vIFRoaXMgaXMgdGhlIG5ldyBtZXRob2QgeW91IGFkZFxuICByZWdpc3RlclBsdWdpbihwbHVnaW5JbnN0YW5jZSkge1xuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU3B5bmVBcHAgaXMgbm90IGluaXRpYWxpemVkIHlldC4gUGx1Z2luIHdpbGwgbm90IGJlIGZ1bGx5IHJlZ2lzdGVyZWQuJylcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coXCJJTlNUQU5DRSBcIix0aGlzLCBwbHVnaW5JbnN0YW5jZSlcblxuICAgIHBsdWdpbkluc3RhbmNlLnJlZ2lzdGVyKHRoaXMpXG4gIH1cblxuICBnZXRQcm94eVJldml2ZXIocHJveHlOYW1lKSB7XG4gICAgcmV0dXJuIF9wcm94aWVzTWFwLmdldChwcm94eU5hbWUpXG4gIH1cblxuICBnZXRQbHVnaW5Db25maWdCeVBsdWdpbk5hbWUocGx1Z2luTmFtZSkge1xuICAgIHJldHVybiBfY29uZmlnLnBsdWdpbnNbcGx1Z2luTmFtZV1cbiAgfVxuXG4gIGdldCBJTUdfUEFUSCgpIHtcbiAgICByZXR1cm4gX0lNR19QQVRIXG4gIH1cblxuICBnZXQgZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUoKSB7XG4gICAgcmV0dXJuIF9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZVxuICB9XG5cbiAgLy8gU2V0dGVyIGZvciBfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGVcbiAgc2V0IGV4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFB1c2ggYSBzaW5nbGUgc3RyaW5nIGludG8gdGhlIGFycmF5IGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICAgIGlmICghX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICBfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUucHVzaCh2YWx1ZSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyBNZXJnZSBhbiBhcnJheSBpbnRvIHRoZSBleGlzdGluZyBhcnJheSwgYXZvaWRpbmcgZHVwbGljYXRlc1xuICAgICAgdmFsdWUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyAmJiAhX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlLmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICAgICAgX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIHZhbHVlIHByb3ZpZGVkIHRvIGV4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlLiBPbmx5IHN0cmluZ3Mgb3IgYXJyYXlzIGFyZSBhbGxvd2VkLicpXG4gICAgfVxuICB9XG5cbiAgZ2V0IGxpbmtzRGF0YSgpIHtcbiAgICBjb25zb2xlLndhcm4oJ2dldCBsaW5rcyBkYXRhIGluIFNweW5lQXBwUHJvcGVydGllcyBpcyBkZXByZWNhdGVkLCB1c2UgbmF2TGlua3MnKVxuICAgIHJldHVybiBfbmF2TGlua3NcbiAgfVxuXG4gIHNldCBsaW5rc0RhdGEoYXJyKSB7XG4gICAgY29uc29sZS53YXJuKCdzZXQgbGlua3MgZGF0YSBpbiBTcHluZUFwcFByb3BlcnRpZXMgaXMgZGVwcmVjYXRlZCwgdXNlIG5hdkxpbmtzJylcbiAgfVxuXG4gIGdldCBuYXZMaW5rcygpIHtcbiAgICByZXR1cm4gX25hdkxpbmtzXG4gIH1cblxuICBzZXQgbmF2TGlua3MoYXJyKSB7XG4gICAgX25hdkxpbmtzID0gYXJyXG4gIH1cblxuICBnZXQgZW5hYmxlQ01TUHJveGllcygpe1xuICAgIHJldHVybiBfZW5hYmxlQ01TUHJveGllc1xuICB9XG5cbiAgZ2V0SHJlZkZyb21EYXRhKHJvdXRlUHJvcHM9e30pe1xuXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY29udmVydFBhcmFtc1RvUm91dGUocm91dGVQcm9wcyk7XG5cbiAgfVxuXG4gIHNldCBlbmFibGVDTVNQcm94aWVzKGJvb2w9dHJ1ZSl7XG4gICAgX2VuYWJsZUNNU1Byb3hpZXMgPSBCb29sZWFuKGJvb2wpO1xuICB9XG5cbiAgc2V0Q01TUHJveHlNZXRob2QoZm4pe1xuICAgIHRoaXMuZW5hYmxlQ01TUHJveGllcyA9IHRydWU7XG4gICAgdGhpcy5mb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YSA9IGZuO1xuXG4gIH1cblxuICB0ZW1wR2V0Q2hhbm5lbHNJbnN0YW5jZSgpIHtcblxuICB9XG5cbiAgdGVtcEdldENvbmZpZygpIHtcblxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBTcHluZUFwcFByb3BlcnRpZXMgPSBuZXcgU3B5bmVBcHBQcm9wZXJ0aWVzQ2xhc3MoKVxuIiwiaW1wb3J0IHsgYWxsUGFzcywgY29tcG9zZSwgaXMsIGtleXMsIG5vdCwgcHJvcCB9IGZyb20gJ3JhbWRhJ1xuXG5jb25zdCBfcGx1Z2luTWV0aG9kc09iaiA9IE9iamVjdC5jcmVhdGUoe30pXG5cbmNvbnN0IGlzTm90QXJyID0gY29tcG9zZShub3QsIGlzKEFycmF5KSlcbi8vIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKG5vdCwgaXNFbXB0eSlcbi8vIGNvbnN0IGlzTm9uRW1wdHlTdHIgPSBhbGxQYXNzKFtpcyhTdHJpbmcpLCBpc05vdEVtcHR5XSlcbi8vIGNvbnN0IGlzTm9uRW1wdHlBcnIgPSBhbGxQYXNzKFtpcyhBcnJheSksIGlzTm90RW1wdHldKVxuY29uc3QgaXNPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcbi8vIGNvbnN0IGlzTm9uRW1wdHlPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RFbXB0eSwgaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcblxuZXhwb3J0IGNsYXNzIFNweW5lUGx1Z2luc01ldGhvZHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBfcGx1Z2luTWV0aG9kc09iai5mb28gPSAoKSA9PiBjb25zb2xlLmxvZygndXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4nKVxuICB9XG5cbiAgYWRkTWV0aG9kKGtleSwgZm4sIHRlc3QgPSBmYWxzZSkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoX3BsdWdpbk1ldGhvZHNPYmosIGtleSkgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHdhcm5TdHIgPSBgU3B5bmUgV2FybmluZzogdGhlIG1ldGhvZCBuYW1lLCAke2tleX0sIGFscmVhZHkgZXhpc3RzLmBcbiAgICAgIGlmICh0ZXN0KSB7XG4gICAgICAgIHJldHVybiB3YXJuU3RyXG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4od2FyblN0cilcbiAgICB9IGVsc2Uge1xuICAgICAgX3BsdWdpbk1ldGhvZHNPYmpba2V5XSA9IGZuXG4gICAgfVxuICB9XG5cbiAgYWRkTWV0aG9kcyhtZXRob2RzT2JqID0ge30sIHRlc3QgPSBmYWxzZSkge1xuICAgIGxldCB3YXJuU3RyXG5cbiAgICBjb25zdCBpc09iaiA9IGlzT2JqZWN0Rm4obWV0aG9kc09iailcblxuICAgIGlmIChpc09iaiA9PT0gZmFsc2UpIHtcbiAgICAgIHdhcm5TdHIgPSBgU3B5bmUgV2FybmluZzogdGhlIHBsdWdpbk1ldGhvZHMgcHJvcGVydHksICR7SlNPTi5zdHJpbmdpZnkobWV0aG9kc09iail9IG5lZWRzIHRvIGJlIGFuIG9iamVjdC5gXG4gICAgICBpZiAodGVzdCkge1xuICAgICAgICByZXR1cm4gd2FyblN0clxuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKHdhcm5TdHIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaGVja0VhY2hLZXlGb3JWYWxpZE1ldGhvZCA9IChrZXlTdHIpID0+IHtcbiAgICAgIGNvbnN0IG1ldGhvZFZhbCA9IHByb3Aoa2V5U3RyLCBtZXRob2RzT2JqKVxuXG4gICAgICBjb25zdCBpc0Z1bmN0aW9uID0gdHlwZW9mIChtZXRob2RWYWwpID09PSAnZnVuY3Rpb24nXG5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuYWRkTWV0aG9kKGtleVN0ciwgbWV0aG9kVmFsLCB0ZXN0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FyblN0ciA9IGB0aGUgdmFsdWUgZm9yICR7a2V5U3RyfSBpcyBub3QgYSB2YWxpZCBmdW5jdGlvbi5gXG4gICAgICAgIGlmICh0ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuIHdhcm5TdHJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4od2FyblN0cilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZEtleXMgPSBrZXlzKG1ldGhvZHNPYmopXG5cbiAgICByZXR1cm4gbWV0aG9kS2V5cy5tYXAoY2hlY2tFYWNoS2V5Rm9yVmFsaWRNZXRob2QpLmpvaW4oJywnKVxuICB9XG5cbiAgY2hlY2tJZk1ldGhvZEV4aXN0cyhrZXkpIHtcblxuICB9XG5cbiAgZ2V0IHBsdWdpbk1ldGhvZHNPYmooKSB7XG4gICAgcmV0dXJuIF9wbHVnaW5NZXRob2RzT2JqXG4gIH1cbn1cbiIsImltcG9ydCB7IGdldEFsbE1ldGhvZE5hbWVzIH0gZnJvbSAnLi9mcnAtdG9vbHMuanMnXG5pbXBvcnQgeyByZWplY3QsIGN1cnJ5TiwgX18sIG1hcCB9IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVUcmFpdCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFNweW5lVHJhaXRcbiAgICogQHR5cGUgZXh0ZW5kYWJsZVxuICAgKiBAcGFyYW0ge3RoaXN9IHBhcmVudENvbnRleHRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF1dG9Jbml0XG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge3RoaXN9IHBhcmVudENvbnRlbnQgLSA9IHVuZGVmaW5lZDsgVGhpcyBiaW5kcyBhbGwgbWV0aG9kcyB3aXRoaW4gU3B5bmVUcmFpdCBpbnRvIHRoZSBwYXJlbnRDb250ZXh0J3Mgb2JqZWN0XG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcmVmaXggLSA9IHVuZGVmaW5lZDsgU3B5bmVUcmFpdHMgZm9yY2VzIGFsbCBtZXRob2QgbmFtZXMgdG8gYmVnaW4gd2l0aCB0aGUgc2FtZSBwcmVmaXguIFRoaXMgYWxsb3dzIG90aGVyIG9iamVjdHMgdG8gcXVpY2tseSB1bmRlcnN0YW5kIHdoZXJlIHRoZSBvcmlnaW5hbCBtZXRob2QgaXMgc2V0LlxuICAgKiBAZGVzY1xuICAgKiBTcHluZVRyYWl0cyBhbGxvdyB0aGUgZWhhbmNpbmcgb2YgY2xhc3NlcyBhbmQgb3RoZXIgb2JqZWN0cyB3aXRob3V0IGhhdmluZyB0byBleHRlbmQgY2xhc3NlcyBvciBtYW5pcHVsYXRlIGZ1bmN0aW9uIHByb3RvdHlwZXNcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IocGFyZW50Q29udGV4dCwgcHJlZml4ID0gJycsIGF1dG9Jbml0ID0gdHJ1ZSkge1xuICAgIHRoaXMucGFyZW50Q29udGV4dCA9IHBhcmVudENvbnRleHRcbiAgICB0aGlzLm9taXR0ZWRNZXRob2RzID0gW1xuICAgICAgJ2F1dG9CaW5kZXInLFxuICAgICAgJ2luaXRBdXRvQmluZGVyJyxcbiAgICAgICdnZXRFbmhhbmNlck1ldGhvZHMnLFxuICAgICAgJ2NoZWNrRm9yTWFsZm9ybWVkTWV0aG9kcycsXG4gICAgICAnY2FsbGVyJyxcbiAgICAgICdhcmd1bWVudHMnLFxuICAgICAgJ2JpbmRQYXJlbnRWaWV3U3RyZWFtJ11cblxuICAgIHRoaXMucHJlZml4ID0gcHJlZml4XG5cbiAgICBpZiAoYXV0b0luaXQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuYXV0b0JpbmRlcigpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFsbE1ldGhvZHNMaXN0XG4gIH1cblxuICBpbml0QXV0b0JpbmRlcigpIHtcbiAgICB0aGlzLmF1dG9CaW5kZXIoKVxuICB9XG5cbiAgZ2V0RW5oYW5jZXJNZXRob2RzKCkge1xuICAgIHJldHVybiBnZXRBbGxNZXRob2ROYW1lcyh0aGlzLCB0aGlzLm9taXR0ZWRNZXRob2RzKVxuICB9XG5cbiAgY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzKG1ldGhvZHNBcnIpIHtcbiAgICBpZiAodGhpcy5wcmVmaXggPT09ICcnKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNQWU5FIFdBUk5JTkc6IFRoZSBmb2xsb3dpbmcgU3B5bmVUcmFpdCAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gbmVlZHMgYSBwcmVmaXhgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIC8vIGxldCByZVN0ciA9IGBeKCR7dGhpcy5wcmVmaXh9KSguKikkYDtcbiAgICAvLyBsZXQgcmUgPSBuZXcgUmVnRXhwKHJlU3RyKTtcbiAgICBjb25zdCBoYXNQcmVmaXggPSAoc3RyKSA9PiBzdHIuaW5kZXhPZih0aGlzLnByZWZpeCkgPT09IDBcblxuICAgIGNvbnN0IG1hbGZvcm1lZE1ldGhvZHNBcnIgPSByZWplY3QoaGFzUHJlZml4LCBtZXRob2RzQXJyKVxuICAgIGlmIChtYWxmb3JtZWRNZXRob2RzQXJyLmxlbmd0aCA+PSAxKSB7XG4gICAgICBjb25zdCB3YXJuaW5nU3RyID0gYFNweW5lIFdhcm5pbmc6IFRoZSBmb2xsb3dpbmcgbWV0aG9kKHMpIGluICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSByZXF1aXJlIHRoZSBwcmVmaXgsIFwiJHt0aGlzLnByZWZpeH1cIjogWyR7bWFsZm9ybWVkTWV0aG9kc0Fyci5qb2luKCcsICcpfV07YFxuICAgICAgY29uc29sZS53YXJuKHdhcm5pbmdTdHIpXG4gICAgfVxuICB9XG5cbiAgYmluZFBhcmVudFZpZXdTdHJlYW0obWV0aG9kc09iaiwgY29udGV4dCkge1xuICAgIHRoaXMuY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzKG1ldGhvZHNPYmouYWxsTWV0aG9kcylcbiAgICBjb25zdCBvYmogPSB7fVxuICAgIGNvbnN0IGJpbmRNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtID0gKHN0ciwgaXNTdGF0aWMgPSBmYWxzZSkgPT4ge1xuICAgICAgY29uc3QgY29uc3RydWN0b3JUeXBlID0gaXNTdGF0aWMgPT09IHRydWUgPyB0aGlzLmNvbnN0cnVjdG9yIDogdGhpc1xuICAgICAgY29uc3QgcHJvcGVydHlUeXBlID0gdHlwZW9mIChjb25zdHJ1Y3RvclR5cGVbc3RyXSlcbiAgICAgIGlmIChwcm9wZXJ0eVR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb2JqW3N0cl0gPSBjb250ZXh0W3N0cl0gPSBjb25zdHJ1Y3RvclR5cGVbc3RyXS5iaW5kKGNvbnRleHQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYmluZEN1cnJ5ID0gY3VycnlOKDIsIGJpbmRNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtKVxuICAgIGNvbnN0IGJpbmRTdGF0aWNNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtID0gYmluZEN1cnJ5KF9fLCB0cnVlKVxuICAgIC8vIE1BUCBTVEFUSUMgTUVUSE9EU1xuICAgIG1hcChiaW5kU3RhdGljTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSwgbWV0aG9kc09iai5zdGF0aWNNZXRob2RzKVxuICAgIC8vIE1BUCBNQUlOIE1FVEhPRFNcbiAgICBtYXAoYmluZE1ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0sIG1ldGhvZHNPYmoubWV0aG9kcylcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBhdXRvQmluZGVyKCkge1xuICAgIGNvbnN0IGFsbE1ldGhvZHMgPSB0aGlzLmdldEVuaGFuY2VyTWV0aG9kcygpXG4gICAgLy8gY29uc29sZS5sb2coJ2FsbCAnLGFsbE1ldGhvZHMpO1xuICAgIHRoaXMuYWxsTWV0aG9kc0xpc3QgPSB0aGlzLmJpbmRQYXJlbnRWaWV3U3RyZWFtKGFsbE1ldGhvZHMsIHRoaXMucGFyZW50Q29udGV4dClcbiAgICByZXR1cm4gdGhpcy5hbGxNZXRob2RzTGlzdFxuICB9XG59XG4iLCJpbXBvcnQgeyBpc0VtcHR5LCBoZWFkLCB2YWx1ZXMsIGNvbXBvc2UsIHByb3AsIGNvbXBsZW1lbnQsIGlzTmlsLCBhbGxQYXNzLCByZWR1Y2UsIGZpbHRlciwgZXF1YWxzLCB0b1BhaXJzLCByZXBsYWNlLCBlaXRoZXIsIHByb3BFcSwgX18sIGludmVydCwgcGF0aCwgemlwT2JqLCByZWplY3QsIGtleXMsIGZpbmQsIGFzc29jLCBpcywgaGFzLCB3aGVuLCBzcGxpdCwgYWx3YXlzLCBjb25jYXQsIGpvaW4sIGZsYXR0ZW4sIG1hcCwgaWZFbHNlLCB0ZXN0LCBmaW5kTGFzdEluZGV4LCBsYXN0LCBkZWZhdWx0VG8sIGZyb21QYWlycyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcblxuZXhwb3J0IGNsYXNzIFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmxcbiAgICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGRlc2NcbiAgICAgKiBJbnRlcm5hbCB1cmwgbWV0aG9kcyBmb3IgdGhlIFNweW5lUm91dGVDaGFubmVsXG4gICAgICovXG4gICAgdGhpcy5jaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsLmJpbmQodGhpcylcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsKG9iaikge1xuICAgIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNFbXB0eSksIGhlYWQsIHZhbHVlcylcbiAgICBjb25zdCBpc05vdE5pbCA9IGNvbXBvc2UoY29tcGxlbWVudChpc05pbCksIGhlYWQsIHZhbHVlcylcbiAgICBjb25zdCBpc05vdE5pbEFuZElzTm90RW1wdHkgPSBhbGxQYXNzKFtpc05vdEVtcHR5LCBpc05vdE5pbF0pXG4gICAgcmV0dXJuIGlzTm90TmlsQW5kSXNOb3RFbXB0eShvYmopXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgocGFyYW1WYWx1ZSwgcm91dGVPYmopIHtcbiAgICBjb25zdCByZWplY3RQYXJhbUtleSA9IHJlamVjdChlcXVhbHMoJ3JvdXRlTmFtZScpKVxuICAgIGNvbnN0IGtleXNBcnIgPSBjb21wb3NlKHJlamVjdFBhcmFtS2V5LCBrZXlzKVxuICAgIGNvbnN0IHRlc3RGb3JSZWdleE1hdGNoID0gc3RyID0+IHRlc3QobmV3IFJlZ0V4cChzdHIpLCBwYXJhbVZhbHVlKVxuICAgIGNvbnN0IGNoZWNrZXIgPSBjb21wb3NlKGZpbmQodGVzdEZvclJlZ2V4TWF0Y2gpLCBrZXlzQXJyKVxuICAgIGNvbnN0IHJlZ2V4TWF0Y2hTdHIgPSBjaGVja2VyKHJvdXRlT2JqKVxuICAgIGlmIChpcyhTdHJpbmcsIHJlZ2V4TWF0Y2hTdHIpKSB7XG4gICAgICByb3V0ZU9iaiA9IGFzc29jKHBhcmFtVmFsdWUsIHByb3AocmVnZXhNYXRjaFN0ciwgcm91dGVPYmopLCByb3V0ZU9iailcbiAgICB9XG4gICAgcmV0dXJuIHJvdXRlT2JqXG4gIH1cblxuICBzdGF0aWMgZm9ybWF0U3RyQXNXaW5kb3dMb2NhdGlvbihzdHIpIHtcbiAgICBjb25zdCBoYXNoID0gc3RyXG4gICAgY29uc3Qgc2VhcmNoID0gc3RyXG4gICAgY29uc3QgcGF0aG5hbWUgPSBzdHJcbiAgICByZXR1cm4geyBoYXNoLCBzZWFyY2gsIHBhdGhuYW1lIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvblN0ckJ5VHlwZSh0LCBpc0hhc2ggPSBmYWxzZSwgbG9jID0gd2luZG93LmxvY2F0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IGlzSGFzaCA9PT0gdHJ1ZSA/ICdoYXNoJyA6IHRcblxuICAgIGNvbnN0IHR5cGVNYXAgPSB7XG4gICAgICBzbGFzaDogJ3BhdGhuYW1lJyxcbiAgICAgIHF1ZXJ5OiAnc2VhcmNoJyxcbiAgICAgIGhhc2g6ICdoYXNoJ1xuICAgIH1cbiAgICBjb25zdCBwcm9wVmFsID0gdHlwZU1hcFt0eXBlXVxuICAgIGNvbnN0IHN0ciAgPSBwcm9wKHByb3BWYWwsIGxvYylcbiAgICBjb25zdCBjaGVja0ZvclNsYXNoQW5kSGFzaCA9IC9eKFxcLyk/KCMpPyhcXC8pPyguKikkL1xuICAgIC8vIGNvbnNvbGUubG9nKFwiREFUQSBMT0MgU1RSIFwiLHtzdHIsIGxvYywgcHJvcCwgdHlwZSxpc0hhc2h9KTtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoY2hlY2tGb3JTbGFzaEFuZEhhc2gsICckNCcpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMoZGF0YSwgcm91dGUsIHQgPSAnc2xhc2gnLCBwYXJhbXNGcm9tTG9jKSB7XG4gICAgY29uc3QgdXJsQXJyID0gW11cbiAgICBjb25zdCBsb29wVGhyb3VnaFBhcmFtID0gKHJvdXRlT2JqKSA9PiB7XG4gICAgICBjb25zdCB1cmxPYmogPSB7fVxuICAgICAgY29uc3Qga2V5d29yZCA9IHJvdXRlT2JqLnJvdXRlTmFtZSAvLyBQQVJBTSBGT1JNIFNQWU5FIENPTkZJR1xuICAgICAgbGV0IHBhcmFtVmFsRnJvbURhdGEgPSBkYXRhW2tleXdvcmRdICE9PSB1bmRlZmluZWQgPyBkYXRhW2tleXdvcmRdIDogcHJvcChrZXl3b3JkLCBwYXJhbXNGcm9tTG9jKSAvLyBQVUxMIFZBTFVFIEZPUiBUSElTIFBBUkFNIEZST00gREFUQVxuICAgICAgY29uc3QgcGFyYW1WYWxUeXBlID0gdHlwZW9mIChyb3V0ZU9ialtwYXJhbVZhbEZyb21EYXRhXSlcblxuICAgICAgaWYgKHBhcmFtVmFsVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcGFyYW1WYWxGcm9tRGF0YSA9IHJvdXRlT2JqW3BhcmFtVmFsRnJvbURhdGFdXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtVmFsVHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcm91dGVPYmogPSB0aGlzLmNoZWNrSWZQYXJhbVZhbHVlTWF0Y2hlc1JlZ2V4KHBhcmFtVmFsRnJvbURhdGEsIHJvdXRlT2JqKVxuICAgICAgfVxuXG4gICAgICB1cmxPYmpba2V5d29yZF0gPSBwYXJhbVZhbEZyb21EYXRhXG5cbiAgICAgIGlmICh0aGlzLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwodXJsT2JqKSkge1xuICAgICAgICB1cmxBcnIucHVzaCh1cmxPYmopXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzT2JqZWN0ID0gaXMoT2JqZWN0LCByb3V0ZU9iailcbiAgICAgIGNvbnN0IG9iamVjdFBhcmFtRXhpc3RzID0gaGFzKHBhcmFtVmFsRnJvbURhdGEsIHJvdXRlT2JqKVxuICAgICAgY29uc3Qgb2JqZWN0Q29udGFpbnNSb3V0ZSA9IGhhcygncm91dGVQYXRoJywgcm91dGVPYmopXG4gICAgICBjb25zdCByZWN1cnNpdmVseUNhbGxMb29wQm9vbCA9IG9iamVjdFBhcmFtRXhpc3RzICYmIGlzT2JqZWN0XG4gICAgICBpZiAocmVjdXJzaXZlbHlDYWxsTG9vcEJvb2wgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgbmV3T2JqID0gcm91dGVPYmpbcGFyYW1WYWxGcm9tRGF0YV1cbiAgICAgICAgaWYgKGhhcygncm91dGVQYXRoJywgbmV3T2JqKSkge1xuICAgICAgICAgIGxvb3BUaHJvdWdoUGFyYW0obmV3T2JqLnJvdXRlUGF0aClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvYmplY3RDb250YWluc1JvdXRlID09PSB0cnVlICYmIHBhcmFtVmFsRnJvbURhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb29wVGhyb3VnaFBhcmFtKHJvdXRlT2JqLnJvdXRlUGF0aClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb29wVGhyb3VnaFBhcmFtKHJvdXRlKVxuXG4gICAgcmV0dXJuIHVybEFyclxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVNsYXNoU3RyaW5nKGFycikge1xuICAgIGNvbnN0IGFyckNsZWFyID0gcmVqZWN0KGlzTmlsKVxuICAgIGNvbnN0IG5vdFVuZGVmaW5lZCA9IHdoZW4oY29tcGxlbWVudChpc05pbCwgX18pLCBqb2luKCcvJykpXG4gICAgY29uc3Qgc3RyaXBSZWdleCA9IHJlcGxhY2UoL14oXFxeKikoLip8XlxcJCkoXFwkKSQvLCAnJDInKVxuICAgIGNvbnN0IGpvaW5lciA9IGNvbXBvc2Uoc3RyaXBSZWdleCwgbm90VW5kZWZpbmVkLCBhcnJDbGVhciwgZmxhdHRlbiwgbWFwKHZhbHVlcykpXG4gICAgcmV0dXJuIGpvaW5lcihhcnIpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUXVlcnlTdHJpbmcoYXJyKSB7XG4gICAgY29uc3QgYXJyQ2xlYXIgPSByZWplY3QoaXNOaWwpXG5cbiAgICBjb25zdCBpc05vdE5pbEFuZElzTm90RW1wdHkgPSB0aGlzLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWxcblxuICAgIGNvbnN0IGNyZWF0ZVBhaXIgPSBjb21wb3NlKFxuICAgICAgam9pbignPScpLFxuICAgICAgZmxhdHRlbixcbiAgICAgIHRvUGFpcnMpXG5cbiAgICBjb25zdCBjaGVja1BhaXIgPSBpZkVsc2UoXG4gICAgICBpc05vdE5pbEFuZElzTm90RW1wdHksXG4gICAgICBjcmVhdGVQYWlyLFxuICAgICAgYWx3YXlzKHVuZGVmaW5lZClcbiAgICApXG5cbiAgICBjb25zdCBtYXBBcnJheU9mUGFpcnMgPSBtYXAoY2hlY2tQYWlyKVxuXG4gICAgY29uc3QgY2hlY2tJZlN0cklzRW1wdHkgPSB3aGVuKFxuICAgICAgY29tcGxlbWVudChpc0VtcHR5KSxcbiAgICAgIGNvbmNhdCgnPycpKVxuXG4gICAgY29uc3QgY3JlYXRlUXMgPSBjb21wb3NlKFxuICAgICAgY2hlY2tJZlN0cklzRW1wdHksXG4gICAgICBqb2luKCcmJyksXG4gICAgICBhcnJDbGVhcixcbiAgICAgIG1hcEFycmF5T2ZQYWlycylcblxuICAgIHJldHVybiBjcmVhdGVRcyhhcnIpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tQYXlsb2FkRm9yUmVnZXhPdmVycmlkZXModXJsc0FyciwgZGF0YSwgcGFyc2VTdHJpbmcgPSAnVmFsdWUnKSB7XG4gICAgLy8gQ0hFQ0sgSUYgUEFZTE9BRCBIQVMgQU5ZIE9WRVJSSURFU1xuICAgIGNvbnN0IGdldFByb3BWYWxPdmVycmlkZSA9IChrZXkpID0+IHByb3AoYCR7a2V5fSR7cGFyc2VTdHJpbmd9YCwgZGF0YSlcblxuICAgIC8vIEdFVCBBTlkgUE9TU0lCTEUgVkFMVUUgVVNJTkcgVEhFIENVUlJFTlQgS0VZXG4gICAgY29uc3QgZ2V0T3ZlcnJpZGVWYWwgPSBjb21wb3NlKGdldFByb3BWYWxPdmVycmlkZSwgaGVhZCwga2V5cylcblxuICAgIC8vIE1BUCBBTEwgT0JKRUNUIFZBTFMgVE8gVEVTVCBGT1IgT1ZFUlJJREVTXG4gICAgY29uc3QgbWFwVXJsUHJvcHMgPSAocHJvcCkgPT4ge1xuICAgICAgY29uc3Qgb3ZlcnJpZGVWYWwgPSBnZXRPdmVycmlkZVZhbChwcm9wKVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIm92ZXJyaWRlIHZhbCBcIixvdmVycmlkZVZhbCwgZGF0YSk7XG4gICAgICAvLyBpZiByZWdleCB2YWx1ZSBpcyBmb3VuZFxuICAgICAgaWYgKG92ZXJyaWRlVmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGFzc29jKGNvbXBvc2UoaGVhZCwga2V5cykocHJvcCksIG92ZXJyaWRlVmFsLCBwcm9wKVxuICAgICAgfVxuICAgICAgLy8gaWRlbnRpdHlcbiAgICAgIHJldHVybiBwcm9wXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcChtYXBVcmxQcm9wcywgdXJsc0FycilcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclJvdXRlVmFsV2l0aE11bHRpcGxlVmFscyh1cmxzQXJyKSB7XG4gICAgLy8gRGVmaW5lIHRoZSBpbnRlcm5hbCBtZXRob2QgdG8gZXh0cmFjdCB0aGUgc3RyaW5nIGJlZm9yZSB0aGUgcGlwZVxuICAgIGNvbnN0IGdldFN0cmluZ0JlZm9yZVBpcGUgPSAoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goL15bXnxdKi8pXG4gICAgICByZXR1cm4gbWF0Y2ggPyAobWF0Y2hbMF0gPT09ICdeJCcgPyAnJyA6IG1hdGNoWzBdKSA6IGlucHV0XG4gICAgfVxuXG4gICAgY29uc3QgbWFwVXJsQXJyT2JqID0gKG9iaikgPT4ge1xuICAgICAgY29uc3QgcGlwZVJlZHVjZXIgPSAoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgYWNjW2tleV0gPSBnZXRTdHJpbmdCZWZvcmVQaXBlKG9ialtrZXldKVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvYmogPSBPYmplY3Qua2V5cyhvYmopLnJlZHVjZShwaXBlUmVkdWNlciwge30pXG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodXJsc0FycikgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB1cmxzQXJyLm1hcChtYXBVcmxBcnJPYmopXG4gICAgfVxuXG4gICAgcmV0dXJuIHVybHNBcnJcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclJvdXRlVmFsc1BhcnRNYXRjaCh1cmxzQXJyLCBkYXRhID0ge30pIHtcbiAgICAvKipcbiAgICAgKiAxLiBMb29wIHRocm91Z2ggdXJsc0FyclxuICAgICAqIDIuIExvb3AgdGhyb3VnaCBwcm9wZXJ0aWVzXG4gICAgICogMy4gQXBwbHkgbWF0Y2hHbG9iUGF0dGVybiB0byBlYWNoIHByb3BlcnR5IHZhbHVlIGFuZCBjaGVjayBmb3IgbWF0Y2ggd2l0aCBkYXRhIG9iamVjdCBwcm9wZXJ0eVxuICAgICAqIDQuIFJldHVybiB0aGUgdXBkYXRlZCBvYmplY3Qgd2l0aCBtYXRjaGVkIHZhbHVlcywgb3Iga2VlcCB0aGUgb3JpZ2luYWwgcGF0dGVybiBpZiBubyBtYXRjaFxuICAgICAqL1xuXG4gICAgY29uc3QgbWF0Y2hHbG9iUGF0dGVybiA9IChzdHIsIGdsb2JQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBnbG9iUGF0dGVybk1hdGNoID0gKHBhdHRlcm4sIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVzY2FwZWRQYXR0ZXJuID0gcGF0dGVyblxuICAgICAgICAgIC5yZXBsYWNlKC9bLS9cXFxcXiQrPy4oKXxbXFxde31dL2csICdcXFxcJCYnKSAvLyBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgICAgICAgLnJlcGxhY2UoL1xcKi9nLCAnW1xcXFx3XFxcXGRfLV0qJykgLy8gKiBzaG91bGQgbWF0Y2ggYW55IHNlcXVlbmNlIG9mIGFscGhhbnVtZXJpYywgdW5kZXJzY29yZXMsIG9yIGRhc2hlc1xuXG4gICAgICAgIGNvbnN0IHJlZ2V4UGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRQYXR0ZXJufSRgKSAvLyBNYXRjaCB0aGUgZnVsbCBzdHJpbmdcbiAgICAgICAgcmV0dXJuIHJlZ2V4UGF0dGVybi50ZXN0KHZhbHVlKVxuICAgICAgfVxuXG4gICAgICAvLyBTcGxpdCB0aGUgZ2xvYlBhdHRlcm4gYnkgcGlwZSAofClcbiAgICAgIGNvbnN0IHBhdHRlcm5zID0gZ2xvYlBhdHRlcm4uc3BsaXQoJ3wnKVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgYW55IG9mIHRoZSBwYXR0ZXJuc1xuICAgICAgY29uc3QgaGFzTWF0Y2ggPSBwYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBnbG9iUGF0dGVybk1hdGNoKHBhdHRlcm4sIHN0cikpXG5cbiAgICAgIC8vIFJldHVybiB0aGUgc3RyaW5nIGlmIHRoZXJlJ3MgYSBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZ2xvYiBwYXR0ZXJuXG4gICAgICByZXR1cm4gaGFzTWF0Y2ggPyBzdHIgOiBnbG9iUGF0dGVyblxuICAgIH1cblxuICAgIC8vIEZ1bmN0aW9uIHRvIGNoZWNrIGFuZCByZXBsYWNlIG1hdGNoaW5nIHByb3BlcnRpZXNcbiAgICBjb25zdCByZXBsYWNlTWF0Y2hpbmdQcm9wZXJ0eSA9IChvYmopID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRPYmogPSB7IC4uLm9iaiB9IC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIG9iamVjdCB0byBhdm9pZCBtdXRhdGlvblxuXG4gICAgICAvLyBGdW5jdGlvbiB0byBjaGVjayBlYWNoIHByb3BlcnR5IGFuZCBhcHBseSBtYXRjaEdsb2JQYXR0ZXJuXG4gICAgICBjb25zdCBjaGVja0FuZFJlcGxhY2VQcm9wZXJ0eSA9IChrZXkpID0+IHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh1cGRhdGVkT2JqLCBrZXkpICYmIGRhdGFba2V5XSkge1xuICAgICAgICAgIHVwZGF0ZWRPYmpba2V5XSA9IG1hdGNoR2xvYlBhdHRlcm4oZGF0YVtrZXldLCB1cGRhdGVkT2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3RcbiAgICAgIE9iamVjdC5rZXlzKHVwZGF0ZWRPYmopLmZvckVhY2goY2hlY2tBbmRSZXBsYWNlUHJvcGVydHkpXG5cbiAgICAgIHJldHVybiB1cGRhdGVkT2JqXG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBhcnJheSBhbmQgcmVwbGFjZSBtYXRjaGluZyBwcm9wZXJ0aWVzXG4gICAgcmV0dXJuIHVybHNBcnIubWFwKHJlcGxhY2VNYXRjaGluZ1Byb3BlcnR5KVxuICB9XG5cbiAgc3RhdGljIGNvbnZlcnRQYXJhbXNUb1JvdXRlKGRhdGEsIHIgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLCB0LCBsb2NTdHIpIHtcbiAgICBjb25zdCB1cmxUeXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHIudHlwZVxuICAgIGNvbnN0IGlzSGFzaCA9IHIuaXNIYXNoXG4gICAgY29uc3Qgcm91dGUgPSByLnJvdXRlcy5yb3V0ZVBhdGhcbiAgICBjb25zdCBsb2NhdGlvblN0ciA9IGxvY1N0ciAhPT0gdW5kZWZpbmVkID8gbG9jU3RyIDogdGhpcy5nZXRMb2NhdGlvblN0ckJ5VHlwZSh1cmxUeXBlLCBpc0hhc2gpXG4gICAgY29uc3QgcGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbiA9IHRoaXMuY29udmVydFJvdXRlVG9QYXJhbXMobG9jYXRpb25TdHIsIHIsIHVybFR5cGUpLnJvdXRlRGF0YVxuICAgIGxldCB1cmxBcnIgPSB0aGlzLmNyZWF0ZVJvdXRlQXJyYXlGcm9tUGFyYW1zKGRhdGEsIHJvdXRlLCB1cmxUeXBlLCBwYXJhbXNGcm9tQ3VycmVudExvY2F0aW9uKVxuXG4gICAgdXJsQXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja1BheWxvYWRGb3JSZWdleE92ZXJyaWRlcyh1cmxBcnIsIGRhdGEpXG4gICAgdXJsQXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja0ZvclJvdXRlVmFsV2l0aE11bHRpcGxlVmFscyh1cmxBcnIpXG4gICAgLy8gVEhJUyBXSUxMIE1BVENIIEVYQUNUTFkgVEhFIFBST1BFUlRZIElELCBTTyBwYWdlSWQ9XCJkYXNoYm9hcmRfMVwiIHdpbGwgcmV0dXJuIHRoYXQgaW5zdGVhZCBvZiBnbG9iUGF0dGVyblswXVxuICAgIC8vIHVybEFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY2hlY2tGb3JSb3V0ZVZhbHNQYXJ0TWF0Y2godXJsQXJyLCBkYXRhKVxuICAgIC8vIGNvbnNvbGUubG9nKCdQQVJBTVMgVE8gUk9VVEUgJywgeyBkYXRhLCByLCB1cmxBcnIsIGxvY2F0aW9uU3RyLCBwYXJhbXNGcm9tQ3VycmVudExvY2F0aW9uIH0pXG5cbiAgICAvLyBUSElTIENSRUFURVMgQSBRVUVSWSBQQVRIIFNUUlxuICAgIGlmICh1cmxUeXBlID09PSAncXVlcnknKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVRdWVyeVN0cmluZyh1cmxBcnIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU2xhc2hTdHJpbmcodXJsQXJyKVxuICB9XG5cbiAgc3RhdGljIGZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgobWFpblN0ciwgcGFyYW1zQXJyKSB7XG4gICAgY29uc3QgaXM0MDQgPSBwYXJhbXNBcnIuaW5jbHVkZXMoJy4rJylcblxuICAgIGNvbnN0IHJlRm4gPSAocykgPT4ge1xuICAgICAgaWYgKGlzNDA0KSB7XG4gICAgICAgIGlmICghcy5zdGFydHNXaXRoKCdeJykpIHtcbiAgICAgICAgICBzID0gJ14nICsgc1xuICAgICAgICB9XG4gICAgICAgIGlmICghcy5lbmRzV2l0aCgnJCcpKSB7XG4gICAgICAgICAgcyA9IHMgKyAnJCdcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cChzKVxuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrRm9yRW1wdHkgPSAgcmVwbGFjZSgvXiQvLCAnXiQnKVxuICAgIGNvbnN0IGNyZWF0ZVN0clJlZ2V4VGVzdCA9IChzdHIpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0cixcbiAgICAgICAgcmU6IHJlRm4oc3RyKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrRm9yRWl0aGVyU3RyT3JSZU1hdGNoID0gIGVpdGhlcihcbiAgICAgIHByb3BFcShtYWluU3RyLCAnc3RyJyksIGNvbXBvc2UodGVzdChfXywgbWFpblN0ciksIHByb3AoJ3JlJykpXG4gICAgKVxuXG4gICAgY29uc3QgZmluZE1hdGNoSW5kZXggPSBjb21wb3NlKGZpbmRMYXN0SW5kZXgoZXF1YWxzKHRydWUpKSwgbWFwKGNoZWNrRm9yRWl0aGVyU3RyT3JSZU1hdGNoKSwgbWFwKGNyZWF0ZVN0clJlZ2V4VGVzdCksIG1hcChjaGVja0ZvckVtcHR5KSlcblxuICAgIHJldHVybiBmaW5kTWF0Y2hJbmRleChwYXJhbXNBcnIpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZlZhbHVlU2hvdWxkTWFwVG9QYXJhbShvYmosIHN0ciwgcmVnZXhUb2tlbnMpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy8gICAgICAgVEhJUyBJUyBBIFZFUlkgSU1QT1JUQU5UIE1FVEhPRFxuICAgIC8vICAgICAgIElUIENPTVBBUkVTIFRIRSBTVFJJTkcgVE8gQkUgTUFUQ0hFRCBXSVRIIFRIRSBST1VURSBQQVRIIE9CSkVDVFxuICAgIC8vICAgICAgIEFORCBJVCBXSUxMIFJFVFVSTiBPTkUgT0YgVEhSRUUgVEhJTkdTXG4gICAgLy8gICAgICAgMS4gVEhFIFNUUklORyBJVFNFTEZcbiAgICAvLyAgICAgICAyLiBBIE1BVENISU5HIEtFWSBGUk9NIFRIRSBDVVJSRU5UIE9CSkVDVFxuICAgIC8vICAgICAgIDMuIFRIRSBST1VURU5BTUVcbiAgICAvL1xuXG4gICAgLy8gR08gVEhST1VHSCBLRVlTIEFORCBDSEVDSyBJRiBSRUdFWCBNQVRDSEVTXG5cbiAgICAvLyBHTyBUSFJPVUdIIFJPVVRFIENPTkZJRyBUTyBGSUdVUkUgT1VUIElGIFZBTCBPUiBLRVkgU0hPVUxEIEJFIENPTVBBUkVEXG4gICAgLy8gaWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCwgY2hvb3NlIHRoZSBrZXkgb2YgdGhlIHJvdXRlIHBhdGggdG8gY2hlY2sgYWdhaW5zdFxuICAgIGNvbnN0IGdldFZhbENvbXBhcmVBcnIgPSBjb21wb3NlKG1hcChsYXN0KSwgbWFwKGZpbHRlcihpcyhTdHJpbmcpKSksIHRvUGFpcnMpXG5cbiAgICAvLyBDUkVBVEUgVEhFIEFSUkFZIE9GIEVJVEhFUiBWQUxTIE9SIEtFWVNcbiAgICBjb25zdCBwYXJhbXNBcnIgPSBnZXRWYWxDb21wYXJlQXJyKG9iailcblxuICAgIC8vIFJFU1VMVFMgRlJPTSBQQVJBTSBDSEVDS1xuICAgIC8vIGxldCBwYXJhbUluZGV4ID0gY2hlY2tGb3JQYXJhbXNNYXRjaChwYXJhbXNBcnIpO1xuXG4gICAgY29uc3QgcGFyYW1JbmRleCA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuZmluZEluZGV4T2ZNYXRjaGVkU3RyaW5nT3JSZWdleChzdHIsIHBhcmFtc0FycilcblxuICAgIC8vIERFRkFVTFQgVkFMIEZPUiBTVFJJTkdcbiAgICBsZXQgcGFyYW1TdHIgPSBzdHJcblxuICAgIC8vIExFR0FDWSBNRVRIT0QgLS0gVFVSTiBPRkZcbiAgICAvLyBXSEVOIFRIRVJFIElTIEEgTUFUQ0ggRlJPTSBUSEUgQ1VSUkVOVCBST1VURSBQQVRIIE9CSkVDVFxuICAgIGlmIChwYXJhbUluZGV4ID49IDApIHtcbiAgICAgIGNvbnN0IHBhcmFtID0gcGFyYW1zQXJyW3BhcmFtSW5kZXhdXG4gICAgICBjb25zdCBpbnZlcnRlZE9iaiA9IGludmVydChvYmopXG5cbiAgICAgIC8vIFBVTEwgSU5WRVJURUQgT0JKRUNUIFRPIFNFRSBJRiBTVFIgTUFUQ0hFU1xuICAgICAgY29uc3QgZ2V0UGFyYW1JbnZlcnRlZCA9IGNvbXBvc2UoaGVhZCwgZGVmYXVsdFRvKFtdKSwgcHJvcChwYXJhbSkpXG4gICAgICBjb25zdCBwYXJhbUludmVydGVkID0gZ2V0UGFyYW1JbnZlcnRlZChpbnZlcnRlZE9iailcbiAgICAgIC8vIHNweW5lIDExLjAuMTtcbiAgICAgIGNvbnN0IHJlID0gIC9eKFstJFxcd10qKSQvXG4gICAgICBjb25zdCBrZXlNYXRjaCA9ICByZS50ZXN0KHBhcmFtSW52ZXJ0ZWQpXG5cbiAgICAgIGlmIChrZXlNYXRjaCA9PT0gdHJ1ZSAmJiBpcyhTdHJpbmcsIHBhcmFtSW52ZXJ0ZWQpID09PSB0cnVlKSB7XG4gICAgICAgIHBhcmFtU3RyID0gcGFyYW1JbnZlcnRlZFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbVN0clxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUFyckZyb21TbGFzaFN0cihzdHIpIHtcbiAgICBjb25zdCBzbGFzaFJlID0gL14oWy9dKT8oLiopJC9cbiAgICByZXR1cm4gc3RyLnJlcGxhY2Uoc2xhc2hSZSwgJyQyJykuc3BsaXQoJy8nKVxuICB9XG5cbiAgc3RhdGljIGNvbnZlcnRTbGFzaFJvdXRlU3RyVG9QYXJhbXNPYmoodG9wTGV2ZWxSb3V0ZSwgc3RyLCByZWdleFRva2Vucykge1xuICAgIGNvbnN0IHJvdXRlVmFsdWUgPSBzdHJcbiAgICBjb25zdCB2YWx1ZXNBcnIgPSB0aGlzLmNyZWF0ZUFyckZyb21TbGFzaFN0cihzdHIpXG4gICAgY29uc3QgcGF0aHMgPSBbXVxuICAgIGNvbnN0IHJvdXRlZFZhbHVlc0FyciA9IFtdXG4gICAgbGV0IGxhdGVzdE9iaiA9IHRvcExldmVsUm91dGVcbiAgICBjb25zdCBjcmVhdGVQYXJhbXNGcm9tU3RyID0gKHRvdGFsLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHJvdXRlVmFsdWVTdHIgPSB0aGlzLmNoZWNrSWZWYWx1ZVNob3VsZE1hcFRvUGFyYW0obGF0ZXN0T2JqLCBjdXJyZW50VmFsdWUsIHJlZ2V4VG9rZW5zKVxuXG4gICAgICBsYXRlc3RPYmogPSB0aGlzLmNoZWNrSWZQYXJhbVZhbHVlTWF0Y2hlc1JlZ2V4KGN1cnJlbnRWYWx1ZSwgbGF0ZXN0T2JqKVxuICAgICAgY29uc3QgcHJldlBhdGhOb3RFcUN1cnJlbnRQYXRoID0gKHN0cikgPT4gc3RyICE9PSBsYXN0KHBhdGhzKVxuXG4gICAgICBjb25zdCBpc0VtcHR5T3JOaWwgPSBlaXRoZXIoaXNFbXB0eSwgaXNOaWwpXG5cbiAgICAgIGlmIChsYXRlc3RPYmogIT09IHVuZGVmaW5lZCAmJiBwcmV2UGF0aE5vdEVxQ3VycmVudFBhdGgobGF0ZXN0T2JqLnJvdXRlTmFtZSkgJiYgaXNFbXB0eU9yTmlsKHJvdXRlVmFsdWVTdHIpID09PSBmYWxzZSkge1xuICAgICAgICBwYXRocy5wdXNoKGxhdGVzdE9iai5yb3V0ZU5hbWUpXG4gICAgICAgIHJvdXRlZFZhbHVlc0Fyci5wdXNoKHJvdXRlVmFsdWVTdHIpXG4gICAgICB9XG4gICAgICBjb25zdCBzdHJQYXRoID0gW2N1cnJlbnRWYWx1ZSwgJ3JvdXRlUGF0aCddXG4gICAgICBjb25zdCByb3V0ZVBhcmFtUGF0aCA9IFsncm91dGVQYXRoJ11cbiAgICAgIGNvbnN0IG9iamVjdEZyb21TdHIgPSBwYXRoKHN0clBhdGgsIGxhdGVzdE9iailcbiAgICAgIGNvbnN0IG9iamVjdEZyb21Sb3V0ZVBhcmFtID0gcGF0aChyb3V0ZVBhcmFtUGF0aCwgbGF0ZXN0T2JqKVxuXG4gICAgICBpZiAob2JqZWN0RnJvbVN0ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxhdGVzdE9iaiA9IG9iamVjdEZyb21TdHJcbiAgICAgIH0gZWxzZSBpZiAob2JqZWN0RnJvbVJvdXRlUGFyYW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsYXRlc3RPYmogPSBvYmplY3RGcm9tUm91dGVQYXJhbVxuICAgICAgfVxuICAgIH1cblxuICAgIHJlZHVjZShjcmVhdGVQYXJhbXNGcm9tU3RyLCAwLCB2YWx1ZXNBcnIpXG4gICAgY29uc3Qgcm91dGVEYXRhID0gemlwT2JqKHBhdGhzLCByb3V0ZWRWYWx1ZXNBcnIpXG4gICAgY29uc3QgcGF0aElubmVybW9zdCA9IHRoaXMuZ2V0TGFzdEFyclZhbChwYXRocylcbiAgICByZXR1cm4geyBwYXRocywgcGF0aElubmVybW9zdCwgcm91dGVEYXRhLCByb3V0ZVZhbHVlIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRMYXN0QXJyVmFsKGFycikge1xuICAgIGNvbnN0IGdldExhc3RQYXJhbSA9IChhKSA9PiBsYXN0KGEpICE9PSB1bmRlZmluZWQgPyBsYXN0KGEpIDogJydcbiAgICByZXR1cm4gZ2V0TGFzdFBhcmFtKGFycilcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVEZWZhdWx0UGFyYW1Gcm9tRW1wdHlTdHIodG9wTGV2ZWxSb3V0ZSwgc3RyKSB7XG4gICAgY29uc3Qgb2JqID0ge31cbiAgICBjb25zdCBrZXl3b3JkID0gdG9wTGV2ZWxSb3V0ZS5yb3V0ZU5hbWVcbiAgICBvYmpba2V5d29yZF0gPSB0aGlzLmNoZWNrSWZWYWx1ZVNob3VsZE1hcFRvUGFyYW0odG9wTGV2ZWxSb3V0ZSwgc3RyKVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0UXVlcnlTdHJUb1BhcmFtcyh0b3BMZXZlbFJvdXRlLCBzdHIsIHJlZ2V4VG9rZW5zKSB7XG4gICAgY29uc3QgcXVlcnlSZSA9IC9eKFs/XSk/KC4qKSQvXG4gICAgY29uc3Qgcm91dGVWYWx1ZSA9IHN0clxuICAgIGNvbnN0IHN0ckFyciA9IHN0ci5yZXBsYWNlKHF1ZXJ5UmUsICckMicpXG4gICAgY29uc3QgY29udmVydFRvUGFyYW1zID0gY29tcG9zZShtYXAoc3BsaXQoJz0nKSksIHNwbGl0KCcmJykpXG4gICAgY29uc3QgcGFyYW1zQXJyID0gY29udmVydFRvUGFyYW1zKHN0ckFycilcbiAgICBsZXQgcm91dGVEYXRhID0gZnJvbVBhaXJzKHBhcmFtc0FycilcblxuICAgIGxldCBwYXRocyA9IG1hcChoZWFkLCBwYXJhbXNBcnIpXG5cbiAgICBpZiAoaXNFbXB0eShzdHIpID09PSB0cnVlKSB7XG4gICAgICByb3V0ZURhdGEgPSB0aGlzLmNyZWF0ZURlZmF1bHRQYXJhbUZyb21FbXB0eVN0cih0b3BMZXZlbFJvdXRlLCBzdHIsIHJlZ2V4VG9rZW5zKVxuICAgICAgcGF0aHMgPSBrZXlzKHJvdXRlRGF0YSlcbiAgICB9XG4gICAgY29uc3QgcGF0aElubmVybW9zdCA9IHRoaXMuZ2V0TGFzdEFyclZhbChwYXRocylcblxuICAgIHJldHVybiB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfVxuICB9XG5cbiAgc3RhdGljIGNvbnZlcnRSb3V0ZVRvUGFyYW1zKHN0ciwgcm91dGVDb25maWcsIHQpIHtcbiAgICBjb25zdCBhZGRTbGFzaCA9ICh1cmwpID0+IHVybC5yZXBsYWNlKC9cXC8kfCQvLCAnLycpXG4gICAgaWYgKHJvdXRlQ29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgICBjb25zdCB0eXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHJvdXRlQ29uZmlnLnR5cGVcbiAgICBjb25zdCByZWdleFRva2VucyA9IGRlZmF1bHRUbyh7fSwgcHJvcCgncmVnZXhUb2tlbnMnLCByb3V0ZUNvbmZpZykpXG4gICAgY29uc3QgdG9wTGV2ZWxSb3V0ZSA9IHJvdXRlQ29uZmlnLnJvdXRlcy5yb3V0ZVBhdGhcblxuICAgIGlmICh0eXBlID09PSAncXVlcnknKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0UXVlcnlTdHJUb1BhcmFtcyh0b3BMZXZlbFJvdXRlLCBzdHIpXG4gICAgfVxuICAgIHN0ciA9IGFkZFNsYXNoKHN0cilcblxuICAgIHJldHVybiB0aGlzLmNvbnZlcnRTbGFzaFJvdXRlU3RyVG9QYXJhbXNPYmoodG9wTGV2ZWxSb3V0ZSwgc3RyLCByZWdleFRva2VucylcbiAgfVxufVxuIiwiaW1wb3J0IHsgZnJvbUV2ZW50UGF0dGVybiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBsYXN0LCBmbGF0dGVuLCBjbG9uZSwgcGljaywgcHJvcCwgcGlja0FsbCwgcGF0aCwgZXF1YWxzLCBjb21wb3NlLCBrZXlzLCBmaWx0ZXIsIHByb3BFcSwgdW5pcSwgbWFwLCBfXywgY2hhaW4sIGlzLCBpbmNsdWRlcywgZnJvbVBhaXJzLCByZWplY3QsIG1lcmdlRGVlcFJpZ2h0LCBtZXJnZVJpZ2h0LCB0ZXN0LCB0b1BhaXJzLCB2YWx1ZXMgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwgfSBmcm9tICcuL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUtdXJsLmpzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8qKlxuICAgICAqIEBtb2R1bGUgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVxuICAgICAqIEB0eXBlIGludGVybmFsXG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAZGVzY1xuICAgICAqIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcyBmb3IgdGhlIFNweW5lUm91dGVDaGFubmVsXG4gICAgICpcbiAgICAgKi9cbiAgICB0aGlzLmNyZWF0ZVBvcFN0YXRlU3RyZWFtID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5jcmVhdGVQb3BTdGF0ZVN0cmVhbS5iaW5kKHRoaXMpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUG9wU3RhdGVTdHJlYW0oc3Vic2NyaWJlRm4pIHtcbiAgICBjb25zdCBhZGRIYW5kbGVyID0gZnVuY3Rpb24oaGFuZGxlcikge1xuICAgICAgd2luZG93Lm9ucG9wc3RhdGUgPSBoYW5kbGVyXG4gICAgfVxuICAgIGNvbnN0IHJlbW92ZUhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oKSB7fVxuICAgIH1cbiAgICBjb25zdCBwb3B1cE9icyQgPSBmcm9tRXZlbnRQYXR0ZXJuKGFkZEhhbmRsZXIsIHJlbW92ZUhhbmRsZXIpXG5cbiAgICBwb3B1cE9icyQuc3Vic2NyaWJlKHN1YnNjcmliZUZuKVxuICB9XG5cbiAgc3RhdGljIGdldExhc3RBcnJWYWwoYXJyKSB7XG4gICAgY29uc3QgZ2V0TGFzdFBhcmFtID0gKGEpID0+IGxhc3QoYSkgIT09IHVuZGVmaW5lZCA/IGxhc3QoYSkgOiAnJ1xuICAgIHJldHVybiBnZXRMYXN0UGFyYW0oYXJyKVxuICB9XG5cbiAgc3RhdGljIGNvbXBhcmVSb3V0ZUtleXdvcmRzKG9iaiA9IHt9LCBhcnIpIHtcbiAgICBjb25zdCBwaWNrVmFsdWVzID0gKG8sIGEpID0+IGEgIT09IHVuZGVmaW5lZCA/IHBpY2soYSwgbykgOiBvXG4gICAgbGV0IG9iajEgPSBwaWNrVmFsdWVzKG9iaiwgYXJyKVxuICAgIHJldHVybiB7XG4gICAgICBwaWNrVmFsdWVzLFxuICAgICAgY29tcGFyZTogKG9iaiA9IHt9LCBhcnIpID0+IHtcbiAgICAgICAgY29uc3Qgb2JqMiA9IHBpY2tWYWx1ZXMob2JqLCBhcnIpXG4gICAgICAgIGNvbnN0IGNvbXBhcmVQcm9wcyA9IHAgPT4ge1xuICAgICAgICAgIGNvbnN0IHAxID0gcHJvcChwLCBvYmoxKVxuICAgICAgICAgIGNvbnN0IHAyID0gcHJvcChwLCBvYmoyKVxuICAgICAgICAgIGNvbnN0IHNhbWUgPSBlcXVhbHMocDEsIHAyKVxuICAgICAgICAgIGNvbnN0IHByZXZpb3VzRXhpc3RzID0gcDEgIT09IHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IG5leHRFeGlzdHMgPSBwMiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgY29uc3QgY2hhbmdlZCA9ICFzYW1lXG4gICAgICAgICAgY29uc3QgYWRkZWQgPSBwcmV2aW91c0V4aXN0cyA9PT0gZmFsc2UgJiYgbmV4dEV4aXN0cyA9PT0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSBwcmV2aW91c0V4aXN0cyA9PT0gdHJ1ZSAmJiBuZXh0RXhpc3RzID09PSBmYWxzZVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUDogXCIscCx7c2FtZSwgcHJldmlvdXNFeGlzdHMsIG5leHRFeGlzdHN9KTtcbiAgICAgICAgICBjb25zdCBvYmogPSB7fVxuICAgICAgICAgIG9ialtwXSA9IHsgc2FtZSwgY2hhbmdlZCwgYWRkZWQsIHJlbW92ZWQsIHByZXZpb3VzRXhpc3RzLCBuZXh0RXhpc3RzIH1cbiAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjcmVhdGVQcmVkID0gcCA9PiBjb21wb3NlKGtleXMsIGZpbHRlcihwcm9wRXEodHJ1ZSwgcCkpKVxuXG4gICAgICAgIGNvbnN0IGdldFByb3BzU3RhdGUgPSBjb21wb3NlKG1hcChjb21wYXJlUHJvcHMpLCB1bmlxLCBjaGFpbihrZXlzKSkoW29iajEsIG9iajJdKVxuICAgICAgICBjb25zdCBwYXRoc0NoYW5nZWQgPSBjaGFpbihjcmVhdGVQcmVkKCdjaGFuZ2VkJyksIGdldFByb3BzU3RhdGUpXG4gICAgICAgIGNvbnN0IHBhdGhzQWRkZWQgPSBjaGFpbihjcmVhdGVQcmVkKCdhZGRlZCcpLCBnZXRQcm9wc1N0YXRlKVxuICAgICAgICBjb25zdCBwYXRoc1JlbW92ZWQgPSBjaGFpbihjcmVhdGVQcmVkKCdyZW1vdmVkJyksIGdldFByb3BzU3RhdGUpXG4gICAgICAgIG9iajEgPSBvYmoyXG4gICAgICAgIHJldHVybiB7IHBhdGhzQWRkZWQsIHBhdGhzUmVtb3ZlZCwgcGF0aHNDaGFuZ2VkIH1cbiAgICAgIH0sXG5cbiAgICAgIGdldENvbXBhcmVyOiAoKSA9PiBvYmoxXG5cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVBcnJEYXRhKHJvdXRlQXJyLCBwYXJhbXNBcnIpIHtcbiAgICBjb25zdCBwYXRocyA9ICBmaWx0ZXIoaW5jbHVkZXMoX18sIHJvdXRlQXJyKSwgcGFyYW1zQXJyKVxuICAgIGNvbnN0IHBhdGhJbm5lcm1vc3QgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmdldExhc3RBcnJWYWwocGF0aHMpXG4gICAgLy8gY29uc29sZS5sb2coJ2FyciBhbmQgcm91dGVOYW1lICcse3BhdGhzLCBwYXRoSW5uZXJtb3N0fSk7XG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QgfVxuICB9XG5cbiAgc3RhdGljIGZsYXR0ZW5Db25maWdPYmplY3Qob2JqKSB7XG4gICAgY29uc3QgZ28gPSAob2JqXykgPT4gY2hhaW4oKFtrLCB2XSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgIHJldHVybiBtYXAoKFtrXywgdl9dKSA9PiBbYCR7a30uJHtrX31gLCB2X10sIGdvKHYpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtbaywgdl1dXG4gICAgICB9XG4gICAgfSwgdG9QYWlycyhvYmpfKSlcblxuICAgIC8vIGNvbnNvbGUubG9nKFwiRkxBVFRFTjogXCIsIHZhbHVlcyhmcm9tUGFpcnMoZ28ob2JqKSkpKTtcbiAgICByZXR1cm4gdmFsdWVzKGZyb21QYWlycyhnbyhvYmopKSlcbiAgfVxuXG4gIHN0YXRpYyBhZGRSb3V0ZURhdGFzZXRzKGNoYW5uZWxSb3V0ZU9iaikge1xuICAgIC8vIGNoYW5uZWxSb3V0ZU9iai50eXBlPSdxdWVyeSc7XG5cbiAgICBmdW5jdGlvbiByZW1vdmVVbmRlZmluZWQoYXJyKSB7XG4gICAgICByZXR1cm4gYXJyLm1hcChvYmogPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAndW5kZWZpbmVkJyB8fCBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWxldGUgb2JqW2tleV1cbiAgICAgICAgICB9IGVsc2UgaWYgKG9ialtrZXldICYmIHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2JqW2tleV0pKSB7XG4gICAgICAgICAgICAvLyByZWN1cnNlIGlmIG5lc3RlZCBvYmplY3RcbiAgICAgICAgICAgIG9ialtrZXldID0gcmVtb3ZlVW5kZWZpbmVkKFtvYmpba2V5XV0pWzBdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmpcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgeyB0eXBlLCBpc0hhc2ggfSA9IGNoYW5uZWxSb3V0ZU9ialxuXG4gICAgLy8gY3JlYXRlIGhyZWYgYW5kIGNoZWNrIHRvIHNlZSBpZiBuZWVkIHRvIGNvbnZlcnQgdG8gaGFzaCBocmVmIGxpbmtzXG4gICAgY29uc3QgZ2V0SFJFRiA9IChvYmopID0+IHtcbiAgICAgIGNvbnN0IHNhbnRpemVIUkVGID0gc3RyID0+IHtcbiAgICAgICAgY29uc3QgaHJlZlJFID0gL14oLipcXC8pKFtcXHctXSpcXC8/KSguKikkL2dtXG4gICAgICAgIC8vIGNvbnN0IGhyZWZSRSA9IC9eKC4qXFwvKShbXFx3LV0qKSguKikkL2dtO1xuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShocmVmUkUsICckMSQyJylcbiAgICAgICAgLy8gc3RyID0gU3RyaW5nKHN0cikucmVwbGFjZSgnXiQnLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHN0clxuICAgICAgfVxuXG4gICAgICBjb25zdCBoZWFkU3RyVmFsID0gdHlwZSA9PT0gJ3F1ZXJ5JyA/ICcnIDogaXNIYXNoID09PSB0cnVlID8gJyMnIDogJy8nXG4gICAgICBjb25zdCBocmVmU3RyID0gIFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY29udmVydFBhcmFtc1RvUm91dGUob2JqLCBjaGFubmVsUm91dGVPYmopXG4gICAgICByZXR1cm4gaGVhZFN0clZhbCArIHNhbnRpemVIUkVGKGhyZWZTdHIpXG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIHNwZWNpYWwgY2hhcnMgZnJvbSBocmVmXG4gICAgY29uc3Qgc2FuaXRpemVTdHIgPSAoc3RyKSA9PiBTdHJpbmcoc3RyKS5yZXBsYWNlKC8oW15BLVphLXowLTktX10pL2csICcnKVxuXG4gICAgLy8gdGVzdCB3aGV0aGVyIHRvIHVzZSBrZXkgb3IgdmFsXG4gICAgY29uc3QgaXNWYWxpZFN0clJFID0gL14oW0EtWmEtejAtOV8tXSkrJC9tXG5cbiAgICBjb25zdCBjcmVhdGVJbml0aWFsVmFsRm4gPSAoYWNjTWFpbiA9IFtdLCByb3V0ZVBhdGhPYmosIG9iakFjYyA9IHt9KSA9PiB7XG4gICAgICBsZXQgeyByb3V0ZU5hbWUgfSA9IHJvdXRlUGF0aE9ialxuXG4gICAgICBjb25zdCBwcm9wc1JlZHVjZXIgPSAoYWNjLCBhcnJQYWlyKSA9PiB7XG4gICAgICAgIGNvbnN0IFtrZXksIHZhbF0gPSBhcnJQYWlyXG4gICAgICAgIGNvbnN0IGlzT2JqZWN0ID0gaXMoT2JqZWN0LCB2YWwpXG5cbiAgICAgICAgY29uc3QgY3JlYXRlVGl0bGUgPSAoc3RyKSA9PiBTdHJpbmcoc3RyKS5yZXBsYWNlKC8oWy1fXSkvZywgJyAnKS50b1VwcGVyQ2FzZSgpXG5cbiAgICAgICAgY29uc3QgZ2V0TGlua1RleHQgPSBzdHIgPT4gdGVzdChpc1ZhbGlkU3RyUkUsIHN0cikgPyBjcmVhdGVUaXRsZShzdHIpIDoga2V5XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ3JvdXRlTmFtZScgfHwga2V5ID09PSAnNDA0Jykge1xuICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRlTmFtZSA9IHJvdXRlTmFtZSB8fCBwcm9wKCdyb3V0ZU5hbWUnLCB2YWwpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVEhFIEtFWSBJUyBcIix7a2V5LHZhbCxyb3V0ZU5hbWV9KVxuXG4gICAgICAgIGxldCBvID0gY2xvbmUob2JqQWNjKVxuICAgICAgICBvW3JvdXRlTmFtZV0gPSBzYW5pdGl6ZVN0cihrZXkpXG5cbiAgICAgICAgaWYgKGlzT2JqZWN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgaWYgKGtleXMobykubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJSb3V0ZU5hbWUgPSBwYXRoKFsncm91dGVQYXRoJywgJ3JvdXRlTmFtZSddLCB2YWwpXG4gICAgICAgICAgICBpZiAoc3ViUm91dGVOYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9CYXNlID0gY2xvbmUobylcbiAgICAgICAgICAgICAgb0Jhc2Vbc3ViUm91dGVOYW1lXSA9ICcnXG4gICAgICAgICAgICAgIG9CYXNlLm5hdkxldmVsID0ga2V5cyhvYmpBY2MpLmxlbmd0aFxuICAgICAgICAgICAgICBvQmFzZS50aXRsZSA9IGdldExpbmtUZXh0KGtleSlcbiAgICAgICAgICAgICAgb0Jhc2UuaHJlZiA9IGdldEhSRUYob0Jhc2UpXG4gICAgICAgICAgICAgIGFjYy5wdXNoKG9CYXNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvID0gY3JlYXRlSW5pdGlhbFZhbEZuKGFjY01haW4sIHZhbCwgbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvLnRpdGxlID0gZ2V0TGlua1RleHQoa2V5KVxuICAgICAgICAgIG8uaHJlZiA9IGdldEhSRUYobylcbiAgICAgICAgfVxuICAgICAgICBvLm5hdkxldmVsID0ga2V5cyhvYmpBY2MpLmxlbmd0aFxuICAgICAgICBhY2MucHVzaChvKVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0b1BhaXJzKHJvdXRlUGF0aE9iaikucmVkdWNlKHByb3BzUmVkdWNlciwgW10pXG4gICAgfVxuXG4gICAgY29uc3QgcmVkdWNlZEFyciA9IGNyZWF0ZUluaXRpYWxWYWxGbihbXSwgY2hhbm5lbFJvdXRlT2JqLnJvdXRlcylcbiAgICBsZXQgcm91dGVEYXRhc2V0c0FyciA9IGZsYXR0ZW4ocmVkdWNlZEFycilcbiAgICByb3V0ZURhdGFzZXRzQXJyID0gcmVtb3ZlVW5kZWZpbmVkKHJvdXRlRGF0YXNldHNBcnIpXG5cbiAgICBjb25zdCBnZXROYXZQcm9wcyA9IChkYXRhc2V0c0FycikgPT4ge1xuICAgICAgY29uc3QgZXhjbHVkZSA9IHJlamVjdChpbmNsdWRlcyhfXywgWyd0aXRsZScsICdocmVmJywgJ25hdkxldmVsJywgJ3VuZGVmaW5lZCddKSlcbiAgICAgIGNvbnN0IGdldE1haW5LZXlzID0gY29tcG9zZSh1bmlxLCBleGNsdWRlLCBmbGF0dGVuLCBtYXAoa2V5cykpXG4gICAgICByZXR1cm4gZ2V0TWFpbktleXMoZGF0YXNldHNBcnIpXG4gICAgfVxuICAgIGNvbnN0IHJvdXRlTmFtZXNBcnIgPSBnZXROYXZQcm9wcyhyb3V0ZURhdGFzZXRzQXJyKVxuXG4gICAgcmV0dXJuIHsgcm91dGVEYXRhc2V0c0Fyciwgcm91dGVOYW1lc0FyciB9XG4gIH1cblxuICBzdGF0aWMgY29uZm9ybVJvdXRlT2JqZWN0KGNoYW5uZWxSb3V0ZU9iaiA9IHt9LCBhZGQ0MDRQcm9wcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgY2hhbm5lbHNSb3V0ZVBhdGggPSBwYXRoKFsnY2hhbm5lbHMnLCAnUk9VVEUnXSwgY2hhbm5lbFJvdXRlT2JqKVxuICAgIGxldCB7IGFkZDQwNHMgfSA9IGNoYW5uZWxzUm91dGVQYXRoICE9PSB1bmRlZmluZWQgPyBjaGFubmVsc1JvdXRlUGF0aCA6IGNoYW5uZWxSb3V0ZU9ialxuICAgIGFkZDQwNHMgPSBhZGQ0MDRzIHx8IGFkZDQwNFByb3BzXG4gICAgY29uc3QgcGFyc2VSb3V0ZVBhdGggPSAoYSkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gYVsxXVxuICAgICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSwgdmFsKVxuICAgICAgaWYgKHZhbCA9PT0gJycpIHtcbiAgICAgICAgYVsxXSA9ICdeJCdcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnIpIHtcbiAgICAgICAgYVsxXSA9IHZhbC5qb2luKCd8JylcbiAgICAgIH1cbiAgICAgIHJldHVybiBhXG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNkdWNlQ29uZmlnID0gKGFycikgPT4ge1xuICAgICAgY29uc3QgW2tleSwgdmFsXSA9IGFyclxuICAgICAgY29uc3Qgb2JqNDA0ID0gYWRkNDA0cyA/IHsgNDA0OiAnLisnIH0gOiB7fVxuICAgICAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QsIHZhbClcbiAgICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXksIHZhbClcbiAgICAgIGNvbnN0IGl0ZXJPYmogPSBpc09iaiA9PT0gdHJ1ZSAmJiBpc0FyciA9PT0gZmFsc2VcbiAgICAgIGNvbnN0IGlzUm91dGVQYXRoID0ga2V5ID09PSAncm91dGVQYXRoJ1xuICAgICAgaWYgKGl0ZXJPYmopIHtcbiAgICAgICAgYXJyWzFdID0gY29uZmlnTWFwcGVyRm4oYXJyWzFdKVxuICAgICAgICBpZiAoaXNSb3V0ZVBhdGgpIHtcbiAgICAgICAgICBhcnJbMV0gPSBjb21wb3NlKG1lcmdlRGVlcFJpZ2h0KG9iajQwNCksIGZyb21QYWlycywgbWFwKHBhcnNlUm91dGVQYXRoKSwgdG9QYWlycykoYXJyWzFdKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyXG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnTWFwcGVyRm4gPSBjb21wb3NlKGZyb21QYWlycywgbWFwKHRyYW5zZHVjZUNvbmZpZyksIHRvUGFpcnMpXG5cbiAgICBpZiAoY2hhbm5lbHNSb3V0ZVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFID0gY29uZmlnTWFwcGVyRm4oY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFKVxuICAgICAgY29uc3QgZXh0cmFSb3V0ZURhdGEgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmFkZFJvdXRlRGF0YXNldHMoY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFKVxuICAgICAgY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFID0gbWVyZ2VSaWdodChjaGFubmVsUm91dGVPYmouY2hhbm5lbHMuUk9VVEUsIGV4dHJhUm91dGVEYXRhKVxuICAgICAgcmV0dXJuIGNoYW5uZWxSb3V0ZU9ialxuICAgIH1cblxuICAgIHJldHVybiBjb25maWdNYXBwZXJGbihjaGFubmVsUm91dGVPYmopXG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYXRpb25EYXRhKCkge1xuICAgIGNvbnN0IGxvY2F0aW9uUGFyYW1zQXJyID0gW1xuICAgICAgJ2hyZWYnLFxuICAgICAgJ29yaWdpbicsXG4gICAgICAncHJvdG9jb2wnLFxuICAgICAgJ2hvc3QnLFxuICAgICAgJ2hvc3RuYW1lJyxcbiAgICAgICdwb3J0JyxcbiAgICAgICdwYXRobmFtZScsXG4gICAgICAnc2VhcmNoJyxcbiAgICAgICdoYXNoJ11cbiAgICByZXR1cm4gcGlja0FsbChsb2NhdGlvblBhcmFtc0Fyciwgd2luZG93LmxvY2F0aW9uKVxuICB9XG59XG4iLCJpbXBvcnQgeyBmcm9tRXZlbnRQYXR0ZXJuIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgbWFwT2JqSW5kZXhlZCB9IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvd1xuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGRlc2NcbiAgICogSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzIGZvciBTcHluZVdpbmRvd0NoYW5uZWxcbiAgICpcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCA9IFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQuYmluZChcbiAgICAgIHRoaXMpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudChldmVudE5hbWUsIG1hcEZuLCBpc1Bhc3NpdmUgPSB0cnVlLCBlbGVtZW50ID0gd2luZG93KSB7XG4gICAgY29uc3QgYWRkSGFuZGxlciA9IGhhbmRsZXIgPT4gZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcixcbiAgICAgIHsgcGFzc2l2ZTogaXNQYXNzaXZlIH0pXG4gICAgY29uc3QgcmVtb3ZlSGFuZGxlciA9ICgpID0+IHsgZWxlbWVudFtldmVudE5hbWVdID0gKHApID0+IHAgfVxuICAgIG1hcEZuID0gbWFwRm4gPT09IHVuZGVmaW5lZCA/IChwKSA9PiBwIDogbWFwRm5cbiAgICByZXR1cm4gZnJvbUV2ZW50UGF0dGVybihhZGRIYW5kbGVyLCByZW1vdmVIYW5kbGVyKS5waXBlKG1hcChtYXBGbikpXG4gIH1cblxuICAvLyBNRURJQSBRVUVSSUVTXG4gIHN0YXRpYyBjcmVhdGVNZWRpYVF1ZXJ5KHN0cikge1xuICAgIGNvbnN0IG1xID0gd2luZG93Lm1hdGNoTWVkaWEoc3RyKVxuICAgIHRoaXMuY2hlY2tJZlZhbGlkTWVkaWFRdWVyeShtcSwgc3RyKVxuICAgIHJldHVybiBtcSAhPT0gZmFsc2UgPyBtcSA6IGZhbHNlXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZlZhbGlkTWVkaWFRdWVyeShtcSwgc3RyKSB7XG4gICAgY29uc3Qgbm9TcGFjZXMgPSBzdHIgPT4gc3RyLnJlcGxhY2UoL1xccysvZ20sICcnKVxuICAgIGNvbnN0IGlzVmFsaWRCb29sID0gbXEubWF0Y2hlcyAhPT0gdW5kZWZpbmVkICYmIG5vU3BhY2VzKG1xLm1lZGlhKS5pbmRleE9mKG5vU3BhY2VzKHN0cikpID49IDBcbiAgICBjb25zdCB3YXJuTXNnID0gc3RyID0+IGNvbnNvbGUud2FybihgU3B5bmUgSW5mbzogdGhlIGZvbGxvd2luZyBxdWVyeSBzdHJpbmcsIFwiJHtzdHJ9XCIsIGhhcyBiZWVuIG9wdGltaXplZCB0byBcIiR7bXEubWVkaWF9XCIgYnkgdGhlIGJyb3dzZXIgYW5kIG1heSBub3QgYmUgYSB2YWxpZCBNZWRpYSBRdWVyeSBpdGVtIWApXG4gICAgaWYgKGlzVmFsaWRCb29sID09PSBmYWxzZSkge1xuICAgICAgd2Fybk1zZyhzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkQm9vbFxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyKHF1ZXJ5LCBrZXkpIHtcbiAgICBjb25zdCBrZXlGbiA9IGtleSA9PiBwID0+IHtcbiAgICAgIHAubWVkaWFRdWVyeU5hbWUgPSBrZXlcbiAgICAgIHJldHVybiBwXG4gICAgfVxuXG4gICAgY29uc3QgbWFwS2V5ID0ga2V5Rm4oa2V5KVxuXG4gICAgY29uc3QgaGFuZGxlcnMgPSAocSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRkSGFuZGxlcjogKGhhbmRsZXIpID0+IHsgcS5hZGRMaXN0ZW5lcihoYW5kbGVyKSB9LFxuICAgICAgICByZW1vdmVIYW5kbGVyOiAoaGFuZGxlcikgPT4geyBxLm9uY2hhbmdlID0gKCkgPT4ge30gfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtZWRpYVF1ZXJ5SGFuZGxlciA9IGhhbmRsZXJzKHF1ZXJ5KVxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5ldy1jYXAgKi9cbiAgICByZXR1cm4gbmV3IGZyb21FdmVudFBhdHRlcm4oXG4gICAgICBtZWRpYVF1ZXJ5SGFuZGxlci5hZGRIYW5kbGVyLFxuICAgICAgbWVkaWFRdWVyeUhhbmRsZXIucmVtb3ZlSGFuZGxlcilcbiAgICAgIC5waXBlKG1hcChtYXBLZXkpKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZU1lcmdlZE9ic0Zyb21PYmooY29uZmlnKSB7XG4gICAgY29uc3QgbWVkaWFRdWVyaWVzT2JqID0gY29uZmlnLm1lZGlhUXVlcmllcyB8fCBjb25maWcubWVkaWFRdWVyaWVzXG4gICAgY29uc3QgYXJyID0gW11cblxuICAgIGNvbnN0IGxvb3BRdWVyaWVzID0gKHZhbCwga2V5LCBvYmopID0+IHtcbiAgICAgIGNvbnN0IG1xID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVkaWFRdWVyeSh2YWwpXG4gICAgICBpZiAobXEgIT09IGZhbHNlKSB7XG4gICAgICAgIGFyci5wdXNoKFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyKG1xLCBrZXkpKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFyclxuICAgIH1cblxuICAgIG1hcE9iakluZGV4ZWQobG9vcFF1ZXJpZXMsIG1lZGlhUXVlcmllc09iailcbiAgICByZXR1cm4gYXJyXG4gIH1cbn1cbiIsImNvbnN0IGNyZWF0ZUZhZGVySW5saW5lVGV4dCA9IChpc0luQm9vbCA9IGZhbHNlLCB0ID0gMSwgZSA9ICdlYXNlJywgc3RhcnRaZXJvQm9vbCA9IGZhbHNlKSA9PiB7XG4gIGNvbnN0IGluaXRPcGFjaXR5WmVybyA9IHN0YXJ0WmVyb0Jvb2wgPT09IHRydWUgPyAnb3BhY2l0eTowOycgOiAnJ1xuICBjb25zdCBvcGFjaXR5ID0gaXNJbkJvb2wgPT09IHRydWUgPyAxIDogMFxuICByZXR1cm4gYCR7aW5pdE9wYWNpdHlaZXJvfXRyYW5zaXRpb246IG9wYWNpdHkgJHt0fXMgJHtlfTsgb3BhY2l0eTogJHtvcGFjaXR5fTtgXG59XG5leHBvcnQgZnVuY3Rpb24gZmFkZWluKGVsLCB0KSB7XG4gIGNvbnN0IGN1cnJlbnRPcGFjaXR5ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLm9wYWNpdHkgKiAxXG4gIGNvbnN0IHN0YXJ0QXRaZXJvID0gY3VycmVudE9wYWNpdHkgPT09IDFcbiAgY29uc3QgaW5saW5lQ3NzID0gY3JlYXRlRmFkZXJJbmxpbmVUZXh0KHRydWUsIHQsICdlYXNlJywgc3RhcnRBdFplcm8pXG4gIGVsLnN0eWxlLmNzc1RleHQgKz0gaW5saW5lQ3NzXG59XG5leHBvcnQgZnVuY3Rpb24gZmFkZW91dChlbCwgdCwgY2FsbGJhY2spIHtcbiAgY29uc3QgaW5saW5lQ3NzID0gY3JlYXRlRmFkZXJJbmxpbmVUZXh0KGZhbHNlLCB0LCAnZWFzZScpXG4gIGVsLnN0eWxlLmNzc1RleHQgKz0gaW5saW5lQ3NzXG5cbiAgLy8gd2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIHQgKiAxMDAwKTtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGNhbGxiYWNrLCBmYWxzZSlcbn1cbiIsImltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGZsaXAsIG1lcmdlUmlnaHQsIGNsb25lLCBmb3JFYWNoLCBwcm9wU2F0aXNmaWVzIH0gZnJvbSAncmFtZGEnXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbU9ic2VydmFibGUge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIC8qKlxuICAgICAqIEBtb2R1bGUgVmlld1N0cmVhbU9ic2VydmFibGVcbiAgICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGRlc2NcbiAgICAgKiBJbnRlcm5hbCBvYnNlcnZhYmxlIHRoYXQgY3JlYXRlcyB0aGUgVmlld1N0cmVhbSBPYnNlcnZhYmxlIHRoYXQgYnJhbmNoZXMgb3V0IHRvIHBhcmVudCwgaW50ZXJuYWwgYW5kIGNoaWxkIGRpcmVjdGlvbnNcbiAgICAgKi9cbiAgICB0aGlzLnByb3BzLm9ic2VydmFibGVTdHJlYW1zID0gVmlld1N0cmVhbU9ic2VydmFibGUuY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcygpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0KCkge1xuICAgIGNvbnN0IGRpckludGVybmFsID0gJ2ludGVybmFsJ1xuICAgIGNvbnN0IGRpclBhcmVudCA9ICdwYXJlbnQnXG4gICAgY29uc3QgZGlyQ2hpbGQgPSAnY2hpbGQnXG4gICAgcmV0dXJuIHtcbiAgICAgIFA6IFtkaXJQYXJlbnRdLFxuICAgICAgQzogW2RpckNoaWxkXSxcbiAgICAgIFBDSTogW2RpclBhcmVudCwgZGlySW50ZXJuYWwsIGRpckNoaWxkXSxcbiAgICAgIENJOiBbZGlyQ2hpbGQsIGRpckludGVybmFsXSxcbiAgICAgIFBJOiBbZGlyUGFyZW50LCBkaXJJbnRlcm5hbF0sXG4gICAgICBQQzogW2RpclBhcmVudCwgZGlyQ2hpbGRdXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFkZERlZmF1bHREaXIob2JqKSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBmbGlwKG1lcmdlUmlnaHQpXG4gICAgcmV0dXJuIGRlZmF1bHRzKHsgJGRpcjpbJ2ludGVybmFsJ10gfSwgY2xvbmUob2JqKSlcbiAgfVxuXG4gIHN0YXRpYyBhZGREb3duSW50ZXJuYWxEaXIob2JqLCBhcnIgPSBbJ2ludGVybmFsJywgJ2Rvd24nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyhjbG9uZShvYmopLCB7ICRkaXI6YXJyIH0pXG4gIH1cblxuICBzdGF0aWMgYWRkQ2hpbGRBbmRJbnRlcm5hbERpcihvYmosIGFyciA9IFsnY2hpbGQnLCAnZG93biddKSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBmbGlwKG1lcmdlUmlnaHQpXG4gICAgcmV0dXJuIGRlZmF1bHRzKGNsb25lKG9iaiksIHsgJGRpcjphcnIgfSlcbiAgfVxuXG4gIHN0YXRpYyBtYXBUb0RlZmF1bHREaXIocCkge1xuICAgIHJldHVybiB0aGlzLmFkZERlZmF1bHREaXIocClcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVEaXJlY3Rpb25hbE9ic2VydmFibGVzKG9icyQgPSBuZXcgU3ViamVjdCgpLCB2aWV3TmFtZSwgdnNpZCkge1xuICAgIGlmICh2aWV3TmFtZSAhPT0gdW5kZWZpbmVkICYmIHZzaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb2JzJC52aWV3TmFtZSA9IHZpZXdOYW1lXG4gICAgICBvYnMkLnZzaWQgPSB2c2lkXG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyU3RyZWFtcyA9IHZhbCA9PiBwcm9wU2F0aXNmaWVzKGFyclR5cGUgPT4gYXJyVHlwZS5pbmNsdWRlcyh2YWwpLCAnJGRpcicpXG4gICAgY29uc3QgZmlsdGVyUGFyZW50ID0gZmlsdGVyU3RyZWFtcygncGFyZW50JylcbiAgICBjb25zdCBmaWx0ZXJDaGlsZCA9IGZpbHRlclN0cmVhbXMoJ2NoaWxkJylcbiAgICBjb25zdCBmaWx0ZXJJbnRlcm5hbCA9IGZpbHRlclN0cmVhbXMoJ2ludGVybmFsJylcblxuICAgIGNvbnN0IGFkZGZyb20kID0gcmVsU3RyID0+IG1lcmdlUmlnaHQoeyBmcm9tJDpyZWxTdHIgfSlcbiAgICBjb25zdCBhZGRQYXJlbnRmcm9tJCA9IGFkZGZyb20kKCdjaGlsZCcpXG4gICAgY29uc3QgYWRkSW50ZXJuYWxmcm9tJCA9IGFkZGZyb20kKCdpbnRlcm5hbCcpXG4gICAgY29uc3QgYWRkQ2hpbGRmcm9tJCA9IGFkZGZyb20kKCdwYXJlbnQnKVxuXG4gICAgY29uc3QgcmF3JCA9ICBvYnMkXG4gICAgICAucGlwZShmaWx0ZXIoKHBheWxvYWQpID0+IHBheWxvYWQgIT09IHVuZGVmaW5lZCAmJiBwYXlsb2FkLmFjdGlvbiAhPT0gdW5kZWZpbmVkKSlcblxuICAgIGNvbnN0IHRvSW50ZXJuYWwkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJJbnRlcm5hbCksIG1hcChhZGRJbnRlcm5hbGZyb20kKSlcbiAgICBjb25zdCB0b1BhcmVudCQgPSBvYnMkLnBpcGUoZmlsdGVyKGZpbHRlclBhcmVudCksIG1hcChhZGRQYXJlbnRmcm9tJCkpXG4gICAgY29uc3QgdG9DaGlsZCQgPSBvYnMkLnBpcGUoZmlsdGVyKGZpbHRlckNoaWxkKSwgbWFwKGFkZENoaWxkZnJvbSQpKVxuXG4gICAgY29uc3Qgc3RyZWFtT2JqID0ge1xuICAgICAgcGFyZW50OiB0b1BhcmVudCQsXG4gICAgICBpbnRlcm5hbDogdG9JbnRlcm5hbCQsXG4gICAgICBjaGlsZDogdG9DaGlsZCRcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZVN0cmVhbSA9IChhcnIgPSBbXSkgPT4ge1xuICAgICAgY29uc3QgZW5kU3RyZWFtID0gbyA9PiB7XG4gICAgICAgIG8uY29tcGxldGUoKVxuICAgICAgICBvLmlzU3RvcHBlZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2V0Q29tcGxldGVTdHJlYW0gPSAoc3RyKSA9PiB7XG4gICAgICAgIGlmIChzdHJlYW1PYmpbc3RyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgb2JzJCA9IHN0cmVhbU9ialtzdHJdXG4gICAgICAgICAgZW5kU3RyZWFtKG9icyQpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFyciAhPT0gdW5kZWZpbmVkICYmIGFyci5sZW5ndGggPj0gMSkge1xuICAgICAgICBhcnIuZm9yRWFjaChzZXRDb21wbGV0ZVN0cmVhbSlcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY29tcGxldGVBbGwgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wbGV0ZVN0cmVhbSA9IG8gPT4ge1xuICAgICAgICBvLmNvbXBsZXRlKClcbiAgICAgICAgby5pc1N0b3BwZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICBmb3JFYWNoKGNvbXBsZXRlU3RyZWFtLCBbcmF3JCwgdG9JbnRlcm5hbCQsIHRvUGFyZW50JCwgdG9DaGlsZCRdKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByYXckLCB0b0ludGVybmFsJCwgdG9QYXJlbnQkLCB0b0NoaWxkJCwgY29tcGxldGVBbGwsIGNvbXBsZXRlU3RyZWFtXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBpbmNsdWRlcywgX18sIGlmRWxzZSwgcGF0aCwgcHJvcCwgcmVqZWN0LCBpcywgaXNOaWwsIGlzRW1wdHkgfSBmcm9tICdyYW1kYSdcbmltcG9ydCBzYW5pdGl6ZUhUTUwgZnJvbSAnLi4vdXRpbHMvc2FuaXRpemUtaHRtbC5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG4vKipcbiAqIERvbUVsZW1lbnRUZW1wbGF0ZVxuICpcbiAqIE11c3RhY2hlLWNvbXBhdGlibGUgdGVtcGxhdGUgZW5naW5lIHVzZWQgYnkgVmlld1N0cmVhbSBhbmQgRG9tRWxlbWVudCBmb3IgSFRNTCByZW5kZXJpbmcuXG4gKlxuICogU3VwcG9ydGVkIHN5bnRheDpcbiAqICAge3trZXl9fSAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiwgSFRNTC1lc2NhcGVkXG4gKiAgIHt7a2V5LnBhdGgudG8udmFsdWV9fSAgICAgICAgICAgIGRvdC1ub3RhdGlvbiBwcm9wZXJ0eSBhY2Nlc3NcbiAqICAge3sja2V5fX0uLi57ey9rZXl9fSAgICAgICAgICAgICAgYXJyYXkvb2JqZWN0IHNlY3Rpb25zXG4gKiAgIHt7Ln19ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgZWxlbWVudCBpbnNpZGUgYSBsb29wXG4gKiAgIHt7I319Li4ue3svfX0gICAgICAgICAgICAgICAgICAgIHRvcC1sZXZlbCBiYXJlIGFycmF5IChwYXNzZWQgYXMgYGRhdGFgKVxuICpcbiAqIE5lc3Rpbmc6XG4gKiAgIERvbUVsZW1lbnRUZW1wbGF0ZSBzdXBwb3J0cyBleGFjdGx5IE9ORSBsZXZlbCBvZiBuZXN0ZWQgYXJyYXkgc2VjdGlvbnMuXG4gKiAgIEEgdGVtcGxhdGUgbGlrZSB7eyNyb3dzfX0uLi57eyNjZWxsc319Li4ue3svY2VsbHN9fS4uLnt7L3Jvd3N9fSBpcyBzdXBwb3J0ZWQuXG4gKiAgIERlZXBlciBuZXN0aW5nIOKAlCB7eyNhfX17eyNifX17eyNjfX0uLi57ey9jfX17ey9ifX17ey9hfX0g4oCUIGlzIE5PVCBzdXBwb3J0ZWQuXG4gKlxuICogICBXaGVuIGEgdGVtcGxhdGUgaGFzIGRlZXBlciBuZXN0aW5nLCBhIHdhcm5pbmcgaXMgbG9nZ2VkIGluIGRlYnVnIG1vZGUgYW5kXG4gKiAgIHRoZSB0aGlyZC1sZXZlbCBsb29wIGlzIG5vdCBwcm9jZXNzZWQuIFRoaXMgaXMgYSBkZWxpYmVyYXRlIGRlc2lnbiBjaG9pY2U6XG4gKiAgIGRlZXAgaGllcmFyY2hpY2FsIHJlbmRlcmluZyBiZWxvbmdzIGluIG5lc3RlZCBWaWV3U3RyZWFtcywgbm90IGluIHRlbXBsYXRlcy5cbiAqICAgTmVzdGVkIFZpZXdTdHJlYW1zIHByb3ZpZGUgcHJvcGVyIGxpZmVjeWNsZSBzZW1hbnRpY3MsIGlzb2xhdGVkIHJlbmRlcmluZyxcbiAqICAgYW5kIGNsZWFyZXIgYXJjaGl0ZWN0dXJhbCBib3VuZGFyaWVzIHRoYW4gYXJiaXRyYXJpbHktbmVzdGVkIHRlbXBsYXRlcy5cbiAqXG4gKiBOb3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbiBuZXN0ZWQgbG9vcHM6XG4gKiAgIC0gQ01TIHByb3h5IG1ldGFkYXRhIChfX2Ntc19fZGF0YUlkLCBfX2Ntc19fa2V5Rm9yXyopLiBJbm5lci1sb29wIENNU1xuICogICAgIGVkaXRpbmcgaXMgYSBmdXR1cmUgZW5oYW5jZW1lbnQ7IHVudGlsIHRoZW4sIGNvbnRlbnQgaW5zaWRlIGFuIGlubmVyXG4gKiAgICAgbG9vcCBpcyByZW5kZXJlZCBhcyByZWFkLW9ubHkgZnJvbSB0aGUgQ01TIHBlcnNwZWN0aXZlLlxuICovXG5leHBvcnQgY2xhc3MgRG9tRWxlbWVudFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IodGVtcGxhdGUsIGRhdGEgPSB7fSwgb3B0cyA9IHt9KSB7XG4gICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMuZm9ybWF0VGVtcGxhdGUodGVtcGxhdGUpXG4gICAgdGhpcy5pc1Byb3h5RGF0YSA9IGRhdGEuX19jbXNfX2lzUHJveHkgPT09IHRydWVcbiAgICB0aGlzLnRlc3RNb2RlID0gb3B0cz8udGVzdE1vZGVcblxuICAgIC8vIE5vcm1hbGl6ZSB0cmlwbGUtYnJhY2tldCB0YWdzIHRvIGRvdWJsZS1icmFja2V0LlxuICAgIC8vXG4gICAgLy8gRG9tRWxlbWVudFRlbXBsYXRlIHRyZWF0cyB7e3trZXl9fX0gYXMgYW4gYWxpYXMgZm9yIHt7a2V5fX0g4oCUIGJvdGhcbiAgICAvLyBpbnRlcnBvbGF0ZSB0aGUgdmFsdWUgYXMtaXMuIE11c3RhY2hlJ3MgY29udmVudGlvbiBvZiBcInRyaXBsZS1icmFja2V0XG4gICAgLy8gbWVhbnMgdW5lc2NhcGVkXCIgZG9lc24ndCBhcHBseSBoZXJlIGJlY2F1c2UgU3B5bmVKUyBoYW5kbGVzIGVzY2FwaW5nXG4gICAgLy8gYW5kIHNhbml0aXphdGlvbiB0aHJvdWdoIGBzYW5pdGl6ZS1kYXRhYCAoa2V5ZWQgb24gU3B5bmVBcHAgbW9kZSlcbiAgICAvLyBiZWZvcmUgdmFsdWVzIHJlYWNoIHRoZSB0ZW1wbGF0ZSwgbm90IHRocm91Z2ggc3ludGF4LWxldmVsIGVzY2FwaW5nLlxuICAgIC8vXG4gICAgLy8gV2UgYWNjZXB0IHRyaXBsZS1icmFja2V0IHN5bnRheCBzbyB0aGF0IGF1dGhvcnMgYW5kIEFJIGZhbWlsaWFyIHdpdGhcbiAgICAvLyBzdGFuZGFyZCBNdXN0YWNoZSBkb24ndCBoYXZlIHRoZWlyIHRlbXBsYXRlcyBzaWxlbnRseSBicmVhayB3aGVuIHRoZXlcbiAgICAvLyByZWFjaCBmb3Ige3t7a2V5fX19IG91dCBvZiBoYWJpdC4gVGhlIG5vcm1hbGl6YXRpb24gaGFwcGVucyBvbmNlIGhlcmUsXG4gICAgLy8gc28gdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZSBvbmx5IGV2ZXIgcmVhc29ucyBhYm91dCBkb3VibGUtYnJhY2tldCB0YWdzLlxuICAgIHRoaXMudGVtcGxhdGUgPSBEb21FbGVtZW50VGVtcGxhdGUubm9ybWFsaXplVHJpcGxlQnJhY2tldHModGhpcy50ZW1wbGF0ZSlcblxuICAgIGlmICh0aGlzLmlzUHJveHlEYXRhID09PSB0cnVlKSB7XG4gICAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmVuYWJsZUNNU1Byb3hpZXMgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IFNweW5lQXBwUHJvcGVydGllcy5mb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YSh0aGlzLnRlbXBsYXRlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IERvbUVsZW1lbnRUZW1wbGF0ZS5mb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YSh0aGlzLnRlbXBsYXRlKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrRm9yQXJyYXlEYXRhID0gKCkgPT4ge1xuICAgICAgaWYgKGlzKEFycmF5LCBkYXRhKSA9PT0gdHJ1ZSkge1xuICAgICAgICBkYXRhID0geyBzcHluZURhdGE6ZGF0YSB9XG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlLnJlcGxhY2UoJ3t7L319JywgJ3t7L3NweW5lRGF0YX19JylcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGUucmVwbGFjZSgne3sjfX0nLCAne3sjc3B5bmVEYXRhfX0nKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNoZWNrRm9yQXJyYXlEYXRhKClcblxuICAgIHRoaXMudGVtcGxhdGVEYXRhID0gZGF0YVxuXG4gICAgLy8gU3Rhc2ggdXNlZCBieSBwZXItaXRlcmF0aW9uIHN1YnN0aXR1dGlvbiBzbyB0aGF0IENNUyBwcm94eSBsb29rdXBzXG4gICAgLy8gZm9yIHN0cmluZy1hcnJheSBpdGVtcyAod2hlcmUgX19jbXNfX2RhdGFJZCAvIF9fY21zX19rZXlGb3JfKiBsaXZlIG9uXG4gICAgLy8gdGhlIFBBUkVOVCBhcnJheSwgbm90IG9uIHRoZSBpbmRpdmlkdWFsIHN0cmluZyBlbGVtZW50cykgY2FuIGZpbmQgdGhlXG4gICAgLy8gcGFyZW50IG9iamVjdCBhdCByZW5kZXIgdGltZS4gU2V0IGJ5IHBhcnNlVGhlVG1wbExvb3AsIGNsZWFyZWQgd2hlblxuICAgIC8vIHRoYXQgbG9vcCBjb21wbGV0ZXMuXG4gICAgdGhpcy5jdXJyZW50T3V0ZXJMb29wRGF0YSA9IG51bGxcblxuICAgIGNvbnN0IHN0ckFyciA9IERvbUVsZW1lbnRUZW1wbGF0ZS5nZXRTdHJpbmdBcnJheSh0aGlzLnRlbXBsYXRlKVxuXG4gICAgbGV0IHN0ck1hdGNoZXMgPSB0aGlzLnRlbXBsYXRlLm1hdGNoKERvbUVsZW1lbnRUZW1wbGF0ZS5maW5kVG1wbExvb3BzUkUoKSlcbiAgICBzdHJNYXRjaGVzID0gc3RyTWF0Y2hlcyA9PT0gbnVsbCA/IFtdIDogc3RyTWF0Y2hlc1xuXG4gICAgY29uc3QgcGFyc2VUbXBsTG9vcHNSRSA9IERvbUVsZW1lbnRUZW1wbGF0ZS5wYXJzZVRtcGxMb29wc1JFKClcblxuICAgIGNvbnN0IHBhcnNlVG1wbExvb3BGbiA9IHRoaXMucGFyc2VUaGVUbXBsTG9vcC5iaW5kKHRoaXMpXG5cbiAgICBjb25zdCBtYXBUbXBsTG9vcCA9IChzdHIpID0+IHtcbiAgICAgIHJldHVybiBzdHIucmVwbGFjZShwYXJzZVRtcGxMb29wc1JFLCBwYXJzZVRtcGxMb29wRm4pXG4gICAgfVxuXG4gICAgY29uc3QgZmluZFRtcGxMb29wc1ByZWQgPSBpbmNsdWRlcyhfXywgc3RyTWF0Y2hlcylcbiAgICBjb25zdCBjaGVja0Zvck1hdGNoZXMgPSBpZkVsc2UoXG4gICAgICBmaW5kVG1wbExvb3BzUHJlZCxcbiAgICAgIG1hcFRtcGxMb29wLFxuICAgICAgdGhpcy5hZGRQYXJhbXMuYmluZCh0aGlzKSlcblxuICAgIHRoaXMuZmluYWxBcnIgPSBzdHJBcnIubWFwKGNoZWNrRm9yTWF0Y2hlcylcbiAgfVxuXG4gIHN0YXRpYyBpc1ByaW1pdGl2ZVRhZyhzdHIpIHtcbiAgICByZXR1cm4gLyh7e1xcLlxcKj99fSkvLnRlc3Qoc3RyKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgdHJpcGxlLWJyYWNrZXQgdGFncyB0byBkb3VibGUtYnJhY2tldCBmb3JtLlxuICAgKlxuICAgKiAgIHt7e2tleX19fSAgICAgICDihpIge3trZXl9fVxuICAgKiAgIHt7e2EuYi5jfX19ICAgICDihpIge3thLmIuY319XG4gICAqICAge3t7Ln19fSAgICAgICAgIOKGkiB7ey59fVxuICAgKiAgIHt7ey4qfX19ICAgICAgICDihpIge3suKn19XG4gICAqXG4gICAqIFNlY3Rpb24gbWFya2VycyB7eyNrZXl9fSBhbmQge3sva2V5fX0gYXJlIGFscmVhZHkgdHdvLWJyYWNrZXQgYnlcbiAgICogY29udmVudGlvbiBhbmQgYXJlIG5vdCBhZmZlY3RlZC4gVGFncyBvZiB0aGUgd3Jvbmcgc2hhcGUgKHVuYmFsYW5jZWQsXG4gICAqIGZvdXIgb3IgbW9yZSBicmFja2V0cywgZXRjLikgYXJlIGxlZnQgdW50b3VjaGVkIOKAlCBhbnl0aGluZyB0aGUgbWFpblxuICAgKiBwYXJzZXIgZG9lc24ndCByZWNvZ25pemUgbGF0ZXIgd2lsbCByZW5kZXIgYXMgbGl0ZXJhbCB0ZXh0LCB3aGljaCBpc1xuICAgKiB0aGUgY29ycmVjdCBmYWlsdXJlIG1vZGUgZm9yIGEgbG9naWMtbGVzcyB0ZW1wbGF0ZSBlbmdpbmUuXG4gICAqXG4gICAqIFRoaXMgZXhpc3RzIGJlY2F1c2UgRG9tRWxlbWVudFRlbXBsYXRlIHRyZWF0cyB7e3trZXl9fX0gYW5kIHt7a2V5fX1cbiAgICogYXMgaW50ZXJjaGFuZ2VhYmxlIOKAlCBzYW5pdGl6YXRpb24gYW5kIGVzY2FwaW5nIGFyZSBjb25maWctZHJpdmVuXG4gICAqIHRocm91Z2ggYHNhbml0aXplLWRhdGFgLCBub3Qgc3ludGF4LWRyaXZlbiB0aHJvdWdoIGJyYWNrZXQgY291bnQuXG4gICAqIE5vcm1hbGl6aW5nIGF0IGNvbnN0cnVjdGlvbiB0aW1lIG1lYW5zIHRoZSByZXN0IG9mIHRoZSBlbmdpbmUgKGxvb3BcbiAgICogcmVnZXhlcywgQ01TIHByb3h5IHdyYXBwaW5nLCB2YXJpYWJsZSBzdWJzdGl0dXRpb24pIG9ubHkgcmVhc29uc1xuICAgKiBhYm91dCBvbmUgYnJhY2tldCBzdHlsZS5cbiAgICovXG4gIHN0YXRpYyBub3JtYWxpemVUcmlwbGVCcmFja2V0cyh0ZW1wbGF0ZSkge1xuICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgIT09ICdzdHJpbmcnIHx8IHRlbXBsYXRlLmluZGV4T2YoJ3t7eycpID09PSAtMSkge1xuICAgICAgcmV0dXJuIHRlbXBsYXRlXG4gICAgfVxuICAgIC8vIE1hdGNoIGJhbGFuY2VkIHRyaXBsZS1icmFja2V0cyBjb250YWluaW5nIGFueXRoaW5nIHRoYXQgaXNuJ3QgYVxuICAgIC8vIGJyYWNlIGNoYXJhY3Rlci4gS2VlcHMgdGhlIGNhcHR1cmVkIGlubmVyIGNvbnRlbnQsIHN0cmlwcyB0aGVcbiAgICAvLyBvdXRlciB0aGlyZCBicmFjZSBvbiBlYWNoIHNpZGUuXG4gICAgcmV0dXJuIHRlbXBsYXRlLnJlcGxhY2UoL1xce1xce1xceyhbXnt9XSs/KVxcfVxcfVxcfS9nLCAne3skMX19JylcbiAgfVxuXG4gIC8vIEZJTkQgQ09SUkVDVCBORVNURUQgREFUQVxuICBzdGF0aWMgZ2V0TmVzdGVkRGF0YVJlZHVjZXIoZGF0YSA9IHt9LCBwYXJhbSA9ICcnKSB7XG4gICAgY29uc3QgZGF0YVJlZHVjZXIgPSAobmVzdGVkRGF0YSwgc3RyKSA9PiB7XG4gICAgICBpZiAobmVzdGVkRGF0YVtzdHJdKSB7XG4gICAgICAgIHJldHVybiBuZXN0ZWREYXRhW3N0cl1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgbmVzdGVkRGF0YSA9PT0gJ3N0cmluZycgPyBuZXN0ZWREYXRhIDogJydcbiAgICB9XG5cbiAgICByZXR1cm4gLyhcXC4pL2dtLnRlc3QoU3RyaW5nKHBhcmFtKSkgPyBTdHJpbmcocGFyYW0pLnNwbGl0KCcuJykucmVkdWNlKGRhdGFSZWR1Y2VyLCBkYXRhKSA6IGRhdGFbcGFyYW1dID8/ICcnXG4gIH1cblxuICBzdGF0aWMgZ2V0U3RyaW5nQXJyYXkodGVtcGxhdGUpIHtcbiAgICBjb25zdCBzdHJBcnIgPSB0ZW1wbGF0ZS5zcGxpdChEb21FbGVtZW50VGVtcGxhdGUuZmluZFRtcGxMb29wc1JFKCkpXG4gICAgY29uc3QgZW1wdHlSRSA9IC9eKFtcXFxcblxcc1xcV10rKSQvXG4gICAgLy8gZmluZFRtcGxMb29wc1JFIGhhcyBUV08gY2FwdHVyZSBncm91cHMgKHRoZSBmdWxsIGxvb3AgbWF0Y2gsIGFuZCB0aGVcbiAgICAvLyBcXDItYmFja3JlZmVyZW5jZWQga2V5IG5hbWUpLiBXaGVuIHVzZWQgd2l0aCBTdHJpbmcucHJvdG90eXBlLnNwbGl0LCB0aGVcbiAgICAvLyBzZWNvbmQgZ3JvdXAgaXMgZW1pdHRlZCBpbnRvIHRoZSByZXN1bHQgYXJyYXkgYXMgYSBsZWFrZWQgY2h1bmsuXG4gICAgLy9cbiAgICAvLyBUaGUgY2h1bmtzIGFycml2ZSBpbiBhIHByZWRpY3RhYmxlIDMtc3RlcCBjeWNsZTpcbiAgICAvLyAgIGluZGV4IDA6ICAgICAgICAgICAgICAgIHByZS10ZXh0IGJlZm9yZSB0aGUgZmlyc3QgbG9vcFxuICAgIC8vICAgaW5kZXggMTogZnVsbCBtYXRjaCAgICAgdGhlIGxvb3AgKGtlZXApXG4gICAgLy8gICBpbmRleCAyOiBncm91cC0yIGxlYWsgICB0aGUgbG9vcCdzIGtleSBuYW1lIChkaXNjYXJkKVxuICAgIC8vICAgaW5kZXggMzogICAgICAgICAgICAgICAgYmV0d2Vlbi1sb29wcyB0ZXh0XG4gICAgLy8gICBpbmRleCA0OiBmdWxsIG1hdGNoXG4gICAgLy8gICBpbmRleCA1OiBncm91cC0yIGxlYWtcbiAgICAvLyAgIC4uLlxuICAgIC8vIFNvIGFueSBpbmRleCBpIHdoZXJlIGkgPj0gMiBhbmQgKGkgLSAyKSAlIDMgPT09IDAgaXMgYSBrZXktbmFtZSBsZWFrXG4gICAgLy8gdGhhdCBzaG91bGQgbm90IGZsb3cgaW50byB0aGUgcmVuZGVyIHBpcGVsaW5lLlxuICAgIGNvbnN0IHdpdGhvdXRMZWFrcyA9IHN0ckFyci5maWx0ZXIoKF8sIGkpID0+ICEoaSA+PSAyICYmIChpIC0gMikgJSAzID09PSAwKSlcbiAgICBjb25zdCBmaWx0ZXJPdXRFbXB0eVN0cmluZ3MgPSBzID0+IHMubWF0Y2goZW1wdHlSRSlcbiAgICBjb25zdCBmaW5hbFN0ciA9IHJlamVjdChmaWx0ZXJPdXRFbXB0eVN0cmluZ3MsIHdpdGhvdXRMZWFrcylcblxuICAgIHJldHVybiBmaW5hbFN0clxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2V4IHRoYXQgZmluZHMgdG9wLWxldmVsIGxvb3Agc2VjdGlvbnMsIHBhaXJpbmcgZWFjaCBvcGVuaW5nIHRhZyB3aXRoIGFcbiAgICogY2xvc2luZyB0YWcgb2YgdGhlIFNBTUUgTkFNRSB2aWEgdGhlIFxcMiBiYWNrcmVmZXJlbmNlLiBUaGlzIGlzIHdoYXQgbWFrZXNcbiAgICoge3sjcm93c319PHRyPnt7I2NlbGxzfX08dGQ+e3sufX08L3RkPnt7L2NlbGxzfX08L3RyPnt7L3Jvd3N9fSBtYXRjaCBhcyBhXG4gICAqIHNpbmdsZSBvdXRlciBsb29wIHJhdGhlciB0aGFuIGdldHRpbmcgdHJ1bmNhdGVkIGF0IHRoZSBpbm5lciB7ey9jZWxsc319LlxuICAgKi9cbiAgc3RhdGljIGZpbmRUbXBsTG9vcHNSRSgpIHtcbiAgICByZXR1cm4gLyh7eyMoW1xcdy5dKyl9fVtcXHdcXG5cXHNcXFddKz97e1xcL1xcMn19KS9nbVxuICB9XG5cbiAgc3RhdGljIHBhcnNlVG1wbExvb3BzUkUoKSB7XG4gICAgcmV0dXJuIC8oe3sjKFtcXHcuXSspfX0pKFtcXHdcXG5cXHNcXFddKz8pKHt7XFwvXFwyfX0pL2dtXG4gIH1cblxuICAvKipcbiAgICogUmVnZXggZm9yIGZpbmRpbmcgYSBzaW5nbGUgaW5uZXIgbG9vcCBpbnNpZGUgYW4gb3V0ZXIgbG9vcCdzIGJvZHkuXG4gICAqIElkZW50aWNhbCBpbiBmb3JtIHRvIHBhcnNlVG1wbExvb3BzUkUsIGJ1dCBjcmVhdGVkIGZyZXNoIHRvIGF2b2lkXG4gICAqIHNoYXJlZC1sYXN0SW5kZXggYnVncyB3aXRoIGdsb2JhbCByZWdleGVzIHdoZW4gdXNlZCBpbiAucmVwbGFjZSBjYWxsYmFja3MuXG4gICAqL1xuICBzdGF0aWMgaW5uZXJMb29wUkUoKSB7XG4gICAgcmV0dXJuIC8oe3sjKFtcXHcuXSspfX0pKFtcXHdcXG5cXHNcXFddKz8pKHt7XFwvXFwyfX0pL2dtXG4gIH1cblxuICBzdGF0aWMgc3dhcFBhcmFtc0ZvclRhZ3NSRSgpIHtcbiAgICByZXR1cm4gLyh7eykoLio/KSh9fSkvZ21cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3RzIHdoZXRoZXIgYSB0ZW1wbGF0ZSBib2R5IGNvbnRhaW5zIGFueSB7eyNrZXl9fS4uLnt7L2tleX19IHBhaXIuXG4gICAqIFVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIGlubmVyLWxvb3AgcGFzcyBpcyBuZWVkZWQsIGFuZCB0byBkZXRlY3RcbiAgICogdHdvLWxldmVsIG5lc3RpbmcgZm9yIHdhcm5pbmcgcHVycG9zZXMuXG4gICAqL1xuICBzdGF0aWMgaGFzTG9vcChzdHIpIHtcbiAgICByZXR1cm4gRG9tRWxlbWVudFRlbXBsYXRlLmlubmVyTG9vcFJFKCkudGVzdChzdHIpXG4gIH1cblxuICByZW1vdmVUaGlzKCkge1xuICAgIGlmICh0aGlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZmluYWxBcnIgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMudGVtcGxhdGVEYXRhID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnRlbXBsYXRlID0gdW5kZWZpbmVkXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIFJldHVybnMgYSBkb2N1bWVudCBmcmFnbWVudCBnZW5lcmF0ZWQgZnJvbSB0aGUgdGVtcGxhdGUgYW5kIGFueSBhZGRlZCBkYXRhLlxuICAgKi9cbiAgcmVuZGVyRG9jRnJhZygpIHtcbiAgICBsZXQgaHRtbCA9IERvbUVsZW1lbnRUZW1wbGF0ZS5yZXBsYWNlSW1nUGF0aCh0aGlzLmZpbmFsQXJyLmpvaW4oJycpKVxuICAgIGlmICh0aGlzLnRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICBodG1sID0gc2FuaXRpemVIVE1MKGh0bWwpXG4gICAgfVxuICAgIGNvbnN0IGlzVGFibGVTdWJUYWcgPSAvXihbXj5dKj8pKDwpezF9KFxcYikodGhlYWR8Y29sfGNvbGdyb3VwfHRib2R5fHRkfHRmb290fHRyfHRoKShcXGIpKFteXFwwXSopJC8udGVzdChodG1sKVxuICAgIGNvbnN0IGVsID0gaXNUYWJsZVN1YlRhZyA/IGh0bWwgOiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChodG1sKVxuXG4gICAgd2luZG93LnNldFRpbWVvdXQodGhpcy5yZW1vdmVUaGlzLCAyKVxuICAgIHJldHVybiBlbFxuICB9XG5cbiAgcmVuZGVyVG9TdHJpbmcoKSB7XG4gICAgbGV0IGh0bWwgPSB0aGlzLmZpbmFsQXJyLmpvaW4oJycpXG4gICAgaHRtbCA9IERvbUVsZW1lbnRUZW1wbGF0ZS5yZXBsYWNlSW1nUGF0aChodG1sKVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmVtb3ZlVGhpcywgMilcbiAgICByZXR1cm4gaHRtbFxuICB9XG5cbiAgZ2V0VGVtcGxhdGVTdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluYWxBcnIuam9pbignJylcbiAgfVxuXG4gIGZvcm1hdFRlbXBsYXRlKHRlbXBsYXRlKSB7XG4gICAgcmV0dXJuIFsnU0NSSVBUJywgJ1RFTVBMQVRFJ10uaW5jbHVkZXMocHJvcCgnbm9kZU5hbWUnLCB0ZW1wbGF0ZSkpID09PSB0cnVlID8gdGVtcGxhdGUuaW5uZXJIVE1MIDogdGVtcGxhdGVcbiAgfVxuXG4gIGdldERhdGFWYWxGcm9tUGF0aFN0cihwYXRoU3RyLCBkYXRhRmlsZSkge1xuICAgIGNvbnN0IHBhdGhBcnIgPSBTdHJpbmcocGF0aFN0cikuc3BsaXQoJy4nKVxuICAgIGNvbnN0IHBhdGhEYXRhID0gcGF0aChwYXRoQXJyLCBkYXRhRmlsZSlcbiAgICByZXR1cm4gcGF0aERhdGEgfHwgJydcbiAgfVxuXG4gIGFkZFBhcmFtcyhzdHIpIHtcbiAgICBjb25zdCByZXBsYWNlVGFncyA9IChzdHIsIHAxLCBwMiwgcDMpID0+IHtcbiAgICAgIHJldHVybiBEb21FbGVtZW50VGVtcGxhdGUuZ2V0TmVzdGVkRGF0YVJlZHVjZXIodGhpcy50ZW1wbGF0ZURhdGEsIHAyKVxuICAgIH1cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoRG9tRWxlbWVudFRlbXBsYXRlLnN3YXBQYXJhbXNGb3JUYWdzUkUoKSwgcmVwbGFjZVRhZ3MpXG4gIH1cblxuICBzdGF0aWMgcmVwbGFjZUltZ1BhdGgodGVtcGxhdGVTdHIpIHtcbiAgICBjb25zdCB7IElNR19QQVRIIH0gPSBTcHluZUFwcFByb3BlcnRpZXNcbiAgICBpZiAoSU1HX1BBVEggIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGVtcGxhdGVTdHIgPSB0ZW1wbGF0ZVN0ci5yZXBsYWNlQWxsKC9zcmNcXHMqPVxccyooWydcIl0paW1nc1xcLy9nLCBgc3JjPSQxJHtJTUdfUEFUSH1gKVxuICAgICAgcmV0dXJuIHRlbXBsYXRlU3RyLnJlcGxhY2VBbGwoL3VybFxcKFxccyooWydcIl0/KWltZ3NcXC8vZywgYHVybCgkMSR7SU1HX1BBVEh9YClcbiAgICB9XG4gICAgcmV0dXJuIHRlbXBsYXRlU3RyXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgYSBzaW5nbGUgaW5uZXIgbG9vcCAob25lIGxldmVsIGRvd24pIGluc2lkZSBhbiBvdXRlci1sb29wIGJvZHksXG4gICAqIHVzaW5nIGBwYXJlbnRJdGVtYCBhcyB0aGUgZGF0YSBjb250ZXh0LiBJZiB0aGUgaW5uZXIgYm9keSBpdHNlbGYgY29udGFpbnNcbiAgICogYW5vdGhlciBsb29wLCBhIGRlYnVnLW1vZGUgd2FybmluZyBpcyBsb2dnZWQgYW5kIHRoYXQgZGVlcGVyIGxvb3AgaXMgbm90XG4gICAqIHByb2Nlc3NlZC5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgYm9keSBzdHJpbmcgd2l0aCBhbnkgaW5uZXIgbG9vcCBleHBhbmRlZCwgcmVhZHkgZm9yXG4gICAqIG91dGVyLWxldmVsIHZhcmlhYmxlIHN1YnN0aXR1dGlvbi5cbiAgICovXG4gIHByb2Nlc3NJbm5lckxvb3AoYm9keVN0ciwgcGFyZW50SXRlbSkge1xuICAgIGNvbnN0IGlubmVyUkUgPSBEb21FbGVtZW50VGVtcGxhdGUuaW5uZXJMb29wUkUoKVxuXG4gICAgcmV0dXJuIGJvZHlTdHIucmVwbGFjZShpbm5lclJFLCAoZnVsbE1hdGNoLCBvcGVuVGFnLCBpbm5lcktleSwgaW5uZXJCb2R5IC8qLCBjbG9zZVRhZyAqLykgPT4ge1xuICAgICAgLy8gRGV0ZWN0IGRpc2FsbG93ZWQgc2Vjb25kLWxldmVsIG5lc3RpbmcgaW5zaWRlIHRoZSBpbm5lciBib2R5LlxuICAgICAgaWYgKERvbUVsZW1lbnRUZW1wbGF0ZS5oYXNMb29wKGlubmVyQm9keSkgPT09IHRydWUpIHtcbiAgICAgICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZSAmJiB0aGlzLnRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgJ1NweW5lIFdhcm5pbmc6IERvbUVsZW1lbnRUZW1wbGF0ZSBzdXBwb3J0cyBvbmUgbGV2ZWwgb2YgbmVzdGVkIGFycmF5IGxvb3BzLiAnICtcbiAgICAgICAgICAgIGBBIGRlZXBlciBuZXN0ZWQgbG9vcCB3YXMgZGV0ZWN0ZWQgaW5zaWRlIFwie3sjJHtpbm5lcktleX19fVwiLiBgICtcbiAgICAgICAgICAgICdDb25zaWRlciByZXN0cnVjdHVyaW5nIHZpYSBuZXN0ZWQgVmlld1N0cmVhbXMgaW5zdGVhZC4nXG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICAgIC8vIFN0cmlwIHVuc3VwcG9ydGVkIGRlZXBlci1sZXZlbCBzZWN0aW9uIHRhZ3Mgc28gdGhleSBkb24ndCBlbWl0IGFzXG4gICAgICAgIC8vIGdhcmJsZWQgdmFyaWFibGVzIGR1cmluZyBzdWJzdGl0dXRpb24gYmVsb3cuXG4gICAgICAgIGlubmVyQm9keSA9IGlubmVyQm9keS5yZXBsYWNlKC97e1sjL11bXFx3Ll0rfX0vZywgJycpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlubmVyRGF0YSA9IERvbUVsZW1lbnRUZW1wbGF0ZS5nZXROZXN0ZWREYXRhUmVkdWNlcihwYXJlbnRJdGVtLCBpbm5lcktleSlcblxuICAgICAgaWYgKGlzTmlsKGlubmVyRGF0YSkgPT09IHRydWUgfHwgaXNFbXB0eShpbm5lckRhdGEpKSB7XG4gICAgICAgIHJldHVybiAnJ1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbm5lckFyciA9IEFycmF5LmlzQXJyYXkoaW5uZXJEYXRhKSA/IGlubmVyRGF0YSA6IFtpbm5lckRhdGFdXG5cbiAgICAgIC8vIFdoaWxlIHByb2Nlc3NpbmcgYW4gaW5uZXIgbG9vcCwgdGhlIFwib3V0ZXJcIiBkYXRhIGZvciBDTVMgc3RyaW5nLWl0ZW1cbiAgICAgIC8vIGxvb2t1cHMgaXMgdGhlIGN1cnJlbnQgaW5uZXJEYXRhICh0aGUgYXJyYXkvb2JqZWN0IHRoZSBpbm5lciBpdGVtc1xuICAgICAgLy8gYmVsb25nIHRvKSwgbm90IHRoZSBvcmlnaW5hbCBvdXRlci1sb29wIGFycmF5LiBTd2FwIGl0IGluLCByZXN0b3JlXG4gICAgICAvLyB3aGVuIHRoZSBpbm5lciBwYXNzIGNvbXBsZXRlcy5cbiAgICAgIGNvbnN0IHByZXZpb3VzT3V0ZXIgPSB0aGlzLmN1cnJlbnRPdXRlckxvb3BEYXRhXG4gICAgICB0aGlzLmN1cnJlbnRPdXRlckxvb3BEYXRhID0gaW5uZXJEYXRhXG5cbiAgICAgIGNvbnN0IHJlbmRlcmVkID0gaW5uZXJBcnIubWFwKChpbm5lckl0ZW0sIGlubmVySWR4KSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YnN0aXR1dGVGb3JJdGVtKGlubmVyQm9keSwgaW5uZXJJdGVtLCBpbm5lcklkeClcbiAgICAgIH0pLmpvaW4oJycpXG5cbiAgICAgIHRoaXMuY3VycmVudE91dGVyTG9vcERhdGEgPSBwcmV2aW91c091dGVyXG4gICAgICByZXR1cm4gcmVuZGVyZWRcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFN1YnN0aXR1dGVzIHt7Li4ufX0gdmFyaWFibGVzIGluIGBzdHJgIHVzaW5nIGBpdGVtYCBhcyB0aGUgZGF0YSBjb250ZXh0LlxuICAgKlxuICAgKiBUaHJlZSBjYXNlczpcbiAgICpcbiAgICogICAxLiBTdHJpbmcgaXRlbSArIHByaW1pdGl2ZSB7ey59fS97ey4qfX0gdGVtcGxhdGU6XG4gICAqICAgICAgZGlyZWN0IHRleHQgc3Vic3RpdHV0aW9uIChubyBDTVMgd3JhcHBpbmcgcG9zc2libGUg4oCUIHRoaXMgcGF0aCBvbmx5XG4gICAqICAgICAgcnVucyB3aGVuIGZvcm1hdFRlbXBsYXRlRm9yUHJveHlEYXRhIGhhcyBOT1Qgd3JhcHBlZCB0aGUgdGFnKS5cbiAgICpcbiAgICogICAyLiBTdHJpbmcgaXRlbSArIG5vbi1wcmltaXRpdmUgdGVtcGxhdGU6XG4gICAqICAgICAgY2FuIGhhcHBlbiB0d28gd2F5czogKGEpIGEgc2VjdGlvbiBpdGVyYXRpbmcgc3RyaW5ncyB3aGVyZVxuICAgKiAgICAgIGZvcm1hdFRlbXBsYXRlRm9yUHJveHlEYXRhIGhhcyByZXBsYWNlZCB7ey59fS97ey4qfX0gd2l0aFxuICAgKiAgICAgIHt7c3B5bmVMb29wS2V5fX0gKyB7e29yaWdLZXl9fSBpbnNpZGUgYSA8c3B5bmUtY21zLWl0ZW0+IHdyYXBwZXIsXG4gICAqICAgICAgb3IgKGIpIGEgbm9uLXByb3h5IHRlbXBsYXRlIHdpdGggcG9zaXRpb25hbCB0b2tlbnMgb25seS5cbiAgICogICAgICBCdWlsZCBhIGNvbnRleHQgdGhhdCBzYXRpc2ZpZXMgYm90aCDigJQgc3B5bmVMb29wS2V5ID0gdGhlIHN0cmluZyxcbiAgICogICAgICBwbHVzIF9fY21zX19kYXRhSWQgLyBvcmlnS2V5IGxvb2tlZCB1cCBvbiB0aGUgcGFyZW50IGFycmF5IHdoZW5cbiAgICogICAgICBwcm94eSBkYXRhIGlzIGFjdGl2ZS5cbiAgICpcbiAgICogICAzLiBPYmplY3QgaXRlbTpcbiAgICogICAgICB0aGUgY29udmVudGlvbmFsIHBhdGgg4oCUIGJ1aWxkIGEgbG9va3VwIG9iamVjdCB3aXRoIHRoZSBpdGVtJ3NcbiAgICogICAgICBwcm9wZXJ0aWVzIHBsdXMgcG9zaXRpb25hbCB0b2tlbnMsIHN1YnN0aXR1dGUgYnkgcHJvcGVydHkgbmFtZVxuICAgKiAgICAgIG9yIGRvdC1wYXRoLlxuICAgKi9cbiAgc3Vic3RpdHV0ZUZvckl0ZW0oc3RyLCBpdGVtLCBpbmRleCkge1xuICAgIC8vIENhc2UgMTogc3RyaW5nIGl0ZW0gd2l0aCBhIHByaW1pdGl2ZS10YWcgdGVtcGxhdGUuXG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKERvbUVsZW1lbnRUZW1wbGF0ZS5pc1ByaW1pdGl2ZVRhZyhzdHIpKSB7XG4gICAgICAgIGNvbnN0IGVzY2FwZWQgPSBpdGVtLnJlcGxhY2UoL1xcJC9nLCAnJCQkJCcpIC8vICQgLT4gJCQgZm9yIHJlcGxhY2UoKSBsaXRlcmFsIHNhZmV0eVxuICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoRG9tRWxlbWVudFRlbXBsYXRlLnN3YXBQYXJhbXNGb3JUYWdzUkUoKSwgZXNjYXBlZClcbiAgICAgIH1cblxuICAgICAgLy8gQ2FzZSAyOiBzdHJpbmcgaXRlbSB3aXRoIGEgbm9uLXByaW1pdGl2ZSB0ZW1wbGF0ZS5cbiAgICAgIGNvbnN0IGN0eCA9IHRoaXMuYnVpbGRTdHJpbmdJdGVtQ29udGV4dChpdGVtLCBpbmRleClcbiAgICAgIHJldHVybiB0aGlzLnN1YnN0aXR1dGVPYmplY3Qoc3RyLCBjdHgpXG4gICAgfVxuXG4gICAgLy8gQ2FzZSAzOiBvYmplY3QgaXRlbS5cbiAgICBjb25zdCBkYXRhT2JqID0gdGhpcy5idWlsZEl0ZW1Db250ZXh0KGl0ZW0sIGluZGV4KVxuICAgIHJldHVybiB0aGlzLnN1YnN0aXR1dGVPYmplY3Qoc3RyLCBkYXRhT2JqKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgcGVyLWl0ZXJhdGlvbiBsb29rdXAgY29udGV4dCBmb3IgYSBTVFJJTkcgaXRlbS5cbiAgICpcbiAgICogQWx3YXlzIGluY2x1ZGVzOlxuICAgKiAgIC0gc3B5bmVMb29wS2V5OiB0aGUgc3RyaW5nIGl0c2VsZiAobWF0Y2hlcyB0aGUgQ01TIHByb3h5IHdyYXBwaW5nLFxuICAgKiAgICAgd2hpY2ggcmVwbGFjZXMge3sufX0ve3suKn19IGluc2lkZSBzdHJpbmcgbG9vcHMgd2l0aCB7e3NweW5lTG9vcEtleX19KVxuICAgKiAgIC0gbG9vcEluZGV4IC8gbG9vcE51bTogcG9zaXRpb25hbCB0b2tlbnNcbiAgICpcbiAgICogV2hlbiBwcm94eSBkYXRhIGlzIGFjdGl2ZSwgYWRkaXRpb25hbGx5IGluY2x1ZGVzOlxuICAgKiAgIC0gX19jbXNfX2RhdGFJZDogdGhlIENNUyBpZGVudGlmaWVyIGZvciB0aGUgUEFSRU5UIGFycmF5ICh0aGUgc3RyaW5nXG4gICAqICAgICBpdGVtcyB0aGVtc2VsdmVzIGFyZSBwcmltaXRpdmVzIGFuZCBkb24ndCBjYXJyeSB0aGUgaWQpXG4gICAqICAgLSBvcmlnS2V5OiB0aGUgb3JpZ2luYWwga2V5IHRoZSBDTVMgdXNlcyB0byBhZGRyZXNzIHRoaXMgc3BlY2lmaWNcbiAgICogICAgIHN0cmluZyB3aXRoaW4gaXRzIHBhcmVudCwgbG9va2VkIHVwIHZpYSBfX2Ntc19fa2V5Rm9yXzxpdGVtPlxuICAgKi9cbiAgYnVpbGRTdHJpbmdJdGVtQ29udGV4dChpdGVtLCBpbmRleCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICBzcHluZUxvb3BLZXk6IGl0ZW0sXG4gICAgICBsb29wSW5kZXg6IGluZGV4LFxuICAgICAgbG9vcE51bTogaW5kZXggKyAxXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNQcm94eURhdGEgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IG91dGVyRGF0YSA9IHRoaXMuY3VycmVudE91dGVyTG9vcERhdGFcbiAgICAgIGlmIChvdXRlckRhdGEgJiYgdHlwZW9mIG91dGVyRGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29udGV4dC5fX2Ntc19fZGF0YUlkID0gb3V0ZXJEYXRhLl9fY21zX19kYXRhSWQgfHwgJydcbiAgICAgICAgY29uc3Qga2V5SWRTdHIgPSBgX19jbXNfX2tleUZvcl8ke2l0ZW19YFxuICAgICAgICBjb250ZXh0Lm9yaWdLZXkgPSBvdXRlckRhdGFba2V5SWRTdHJdICE9PSB1bmRlZmluZWQgPyBvdXRlckRhdGFba2V5SWRTdHJdIDogJydcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRleHQuX19jbXNfX2RhdGFJZCA9ICcnXG4gICAgICAgIGNvbnRleHQub3JpZ0tleSA9ICcnXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHRcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHBlci1pdGVyYXRpb24gbG9va3VwIGNvbnRleHQgZm9yIGFuIE9CSkVDVCBpdGVtLCBpbmNsdWRpbmdcbiAgICogQ01TLXByb3h5IG1ldGFkYXRhIHdoZW4gdGhpcyB0ZW1wbGF0ZSBpcyByZW5kZXJpbmcgcHJveGllZCBkYXRhLlxuICAgKi9cbiAgYnVpbGRJdGVtQ29udGV4dChpdGVtLCBpbmRleCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBPYmplY3QuYXNzaWduKHt9LCBpdGVtLCB7XG4gICAgICBsb29wSW5kZXg6IGluZGV4LFxuICAgICAgbG9vcE51bTogaW5kZXggKyAxXG4gICAgfSlcblxuICAgIGlmICh0aGlzLmlzUHJveHlEYXRhID09PSB0cnVlKSB7XG4gICAgICBjb250ZXh0Ll9fY21zX19kYXRhSWQgPSBpdGVtLl9fY21zX19kYXRhSWRcbiAgICAgIGNvbnRleHQuc3B5bmVMb29wS2V5ID0gaXRlbVxuICAgICAgY29udGV4dC5sb29wSW5kZXggPSBpbmRleFxuICAgICAgY29udGV4dC5sb29wTnVtID0gaW5kZXggKyAxXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRleHRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyB7e2tleX19IGFuZCB7e2EuYi5jfX0gdG9rZW5zIGluIGBzdHJgIHVzaW5nIGBjdHhgIGFzIHRoZSBzb3VyY2UuXG4gICAqL1xuICBzdWJzdGl0dXRlT2JqZWN0KHN0ciwgY3R4KSB7XG4gICAgY29uc3QgcmVEb3QgPSAvKFxcLikvZ21cbiAgICBjb25zdCBwb3NpdGlvbmFsID0geyBsb29wSW5kZXg6IGN0eC5sb29wSW5kZXgsIGxvb3BOdW06IGN0eC5sb29wTnVtIH1cblxuICAgIGNvbnN0IHJlcGxhY2VyID0gKG1hdGNoLCBwMSwgcDIpID0+IHtcbiAgICAgIC8vIEF1dG8taW5qZWN0ZWQgcG9zaXRpb25hbCB0b2tlbnMgdGFrZSBwcmVjZWRlbmNlXG4gICAgICBpZiAocG9zaXRpb25hbFtwMl0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHBvc2l0aW9uYWxbcDJdXG5cbiAgICAgIC8vIFNpbXBsZSBrZXkgYWNjZXNzXG4gICAgICBpZiAocmVEb3QudGVzdChwMikgPT09IGZhbHNlICYmIGN0eFtwMl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gY3R4W3AyXVxuICAgICAgfVxuXG4gICAgICAvLyBEb3QtcGF0aCBhY2Nlc3NcbiAgICAgIHJldHVybiB0aGlzLmdldERhdGFWYWxGcm9tUGF0aFN0cihwMiwgY3R4KVxuICAgIH1cblxuICAgIHJldHVybiBzdHIucmVwbGFjZShEb21FbGVtZW50VGVtcGxhdGUuc3dhcFBhcmFtc0ZvclRhZ3NSRSgpLCByZXBsYWNlcilcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRyeSBwb2ludCBmb3IgZWFjaCB0b3AtbGV2ZWwgbG9vcCBtYXRjaC4gRXh0cmFjdHMgbG9vcCBkYXRhLCBydW5zIHRoZVxuICAgKiBpbm5lci1sb29wIHBhc3Mgb24gdGhlIGJvZHkgZm9yIGVhY2ggaXRlcmF0aW9uLCB0aGVuIHN1YnN0aXR1dGVzIG91dGVyXG4gICAqIHZhcmlhYmxlcy5cbiAgICovXG4gIHBhcnNlVGhlVG1wbExvb3Aoc3RyLCBwMSwgcDIsIHAzKSB7XG4gICAgY29uc3Qgb3V0ZXJCb2R5ID0gcDNcbiAgICBjb25zdCBlbERhdGEgPSBEb21FbGVtZW50VGVtcGxhdGUuZ2V0TmVzdGVkRGF0YVJlZHVjZXIodGhpcy50ZW1wbGF0ZURhdGEsIHAyKVxuXG4gICAgaWYgKGlzTmlsKGVsRGF0YSkgPT09IHRydWUgfHwgaXNFbXB0eShlbERhdGEpKSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG5cbiAgICAvLyBTdGFzaCB0aGUgb3V0ZXIgZGF0YSBzbyB0aGF0IHBlci1pdGVyYXRpb24gc3Vic3RpdHV0aW9uIGNhbiBsb29rIHVwXG4gICAgLy8gQ01TIHByb3h5IG1ldGFkYXRhIChfX2Ntc19fZGF0YUlkLCBfX2Ntc19fa2V5Rm9yXyopIHRoYXQgbGl2ZXMgb24gdGhlXG4gICAgLy8gcGFyZW50IGFycmF5IG9iamVjdCDigJQgbm90IG9uIGluZGl2aWR1YWwgc3RyaW5nIGVsZW1lbnRzLlxuICAgIGNvbnN0IHByZXZpb3VzT3V0ZXIgPSB0aGlzLmN1cnJlbnRPdXRlckxvb3BEYXRhXG4gICAgdGhpcy5jdXJyZW50T3V0ZXJMb29wRGF0YSA9IGVsRGF0YVxuXG4gICAgY29uc3QgZWxBcnIgPSBBcnJheS5pc0FycmF5KGVsRGF0YSkgPyBlbERhdGEgOiBbZWxEYXRhXVxuXG4gICAgLy8gV2hldGhlciB0aGUgb3V0ZXIgYm9keSBjb250YWlucyBhbiBpbm5lciBsb29wIGlzIGNoZWFwIHRvIHRlc3QgYW5kIGxldHNcbiAgICAvLyB1cyBza2lwIHRoZSBpbm5lci1sb29wIHByb2Nlc3NpbmcgZW50aXJlbHkgZm9yIHRoZSBjb21tb24gc2luZ2xlLWxldmVsIGNhc2UuXG4gICAgY29uc3QgYm9keUhhc0lubmVyTG9vcCA9IERvbUVsZW1lbnRUZW1wbGF0ZS5oYXNMb29wKG91dGVyQm9keSlcblxuICAgIGNvbnN0IHJlbmRlcmVkID0gZWxBcnIubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgYm9keSA9IGJvZHlIYXNJbm5lckxvb3BcbiAgICAgICAgPyB0aGlzLnByb2Nlc3NJbm5lckxvb3Aob3V0ZXJCb2R5LCBpdGVtKVxuICAgICAgICA6IG91dGVyQm9keVxuXG4gICAgICByZXR1cm4gdGhpcy5zdWJzdGl0dXRlRm9ySXRlbShib2R5LCBpdGVtLCBpbmRleClcbiAgICB9KS5qb2luKCcnKVxuXG4gICAgdGhpcy5jdXJyZW50T3V0ZXJMb29wRGF0YSA9IHByZXZpb3VzT3V0ZXJcbiAgICByZXR1cm4gcmVuZGVyZWRcbiAgfVxufVxuIiwiaW1wb3J0IHsgYmFzZUNvcmVNaXhpbnMgfSBmcm9tICcuLi91dGlscy9taXhpbnMvYmFzZS1jb3JlLW1peGlucy5qcydcbmltcG9ydCB7IERvbUVsZW1lbnRUZW1wbGF0ZSB9IGZyb20gJy4vZG9tLWVsZW1lbnQtdGVtcGxhdGUuanMnXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuLi91dGlscy9kZWVwLW1lcmdlLmpzJ1xuaW1wb3J0IHsgaXMsIGRlZmF1bHRUbywgcGljaywgbWFwT2JqSW5kZXhlZCwgZm9yRWFjaE9iakluZGV4ZWQsIHBpcGUgfSBmcm9tICdyYW1kYSdcblxuY2xhc3MgRG9tRWxlbWVudCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIERvbUVsZW1lbnRcbiAgICogQHR5cGUgdXRpbFxuICAgKlxuICAgKiBAZGVzY1xuICAgKiA8cD5UaGlzIGlzIHRoZSBWaWV3U3RyZWFtIHJlbmRlcmluZyBlbmdpbmUuPC9wPlxuICAgKiA8cD5UaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBwcm9jZXNzIGZvciBjcmVhdGluZyBIVE1MRWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSB0aGUgbG9naWMgYW5kIG92ZXJoZWFkIG9mIGEgVmlld1N0cmVhbSBpbnN0YW5jZS48L3A+XG4gICAqIDxidXR0b24gY2xhc3M9J21vZGFsLWJ0biBidG4gYnRuLWJsdWUtcmVmJyBkYXRhLXR5cGU9J21vZGFsLXdpbmRvdycgZGF0YS1udW09ODAwIGRhdGEtdmFsdWU9J2F0dHJpYnV0ZXMnPlZpZXcgQXR0cmlidXRlczwvYnV0dG9uPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgdGhlIHRhZ25hbWUgZm9yIHRoaXMgZG9tIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhdHRyaWJ1dGVzIGFueSBkb21FbGVtZW50IGF0dHJpYnV0ZSAoZXhjZXB0IGZvciBjbGFzcyApXG4gICAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gZGF0YSBzdHJpbmcgZm9yIHRleHQgdGFncyBhbmQganNvbiBmb3IgdGVtcGxhdGVzXG4gICAqIEBwYXJhbSB7dGVtcGxhdGV9IHRlbXBsYXRlXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcm9wcy50YWdOYW1lIC0gPSAnZGl2JzsgRGVmYXVsdCBmb3IgdGFnTmFtZS5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BzLmF0dHJpYnV0ZXMgLSA9IHt9OyBUaGlzIGNhbiBiZSBhbnkgdmFsaWQgSFRNTCBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiB0YWdOYW1lLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ3xPYmplY3R9IHByb3BzLmRhdGEgPSB1bmRlZmluZWQ7IFRoaXMgaXMgZWl0aGVyIGEgU3RyaW5nIGZvciBhbiBlbGVtZW50IG9yIEpTT04gZGF0YSBvYmplY3QgZm9yIGEgdGVtcGxhdGUuXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfEhUTUx9IHByb3BzLnRlbXBsYXRlID0gdW5kZWZpbmVkOyBJZiBhIHRlbXBsYXRlIGlzIGRlZmluZWQsIHRoZSBEb21FbGVtZW50IHdpbGwgdXNlIGl0LlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9LCB0ZXN0TW9kZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgY2hlY2tEZWZhdWx0ID0gKGRmbHQsIHZhbCkgPT4gZGVmYXVsdFRvKGRmbHQpKHZhbClcblxuICAgIHByb3BzLnRhZ05hbWUgPSBjaGVja0RlZmF1bHQoJ2RpdicsIHByb3BzLnRhZ05hbWUpXG5cbiAgICBwcm9wcy5hdHRyaWJ1dGVzID0gcHJvcHMuYXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkID8gcHJvcHMuYXR0cmlidXRlcyA6IHRoaXMuZ2V0RG9tQXR0cmlidXRlcyhwcm9wcylcbiAgICBwcm9wcy5hdHRycyA9IHRoaXMudXBkYXRlQXR0cnMocHJvcHMuYXR0cmlidXRlcylcblxuICAgIHByb3BzLmZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgdGhpcy50ZXN0TW9kZSA9IHRlc3RNb2RlXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG5cbiAgICB0aGlzLmFkZE1peGlucygpXG4gIH1cblxuICBzZXRQcm9wKGtleSwgdmFsKSB7XG4gICAgdGhpcy5wcm9wc1trZXldID0gdmFsXG4gIH1cblxuICBnZXRQcm9wKHZhbCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzW3ZhbF1cbiAgfVxuXG4gIGdldCBlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5lbFxuICB9XG5cbiAgc2V0RWxBdHRycyhlbCwgcGFyYW1zKSB7XG4gICAgY29uc3QgYWRkQXR0cmlidXRlcyA9ICh2YWwsIGtleSkgPT4ge1xuICAgICAgY29uc3QgYWRkVG9EYXRhc2V0ID0gKHZhbCwga2V5KSA9PiB7IGVsLmRhdGFzZXRba2V5XSA9IHZhbCB9XG4gICAgICBpZiAoa2V5ID09PSAnZGF0YXNldCcpIHtcbiAgICAgICAgZm9yRWFjaE9iakluZGV4ZWQoYWRkVG9EYXRhc2V0LCB2YWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoa2V5LCB2YWwpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZ2V0UHJvcCgnYXR0cnMnKS5mb3JFYWNoKGFkZEF0dHJpYnV0ZXMpXG4gICAgcmV0dXJuIGVsXG4gIH1cblxuICB1cGRhdGVBdHRycyhwYXJhbXMsIG0pIHtcbiAgICBjb25zdCB0aGVNYXAgPSBtICE9PSB1bmRlZmluZWQgPyBtIDogbmV3IE1hcCgpXG4gICAgY29uc3QgYWRkQXR0cmlidXRlcyA9ICh2YWwsIGtleSkgPT4gdGhlTWFwLnNldChrZXksIHZhbClcbiAgICBtYXBPYmpJbmRleGVkKGFkZEF0dHJpYnV0ZXMsIHBhcmFtcylcbiAgICByZXR1cm4gdGhlTWFwXG4gIH1cblxuICBhZGRUZW1wbGF0ZShlbCkge1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5nZXRQcm9wKCd0ZW1wbGF0ZScpXG5cbiAgICBjb25zdCBhZGRUbXBsID0gKHRlbXBsYXRlKSA9PiB7XG4gICAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0UHJvcCgnZGF0YScpXG4gICAgICBkYXRhID0gaXMoT2JqZWN0LCBkYXRhKSA/IGRhdGEgOiB7fVxuICAgICAgY29uc3QgZnJhZyA9IG5ldyBEb21FbGVtZW50VGVtcGxhdGUodGVtcGxhdGUsIGRhdGEsIHsgdGVzdE1vZGU6IHRoaXM/LnRlc3RNb2RlIH0pLnJlbmRlckRvY0ZyYWcoKVxuICAgICAgY29uc3QgZnJhZ0lzU3RyaW5nID0gaXMoU3RyaW5nLCBmcmFnKVxuICAgICAgZnJhZ0lzU3RyaW5nID8gZWwuaW5uZXJIVE1MID0gZnJhZyA6IGVsLmFwcGVuZENoaWxkKGZyYWcpXG4gICAgICByZXR1cm4gZWxcbiAgICB9XG4gICAgY29uc3QgZG9Ob3RoaW5nID0gKGVsKSA9PiBlbFxuICAgIHJldHVybiB0ZW1wbGF0ZSAhPT0gdW5kZWZpbmVkID8gYWRkVG1wbCh0ZW1wbGF0ZSkgOiBkb05vdGhpbmcoZWwpXG4gIH1cblxuICBjcmVhdGVFbGVtZW50KHRhZ05hbWUgPSAnZGl2Jykge1xuICAgIHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpXG4gIH1cblxuICBhZGRDb250ZW50KGVsKSB7XG4gICAgY29uc3QgdGV4dCA9ICh0aGlzLmdldFByb3AoJ2RhdGEnKSlcbiAgICBjb25zdCBpc1RleHQgPSBpcyhTdHJpbmcsIHRleHQpXG4gICAgaWYgKGlzVGV4dCA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgdHh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGV4dClcbiAgICAgIGVsLmFwcGVuZENoaWxkKHR4dClcbiAgICB9XG4gICAgcmV0dXJuIGVsXG4gIH1cblxuICBleGVjdXRlKCkge1xuICAgIGNvbnN0IGVsID0gcGlwZShcbiAgICAgIHRoaXMuY3JlYXRlRWxlbWVudC5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5zZXRFbEF0dHJzLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmFkZFRlbXBsYXRlLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmFkZENvbnRlbnQuYmluZCh0aGlzKVxuICAgICkodGhpcy5nZXRQcm9wKCd0YWdOYW1lJykpXG4gICAgLy8gdGhpcy5nZXRQcm9wKCdmcmFnbWVudCcpLmFwcGVuZENoaWxkKGVsKTtcbiAgICB0aGlzLnByb3BzLmVsID0gZWxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJlbmRlciB0aGUgSFRNTCBFbGVtZW50XG4gICAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gSFRNTEVsZW1lbnRcbiAgICovXG4gIHJlbmRlcigpIHtcbiAgICB0aGlzLmV4ZWN1dGUoKVxuICAgIHRoaXMucHJvcHMudGVtcGxhdGUgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmRhdGEgPSB1bmRlZmluZWRcbiAgICB0aGlzLnByb3BzLmF0dHJpYnV0ZXMgPSB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wKCdlbCcpXG4gIH1cblxuICByZW5kZXJUb0hUTUxTdHJpbmcoKSB7XG4gICAgdGhpcy5leGVjdXRlKClcbiAgICB0aGlzLnByb3BzLnRlbXBsYXRlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5kYXRhID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5hdHRyaWJ1dGVzID0gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcCgnZWwnKS5vdXRlckhUTUxcbiAgfVxuXG4gIHJldHVybklmRGVmaW5lZChvYmosIHZhbCkge1xuICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNPYmogPSB0eXBlb2YgKHZhbCkgPT09ICd1bmRlZmluZWQnXG4gICAgICBpc09iaiA9PT0gZmFsc2UgPyBvYmpbdmFsXSA9IHZhbCA6IG9ialt2YWxdID0gZGVlcE1lcmdlKG9ialt2YWxdLCB2YWwpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlcHJvcHModmFsKSB7XG4gICAgdGhpcy5yZXR1cm5JZkRlZmluZWQodGhpcy5wcm9wcywgdmFsKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB1cGRhdGVwcm9wc0FuZFJ1bih2YWwpIHtcbiAgICB0aGlzLnVwZGF0ZXByb3BzKHZhbClcbiAgICB0aGlzLmV4ZWN1dGUoKVxuICAgIHJldHVybiB0aGlzLmdldFByb3AoJ2ZyYWdtZW50JylcbiAgfVxuXG4gIHVubW91bnQoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5nZXRQcm9wKCdlbCcpLnJlbW92ZSgpXG4gICAgICB0aGlzLnByb3BzID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmdjKClcbiAgICB9XG4gIH1cblxuICB1cGRhdGVUYWcodGFnTmFtZSA9ICdkaXYnKSB7IHRoaXMudXBkYXRlcHJvcHModGFnTmFtZSkgfVxuICB1cGRhdGVBdHRyaWJ1dGVzKGF0dHJzID0ge30pIHsgdGhpcy51cGRhdGVwcm9wcyhhdHRycykgfVxuICB1cGRhdGVUZW1wbGF0ZSh0ZW1wbGF0ZSkgeyB0aGlzLnVwZGF0ZXByb3BzKHRlbXBsYXRlKSB9XG4gIHVwZGF0ZURhdGEoZGF0YSA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHMoZGF0YSkgfVxuICBhZGRUYWdBbmRSZW5kZXIodGFnTmFtZSA9ICdkaXYnKSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4odGFnTmFtZSkgfVxuICBhZGRBdHRyc2lidXRlc0FuZFJlbmRlcihhdHRycyA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4oYXR0cnMpIH1cbiAgYWRkVGVtcGxhdGVBbmRSZW5kZXIodGVtcGxhdGUpIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bih0ZW1wbGF0ZSkgfVxuICBhZGREYXRhQW5kUmVuZGVyKGRhdGEgPSB7fSkgeyB0aGlzLnVwZGF0ZXByb3BzQW5kUnVuKGRhdGEpIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQkFTRSBDT1JFIE1JWElOU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBhZGRNaXhpbnMoKSB7XG4gICAgY29uc3QgY29yZU1peGlucyA9IGJhc2VDb3JlTWl4aW5zKClcbiAgICB0aGlzLmdjID0gY29yZU1peGlucy5nYy5iaW5kKHRoaXMpXG4gIH1cblxuICBnZXREb21BdHRyaWJ1dGVzKHByb3BzKSB7XG4gICAgcmV0dXJuIHBpY2sodGhpcy5hdHRyaWJ1dGVzQXJyYXksIHByb3BzKVxuICB9XG5cbiAgZ2V0IGF0dHJpYnV0ZXNBcnJheSgpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ2FjY2VwdCcsXG4gICAgICAnYWNjZXB0LWNoYXJzZXQnLFxuICAgICAgJ2FjY2Vzc2tleScsXG4gICAgICAnYWN0aW9uJyxcbiAgICAgICdhbGlnbicsXG4gICAgICAnYWxsb3cnLFxuICAgICAgJ2FsdCcsXG4gICAgICAnYXN5bmMnLFxuICAgICAgJ2F1dG9jYXBpdGFsaXplJyxcbiAgICAgICdhdXRvY29tcGxldGUnLFxuICAgICAgJ2F1dG9mb2N1cycsXG4gICAgICAnYXV0b3BsYXknLFxuICAgICAgJ2JnY29sb3InLFxuICAgICAgJ2JvcmRlcicsXG4gICAgICAnYnVmZmVyZWQnLFxuICAgICAgJ2NoYWxsZW5nZScsXG4gICAgICAnY2hhcnNldCcsXG4gICAgICAnY2hlY2tlZCcsXG4gICAgICAnY2l0ZScsXG4gICAgICAnY2xhc3MnLFxuICAgICAgJ2NvZGUnLFxuICAgICAgJ2NvZGViYXNlJyxcbiAgICAgICdjb2xvcicsXG4gICAgICAnY29scycsXG4gICAgICAnY29sc3BhbicsXG4gICAgICAnY29udGVudCcsXG4gICAgICAnY29udGVudGVkaXRhYmxlJyxcbiAgICAgICdjb250ZXh0bWVudScsXG4gICAgICAnY29udHJvbHMnLFxuICAgICAgJ2Nvb3JkcycsXG4gICAgICAnY3Jvc3NvcmlnaW4nLFxuICAgICAgJ2NzcCcsXG4gICAgICAnZGF0YXNldCcsXG4gICAgICAnZGF0ZXRpbWUnLFxuICAgICAgJ2RlY29kaW5nJyxcbiAgICAgICdkZWZhdWx0JyxcbiAgICAgICdkZWZlcicsXG4gICAgICAnZGlyJyxcbiAgICAgICdkaXJuYW1lJyxcbiAgICAgICdkaXNhYmxlZCcsXG4gICAgICAnZG93bmxvYWQnLFxuICAgICAgJ2RyYWdnYWJsZScsXG4gICAgICAnZHJvcHpvbmUnLFxuICAgICAgJ2VuY3R5cGUnLFxuICAgICAgJ2ZvcicsXG4gICAgICAnZm9ybScsXG4gICAgICAnZm9ybWFjdGlvbicsXG4gICAgICAnaGVhZGVycycsXG4gICAgICAnaGVpZ2h0JyxcbiAgICAgICdoaWRkZW4nLFxuICAgICAgJ2hpZ2gnLFxuICAgICAgJ2hyZWYnLFxuICAgICAgJ2hyZWZsYW5nJyxcbiAgICAgICdodHRwLWVxdWl2JyxcbiAgICAgICdpY29uJyxcbiAgICAgICdpZCcsXG4gICAgICAnaW1wb3J0YW5jZScsXG4gICAgICAnaW50ZWdyaXR5JyxcbiAgICAgICdpc21hcCcsXG4gICAgICAnaXRlbXByb3AnLFxuICAgICAgJ2tleXR5cGUnLFxuICAgICAgJ2tpbmQnLFxuICAgICAgJ2xhYmVsJyxcbiAgICAgICdsYW5nJyxcbiAgICAgICdsYW5ndWFnZScsXG4gICAgICAnbGF6eWxvYWQnLFxuICAgICAgJ2xpc3QnLFxuICAgICAgJ2xvb3AnLFxuICAgICAgJ2xvdycsXG4gICAgICAnbWFuaWZlc3QnLFxuICAgICAgJ21heCcsXG4gICAgICAnbWF4bGVuZ3RoJyxcbiAgICAgICdtaW5sZW5ndGgnLFxuICAgICAgJ21lZGlhJyxcbiAgICAgICdtZXRob2QnLFxuICAgICAgJ21pbicsXG4gICAgICAnbXVsdGlwbGUnLFxuICAgICAgJ211dGVkJyxcbiAgICAgICduYW1lJyxcbiAgICAgICdub3ZhbGlkYXRlJyxcbiAgICAgICdvcGVuJyxcbiAgICAgICdvcHRpbXVtJyxcbiAgICAgICdwYXR0ZXJuJyxcbiAgICAgICdwaW5nJyxcbiAgICAgICdwbGFjZWhvbGRlcicsXG4gICAgICAncG9zdGVyJyxcbiAgICAgICdwcmVsb2FkJyxcbiAgICAgICdyYWRpb2dyb3VwJyxcbiAgICAgICdyZWFkb25seScsXG4gICAgICAncmVmZXJyZXJwb2xpY3knLFxuICAgICAgJ3JlbCcsXG4gICAgICAncmVxdWlyZWQnLFxuICAgICAgJ3JldmVyc2VkJyxcbiAgICAgICdyb3dzJyxcbiAgICAgICdyb3dzcGFuJyxcbiAgICAgICdzYW5kYm94JyxcbiAgICAgICdzY29wZScsXG4gICAgICAnc2NvcGVkJyxcbiAgICAgICdzZWxlY3RlZCcsXG4gICAgICAnc2hhcGUnLFxuICAgICAgJ3NpemUnLFxuICAgICAgJ3NpemVzJyxcbiAgICAgICdzbG90JyxcbiAgICAgICdzcGFuJyxcbiAgICAgICdzcGVsbGNoZWNrJyxcbiAgICAgICdzcmMnLFxuICAgICAgJ3NyY2RvYycsXG4gICAgICAnc3JjbGFuZycsXG4gICAgICAnc3Jjc2V0JyxcbiAgICAgICdzdGFydCcsXG4gICAgICAnc3RlcCcsXG4gICAgICAnc3R5bGUnLFxuICAgICAgJ3N1bW1hcnknLFxuICAgICAgJ3RhYmluZGV4JyxcbiAgICAgICd0YXJnZXQnLFxuICAgICAgJ3RpdGxlJyxcbiAgICAgICd0cmFuc2xhdGUnLFxuICAgICAgJ3R5cGUnLFxuICAgICAgJ3VzZW1hcCcsXG4gICAgICAndmFsdWUnLFxuICAgICAgJ3dpZHRoJyxcbiAgICAgICd3cmFwJ1xuICAgIF1cbiAgfVxufVxuY29uc3QgRG9tRWwgPSBEb21FbGVtZW50XG5leHBvcnQgeyBEb21FbGVtZW50LCBEb21FbCB9XG4iLCJpbXBvcnQgeyBiYXNlU3RyZWFtc01peGlucyB9IGZyb20gJy4uL3V0aWxzL21peGlucy9iYXNlLXN0cmVhbXMtbWl4aW5zLmpzJ1xuaW1wb3J0IHsgY29udmVydERvbVN0cmluZ01hcFRvT2JqIH0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBjbG9uZSwgb21pdCB9IGZyb20gJ3JhbWRhJ1xuY29uc3QgaXNEZXZNb2RlID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtQnJvYWRjYXN0ZXIge1xuICAvKipcbiAgICogVGhlIGNsYXNzIHRha2VzIGluIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSB0aGUgJ2Jyb2FkY2FzdEV2ZW50cycgbWV0aG9kIGFuZCBkaXJlY3RzIHRoZSBldmVudHMgdG8gZWl0aGVyIHRoZSBVSSBvciBST1VURSBjaGFubmVsc1xuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1Ccm9hZGNhc3RlclxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGJyb2FkY2FzdEZuXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzLCBicm9hZGNhc3RGbikge1xuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgICB0aGlzLmJyb2FkY2FzdEZuID0gYnJvYWRjYXN0Rm5cbiAgICB0aGlzLmJyb2FkY2FzdGVyKHRoaXMuYnJvYWRjYXN0Rm4pXG4gIH1cblxuICBhZGREYmxDbGlja0V2dChxKSB7XG4gICAgY29uc3QgZGJsY2xpY2skID0gZnJvbUV2ZW50KHEsICdkYmxjbGljaycpXG4gICAgLy8gY29uc29sZS5sb2coJ0FERElORyBEQkwgQ0xJQ0sgJywgcSk7XG4gICAgY29uc3Qgc3RyZWFtJCA9IGRibGNsaWNrJC5waXBlKFxuICAgICAgbWFwKHAgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gY2xvbmUocClcbiAgICAgICAgLy8gQUREIERPVUJMRUNMSUNLIFRPIFVJIEVWRU5UU1xuICAgICAgICBkYXRhLnR5cGVPdmVyUmlkZSA9ICdkYmxjbGljaydcbiAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgIH0pKVxuICAgIHJldHVybiBzdHJlYW0kXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJST0FEQ0FTVCBCVVRUT04gRVZFTlRTXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYnJvYWRjYXN0KGFyZ3MpIHtcbiAgICBpZiAoYXJncy5sZW5ndGggPD0gMCAmJiBpc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG5lc3RlZCBhcnJheSBpbiAke3RoaXMucHJvcHMubmFtZX0uYnJvYWRjYXN0RXZlbnRzIGFwcGVhcnMgdG8gYmUgZW1wdHkgLS0+IHZzaWQ6JHt0aGlzLnByb3BzLnZzaWR9IWApXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgLy8gcGF5bG9hZHMgdG8gc2VuZCwgYmFzZWQgb24gZWl0aGVyIHRoZSBhcnJheSBvciB0aGUgZWxlbWVudHMgZGF0YU1hcFxuICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkcyA9IHtcbiAgICAgIFVJOiB0aGlzLnNlbmRVSVBheWxvYWQsXG4gICAgICBST1VURTogdGhpcy5zZW5kUm91dGVQYXlsb2FkXG4gICAgfVxuICAgIC8vIHNwcmVhZCBvcGVyYXRvciB0byBzZWxlY3QgdmFyaWFibGVzIGZyb20gYXJyYXlzXG4gICAgY29uc3QgW3NlbGVjdG9yLCBldmVudCwgbG9jYWxdID0gYXJnc1xuICAgIC8vIGJ0biBxdWVyeVxuICAgIGxldCBjaGFubmVsIC8vIGhvaXN0IGNoYW5uZWwgYW5kIGxhdGVyIGNoZWNrIGlmIGNobmwgZXhpc3RzXG4gICAgbGV0IHF1ZXJ5ID0gdGhpcy5wcm9wcy5lbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuXG4gICAgaWYgKHF1ZXJ5Lmxlbmd0aCA8PSAwKSB7XG4gICAgICBjb25zdCBlbCA9IHRoaXMucHJvcHMuZWxcbiAgICAgIGNvbnN0IGNoZWNrUGFyZW50RWxzID0gKGVsZW1lbnQpID0+IHtcbiAgICAgICAgaWYgKGVsZW1lbnQgPT09IGVsKSB7XG4gICAgICAgICAgcXVlcnkgPSBbZWxlbWVudF1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwbHVja0VsRnJvbVBhcmVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZWxQYXJlbnQgPSBlbC5wYXJlbnRFbGVtZW50ICE9PSBudWxsID8gZWwucGFyZW50RWxlbWVudCA6IGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGVsU2VsZWN0ZWQgPSBlbFBhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgICAgICBlbFNlbGVjdGVkLmZvckVhY2ggPSBBcnJheS5wcm90b3R5cGUuZm9yRWFjaFxuICAgICAgICBlbFNlbGVjdGVkLmZvckVhY2goY2hlY2tQYXJlbnRFbHMpXG4gICAgICB9XG5cbiAgICAgIHBsdWNrRWxGcm9tUGFyZW50KClcbiAgICB9XG5cbiAgICBjb25zdCBpc0xvY2FsRXZlbnQgPSBsb2NhbCAhPT0gdW5kZWZpbmVkXG4gICAgY29uc3QgYWRkT2JzZXJ2YWJsZSA9IChxKSA9PiB7XG4gICAgICAvLyB0aGUgIGJ0biBvYnNlcnZhYmxlXG4gICAgICBjb25zdCBvYnNlcnZhYmxlID0gZXZlbnQgIT09ICdkYmxDbGljaydcbiAgICAgICAgPyBmcm9tRXZlbnQocSwgZXZlbnQsIHsgcHJldmVudERlZmF1bHQ6ICgpID0+IHRydWUgfSlcbiAgICAgICAgOiB0aGlzLmFkZERibENsaWNrRXZ0KHEpXG4gICAgICAvLyBzZWxlY3QgY2hhbm5lbCBhbmQgZGF0YSB2YWx1ZXMgZnJvbSBlaXRoZXIgdGhlIGFycmF5IG9yIHRoZSBlbGVtZW50J3MgZG9tIE1hcFxuICAgICAgY2hhbm5lbCA9IHEuZGF0YXNldC5jaGFubmVsLy8gaWZOaWxUaGVuVXBkYXRlKGNobmwsIHEuZGF0YXNldC5jaGFubmVsKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB7fS8vIGNvbnZlcnREb21TdHJpbmdNYXBUb09iaihxLmRhdGFzZXQpO1xuICAgICAgZGF0YS5wYXlsb2FkID0gY29udmVydERvbVN0cmluZ01hcFRvT2JqKHEuZGF0YXNldClcbiAgICAgIGRhdGEucGF5bG9hZCA9IG9taXQoWydjaGFubmVsJ10sIGRhdGEucGF5bG9hZClcbiAgICAgIGRhdGEuY2hhbm5lbCA9IGNoYW5uZWxcbiAgICAgIC8vIHBheWxvYWQgbmVlZHMgdnNpZCMgdG8gcGFzcyB2ZXJpZmljYXRpb25cblxuICAgICAgZGF0YS5zcmNFbGVtZW50ID0ge30vLyBwaWNrKFsndnNpZCcsJ3ZpZXdOYW1lJ10sIGRhdGEpO1xuICAgICAgZGF0YS5zcmNFbGVtZW50LmlkID0gdGhpcy5wcm9wcy5pZFxuICAgICAgZGF0YS5zcmNFbGVtZW50LnZzaWQgPSB0aGlzLnByb3BzLnZzaWRcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5pc0xvY2FsRXZlbnQgPSBpc0xvY2FsRXZlbnRcbiAgICAgIC8vIGRhdGEuc3JjRWxlbWVudFsndmlld05hbWUnXSA9IHRoaXMucHJvcHMubmFtZTtcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5zcmNFdmVudCA9IGV2ZW50XG4gICAgICBkYXRhLnNyY0VsZW1lbnQuZWwgPSBxXG4gICAgICAvLyBzZWxlY3QgdGhlIGNvcnJlY3QgcGF5bG9hZFxuXG4gICAgICBmdW5jdGlvbiBnZXRWYWxpZENoYW5uZWwoY2gpIHtcbiAgICAgICAgaWYgKGNoID09PSAnUk9VVEUnIHx8IGNoID09PSAnQ0hBTk5FTF9ST1VURScpIHtcbiAgICAgICAgICByZXR1cm4gJ1JPVVRFJ1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaCAhPT0gJ1VJJyAmJiBjaCAhPT0gJ0NIQU5ORUxfVUknICYmIGNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lSlMgd2FybmluZzogVGhlIGNoYW5uZWwsICR7Y2h9LCBpcyBub3QgYWxsb3dlZCBoZXJlLCBvbmx5IFwiVUlcIiBvciBcIlJPVVRFXCIgYXJlIHZhbGlkIGNoYW5uZWxzLCBkZWZhdWx0aW5nIHRvIENIQU5ORUxfVUlgKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnVUknXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxQYXlsb2FkID0gY2hhbm5lbFBheWxvYWRzW2dldFZhbGlkQ2hhbm5lbChjaGFubmVsKV1cbiAgICAgIC8vIHJ1biBwYXlsb2FkXG4gICAgICBjaGFubmVsUGF5bG9hZChvYnNlcnZhYmxlLCBkYXRhKVxuICAgIH1cbiAgICBjb25zdCBxdWVyeUlzTmlsID0gcXVlcnkgPT09IHVuZGVmaW5lZCB8fCBxdWVyeS5sZW5ndGggPD0gMFxuICAgIGlmIChxdWVyeUlzTmlsID09PSB0cnVlICYmIGlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgaXRlbSAke3NlbGVjdG9yfSwgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IGluICR7dGhpcy5wcm9wcy5uYW1lfSAtLT4gdnNpZDoke3RoaXMucHJvcHMudnNpZH0hYClcblxuICAgICAgLy8gYWRkT2JzZXJ2YWJsZShxdWVyeSwgZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBxdWVyeS5mb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2hcbiAgICAgIHF1ZXJ5LmZvckVhY2goYWRkT2JzZXJ2YWJsZSlcbiAgICB9XG4gIH1cblxuICBicm9hZGNhc3RlcihhcnJGbikge1xuICAgIGNvbnN0IGJyb2FkY2FzdEFyciA9IGFyckZuKClcbiAgICBicm9hZGNhc3RBcnIuZm9yRWFjaChhcmdzID0+IHRoaXMuYnJvYWRjYXN0KGFyZ3MpKVxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGFkZE1peGlucygpIHtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgU1RSRUFNIE1JWElOU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3Qgc3RyZWFtTWl4aW5zID0gYmFzZVN0cmVhbXNNaXhpbnMoKVxuICAgIHRoaXMuc2VuZFVJUGF5bG9hZCA9IHN0cmVhbU1peGlucy5zZW5kVUlQYXlsb2FkXG4gICAgdGhpcy5zZW5kUm91dGVQYXlsb2FkID0gc3RyZWFtTWl4aW5zLnNlbmRSb3V0ZVBheWxvYWRcbiAgfVxufVxuIiwiaW1wb3J0IHsgRG9tRWxlbWVudCB9IGZyb20gJy4vZG9tLWVsZW1lbnQuanMnXG5pbXBvcnQgeyBmYWRlaW4sIGZhZGVvdXQgfSBmcm9tICcuLi91dGlscy92aWV3c3RyZWFtLWFuaW1hdGlvbnMuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtT2JzZXJ2YWJsZSB9IGZyb20gJy4uL3V0aWxzL3ZpZXdzdHJlYW0tb2JzZXJ2YWJsZXMuanMnXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuLi91dGlscy9kZWVwLW1lcmdlLmpzJ1xuaW1wb3J0IHsgU3ViamVjdCwgYmluZENhbGxiYWNrIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgaXNOaWwsIHBpY2ssIHByb3BzLCBkZWZhdWx0VG8gfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW1FbGVtZW50IHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbUVsZW1lbnRcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICogQGRlc2NcbiAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBjbGFzcyB0aGF0IGlzIHBhcnQgb2YgdGhlIFZpZXdTdHJlYW0gb2JzZXJ2YWJsZSBzeXN0ZW0uXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09ic2VydmFibGV9IHNpbmskXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2aWV3UHJvcHNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZzaWRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZzTmFtZVxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2luayQsIHZpZXdQcm9wcyA9IHt9LCB2c2lkID0gJycsIHZzTmFtZSA9ICd0aGVOYW1lJykge1xuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICB0aGlzLl9zdGF0ZSA9ICdJTklUJ1xuICAgIHRoaXMudnNpZCA9IHZzaWRcbiAgICB0aGlzLmVsID0gdmlld1Byb3BzLmVsXG4gICAgdGhpcy52c05hbWUgPSB2c05hbWVcbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgZGVidWc6ZmFsc2UsXG4gICAgICBleHRlbmRlZEhhc2hNZXRob2RzOiB7fVxuICAgIH1cbiAgICB0aGlzLm9wdGlvbnMgPSBkZWVwTWVyZ2UodGhpcy5kZWZhdWx0cywgdmlld1Byb3BzKVxuICAgIGNvbnN0IGNyZWF0ZUV4dHJhU3RhdGVzTWV0aG9kID0gKGFycikgPT4ge1xuICAgICAgY29uc3QgW2FjdGlvbiwgZnVuY1N0cl0gPSBhcnJcbiAgICAgIHRoaXMub3B0aW9ucy5leHRlbmRlZEhhc2hNZXRob2RzW2FjdGlvbl0gPSAocCkgPT4gdGhpc1tmdW5jU3RyXShwKVxuICAgIH1cbiAgICB0aGlzLmFkZEFjdGlvbkxpc3RlbmVycygpLmZvckVhY2goY3JlYXRlRXh0cmFTdGF0ZXNNZXRob2QpXG4gICAgdGhpcy5vcHRpb25zLmhhc2hNZXRob2RzID0gdGhpcy5zZXRIYXNoTWV0aG9kcyh0aGlzLm9wdGlvbnMuZXh0ZW5kZWRIYXNoTWV0aG9kcylcbiAgICB0aGlzLnNpbmskID0gc2luayRcbiAgICB0aGlzLnNpbmskXG4gICAgICAuc3Vic2NyaWJlKHRoaXMub25PYnNTaW5rU3Vic2NyaWJlLmJpbmQodGhpcykpXG5cbiAgICB0aGlzLiRkaXJzID0gVmlld1N0cmVhbU9ic2VydmFibGUuY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0KClcbiAgICB0aGlzLmFkZERlZmF1bHREaXIgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5hZGREZWZhdWx0RGlyXG4gICAgdGhpcy5zb3VyY2VTdHJlYW1zID0gVmlld1N0cmVhbU9ic2VydmFibGUuY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyhuZXcgU3ViamVjdCgpLCB0aGlzLnZzTmFtZSwgdGhpcy52c2lkKVxuICAgIHRoaXMuX3NvdXJjZSQgPSB0aGlzLnNvdXJjZVN0cmVhbXMudG9JbnRlcm5hbCQgLy8gIG5ldyBTdWJqZWN0KCk7XG4gIH1cblxuICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBzZXRIYXNoTWV0aG9kcyhleHRlbmRlZEhhc2hNZXRob2RzT2JqID0ge30pIHtcbiAgICBjb25zdCBkZWZhdWx0SGFzaE1ldGhvZHMgPSB7XG4gICAgICBWU19ERVRSSVRVU19DT0xMRUNUICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMub25HYXJiYWdlQ29sbGVjdChwKSxcbiAgICAgIFJFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUICAgICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMub25SZWFkeUZvckdDKHApLFxuICAgICAgRVhUSVJQQVRFICAgICAgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vbkRpc3Bvc2UocCksXG4gICAgICBWU19TUEFXTiAgICAgICAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uUmVuZGVyKHApLFxuICAgICAgVlNfU1BBV05fQU5EX0FUVEFDSF9UT19QQVJFTlQgICAgOiAocCkgPT4gdGhpcy5vblJlbmRlckFuZEF0dGFjaFRvUGFyZW50KHApLFxuICAgICAgVlNfU1BBV05fQU5EX0FUVEFDSF9UT19ET00gICAgICAgOiAocCkgPT4gdGhpcy5vblJlbmRlckFuZEF0dGFjaFRvRG9tKHApLFxuICAgICAgQVRUQUNIX0NISUxEX1RPX1NFTEYgICAgICAgICAgIDogKHApID0+IHRoaXMub25BdHRhY2hDaGlsZFRvU2VsZihwKVxuICAgIH1cbiAgICByZXR1cm4gZGVlcE1lcmdlKGRlZmF1bHRIYXNoTWV0aG9kcywgZXh0ZW5kZWRIYXNoTWV0aG9kc09iailcbiAgfVxuXG4gIGNyZWF0ZURvbUl0ZW0oKSB7XG4gICAgdGhpcy5wcm9wcyA9IHRoaXMucHJvcHMgIT09IHVuZGVmaW5lZCA/IHRoaXMucHJvcHMgOiB7fVxuICAgIGNvbnN0IHJlbW92ZUlzTmlsID0gKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWRcbiAgICBjb25zdCBhdHRycyA9IGZpbHRlcihyZW1vdmVJc05pbCwgcGljayhbJ2lkJywgJ2NsYXNzTmFtZSddLCB0aGlzLnByb3BzKSlcbiAgICBjb25zdCB7IHRhZ05hbWUsIGRhdGEsIHRlbXBsYXRlIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIG5ldyBEb21FbGVtZW50KHRhZ05hbWUsIGF0dHJzLCBkYXRhLCB0ZW1wbGF0ZSlcbiAgfVxuXG4gIG9uRGlzcG9zZUNvbXBsZXRlZChkKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ2J2IHNlbGYgZGlzcG9zZWQgYWZ0ZXIgYW5pbWF0ZU91dCAnLCBkLCB0aGlzKTtcbiAgfVxuXG4gIGFuaW1hdGVJblR3ZWVuKGVsLCB0aW1lKSB7XG4gICAgZmFkZWluKGVsLCB0aW1lKVxuICB9XG5cbiAgYW5pbWF0ZU91dFR3ZWVuKGVsLCB0aW1lLCBjYWxsYmFjaykge1xuICAgIC8vIGNvbnNvbGUubG9nKCdhbmltIG91dCAnLCB7ZWwsIHRpbWUsIGNhbGxiYWNrfSk7XG4gICAgZmFkZW91dChlbCwgdGltZSwgY2FsbGJhY2spXG4gIH1cblxuICBzZXRBbmltYXRlSW4oZCkge1xuICAgIGlmIChkLmFuaW1hdGVJbiA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgZWwgPSBkLmVsICE9PSB1bmRlZmluZWQgPyBkLmVsIDogdGhpcy5kb21JdGVtLmVsXG4gICAgICB0aGlzLmFuaW1hdGVJblR3ZWVuKGVsLCBkLmFuaW1hdGVJblRpbWUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkXG4gICAqIEByZXR1cm5zIHBheWxvYWQgdGhhdCBjb25maXJtcyBkaXNwb3NlXG4gICAqL1xuXG4gIGRpc3Bvc2VNZXRob2QoZCkge1xuICAgIGNvbnN0IGVsID0gZC5lbC5lbCAhPT0gdW5kZWZpbmVkID8gZC5lbC5lbCA6IGQuZWwgLy8gRE9NIElURU1TIEhBVkUgVEhFSVIgRUwgSVRFTVMgTkVTVEVEXG5cbiAgICBjb25zdCBnY0RhdGEgPSB7IGFjdGlvbjonUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnLCAkZGlyOnRoaXMuJGRpcnMuUEksIGVsIH1cblxuICAgIGNvbnN0IGFuaW1hdGVPdXQgPSAoZCwgY2FsbGJhY2spID0+IHtcbiAgICAgIHRoaXMuYW5pbWF0ZU91dFR3ZWVuKGVsLCBkLmFuaW1hdGVPdXRUaW1lLCBjYWxsYmFjaylcbiAgICB9XG5cbiAgICBjb25zdCBmYWRlT3V0T2JzID0gYmluZENhbGxiYWNrKGFuaW1hdGVPdXQpXG4gICAgY29uc3Qgb25GYWRlb3V0Q29tcGxldGVkID0gKGUpID0+IHtcbiAgICAgIHRoaXMuX3NvdXJjZSQubmV4dChnY0RhdGEpXG4gICAgfVxuXG4gICAgY29uc3Qgb25GYWRlb3V0T2JzID0gKGQpID0+IHtcbiAgICAgIGZhZGVPdXRPYnMoZClcbiAgICAgICAgLnN1YnNjcmliZShvbkZhZGVvdXRDb21wbGV0ZWQpXG4gICAgICByZXR1cm4geyBhY3Rpb246J0VYVElSUEFUSU5HJywgJGRpcjp0aGlzLiRkaXJzLkNJIH1cbiAgICB9XG4gICAgY29uc3Qgb25FbXB0eU9icyA9ICgpID0+ICh7IGFjdGlvbjonRVhUSVJQQVRFX0FORF9SRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcsICRkaXI6dGhpcy4kZGlycy5DSSB9KVxuICAgIGNvbnN0IGZuID0gZC5hbmltYXRlT3V0ID09PSB0cnVlID8gb25GYWRlb3V0T2JzIDogb25FbXB0eU9ic1xuICAgIHJldHVybiBmbihkKVxuICB9XG5cbiAgb25EaXNwb3NlKGQpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwb3NlTWV0aG9kKGQpXG4gIH1cblxuICByZW1vdmVTdHJlYW0oKSB7XG4gICAgLy8gdGhpcy5zb3VyY2VTdHJlYW1zLmNvbXBsZXRlQWxsKCk7XG4gICAgaWYgKHRoaXMuc291cmNlU3RyZWFtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNvdXJjZVN0cmVhbXMuY29tcGxldGVTdHJlYW0oWydpbnRlcm5hbCcsICdjaGlsZCddKVxuICAgIH1cbiAgfVxuXG4gIG9uUmVhZHlGb3JHQyhwKSB7XG4gICAgdGhpcy5yZW1vdmVTdHJlYW0oKVxuICB9XG5cbiAgb25HYXJiYWdlQ29sbGVjdChwKSB7XG4gICAgaWYgKHRoaXMuZG9tSXRlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRvbUl0ZW0udW5tb3VudCgpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc291cmNlU3RyZWFtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNvdXJjZVN0cmVhbXMuY29tcGxldGVTdHJlYW0oWydwYXJlbnQnXSlcbiAgICB9XG5cbiAgICBkZWxldGUgdGhpc1xuICB9XG5cbiAgZ2V0U291cmNlU3RyZWFtKCkge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2UkXG4gIH1cblxuICBjb21iaW5lRG9tSXRlbXMoZCkge1xuICAgIGlmICh0aGlzLmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9ICBpc05pbChkLnF1ZXJ5KSA/IGQubm9kZSA6IGQucXVlcnlcbiAgICBjb25zdCBwcmVwZW5kID0gKG5vZGUsIGl0ZW0pID0+IG5vZGUuaW5zZXJ0QmVmb3JlKGl0ZW0sIG5vZGUuZmlyc3RDaGlsZClcbiAgICBjb25zdCBhcHBlbmQgPSAobm9kZSwgaXRlbSkgPT4gbm9kZS5hcHBlbmRDaGlsZChpdGVtKVxuICAgIGNvbnN0IGFmdGVyID0gKG5vZGUsIGl0ZW0pID0+IG5vZGUuYWZ0ZXIoaXRlbSlcblxuICAgIGNvbnN0IGRlZmF1bHRGbiA9IHByZXBlbmRcbiAgICBjb25zdCBhdHRhY2hUeXBlSGFzaCA9IHtcbiAgICAgIGFwcGVuZENoaWxkIDogYXBwZW5kLFxuICAgICAgYWZ0ZXJcbiAgICB9XG4gICAgLy8gREVURVJNSU5FIFdIRVRIRVIgVE8gVVNFIEFQUEVORCBPUiBQUkVQRU5EXG4gICAgLy8gT04gQ09OTkVDVElORyBET00gSVRFTVMgVE8gRUFDSCBPVEhFUlxuICAgIC8vIGxldCBhdHRhY2hGdW5jID0gZC5hdHRhY2hUeXBlID09PSAnYXBwZW5kQ2hpbGQnID8gYXBwZW5kIDogcHJlcGVuZDtcbiAgICBjb25zdCBhdHRhY2hGdW5jID0gYXR0YWNoVHlwZUhhc2hbZC5hdHRhY2hUeXBlXSB8fCBkZWZhdWx0Rm5cbiAgICBhdHRhY2hGdW5jKGNvbnRhaW5lciwgdGhpcy5kb21JdGVtLnJlbmRlcigpKVxuICAgIHRoaXMuc2V0QW5pbWF0ZUluKGQpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHBcbiAgICogQHJldHVybnMgcGF5bG9hZCB0byBhcHBlbmQgY2hpbGQgZWxlbWVudCB0byBjdXJyZW50IGVsZW1lbnRcbiAgICovXG5cbiAgb25BdHRhY2hDaGlsZFRvU2VsZihwKSB7XG4gICAgY29uc3QgZGF0YSA9IHAuY2hpbGRSZW5kZXJEYXRhXG4gICAgdGhpcy5jb21iaW5lRG9tSXRlbXMoZGF0YSlcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnQ0hJTERfQVRUQUNIRUQnLFxuICAgICAgJGRpcjogdGhpcy4kZGlycy5QSVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZFxuICAgKiBAcmV0dXJucyBwYXlsb2FkIHRoYXQgYXR0YWNoZXMgY3VycmVudCBjaGlsZCBlbGVtZW50IHRvIHBhcmVudFxuICAgKi9cbiAgb25SZW5kZXJBbmRBdHRhY2hUb1BhcmVudChkKSB7XG4gICAgdGhpcy5vblJlbmRlcihkKVxuICAgIHRoaXMuY29tYmluZURvbUl0ZW1zKGQpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ1ZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX1BBUkVOVCcsXG4gICAgICBlbDogdGhpcy5lbCB8fCB0aGlzLmRvbUl0ZW0uZWwsXG4gICAgICAkZGlyOiB0aGlzLiRkaXJzLlBJXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyRG9tSXRlbShkKSB7XG4gICAgY29uc3QgW3RhZ05hbWUsIGF0dHJpYnV0ZXMsIGRhdGEsIHRlbXBsYXRlXSA9IGRcbiAgICB0aGlzLmRvbUl0ZW0gPSBuZXcgRG9tRWxlbWVudCh7IHRhZ05hbWUsIGF0dHJpYnV0ZXMsIGRhdGEsIHRlbXBsYXRlIH0pXG4gICAgcmV0dXJuIHRoaXMuZG9tSXRlbVxuICB9XG5cbiAgb25SZW5kZXIoZCkge1xuICAgIGNvbnN0IGdldEVsID0gKGRhdGEpID0+IHRoaXMucmVuZGVyRG9tSXRlbShkYXRhKVxuICAgIGNvbnN0IGVsID0gdGhpcy5lbCB8fCBnZXRFbChwcm9wcyhbJ3RhZ05hbWUnLCAnZG9tQXR0cmlidXRlcycsICdkYXRhJywgJ3RlbXBsYXRlJ10sIGQpKVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdWU19TUEFXTkVEJyxcbiAgICAgIGVsLFxuICAgICAgJGRpcjogdGhpcy4kZGlycy5JXG4gICAgfVxuICB9XG5cbiAgZXh0ZW5kZWRNZXRob2RzKGRhdGEpIHtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZFxuICAgKiBAcmV0dXJuc1xuICAgKiBQYXlsb2FkIGNvbnRhaW5pbmcgdGhlIGFjdGlvbiwgaW50ZXJuYWwgb2JzZXJ2YWJsZSBhbmQgZWxlbWVudC5cbiAgICovXG4gIG9uUmVuZGVyQW5kQXR0YWNoVG9Eb20oZCkge1xuICAgIGNvbnN0IGdldEVsID0gKGRhdGEpID0+IHRoaXMucmVuZGVyRG9tSXRlbShkYXRhKVxuICAgIGQuYXR0YWNoRGF0YS5lbCA9IGdldEVsKHByb3BzKFsndGFnTmFtZScsICdkb21BdHRyaWJ1dGVzJywgJ2RhdGEnLCAndGVtcGxhdGUnXSwgZCkpXG4gICAgdGhpcy5jb21iaW5lRG9tSXRlbXMoZC5hdHRhY2hEYXRhKVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19ET00nLFxuICAgICAgZWw6ICAgdGhpcy5lbCB8fCBkLmF0dGFjaERhdGEuZWwuZWwsXG4gICAgICAkZGlyOiB0aGlzLiRkaXJzLkNJXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoZSBWaWV3U3RyZWFtIGRpcmVjdHMgYWxsIHJlbGV2YW50IGFjdGlvbnMgdG8gdGhlIERvbUVsZW1lbnQgdG8gcmVuZGVyIGFuZCBkaXNwb3NlIG9mIGl0c2VsZlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKi9cbiAgb25PYnNTaW5rU3Vic2NyaWJlKHBheWxvYWQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSBwYXlsb2FkLmFjdGlvblxuICAgIGNvbnN0IGRlZmF1bHRUb0ZuID0gZGVmYXVsdFRvKChkYXRhKSA9PiB0aGlzLmV4dGVuZGVkTWV0aG9kcyhkYXRhKSlcbiAgICBjb25zdCBmbiA9IGRlZmF1bHRUb0ZuKHRoaXMub3B0aW9ucy5oYXNoTWV0aG9kc1thY3Rpb25dKVxuICAgIGNvbnN0IGRhdGEgPSBmbihwYXlsb2FkKVxuICAgIGNvbnN0IHNlbmREYXRhID0gKGQpID0+IHRoaXMuX3NvdXJjZSQubmV4dChkKVxuICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlbmREYXRhKE9iamVjdC5mcmVlemUoZGF0YSkpXG4gICAgfVxuICB9XG5cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBDT1JFIE1JWElOU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gbGV0IGNvcmVNaXhpbnMgPSBiYXNlQ29yZU1peGlucygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IHNhZmVDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3NhZmUtY2xvbmUuanMnXG5pbXBvcnQgeyBnYyB9IGZyb20gJy4uL3V0aWxzL2djLmpzJ1xuaW1wb3J0IHtcbiAgY29tcG9zZSxcbiAgY2xvbmUsXG4gIGZyb21QYWlycyxcbiAgdG9QYWlycyxcbiAgaXNcbn0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtUGF5bG9hZCB7XG4gIC8qKlxuICAgKlxuICAgKiBPYnNlcnZhYmxlcyBzZW50IGZyb20gVmlld1N0cmVhbXMgdG8gQ2hhbm5lbHMgYXJlIHZhbGlkYXRlZCBieSB0aGlzIGNsYXNzXG4gICAqXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbVBheWxvYWRcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gb2JzZXJ2YWJsZVxuICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZGVidWdcbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWUsIG9ic2VydmFibGUsIGRhdGEsIGFjdGlvbiA9ICdzdWJzY3JpYmUnLCBkZWJ1ZyA9IGZhbHNlKSB7XG4gICAgLy8gdGhpcy5hZGRNaXhpbnMoKTtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgbmFtZSxcbiAgICAgIG9ic2VydmFibGUsXG4gICAgICBkYXRhLFxuICAgICAgYWN0aW9uXG4gICAgfVxuICAgIHRoaXMuc2VuZFRvRGlyZWN0b3JTdHJlYW0ob3B0aW9ucylcbiAgfVxuXG4gIHNlbmRUb0RpcmVjdG9yU3RyZWFtKHBheWxvYWQpIHtcbiAgICBjb25zdCBkaXJlY3RvclN0cmVhbSQgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXAuZ2V0U3RyZWFtKCdESVNQQVRDSEVSJylcbiAgICBjb25zdCBmcm96ZW5QYXlsb2FkID0gc2FmZUNsb25lKHBheWxvYWQpXG4gICAgLy8gY29uc29sZS5sb2coXCJWUyBQQVlMT0FEIFwiLGZyb3plblBheWxvYWQpO1xuICAgIGRpcmVjdG9yU3RyZWFtJC5uZXh0KGZyb3plblBheWxvYWQpXG4gICAgcGF5bG9hZCA9IHVuZGVmaW5lZFxuXG4gICAgZGVsZXRlIHRoaXNcbiAgfVxuXG4gIHN0YXRpYyBkZWVwQ2xvbmUobykge1xuICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXkpXG4gICAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QpXG4gICAgY29uc3QgaXNJdGVyID0gb2IgPT4gaXNBcnIob2IpID09PSBmYWxzZSAmJiBpc09iaihvYikgPT09IHRydWVcbiAgICBjb25zdCBpc0l0ZXJhYmxlID0gaXNJdGVyKG8pXG4gICAgcmV0dXJuIGlzSXRlcmFibGUgPyBjb21wb3NlKGZyb21QYWlycywgdG9QYWlycywgY2xvbmUpKG8pIDogY2xvbmUobylcbiAgfVxuXG4gIHN0YXRpYyBnZXRNb3VzZUV2ZW50S2V5cygpIHtcbiAgICByZXR1cm4gWydhbHRLZXknLCAnYnViYmxlcycsICdjYW5jZWxCdWJibGUnLCAnY2FuY2VsYWJsZScsICdjbGllbnRYJywgJ2NsaWVudFknLCAnY29tcG9zZWQnLCAnY3RybEtleScsICdjdXJyZW50VGFyZ2V0JywgJ2RlZmF1bHRQcmV2ZW50ZWQnLCAnZGV0YWlsJywgJ2V2ZW50UGhhc2UnLCAnZnJvbUVsZW1lbnQnLCAnaXNUcnVzdGVkJywgJ2xheWVyWCcsICdsYXllclknLCAnbWV0YUtleScsICdtb3ZlbWVudFgnLCAnbW92ZW1lbnRZJywgJ29mZnNldFgnLCAnb2Zmc2V0WScsICdwYWdlWCcsICdwYWdlWScsICdwYXRoJywgJ3JlbGF0ZWRUYXJnZXQnLCAncmV0dXJuVmFsdWUnLCAnc2NyZWVuWCcsICdzY3JlZW5ZJywgJ3NoaWZ0S2V5JywgJ3NvdXJjZUNhcGFiaWxpdGllcycsICdzcmNFbGVtZW50JywgJ3RhcmdldCcsICd0aW1lU3RhbXAnLCAndG9FbGVtZW50JywgJ3R5cGUnLCAndmlldycsICd3aGljaCcsICd4JywgJ3knXVxuICB9XG5cbiAgYWRkTWl4aW5zKCkge1xuICAgIHRoaXMuZ2MgPSBnY1xuICB9XG59XG4iLCJpbXBvcnQgeyBoZWFkLCBjb21wb3NlLCByZWplY3QsIHNwbGl0LCBpc0VtcHR5LCBsdGUsIGRlZmF1bHRUbywgcHJvcCB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmZ1bmN0aW9uIGdlbmVyYXRlU3B5bmVTZWxlY3RvcklkKGVsKSB7XG4gIGNvbnN0IG51bSA9ICgpID0+IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnJlcGxhY2UoL1xcZC9nbSwgJycpLnN1YnN0cmluZygxLCA4KVxuICBsZXQgdnNpZCA9IGAke251bSgpfWBcbiAgaWYgKGVsLmRhdGFzZXQudnNpZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZWwuZGF0YXNldC52c2lkID0gdnNpZFxuICB9IGVsc2Uge1xuICAgIHZzaWQgPSBlbC5kYXRhc2V0LnZzaWRcbiAgfVxuICByZXR1cm4gYFtkYXRhLXZzaWQ9JyR7dnNpZH0nXWBcbn1cblxuZnVuY3Rpb24gaXNEZXZNb2RlKCkge1xuICByZXR1cm4gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnID09PSB0cnVlXG59XG5cbmZ1bmN0aW9uIGlzTm9kZUVsZW1lbnQoZWwpIHtcbiAgY29uc3Qgbm9kZUNoZWNrID0gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpXG4gIHJldHVybiBub2RlQ2hlY2soZWwpXG59XG5cbmZ1bmN0aW9uIGdldEVsT3JMaXN0KGN4dCwgc2VsLCB2ZXJib3NlQm9vbCA9IGZhbHNlKSB7XG4gIGNvbnN0IGxpc3QgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCB2ZXJib3NlQm9vbClcbiAgcmV0dXJuIGxpc3QubGVuZ3RoID09PSAxID8gaGVhZChsaXN0KSA6IGxpc3Rcbn1cblxuZnVuY3Rpb24gdGVzdFNlbGVjdG9ycyhjeHQsIHNlbCwgdmVyYm9zZUJvb2wpIHtcbiAgY29uc3QgZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGN4dClcblxuICBjb25zdCBlbElzRG9tRWxlbWVudCA9IGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKVxuXG4gIGlmIChlbCAhPT0gbnVsbCAmJiBlbElzRG9tRWxlbWVudChlbCkgPT09IGZhbHNlKSB7XG4gICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB0aGUgZWwgb2JqZWN0IGlzIG5vdCBhIHZhbGlkIHNpbmdsZSBlbGVtZW50LCAke2VsfWApXG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAoc2VsICE9PSB1bmRlZmluZWQgJiYgU3RyaW5nKHNlbCkudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICBmdW5jdGlvbiBpc1ZhbGlkU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA+IDAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBpcyB2YWxpZCBhbmQgc2VsZWN0cyBhdCBsZWFzdCBvbmUgZWxlbWVudFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2UgLy8gQ2F0Y2hpbmcgYW4gZXhjZXB0aW9uIG1lYW5zIHRoZSBzZWxlY3RvciBpcyBpbnZhbGlkXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNWYWxpZFNlbGVjdG9yQm9vbCA9IGlzVmFsaWRTZWxlY3RvcihzZWwpXG4gICAgaWYgKHZlcmJvc2VCb29sID09PSB0cnVlICYmIGlzRGV2TW9kZSgpID09PSB0cnVlICYmIGlzVmFsaWRTZWxlY3RvckJvb2wgPT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBzZWxlY3RvciwgJHtzZWx9IGRvZXMgbm90IGV4aXN0IGluIHRoaXMgZWwsICR7Y3h0fWApXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIHZlcmJvc2VCb29sID0gZmFsc2UpIHtcbiAgY29uc3Qgc2VsZWN0b3IgPSBzZWwgIT09IHVuZGVmaW5lZCA/IGAke2N4dH0gJHtzZWx9YCA6IGN4dFxuICBsZXQgaXNQYXJlbnQgPSBmYWxzZVxuXG4gIGNvbnN0IHJldHVyblNlbGVjdG9ySWZWYWxpZCA9IChzZWxlY3RvcikgPT4ge1xuICAgIGxldCBhcnIgPSBbXVxuICAgIHRyeSB7XG4gICAgICBhcnIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gY2F0Y2ggKGUpIHsgYXJyID0gW10gfVxuICAgIHRyeSB7XG4gICAgICBpc1BhcmVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsKSA9PT0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihjeHQpXG4gICAgICBpZiAoaXNQYXJlbnQgPT09IHRydWUpIHtcbiAgICAgICAgYXJyID0gW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsKV1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyByZXR1cm4gW107XG4gICAgfVxuICAgIHJldHVybiBhcnIvLyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgfVxuXG4gIGNvbnN0IGVsQXJyID0gIHJldHVyblNlbGVjdG9ySWZWYWxpZChzZWxlY3RvcilcblxuICBpZiAodmVyYm9zZUJvb2wgPT09IHRydWUpIHtcbiAgICBjb25zdCBtYWluU2VsID0gaXNQYXJlbnQgPT09IHRydWUgPyAnYm9keScgOiBjeHRcbiAgICB0ZXN0U2VsZWN0b3JzKG1haW5TZWwsIHNlbCwgdmVyYm9zZUJvb2wpXG4gIH1cblxuICByZXR1cm4gZWxBcnJcbn1cblxuZnVuY3Rpb24gc2V0SW5saW5lQ3NzKHZhbCwgY3h0LCBzZWwpIHtcbiAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgY29uc3QgYWRkSW5saW5lQ3NzID0gaXRlbSA9PiB7XG4gICAgaXRlbS5zdHlsZS5jc3NUZXh0ID0gdmFsXG4gIH1cbiAgYXJyLmZvckVhY2goYWRkSW5saW5lQ3NzKVxuICByZXR1cm4gdGhpc1xufVxuXG4vKipcbiAqXG4gKiBAbW9kdWxlIFZpZXdTdHJlYW1TZWxlY3RvclxuICogQHR5cGUgdXRpbFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfEVsfSBjeHQgVGhlIG1haW4gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd8RWx9IFRoZSBzZWxlY3RvciBhcyBhIFN0cmluZ1xuICogQHJldHVybnMge2Z1bmN0aW9uKCo9KX1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5cbmZ1bmN0aW9uIFZpZXdTdHJlYW1TZWxlY3RvcihjeHQsIHNlbCkge1xuICBjeHQgPSB0eXBlb2YgKGN4dCkgPT09ICdzdHJpbmcnID8gY3h0IDogZ2VuZXJhdGVTcHluZVNlbGVjdG9ySWQoY3h0KVxuICB0ZXN0U2VsZWN0b3JzKGN4dCwgc2VsLCBmYWxzZSlcblxuICBmdW5jdGlvbiBzZWxlY3RvcihzZWwpIHtcbiAgICByZXR1cm4gVmlld1N0cmVhbVNlbGVjdG9yKGN4dCwgc2VsKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBtYXAgdGhyb3VnaCBhIE5vZGVMaXN0LlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlbGVtZW50c1xuICAgKi9cbiAgc2VsZWN0b3IubWFwID0gKGZuKSA9PiBBcnJheS5mcm9tKGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpKS5tYXAoZm4pXG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBpdGVyYXRlIHRocm91Z2ggYSBOb2RlTGlzdFxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBlbGVtZW50c1xuICAgKi9cbiAgc2VsZWN0b3IuZm9yRWFjaCA9IChmbikgPT4gQXJyYXkuZnJvbShnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKSkubWFwKGZuKVxuXG4gIHNlbGVjdG9yLmdldE5vZGVMaXN0QXJyYXkgPSAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuXG4gIC8qKlxuICAgKlxuICAgKiBBZGRzIHRoZSBjbGFzcyB0byB0aGUgRWxlbWVudCBvciB0byB0aGUgTm9kZUxpc3QuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBjIC0gPSB1bmRlZmluZWQ7IFRoZSBjbGFzcyB0byBiZSBhZGRlZC5cbiAgICpcbiAgICoqL1xuICBzZWxlY3Rvci5hZGRDbGFzcyA9IChjKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCBhZGRDbGFzcyA9IGl0ZW0gPT4gaXRlbS5jbGFzc0xpc3QuYWRkKGMpXG4gICAgYXJyLmZvckVhY2goYWRkQ2xhc3MpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKiBAZGVzYyBSZW1vdmVzIHRoZSBjbGFzcyB0byB0aGUgRWxlbWVudCBvciB0byB0aGUgTm9kZUxpc3QuXG4gICAqL1xuICBzZWxlY3Rvci5yZW1vdmVDbGFzcyA9IChjKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCByZW1vdmVDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGMpXG4gICAgfVxuICAgIGFyci5mb3JFYWNoKHJlbW92ZUNsYXNzKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICogQGRlc2MgU2V0cyB0aGUgY2xhc3MgdG8gZXF1YWwgZXhhY3RseSB0aGUgY2xhc3Mgc3RyaW5nLlxuICAgKi9cbiAgc2VsZWN0b3Iuc2V0Q2xhc3MgPSAoYykgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgLyoqXG4gICAgKiBOT04gSUUgQ0xFQU5FUiBTT0xVVElPTlxuICAgICogY29uc3QgcmVtb3ZlQ2xhc3MgPSBpdGVtID0+IGl0ZW0uY2xhc3NMaXN0ID0gYztcbiAgICAqICBhcnIuZm9yRWFjaChyZW1vdmVDbGFzcyk7XG4gICAgKi9cblxuICAgIGNvbnN0IHNldFRoZUNsYXNzID0gaXRlbSA9PiB7XG4gICAgICBjb25zdCByZW1vdmVDbGFzc1N0ckFyciA9IGNvbXBvc2UocmVqZWN0KGlzRW1wdHkpLCBzcGxpdCgnICcpKShpdGVtLmNsYXNzTmFtZSlcbiAgICAgIGNvbnN0IGNsYXNzU3RyQXJyID0gYy5zcGxpdCgnICcpXG4gICAgICBjb25zdCByZW1vdmVyID0gcyA9PiBpdGVtLmNsYXNzTGlzdC5yZW1vdmUocylcbiAgICAgIGNvbnN0IGFkZGVyID0gc2VsID0+IGl0ZW0uY2xhc3NMaXN0LmFkZChzZWwpXG4gICAgICByZW1vdmVDbGFzc1N0ckFyci5mb3JFYWNoKHJlbW92ZXIpXG4gICAgICBjbGFzc1N0ckFyci5mb3JFYWNoKGFkZGVyKVxuICAgIH1cbiAgICBhcnIuZm9yRWFjaChzZXRUaGVDbGFzcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc2VsZWN0b3IudW5tb3VudCA9ICgpID0+IHtcbiAgICAvLyBjb25zb2xlLmxvZygndW5tb3VudGluZyBzZWxlY3RvciAnLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJvb2wgRGVmYXVsdCBpcyB1bmRlZmluZWQuXG4gICAqIEBkZXNjIFNldHMgdGhlIGNsYXNzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBib29sZWFuIG9yIHRoZSB0b2dnbGVzIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5wcm9wcy5lbCQudG9nZ2xlQ2xhc3MoJ215Y2xhc3MnLCB0cnVlKTtcbiAgICpcbiAgICovXG4gIHNlbGVjdG9yLnRvZ2dsZUNsYXNzID0gKGMsIGJvb2wpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIGNvbnN0IHRvZ2dsZUNsYXNzID0gaXRlbSA9PiB7XG4gICAgICBib29sID0gYm9vbCAhPT0gdW5kZWZpbmVkID8gYm9vbCA6ICFpdGVtLmNsYXNzTGlzdC5jb250YWlucyhjKVxuICAgICAgYm9vbCA/IGl0ZW0uY2xhc3NMaXN0LmFkZChjKSA6IGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShjKVxuICAgIH1cbiAgICBhcnIuZm9yRWFjaCh0b2dnbGVDbGFzcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc2VsZWN0b3IudG9nZ2xlID0gKGMsIGJvb2wpID0+IHtcbiAgICBzZWxlY3Rvci50b2dnbGVDbGFzcyhjLCBib29sKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgaHRtbCB0byB0aGUgU2VsZWN0b3IncyBlbGVtZW50XG4gICAqIEBwYXJhbSBodG1sRWxlbWVudFxuICAgKi9cbiAgc2VsZWN0b3IuYXBwZW5kQ2hpbGQgPSAoaHRtbEVsZW1lbnQpID0+IHtcbiAgICBpZiAoc2VsZWN0b3IuZWwubGVuZ3RoICE9PSAwKSB7XG4gICAgICBzZWxlY3Rvci5lbC5hcHBlbmRDaGlsZChodG1sRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgc2VsZWN0b3IsICR7c2VsfSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgdmFsaWQhYClcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0b3IuZWxcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBBZGRzIGNsYXNzIHdpdGggYSBkZWxheSBvZiAxbXMgdG8gYWxsb3cgY3NzIHRvIHJlZ2lzdGVyIGEgdHJhbnNpdGlvbi5cbiAgICogQHBhcmFtIGNcbiAgICovXG4gIHNlbGVjdG9yLmFkZEFuaW1DbGFzcyA9IChjKSA9PiB7XG4gICAgY29uc3QgZGVsYXlBZGRDbGFzcyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgICBjb25zdCBhZGRDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChjKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGFyci5mb3JFYWNoKGFkZENsYXNzKVxuICAgIH1cbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZGVsYXlBZGRDbGFzcylcbiAgICAvLyB3aW5kb3cuc2V0VGltZW91dChkZWxheUFkZENsYXNzLCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudH0gZWxTZWwgVGhlIHNlbGVjdG9yIGZvciB0aGUgZWxlbWVudC5cbiAgICogQGRlc2MgU2V0cyB0aGUgY2xhc3MgYWN0aXZlIEhUTUxFbGVtZW50IGZyb20gYSBOb2RlTGlzdC5cbiAgICovXG4gIHNlbGVjdG9yLnNldEFjdGl2ZUl0ZW0yID0gKGMsIGVsU2VsKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCBjdXJyZW50RWwgPSB0eXBlb2YgKGVsU2VsKSA9PT0gJ3N0cmluZycgPyBnZXRFbE9yTGlzdChjeHQsIGVsU2VsKSA6IGVsU2VsXG4gICAgY29uc3QgdG9nZ2xlQm9vbCA9IGl0ZW0gPT4gaXRlbS5pc0VxdWFsTm9kZShjdXJyZW50RWwpID8gaXRlbS5jbGFzc0xpc3QuYWRkKGMpIDogaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGMpXG4gICAgaWYgKGlzTm9kZUVsZW1lbnQoY3VycmVudEVsKSA9PT0gdHJ1ZSkge1xuICAgICAgYXJyLmZvckVhY2godG9nZ2xlQm9vbClcbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpID09PSB0cnVlKSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcIlNFTCBJUyBcIixlbFNlbCxjKTtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIHNlbGVjdG9yLCAke2VsU2VsfSwgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgdmFsaWQgaXRlbSBpbiBzZXRBY3RpdmVJdGVtOiAke2N9YClcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHNlbGVjdG9yLnNldEFjdGl2ZUl0ZW0gPSAoYywgZWxTZWwpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIGNvbnN0IGN1cnJlbnRFbCA9IHR5cGVvZiBlbFNlbCA9PT0gJ3N0cmluZydcbiAgICAgID8gZ2V0RWxPckxpc3QoY3h0LCBlbFNlbClcbiAgICAgIDogZWxTZWxcblxuICAgIGFyci5mb3JFYWNoKGl0ZW0gPT4gaXRlbS5jbGFzc0xpc3QucmVtb3ZlKGMpKVxuXG4gICAgaWYgKGlzTm9kZUVsZW1lbnQoY3VycmVudEVsKSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgbWF0Y2hpbmdFbCA9IEFycmF5LmZyb20oYXJyKS5maW5kKGl0ZW0gPT4gaXRlbSA9PT0gY3VycmVudEVsKVxuXG4gICAgICBpZiAobWF0Y2hpbmdFbCkge1xuICAgICAgICBtYXRjaGluZ0VsLmNsYXNzTGlzdC5hZGQoYylcbiAgICAgIH0gZWxzZSBpZiAoaXNEZXZNb2RlKCkgPT09IHRydWUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBTcHluZSBXYXJuaW5nOiBUaGUgc2VsZWN0b3IsICR7ZWxTZWx9LCBpcyB2YWxpZCBidXQgZG9lcyBub3QgbWF0Y2ggYW55IGl0ZW0gaW4gc2V0QWN0aXZlSXRlbTogJHtjfWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNEZXZNb2RlKCkgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgYFNweW5lIFdhcm5pbmc6IFRoZSBzZWxlY3RvciwgJHtlbFNlbH0sIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIGl0ZW0gaW4gc2V0QWN0aXZlSXRlbTogJHtjfWBcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBmdW5jdGlvbiBlbFxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBnZXR0ZXIgZm9yIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgYSBzaW5nbGUgZWxlbWVudCBvciBhIE5vZGVMaXN0IGZyb20gdGhlIHNlbGVjdG9yXG4gICAqL1xuXG4gIC8qKlxuICAgKlxuICAgKiBAZnVuY3Rpb24gbGVuZ3RoXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIERldGVybWluZXMgdGhlIGxlbmd0aCBvZiB0aGUgTm9kZUxpc3RcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogVGhlIGxlbmd0aCBvZiB0aGUgc2VsZWN0b3IgYXMgYSBOb2RlTGlzdFxuICAgKi9cblxuICAvKipcbiAgICpcbiAgICogQGZ1bmN0aW9uIGV4aXN0c1xuICAgKlxuICAgKiBAZGVzY1xuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gdGhlIHNlbGVjdGVkIGVsZW1lbnQgZXhpc3RzXG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIEJvb2xlYW5cbiAgICovXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnZWwnLCB7IGdldDogKCkgPT4gZ2V0RWxPckxpc3QoY3h0LCBzZWwsIHRydWUpIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2VscycsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdsZW4nLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgZmFsc2UpLmxlbmd0aCB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdleGlzdHMnLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgZmFsc2UpLmxlbmd0aCA+PSAxIH0pXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2V4aXN0JywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIGZhbHNlKS5sZW5ndGggPj0gMSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdub2RlTGlzdCcsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdhcnInLCB7XG4gICAgZ2V0OiAoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGdldEVsT3JMaXN0KGN4dCwgc2VsLCB0cnVlKVxuICAgICAgaWYgKGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtdXG4gICAgICB9IGVsc2UgaWYgKGVsLmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbZWxdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlbClcbiAgICAgIH1cbiAgICB9XG4gIH0pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnaW5saW5lJywgeyBzZXQ6ICh2YWwpID0+IHNldElubGluZUNzcyh2YWwsIGN4dCwgc2VsKSwgZ2V0OiAoKSA9PiBzZWxlY3RvciB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdpbmxpbmVDc3MnLCB7IHNldDogKHZhbCkgPT4gc2V0SW5saW5lQ3NzKHZhbCwgY3h0LCBzZWwpLCBnZXQ6ICgpID0+IHNlbGVjdG9yIH0pXG5cbiAgcmV0dXJuIHNlbGVjdG9yXG59XG5cbmV4cG9ydCB7IFZpZXdTdHJlYW1TZWxlY3RvciB9XG4iLCJpbXBvcnQgeyBiYXNlQ29yZU1peGlucyB9IGZyb20gJy4uL3V0aWxzL21peGlucy9iYXNlLWNvcmUtbWl4aW5zLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tICcuLi91dGlscy9kZWVwLW1lcmdlLmpzJ1xuaW1wb3J0IHsgc2FmZUNsb25lIH0gZnJvbSAnLi4vdXRpbHMvc2FmZS1jbG9uZS5qcydcbmltcG9ydCB7XG4gIGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIsXG4gIGdldENvbnN0cnVjdG9yTmFtZVxufSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtRWxlbWVudCB9IGZyb20gJy4vdmlldy1zdHJlYW0tZWxlbWVudC5qcydcbmltcG9ydCB7IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcyB9IGZyb20gJy4uL2NoYW5uZWxzL2NoYW5uZWxzLWNvbmZpZy5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1Ccm9hZGNhc3RlciB9IGZyb20gJy4vdmlldy1zdHJlYW0tYnJvYWRjYXN0ZXIuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtUGF5bG9hZCB9IGZyb20gJy4vdmlldy1zdHJlYW0tcGF5bG9hZC5qcydcbmltcG9ydCB7IENoYW5uZWxQYXlsb2FkRmlsdGVyIH0gZnJvbSAnLi4vdXRpbHMvY2hhbm5lbC1wYXlsb2FkLWZpbHRlci5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1PYnNlcnZhYmxlIH0gZnJvbSAnLi4vdXRpbHMvdmlld3N0cmVhbS1vYnNlcnZhYmxlcy5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW1TZWxlY3RvciB9IGZyb20gJy4vdmlldy1zdHJlYW0tc2VsZWN0b3IuanMnXG5pbXBvcnQgeyBTdWJqZWN0LCBvZiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtZXJnZU1hcCwgbWFwLCB0YWtlV2hpbGUsIGZpbHRlciwgdGFwLCBza2lwLCBmaW5hbGl6ZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHtcbiAgcGljayxcbiAgY29tcG9zZSxcbiAgaXNOaWwsXG4gIGFsbCxcbiAgZm9yRWFjaCxcbiAgdG9Mb3dlcixcbiAgZWl0aGVyLFxuICBmaW5kSW5kZXgsXG4gIGFwcGx5LFxuICB0ZXN0LFxuICBmbGF0dGVuLFxuICBwcm9wLFxuICBhbHdheXMsXG4gIGx0ZSxcbiAgZGVmYXVsdFRvLFxuICBwcm9wU2F0aXNmaWVzLFxuICBhbGxQYXNzLFxuICBjdXJyeSxcbiAgaXMsXG4gIHNsaWNlLFxuICBwYXRoLFxuICBvbWl0LFxuICBpZkVsc2UsXG4gIG1lcmdlUmlnaHQsXG4gIHdoZXJlLFxuICBlcXVhbHNcbiAgLCBtYXAgYXMgck1hcFxufSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIFZpZXdTdHJlYW0ge1xuICAvKipcbiAgICogQG1vZHVsZSBWaWV3U3RyZWFtXG4gICAqXG4gICAqIEBkZXNjXG4gICAqXG4gICAqIDxwPlZpZXdTdHJlYW0gaXMgdGhlIGludGVyYWN0aXZlLXZpZXcgY29tcG9uZW50LCBhbmQgaXRzIGNvcmUgZnVuY3Rpb25hbGl0eSBpcyBjb21wcmlzZWQgb2YgdHdvIGludGVybmFsIGNvbXBvbmVudHM6IDwvcD5cbiAgIDx1bCBjbGFzcz0nYmFzaWMnPlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSkge1xuICAgIHRoaXMudnNudW0gPSBNYXRoLnJhbmRvbSgpXG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIHRoaXMuX3Bvc3RSZW5kZXJDYWxsZWQgPSBmYWxzZVxuICAgIHRoaXMuZGVmYXVsdHMgPSAoKSA9PiB7XG4gICAgICBjb25zdCB2c2lkID0gdGhpcy5jcmVhdGVJZCgpXG4gICAgICBjb25zdCBpZCA9IHByb3BzLmlkID8gcHJvcHMuaWQgOiB2c2lkXG4gICAgICByZXR1cm4ge1xuICAgICAgICB2c2lkLFxuICAgICAgICBpZCxcbiAgICAgICAgdGFnTmFtZTogJ2RpdicsXG4gICAgICAgIGVsOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgYW5pbWF0ZUluOiBmYWxzZSxcbiAgICAgICAgYW5pbWF0ZUluVGltZTogMC41LFxuICAgICAgICBhbmltYXRlT3V0OiBmYWxzZSxcbiAgICAgICAgYW5pbWF0ZU91dFRpbWU6IDAuNSxcbiAgICAgICAgc2VuZExpZmVjeWxlRXZlbnRzOiBmYWxzZSxcbiAgICAgICAgaGFzaElkOiBgIyR7aWR9YCxcbiAgICAgICAgaWQkOiBgIyR7aWR9YCxcbiAgICAgICAgdmlld0NsYXNzOiBWaWV3U3RyZWFtRWxlbWVudCxcbiAgICAgICAgZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHM6IHt9LFxuICAgICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICAgIHRlbXBsYXRlOiB1bmRlZmluZWQsXG4gICAgICAgIG5vZGU6IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcbiAgICAgICAgbmFtZTogZ2V0Q29uc3RydWN0b3JOYW1lKHRoaXMpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX3N0YXRlID0ge31cbiAgICB0aGlzLiRkaXJzID0gVmlld1N0cmVhbU9ic2VydmFibGUuY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0KClcbiAgICB0aGlzLmFkZERlZmF1bHREaXJlY3Rpb24gPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5hZGREZWZhdWx0RGlyXG4gICAgdGhpcy5hZGREb3duSW50ZXJuYWxEaXIgPSBWaWV3U3RyZWFtT2JzZXJ2YWJsZS5hZGREb3duSW50ZXJuYWxEaXJcbiAgICAvLyB0aGlzLnByb3BzID0gT2JqZWN0LmFzc2lnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1RuKHt9LCB0aGlzLmRlZmF1bHRzKCksIHByb3BzKTtcbiAgICB0aGlzLnByb3BzID0gZGVlcE1lcmdlKHRoaXMuZGVmYXVsdHMoKSwgcHJvcHMpXG4gICAgdGhpcy5zZW5kTGlmZWN5Y2xlTWV0aG9kID0gdGhpcy5wcm9wcy5zZW5kTGlmZWN5bGVFdmVudHMgPT09IHRydWUgPyB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2RBY3RpdmUuYmluZCh0aGlzKSA6IHRoaXMuc2VuZExpZmVjeWNsZU1ldGhvZEluYWN0aXZlLmJpbmQodGhpcylcbiAgICBjb25zdCBhdHRyaWJ1dGVzQXJyID0gdGhpcy5hdHRyaWJ1dGVzQXJyYXlcbiAgICAvLyBsZXQgYXR0cmlidXRlc0FyciA9IFsnaWQnLCAnY2xhc3MnLCAnZGF0YXNldCddO1xuICAgIHRoaXMucHJvcHMuZG9tQXR0cmlidXRlcyA9IHBpY2soYXR0cmlidXRlc0FyciwgdGhpcy5wcm9wcylcbiAgICBpZiAodGhpcy5wcm9wcy50cmFpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5hZGRUcmFpdHModGhpcy5wcm9wcy50cmFpdHMpXG4gICAgfVxuICAgIHRoaXMubG9hZEFsbE1ldGhvZHMoKVxuICAgIHRoaXMucHJvcHMuYWN0aW9uID0gJ0xPQURFRCdcbiAgICB0aGlzLnNpbmskID0gbmV3IFN1YmplY3QoKVxuICAgIHRoaXMucHJvcHMuZWxJc0FscmVhZHlSZW5kZXJlZEJvb2wgPSB0aGlzLmVsQWxyZWFkeUV4aXN0c0ZuKHRoaXMucHJvcHMpXG4gICAgY29uc3QgVmlld0NsYXNzID0gdGhpcy5wcm9wcy52aWV3Q2xhc3NcbiAgICB0aGlzLnZpZXcgPSBuZXcgVmlld0NsYXNzKHRoaXMuc2luayQsIHsgZWw6dGhpcy5wcm9wcy5lbCB9LCB0aGlzLnByb3BzLnZzaWQsIHRoaXMucHJvcHMuaWQpLy8gbmV3IHRoaXMucHJvcHMudmlld0NsYXNzKHRoaXMuc2luayQpO1xuICAgIHRoaXMuc291cmNlU3RyZWFtcyA9IHRoaXMudmlldy5zb3VyY2VTdHJlYW1zXG4gICAgdGhpcy5fcmF3U291cmNlJCA9IHRoaXMudmlldy5nZXRTb3VyY2VTdHJlYW0oKVxuICAgIHRoaXMuX3Jhd1NvdXJjZSQudmlld05hbWUgPSB0aGlzLnByb3BzLm5hbWVcbiAgICB0aGlzLnNlbmRFdmVudHNEb3duU3RyZWFtID0gdGhpcy5zZW5kRXZlbnRzRG93blN0cmVhbUZuXG4gICAgdGhpcy5pbml0Vmlld1N0cmVhbSgpXG4gICAgdGhpcy5pc0Rldk1vZGUgPSBWaWV3U3RyZWFtLmlzRGV2TW9kZSgpXG4gICAgdGhpcy5wcm9wcy5hZGRlZENoYW5uZWxzID0gW11cbiAgICB0aGlzLmNoZWNrSWZFbGVtZW50QWxyZWFkeUV4aXN0cygpXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIQVNIIEtFWSBBTkQgU1BJR09UIE1FVEhPRFM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZ2V0IHNvdXJjZSQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZSRcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVzQXJyYXkoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIEdsb2JhbCBBdHRyaWJ1dGVzXG4gICAgICAnYWNjZXNza2V5JywgJ2NsYXNzJywgJ2NvbnRlbnRlZGl0YWJsZScsICdkaXInLCAnZHJhZ2dhYmxlJywgJ2hpZGRlbicsICdpZCcsICdsYW5nJywgJ3NwZWxsY2hlY2snLCAnc3R5bGUnLCAndGFiaW5kZXgnLCAndGl0bGUnLCAndHJhbnNsYXRlJyxcblxuICAgICAgLy8gQWNjZXNzaWJsaXR5IEF0dHJpYnV0ZXNcbiAgICAgICdhcmlhLWF1dG9jb21wbGV0ZScsICdhcmlhLWNoZWNrZWQnLCAnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWV4cGFuZGVkJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1oaWRkZW4nLCAnYXJpYS1pbnZhbGlkJywgJ2FyaWEtbGFiZWwnLCAnYXJpYS1sZXZlbCcsICdhcmlhLW11bHRpbGluZScsICdhcmlhLW11bHRpc2VsZWN0YWJsZScsICdhcmlhLW9yaWVudGF0aW9uJywgJ2FyaWEtcHJlc3NlZCcsICdhcmlhLXJlYWRvbmx5JywgJ2FyaWEtcmVxdWlyZWQnLCAnYXJpYS1zZWxlY3RlZCcsICdhcmlhLXNvcnQnLCAnYXJpYS12YWx1ZW1heCcsICdhcmlhLXZhbHVlbWluJywgJ2FyaWEtdmFsdWVub3cnLCAnYXJpYS12YWx1ZXRleHQnLCAnYXJpYS1hdG9taWMnLCAnYXJpYS1idXN5JywgJ2FyaWEtbGl2ZScsICdhcmlhLXJlbGV2YW50JywgJ2FyaWEtZHJvcGVmZmVjdCcsICdhcmlhLWdyYWJiZWQnLCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JywgJ2FyaWEtY29udHJvbHMnLCAnYXJpYS1kZXNjcmliZWRieScsICdhcmlhLWZsb3d0bycsICdhcmlhLWxhYmVsbGVkYnknLCAnYXJpYS1vd25zJywgJ2FyaWEtcG9zaW5zZXQnLCAnYXJpYS1zZXRzaXplJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgaW5wdXRcbiAgICAgICdhY2NlcHQnLCAnYXV0b2NvbXBsZXRlJywgJ2F1dG9mb2N1cycsICdjaGVja2VkJywgJ2Rpcm5hbWUnLCAnZGlzYWJsZWQnLCAnZm9ybScsICdmb3JtYWN0aW9uJyxcbiAgICAgICdmb3JtZW5jdHlwZScsICdmb3JtbWV0aG9kJywgJ2Zvcm1ub3ZhbGlkYXRlJywgJ2Zvcm10YXJnZXQnLCAnbGlzdCcsICdtYXgnLCAnbWF4bGVuZ3RoJyxcbiAgICAgICdtaW4nLCAnbWlubGVuZ3RoJywgJ211bHRpcGxlJywgJ25hbWUnLCAncGF0dGVybicsICdwbGFjZWhvbGRlcicsICdyZWFkb25seScsICdyZXF1aXJlZCcsICdzaXplJywgJ3N0ZXAnLCAndmFsdWUnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBpbWdcbiAgICAgICdhbHQnLCAnc3Jjc2V0JywgJ3NpemVzJywgJ3VzZW1hcCcsICdpc21hcCcsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGEgYW5kIGxpbmtcbiAgICAgICdocmVmJywgJ3RhcmdldCcsICdkb3dubG9hZCcsICdwaW5nJywgJ3JlbCcsICdocmVmbGFuZycsICdhcycsICdtZWRpYScsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGZvcm1cbiAgICAgICdhY2NlcHQtY2hhcnNldCcsICdhY3Rpb24nLCAnZW5jdHlwZScsICdub3ZhbGlkYXRlJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgbWV0YVxuICAgICAgJ2NvbnRlbnQnLCAnY2hhcnNldCcsICdodHRwLWVxdWl2JyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3Igc2NyaXB0XG4gICAgICAnYXN5bmMnLCAnZGVmZXInLCAnaW50ZWdyaXR5JywgJ25vbW9kdWxlJywgJ25vbmNlJywgJ3JlZmVycmVycG9saWN5JyxcblxuICAgICAgLy8gT3RoZXIgRWxlbWVudC1zcGVjaWZpYyBBdHRyaWJ1dGVzXG4gICAgICAnYXV0b2NhcGl0YWxpemUnLCAnYXV0b3BsYXknLCAnYnVmZmVyZWQnLCAnY2hhbGxlbmdlJywgJ2NpdGUnLCAnY29kZScsICdjb2RlYmFzZScsICdjb2xvcicsICdjb2xzJywgJ2NvbHNwYW4nLCAnY29udGV4dG1lbnUnLCAnY29udHJvbHMnLCAnY29vcmRzJywgJ2Nyb3Nzb3JpZ2luJywgJ2NzcCcsICdkYXRhc2V0JywgJ2RhdGV0aW1lJywgJ2RlY29kaW5nJywgJ2RlZmF1bHQnLCAnZm9yJywgJ2hlYWRlcnMnLCAnaGlnaCcsICdpY29uJywgJ2ltcG9ydGFuY2UnLCAnaXRlbXByb3AnLCAna2V5dHlwZScsICdraW5kJywgJ2xhYmVsJywgJ2xhbmd1YWdlJywgJ2xhenlsb2FkJywgJ2xvb3AnLCAnbG93JywgJ21hbmlmZXN0JywgJ21ldGhvZCcsICdtdXRlZCcsICdvcGVuJywgJ29wdGltdW0nLCAncG9zdGVyJywgJ3ByZWxvYWQnLCAncmFkaW9ncm91cCcsICdyZXZlcnNlZCcsICdyb2xlJywgJ3Jvd3MnLCAncm93c3BhbicsICdzYW5kYm94JywgJ3Njb3BlJywgJ3Njb3BlZCcsICdzZWxlY3RlZCcsICdzaGFwZScsICdzbG90JywgJ3NwYW4nLCAnc3JjZG9jJywgJ3NyYycsICd0eXBlJywgJ3NyY2xhbmcnLCAnc3RhcnQnLCAnc3VtbWFyeScsICd3cmFwJywgJ3dpZHRoJywgJ2hlaWdodCdcbiAgICBdXG4gIH1cblxuICBzdGF0aWMgaXNEZXZNb2RlKCkge1xuICAgIHJldHVybiBTcHluZUFwcFByb3BlcnRpZXMuZGVidWdcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmQWN0aW9uc0FyZVJlZ2lzdGVyZWQoY2hhbm5lbHNBcnIgPSBbXSwgYWN0aW9uc0Fycikge1xuICAgIGlmIChhY3Rpb25zQXJyLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGdldEFsbEFjdGlvbnMgPSAoYSkgPT4ge1xuICAgICAgICBjb25zdCBnZXRSZWdpc3RlcmVkQWN0aW9uc0FyciA9IChzdHIpID0+IFNweW5lQXBwUHJvcGVydGllcy5nZXRDaGFubmVsQWN0aW9ucyhzdHIpXG4gICAgICAgIGNvbnN0IGFyciA9ICBhLm1hcChnZXRSZWdpc3RlcmVkQWN0aW9uc0FycilcbiAgICAgICAgcmV0dXJuIGZsYXR0ZW4oYXJyKVxuICAgICAgfVxuICAgICAgY29uc3QgY2hlY2tGb3JNYXRjaCA9IChzdHJNYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoc3RyTWF0Y2gpXG4gICAgICAgIGNvbnN0IGFjdGlvbkluZGV4ID0gZmluZEluZGV4KHRlc3QocmUpLCBnZXRBbGxBY3Rpb25zQXJyKVxuICAgICAgICBpZiAoYWN0aW9uSW5kZXggPCAwKSB7XG4gICAgICAgICAgY29uc3QgY2hhbm5lbFN5bnRheCA9IGNoYW5uZWxzQXJyLmxlbmd0aCA9PT0gMSA/ICdmcm9tIGFkZGVkIGNoYW5uZWwnIDogJ2Zyb20gYWRkZWQgY2hhbm5lbHMnXG4gICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYWN0aW9uLCAke3N0ck1hdGNofSwgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCBkb2VzIG5vdCBtYXRjaCBhbnkgb2YgdGhlIHJlZ2lzdGVyZWQgYWN0aW9ucyAke2NoYW5uZWxTeW50YXh9LCAke2NoYW5uZWxzQXJyLmpvaW4oJywgJyl9YClcbiAgICAgICAgfVxuICAgICAgICAvLyAgY29uc3QgdnNudW0gPSAoKT0+IFIudGVzdChuZXcgUmVnRXhwKHN0ciksIFwiQ0hBTk5FTF9ST1VURV9URVNUX0VWRU5UXCIpXG4gICAgICB9XG4gICAgICBjb25zdCBnZXRBbGxBY3Rpb25zQXJyID0gZ2V0QWxsQWN0aW9ucyhjaGFubmVsc0FycilcbiAgICAgIGFjdGlvbnNBcnIuZm9yRWFjaChjaGVja0Zvck1hdGNoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBBZGQgYW55IHF1ZXJ5IHdpdGhpbiB0aGUgVmlld1N0cmVhbSdzIGRvbSBhbmQgYW55IGRvbSBldmVudHMgdG8gYXV0b21hdGljYWxseSBiZSBvYnNlcnZlZCBieSB0aGUgVUkgQ2hhbm5lbC5cbiAgICogPGJyPlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgYnJvYWRjYXN0RXZlbnRzKCkge1xuICAgKiAgLy8gQUREIEJVVFRPTiBFVkVOVFMgQVMgTkVTVEVEIEFSUkFZU1xuICAgKiAgcmV0dXJuIFtcbiAgICogICAgICAgWycjbXktYnV0dG9uJywgJ21vdXNlb3ZlciddLFxuICAgKiAgICAgICBbJyNteS1pbnB1dCcsICdjaGFuZ2UnXVxuICAgKiAgICAgXVxuICAgKiAgIH1cbiAgICpcbiAgICpcbiAgICogKi9cblxuICBzdGF0aWMgaXNWYWxpZE5lc3RlZEFycihldmVudHNBcnIpIHtcbiAgICBjb25zdCBpc1RydWUgPSBlcXVhbHModHJ1ZSlcbiAgICBjb25zdCBhbGxJc1RydWUgPSBhbGwoaXNUcnVlKVxuICAgIGNvbnN0IGlzU3RyaW5nID0gaXMoU3RyaW5nKVxuICAgIGNvbnN0IGlzVmFsaWRBcnIgPSBjb21wb3NlKGFsbElzVHJ1ZSwgck1hcChpc1N0cmluZyksIHNsaWNlKDAsIDIpLCBkZWZhdWx0VG8oW10pKVxuICAgIGNvbnN0IG1hcEV2ZW50c0FyckZuID0gY29tcG9zZShhbGxJc1RydWUsIHJNYXAoaXNWYWxpZEFyciksIGRlZmF1bHRUbyhbXSkpXG4gICAgcmV0dXJuIG1hcEV2ZW50c0FyckZuKGV2ZW50c0FycilcbiAgfVxuXG4gIHN0YXRpYyBlbElzRG9tRWxlbWVudChvKSB7XG4gICAgaWYgKGlzKFN0cmluZywgbykpIHtcbiAgICAgIG8gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG8pXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKShvKVxuICB9XG5cbiAgdXBkYXRlUHJvcHNUb01hdGNoRWwoKSB7XG4gICAgY29uc3QgZ2V0VGFnTmFtZSA9IGNvbXBvc2UodG9Mb3dlciwgZWl0aGVyKHByb3AoJ3RhZ05hbWUnKSwgYWx3YXlzKCcnKSkpXG4gICAgdGhpcy5wcm9wcy50YWdOYW1lID0gZ2V0VGFnTmFtZSh0aGlzLnByb3BzLmVsKVxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGVsQWxyZWFkeUV4aXN0c0ZuKHByb3BzKSB7XG4gICAgY29uc3QgZWxJc0RvbUVsZW1lbnQgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcbiAgICBjb25zdCBlbElzUmVuZGVyZWQgPSBlbCA9PiBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKGVsKVxuICAgIHJldHVybiBwcm9wU2F0aXNmaWVzKGFsbFBhc3MoW2VsSXNSZW5kZXJlZCwgZWxJc0RvbUVsZW1lbnRdKSwgJ2VsJykocHJvcHMpXG4gIH1cblxuICBjaGVja0lmRWxlbWVudEFscmVhZHlFeGlzdHMoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZWxJc0FscmVhZHlSZW5kZXJlZEJvb2wgPT09IHRydWUpIHtcbiAgICAgIHRoaXMudXBkYXRlUHJvcHNUb01hdGNoRWwoKVxuICAgICAgdGhpcy5wb3N0UmVuZGVyKClcbiAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMuZWwgPT09IG51bGwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNweW5lIEVycm9yOiBUaGUgZGVmaW5lZCBlbGVtZW50IGZvciB0aGlzIFZpZXdTdHJlYW0gaW5zdGFuY2UsICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSwgYXBwZWFycyB0byBub3QgZXhpc3QuYClcbiAgICB9XG4gIH1cblxuICBsb2FkQWxsTWV0aG9kcygpIHtcbiAgICBjb25zdCBjaGFubmVsRm4gPSBjdXJyeSh0aGlzLm9uQ2hhbm5lbE1ldGhvZENhbGwuYmluZCh0aGlzKSlcbiAgICBjb25zdCBjcmVhdGVFeHRyYVN0YXRlc01ldGhvZCA9IChhcnIpID0+IHtcbiAgICAgIGxldCBbYWN0aW9uLCBmdW5jU3RyLCBhY3Rpb25GaWx0ZXJdID0gYXJyXG4gICAgICBpZiAoaXMoU3RyaW5nLCBhY3Rpb25GaWx0ZXIpKSB7XG4gICAgICAgIGFjdGlvbkZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcih7IHNlbGVjdG9yOmFjdGlvbkZpbHRlciB9KVxuICAgICAgfVxuICAgICAgdGhpcy5wcm9wcy5leHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kc1thY3Rpb25dID0gY2hhbm5lbEZuKGZ1bmNTdHIsXG4gICAgICAgIGFjdGlvbkZpbHRlcilcbiAgICB9XG4gICAgdGhpcy5hZGRBY3Rpb25MaXN0ZW5lcnMoKS5mb3JFYWNoKGNyZWF0ZUV4dHJhU3RhdGVzTWV0aG9kKVxuICAgIHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHMgPSB0aGlzLnNldFNvdXJjZUhhc2hNZXRob2RzKFxuICAgICAgdGhpcy5wcm9wcy5leHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kcylcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBjaGFubmVsIGFjdGlvbnMgdG8gbG9jYWwgbWV0aG9kcywgZm9ybWF0dGVkIGFzIGFycmF5IHZhbHVlcy5cbiAgICogPHVsPlxuICAgKiA8bGk+PGI+Rmlyc3QgdmFsdWU6PC9iPiBBY3Rpb24gbmFtZSwgYXMgYSBzdHJpbmcgb3IgYXMgYSBiYXNpYyBSZWd1bGFyIEV4cHJlc3Npb24uXG4gICAqIDxsaT48Yj5TZWNvbmQgdmFsdWU6PC9iPiBUaGUgbWV0aG9kIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBhY3Rpb24gaXMgcHVibGlzaGVkLlxuICAgKiA8bGk+PGI+VGhpcmQgb3B0aW9uYWwgdmFsdWU6PC9iPiBUaGlzIGlzIGEgZmlsdGVyIG9wdGlvbiB0aGF0IGNhbiBiZSBhIHNlbGVjdG9yIHN0cmluZy4gb3IgYW4gaW5zdGFuY2Ugb2YgdGhlIExJTktbJ2NoYW5uZWxQYXlsb2FkRmlsdGVyJywgJ2NoYW5uZWwtcGF5bG9hZC1maWx0ZXInXS5cbiAgICogPC91bD5cbiAgICogQGV4YW1wbGVcbiAgICogICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICByZXR1cm4gW1xuICAgKiAgICAgWydDSEFOTkVMX1VJX0NMSUNLX0VWRU5UJywgJ29uQ2xpY2tFdmVudCcsICdsaS5teWNsYXNzJ10sXG4gICAqICAgICBbJ0NIQU5ORUxfTVlfQ1VTVE9NX0VWRU5UJywgJ29uQWN0aW9uUmV0dXJuZWQnXVxuICAgKiAgICAgICAgICAgIF1cbiAgICogICAgICAgICAgIH1cbiAgICpcbiAgICogQHJldHVybnMgTmVzdGVkIEFycmF5XG4gICAqL1xuICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBvbkNoYW5uZWxNZXRob2RDYWxsKHN0ciwgYWN0aW9uRmlsdGVyLCBwKSB7XG4gICAgY29uc3QgcnVuRnVuYyA9IChwYXlsb2FkKSA9PiB7XG4gICAgICBpZiAodGhpc1tzdHJdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbWV0aG9kLCAke3N0cn0gZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IGluICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSFgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tzdHJdKHBheWxvYWQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHAuJGRpciAhPT0gdW5kZWZpbmVkICYmIHAuJGRpci5pbmNsdWRlcygnY2hpbGQnKSAmJlxuICAgICAgICB0aGlzLmRlbGV0ZWQgIT09IHRydWUpIHtcbiAgICAgIGNvbnN0IG9iaiA9IGRlZXBNZXJnZSh7fSwgcCkvLyBPYmplY3QuYXNzaWduKHt9LCBwKTtcbiAgICAgIG9iai4kZGlyID0gdGhpcy4kZGlycy5DXG4gICAgICB0aGlzLnNvdXJjZVN0cmVhbXMucmF3JC5uZXh0KG9iailcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyUGF5bG9hZCA9IGRlZmF1bHRUbyhhbHdheXModHJ1ZSksIGFjdGlvbkZpbHRlcilcblxuICAgIGlmIChmaWx0ZXJQYXlsb2FkKHApID09PSB0cnVlKSB7XG4gICAgICBwID0gb21pdChbJyRkaXInXSwgcClcbiAgICAgIHJ1bkZ1bmMocClcbiAgICB9XG4gIH1cblxuICBzZXRTb3VyY2VIYXNoTWV0aG9kcyhleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kcyA9IHt9KSB7XG4gICAgY29uc3QgaGFzaFNvdXJjZUtleXMgPSB7XG4gICAgICBFWFRJUlBBVElORzogKHApID0+IHRoaXMuY2hlY2tQYXJlbnREaXNwb3NlKHApLFxuICAgICAgRVhUSVJQQVRFOiAocCkgPT4gdGhpcy5kaXNwb3NlVmlld1N0cmVhbShwKSxcbiAgICAgIC8vICdDSElMRF9FWFRJUlBBVEUnICAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLmRpc3Bvc2VWaWV3U3RyZWFtKHApLFxuICAgICAgVlNfU1BBV05FRDogKHApID0+IHRoaXMub25WU1JlbmRlcmVkKHApLFxuICAgICAgVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NOiAocCkgPT4gdGhpcy5vblZTUmVuZGVyZWQocCksXG4gICAgICBWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQ6IChwKSA9PiB0aGlzLm9uVlNSZW5kZXJlZChwKSxcbiAgICAgIC8vICdDSElMRF9WU19TUEFXTkVEJyAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLmF0dGFjaENoaWxkVG9WaWV3KHApLFxuICAgICAgUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1Q6IChwKSA9PiB0aGlzLm9uUmVhZHlUb0dDKHApLFxuICAgICAgVlNfTlVMTElUWTogKCkgPT4gKHt9KVxuICAgIH1cbiAgICByZXR1cm4gZGVlcE1lcmdlLmFsbChbe30sIGhhc2hTb3VyY2VLZXlzLCBleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kc10pXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IE1BSU4gU1RSRUFNIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgaW5pdFZpZXdTdHJlYW0oKSB7XG4gICAgdGhpcy5fc291cmNlJCA9IHRoaXMuX3Jhd1NvdXJjZSQucGlwZShtYXAoXG4gICAgICAocGF5bG9hZCkgPT4gdGhpcy5vbk1hcFZpZXdTb3VyY2UocGF5bG9hZCkpLCB0YWtlV2hpbGUodGhpcy5ub3RHQ1NUQVRFKSlcblxuICAgIHRoaXMuaW5pdEF1dG9NZXJnZVNvdXJjZVN0cmVhbXMoKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKHRoaXMuX3NvdXJjZSQsIHRydWUpXG4gIH1cblxuICBub3RHQ1NUQVRFKHApIHtcbiAgICByZXR1cm4gIXAuYWN0aW9uLmluY2x1ZGVzKCdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpXG4gIH1cblxuICBlcUdDU1RBVEUocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJylcbiAgfVxuXG4gIG5vdENPTVBMRVRFRChwKSB7XG4gICAgcmV0dXJuICFwLmFjdGlvbi5pbmNsdWRlcygnQ09NUExFVEVEJylcbiAgfVxuXG4gIG5vdEdDQ09NUExFVEUocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ0dDX0NPTVBMRVRFJylcbiAgfVxuXG4gIHRlc3RWYWwocCkge1xuICAgIGNvbnNvbGUubG9nKCdURVNUSU5HIFZBTEwgSVMgJywgcClcbiAgfVxuXG4gIGFkZFBhcmVudFN0cmVhbShvYnMsIGF0dGFjaERhdGEpIHtcbiAgICBjb25zdCBmaWx0ZXJPdXROdWxsRGF0YSA9IChkYXRhKSA9PiBkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YS5hY3Rpb24gIT09XG4gICAgICAgIHVuZGVmaW5lZFxuICAgIGNvbnN0IGNoZWNrSWZEaXNwb3NlT3JGYWRlb3V0ID0gKGQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBkZWVwTWVyZ2Uoe30sIGQpXG5cbiAgICAgIGlmIChkYXRhLmFjdGlvbiA9PT0gJ0VYVElSUEFURV9BTkRfUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnKSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0oZGF0YSlcbiAgICAgICAgZGF0YS5hY3Rpb24gPSAnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnXG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YVxuICAgIH1cblxuICAgIHRoaXMucGFyZW50JCA9IG9icy5waXBlKFxuICAgICAgZmlsdGVyKGZpbHRlck91dE51bGxEYXRhKSxcbiAgICAgIG1hcChjaGVja0lmRGlzcG9zZU9yRmFkZW91dCkpXG4gICAgdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24odGhpcy5wYXJlbnQkLCBmYWxzZSwgJ1BBUkVOVCcpXG4gICAgdGhpcy5yZW5kZXJBbmRBdHRhY2hUb1BhcmVudChhdHRhY2hEYXRhKVxuICB9XG5cbiAgYWRkQ2hpbGRTdHJlYW0ob2JzJCkge1xuICAgIGNvbnN0IGZpbHRlck91dE51bGxEYXRhID0gKGRhdGEpID0+IGRhdGEgIT09IHVuZGVmaW5lZCAmJiBkYXRhLmFjdGlvbiAhPT1cbiAgICAgICAgdW5kZWZpbmVkXG4gICAgY29uc3QgY2hpbGQkID0gb2JzJC5waXBlKFxuICAgICAgZmlsdGVyKGZpbHRlck91dE51bGxEYXRhKSxcbiAgICAgIHRhcChwID0+IHRoaXMudHJhY2VyKCdhZGRDaGlsZFN0cmFlbSBkbyAnLCBwKSksXG4gICAgICBtYXAoKHApID0+IHtcbiAgICAgICAgcmV0dXJuIHBcbiAgICAgIH0pLFxuICAgICAgZmluYWxpemUocCA9PiB0aGlzLm9uQ2hpbGRDb21wbGV0ZWQoY2hpbGQkLnNvdXJjZSkpKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKGNoaWxkJCwgdHJ1ZSwgJ0NISUxEJylcbiAgfVxuXG4gIG9uQ2hpbGREaXNwb3NlZChwKSB7XG5cbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBvbkNoaWxkQ29tcGxldGVkKHApIHtcbiAgICBjb25zdCBmaW5kTmFtZSA9ICh4KSA9PiB7XG4gICAgICBjb25zdCBmaW5hbERlc3QgPSAoeSkgPT4ge1xuICAgICAgICB3aGlsZSAoeS5kZXN0aW5hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgeSA9IGZpbmFsRGVzdCh5LmRlc3RpbmF0aW9uKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB5XG4gICAgICB9XG4gICAgICByZXR1cm4gcGljayhbJ2lkJywgJ3ZzaWQnXSwgZmluYWxEZXN0KHgpKVxuICAgIH1cbiAgICBjb25zdCBjaGlsZENvbXBsZXRlZERhdGEgPSBmaW5kTmFtZShwKVxuICAgIHRoaXMudHJhY2VyKCdvbkNoaWxkQ29tcGxldGVkICcsIHRoaXMudnNudW0sIHApXG4gICAgLy8gY29uc29sZS5sb2coJ29iaiBpcyAnLGNoaWxkQ29tcGxldGVkTmFtZSxvYmosdGhpcy5wcm9wcyk7XG4gICAgdGhpcy5vbkNoaWxkRGlzcG9zZWQoY2hpbGRDb21wbGV0ZWREYXRhLCBwKVxuICAgIHJldHVybiBjaGlsZENvbXBsZXRlZERhdGFcbiAgfVxuXG4gIGluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zKCkge1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT0gU1VCU0NSSVBUSU9OIFNPVVJDRSA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3Qgc3Vic2NyaWJlciA9IHtcbiAgICAgIG5leHQ6IHRoaXMub25TdWJzY3JpYmVUb1NvdXJjZXNOZXh0LmJpbmQodGhpcyksXG4gICAgICBlcnJvcjogdGhpcy5vblN1YnNjcmliZVRvU291cmNlc0Vycm9yLmJpbmQodGhpcyksXG4gICAgICBjb21wbGV0ZTogdGhpcy5vblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlLmJpbmQodGhpcylcbiAgICB9XG4gICAgLy8gbGV0IHRha2VCZWZvcmVHQ09sZCA9ICh2YWwpID0+IHZhbC5hY3Rpb24gIT09ICdWU19ERVRSSVRVU19DT0xMRUNURUQnO1xuICAgIC8vIGxldCB0YWtlQmVmb3JlR0MgPSAocCkgPT4gIXAuYWN0aW9uLmluY2x1ZGVzKCdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpO1xuICAgIC8vIGxldCBtYXBUb1N0YXRlID0gKHZhbCkgPT4gKHthY3Rpb246dmFsfSk7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vID09PT09PT09PT0gTUVUSE9EUyBUTyBDSEVDSyBGT1IgV0hFTiBUTyBDT01QTEVURSBUSEUgU1RSRUFNID09PT09PT09PVxuICAgIGNvbnN0IGNvbXBsZXRlQWxsID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5lbCQgPSB1bmRlZmluZWRcbiAgICAgIHRoaXMudWJlclNvdXJjZSQuY29tcGxldGUoKVxuICAgICAgdGhpcy5hdXRvU3Vic2NyaWJlciQuY29tcGxldGUoKVxuICAgICAgdGhpcy5zaW5rJC5jb21wbGV0ZSgpXG4gICAgICB0aGlzLnByb3BzID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLmRlbGV0ZWQgPSB0cnVlXG4gICAgICB0aGlzLnRyYWNlcignY29tcGxldGVBbGwnLCB0aGlzLmRlbGV0ZWQsIHRoaXMucHJvcHMpXG4gICAgfVxuICAgIGNvbnN0IGRlY3JlbWVudE9uT2JzZXJ2YWJsZUNsb3NlZCA9ICgpID0+IHtcbiAgICAgIG9ic0NvdW50IC09IDFcbiAgICAgIGlmIChvYnNDb3VudCA9PT0gMCkge1xuICAgICAgICBjb21wbGV0ZUFsbCgpXG4gICAgICB9XG4gICAgfVxuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT0gSU5JVCBTVFJFQU0gTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgb2JzQ291bnQgPSAwXG4gICAgdGhpcy51YmVyU291cmNlJCA9IG5ldyBTdWJqZWN0KClcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBDT01QT1NFRCBSWEpTIE9CU0VSVkFCTEUgPT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IGluY3JlbWVudE9ic2VydmFibGVzVGhhdENsb3NlcyA9ICgpID0+IHsgb2JzQ291bnQgKz0gMSB9XG4gICAgdGhpcy5hdXRvTWVyZ2VTdWJqZWN0JCA9IHRoaXMudWJlclNvdXJjZSQucGlwZShtZXJnZU1hcCgob2JzRGF0YSkgPT4ge1xuICAgICAgY29uc3QgYnJhbmNoT2JzZXJ2YWJsZSQgPSBvYnNEYXRhLm9ic2VydmFibGUucGlwZShmaWx0ZXIoXG4gICAgICAgIChwKSA9PiBwICE9PSB1bmRlZmluZWQgJiYgcC5hY3Rpb24gIT09IHVuZGVmaW5lZCksIG1hcChwID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1BBWUxPQUQgSVMgJywgcCwgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKVxuICAgICAgICBjb25zdCBwYXlsb2FkID0gZGVlcE1lcmdlKHt9LCBwKVxuICAgICAgICBwYXlsb2FkLmFjdGlvbiA9IHAuYWN0aW9uLy8gYWRkUmVsYXRpb25Ub1N0YXRlKG9ic0RhdGEucmVsLCBwLmFjdGlvbik7XG4gICAgICAgIHRoaXMudHJhY2VyKCdhdXRvTWVyZ2VTdWJqZWN0JCcsIHBheWxvYWQpXG4gICAgICAgIHJldHVybiBwYXlsb2FkXG4gICAgICB9KSlcblxuICAgICAgaWYgKG9ic0RhdGEuYXV0b0Nsb3Nlc0Jvb2wgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBicmFuY2hPYnNlcnZhYmxlJFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jcmVtZW50T2JzZXJ2YWJsZXNUaGF0Q2xvc2VzKClcbiAgICAgICAgcmV0dXJuIGJyYW5jaE9ic2VydmFibGUkLnBpcGUoZmluYWxpemUoZGVjcmVtZW50T25PYnNlcnZhYmxlQ2xvc2VkKSlcbiAgICAgIH1cbiAgICB9KSlcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVUJTQ1JJQkVSID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIHRoaXMuYXV0b1N1YnNjcmliZXIkID0gdGhpcy5hdXRvTWVyZ2VTdWJqZWN0JFxuICAgIC8vIC5kbygocCkgPT4gY29uc29sZS5sb2coJ1NJTksgREFUQSAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIHApKVxuICAgICAgLnBpcGUoZmlsdGVyKChwKSA9PiBwICE9PSB1bmRlZmluZWQgJiYgcC5hY3Rpb24gIT09IHVuZGVmaW5lZCkpXG4gICAgICAuc3Vic2NyaWJlKHN1YnNjcmliZXIpXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IE1FUkdFIFNUUkVBTVMgVE8gTUFJTiBTVUJTQ1JJQkVSID09PT09PT09PT09PT09PT09XG4gIHVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbihvYnMkLCBhdXRvQ2xvc2VzQm9vbCA9IGZhbHNlLCByZWwpIHtcbiAgICAvLyBjb25zdCBkaXJlY3Rpb25BcnIgPSBzZW5kRG93blN0cmVhbSA9PT0gdHJ1ZSA/IHRoaXMuJGRpcnMuREkgOiB0aGlzLiRkaXJzLkk7XG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgb2JzZXJ2YWJsZTogb2JzJCxcbiAgICAgIGF1dG9DbG9zZXNCb29sLFxuICAgICAgcmVsXG4gICAgfVxuICAgIHRoaXMudHJhY2VyKCd1cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24gJywgdGhpcy52c251bSwgb2JqKVxuICAgIHRoaXMudWJlclNvdXJjZSQubmV4dChvYmopXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVUJTQ1JJQkVSIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIG9uU3Vic2NyaWJlVG9Tb3VyY2VzTmV4dChwYXlsb2FkID0ge30pIHtcbiAgICBjb25zdCBkZWZhdWx0VG9GbiA9IGRlZmF1bHRUbygocCkgPT4gdGhpcy5zZW5kRXh0ZW5kZWRTdHJlYW1zKHApKVxuXG4gICAgLy8gKioqKlVTRSBSRUdFWCBBUyBQUkVESUNBVEUgQ0hFQ0sgRk9SIFBBWUxPQUQuQUNUSU9OIElOIEhBU0ggTUVUSE9EUyBPQkpcbiAgICAvLyBjb25zdCBoYXNoQWN0aW9uID0gdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kc1twYXlsb2FkLmFjdGlvbl07XG4gICAgY29uc3QgaGFzaEFjdGlvblN0ciA9IGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIodGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kcyxcbiAgICAgIHBheWxvYWQuYWN0aW9uKVxuICAgIGNvbnN0IGhhc2hBY3Rpb24gPSB0aGlzLnByb3BzLmhhc2hTb3VyY2VNZXRob2RzW2hhc2hBY3Rpb25TdHJdXG4gICAgLy8gY29uc29sZS5sb2coJ1MgUEFZTE9BRCAnLCB0aGlzLnByb3BzLm5hbWUsIHR5cGVvZiAoaGFzaEFjdGlvbiksIHBheWxvYWQpO1xuXG4gICAgY29uc3QgZm4gPSBkZWZhdWx0VG9GbihoYXNoQWN0aW9uKVxuXG4gICAgLy8gY29uc29sZS5sb2coJ2hhc2ggbWV0aG9kcyAnLCBmbiwgdGhpcy5wcm9wcy5uYW1lLCBwYXlsb2FkLmFjdGlvbiwgaGFzaEFjdGlvblN0ciwgdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kcyk7XG5cbiAgICBmbihwYXlsb2FkKVxuICAgIC8vIGNvbnNvbGUubG9nKGZuLCBwYXlsb2FkLCAnIFRIRSBQQVlMT0FEIEZST00gU1VCU0NSSUJFIElTICcsICcgLS0tLSAnLCAnIC0tLT4gJywgdGhpcy5wcm9wcyk7XG4gICAgLy8gY29uc29sZS5sb2coJ0VYVElSUEFURVIgVlMgTkVYVCcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgcGF5bG9hZCk7XG5cbiAgICB0aGlzLnRyYWNlcignb25TdWJzY3JpYmVUb1NvdXJjZXNOZXh0JywgeyBwYXlsb2FkIH0pXG4gIH1cblxuICBvblN1YnNjcmliZVRvU291cmNlc0Vycm9yKHBheWxvYWQgPSAnJykge1xuICAgIGNvbnNvbGUubG9nKCdBTEwgRVJST1IgICcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgcGF5bG9hZClcbiAgfVxuXG4gIC8qXG4gICAgYXR0YWNoQ2hpbGRUb1ZpZXcoZGF0YSkge1xuICAgICAgLy8gbGV0IGNoaWxkUmVuZGVyRGF0YSA9IGRhdGEuYXR0YWNoRGF0YTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdDSElMRCBEQVRBICcsIHRoaXMuY29uc3RydWN0b3IubmFtZSwgY2hpbGRSZW5kZXJEYXRhKTtcbiAgICAgIC8vIHRoaXMub3BlblNwaWdvdCgnQVRUQUNIX0NISUxEX1RPX1NFTEYnLCB7Y2hpbGRSZW5kZXJEYXRhfSk7XG4gICAgfVxuICAqL1xuXG4gIG9uU3Vic2NyaWJlVG9Tb3VyY2VzQ29tcGxldGUoKSB7XG4gICAgLy8gY29uc29sZS5sb2coJz09PT0gRVhUSVJQQVRFUiBBTEwgQ09NUExFVEVEID09PT0nLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMudHJhY2VyKCdvblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlJywgJ1ZTX0RFVFJJVFVTX0NPTExFQ1QnKVxuXG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19ERVRSSVRVU19DT0xMRUNUJylcbiAgfVxuXG4gIHNlbmRFeHRlbmRlZFN0cmVhbXMocGF5bG9hZCkge1xuICAgIHRoaXMudHJhY2VyKCdzZW5kRXh0ZW5kZWRTdHJlYW1zJywgcGF5bG9hZClcbiAgICAvLyBjb25zb2xlLmxvZygnZXh0ZW5kZWQgbWV0aG9kcyAnLCBwYXlsb2FkLmFjdGlvbiwgcGF5bG9hZCk7XG4gICAgdGhpcy5vcGVuU3BpZ290KHBheWxvYWQuYWN0aW9uLCBwYXlsb2FkKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBWU19TUEFXTiBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgcmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQoYXR0YWNoRGF0YSkge1xuICAgIC8vIGxldCBjaGlsZFJlbmRlckRhdGEgPSBhdHRhY2hEYXRhO1xuICAgIHRoaXMub3BlblNwaWdvdCgnVlNfU1BBV05fQU5EX0FUVEFDSF9UT19QQVJFTlQnLCBhdHRhY2hEYXRhKVxuICB9XG5cbiAgcmVuZGVyVmlldygpIHtcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ1ZTX1NQQVdOJylcbiAgfVxuXG4gIHJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCB0eXBlLCBhdHRhY2hUeXBlKSB7XG4gICAgY29uc3QgYXR0YWNoRGF0YSA9IHsgbm9kZSwgdHlwZSwgYXR0YWNoVHlwZSB9XG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19TUEFXTl9BTkRfQVRUQUNIX1RPX0RPTScsIHsgYXR0YWNoRGF0YSB9KVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFWFRJUlBBVEUgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY2hlY2tQYXJlbnREaXNwb3NlKHApIHtcbiAgICBpZiAocC5mcm9tJCA9PT0gJ3BhcmVudCcpIHtcbiAgICAgIHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0ocClcbiAgICB9XG4gIH1cblxuICBvbkJlZm9yZURpc3Bvc2UoKSB7XG5cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU0lOSyQgTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICpcbiAgICogV3JhcHMgd2luZG93LnNldFRpbWVvdXQgd2l0aCBhIGNoZWNrIHRvIHNlZSBpZiBcInRoaXNcIiBWaWV3U3RyZWFtIGVsZW1lbnQgYW5kIGl0cyBwcm9wcyBwcm9wZXJ0eSBzdGlsbCBleGlzdHNcbiAgICogQHByb3BlcnR5IHtmdW5jdGlvbn0gZm4gLSA9ICdmdW5jdGlvbic7IFRoZSBsb2NhbCBtZXRob2QgdGhhdCBpcyB0byBiZSBjYWxsZWQuXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtcyAtID0gMDsgIFRoZSB0aW1lLCBpbiBtaWxsZXNlY29uZHMsIGZvciB0aGUgdGltZW91dC5cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBiaW5kIC0gPSBmYWxzZTsgIFdoZW4gdHJ1ZSwgd2lsbCBiaW5kIHRoZSBtZXRob2QgdG8gJ3RoaXMnLlxuICAgKlxuICAgKi9cblxuICBzZXRUaW1lb3V0KGZuLCBtcyA9IDAsIGJpbmQgPSBmYWxzZSkge1xuICAgIGNvbnN0IHRpbWVvdXRNZXRob2QgPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKHRoaXMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kRm4gPSBiaW5kID09PSB0cnVlID8gZm4uYmluZCh0aGlzKSA6IGZuXG4gICAgICAgIGFwcGx5KG1ldGhvZEZuLCBhcmdzKVxuICAgICAgfVxuICAgIH1cbiAgICB3aW5kb3cuc2V0VGltZW91dCh0aW1lb3V0TWV0aG9kLCBtcylcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBCZWdpbnMgdGhlIHJlbW92YWwgcHJvY2VzcyBvZiB0aGUgVmlld1N0cmVhbSBpbnN0YW5jZSBhbG9uZyB3aXRoIGFsbCBvZiBpdHMgY2hhaW5lZCBWaWV3U3RyZWFtIGNoaWxkcmVuLlxuICAgKi9cbiAgZGlzcG9zZVZpZXdTdHJlYW0ocCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdFWFRJUlBBVEVSIFZTIG9uRGlzcG9zZSAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUpO1xuICAgIHRoaXMub25CZWZvcmVEaXNwb3NlKClcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ0VYVElSUEFURScpXG4gIH1cblxuICBvbkNoaWxkRGlzcG9zZShwKSB7XG4gIH1cblxuICBvblBhcmVudERpc3Bvc2luZyhwKSB7XG4gICAgLy8gdGhpcy51cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24odGhpcy5fc291cmNlJCk7XG4gICAgdGhpcy5vcGVuU3BpZ290KCdFWFRJUlBBVEUnKVxuICB9XG5cbiAgb25SZWFkeVRvR0MocCkge1xuICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBwLmZyb20kICE9PSB1bmRlZmluZWQgJiYgcC5mcm9tJCA9PT0gJ2ludGVybmFsJ1xuICAgIGlmIChpc0ludGVybmFsKSB7XG4gICAgICAvLyB0aGlzLm9wZW5TcGlnb3QoJ1ZTX0RFVFJJVFVTX0NPTExFQ1QnKTtcbiAgICB9XG4gICAgdGhpcy50cmFjZXIoJ29uUmVhZHlUb0dDJywgaXNJbnRlcm5hbCwgcClcbiAgfVxuXG4gIG9wZW5TcGlnb3QoYWN0aW9uLCBvYmogPSB7fSkge1xuICAgIGlmICh0aGlzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucHJvcHMuYWN0aW9uID0gYWN0aW9uXG4gICAgICBjb25zdCBkYXRhID0gbWVyZ2VSaWdodCh0aGlzLnByb3BzLCBvYmopXG4gICAgICAvLyBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMucHJvcHMsIG9iaik7XG5cbiAgICAgIHRoaXMuc2luayQubmV4dChPYmplY3QuZnJlZXplKGRhdGEpKVxuICAgIH1cbiAgfVxuXG4gIHNldEF0dGFjaERhdGEoYXR0YWNoVHlwZSwgcXVlcnkpIHtcbiAgICBjb25zdCBjaGVja1F1ZXJ5ID0gKCkgPT4ge1xuICAgICAgY29uc3QgcSA9IHRoaXMucHJvcHMuZWwucXVlcnlTZWxlY3RvcihxdWVyeSlcbiAgICAgIGNvbnN0IGlzRGV2TW9kZSA9IFZpZXdTdHJlYW0uaXNEZXZNb2RlKClcbiAgICAgIGlmIChpc0Rldk1vZGUgPT09IHRydWUgJiYgaXMoU3RyaW5nLCBxdWVyeSkgJiYgaXNOaWwocSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYXBwZW5kVmlldyBxdWVyeSBpbiAke3RoaXMucHJvcHMubmFtZX0sICcke3F1ZXJ5fScsIGFwcGVhcnMgdG8gbm90IGV4aXN0IWApXG4gICAgICB9XG4gICAgICByZXR1cm4gcVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBub2RlOiB0aGlzLnByb3BzLmVsLFxuICAgICAgdHlwZTogJ1ZpZXdTdHJlYW1PYnNlcnZhYmxlJyxcbiAgICAgIGF0dGFjaFR5cGUsXG4gICAgICBxdWVyeTogY2hlY2tRdWVyeShxdWVyeSlcbiAgICB9XG4gIH1cblxuICBnZXRQYXJlbnRFbHMoZWwsIG51bSkge1xuICAgIGNvbnN0IGdldEVsZW0gPSBlbCA9PiBlbC5wYXJlbnRFbGVtZW50XG4gICAgbGV0IGl0ZXIgPSAwXG4gICAgbGV0IHBhcmVudEVsID0gZWxcbiAgICB3aGlsZSAoaXRlciA8IG51bSkge1xuICAgICAgcGFyZW50RWwgPSBnZXRFbGVtKHBhcmVudEVsKVxuICAgICAgaXRlcisrXG4gICAgfVxuICAgIHJldHVybiBwYXJlbnRFbFxuICB9XG5cbiAgc2V0QXR0YWNoUGFyZW50RGF0YShhdHRhY2hUeXBlLCBxdWVyeSwgbGV2ZWwpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5ICE9PSAnJyA/IHF1ZXJ5IDogdW5kZWZpbmVkXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0UGFyZW50RWxzKHRoaXMucHJvcHMuZWwsIGxldmVsKVxuICAgIHJldHVybiB7XG4gICAgICBub2RlLFxuICAgICAgdHlwZTogJ1ZpZXdTdHJlYW1PYnNlcnZhYmxlJyxcbiAgICAgIGF0dGFjaFR5cGUsXG4gICAgICBxdWVyeTogbm9kZS5xdWVyeVNlbGVjdG9yKHF1ZXJ5KVxuICAgIH1cbiAgfVxuXG4gIG9uTWFwVmlld1NvdXJjZShwYXlsb2FkID0ge30pIHtcbiAgICB0aGlzLnByb3BzID0gbWVyZ2VSaWdodCh0aGlzLnByb3BzLCBwYXlsb2FkKVxuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09IEFUVEFDSCBTVFJFQU0gQU5EIERPTSBEQVRBIEFHR1JFR0FUT1JTPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZChjaGlsZFZpZXcsIGF0dGFjaERhdGEpIHtcbiAgICB0aGlzLmFkZENoaWxkU3RyZWFtKGNoaWxkVmlldy5zb3VyY2VTdHJlYW1zLnRvUGFyZW50JClcbiAgICBjaGlsZFZpZXcuYWRkUGFyZW50U3RyZWFtKHRoaXMuc291cmNlU3RyZWFtcy50b0NoaWxkJCwgYXR0YWNoRGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBlbmRzIGEgVmlld1N0cmVhbSBvYmplY3QgdG8gYW4gZXhpc3RpbmcgZG9tIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqIDwvYm9keT5cbiAgICpcbiAgICogbGV0IHZpZXdTdHJlYW0gPSBuZXcgVmlld1N0cmVhbSgnaDInLCAnSGVsbG8gV29ybGQnKTtcbiAgICogdmlld1N0cmVhbS5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICovXG4gIGFwcGVuZFRvRG9tKG5vZGUpIHtcbiAgICAvLyBjb25zb2xlLmxvZyhcImFwcGVuZCB0byBkb20gXCIsdGhpcy5wcm9wcy52c2lkLCB0aGlzLnByb3BzLmVsKTtcbiAgICBpZiAodGhpcy5wcm9wcy5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBWaWV3U3RyZWFtLCAke3RoaXMucHJvcHMubmFtZX0sIGhhcyBhbiBlbGVtZW50LCAke3RoaXMucHJvcHMuZWx9LCB0aGF0IGlzIGFscmVhZHkgcmVuZGVyZWQgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgYXBwZW5kZWRUb0RvbS4gVGhpcyBtYXkgY3JlYXRlIHVuc3VzdWFsIHNpZGUgZWZmZWN0cyFgKVxuICAgIH1cbiAgICB0aGlzLnJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCAnZG9tJywgJ2FwcGVuZENoaWxkJylcbiAgfVxuXG4gIGFwcGVuZFRvRG9tQWZ0ZXIobm9kZSkge1xuICAgIGlmICh0aGlzLnByb3BzLmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIFZpZXdTdHJlYW0sICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGFuIGVsZW1lbnQsICR7dGhpcy5wcm9wcy5lbH0sIHRoYXQgaXMgYWxyZWFkeSByZW5kZXJlZCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBhcHBlbmRlZFRvRG9tQWZ0ZXIuIFRoaXMgbWF5IGNyZWF0ZSB1bnN1c3VhbCBzaWRlIGVmZmVjdHMhYClcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdhZnRlcicpXG4gIH1cblxuICAvKipcbiAgICogUHJlcGVuZHMgdGhlIGN1cnJlbnQgVmlld1N0cmVhbSBvYmplY3QgdG8gYW4gZXhpc3RpbmcgZG9tIGVsZW1lbnQuXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdGhpcy5wcmVwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqL1xuXG4gIHByZXBlbmRUb0RvbShub2RlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgVmlld1N0cmVhbSwgJHt0aGlzLnByb3BzLm5hbWV9LCBoYXMgYW4gZWxlbWVudCwgJHt0aGlzLnByb3BzLmVsfSwgdGhhdCBpcyBhbHJlYWR5IHJlbmRlcmVkIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIHByZXBlbmRlZFRvRG9tLiBUaGlzIG1heSBjcmVhdGUgdW5zdXN1YWwgc2lkZSBlZmZlY3RzIWApXG4gICAgfVxuICAgIHRoaXMucmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsICdkb20nLCAncHJlcGVuZENoaWxkJylcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QuIDxicj5BZnRlciB0aGUgYXR0YWNobWVudCwgcnhqcyBvYnNlcnZhYmxlcyBhcmUgZXhjaGFuZ2VkIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgY2hpbGQgVmlld1N0cmVhbSBvYmplY3RzLjxicj48YnI+XG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdiB0aGUgVmlld1N0cmVhbSBjaGlsZCB0aGF0IGlzIHRvIGJlIGF0dGFjaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgYSBxdWVyeVNlbGVjdG9yIHdpdGhpbiB0aGlzIFZpZXdTdHJlYW0uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vICByZXR1cm5zXG4gICAqIDxib2R5PlxuICAgKiAgICA8bWFpbj5cbiAgICogICAgICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqICAgIDwvbWFpbj5cbiAgICogPC9ib2R5PlxuICAgKlxuICAgKlxuICAgKiBsZXQgcGFyZW50VmlldyA9IG5ldyBWaWV3U3RyZWFtKCdtYWluJyk7XG4gICAqIHBhcmVudFZpZXcuYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBwYXJlbnRWaWV3LmFwcGVuZFZpZXcoY2hpbGRWaWV3KVxuICAgKlxuICAgKiAqL1xuICBhcHBlbmRWaWV3KHYsIHF1ZXJ5KSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsIHRoaXMuc2V0QXR0YWNoRGF0YSgnYXBwZW5kQ2hpbGQnLCBxdWVyeSkpXG4gIH1cblxuICBhcHBlbmRWaWV3QWZ0ZXIodiwgcXVlcnkpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodiwgdGhpcy5zZXRBdHRhY2hEYXRhKCdhZnRlcicsIHF1ZXJ5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QgdG8gYSBwYXJlbnQgVmlld1N0cmVhbSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdiB0aGUgVmlld1N0cmVhbSBwYXJlbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICogQHBhcmFtIHtsZXZlbH0gdGhpcyBwYXJhbWV0ZXJzIGNhbiBhdHRhY2ggdGhlIHZpZXdTdHJlYW0ncyBkb20gZWxlbWVudCB1cCB0aGUgZG9tIHRyZWUgd2hpbGUgc3RpbGwgbWFpbnRhaW5pbmcgdGhlIHBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXAgb2YgdGhlIFZpZXdTdHJlYW0gb2JqZWN0cy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxtYWluPlxuICAgKiAgICAgICAgPGgyPkhlbGxvIFdvcmxkPC9oMj5cbiAgICogICAgPC9tYWluPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICogbGV0IGNoaWxkVmlldyA9IG5ldyBWaWV3U3RyZWFtKHt0YWdOYW1lOidoMicsIGRhdGE6J0hlbGxvIFdvcmxkJ307XG4gICAqIGNoaWxkVmlldy5hcHBlbmRUb1BhcmVudChwYXJlbnRWaWV3KVxuICAgKlxuICAgKiAqL1xuXG4gIGFwcGVuZFZpZXdUb1BhcmVudEVsKHYsIHF1ZXJ5LCBsZXZlbCA9IDEpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodixcbiAgICAgIHRoaXMuc2V0QXR0YWNoUGFyZW50RGF0YSgnYXBwZW5kQ2hpbGQnLCBxdWVyeSwgbGV2ZWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHByZXBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QgdG8gYSBwYXJlbnQgVmlld1N0cmVhbSBvYmplY3QuXG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnlcbiAgICogQHBhcmFtIHtudW1iZXJ9IGxldmVsXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7Vmlld1N0cmVhbX0gdiAtID0gdW5kZWZpbmVkOyB0aGUgVmlld1N0cmVhbSBwYXJlbnQuXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBxdWVyeSAtID0gdW5kZWZpbmVkOyBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IGxldmVsIC0gPSAxOyB0aGlzIHBhcmFtZXRlciBjYW4gYXR0YWNoIHRoZSB2aWV3U3RyZWFtJ3MgZG9tIGVsZW1lbnQgdXAgdGhlIGRvbSB0cmVlIHdoaWxlIHN0aWxsIG1haW50YWluaW5nIHRoZSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwIG9mIHRoZSBWaWV3U3RyZWFtIG9iamVjdHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5wcmVwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBjaGlsZFZpZXcucHJlcGVuZFZpZXdUb1BhcmVudEVsKHBhcmVudFZpZXcpXG4gICAqXG4gICAqICovXG4gIHByZXBlbmRWaWV3VG9QYXJlbnRFbCh2LCBxdWVyeSwgbGV2ZWwgPSAxKSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsXG4gICAgICB0aGlzLnNldEF0dGFjaFBhcmVudERhdGEoJ3ByZXBlbmRDaGlsZCcsIHF1ZXJ5LCBsZXZlbCkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICpcbiAgICogVGhpcyBtZXRob2QgcHJlcGVuZHMgYSBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdCB0byB0aGUgY3VycmVudCBWaWV3U3RyZWFtIG9iamVjdC4gPGJyPkFmdGVyIHRoZSBhdHRhY2htZW50LCByeGpzIG9ic2VydmFibGVzIGFyZSBleGNoYW5nZWQgYmV0d2VlbiB0aGUgcGFyZW50IGFuZCBjaGlsZCBWaWV3U3RyZWFtIG9iamVjdHMuPGJyPjxicj5cbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtfSB2IHRoZSBWaWV3U3RyZWFtIGNoaWxkIHRoYXQgaXMgdG8gYmUgYXR0YWNoZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWVyeSBhIHF1ZXJ5U2VsZWN0b3Igd2l0aGluIHRoaXMgVmlld1N0cmVhbS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gIHJldHVybnNcbiAgICogPGJvZHk+XG4gICAqICAgIDxtYWluPlxuICAgKiAgICAgICAgPGgyPkhlbGxvIFdvcmxkPC9oMj5cbiAgICogICAgPC9tYWluPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqIGxldCBwYXJlbnRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oJ21haW4nKTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRUb0RvbShkb2N1bWVudC5ib2R5KTtcbiAgICpcbiAgICogbGV0IGNoaWxkVmlldyA9IG5ldyBWaWV3U3RyZWFtKHt0YWdOYW1lOidoMicsIGRhdGE6J0hlbGxvIFdvcmxkJ307XG4gICAqIHBhcmVudFZpZXcucHJlcGVuZFZpZXcoY2hpbGRWaWV3KTtcbiAgICpcbiAgICogKi9cblxuICBwcmVwZW5kVmlldyh2LCBxdWVyeSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LCB0aGlzLnNldEF0dGFjaERhdGEoJ3ByZXBlbmRDaGlsZCcsIHF1ZXJ5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiAgQXBwZW5kcyBhIFZpZXdTdHJlYW0gb2JqZWN0IHRoYXQgYXJlIG5vdCByZW5kZXJlZCB0byB0aGUgI3NweW5lLW51bGwtdmlld3MgZGl2LlxuICAgKi9cbiAgYXBwZW5kVG9OdWxsKCkge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3B5bmUtbnVsbC12aWV3cycpXG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdhcHBlbmRDaGlsZCcpXG4gIH1cblxuICBvblZTUmVuZGVyZWQocGF5bG9hZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdWU19TUEFXTjogJywgdGhpcy5wcm9wcy5uYW1lLCBwYXlsb2FkKTtcbiAgICBpZiAocGF5bG9hZC5mcm9tJCA9PT0gJ2ludGVybmFsJykge1xuICAgICAgLy8gdGhpcy5wcm9wc1snZWwnXSA9IHBheWxvYWQuZWwuZWw7XG5cbiAgICAgIHRoaXMucG9zdFJlbmRlcigpXG4gICAgICAvLyB0aGlzLmJyb2FkY2FzdGVyID0gbmV3IFNweW5lLlZpZXdTdHJlYW1Ccm9hZGNhc3Rlcih0aGlzLnByb3BzLCB0aGlzLmJyb2FkY2FzdEV2ZW50cyk7XG4gICAgfVxuICB9XG5cbiAgcG9zdFJlbmRlcigpIHtcbiAgICBpZiAodGhpcy5fcG9zdFJlbmRlcmVkQ2FsbGVkID09PSB0cnVlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmJlZm9yZUFmdGVyUmVuZGVyKClcbiAgICB0aGlzLmFmdGVyUmVuZGVyKClcblxuICAgIHRoaXMub25SZW5kZXJlZCgpXG4gICAgY29uc3Qgc3RhcnRBbmltRnJhbWVBZnRlclJlbmRlcmVkID0gKCkgPT4gdGhpcy5vbkFuaW1GcmFtZUFmdGVyUmVuZGVyZWQoKVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShzdGFydEFuaW1GcmFtZUFmdGVyUmVuZGVyZWQpXG5cbiAgICBpZiAodGhpcy5pc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGV2ZW50c0FyciA9IHRoaXMuYnJvYWRjYXN0RXZlbnRzKClcbiAgICAgIGNvbnN0IGlzVmFsaWRBcnIgPSBWaWV3U3RyZWFtLmlzVmFsaWROZXN0ZWRBcnIoZXZlbnRzQXJyKVxuICAgICAgaWYgKGlzVmFsaWRBcnIgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGFycmF5IHJldHVybmVkIGZyb20gYnJvYWRjYXN0RXZlbnRzIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgJyR7SlNPTi5zdHJpbmdpZnkoZXZlbnRzQXJyKX0nLCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgcHJvcGVybHkgZm9ybWF0dGVkIWApXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbGl6ZUNoYW5uZWxzKClcbiAgICB0aGlzLnZpZXdzU3RyZWFtQnJvYWRjYXN0ZXIgPSBuZXcgVmlld1N0cmVhbUJyb2FkY2FzdGVyKHRoaXMucHJvcHMsIHRoaXMuYnJvYWRjYXN0RXZlbnRzLmJpbmQodGhpcykpXG4gICAgdGhpcy5hZnRlckJyb2FkY2FzdEV2ZW50cygpXG5cbiAgICB0aGlzLl9wb3N0UmVuZGVyZWRDYWxsZWQgPSB0cnVlXG4gIH1cblxuICBhZGRUcmFpdHModHJhaXRzKSB7XG4gICAgaWYgKHRyYWl0cy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnQXJyYXknKSB7XG4gICAgICB0cmFpdHMgPSBbdHJhaXRzXVxuICAgIH1cbiAgICBjb25zdCBhZGRUcmFpdCA9IChUcmFpdENsYXNzKSA9PiB7XG4gICAgICBuZXcgVHJhaXRDbGFzcyh0aGlzKVxuICAgIH1cblxuICAgIHRyYWl0cy5mb3JFYWNoKGFkZFRyYWl0KVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1FVEhPRFMgVE8gQkUgRVhURU5ERUQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgYWZ0ZXJCcm9hZGNhc3RFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBwdWxsQWN0aW9uc0Zyb21MaXN0ID0gKGFycikgPT4gYXJyWzBdXG4gICAgICBjb25zdCBuZXN0ZWRBY3Rpb25zQXJyID0gdGhpcy5hZGRBY3Rpb25MaXN0ZW5lcnMoKVxuXG4gICAgICBjb25zdCBhY3Rpb25zQXJyID0gbmVzdGVkQWN0aW9uc0Fyci5tYXAocHVsbEFjdGlvbnNGcm9tTGlzdClcblxuICAgICAgY29uc3QgaXNWYWxpZEFyciA9IFZpZXdTdHJlYW0uaXNWYWxpZE5lc3RlZEFycihuZXN0ZWRBY3Rpb25zQXJyKVxuXG4gICAgICBpZiAoaXNWYWxpZEFyciA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgYXJyYXkgcmV0dXJuZWQgZnJvbSBhZGRBY3Rpb25zTGlzdGVuZXJzIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgJyR7SlNPTi5zdHJpbmdpZnkobmVzdGVkQWN0aW9uc0Fycil9JywgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHByb3Blcmx5IGZvcm1hdHRlZCFgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY2hlY2tGb3JFeGlzdGluZ01ldGhvZCA9IChhcnIpID0+IHtcbiAgICAgICAgICBjb25zdCBtZXRob2QgPSBkZWZhdWx0VG8oJycsIGFyclsxXSlcbiAgICAgICAgICBjb25zdCBpc01ldGhvZCA9IGlzKEZ1bmN0aW9uLCB0aGlzW21ldGhvZF0pXG4gICAgICAgICAgaWYgKGlzTWV0aG9kID09PSBmYWxzZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbWV0aG9kIGluIGFkZEFjdGlvbkxpc3RlbmVycyBuZXN0ZWQgQXJyYXksICcke0pTT04uc3RyaW5naWZ5KGFycil9JywgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCBkb2VzIG5vdCBhcHBlYXIgdG8gZXhpc3QhYClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29tcG9zZShmb3JFYWNoKGNoZWNrRm9yRXhpc3RpbmdNZXRob2QpLCBkZWZhdWx0VG8oW10pKShuZXN0ZWRBY3Rpb25zQXJyKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWxheUZvclByb3h5Q2hhbm5lbFJlc2V0cyA9ICgpID0+IHtcbiAgICAgICAgaWYgKHBhdGgoWydwcm9wcycsICdhZGRlZENoYW5uZWxzJ10sIHRoaXMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBWaWV3U3RyZWFtLmNoZWNrSWZBY3Rpb25zQXJlUmVnaXN0ZXJlZC5iaW5kKHRoaXMpKHRoaXMucHJvcHMuYWRkZWRDaGFubmVscywgYWN0aW9uc0FycilcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRUaW1lb3V0KGRlbGF5Rm9yUHJveHlDaGFubmVsUmVzZXRzLCA1MDApXG4gICAgfVxuICB9XG5cbiAgc2V0RGF0YVZTSUQoKSB7XG4gICAgdGhpcy5wcm9wcy5lbC5kYXRhc2V0LnZzaWQgPSB0aGlzLnByb3BzLnZzaWQvLyBTdHJpbmcodGhpcy5wcm9wcy52c2lkKS5yZXBsYWNlKC9eKHZzaWQtKSguKikkLywgJyQyJyk7XG4gIH1cblxuICBiZWZvcmVBZnRlclJlbmRlcigpIHtcbiAgICAvKiAgICBsZXQgZG0yID0gZnVuY3Rpb24oZWwpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc3RyID0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRG9tSXRlbVNlbGVjdG9ycyhlbCwgc3RyKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9OyAqL1xuXG4gICAgLy8gdGhpcy5wcm9wcy5lbCQgPSBkbTIodGhpcy5wcm9wcy5lbCk7XG4gICAgdGhpcy5zZXREYXRhVlNJRCgpXG4gICAgdGhpcy5wcm9wcy5lbCQgPSBWaWV3U3RyZWFtU2VsZWN0b3IodGhpcy5wcm9wcy5lbClcbiAgICAvLyBjb25zb2xlLmxvZygnRUwgSVMgJywgdGhpcy5wcm9wcy5lbCQuZWxBcnIpO1xuICAgIC8vIHdpbmRvdy50aGVFbCQgPSB0aGlzLnByb3BzLmVsJDtcbiAgfVxuXG4gIC8vIFRISVMgSVMgQU4gRVZFTlQgSE9MREVSIE1FVEhPRCBCRUNBVVNFIFNFTkRJTkcgRE9XTlNUUkVBTSBSRVFVSVJFIFRIRSBQQVJFTlQgVE8gSEFWRSBBIE1FVEhPRFxuICBkb3duU3RyZWFtKCkge1xuXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqXG4gICAqL1xuXG4gIG9uUmVuZGVyZWQoKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIHRvIGFkZCBhbmltYXRpb24gY2xhc3NlcyB0byBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVuZGVyaW5nLlxuICAgKlxuICAgKi9cblxuICBvbkFuaW1GcmFtZUFmdGVyUmVuZGVyZWQoKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogKERlcHJlY2F0ZWQuIFVzZSBvblJlbmRlcmVkKS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIGVsZW1lbnQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAqXG4gICAqL1xuXG4gIGFmdGVyUmVuZGVyKCkge1xuICB9XG5cbiAgYnJvYWRjYXN0RXZlbnRzKCkge1xuICAgIC8vIEFERCBCVVRUT04gRVZFTlRTIEFTIE5FU1RFRCBBUlJBWVNcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IGNvbm5lY3QgdG8gYW4gaW5zdGFuY2Ugb2YgcmVnaXN0ZXJlZCBjaGFubmVscywgc3VjaCBhcyAnRE9NJywgJ1VJJywgYW5kICdST1VURScgY2hhbm5lbHMuXG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGxldCB1aUNoYW5uZWwgPSB0aGlzLmdldENoYW5uZWwoJ1VJJyk7XG4gICAqXG4gICAqIHVpQ2hhbm5lbFxuICAgKiAgICAuZmlsdGVyKChwKSA9PiBwLmRhdGEuaWQ9PT0nI215LWJ1dHRvbicpXG4gICAqICAgIC5zdWJzY3JpYmUoKHApID0+IGNvbnNvbGUubG9nKCdteSBidXR0b24gd2FzIGNsaWNrZWQgJywgcCkpO1xuICAgKlxuICAgKiAqL1xuXG4gIGdldENoYW5uZWwoY2hhbm5lbCkge1xuICAgIGNvbnN0IGlzVmFsaWRDaGFubmVsID0gYyA9PiByZWdpc3RlcmVkU3RyZWFtTmFtZXMoKS5pbmNsdWRlcyhjKVxuICAgIGNvbnN0IGVycm9yID0gYyA9PiBjb25zb2xlLndhcm4oXG4gICAgICAgIGBjaGFubmVsIG5hbWUgJHtjfSBpcyBub3Qgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbU5hbWVzfWApXG4gICAgY29uc3Qgc3RhcnRTdWJzY3JpYmUgPSAoYykgPT4ge1xuICAgICAgY29uc3Qgb2JzJCA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcC5nZXRTdHJlYW0oYykub2JzZXJ2ZXJcblxuICAgICAgcmV0dXJuIG9icyQucGlwZSh0YWtlV2hpbGUocCA9PiB0aGlzLmRlbGV0ZWQgIT09IHRydWUpKVxuICAgIH0vLyBnZXRHbG9iYWxQYXJhbSgnc3RyZWFtc0NvbnRyb2xsZXInKS5nZXRTdHJlYW0oYykub2JzZXJ2ZXI7XG5cbiAgICBjb25zdCBmbiA9IGlmRWxzZShpc1ZhbGlkQ2hhbm5lbCwgc3RhcnRTdWJzY3JpYmUsIGVycm9yKVxuXG4gICAgcmV0dXJuIGZuKGNoYW5uZWwpXG4gIH1cblxuICAvKipcbiAgICogQ0hFQ0tTIFRPIFNFRSBJRiBDSEFOTkVMUyBIQVZFIEJFRU4gQURERUQgVE8gcHJvcHMuY2hhbm5lbHMgb2JqZWN0O1xuICAgKi9cbiAgaW5pdGlhbGl6ZUNoYW5uZWxzKCkge1xuICAgIGNvbnN0IGFkZENoYW5uZWwgPSAoY2hhbm5lbCkgPT4ge1xuICAgICAgY29uc3QgW2NoYW5uZWxOYW1lLCBza2lwRmlyc3QgPSBmYWxzZV0gPSBBcnJheS5pc0FycmF5KGNoYW5uZWwpID8gY2hhbm5lbCA6IFtjaGFubmVsXVxuICAgICAgdGhpcz8uYWRkQ2hhbm5lbChjaGFubmVsTmFtZSwgc2tpcEZpcnN0KVxuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzPy5wcm9wcz8uY2hhbm5lbHMpKSB7XG4gICAgICB0aGlzPy5wcm9wcz8uY2hhbm5lbHM/LmZvckVhY2goYWRkQ2hhbm5lbClcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpcz8ucHJvcHM/LmNoYW5uZWwpKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3Byb3BzLmNoYW5uZWwgaXMgbm90IGEgVmlld1N0cmVhbSBwcm9wZXJ0eS4gRG8geW91IG1lYW4gcHJvcHMuY2hhbm5lbHM/JylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogUHJlZmVycmVkIG1ldGhvZCB0byBjb25uZWN0IHRvIGluc3RhbmNlcyBvZiByZWdpc3RlcmVkIGNoYW5uZWxzLCBzdWNoIGFzICdET00nLCAnVUknLCBhbmQgJ1JPVVRFJyBjaGFubmVscy5cbiAgICpcbiAgICogQWRkIENoYW5uZWwgd2lsbCBhdXRvbWF0aWNhbGx5IHVuc3Vic2NyaWJlIHRvIHRoZSBjaGFubmVsLCB3aGVyZWFzIHRoZSBnZXRDaGFubmVsIG1ldGhvZCByZXF1aXJlcyB0aGUgZGV2ZWxvcGVyIHRvIG1hbnVhbGx5IHVuc3Vic2NyaWJlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBuYW1lIG9mIHRoZSByZWdpc3RlcmVkIENoYW5uZWwgdGhhdCB3YXMgYWRkZWQgdG8gdGhlIENoYW5uZWxzIENvbnRyb2xsZXIuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gYm9vbCBmYWxzZSwgYWRkIHRydWUgaWYgdGhlIFZpZXcgc2hvdWxkIHdhaXQgZm9yIHRoaXMgY2hhbm5lbCB0byB1bnN1YnNjcmliZSBiZWZvcmUgcmVtb3ZpbmcgaXRzZWxmLlxuICAgKiBAcGFyYW0ge3NlbmREb3duU3RyZWFtfSBib29sIFRoZSBkaXJlY3Rpb24gd2hlcmUgdGhlIHN0cmVhbSBpcyBhbGxvd2VkIHRvIHRyYXZlbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogbGV0IHJvdXRlQ2hhbm5lbCA9IHRoaXMuYWRkQ2hhbm5lbCgnUk9VVEUnKTtcbiAgICpcbiAgICogICAgICBhZGRBY3Rpb25MaXN0ZW5lcnMoKSB7XG4gICAqICAgICAgICAgICByZXR1cm4gW1xuICAgKiAgICAgICAgICAgICBbJ0NIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UJywgJ29uTWFwUm91dGVFdmVudCddXG4gICAqICAgICAgICAgICBdXG4gICAqICAgICAgIH1cbiAgICpcbiAgICogICAgICAgb25NYXBSb3V0ZUV2ZW50KHApIHtcbiAgICogICAgICAgICAgY29uc29sZS5sb2coJ3RoZSByb3V0ZSB2YWx1ZSBpcyAnLCBwKTtcbiAgICogICAgICAgfVxuICAgKlxuICAgKlxuICAgKiAqL1xuXG4gIGFkZENoYW5uZWwoY2hhbm5lbE5hbWUsIHNraXBGaXJzdCA9IGZhbHNlLCBzZW5kRG93blN0cmVhbSA9IGZhbHNlLCBib29sID0gZmFsc2UpIHtcbiAgICBjb25zdCBkaXJlY3Rpb25BcnIgPSBzZW5kRG93blN0cmVhbSA9PT0gdHJ1ZSA/IHRoaXMuJGRpcnMuQ0kgOiB0aGlzLiRkaXJzLklcbiAgICBjb25zdCBtYXBEaXJlY3Rpb24gPSBwID0+IHtcbiAgICAgIC8vIGV0IHAyID0gZGVmYXVsdFRvKHt9LCBjbG9uZShwKSk7XG4gICAgICBjb25zdCBwbCA9IHAvLyB8fCB7fTtcbiAgICAgIHBsLiRkaXIgPSBkaXJlY3Rpb25BcnJcbiAgICAgIHJldHVybiBwbFxuICAgICAgLy8gcmV0dXJuIGRlZXBNZXJnZShkaXJPYmosIHAyKTtcbiAgICAgIC8vIE9iamVjdC5hc3NpZ24oeyRkaXI6IGRpcmVjdGlvbkFycn0sIGNsb25lKHApKVxuICAgIH1cbiAgICBpZiAodGhpcz8ucHJvcHM/LmFkZGVkQ2hhbm5lbHM/LmluY2x1ZGVzKGNoYW5uZWxOYW1lKSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gQ0hFQ0tTIElGIENIQU5ORUwgSEFTIEFMUkVBRFkgQkVFTiBBRERFRFxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGlzTG9jYWxFdmVudENoZWNrID0gcGF0aChbJ3NyY0VsZW1lbnQnLCAnaXNMb2NhbEV2ZW50J10pXG4gICAgY29uc3QgY2lkQ2hlY2sgPSBwYXRoKFsnc3JjRWxlbWVudCcsICd2c2lkJ10pXG4gICAgY29uc3QgY2lkTWF0Y2hlcyA9IHAgPT4ge1xuICAgICAgY29uc3QgdnNpZCA9IGNpZENoZWNrKHApXG4gICAgICBjb25zdCBpc0xvY2FsRXZlbnQgPSBpc0xvY2FsRXZlbnRDaGVjayhwKVxuICAgICAgY29uc3QgZmlsdGVyRXZlbnQgPSBpc0xvY2FsRXZlbnQgIT09IHRydWUgfHwgdnNpZCA9PT0gdGhpcy5wcm9wcy52c2lkXG4gICAgICAvLyBjb25zb2xlLmxvZyhcImNoZWNrcyBcIix2c2lkLHRoaXMucHJvcHMudnNpZCwgaXNMb2NhbEV2ZW50LGZpbHRlckV2ZW50KTtcbiAgICAgIHJldHVybiBmaWx0ZXJFdmVudFxuICAgIH1cblxuICAgIGNvbnN0IHBpcGVBcnIgPSBbbWFwKG1hcERpcmVjdGlvbiksIGZpbHRlcihjaWRNYXRjaGVzKV1cbiAgICBpZiAoc2tpcEZpcnN0ID09PSB0cnVlKSB7XG4gICAgICBwaXBlQXJyLnVuc2hpZnQoc2tpcCgxKSlcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsJCA9IHRoaXMuZ2V0Q2hhbm5lbChjaGFubmVsTmFtZSkucGlwZSguLi5waXBlQXJyKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKGNoYW5uZWwkLCBmYWxzZSlcbiAgICB0aGlzLnByb3BzLmFkZGVkQ2hhbm5lbHMucHVzaChjaGFubmVsTmFtZSlcbiAgfVxuXG4gIGNoZWNrSWZDaGFubmVsRXhpc3RzKGNoYW5uZWxOYW1lKSB7XG4gICAgY29uc3QgY2hhbm5lbEV4aXN0cyA9IFNweW5lQXBwUHJvcGVydGllcy5jaGFubmVsc01hcC50ZXN0U3RyZWFtKGNoYW5uZWxOYW1lKVxuICAgIGlmIChjaGFubmVsRXhpc3RzICE9PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNQWU5FIFdBUk5JTkc6IFRoZSBDaGFubmVsUGF5bG9hZCBmcm9tICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGJlZW4gc2VudCB0byBhIGNoYW5uZWwsICR7Y2hhbm5lbE5hbWV9LCB0aGF0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIWApXG4gICAgfVxuICAgIHJldHVybiBjaGFubmVsRXhpc3RzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb25cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNoYW5uZWxOYW1lIC0gPSB1bmRlZmluZWQ7IFRoZSBuYW1lIG9mIHRoZSByZWdpc3RlcmVkIENoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwYXlsb2FkIC0gPSB7fTsgVGhlIG1haW4gZGF0YSB0byBzZW5kIHRvIHRoZSBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIC0gPSBcIlZJRVdTVFJFQU1fRVZFTlRcIjsgVGhlIGFjdGlvbiBzZW50IHRvIHRoZSBjaGFubmVsLlxuICAgKiBAZGVzY1xuICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgdmVyc2F0aWxlIGFuZCBjb25zaXN0ZW50IG1ldGhvZCB0byBjb21tdW5pY2F0ZSB3aXRoIGFsbCBjaGFubmVscy5cbiAgICpcbiAgICpcbiAgICovXG5cbiAgc2VuZEluZm9Ub0NoYW5uZWwoY2hhbm5lbE5hbWUsIHBsID0ge30sIGFjdGlvbikge1xuICAgIGNvbnN0IHBheWxvYWQgPSBwbFxuXG4gICAgY29uc3QgZGVmYXVsdFRvQWN0aW9uID0gZGVmYXVsdFRvKCdWSUVXU1RSRUFNX0VWRU5UJylcbiAgICBjb25zdCBjaGFubmVsRGVmYXVsdEFjdGlvbkhhc2ggPSB7XG4gICAgICBDSEFOTkVMX1JPVVRFOiAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnXG4gICAgfVxuICAgIGNvbnN0IGdldEFjdGlvbkZuID0gY29tcG9zZShkZWZhdWx0VG9BY3Rpb24sIHByb3AoY2hhbm5lbE5hbWUpKVxuXG4gICAgYWN0aW9uID0gYWN0aW9uIHx8IGdldEFjdGlvbkZuKGNoYW5uZWxEZWZhdWx0QWN0aW9uSGFzaClcblxuICAgIGNvbnN0IGRhdGEgPSB7IHBheWxvYWQsIGFjdGlvbiB9XG5cbiAgICB0cnkge1xuICAgICAgZGF0YS5zcmNFbGVtZW50ID0gY29tcG9zZShwaWNrKFsnaWQnLCAndnNpZCcsICdjbGFzcycsICd0YWdOYW1lJ10pLCBwcm9wKCdwcm9wcycpKSh0aGlzKVxuICAgICAgaWYgKHRoaXMuY2hlY2tJZkNoYW5uZWxFeGlzdHMoY2hhbm5lbE5hbWUpID09PSB0cnVlKSB7XG4gICAgICAgIGlmICgvQ0hBTk5FTF9MSUZFQ1lDTEUvLnRlc3QoYWN0aW9uKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkYXRhLCB7XG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgIGdldDogKCkgPT4gc2FmZUNsb25lKHBsKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb2JzJCA9IG9mKGRhdGEpXG4gICAgICAgIHJldHVybiBuZXcgVmlld1N0cmVhbVBheWxvYWQoY2hhbm5lbE5hbWUsIG9icyQsIGRhdGEpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdTUFlORSBXQVJOSU5HICcsIGUpXG4gICAgfVxuICB9XG5cbiAgdHJhY2VyKC4uLmFyZ3MpIHtcbiAgICB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2QoLi4uYXJncylcbiAgfVxuXG4gIHNlbmRMaWZlY3ljbGVNZXRob2RJbmFjdGl2ZSgpIHtcblxuICB9XG5cbiAgc2VuZExpZmVjeWNsZU1ldGhvZEFjdGl2ZSh2YWwsIHApIHtcbiAgICBjb25zdCBpc1JlbmRlcmVkID0gd2hlcmUoe1xuICAgICAgZnJvbSQ6IGVxdWFscygnaW50ZXJuYWwnKSxcbiAgICAgIGFjdGlvbjogZXF1YWxzKCdWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQnKVxuICAgIH0sIHApXG4gICAgY29uc3QgaXNEaXNwb3NlZCA9IHAgPT09ICdWU19ERVRSSVRVU19DT0xMRUNUJ1xuICAgIGlmIChpc1JlbmRlcmVkID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnNlbmRJbmZvVG9DaGFubmVsKCdDSEFOTkVMX0xJRkVDWUNMRScsIHsgYWN0aW9uOidDSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVCcgfSwgJ0NIQU5ORUxfTElGRUNZQ0xFX1JFTkRFUkVEX0VWRU5UJylcbiAgICB9IGVsc2UgaWYgKGlzRGlzcG9zZWQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoJ0NIQU5ORUxfTElGRUNZQ0xFJywgeyBhY3Rpb246J0NIQU5ORUxfTElGRUNZQ0xFX0RJU1BPU0VEX0VWRU5UJyB9LCAnQ0hBTk5FTF9MSUZFQ1lDTEVfRElTUE9TRURfRVZFTlQnKVxuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUFjdGlvbkZpbHRlcihzZWxlY3RvcnMsIGRhdGEpIHtcbiAgICByZXR1cm4gbmV3IENoYW5uZWxQYXlsb2FkRmlsdGVyKHNlbGVjdG9ycywgZGF0YSlcbiAgfVxuXG4gIGlzTG9jYWxFdmVudChjaGFubmVsUGF5bG9hZEl0ZW0pIHtcbiAgICBjb25zdCBpdGVtRWwgPSBwYXRoKFsnc3JjRWxlbWVudCcsICdlbCddLCBjaGFubmVsUGF5bG9hZEl0ZW0pXG4gICAgY29uc3QgdGhpc0VsID0gcGF0aChbJ3Byb3BzJywgJ2VsJ10sIHRoaXMpXG4gICAgLy8gY29uc29sZS5sb2coJ3RoaXMgZWwgaXMgJyx7dGhpc0VsLCBpdGVtRWx9KTtcbiAgICByZXR1cm4gVmlld1N0cmVhbS5lbElzRG9tRWxlbWVudCh0aGlzRWwpICYmIFZpZXdTdHJlYW0uZWxJc0RvbUVsZW1lbnQoaXRlbUVsKSAmJiB0aGlzRWwuY29udGFpbnMoaXRlbUVsKVxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIENPUkUgTUlYSU5TXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCBjb3JlTWl4aW5zID0gYmFzZUNvcmVNaXhpbnMoKVxuICAgIHRoaXMuY3JlYXRlSWQgPSBjb3JlTWl4aW5zLmNyZWF0ZUlkXG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNjM2X187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18xMzFfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2OF9fOyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTMxX187IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJyZXF1aXJlIiwiZGVmaW5lIiwiYW1kIiwic2VsZiIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzk2OF9fIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTMxX18iLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX182MzZfXyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzUzMV9fIiwiQ2hhbm5lbEZldGNoIiwiY29uc3RydWN0b3IiLCJuYW1lIiwicHJvcHMiLCJ2YWxpZGF0ZU1hcE1ldGhvZCIsInVuZGVmaW5lZCIsIm1hcCIsIm1hcEZuIiwiZXh0ZW5kZWRBY3Rpb25zQXJyIiwic2VuZENhY2hlZFBheWxvYWQiLCJzdXBlciIsInRlc3RNb2RlIiwiaXNVbmRlZmluZWRPcldyb25nVHlwZSIsImVpdGhlciIsImlzTmlsIiwidmFsIiwiaXNVbmRlZmluZWQiLCJhbGwiLCJpc05vdFVuZGVmaW5lZEFuZElzTm90RW1wdHkiLCJhbGxQYXNzIiwiYXJyIiwibGVuZ3RoIiwiY29tcG9zZSIsInZhbHVlcyIsInBpY2siLCJjb25zb2xlIiwid2FybiIsIm9uUmVnaXN0ZXJlZCIsInRoaXMiLCJwYXVzZSIsInN0YXJ0RmV0Y2giLCJhZGRSZWdpc3RlcmVkQWN0aW9ucyIsImV4dGVuZGVkQXJyIiwiZGVmYXVsdFRvIiwicGF0aCIsImNvbmNhdCIsIm9wdGlvbnMiLCJzdWJzY3JpYmVyIiwib25GZXRjaFJldHVybmVkIiwiYmluZCIsImZldGNoUHJvcHMiLCJjb25zb2xpZGF0ZUFsbEZldGNoUHJvcHMiLCJvbkZldGNoVXBkYXRlIiwiZXZ0IiwicHJvcHNPcHRpb25zIiwiZ2V0UHJvcHNGb3JGZXRjaCIsInN0cmVhbUl0ZW0iLCJjcmVhdGVDaGFubmVsUGF5bG9hZEl0ZW0iLCJwYXlsb2FkIiwiYWN0aW9uIiwidXJsIiwic3JjRWxlbWVudCIsInNlbmRDaGFubmVsUGF5bG9hZCIsImRhdGFPYmoiLCJmaWx0ZXJPdXRVbmRlZmluZWQiLCJyZWplY3QiLCJvMSIsIm8yIiwibWVyZ2VEZWVwUmlnaHQiLCJvYnNlcnZlciIsIm9ic2VydmVyJCIsIkNoYW5uZWxQYXlsb2FkIiwiY2hhbm5lbE5hbWUiLCJldmVudCIsInRpbWVMYWJlbCIsImNoYW5uZWwiLCJ0aW1lIiwiY2hhbm5lbFBheWxvYWRJdGVtT2JqIiwiZnJvemVuUGF5bG9hZCIsImRlZXBGcmVlemUiLCJkZWJ1ZyIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInBheWxvYWRTdHIiLCJKU09OIiwic3RyaW5naWZ5IiwiY2hhbm5lbEFjdGlvbnNBcnIiLCJnZXRDaGFubmVsQWN0aW9ucyIsInZhbGlkYXRlQWN0aW9uIiwiY2xvbmUiLCJtZXJnZUFsbCIsImNoYW5uZWxQYXlsb2FkSXRlbU9ialByb3BzIiwiJGRpciIsImdldCIsIl9kaXIiLCJzZXQiLCJsb2NhdGlvbiIsImdldExvY2F0aW9uRGF0YSIsImRlZmluZVByb3BlcnRpZXMiLCJ0aW1lRW5kIiwiaXNJbkFyciIsImluY2x1ZGVzIiwiaW5pdGlhbGl6ZWQiLCJwaWNrQWxsIiwid2luZG93IiwiZ2V0U3RyZWFtSXRlbSIsImRlZXBDbG9uZSIsIm8iLCJpc0FyciIsImlzIiwiQXJyYXkiLCJpc09iaiIsIm9iIiwiZnJvbVBhaXJzIiwidG9QYWlycyIsImVsSXNEb21FbGVtZW50IiwibHRlIiwicHJvcCIsImZyZWV6ZSIsImdldE93blByb3BlcnR5TmFtZXMiLCJmb3JFYWNoIiwiaXNGcm96ZW4iLCJlIiwiZ2V0TW91c2VFdmVudEtleXMiLCJDaGFubmVsUHJveHkiLCJpc1Byb3h5Iiwic3ViamVjdCQiLCJTdWJqZWN0IiwicmVwbGF5U3ViJCIsIlJlcGxheVN1YmplY3QiLCJtZXJnZSIsImNoZWNrSWZDaGFubmVsSXNTdGlsbFByb3h5IiwiZ2V0TWVyZ2VkU3ViamVjdCIsInBlcmlzdERhdGEiLCJsaXN0UmVnaXN0ZXJlZENoYW5uZWxzIiwicmVwbGF5U3ViamVjdCIsInN1YmplY3QiLCJDaGFubmVsIiwiQ0hBTk5FTF9OQU1FIiwiY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmoiLCJkZWZhdWx0QWN0aW9ucyIsImRhdGEiLCJpc1JlZ2lzdGVyZWQiLCJkZWZhdWx0Q2FjaGVkUGF5bG9hZEJvb2wiLCJyZXBsYXkiLCJzZW5kUGF5bG9hZFRvUm91dGVDaGFubmVsIiwiY3JlYXRlQ2hhbm5lbEFjdGlvbk1ldGhvZHMiLCJzdHJlYW1zQ29udHJvbGxlciIsImNoYW5uZWxzTWFwIiwiZ2V0TWFpbk9ic2VydmVyIiwiY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUiLCJkaXNwYXRjaGVyU3RyZWFtJCIsImdldFN0cmVhbSIsInBheWxvYWRQcmVkQnlDaGFubmVsTmFtZSIsInByb3BFcSIsInBpcGUiLCJmaWx0ZXIiLCJzdWJzY3JpYmUiLCJvblJlY2VpdmVkT2JzZXJ2YWJsZSIsInRlc3RTdHJlYW0iLCJnZXRQcm94eVN1YmplY3QiLCJvbkNoYW5uZWxJbml0aWFsaXplZCIsImtleXMiLCJjaGFubmVsQWN0aW9ucyIsImNoZWNrRm9yVHJhaXRzIiwidHJhaXRzIiwiVHJhaXRDbGFzcyIsImFkZFRyYWl0cyIsImluaXRpYWxpemVTdHJlYW0iLCJhY3Rpb25zT2JqIiwiYWN0aW9uc09iaklzRW1wdHkiLCJpc0VtcHR5IiwiZGF0YUlzQWRkZWQiLCJhY3Rpb25TdHIiLCJzZXREZWZhdWx0QWN0aW9uc09iaiIsInNldFRyYWNlIiwiYm9vbCIsImdldEFjdGlvblZhbCIsImlmRWxzZSIsIlN0cmluZyIsImlkZW50aXR5IiwiaGVhZCIsIm1haW5BcnIiLCJvYmoiLCJjaGFpbiIsInN0ciIsIm9iak9mIiwiZGVsYXlDaGVja0lmVHJhaXRNZXRob2RIYXNCZWVuQWRkZWQiLCJtZXRob2RTdHIiLCJzZXRUaW1lb3V0IiwiZ2V0QXJyTWV0aG9kIiwiYWx3YXlzIiwidmlldyIsImxlbnNJbmRleCIsImNoYW5uZWxBY3Rpb25NZXRob2RzIiwib25JbmNvbWluZ09ic2VydmFibGUiLCJnZXRBY3Rpb25NZXRob2RGb3JPYnNlcnZhYmxlIiwidW5wYWNrZWQiLCJkZWZhdWx0Rm4iLCJvblZpZXdTdHJlYW1JbmZvIiwibWV0aG9kVmFsIiwiZm4iLCJlcXNOYW1lIiwiZXF1YWxzIiwib2JzVmFsIiwibWVyZ2VQcm9wcyIsImQiLCJvYnNlcnZhYmxlIiwib25TdWNjZXNzIiwib25FcnJvciIsIm9icyIsIm9icyQiLCJjaGFubmVsUGF5bG9hZEl0ZW0iLCJuZXh0IiwiZ2V0Q2hhbm5lbCIsInBheWxvYWRGaWx0ZXIiLCJjIiwic291cmNlIiwibWVyZ2VDaGFubmVscyIsImNoYW5uZWxzQXJyIiwiZW1pdE9uY2UiLCJjaGFubmVsT2JzZXJ2YWJsZXMiLCJpdGVtIiwiY2hhbiQiLCJ0YWtlIiwiY29tYmluZWQkIiwiZm9ya0pvaW4iLCJFTVBUWSIsImZpcnN0JCIsInJlc3QkIiwiY29tYmluZUxhdGVzdFdpdGgiLCJyZXN1bHRzQXJyIiwiaWR4IiwiaXRlcktleSIsImNoZWNrRm9yTm90VHJhY2tGbGFnIiwiZG9Ob3RUcmFjayIsImRvTm90VHJhY2tDaGFubmVsIiwicmVnaXN0ZXJlZFN0cmVhbU5hbWVzIiwicmVnaXN0ZXJlZFN0ZXBzIiwicmVnaXN0ZXJlZExpZmVTdHJlYW1UeXBlcyIsInJlZ2lzdGVyZWRTdHJlYW1UeXBlcyIsInJlZ2lzdGVyZWRBY3Rpb25zIiwiYmFzZVZhbGlkYXRpb25zIiwidmlld0luZm9WYWxpZGF0aW9ucyIsInVpVmFsaWRhdGlvbnMiLCJsaWZlc3RyZWFtVmFsaWRhdGlvbnMiLCJzdGVwVmFsaWRhdGlvbnMiLCJzdGVwRGlzcG9zZVZhbGlkYXRpb25zIiwic3RlcFVwZGF0ZVZhbGlkYXRpb25zIiwicm91dGVWYWxpZGF0aW9ucyIsIlN0cmVhbXNDb25maWciLCJPYnNlcnZhYmxlIiwiZXJyb3IiLCJwcmVkaWNhdGUiLCJsaWZlU3RyZWFtVmFsaWRhdGlvbnMiLCJTVEVQIiwidHlwZSIsInZpZXdJZCIsImRpc3Bvc2VJdGVtcyIsInN0cmVhbVZhbGlkYXRpb25zIiwiZ2V0UnhUeXBlIiwic3RyZWFtcyIsImluaXQiLCJzdHJ1Y3R1cmUiLCJ2YWxpZGF0aW9ucyIsIl9tYXAiLCJNYXAiLCJDaGFubmVsc01hcCIsImFkZE1peGlucyIsImdldENoYW5uZWxzTGlzdCIsImZyb20iLCJrIiwidiIsImtleSIsInNob3dPbmx5UHJveGllcyIsInByb3h5TWFwIiwicmVqZWN0UHJveHlGbiIsImZpbHRlclByb3h5Rm4iLCJyZW1vdmVkUHJveHlBcnIiLCJwbHVjayIsImxpc3RQcm94eUNoYW5uZWxzIiwiY2hlY2tGb3JNaXNzaW5nQ2hhbm5lbHMiLCJmaWx0ZXJQcm94eUFyciIsImZpbHRlclByZWZpeFdhcm5pbmciLCJqb2luIiwiY3JlYXRlTWFpblN0cmVhbXMiLCJyb3V0ZVN0cmVhbSIsInVpU3RyZWFtIiwiZG9tU3RyZWFtIiwidmlld1N0cmVhbUxpZmVjeWNsZSIsImFpU3RyZWFtIiwiYWRkS2V5RXZlbnQiLCJyZWdpc3RlclN0cmVhbSIsImhhcyIsInBhdGhFcSIsImlzUmVwbGF5U3ViamVjdCIsInN1YmplY3RUeXBlIiwiU3B5bmVDaGFubmVsQUkiLCJvblNlbmRFdmVudCIsIlNweW5lQ2hhbm5lbExpZmVjeWNsZSIsIlNweW5lQ2hhbm5lbFJvdXRlIiwicm91dGVDb25maWdKc29uIiwiZ2V0Um91dGVDb25maWciLCJiaW5kU3RhdGljTWV0aG9kcyIsIm5hdlRvU3RyZWFtJCIsImluZm8iLCJvbk1hcE5leHQiLCJjb21wYXJlUm91dGVLZXl3b3JkcyIsImNoZWNrQ29uZmlnRm9ySGFzaCIsImNvbmZpZyIsImNoYW5uZWxzIiwiUk9VVEUiLCJpc0hhc2giLCJpbml0U3RyZWFtIiwidXBkYXRlUm91dGVDb25maWciLCJuZXdSb3V0ZXNPYmoiLCJtZXJnZVJpZ2h0IiwiY29uZm9ybVJvdXRlQ29uZmlnIiwicm91dGVDb25maWciLCJuYXZMaW5rcyIsInJvdXRlRGF0YXNldHNBcnIiLCJiaW5kU3RhdGljTWV0aG9kc1dpdGhDb25maWdEYXRhIiwic3B5bmVDb25maWciLCJmbGF0dGVuQ29uZmlnT2JqZWN0Iiwicm91dGVzIiwicGFyYW1zQXJyIiwiZmlyc3RMb2FkU3RyZWFtJCIsIm9uSW5jb21pbmdEb21FdmVudCIsImNyZWF0ZVBvcFN0YXRlU3RyZWFtIiwiZmlyc3RMb2FkZWQiLCJyZW1vdmVTU0lEIiwicm91dGVMZW5zIiwibGVuc1Byb3AiLCJvdmVyIiwib21pdCIsIm9taXRTU0lEIiwiYWN0biIsIkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UIiwiZXZlbnRDb3VudCIsImlzSGlzdG9yeUNvdW50IiwiTnVtYmVyIiwiZ2V0RGF0YUZyb21TdHJpbmciLCJyb3V0ZUNvdW50IiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImVudW1lcmFibGUiLCJrZXl3b3JkQXJycyIsImNvbXBhcmUiLCJyb3V0ZURhdGEiLCJwYXRocyIsImNoZWNrRm9yUm91dGVQYXJhbXNPdmVycmlkZXMiLCJjaGVja0ZvckV2ZW50TWV0aG9kcyIsIm1ldGhvZHNBcnIiLCJ0ZXN0IiwiZ2V0TWV0aG9kcyIsIm1ldGhvZFVwZGF0ZSIsIm1hdGNoIiwicDEiLCJwMiIsInAzIiwicDQiLCJ0b0xvd2VyQ2FzZSIsIm1ldGhvZFN0clJlcGxhY2UiLCJyZXBsYWNlIiwicnVuTWV0aG9kIiwibSIsImNoZWNrRm9yRW5kUm91dGUiLCJwbCIsImRlYnVnQm9vbCIsIml0ZXIiLCJvblJlZHVjZVJvdXRlUGF0aHMiLCJhY2MiLCJyb3V0ZVBhdGgiLCJyb3V0ZU5hbWUiLCJyb3V0ZU5hbWVWYWwiLCJrZXlzQXJyIiwicHJlZCIsImFyclN0ciIsIlJlZ0V4cCIsImZpbmQiLCJnZXRQcm9wVmFsIiwibmV4dFJvdXRlUGF0aCIsInJldmVyc2UiLCJyZWR1Y2UiLCJwdXNoIiwiZW5kUm91dGVWYWxBcnIiLCJlbmRSb3V0ZVZhbCIsImVsIiwiZGF0YXNldCIsImRvbVN0cmluZ01hcCIsImRvbVN0cmluZ01hcFRvT2JqZWN0IiwiZ2V0RGF0YUZyb21QYXJhbXMiLCJjaGFuZ2VMb2NhdGlvbkJvb2wiLCJpc0hpZGRlbiIsInNlbmRSb3V0ZVN0cmVhbSIsImNoZWNrQW5kQ29udmVydFN0cldpdGhSZWdleFRva2VucyIsInJvdXRlVmFsdWUiLCJyZWdleFRva2VuT2JqIiwiY2hhbmdlV2luZG93TG9jIiwic2V0V2luZG93TG9jYXRpb24iLCJnZXRSb3V0ZVN0YXRlIiwiZ2V0SXNEZWVwTGlua0Jvb2wiLCJpc0hpc3RvcnkiLCJfcm91dGVDb3VudCIsImdldFJvdXRlQ291bnQiLCJnZXRFeHRyYVBheWxvYWRQYXJhbXMiLCJpc0RlZXBMaW5rIiwicm91dGVUeXBlIiwiZ2V0Um91dGVTdHJGcm9tUGFyYW1zIiwiZ2V0UHJvcEZyb21Db25maWciLCJwcnAiLCJkZWZhbHQiLCJ0eXBlRm9yU3RyIiwiaXNIYXNoRm9yU3RyIiwibmV4dFdpbmRvd0xvYyIsImZvcm1hdFN0ckFzV2luZG93TG9jYXRpb24iLCJkYXRhRnJvbVN0ciIsImdldERhdGFGcm9tTG9jYXRpb25TdHIiLCJwYXRoSW5uZXJtb3N0IiwiaGFzaElzVHJ1ZSIsImdldExvY2F0aW9uU3RyQnlUeXBlIiwiZ2V0UGFyYW1zRnJvbVJvdXRlU3RyIiwidCIsImxvYyIsInBhcmFtc0RhdGEiLCJjb252ZXJ0UGFyYW1zVG9Sb3V0ZSIsImNvbnZlcnRSb3V0ZVRvUGFyYW1zIiwiY2hlY2tFbXB0eVJvdXRlU3RyIiwiaXNFbXB0eUJvb2wiLCJyZW1vdmVMYXN0U2xhc2giLCJjaGFubmVsUGF5bG9hZCIsInBhdGhuYW1lIiwiaGlzdG9yeSIsInB1c2hTdGF0ZSIsImNoZWNrRm9yU2xhc2giLCJ3aGVuIiwiY29tcGxlbWVudCIsIl9fIiwiZ2V0V2luZG93TG9jYXRpb24iLCJjdXJyaWVkR2V0Um91dGUiLCJjdXJyeU4iLCJTcHluZUNoYW5uZWxVSSIsImtleUV2ZW50c0xvYWRlZCIsImtleUNvZGVBcnIiLCJsb2FkS2V5U3RyZWFtIiwia2V5VXBzIiwiZnJvbUV2ZW50IiwiZG9jdW1lbnQiLCJrZXlQcmVzc2VzJCIsImdyb3VwQnkiLCJrZXlDb2RlIiwiaW5kZXhPZiIsInJlcGVhdCIsIm9uS2V5UHJlc3NlZCIsIm51bSIsInJlZ2lzdGVyS2V5Iiwib25VSUV2ZW50IiwiZ2V0QWN0aW9uU3RhdGUiLCJ0eXBlVmFsIiwidHlwZU92ZXJSaWRlVmFsIiwidG9VcHBlciIsImV2ZW50VHlwZSIsIm1haW5BY3Rpb24iLCJ0YXJnZXQiLCJTcHluZUNoYW5uZWxXaW5kb3ciLCJjdXJyZW50U2Nyb2xsWSIsImRvbUNoYW5uZWxDb25maWciLCJXSU5ET1ciLCJvYnMkQXJyIiwiZ2V0QWN0aXZlT2JzZXJ2YWJsZXMiLCJkb20kIiwicCIsImdldE1vdXNlV2hlZWxNYXBGbiIsIkNIQU5ORUxfV0lORE9XX1dIRUVMX0VWRU5UIiwic2Nyb2xsRGlyIiwiZGVsdGFZIiwiZGVsdGFYIiwiZGVsdGFaIiwiY3JlYXRlQ3VycmllZEdlbmVyaWNFdmVudCIsInRvVXBwZXJDYXNlIiwiY3VycnkiLCJtYXBHZW5lcmljRXZlbnQiLCJjdXJyeUZuIiwiZ2V0UmVzaXplTWFwRm4iLCJDSEFOTkVMX1dJTkRPV19SRVNJWkVfRVZFTlQiLCJnZXRPcmllbnRhdGlvbk1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfT1JJRU5UQVRJT05fRVZFTlQiLCJpc1BvcnRyYWl0Qm9vbCIsIm1hdGNoTWVkaWEiLCJtYXRjaGVzIiwib3JpZW50YXRpb24iLCJnZXRNZWRpYVF1ZXJ5TWFwRm4iLCJDSEFOTkVMX1dJTkRPV19NRURJQV9RVUVSWV9FVkVOVCIsImNyZWF0ZU1vdXNlV2hlZWxPYnNlcnZhYmxlIiwiZGVib3VuY2VUIiwiZGVib3VuY2VNU1RpbWVGb3JTY3JvbGwiLCJjcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50IiwiZGVib3VuY2VUaW1lIiwiZ2V0U2Nyb2xsRGF0YSIsInNjcm9sbFkiLCJzY3JvbGxEaXN0YW5jZSIsImdldFNjcm9sbFkiLCJzY3JvbGxFbGVtZW50IiwicGFnZVlPZmZzZXQiLCJzY3JvbGxUb3AiLCJnZXRTY3JvbGxNYXBGbiIsImludGVydmFsIiwic2Nyb2xsRGF0YUZuIiwiY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZSIsImlzUGFzc2l2ZSIsImRUaW1lIiwiZWxlbWVudCIsImlzV2luZG93Iiwic2Nyb2xsRWxGb3JWYWxzIiwic2Nyb2xsTWFwRm4iLCJwYXJ0aWFsUmlnaHQiLCJza2lwV2hpbGUiLCJuZXdTY3JvbGxZIiwic2Nyb2xsRGlzdGFuY2VBYnMiLCJNYXRoIiwiYWJzIiwiY3JlYXRlT3JpZW50YXRpb25PYnNlcnZhYmxlIiwiY3JlYXRlUmVzaXplT2JzZXJ2YWJsZSIsImRlYm91bmNlTVNUaW1lRm9yUmVzaXplIiwiZ2V0RXZlbnRzRnJvbUNvbmZpZyIsImV2ZW50cyIsImxpc3RlbkZvck1lZGlhUXVlcmllcyIsIm1lZGlhUXVlcmllcyIsIm1ldGhvZHMiLCJsaXN0ZW5Gb3JSZXNpemUiLCJsaXN0ZW5Gb3JPcmllbnRhdGlvbiIsImxpc3RlbkZvclNjcm9sbCIsImxpc3RlbkZvcldoZWVsIiwibWFwT2JqSW5kZXhlZCIsIm1ldGhvZCIsImkiLCJjaGVja0Zvck1lZGlhUXVlcmllcyIsImV2ZW50c0FyciIsImdldE1lZGlhUXVlcnlPYnNlcnZhYmxlIiwiY3JlYXRlTWVyZ2VkT2JzRnJvbU9iaiIsImFwcGx5Iiwib25TY3JvbGxMb2NrRXZlbnQiLCJvblNldEVsZW1lbnRUb1Njcm9sbCIsImNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyIiwiX2NoYW5uZWxzIiwidmVyc2lvbiIsIlNweW5lQXBwIiwiZGVmYXVsdENvbmZpZyIsInNjcm9sbExvY2siLCJzY3JvbGxMb2NrWCIsInNjcm9sbExvY2tZIiwic3RyaWN0IiwiYmFzZUhyZWYiLCJJTUdfUEFUSCIsInBsdWdpbk1ldGhvZHMiLCJwbHVnaW5zIiwidG1wIiwiZXBoZW1lcmFsUHJvcHMiLCJ0bXBQcm9wcyIsImxpc3RlbkZvck1vdXNlV2hlZWwiLCJhZGQ0MDRzIiwicm91dGVVdGlscyIsImluaXRpYWxpemUiLCJwbHVnaW5zRm4iLCJnZXRQbHVnaW5zTWV0aG9kT2JqIiwicmVnaXN0ZXJDaGFubmVsIiwicmVnaXN0ZXJQbHVnaW4iLCJwbHVnaW5JbnN0YW5jZSIsInJlZ2lzdGVyRGF0YUNoYW5uZWwiLCJsaXN0Q2hhbm5lbHMiLCJudWxsSG9sZGVyIiwiaWQiLCJhcHBlbmRUb0RvbSIsImJvZHkiLCJzdHlsZSIsImNzc1RleHQiLCJTcHluZSIsIl9zcHluZUFwcFByb3BzIiwiU3B5bmVQbHVnaW4iLCJwYXJlbnRFbCIsIm1lcmdlRGVmYXVsdENvbmZpZyIsImNyZWF0ZVBhcmVudEVsIiwicmVnaXN0ZXIiLCJzcHluZUFwcFByb3BzIiwicGx1Z2luTmFtZSIsIm9uQmVmb3JlUmVnaXN0ZXJlZCIsImFkZFBsdWdpbkNvbmZpZyIsIm9uUmVuZGVyIiwiU3B5bmVBcHBQcm9wZXJ0aWVzIiwiYXNzaWduIiwiZ2V0U3B5bmVBcHAiLCJ1cGRhdGVTcHluZUNvbmZpZyIsInNweW5lQXBwIiwicGx1Z2luQ29uZmlnIiwicGF0aFNhdGlzZmllcyIsImdldEVsZW1lbnRCeUlkIiwicGx1Z2luRWwiLCJhcHBlbmRDaGlsZCIsInJlbmRlciIsImNyZWF0ZVBsdWdpbkVsIiwiY2hlY2tGb3JSZXF1aXJlZFdpbmRvd0V2ZW50IiwicmVxdWlyZWRFdmVudHMiLCJ3aW5kb3dDb25maWciLCJnZXRDaGFubmVsQ29uZmlnIiwibWlzc2luZ0V2ZW50cyIsIkNoYW5uZWxGZXRjaFV0aWwiLCJfbWFwRm4iLCJzZXRNYXBGbiIsIl91cmwiLCJzZXRVcmwiLCJfcmVzcG9uc2VUeXBlIiwic2V0UmVzcG9uc2VUeXBlIiwiX3NlcnZlck9wdGlvbnMiLCJzZXRTZXJ2ZXJPcHRpb25zIiwiX3N1YnNjcmliZXIiLCJsb2ciLCJzZXJ2ZXJPcHRpb25zIiwicmVzcG9uc2VUeXBlIiwic3RhcnRXaW5kb3dGZXRjaCIsInRhcExvZyIsInJlc3BvbnNlJCIsImZldGNoIiwidGFwIiwiZmxhdE1hcCIsInIiLCJtYXBNZXRob2QiLCJtZXRhZGF0YSIsImRpc2FibGVTYW5pdGl6ZSIsImVudiIsInByb2Nlc3MiLCJtc2ciLCJFcnJvciIsInNhbml0aXplZERhdGEiLCJtYXBXcmFwcGVyIiwicHVibGlzaCIsImNvbm5lY3QiLCJvcHRzIiwiZ2V0Rm4iLCJzdHJpbmdpZnlCb2R5SWZJdEV4aXN0cyIsInByb3BJcyIsImNvbnZlcnRUb0pTT04iLCJ1cGRhdGVNZXRob2RXaGVuQm9keUV4aXN0cyIsImhhc0JvZHkiLCJtZXRob2RJc0dldCIsImFzc29jIiwibWVyZ2VkT3B0aW9ucyIsImJhc2VPcHRpb25zIiwiaGVhZGVycyIsIkhlYWRlcnMiLCJBY2NlcHQiLCJtb2RlIiwiY3JlZGVudGlhbHMiLCJjYWNoZSIsInJlZGlyZWN0IiwicmVmZXJyZXIiLCJyZWZlcnJlclBvbGljeSIsImludGVncml0eSIsImtlZXBhbGl2ZSIsImlzTm90QXJyIiwibm90IiwiaXNOb3RFbXB0eSIsImlzTm9uRW1wdHlTdHIiLCJpc05vbkVtcHR5QXJyIiwiaXNPYmplY3RGbiIsImlzTm9uRW1wdHlPYmplY3RGbiIsIkNoYW5uZWxQYXlsb2FkRmlsdGVyIiwic2VsZWN0b3IiLCJmaWx0ZXJzIiwiZGVidWdMYWJlbCIsImRlYnVnTGFiZWxBcnIiLCJwcm9wRmlsdGVycyIsImFkZFN0cmluZ1NlbGVjdG9yRmlsdGVyIiwiZmlsdGVyU2VsZWN0b3IiLCJhZGRBcnJheVNlbGVjdG9yRmlsdGVyIiwiYWRkRGF0YUZpbHRlciIsImZpbHRlckRhdGEiLCJmaWx0ZXJzQXJyIiwiZmlsdGVyc0FyZUVtcHR5IiwiZmlsdGVySnNvbiIsImZpbHRlcmRlYnVnTGFiZWwiLCJmblZhbCIsIkYiLCJpc1N0cmluZyIsIkJvb2xlYW4iLCJpc0Jvb2xlYW4iLCJpc051bWJlciIsImNvbXBhcmVTdHIiLCJpc0FycmF5Rm4iLCJmTWV0aG9kIiwid2hlcmUiLCJjb21wYXJlZE9iaiIsInByb3BzQm9vbGVhbnMiLCJmb3JFYWNoT2JqSW5kZXhlZCIsImNvbXBhcmVEYXRhIiwiY2hlY2tQYXlsb2FkU2VsZWN0b3IiLCJzcmNQYXlsb2FkIiwic3JjIiwiY29tcGFyZUVscyIsImVsQ29tcGFyZSIsImlzRXF1YWxOb2RlIiwibWFwTm9kZUFycldpdGhFbCIsInNlbCIsIm5vZGVBcnIiLCJxdWVyeVNlbGVjdG9yQWxsIiwibm9kZUFyclJlc3VsdHNEZWJ1Z2dlciIsImZsYXR0ZW4iLCJzZWxlY3RvcnNBcnIiLCJub2RlQXJyUmVzdWx0IiwiYW55IiwicXVlcnlTZWxlY3RvciIsInNlbGVjdG9yQXJyIiwicGF5bG9hZENoZWNrIiwiaXNNZXJnZWFibGVPYmplY3QiLCJ0b1N0cmluZyIsImNsb25lSWZOZWNlc3NhcnkiLCJvcHRpb25zQXJndW1lbnQiLCJkZWVwTWVyZ2UiLCJpc0FycmF5IiwiZGVmYXVsdEFycmF5TWVyZ2UiLCJkZXN0aW5hdGlvbiIsInNsaWNlIiwiYXJyYXkiLCJhcnJheU1lcmdlIiwibWVyZ2VPYmplY3QiLCJwcmV2IiwiZGVsYXlDYWxsIiwiYXN5bmMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImdldENvbnN0cnVjdG9yTmFtZSIsInN1YnN0ciIsImZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIiLCJzIiwiY2hlY2tlcklmUmVnZXhNYXRjaEV4aXN0cyIsImNvbnZlcnREb21TdHJpbmdNYXBUb09iaiIsImRvbU1hcCIsImNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwiLCJpc05vdE5pbCIsImlzTm90TmlsQW5kSXNOb3RFbXB0eSIsImdldEFsbE1ldGhvZE5hbWVzIiwiaW5zdGFuY2UiLCJvbWl0dGVkTWV0aG9kcyIsImNvbWJpbmVkT21pdHRlZE1ldGhvZHMiLCJvbWl0UHJvcHNGcm9tQXJyIiwid2l0aG91dCIsInVuaXEiLCJzdGF0aWNNZXRob2RzIiwiYWxsTWV0aG9kcyIsImdjIiwiYmFzZUNvcmVNaXhpbnMiLCJjcmVhdGVwcm9wc01hcCIsIndtIiwiV2Vha01hcCIsIm9iaktleSIsInZzaWQiLCJ3ZWFrTWFwIiwiY3JlYXRlSWQiLCJyYW5kb20iLCJzdWJzdHJpbmciLCJzZXRUcmFjZUZ1bmMiLCJiYXNlU3RyZWFtc01peGlucyIsInRlc3RGdW5jIiwic2VuZFJvdXRlUGF5bG9hZCIsInNlbmRVSVBheWxvYWQiLCJSb3V0ZUNoYW5uZWxVcGRhdGVyIiwiY3h0IiwiY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iaiIsInNlbmRSb3V0ZUNoYW5uZWxVcGRhdGUiLCJ2cyIsIm9uUmVuZGVyZWQiLCJzZW5kSW5mb1RvQ2hhbm5lbCIsImFmdGVyQnJvYWRjYXN0RXZlbnRzIiwiZGlzcG9zZVZpZXdTdHJlYW0iLCJhcHBlbmRUb051bGwiLCJzYWZlQ2xvbmUiLCJfX3Byb3h5X19wcm94eU5hbWUiLCJwcm94eVJldml2ZXJNZXRob2QiLCJnZXRQcm94eVJldml2ZXIiLCJwcm94eU9iaiIsImNsb25lTmVzdGVkUHJveHlPYmoiLCJwYXRoQXJyIiwibmVzdGVkUHJveHlPYmoiLCJfX3Byb3h5X19pc1Byb3h5IiwiX19wcm94eV9fcHJvcHMiLCJyb290T2JqIiwicHJveHlJdGVyYWJsZSIsIml0ZXJPYmoiLCJpdGVyUGF0aCIsImRhdGFQYXRoIiwiZW50cmllcyIsImdldFByb3BUeXBlIiwiY2xvbmVkUGF0aCIsImNtc0RhdGFSZXZpdmVOZXN0ZWRQcm94eU9iaiIsIl9zYW5pdGl6ZURhdGEiLCJpc0NvbmZpZ3VyZWQiLCJmb3JjZVN0cmljdCIsIlNBRkVfRk9SX1JJQ0hfVEVYVCIsIkFMTE9XRURfVEFHUyIsIkFERF9UQUdTIiwiQUxMT1dFRF9BVFRSIiwiQUxMT1dfREFUQV9BVFRSIiwiRk9SQklEX0FUVFIiLCJGT1JCSURfVEFHUyIsIlNBRkVfVVJMX1BBVFRFUk4iLCJTQUZFX0ZPUl9BUFAiLCJyZXNvbHZlRGVmYXVsdE1vZGUiLCJtYWtlU2FuaXRpemVGbiIsImNmZyIsImh0bWwiLCJjbGVhbiIsImF0dHIiLCJzYW5pdGl6ZURhdGFDb25maWd1cmUiLCJwcm9jZXNzRmFjdG9yeSIsInNhbml0aXplU3RyIiwib3V0IiwiZWZmZWN0aXZlTW9kZSIsInNhbml0aXplRGF0YUZvcmNlIiwiZWZmZWN0aXZlIiwic2FuaXRpemVFdmVudFRhcmdldCIsIlVOU0FGRV9SRSIsImlzQ29udGVudEVkaXRhYmxlIiwiaW5uZXJIVE1MIiwic2V0U2FuaXRpemVEYXRhRm9yY2VTdHJpY3QiLCJfc2FuaXRpemVIVE1MIiwic2FuaXRpemVIVE1MQ29uZmlndXJlIiwidHJ1c3RlZFR5cGVzIiwicG9saWN5IiwiY3JlYXRlUG9saWN5IiwiY3JlYXRlSFRNTCIsInRvX2VzY2FwZSIsIlJFVFVSTl9UUlVTVEVEX1RZUEUiLCJfY29uZmlnIiwiX2NoYW5uZWxzTWFwIiwiX2luaXRpYWxpemVkIiwiX2RlYnVnIiwiX2VuYWJsZUNNU1Byb3hpZXMiLCJfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUiLCJfbmF2TGlua3MiLCJfSU1HX1BBVEgiLCJfZG9Ob3RUcmFja0NoYW5uZWxzQXJyIiwiX3Byb3hpZXNNYXAiLCJfc3B5bmVQbHVnaW5NZXRob2RzIiwiY29uZm9ybVJvdXRlT2JqZWN0Iiwic2V0Q2hhbm5lbHNNYXAiLCJzZXRIZWFkQmFzZUhyZWYiLCJiYXNlVGFnIiwiY3JlYXRlRWxlbWVudCIsImhyZWYiLCJhZGQ0MDRQcm9wcyIsInNldFByb3AiLCJpc1RlbXAiLCJnZXRQcm9wIiwidGVtcFZhbCIsImNyZWF0ZVRlbXBQcm9wIiwic2V0Q2hhbm5lbENvbmZpZyIsImNoYW5uZWxDb25maWciLCJhZGRQbHVnaW5NZXRob2RzIiwicGx1Z2luTWV0aG9kc09iaiIsImFkZE1ldGhvZHMiLCJnZXRVbnRyYWNrZWRDaGFubmVsc0xpc3QiLCJyZWdpc3RlclByb3h5UmV2aXZlciIsInByb3h5TmFtZSIsImdldFBsdWdpbkNvbmZpZ0J5UGx1Z2luTmFtZSIsImV4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlIiwibGlua3NEYXRhIiwiZW5hYmxlQ01TUHJveGllcyIsImdldEhyZWZGcm9tRGF0YSIsInJvdXRlUHJvcHMiLCJzZXRDTVNQcm94eU1ldGhvZCIsImZvcm1hdFRlbXBsYXRlRm9yUHJveHlEYXRhIiwidGVtcEdldENoYW5uZWxzSW5zdGFuY2UiLCJ0ZW1wR2V0Q29uZmlnIiwiX3BsdWdpbk1ldGhvZHNPYmoiLCJjcmVhdGUiLCJTcHluZVBsdWdpbnNNZXRob2RzIiwiZm9vIiwiYWRkTWV0aG9kIiwid2FyblN0ciIsIm1ldGhvZHNPYmoiLCJrZXlTdHIiLCJjaGVja0lmTWV0aG9kRXhpc3RzIiwiU3B5bmVUcmFpdCIsInBhcmVudENvbnRleHQiLCJwcmVmaXgiLCJhdXRvSW5pdCIsImF1dG9CaW5kZXIiLCJhbGxNZXRob2RzTGlzdCIsImluaXRBdXRvQmluZGVyIiwiZ2V0RW5oYW5jZXJNZXRob2RzIiwiY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzIiwibWFsZm9ybWVkTWV0aG9kc0FyciIsIndhcm5pbmdTdHIiLCJiaW5kUGFyZW50Vmlld1N0cmVhbSIsImNvbnRleHQiLCJiaW5kTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSIsImlzU3RhdGljIiwiY29uc3RydWN0b3JUeXBlIiwiYmluZFN0YXRpY01ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0iLCJiaW5kQ3VycnkiLCJTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsIiwiY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgiLCJwYXJhbVZhbHVlIiwicm91dGVPYmoiLCJyZWplY3RQYXJhbUtleSIsInJlZ2V4TWF0Y2hTdHIiLCJjaGVja2VyIiwiaGFzaCIsInNlYXJjaCIsInByb3BWYWwiLCJzbGFzaCIsInF1ZXJ5IiwiY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMiLCJyb3V0ZSIsInBhcmFtc0Zyb21Mb2MiLCJ1cmxBcnIiLCJsb29wVGhyb3VnaFBhcmFtIiwidXJsT2JqIiwia2V5d29yZCIsInBhcmFtVmFsRnJvbURhdGEiLCJwYXJhbVZhbFR5cGUiLCJpc09iamVjdCIsIm9iamVjdFBhcmFtRXhpc3RzIiwib2JqZWN0Q29udGFpbnNSb3V0ZSIsIm5ld09iaiIsImNyZWF0ZVNsYXNoU3RyaW5nIiwiYXJyQ2xlYXIiLCJub3RVbmRlZmluZWQiLCJzdHJpcFJlZ2V4Iiwiam9pbmVyIiwiY3JlYXRlUXVlcnlTdHJpbmciLCJjcmVhdGVQYWlyIiwiY2hlY2tQYWlyIiwibWFwQXJyYXlPZlBhaXJzIiwiY2hlY2tJZlN0cklzRW1wdHkiLCJjcmVhdGVRcyIsImNoZWNrUGF5bG9hZEZvclJlZ2V4T3ZlcnJpZGVzIiwidXJsc0FyciIsInBhcnNlU3RyaW5nIiwiZ2V0T3ZlcnJpZGVWYWwiLCJvdmVycmlkZVZhbCIsImNoZWNrRm9yUm91dGVWYWxXaXRoTXVsdGlwbGVWYWxzIiwiaW5wdXQiLCJnZXRTdHJpbmdCZWZvcmVQaXBlIiwiY2hlY2tGb3JSb3V0ZVZhbHNQYXJ0TWF0Y2giLCJ1cGRhdGVkT2JqIiwiZ2xvYlBhdHRlcm4iLCJzcGxpdCIsInNvbWUiLCJwYXR0ZXJuIiwiZXNjYXBlZFBhdHRlcm4iLCJnbG9iUGF0dGVybk1hdGNoIiwibG9jU3RyIiwidXJsVHlwZSIsImxvY2F0aW9uU3RyIiwicGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbiIsImZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgiLCJtYWluU3RyIiwiaXM0MDQiLCJjaGVja0ZvckVtcHR5IiwiY2hlY2tGb3JFaXRoZXJTdHJPclJlTWF0Y2giLCJmaW5kTGFzdEluZGV4IiwicmUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJmaW5kTWF0Y2hJbmRleCIsImNoZWNrSWZWYWx1ZVNob3VsZE1hcFRvUGFyYW0iLCJyZWdleFRva2VucyIsImxhc3QiLCJnZXRWYWxDb21wYXJlQXJyIiwicGFyYW1JbmRleCIsInBhcmFtU3RyIiwicGFyYW0iLCJpbnZlcnRlZE9iaiIsImludmVydCIsInBhcmFtSW52ZXJ0ZWQiLCJnZXRQYXJhbUludmVydGVkIiwiY3JlYXRlQXJyRnJvbVNsYXNoU3RyIiwiY29udmVydFNsYXNoUm91dGVTdHJUb1BhcmFtc09iaiIsInRvcExldmVsUm91dGUiLCJ2YWx1ZXNBcnIiLCJyb3V0ZWRWYWx1ZXNBcnIiLCJsYXRlc3RPYmoiLCJ0b3RhbCIsImN1cnJlbnRWYWx1ZSIsInJvdXRlVmFsdWVTdHIiLCJpc0VtcHR5T3JOaWwiLCJwcmV2UGF0aE5vdEVxQ3VycmVudFBhdGgiLCJzdHJQYXRoIiwib2JqZWN0RnJvbVN0ciIsIm9iamVjdEZyb21Sb3V0ZVBhcmFtIiwiemlwT2JqIiwiZ2V0TGFzdEFyclZhbCIsImEiLCJjcmVhdGVEZWZhdWx0UGFyYW1Gcm9tRW1wdHlTdHIiLCJjb252ZXJ0UXVlcnlTdHJUb1BhcmFtcyIsInN0ckFyciIsImNvbnZlcnRUb1BhcmFtcyIsIlNweW5lVXRpbHNDaGFubmVsUm91dGUiLCJzdWJzY3JpYmVGbiIsImZyb21FdmVudFBhdHRlcm4iLCJoYW5kbGVyIiwib25wb3BzdGF0ZSIsInBpY2tWYWx1ZXMiLCJvYmoxIiwib2JqMiIsImNyZWF0ZVByZWQiLCJnZXRQcm9wc1N0YXRlIiwic2FtZSIsInByZXZpb3VzRXhpc3RzIiwibmV4dEV4aXN0cyIsImNoYW5nZWQiLCJhZGRlZCIsInJlbW92ZWQiLCJwYXRoc0NoYW5nZWQiLCJwYXRoc0FkZGVkIiwicGF0aHNSZW1vdmVkIiwiZ2V0Q29tcGFyZXIiLCJnZXRSb3V0ZUFyckRhdGEiLCJyb3V0ZUFyciIsImdvIiwib2JqXyIsImtfIiwidl8iLCJhZGRSb3V0ZURhdGFzZXRzIiwiY2hhbm5lbFJvdXRlT2JqIiwiZ2V0SFJFRiIsImlzVmFsaWRTdHJSRSIsImNyZWF0ZUluaXRpYWxWYWxGbiIsImFjY01haW4iLCJyb3V0ZVBhdGhPYmoiLCJvYmpBY2MiLCJhcnJQYWlyIiwiZ2V0TGlua1RleHQiLCJjcmVhdGVUaXRsZSIsInN1YlJvdXRlTmFtZSIsIm9CYXNlIiwibmF2TGV2ZWwiLCJ0aXRsZSIsInJlZHVjZWRBcnIiLCJyZW1vdmVVbmRlZmluZWQiLCJyb3V0ZU5hbWVzQXJyIiwiZGF0YXNldHNBcnIiLCJleGNsdWRlIiwiZ2V0TWFpbktleXMiLCJnZXROYXZQcm9wcyIsImNoYW5uZWxzUm91dGVQYXRoIiwicGFyc2VSb3V0ZVBhdGgiLCJjb25maWdNYXBwZXJGbiIsIm9iajQwNCIsImlzUm91dGVQYXRoIiwiZXh0cmFSb3V0ZURhdGEiLCJTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdyIsImV2ZW50TmFtZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJwYXNzaXZlIiwiY3JlYXRlTWVkaWFRdWVyeSIsIm1xIiwiY2hlY2tJZlZhbGlkTWVkaWFRdWVyeSIsIm5vU3BhY2VzIiwiaXNWYWxpZEJvb2wiLCJtZWRpYSIsIndhcm5Nc2ciLCJtYXBLZXkiLCJtZWRpYVF1ZXJ5TmFtZSIsImtleUZuIiwibWVkaWFRdWVyeUhhbmRsZXIiLCJxIiwiYWRkSGFuZGxlciIsImFkZExpc3RlbmVyIiwicmVtb3ZlSGFuZGxlciIsIm9uY2hhbmdlIiwibWVkaWFRdWVyaWVzT2JqIiwiY3JlYXRlRmFkZXJJbmxpbmVUZXh0IiwiaXNJbkJvb2wiLCJzdGFydFplcm9Cb29sIiwiZmFkZWluIiwiY3VycmVudE9wYWNpdHkiLCJnZXRDb21wdXRlZFN0eWxlIiwib3BhY2l0eSIsImlubGluZUNzcyIsImZhZGVvdXQiLCJjYWxsYmFjayIsIlZpZXdTdHJlYW1PYnNlcnZhYmxlIiwib2JzZXJ2YWJsZVN0cmVhbXMiLCJjcmVhdGVEaXJlY3Rpb25hbE9ic2VydmFibGVzIiwiY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0IiwiZGlySW50ZXJuYWwiLCJkaXJQYXJlbnQiLCJkaXJDaGlsZCIsIlAiLCJDIiwiUENJIiwiQ0kiLCJQSSIsIlBDIiwiYWRkRGVmYXVsdERpciIsImZsaXAiLCJkZWZhdWx0cyIsImFkZERvd25JbnRlcm5hbERpciIsImFkZENoaWxkQW5kSW50ZXJuYWxEaXIiLCJtYXBUb0RlZmF1bHREaXIiLCJ2aWV3TmFtZSIsImZpbHRlclN0cmVhbXMiLCJwcm9wU2F0aXNmaWVzIiwiYXJyVHlwZSIsImZpbHRlclBhcmVudCIsImZpbHRlckNoaWxkIiwiZmlsdGVySW50ZXJuYWwiLCJhZGRmcm9tJCIsInJlbFN0ciIsImZyb20kIiwiYWRkUGFyZW50ZnJvbSQiLCJhZGRJbnRlcm5hbGZyb20kIiwiYWRkQ2hpbGRmcm9tJCIsInJhdyQiLCJ0b0ludGVybmFsJCIsInRvUGFyZW50JCIsInRvQ2hpbGQkIiwic3RyZWFtT2JqIiwicGFyZW50IiwiaW50ZXJuYWwiLCJjaGlsZCIsImNvbXBsZXRlQWxsIiwiY29tcGxldGUiLCJpc1N0b3BwZWQiLCJjb21wbGV0ZVN0cmVhbSIsIkRvbUVsZW1lbnRUZW1wbGF0ZSIsInRlbXBsYXRlIiwiZm9ybWF0VGVtcGxhdGUiLCJpc1Byb3h5RGF0YSIsIl9fY21zX19pc1Byb3h5Iiwibm9ybWFsaXplVHJpcGxlQnJhY2tldHMiLCJzcHluZURhdGEiLCJjaGVja0ZvckFycmF5RGF0YSIsInRlbXBsYXRlRGF0YSIsImN1cnJlbnRPdXRlckxvb3BEYXRhIiwiZ2V0U3RyaW5nQXJyYXkiLCJzdHJNYXRjaGVzIiwiZmluZFRtcGxMb29wc1JFIiwicGFyc2VUbXBsTG9vcHNSRSIsInBhcnNlVG1wbExvb3BGbiIsInBhcnNlVGhlVG1wbExvb3AiLCJmaW5kVG1wbExvb3BzUHJlZCIsImNoZWNrRm9yTWF0Y2hlcyIsImFkZFBhcmFtcyIsImZpbmFsQXJyIiwiaXNQcmltaXRpdmVUYWciLCJnZXROZXN0ZWREYXRhUmVkdWNlciIsIm5lc3RlZERhdGEiLCJlbXB0eVJFIiwid2l0aG91dExlYWtzIiwiXyIsImlubmVyTG9vcFJFIiwic3dhcFBhcmFtc0ZvclRhZ3NSRSIsImhhc0xvb3AiLCJyZW1vdmVUaGlzIiwicmVuZGVyRG9jRnJhZyIsInJlcGxhY2VJbWdQYXRoIiwiY3JlYXRlUmFuZ2UiLCJjcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQiLCJyZW5kZXJUb1N0cmluZyIsImdldFRlbXBsYXRlU3RyaW5nIiwiZ2V0RGF0YVZhbEZyb21QYXRoU3RyIiwicGF0aFN0ciIsImRhdGFGaWxlIiwidGVtcGxhdGVTdHIiLCJyZXBsYWNlQWxsIiwicHJvY2Vzc0lubmVyTG9vcCIsImJvZHlTdHIiLCJwYXJlbnRJdGVtIiwiaW5uZXJSRSIsImZ1bGxNYXRjaCIsIm9wZW5UYWciLCJpbm5lcktleSIsImlubmVyQm9keSIsImlubmVyRGF0YSIsImlubmVyQXJyIiwicHJldmlvdXNPdXRlciIsInJlbmRlcmVkIiwiaW5uZXJJdGVtIiwiaW5uZXJJZHgiLCJzdWJzdGl0dXRlRm9ySXRlbSIsImluZGV4IiwiZXNjYXBlZCIsImN0eCIsImJ1aWxkU3RyaW5nSXRlbUNvbnRleHQiLCJzdWJzdGl0dXRlT2JqZWN0IiwiYnVpbGRJdGVtQ29udGV4dCIsInNweW5lTG9vcEtleSIsImxvb3BJbmRleCIsImxvb3BOdW0iLCJvdXRlckRhdGEiLCJfX2Ntc19fZGF0YUlkIiwia2V5SWRTdHIiLCJvcmlnS2V5IiwicmVEb3QiLCJwb3NpdGlvbmFsIiwib3V0ZXJCb2R5IiwiZWxEYXRhIiwiZWxBcnIiLCJib2R5SGFzSW5uZXJMb29wIiwiRG9tRWxlbWVudCIsInRhZ05hbWUiLCJhdHRyaWJ1dGVzIiwiZ2V0RG9tQXR0cmlidXRlcyIsImF0dHJzIiwidXBkYXRlQXR0cnMiLCJmcmFnbWVudCIsImNyZWF0ZURvY3VtZW50RnJhZ21lbnQiLCJzZXRFbEF0dHJzIiwicGFyYW1zIiwic2V0QXR0cmlidXRlIiwidGhlTWFwIiwiYWRkVGVtcGxhdGUiLCJmcmFnIiwiYWRkVG1wbCIsImFkZENvbnRlbnQiLCJ0ZXh0IiwidHh0IiwiY3JlYXRlVGV4dE5vZGUiLCJleGVjdXRlIiwicmVuZGVyVG9IVE1MU3RyaW5nIiwib3V0ZXJIVE1MIiwicmV0dXJuSWZEZWZpbmVkIiwidXBkYXRlcHJvcHMiLCJ1cGRhdGVwcm9wc0FuZFJ1biIsInVubW91bnQiLCJyZW1vdmUiLCJ1cGRhdGVUYWciLCJ1cGRhdGVBdHRyaWJ1dGVzIiwidXBkYXRlVGVtcGxhdGUiLCJ1cGRhdGVEYXRhIiwiYWRkVGFnQW5kUmVuZGVyIiwiYWRkQXR0cnNpYnV0ZXNBbmRSZW5kZXIiLCJhZGRUZW1wbGF0ZUFuZFJlbmRlciIsImFkZERhdGFBbmRSZW5kZXIiLCJjb3JlTWl4aW5zIiwiYXR0cmlidXRlc0FycmF5IiwiaXNEZXZNb2RlIiwiVmlld1N0cmVhbUJyb2FkY2FzdGVyIiwiYnJvYWRjYXN0Rm4iLCJicm9hZGNhc3RlciIsImFkZERibENsaWNrRXZ0IiwidHlwZU92ZXJSaWRlIiwiYnJvYWRjYXN0IiwiYXJncyIsImNoYW5uZWxQYXlsb2FkcyIsIlVJIiwibG9jYWwiLCJjaGVja1BhcmVudEVscyIsImVsU2VsZWN0ZWQiLCJwYXJlbnRFbGVtZW50IiwicGx1Y2tFbEZyb21QYXJlbnQiLCJpc0xvY2FsRXZlbnQiLCJwcmV2ZW50RGVmYXVsdCIsImNoIiwic3JjRXZlbnQiLCJhcnJGbiIsInN0cmVhbU1peGlucyIsIlZpZXdTdHJlYW1FbGVtZW50Iiwic2luayQiLCJ2aWV3UHJvcHMiLCJ2c05hbWUiLCJfc3RhdGUiLCJleHRlbmRlZEhhc2hNZXRob2RzIiwiYWRkQWN0aW9uTGlzdGVuZXJzIiwiZnVuY1N0ciIsImhhc2hNZXRob2RzIiwic2V0SGFzaE1ldGhvZHMiLCJvbk9ic1NpbmtTdWJzY3JpYmUiLCIkZGlycyIsInNvdXJjZVN0cmVhbXMiLCJfc291cmNlJCIsImV4dGVuZGVkSGFzaE1ldGhvZHNPYmoiLCJkZWZhdWx0SGFzaE1ldGhvZHMiLCJWU19ERVRSSVRVU19DT0xMRUNUIiwib25HYXJiYWdlQ29sbGVjdCIsIlJFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUIiwib25SZWFkeUZvckdDIiwiRVhUSVJQQVRFIiwib25EaXNwb3NlIiwiVlNfU1BBV04iLCJWU19TUEFXTl9BTkRfQVRUQUNIX1RPX1BBUkVOVCIsIm9uUmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQiLCJWU19TUEFXTl9BTkRfQVRUQUNIX1RPX0RPTSIsIm9uUmVuZGVyQW5kQXR0YWNoVG9Eb20iLCJBVFRBQ0hfQ0hJTERfVE9fU0VMRiIsIm9uQXR0YWNoQ2hpbGRUb1NlbGYiLCJjcmVhdGVEb21JdGVtIiwib25EaXNwb3NlQ29tcGxldGVkIiwiYW5pbWF0ZUluVHdlZW4iLCJhbmltYXRlT3V0VHdlZW4iLCJzZXRBbmltYXRlSW4iLCJhbmltYXRlSW4iLCJkb21JdGVtIiwiYW5pbWF0ZUluVGltZSIsImRpc3Bvc2VNZXRob2QiLCJnY0RhdGEiLCJmYWRlT3V0T2JzIiwiYmluZENhbGxiYWNrIiwiYW5pbWF0ZU91dFRpbWUiLCJvbkZhZGVvdXRDb21wbGV0ZWQiLCJhbmltYXRlT3V0IiwicmVtb3ZlU3RyZWFtIiwiZ2V0U291cmNlU3RyZWFtIiwiY29tYmluZURvbUl0ZW1zIiwiY29udGFpbmVyIiwibm9kZSIsImFmdGVyIiwiYXR0YWNoVHlwZSIsImluc2VydEJlZm9yZSIsImZpcnN0Q2hpbGQiLCJjaGlsZFJlbmRlckRhdGEiLCJyZW5kZXJEb21JdGVtIiwiZ2V0RWwiLCJJIiwiZXh0ZW5kZWRNZXRob2RzIiwiYXR0YWNoRGF0YSIsImRlZmF1bHRUb0ZuIiwic2VuZERhdGEiLCJWaWV3U3RyZWFtUGF5bG9hZCIsInNlbmRUb0RpcmVjdG9yU3RyZWFtIiwiZGlyZWN0b3JTdHJlYW0kIiwiaXNOb2RlRWxlbWVudCIsIm5vZGVDaGVjayIsImdldEVsT3JMaXN0IiwidmVyYm9zZUJvb2wiLCJsaXN0IiwiZ2V0Tm9kZUxpc3RBcnJheSIsInRlc3RTZWxlY3RvcnMiLCJ0cmltIiwiaXNWYWxpZFNlbGVjdG9yIiwiaXNWYWxpZFNlbGVjdG9yQm9vbCIsImlzUGFyZW50IiwicmV0dXJuU2VsZWN0b3JJZlZhbGlkIiwic2V0SW5saW5lQ3NzIiwiVmlld1N0cmVhbVNlbGVjdG9yIiwiZ2VuZXJhdGVTcHluZVNlbGVjdG9ySWQiLCJhZGRDbGFzcyIsImNsYXNzTGlzdCIsImFkZCIsInJlbW92ZUNsYXNzIiwic2V0Q2xhc3MiLCJyZW1vdmVDbGFzc1N0ckFyciIsImNsYXNzTmFtZSIsImNsYXNzU3RyQXJyIiwidG9nZ2xlQ2xhc3MiLCJjb250YWlucyIsInRvZ2dsZSIsImh0bWxFbGVtZW50IiwiYWRkQW5pbUNsYXNzIiwic2V0QWN0aXZlSXRlbTIiLCJlbFNlbCIsImN1cnJlbnRFbCIsInNldEFjdGl2ZUl0ZW0iLCJtYXRjaGluZ0VsIiwiVmlld1N0cmVhbSIsInZzbnVtIiwiX3Bvc3RSZW5kZXJDYWxsZWQiLCJzZW5kTGlmZWN5bGVFdmVudHMiLCJoYXNoSWQiLCJpZCQiLCJ2aWV3Q2xhc3MiLCJleHRlbmRlZFNvdXJjZXNIYXNoTWV0aG9kcyIsImFkZERlZmF1bHREaXJlY3Rpb24iLCJzZW5kTGlmZWN5Y2xlTWV0aG9kIiwic2VuZExpZmVjeWNsZU1ldGhvZEFjdGl2ZSIsInNlbmRMaWZlY3ljbGVNZXRob2RJbmFjdGl2ZSIsImF0dHJpYnV0ZXNBcnIiLCJkb21BdHRyaWJ1dGVzIiwibG9hZEFsbE1ldGhvZHMiLCJlbElzQWxyZWFkeVJlbmRlcmVkQm9vbCIsImVsQWxyZWFkeUV4aXN0c0ZuIiwiVmlld0NsYXNzIiwiX3Jhd1NvdXJjZSQiLCJzZW5kRXZlbnRzRG93blN0cmVhbSIsInNlbmRFdmVudHNEb3duU3RyZWFtRm4iLCJpbml0Vmlld1N0cmVhbSIsImFkZGVkQ2hhbm5lbHMiLCJjaGVja0lmRWxlbWVudEFscmVhZHlFeGlzdHMiLCJzb3VyY2UkIiwiY2hlY2tJZkFjdGlvbnNBcmVSZWdpc3RlcmVkIiwiYWN0aW9uc0FyciIsImNoZWNrRm9yTWF0Y2giLCJzdHJNYXRjaCIsImZpbmRJbmRleCIsImdldEFsbEFjdGlvbnNBcnIiLCJjaGFubmVsU3ludGF4IiwiZ2V0QWxsQWN0aW9ucyIsImlzVmFsaWROZXN0ZWRBcnIiLCJpc1RydWUiLCJhbGxJc1RydWUiLCJpc1ZhbGlkQXJyIiwibWFwRXZlbnRzQXJyRm4iLCJ1cGRhdGVQcm9wc1RvTWF0Y2hFbCIsImdldFRhZ05hbWUiLCJ0b0xvd2VyIiwicG9zdFJlbmRlciIsImNoYW5uZWxGbiIsIm9uQ2hhbm5lbE1ldGhvZENhbGwiLCJhY3Rpb25GaWx0ZXIiLCJoYXNoU291cmNlTWV0aG9kcyIsInNldFNvdXJjZUhhc2hNZXRob2RzIiwiZGVsZXRlZCIsImZpbHRlclBheWxvYWQiLCJydW5GdW5jIiwiaGFzaFNvdXJjZUtleXMiLCJFWFRJUlBBVElORyIsImNoZWNrUGFyZW50RGlzcG9zZSIsIlZTX1NQQVdORUQiLCJvblZTUmVuZGVyZWQiLCJWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19ET00iLCJWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQiLCJvblJlYWR5VG9HQyIsIlZTX05VTExJVFkiLCJvbk1hcFZpZXdTb3VyY2UiLCJ0YWtlV2hpbGUiLCJub3RHQ1NUQVRFIiwiaW5pdEF1dG9NZXJnZVNvdXJjZVN0cmVhbXMiLCJ1cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24iLCJlcUdDU1RBVEUiLCJub3RDT01QTEVURUQiLCJub3RHQ0NPTVBMRVRFIiwidGVzdFZhbCIsImFkZFBhcmVudFN0cmVhbSIsInBhcmVudCQiLCJyZW5kZXJBbmRBdHRhY2hUb1BhcmVudCIsImFkZENoaWxkU3RyZWFtIiwiY2hpbGQkIiwidHJhY2VyIiwiZmluYWxpemUiLCJvbkNoaWxkQ29tcGxldGVkIiwib25DaGlsZERpc3Bvc2VkIiwiY2hpbGRDb21wbGV0ZWREYXRhIiwieCIsImZpbmFsRGVzdCIsInkiLCJmaW5kTmFtZSIsIm9uU3Vic2NyaWJlVG9Tb3VyY2VzTmV4dCIsIm9uU3Vic2NyaWJlVG9Tb3VyY2VzRXJyb3IiLCJvblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlIiwiZWwkIiwidWJlclNvdXJjZSQiLCJhdXRvU3Vic2NyaWJlciQiLCJkZWNyZW1lbnRPbk9ic2VydmFibGVDbG9zZWQiLCJvYnNDb3VudCIsImF1dG9NZXJnZVN1YmplY3QkIiwibWVyZ2VNYXAiLCJvYnNEYXRhIiwiYnJhbmNoT2JzZXJ2YWJsZSQiLCJhdXRvQ2xvc2VzQm9vbCIsInJlbCIsInNlbmRFeHRlbmRlZFN0cmVhbXMiLCJoYXNoQWN0aW9uU3RyIiwib3BlblNwaWdvdCIsInJlbmRlclZpZXciLCJyZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20iLCJvbkJlZm9yZURpc3Bvc2UiLCJtcyIsIm1ldGhvZEZuIiwib25DaGlsZERpc3Bvc2UiLCJvblBhcmVudERpc3Bvc2luZyIsImlzSW50ZXJuYWwiLCJzZXRBdHRhY2hEYXRhIiwiY2hlY2tRdWVyeSIsImdldFBhcmVudEVscyIsImdldEVsZW0iLCJzZXRBdHRhY2hQYXJlbnREYXRhIiwibGV2ZWwiLCJleGNoYW5nZVZpZXdzV2l0aENoaWxkIiwiY2hpbGRWaWV3IiwiYXBwZW5kVG9Eb21BZnRlciIsInByZXBlbmRUb0RvbSIsImFwcGVuZFZpZXciLCJhcHBlbmRWaWV3QWZ0ZXIiLCJhcHBlbmRWaWV3VG9QYXJlbnRFbCIsInByZXBlbmRWaWV3VG9QYXJlbnRFbCIsInByZXBlbmRWaWV3IiwiX3Bvc3RSZW5kZXJlZENhbGxlZCIsImJlZm9yZUFmdGVyUmVuZGVyIiwiYWZ0ZXJSZW5kZXIiLCJvbkFuaW1GcmFtZUFmdGVyUmVuZGVyZWQiLCJicm9hZGNhc3RFdmVudHMiLCJpbml0aWFsaXplQ2hhbm5lbHMiLCJ2aWV3c1N0cmVhbUJyb2FkY2FzdGVyIiwicHVsbEFjdGlvbnNGcm9tTGlzdCIsIm5lc3RlZEFjdGlvbnNBcnIiLCJjaGVja0ZvckV4aXN0aW5nTWV0aG9kIiwiRnVuY3Rpb24iLCJkZWxheUZvclByb3h5Q2hhbm5lbFJlc2V0cyIsInNldERhdGFWU0lEIiwiZG93blN0cmVhbSIsInNraXBGaXJzdCIsImFkZENoYW5uZWwiLCJzZW5kRG93blN0cmVhbSIsImRpcmVjdGlvbkFyciIsImlzTG9jYWxFdmVudENoZWNrIiwiY2lkQ2hlY2siLCJwaXBlQXJyIiwidW5zaGlmdCIsInNraXAiLCJjaGFubmVsJCIsImNoZWNrSWZDaGFubmVsRXhpc3RzIiwiY2hhbm5lbEV4aXN0cyIsImRlZmF1bHRUb0FjdGlvbiIsImdldEFjdGlvbkZuIiwiQ0hBTk5FTF9ST1VURSIsIm9mIiwiaXNEaXNwb3NlZCIsImNyZWF0ZUFjdGlvbkZpbHRlciIsInNlbGVjdG9ycyIsIml0ZW1FbCIsInRoaXNFbCIsIl9fd2VicGFja19tb2R1bGVfY2FjaGVfXyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImNhY2hlZE1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJuIiwiZ2V0dGVyIiwiX19lc01vZHVsZSIsImRlZmluaXRpb24iLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyJdLCJzb3VyY2VSb290IjoiIn0=
|
|
2
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("rxjs"),require("ramda"),require("dompurify"),require("rxjs").operators):"function"==typeof define&&define.amd?define("spyne",["rxjs","ramda","dompurify","rxjs/operators"],t):"object"==typeof exports?exports.spyne=t(require("rxjs"),require("ramda"),require("dompurify"),require("rxjs").operators):e.spyne=t(e.rxjs,e.R,e.DOMPurify,e.rxjs.operators)}(self,(e,t,r,s)=>(()=>{"use strict";var n={126(e,t,r){r.d(t,{e:()=>i});var s=r(2),n=r(9),o=r(131);class i extends s.c{constructor(e,t={}){i.validateMapMethod(t,e),void 0!==t.map&&(t.mapFn=t.map),t.extendedActionsArr=[`${e}_RESPONSE_EVENT`,[`${e}_REQUEST_EVENT`,"onFetchUpdate"]],t.sendCachedPayload=!0,super(e,t)}static validateMapMethod(e,t,r=!1){const s=(0,o.either)(o.isNil,e=>"function"!=typeof e),n=(0,o.all)(s),i=(0,o.allPass)([n,e=>e.length>=1]);return!(0,o.compose)(i,o.values,(0,o.pick)(["map","mapFn"]))(e)||(!1===r&&console.warn(`Spyne Warning: The map method for ChannelFetch, ${t}, appears to be invalid`),!1)}onRegistered(e=this.props){!0!==e?.pause&&this.startFetch()}addRegisteredActions(e){const t=(0,o.compose)((0,o.defaultTo)([]),(0,o.path)(["props","extendedActionsArr"]));return["CHANNEL_RESPONSE_EVENT",["CHANNEL_UPDATE_RESPONSE_EVENT","onFetchUpdate"],["CHANNEL_FETCH_REQUEST_EVENT","onFetchUpdate"]].concat(t(this))}startFetch(e={},t=this.onFetchReturned.bind(this)){const r=this.consolidateAllFetchProps(e);return new n.G(r,t,!1,this.props.name)}onFetchUpdate(e){const t=this.getPropsForFetch(e);this.startFetch(t)}onFetchReturned(e){return this.createChannelPayloadItem(e)}createChannelPayloadItem(e,t=`${this.props.name}_RESPONSE_EVENT`){const{name:r,sendCachedPayload:s,url:n}=this.props,o={name:r,sendCachedPayload:s,url:n};this.sendChannelPayload(t,e,o)}getPropsForFetch(e){const t=(0,o.path)(["viewStreamInfo","payload"],e);return(0,o.pick)(["mapFn","url","header","body","mode","method","responseType","debug"],t)}consolidateAllFetchProps(e,t=this.props){const r=(0,o.pick)(["mapFn","url","header","body","mode","method","responseType","debug"],t),s=(0,o.reject)(o.isNil);return(0,o.compose)(s,(e,t)=>(0,o.mergeDeepRight)(e,t))(r,e)}get observer(){return this.observer$}}},980(e,t,r){r.d(t,{m:()=>i});var s=r(131),n=r(225),o=r(961);class i{constructor(e,t,r,a,c,l){const d=e;l&&console.time(l);const E={channelName:e,action:t,srcElement:a,event:c},p=i.deepFreeze(r);if(E.payload=p,!0===n.M.debug){if(Object.prototype.hasOwnProperty.call(r,"payload")){const e=JSON.stringify(r);console.warn(`Spyne Warning: the following payload contains a nested payload property which may create conflicts: Action: ${t}, ${e}`)}const e=n.M.getChannelActions(d);i.validateAction(t,d,e)}E.clone=()=>(0,s.mergeAll)([{payload:(0,o.l)(E.payload)},E.payload,{channel:(0,s.clone)(d)},{event:(0,s.clone)(c)},{srcElement:a},(0,s.clone)(E.srcElement),{action:(0,s.clone)(E.action)}]);const h={$dir:{get:()=>E._dir,set:e=>(E._dir=e,e)}};return"CHANNEL_ROUTE"===d&&(h.location={get:()=>i.getLocationData()}),E._dir=void 0,Object.defineProperties(E,h),l&&console.timeEnd(l),E}static validateAction(e,t,r){const o=(0,s.includes)(e,r);return!1===o&&!0===n.M.initialized&&console.warn(`warning: Action: '${e}' is not registered within the ${t} channel!`),o}static getLocationData(){return(0,s.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}static getStreamItem(){}static deepClone(e){const t=(0,s.is)(Array),r=(0,s.is)(Object);var n;return!1===t(n=e)&&!0===r(n)?(0,s.compose)(s.fromPairs,s.toPairs,s.clone)(e):(0,s.clone)(e)}static deepFreeze(e){const t=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));try{Object.freeze(e),Object.getOwnPropertyNames(e).forEach(function(r){!Object.prototype.hasOwnProperty.call(e,r)||!1!==t(e[r])||null===e[r]||"object"!=typeof e[r]&&"function"!=typeof e[r]||Object.isFrozen(e[r])||i.deepFreeze(e[r])})}catch(t){return e}return e}static getMouseEventKeys(){return["altKey","bubbles","cancelBubble","cancelable","clientX","clientY","composed","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","isTrusted","layerX","layerY","metaKey","movementX","movementY","offsetX","offsetY","pageX","pageY","path","relatedTarget","returnValue","screenX","screenY","shiftKey","sourceCapabilities","srcElement","target","timeStamp","toElement","type","view","which","x","y"]}}},683(e,t,r){r.d(t,{w:()=>c});var s=r(2),n=r(225),o=r(968),i=r(131),a=r(64);class c extends s.c{constructor(e,t={}){t.isProxy=!0,super(e,t),this.props=t,this.subject$=new o.Subject,this.replaySub$=new o.ReplaySubject(1),this.observer$=(0,o.merge)(this.subject$,this.replaySub$),!0===n.M.debug&&this.checkIfChannelIsStillProxy(e)}getMergedSubject(e=!1){return!0===e?this.replaySub$:this.subject$}checkIfChannelIsStillProxy(e){const t=e;(0,a.Ir)(()=>{!0!==(0,i.includes)(t,n.M.listRegisteredChannels())&&console.warn(`Spyne Warning: The channel, ${t} does not appear to be registered!`)},1e3)}get replaySubject(){return this.replaySub$}get subject(){return this.subject$}}},2(e,t,r){r.d(t,{c:()=>d});var s=r(584),n=r(980),o=r(225),i=r(521),a=r(968),c=r(531),l=r(131);class d{constructor(e,t={}){this.addRegisteredActions.bind(this),this.createChannelActionsObj(e,t.extendedActionsArr),t.name=e,t.defaultActions=void 0!==t.data?[`${t.name}_EVENT`]:[],this.props=t,this.props.isRegistered=!1,this.props.isProxy=void 0!==this.props.isProxy&&this.props.isProxy;const r=void 0!==this.props.data;void 0!==this.props.replay?this.props.sendCachedPayload=this.props.replay:this.props.sendCachedPayload=void 0===this.props.sendCachedPayload?r:this.props.sendCachedPayload,this.sendPayloadToRouteChannel=new i.g(this),this.createChannelActionMethods(),this.streamsController=o.M.channelsMap;const s=this.getMainObserver();this.checkForPersistentDataMode=d.checkForPersistentDataMode.bind(this),this.observer$=this.props.observer=s;const n=this.streamsController.getStream("DISPATCHER"),a=(0,l.propEq)(t.name,"name");n.pipe((0,c.filter)(a)).subscribe(e=>this.onReceivedObservable(e))}getMainObserver(){return void 0===this.streamsController&&console.warn(`Spyne Warning: The following channel, ${this.props.name}, appears to be registered before Spyne has been initialized.`),!0===this.streamsController.testStream(this.props.name)?this.streamsController.getProxySubject(this.props.name,this.props.sendCachedPayload):!0===this.props.sendCachedPayload?new a.ReplaySubject(1):new a.Subject}onChannelInitialized(){}onRegistered(e=this.props){if(void 0!==e.data){const t=Object.keys(this.channelActions)[0];this.sendChannelPayload(t,e.data)}}get isProxy(){return this.props.isProxy}get channelName(){return this.props.name}get observer(){return this.observer$}checkForTraits(){void 0!==this.props.traits&&(e=>{"Array"!==e.constructor.name&&(e=[e]),e.forEach(e=>new e(this))})(this.props.traits)}initializeStream(){this.checkForTraits(),this.onChannelInitialized(),this.checkForPersistentDataMode(),this.onRegistered(),this.props.isRegistered=!0}static checkForPersistentDataMode(e=this.props,t=this.channelActions){const r=(0,l.isEmpty)(t),s=void 0!==(0,l.prop)("data",e);return!0===r&&!0===s&&(e.sendCachedPayload=!0,t=(()=>{const{name:t}=e,r=`${t}_EVENT`;return{[r]:r}})(),void 0!==this.channelActions&&(this.channelActions=t)),{props:e,actionsObj:t}}setTrace(e){}createChannelActionsObj(e,t=[]){const r=(0,l.ifElse)((0,l.is)(String),l.identity,l.head),s=t.concat(this.addRegisteredActions(e)),n=(0,l.map)(r,s),o=(0,l.mergeAll)((0,l.chain)(e=>(0,l.objOf)(e,e),n));this.channelActions=o}createChannelActionMethods(){const e=(0,l.ifElse)((0,l.is)(String),l.identity,l.head),t=(e,t)=>{window.setTimeout(()=>{"function"!=typeof this[e]&&console.warn(`"${this.props.name}", REQUIRES THE FOLLOWING METHOD ${e} FOR ACTION, ${t[0]}`)},100)},r=(0,l.ifElse)((0,l.is)(String),(0,l.always)("onViewStreamInfo"),e=>{const r=(0,l.view)((0,l.lensIndex)(1),e);return t(r,e),r});this.channelActionMethods=(0,l.fromPairs)((0,l.map)(t=>[e(t),r(t)],this.addRegisteredActions()))}addRegisteredActions(){let e=[];return(0,l.path)(["props","data"],this)&&(e=[`${this.props.name}_EVENT`]),e}onReceivedObservable(e){this.onIncomingObservable(e)}getActionMethodForObservable(e){e.unpacked=!0;const t=this.onViewStreamInfo.bind(this),r=(0,l.path)(["data","action"],e),s=(0,l.prop)(r,this.channelActionMethods);let n=t;return void 0!==s&&"onViewStreamInfo"!==s&&!0==("function"==typeof this[s])&&(n=this[s].bind(this)),n}onIncomingObservable(e){const t=(0,l.equals)(e.name,this.props.name),{action:r,payload:s,srcElement:n}=e.data,o=t=>({clone:()=>{return t=e.data,(0,l.mergeAll)([t,{action:(0,l.prop)("action",t)},(0,l.prop)("payload",t),(0,l.prop)("srcElement",t)]);var t},action:r,payload:s,srcElement:n,event:t});return!0===t?(e=>e.observable.pipe((0,c.map)(o)).subscribe(this.getActionMethodForObservable(e)))(e):void 0}onViewStreamInfo(e){}sendChannelPayload(e,t,r={},s={},o=this.observer$){const i=new n.m(this.props.name,e,t,r,s);o.next(i)}getChannel(e,t){return(0,l.ifElse)(e=>(0,s.ns)().includes(e),r=>{const s=this.streamsController.getStream(r).observer;return s.source?s.source.channelName=e:s.channelName=e,void 0!==t?s.pipe((0,c.filter)(t)):s},e=>console.warn(`channel name ${e} is not within ${s.ns}`))(e)}mergeChannels(e,t=!0){const r=e.map(e=>{if("string"==typeof e){const r=this.getChannel(e);return t?r.pipe((0,c.take)(1)):r}return t?e.pipe((0,c.take)(1)):e});let s;if(t)s=(0,a.forkJoin)(r);else if(0===r.length)s=a.EMPTY;else if(1===r.length)s=r[0];else{const[e,...t]=r;s=e.pipe((0,c.combineLatestWith)(...t))}return s.pipe((0,c.map)(t=>{const r={};return e.forEach((e,s)=>{const n="string"==typeof e?e:`channel_${s}`;r[e?.source?.channelName||e?.source?.source?.channelName||n]=t[s]}),r}))}static checkForNotTrackFlag(e={}){!0===e.doNotTrack&&o.M.doNotTrackChannel(e.channelName)}}},584(e,t,r){r.d(t,{ns:()=>i});var s=r(225),n=r(131),o=r(968);const i=()=>({includes:()=>!0===s.M.initialized?s.M.listRegisteredChannels():["CHANNEL_ROUTE","CHANNEL_UI","CHANNEL_WINDOW","DISPATCHER"]}),a=["LOAD","RENDER","MOUNT","UNMOUNT","DISPOSE","GARBAGE_COLLECT","UPDATE"],c=["parent","self","child","children","view"],l=["Observable","BehaviorSubject","Subject","Observer","Subscriber","FromEventObservable"],d=["subscribe","combineLatest"];let E=[],p=[],h=null,N=null,u=null,m=null,_=null,T=null,A=null;if(void 0!==n.compose&&void 0!==o.Observable){E=[{error:`need to match a valid name within ${l}`,predicate:e=>i().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>void 0!==e.observable.subscribe},{error:"param action must be a registered action",predicate:e=>d.includes(e.action)}],p=[{error:"needs vsid number in srcElement",predicate:(0,n.compose)((0,n.is)(String),(0,n.path)(["data","srcElement","vsid"]))},{error:"needs a id in srcElement",predicate:(0,n.compose)((0,n.is)(String),(0,n.path)(["data","srcElement","id"]))}],h=function(){return[].concat(E).concat(p)};const e=[{error:`need to match a valid name within ${l}`,predicate:e=>i().includes(e.name)},{error:`needs one of the following step strings: ${a}`,predicate:e=>a.includes(e.STEP)},{error:`type needs to one of the following: ${c}`,predicate:e=>c.includes(e.type)},{error:"viewId needs to be added ",predicate:e=>void 0!==e.viewId}];u=function(){return[].concat(e)},m=function(){return[{error:"DISPOSE STEP requires a disposeItem param in the data object",predicate:e=>"DISPOSE"===e.STEP&&void 0!==e.data.disposeItems}].concat(e)},_=function(){return[{error:"UPDATE STEP requires a data object ",predicate:e=>"UPDATE"===e.STEP&&void 0!==e.data}].concat(e)},N=function(){return e.concat(E).concat(p)},T=function(){return[].concat(E).concat(p)},A=function(){const e=[{error:"param 'name' must be of a registered type",predicate:e=>i().includes(e.name)},{error:"param 'observable' must contain a valid Observable",predicate:e=>l.includes((0,e.observable)().constructor.name)},{error:"param action must be a registered action",predicate:e=>d.includes(e.action)}];return{streams:[{init:{name:"DISPATCHER",observable:()=>new o.Subject,action:"subscribe"},structure:{type:String,observable:o.Observable||o.Subject,action:String},validations:e},{init:{name:"UBU",observable:()=>new o.Subject,action:"subscribe"},structure:{type:String,observable:o.Observable||o.Subject,action:String},validations:e}]}}}},470(e,t,r){r.d(t,{H:()=>p});var s=r(68),n=r(303),o=r(597),i=r(205),a=r(59),c=r(968),l=r(683),d=r(131);const E=new Map;class p{constructor(){this.addMixins(),E.set("DISPATCHER",new c.Subject),this.listRegisteredChannels=p.listRegisteredChannels.bind(this),this.getChannelsList=p.getChannelsList.bind(this)}get map(){return E}static getChannelsList(){return Array.from(E,(e,t)=>({key:e[0],val:e[1].constructor.name}))}static listRegisteredChannels(e=!1){const t=this.getChannelsList(),r=(0,d.reject)((0,d.propEq)("ChannelProxy","val")),s=(0,d.filter)((0,d.propEq)("ChannelProxy","val")),n=(!0===e?s:r)(t);return(0,d.pluck)(["key"],n)}listProxyChannels(){return this.listRegisteredChannels(!0)}checkForMissingChannels(){const e=this.getChannelsList(),t=(0,d.filter)((0,d.propEq)("ChannelProxy","val"))(e);if(t.length>=1){const e=`Spyne Warning: The following ${1===t.length?"Channel has":"Channels have"} not been initialized: ${(0,d.compose)((0,d.join)(", "),(0,d.map)((0,d.prop)("key")))(t)}`;console.warn(e)}}init(){this.createMainStreams()}createMainStreams(){this.routeStream=new s.e,E.set("CHANNEL_ROUTE",this.routeStream),this.uiStream=new n.z,E.set("CHANNEL_UI",this.uiStream),this.domStream=new o.x,E.set("CHANNEL_WINDOW",this.domStream),this.viewStreamLifecycle=new i.b,E.set("CHANNEL_LIFECYCLE",this.viewStreamLifecycle),this.aiStream=new a.$,E.set("CHANNEL_AI",this.aiStream),this.routeStream.initializeStream(),this.domStream.initializeStream()}addKeyEvent(e){E.get("UI").addKeyEvent(e)}registerStream(e){const t=e.channelName;E.has(t)&&(0,d.compose)((0,d.pathEq)(["props","isRegistered"],!0))(E.get(t))?console.warn(`Spyne Warning: The Channel, ${t}, has already been registered!`):(E.set(t,e),e.initializeStream())}getChannelActions(e){return E.get(e).addRegisteredActions()}getProxySubject(e,t=!1){const r=!0===t?"replaySubject":"subject";return E.get(e)[r]}testStream(e){return void 0!==E.get(e)}getStream(e){return!1===this.testStream(e)&&E.set(e,new l.w(e)),E.get(e)}addMixins(){}}},59(e,t,r){r.d(t,{$:()=>n});var s=r(2);class n extends s.c{constructor(e={}){super("CHANNEL_AI",e)}addRegisteredActions(){return["CHANNEL_AI_RENDERED_EVENT","CHANNEL_AI_DISPOSED_EVENT"]}onViewStreamInfo(e){const{action:t,srcElement:r}=e,s=r;s.action=t,this.onSendEvent(t,s)}onSendEvent(e,t={}){const r=this.channelActions[e],s={};window.setTimeout(()=>this.sendChannelPayload(r,t,s,void 0),0)}}},205(e,t,r){r.d(t,{b:()=>n});var s=r(2);class n extends s.c{constructor(e={}){super("CHANNEL_LIFECYCLE",e)}addRegisteredActions(){return["CHANNEL_LIFECYCLE_RENDERED_EVENT","CHANNEL_LIFECYCLE_DISPOSED_EVENT"]}onViewStreamInfo(e){const{action:t,srcElement:r}=e,s=r;s.action=t,this.onSendEvent(t,s)}onSendEvent(e,t={}){const r=this.channelActions[e],s={};window.setTimeout(()=>this.sendChannelPayload(r,t,s,void 0),0)}}},68(e,t,r){r.d(t,{e:()=>d});var s=r(2),n=r(511),o=r(167),i=r(225),a=r(968),c=r(531),l=r(131);class d extends s.c{constructor(e="CHANNEL_ROUTE",t={}){t.sendCachedPayload=!0,super("CHANNEL_ROUTE",t),this.createChannelActionsObj(),this.routeConfigJson=this.getRouteConfig(),this.bindStaticMethods(),this.navToStream$=new a.ReplaySubject(1),this.observer$=this.navToStream$.pipe((0,c.map)(e=>this.onMapNext(e))),this.compareRouteKeywords=o.H.compareRouteKeywords()}checkConfigForHash(){!0==("hash"===i.M.config.channels.ROUTE.type)&&(i.M.config.channels.ROUTE.type="slash",i.M.config.channels.ROUTE.isHash=!0)}onRegistered(){this.checkConfigForHash(),this.initStream()}createChannelActionsObj(){const e=this.addRegisteredActions(),t=(0,l.mergeAll)((0,l.chain)(e=>(0,l.objOf)(e,e),e));this.channelActions=t}addRegisteredActions(){return["CHANNEL_ROUTE_DEEPLINK_EVENT","CHANNEL_ROUTE_CHANGE_EVENT","CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",["CHANNEL_ROUTE_UPDATE_CONFIG_EVENT","updateRouteConfig"]]}updateRouteConfig(e){const t=(0,l.pick)(["isHash","isHidden","routes","type"],e.payload);i.M.config.channels.ROUTE=(0,l.mergeRight)(i.M.config.channels.ROUTE,t),i.M.conformRouteConfig();const r=this.getRouteConfig();r.navLinks=[...r?.routeDatasetsArr],this.routeConfigJson=r,this.bindStaticMethodsWithConfigData(),this.sendChannelPayload("CHANNEL_ROUTE_CONFIG_UPDATED_EVENT",r,{},{},this.navToStream$)}getRouteConfig(){const e=i.M.config,t=(0,l.path)(["channels","ROUTE"],e);"query"===t.type&&(t.isHash=!1);const r=o.H.flattenConfigObject(t.routes);return t.paramsArr=r,t}initStream(){this.firstLoadStream$=new a.ReplaySubject(1),this.onIncomingDomEvent(void 0,this.routeConfigJson,"CHANNEL_ROUTE_DEEPLINK_EVENT"),o.H.createPopStateStream(this.onIncomingDomEvent.bind(this)),this.observer$=(0,a.merge)(this.firstLoadStream$,this.navToStream$)}onMapNext(e,t=!1){return e.action="CHANNEL_ROUTE_CHANGE_EVENT",e}static removeSSID(e){const t=(0,l.lensProp)(["routeData"]);return(0,l.over)(t,(0,l.omit)(["vsid"]))(e)}static onIncomingDomEvent(e,t=this.routeConfigJson,r){const s=void 0!==r?r:this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT,n=(0,l.path)(["state","routeCount"],e),o=!0===(0,l.is)(Number,n);let i=this.getDataFromString(t,o);!0===o&&(i.routeCount=n),"CHANNEL_ROUTE_DEEPLINK_EVENT"===r&&(i.navLinks=(0,l.prop)("routeDatasetsArr",t),Object.defineProperty(i,"linksData",{get(){return this.navLinks},set(e){console.warn("set links data is deprecated in ROUTE DEEPLINK DATA, use navLinks")},enumerable:!0}));const a=this.compareRouteKeywords.compare(i.routeData,i.paths);i=(0,l.mergeRight)(i,a),this.sendChannelPayload(s,i,void 0,e,this.navToStream$)}static checkForRouteParamsOverrides(e){return e}static checkForEventMethods(e){const t=(0,l.compose)((0,l.filter)((0,l.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),l.keys,(0,l.prop)("payload"))(e);if(t.length>=1){const r=(0,l.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,l.replace)(/^(event)([A-Z])(.*)([A-Z].*)$/gm,e),n=e=>{const t=s(e);void 0!==r[t]&&r[t]()};t.forEach(n)}}return e}static checkForEndRoute(e,t=this.routeConfigJson,r){if(!0!==(0,l.compose)((0,l.equals)("true"),(0,l.path)(["payload","endRoute"]))(e))return e;const s=void 0!==r?r:!0===i.M.debug,{payload:n}=e;let o=0;const a=(e=[],t)=>{const r=t[1],{routePath:i}=r,c=(0,l.prop)("routeName",i),d=(e=>{const t=(0,l.prop)("routeName",e);if(t){const r=(0,l.compose)(l.keys,(0,l.omit)(["routeName"]))(e),s=n[t],o=e=>new RegExp(`^${e}$`).test(s);return(0,l.find)(o,r)}})(i),E=(0,l.is)(Object,r),p=(0,l.is)(Array,r);if(o+=1,!0===E&&!1===p){const t=i[d];t?(0,l.compose)(l.reverse,(0,l.reduce)(a,e),l.toPairs)({nextRoutePath:t}):1===o?s&&console.warn(`Spyne Warning: use of end route method should add start route value of "${c}".`):e.push(c)}return e},{routes:c}=t,d=(0,l.compose)(l.reverse,(0,l.reduce)(a,[]),l.toPairs)({routes:c});if(1===d.length){const t=d[0];e.payload[t]=""}return e}onViewStreamInfo(e){const t=e.action??this.channelActions.CHANNEL_ROUTE_CHANGE_EVENT;e?.srcElement?.el?.dataset&&(e.payload=function(e){const t={};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(e?.srcElement?.el?.dataset)??e.payload),d.checkForEventMethods(e),e=this.checkForEndRoute(e);let r=this.getDataFromParams(e);const s=(0,l.prop)("srcElement",e),n=(0,l.prop)("event",e),o=!r.isHidden,i=this.compareRouteKeywords.compare(r.routeData,r.paths);r=(0,l.mergeRight)(r,i),this.sendRouteStream(r,o),r=d.removeSSID(r),this.sendChannelPayload(t,r,s,n,this.navToStream$)}static checkAndConvertStrWithRegexTokens(e,t){return(0,l.keys)(t)}sendRouteStream(e,t=!0){!0===t&&this.setWindowLocation(e)}static getRouteState(){return"CHANNEL_ROUTE_CHANGE_EVENT"}static getIsDeepLinkBool(e){return!1===e&&0===this._routeCount}static getRouteCount(e=!1){return void 0===this._routeCount?(this._routeCount=0,this._routeCount):(!1===e&&(this._routeCount+=1),this._routeCount)}static getExtraPayloadParams(e=this.routeConfigJson,t=!1){return{routeCount:this.getRouteCount(t),isDeepLink:this.getIsDeepLinkBool(t),isHash:e.isHash,isHistory:t,isHidden:e.isHidden,routeType:e.type}}static getDataFromParams(e,t=this.routeConfigJson){let r=(0,l.prop)("payload",e);const s=this.getRouteStrFromParams(r,t),o=(e,r)=>(0,l.defaultTo)(r,(0,l.prop)(e,t)),i=o("type","slash"),a=o("isHash",!1),c=n.Q.formatStrAsWindowLocation(s),d=this.getDataFromLocationStr(i,a,c),{pathInnermost:E,paths:p}=d;r=(0,l.mergeRight)(d.routeData,r);const{routeCount:h,isDeepLink:N,isHash:u,isHistory:m,isHidden:_,routeType:T}=this.getExtraPayloadParams(t);return{isDeepLink:N,routeCount:h,pathInnermost:E,paths:p,routeData:r,routeValue:s,isHash:u,isHidden:_,isHistory:m,routeType:T}}static getDataFromString(e=this.routeConfigJson,t=!1){const r=e.type,s=!0===e.isHash,o=n.Q.getLocationStrByType(r,s),{paths:i,pathInnermost:a,routeData:c,routeValue:l}=d.getParamsFromRouteStr(o,e,r),{routeCount:E,isDeepLink:p,isHash:h,routeType:N,isHidden:u}=this.getExtraPayloadParams(e,t);return{isDeepLink:p,routeCount:E,pathInnermost:a,paths:i,routeData:c,routeValue:l,isHash:h,isHidden:u,isHistory:t,routeType:N}}static getDataFromLocationStr(e="slash",t=this.routeConfigJson.isHash,r=window.location){const s=void 0!==this.routeConfigJson?this.routeConfigJson.type:e,o=n.Q.getLocationStrByType(s,t,r),{paths:i,pathInnermost:a,routeData:c,routeValue:l}=this.getParamsFromRouteStr(o,this.routeConfigJson,s);return{paths:i,pathInnermost:a,routeData:c,routeValue:l,action:this.getRouteState()}}static getLocationData(){return(0,l.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}static getRouteStrFromParams(e,t,r){const s=void 0!==r?r:t.type;return n.Q.convertParamsToRoute(e,t,s)}static getParamsFromRouteStr(e,t,r){const s=void 0!==r?r:t.type;return n.Q.convertRouteToParams(e,t,s)}checkEmptyRouteStr(e,t=!1){const r=(0,l.isEmpty)(e);return!0==(!0===r&&!1===t)||!0==(!0===r&&!0===t)?"/":!0==(!1===r&&!0===t)?(0,l.concat)("#",e):e}static removeLastSlash(e){return e.replace(/^(.*)(\/)$/,"$1")}setWindowLocation(e){let{isHash:t,routeValue:r,routeType:s}=e;r=this.checkEmptyRouteStr(r,t);const{routeCount:n}=e;if(!0===t||"query"===s)r=d.removeLastSlash(window.location.pathname)+r,window.history.pushState({routeCount:n},"",r);else{const e=(0,l.when)((0,l.compose)((0,l.complement)((0,l.equals)("/")),l.head),(0,l.concat)("/",l.__));window.history.pushState({routeCount:n},"",e(r))}}getWindowLocation(){return window.location.pathname}bindStaticMethods(){this.checkForEndRoute=d.checkForEndRoute.bind(this),this.getIsDeepLinkBool=d.getIsDeepLinkBool.bind(this),this.getDataFromLocationStr=d.getDataFromLocationStr.bind(this),this.onIncomingDomEvent=d.onIncomingDomEvent.bind(this),this.getDataFromString=d.getDataFromString.bind(this),this.getParamsFromRouteStr=d.getParamsFromRouteStr.bind(this),this.getLocationData=d.getLocationData.bind(this),this.getRouteState=d.getRouteState.bind(this),this.getDataFromParams=d.getDataFromParams.bind(this),this.getRouteCount=d.getRouteCount.bind(this),this.getExtraPayloadParams=d.getExtraPayloadParams.bind(this),this.bindStaticMethodsWithConfigData()}bindStaticMethodsWithConfigData(){const e=(0,l.curryN)(3,d.getRouteStrFromParams);this.getRouteStrFromParams=e(l.__,this.routeConfigJson,this.routeConfigJson.type)}}},303(e,t,r){r.d(t,{z:()=>c});var s=r(2),n=r(968),o=r(531),i=r(131),a=r(672);class c extends s.c{constructor(e="CHANNEL_UI",t={}){t.sendCachedPayload=!1,super(e,t),this.keyEventsLoaded=!1,this.keyCodeArr=[]}addRegisteredActions(){return["CHANNEL_UI_DOMCONTENTLOADED_EVENT","CHANNEL_UI_ABORT_EVENT","CHANNEL_UI_ACTIVATE_EVENT","CHANNEL_UI_ADDTRACK_EVENT","CHANNEL_UI_AFTERPRINT_EVENT","CHANNEL_UI_AFTERSCRIPTEXECUTE_EVENT","CHANNEL_UI_ANIMATIONCANCEL_EVENT","CHANNEL_UI_ANIMATIONEND_EVENT","CHANNEL_UI_ANIMATIONITERATION_EVENT","CHANNEL_UI_ANIMATIONSTART_EVENT","CHANNEL_UI_APPINSTALLED_EVENT","CHANNEL_UI_AUDIOEND_EVENT","CHANNEL_UI_AUDIOSTART_EVENT","CHANNEL_UI_AUXCLICK_EVENT","CHANNEL_UI_BEFOREINPUT_EVENT","CHANNEL_UI_BEFOREPRINT_EVENT","CHANNEL_UI_BEFOREUNLOAD_EVENT","CHANNEL_UI_BEGINEVENT_EVENT","CHANNEL_UI_BLOCKED_EVENT","CHANNEL_UI_BLUR_EVENT","CHANNEL_UI_BOUNDARY_EVENT","CHANNEL_UI_BUFFEREDAMOUNTLOW_EVENT","CHANNEL_UI_CANCEL_EVENT","CHANNEL_UI_CANPLAY_EVENT","CHANNEL_UI_CANPLAYTHROUGH_EVENT","CHANNEL_UI_CHANGE_EVENT","CHANNEL_UI_CLICK_EVENT","CHANNEL_UI_CLOSE_EVENT","CHANNEL_UI_CLOSING_EVENT","CHANNEL_UI_COMPLETE_EVENT","CHANNEL_UI_COMPOSITIONEND_EVENT","CHANNEL_UI_COMPOSITIONSTART_EVENT","CHANNEL_UI_COMPOSITIONUPDATE_EVENT","CHANNEL_UI_CONNECT_EVENT","CHANNEL_UI_CONNECTIONSTATECHANGE_EVENT","CHANNEL_UI_CONTENTDELETE_EVENT","CHANNEL_UI_CONTEXTMENU_EVENT","CHANNEL_UI_COPY_EVENT","CHANNEL_UI_CUECHANGE_EVENT","CHANNEL_UI_CUT_EVENT","CHANNEL_UI_DATACHANNEL_EVENT","CHANNEL_UI_DBLCLICK_EVENT","CHANNEL_UI_DEVICECHANGE_EVENT","CHANNEL_UI_DEVICEMOTION_EVENT","CHANNEL_UI_DEVICEORIENTATION_EVENT","CHANNEL_UI_DRAG_EVENT","CHANNEL_UI_DRAGEND_EVENT","CHANNEL_UI_DRAGENTER_EVENT","CHANNEL_UI_DRAGLEAVE_EVENT","CHANNEL_UI_DRAGOVER_EVENT","CHANNEL_UI_DRAGSTART_EVENT","CHANNEL_UI_DROP_EVENT","CHANNEL_UI_DURATIONCHANGE_EVENT","CHANNEL_UI_EMPTIED_EVENT","CHANNEL_UI_END_EVENT","CHANNEL_UI_ENDEVENT_EVENT","CHANNEL_UI_ENDED_EVENT","CHANNEL_UI_ENTERPICTUREINPICTURE_EVENT","CHANNEL_UI_ERROR_EVENT","CHANNEL_UI_FOCUS_EVENT","CHANNEL_UI_FOCUSIN_EVENT","CHANNEL_UI_FOCUSOUT_EVENT","CHANNEL_UI_FORMDATA_EVENT","CHANNEL_UI_FULLSCREENCHANGE_EVENT","CHANNEL_UI_FULLSCREENERROR_EVENT","CHANNEL_UI_GAMEPADCONNECTED_EVENT","CHANNEL_UI_GAMEPADDISCONNECTED_EVENT","CHANNEL_UI_GATHERINGSTATECHANGE_EVENT","CHANNEL_UI_GESTURECHANGE_EVENT","CHANNEL_UI_GESTUREEND_EVENT","CHANNEL_UI_GESTURESTART_EVENT","CHANNEL_UI_GOTPOINTERCAPTURE_EVENT","CHANNEL_UI_HASHCHANGE_EVENT","CHANNEL_UI_ICECANDIDATE_EVENT","CHANNEL_UI_ICECANDIDATEERROR_EVENT","CHANNEL_UI_ICECONNECTIONSTATECHANGE_EVENT","CHANNEL_UI_ICEGATHERINGSTATECHANGE_EVENT","CHANNEL_UI_INPUT_EVENT","CHANNEL_UI_INPUTSOURCESCHANGE_EVENT","CHANNEL_UI_INSTALL_EVENT","CHANNEL_UI_INVALID_EVENT","CHANNEL_UI_KEYDOWN_EVENT","CHANNEL_UI_KEYUP_EVENT","CHANNEL_UI_LANGUAGECHANGE_EVENT","CHANNEL_UI_LEAVEPICTUREINPICTURE_EVENT","CHANNEL_UI_LOAD_EVENT","CHANNEL_UI_LOADEDDATA_EVENT","CHANNEL_UI_LOADEDMETADATA_EVENT","CHANNEL_UI_LOADEND_EVENT","CHANNEL_UI_LOADSTART_EVENT","CHANNEL_UI_LOSTPOINTERCAPTURE_EVENT","CHANNEL_UI_MARK_EVENT","CHANNEL_UI_MERCHANTVALIDATION_EVENT","CHANNEL_UI_MESSAGE_EVENT","CHANNEL_UI_MESSAGEERROR_EVENT","CHANNEL_UI_MOUSEDOWN_EVENT","CHANNEL_UI_MOUSEENTER_EVENT","CHANNEL_UI_MOUSELEAVE_EVENT","CHANNEL_UI_MOUSEMOVE_EVENT","CHANNEL_UI_MOUSEOUT_EVENT","CHANNEL_UI_MOUSEOVER_EVENT","CHANNEL_UI_MOUSEUP_EVENT","CHANNEL_UI_MUTE_EVENT","CHANNEL_UI_NEGOTIATIONNEEDED_EVENT","CHANNEL_UI_NOMATCH_EVENT","CHANNEL_UI_NOTIFICATIONCLICK_EVENT","CHANNEL_UI_OFFLINE_EVENT","CHANNEL_UI_ONLINE_EVENT","CHANNEL_UI_OPEN_EVENT","CHANNEL_UI_ORIENTATIONCHANGE_EVENT","CHANNEL_UI_PAGEHIDE_EVENT","CHANNEL_UI_PAGESHOW_EVENT","CHANNEL_UI_PASTE_EVENT","CHANNEL_UI_PAUSE_EVENT","CHANNEL_UI_PAYERDETAILCHANGE_EVENT","CHANNEL_UI_PAYMENTMETHODCHANGE_EVENT","CHANNEL_UI_PLAY_EVENT","CHANNEL_UI_PLAYING_EVENT","CHANNEL_UI_POINTERCANCEL_EVENT","CHANNEL_UI_POINTERDOWN_EVENT","CHANNEL_UI_POINTERENTER_EVENT","CHANNEL_UI_POINTERLEAVE_EVENT","CHANNEL_UI_POINTERLOCKCHANGE_EVENT","CHANNEL_UI_POINTERLOCKERROR_EVENT","CHANNEL_UI_POINTERMOVE_EVENT","CHANNEL_UI_POINTEROUT_EVENT","CHANNEL_UI_POINTEROVER_EVENT","CHANNEL_UI_POINTERUP_EVENT","CHANNEL_UI_POPSTATE_EVENT","CHANNEL_UI_PROGRESS_EVENT","CHANNEL_UI_PUSH_EVENT","CHANNEL_UI_PUSHSUBSCRIPTIONCHANGE_EVENT","CHANNEL_UI_RATECHANGE_EVENT","CHANNEL_UI_READYSTATECHANGE_EVENT","CHANNEL_UI_REJECTIONHANDLED_EVENT","CHANNEL_UI_REMOVETRACK_EVENT","CHANNEL_UI_REMOVESTREAM_EVENT","CHANNEL_UI_REPEATEVENT_EVENT","CHANNEL_UI_RESET_EVENT","CHANNEL_UI_RESIZE_EVENT","CHANNEL_UI_RESOURCETIMINGBUFFERFULL_EVENT","CHANNEL_UI_RESULT_EVENT","CHANNEL_UI_RESUME_EVENT","CHANNEL_UI_SCROLL_EVENT","CHANNEL_UI_SEARCH_EVENT","CHANNEL_UI_SEEKED_EVENT","CHANNEL_UI_SEEKING_EVENT","CHANNEL_UI_SELECT_EVENT","CHANNEL_UI_SELECTEDCANDIDATEPAIRCHANGE_EVENT","CHANNEL_UI_SELECTEND_EVENT","CHANNEL_UI_SELECTIONCHANGE_EVENT","CHANNEL_UI_SELECTSTART_EVENT","CHANNEL_UI_SHIPPINGADDRESSCHANGE_EVENT","CHANNEL_UI_SHIPPINGOPTIONCHANGE_EVENT","CHANNEL_UI_SIGNALINGSTATECHANGE_EVENT","CHANNEL_UI_SLOTCHANGE_EVENT","CHANNEL_UI_SOUNDEND_EVENT","CHANNEL_UI_SOUNDSTART_EVENT","CHANNEL_UI_SPEECHEND_EVENT","CHANNEL_UI_SPEECHSTART_EVENT","CHANNEL_UI_SQUEEZE_EVENT","CHANNEL_UI_SQUEEZEEND_EVENT","CHANNEL_UI_SQUEEZESTART_EVENT","CHANNEL_UI_STALLED_EVENT","CHANNEL_UI_START_EVENT","CHANNEL_UI_STATECHANGE_EVENT","CHANNEL_UI_STORAGE_EVENT","CHANNEL_UI_SUBMIT_EVENT","CHANNEL_UI_SUCCESS_EVENT","CHANNEL_UI_SUSPEND_EVENT","CHANNEL_UI_TIMEOUT_EVENT","CHANNEL_UI_TIMEUPDATE_EVENT","CHANNEL_UI_TOGGLE_EVENT","CHANNEL_UI_TONECHANGE_EVENT","CHANNEL_UI_TOUCHCANCEL_EVENT","CHANNEL_UI_TOUCHEND_EVENT","CHANNEL_UI_TOUCHMOVE_EVENT","CHANNEL_UI_TOUCHSTART_EVENT","CHANNEL_UI_TRACK_EVENT","CHANNEL_UI_TRANSITIONCANCEL_EVENT","CHANNEL_UI_TRANSITIONEND_EVENT","CHANNEL_UI_TRANSITIONRUN_EVENT","CHANNEL_UI_TRANSITIONSTART_EVENT","CHANNEL_UI_UNHANDLEDREJECTION_EVENT","CHANNEL_UI_UNLOAD_EVENT","CHANNEL_UI_UNMUTE_EVENT","CHANNEL_UI_UPGRADENEEDED_EVENT","CHANNEL_UI_VERSIONCHANGE_EVENT","CHANNEL_UI_VISIBILITYCHANGE_EVENT","CHANNEL_UI_VOICESCHANGED_EVENT","CHANNEL_UI_VOLUMECHANGE_EVENT","CHANNEL_UI_VRDISPLAYACTIVATE_EVENT","CHANNEL_UI_VRDISPLAYBLUR_EVENT","CHANNEL_UI_VRDISPLAYCONNECT_EVENT","CHANNEL_UI_VRDISPLAYDEACTIVATE_EVENT","CHANNEL_UI_VRDISPLAYDISCONNECT_EVENT","CHANNEL_UI_VRDISPLAYFOCUS_EVENT","CHANNEL_UI_VRDISPLAYPOINTERRESTRICTED_EVENT","CHANNEL_UI_VRDISPLAYPOINTERUNRESTRICTED_EVENT","CHANNEL_UI_VRDISPLAYPRESENTCHANGE_EVENT","CHANNEL_UI_WAITING_EVENT","CHANNEL_UI_WEBGLCONTEXTCREATIONERROR_EVENT","CHANNEL_UI_WEBGLCONTEXTLOST_EVENT","CHANNEL_UI_WEBGLCONTEXTRESTORED_EVENT","CHANNEL_UI_WEBKITMOUSEFORCECHANGED_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEDOWN_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEUP_EVENT","CHANNEL_UI_WEBKITMOUSEFORCEWILLBEGIN_EVENT","CHANNEL_UI_WHEEL_EVENT"]}loadKeyStream(){const e=n.Observable.fromEvent(document,"keyup");this.keyPresses$=e.groupBy(e=>e.keyCode).mergeAll().filter(e=>this.keyCodeArr.indexOf(e.keyCode)>=0).repeat().subscribe(this.onKeyPressed.bind(this))}addKeyEvent(e){!1===this.keyEventsLoaded&&this.loadKeyStream(),this.keyEventsLoaded=!0,this.registerKey(e)}registerKey(e){this.keyCodeArr.push(e)}onKeyPressed(e){}static removeSSID(e){const t=(0,i.lensProp)(["payload"]);return(0,i.over)(t,(0,i.omit)(["vsid"]))(e)}onIncomingObservable(e){const t=(0,i.equals)(e.name,this.props.name);e.data=c.removeSSID(e.data);const{payload:r,srcElement:s}=e.data,n=e=>({payload:r,srcElement:s,event:e});return!0===t?(e=>e.observable.pipe((0,o.map)(n)).subscribe(this.onUIEvent.bind(this)))(e):void 0}getActionState(e){const t=(0,i.path)(["event","type"]),r=(0,i.path)(["event","typeOverRide"]),s=(0,i.compose)(i.toUpper,(0,i.either)(r,t))(e),n="CHANNEL_UI";return void 0!==s?`${n}_${s}_EVENT`:n}static checkForEventMethods(e){const t=(0,i.compose)((0,i.filter)((0,i.test)(/^(event)([A-Z].*)([A-Z].*)$/gm)),i.keys,(0,i.prop)("payload"))(e);if(t.length>=1){const r=(0,i.prop)("event",e);if(void 0!==r){const e=(e,t,r,s,n)=>String(r).toLowerCase()+s+n,s=(0,i.replace)(/^(event)([A-Z])(.*)([A-Z].*)$/gm,e),n=e=>{const t=s(e);void 0!==r[t]&&"function"==typeof r[t]&&r[t]()};t.forEach(n)}}return e}onUIEvent(e){e.payload=function(e){const t={};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return t}(e?.srcElement?.el?.dataset)??e.payload,c.checkForEventMethods(e),e.action=this.getActionState(e);const t=e.action,{payload:r,srcElement:s}=e,n=e.event;(0,a.v8)(n?.target),this.sendChannelPayload(t,r,s,n)}}},597(e,t,r){r.d(t,{x:()=>E});var s=r(2),n=r(64),o=r(225),i=r(432),a=r(968),c=r(531),l=r(131),d=r(907);class E extends s.c{constructor(e="CHANNEL_WINDOW"){super(e),this.bindStaticMethods(),this.currentScrollY=0}initializeStream(){this.domChannelConfig=o.M.config.channels.WINDOW;const e=this.getActiveObservables(),t=(0,a.merge)(...e);this.dom$=t,t.subscribe(e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n)})}static getMouseWheelMapFn(e){const t=this.channelActions.CHANNEL_WINDOW_WHEEL_EVENT,r=e.deltaY<=0?"up":"down",{deltaX:s,deltaY:n,deltaZ:o}=e;return{action:t,payload:{scrollDir:r,deltaX:s,deltaY:n,deltaZ:o},srcElement:e.srcElement,event:e}}static createCurriedGenericEvent(e){const t=`CHANNEL_WINDOW_${e.toUpperCase()}_EVENT`;return(0,l.curry)(E.mapGenericEvent)(t)}static mapGenericEvent(e,t){return{action:e,payload:t,srcElement:t.srcElement,event:t}}static getResizeMapFn(e){return{action:this.channelActions.CHANNEL_WINDOW_RESIZE_EVENT,payload:(0,l.pick)(["innerWidth","innerHeight","outerWidth","outerHeight"],window),srcElement:e.srcElement,event:e}}static getOrientationMapFn(e){const t=this.channelActions.CHANNEL_WINDOW_ORIENTATION_EVENT,r=window.matchMedia("(orientation: portrait)").matches,s=(0,l.pick)(["innerWidth","innerHeight","outerWidth","outerHeight"],window);return s.orientation=!0===r?"portrait":"landscape",{action:t,payload:s,srcElement:e.srcElement,event:e}}getMediaQueryMapFn(e){return{action:this.channelActions.CHANNEL_WINDOW_MEDIA_QUERY_EVENT,payload:(0,l.pick)(["matches","media","mediaQueryName"],e),srcElement:e.srcElement,event:e}}createMouseWheelObservable(e){const t=e.debounceMSTimeForScroll;return i.Y.createDomObservableFromEvent("wheel",E.getMouseWheelMapFn.bind(this)).pipe((0,c.debounceTime)(t))}static getScrollData(){let e=0;return t=>{const r=e-t;return e=t,{scrollY:t,scrollDistance:r,scrollDir:r>=0?"up":"down"}}}static getScrollY(e){return void 0!==e.pageYOffset?e.pageYOffset:e.scrollTop}static getScrollMapFn(e,t,r,s,n){const o=s(E.getScrollY(n)),{scrollDistance:i}=o;return{action:r,payload:o,srcElement:e.srcElement,scrollDistance:i,event:e}}createScrollObservable(e,t=window,r=!0){const s=e.debounceMSTimeForScroll,n=t,o=t===window,a=void 0!==e.scrollElForVals?e.scrollElForVals:t,d=o?"CHANNEL_WINDOW_SCROLL_EVENT":"CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT",p=E.getScrollData(),h=(0,l.partialRight)(E.getScrollMapFn,[d,p,a,r,n]).bind(this);return i.Y.createDomObservableFromEvent("scroll",h,r,n).pipe((0,c.debounceTime)(s),(0,c.skipWhile)(e=>0===e.scrollDistance),(0,c.map)(e=>{const t=E.getScrollY(n);return e.payload.scrollDistanceAbs=Math.abs(this.currentScrollY-t),this.currentScrollY=t,e}))}createOrientationObservable(e){return i.Y.createDomObservableFromEvent("orientationchange",E.getOrientationMapFn.bind(this))}createResizeObservable(e){const t=e.debounceMSTimeForResize;return i.Y.createDomObservableFromEvent("resize",E.getResizeMapFn.bind(this)).pipe((0,c.debounceTime)(t))}getEventsFromConfig(e=this.domChannelConfig){const t=e.events;return(0,l.map)(e=>{const t=E.createCurriedGenericEvent(e);return i.Y.createDomObservableFromEvent(e,t)},t)}getActiveObservables(e=this.domChannelConfig){let t=[];e.listenForMediaQueries=(0,n.RK)(e.mediaQueries)||(0,n.RK)(e.mediaQueries);const r={listenForResize:this.createResizeObservable.bind(this),listenForOrientation:this.createOrientationObservable.bind(this),listenForScroll:this.createScrollObservable.bind(this),listenForWheel:this.createMouseWheelObservable.bind(this)};(0,l.mapObjIndexed)((r,s,n)=>{e[s]&&t.push(r(e))},r),this.checkForMediaQueries(e.listenForMediaQueries);const s=this.getEventsFromConfig(e);return t=t.concat(s),t}checkForMediaQueries(e){!0===e&&this.getMediaQueryObservable(this.domChannelConfig).subscribe(e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n,this.observer$)})}getMediaQueryObservable(e){const t=this.createMergedObsFromObj(e);return(0,l.apply)(a.merge,t).pipe((0,c.map)(this.getMediaQueryMapFn.bind(this)))}addRegisteredActions(){return["CHANNEL_WINDOW_ABORT_EVENT","CHANNEL_WINDOW_AFTERPRINT_EVENT","CHANNEL_WINDOW_ANIMATIONEND_EVENT","CHANNEL_WINDOW_ANIMATIONITERATION_EVENT","CHANNEL_WINDOW_ANIMATIONSTART_EVENT","CHANNEL_WINDOW_APPINSTALLED_EVENT","CHANNEL_WINDOW_BEFOREPRINT_EVENT","CHANNEL_WINDOW_BEFOREUNLOAD_EVENT","CHANNEL_WINDOW_BEGINEVENT_EVENT","CHANNEL_WINDOW_BLUR_EVENT","CHANNEL_WINDOW_CACHED_EVENT","CHANNEL_WINDOW_CHANGE_EVENT","CHANNEL_WINDOW_CLICK_EVENT","CHANNEL_WINDOW_CLOSE_EVENT","CHANNEL_WINDOW_COMPOSITIONEND_EVENT","CHANNEL_WINDOW_COMPOSITIONSTART_EVENT","CHANNEL_WINDOW_COMPOSITIONUPDATE_EVENT","CHANNEL_WINDOW_COPY_EVENT","CHANNEL_WINDOW_CUT_EVENT","CHANNEL_WINDOW_DBLCLICK_EVENT","CHANNEL_WINDOW_DEVICECHANGE_EVENT","CHANNEL_WINDOW_DEVICELIGHT_EVENT","CHANNEL_WINDOW_DEVICEMOTION_EVENT","CHANNEL_WINDOW_DEVICEORIENTATION_EVENT","CHANNEL_WINDOW_DEVICEPROXIMITY_EVENT","CHANNEL_WINDOW_DOMATTRIBUTENAMECHANGED_EVENT","CHANNEL_WINDOW_DOMATTRMODIFIED_EVENT","CHANNEL_WINDOW_DOMCHARACTERDATAMODIFIED_EVENT","CHANNEL_WINDOW_DOMCONTENTLOADED_EVENT","CHANNEL_WINDOW_DOMCONTENTLOADED_EVENT","CHANNEL_WINDOW_DOMELEMENTNAMECHANGED_EVENT","CHANNEL_WINDOW_DRAGEND_EVENT","CHANNEL_WINDOW_DRAGENTER_EVENT","CHANNEL_WINDOW_DRAGLEAVE_EVENT","CHANNEL_WINDOW_DRAGOVER_EVENT","CHANNEL_WINDOW_DRAGSTART_EVENT","CHANNEL_WINDOW_DRAG_EVENT","CHANNEL_WINDOW_DROP_EVENT","CHANNEL_WINDOW_ELEMENT_SCROLL_EVENT","CHANNEL_WINDOW_ERROR_EVENT","CHANNEL_WINDOW_FOCUSIN_EVENT","CHANNEL_WINDOW_FOCUS_EVENT","CHANNEL_WINDOW_FULLSCREENCHANGE_EVENT","CHANNEL_WINDOW_FULLSCREENERROR_EVENT","CHANNEL_WINDOW_HASHCHANGE_EVENT","CHANNEL_WINDOW_INPUT_EVENT","CHANNEL_WINDOW_INVALID_EVENT","CHANNEL_WINDOW_KEYDOWN_EVENT","CHANNEL_WINDOW_KEYPRESS_EVENT","CHANNEL_WINDOW_KEYUP_EVENT","CHANNEL_WINDOW_LOAD_EVENT","CHANNEL_WINDOW_MEDIA_QUERY_EVENT","CHANNEL_WINDOW_MESSAGE_EVENT","CHANNEL_WINDOW_MOUSEDOWN_EVENT","CHANNEL_WINDOW_MOUSEENTER_EVENT","CHANNEL_WINDOW_MOUSELEAVE_EVENT","CHANNEL_WINDOW_MOUSEMOVE_EVENT","CHANNEL_WINDOW_MOUSEOUT_EVENT","CHANNEL_WINDOW_MOUSEOVER_EVENT","CHANNEL_WINDOW_MOUSEUP_EVENT","CHANNEL_WINDOW_MOUSEWHEEL_EVENT","CHANNEL_WINDOW_OFFLINE_EVENT","CHANNEL_WINDOW_ONLINE_EVENT","CHANNEL_WINDOW_OPEN_EVENT","CHANNEL_WINDOW_ORIENTATION_EVENT","CHANNEL_WINDOW_PAGEHIDE_EVENT","CHANNEL_WINDOW_PAGESHOW_EVENT","CHANNEL_WINDOW_PASTE_EVENT","CHANNEL_WINDOW_POPSTATE_EVENT","CHANNEL_WINDOW_POPSTATE_EVENT","CHANNEL_WINDOW_PROGRESSEVENTS_EVENT","CHANNEL_WINDOW_RESET_EVENT","CHANNEL_WINDOW_RESIZE_EVENT","CHANNEL_WINDOW_SCROLL_ELEMENT_ADDED_EVENT","CHANNEL_WINDOW_SCROLL_EVENT","CHANNEL_WINDOW_SCROLL_LOCK_EVENT",["CHANNEL_WINDOW_SCROLL_LOCK_EVENT","onScrollLockEvent"],["CHANNEL_WINDOW_SET_ELEMENT_TO_SCROLL_EVENT","onSetElementToScroll"],"CHANNEL_WINDOW_STORAGE_EVENT","CHANNEL_WINDOW_SUBMIT_EVENT","CHANNEL_WINDOW_TRANSITIONCANCEL_EVENT","CHANNEL_WINDOW_TRANSITIONEND_EVENT","CHANNEL_WINDOW_TRANSITIONRUN_EVENT","CHANNEL_WINDOW_TRANSITIONSTART_EVENT","CHANNEL_WINDOW_UNLOAD_EVENT","CHANNEL_WINDOW_WHEEL_EVENT"]}onScrollLockEvent(e){}onSetElementToScroll(e){let{config:t,el:r,scrollElement:s}=e.payload;t=t||{},t=(0,d.$)(this.domChannelConfig,t),s=s||r,this.sendChannelPayload("CHANNEL_WINDOW_SCROLL_ELEMENT_ADDED_EVENT",{el:r},r),this.createScrollObservable(t,s).subscribe(e=>{const{action:t,payload:r,srcElement:s,event:n}=e;this.sendChannelPayload(t,r,s,n)})}bindStaticMethods(){this.createMediaQueryHandler=i.Y.createMediaQueryHandler.bind(this),this.createMergedObsFromObj=i.Y.createMergedObsFromObj.bind(this)}}},713(e,t,r){r.d(t,{D:()=>E});var s=r(470),n=r(173),o=r(167),i=r(225),a=r(49),c=r(672);const l=new s.H,d="0.22.3";let E=new class{constructor(){this.version=d}get channels(){return l}init(e={},t=!1){if(!0===i.M.initialized)return t?"The Spyne Application has already been initialized!":void console.warn("The Spyne Application has already been initialized!");let r={scrollLock:!1,scrollLockX:31,scrollLockY:0,debug:!1,strict:!1,baseHref:void 0,IMG_PATH:"undefined"!=typeof IMG_PATH?IMG_PATH:void 0,pluginMethods:{},plugins:{},tmp:{},ephemeralProps:{},tmpProps:{},channels:{WINDOW:{mediaQueries:{},events:[],listenForResize:!0,listenForOrientation:!0,listenForScroll:!1,listenForMouseWheel:!1,listenForWheel:!1,debounceMSTimeForResize:200,debounceMSTimeForScroll:150},ROUTE:{type:"slash",isHash:!1,isHidden:!1,add404s:!1,routes:{routePath:{routeName:"change"}}}}};if(void 0!==e){const t=o.H;e=i.M.initialize(r,e,l,t)}this.pluginsFn=i.M.getPluginsMethodObj(e.pluginMethods),this.getChannelActions=e=>l.getChannelActions(e),this.registerChannel=e=>l.registerStream(e),this.registerPlugin=e=>i.M.registerPlugin(e),this.registerDataChannel=e=>l.registerStream(e),this.listChannels=()=>Array.from(l.map.keys());let s=new n.A({id:"spyne-null-views"});s.appendToDom(document.body),s.props.el.style.cssText="display:none; opacity:0; pointer-events:none;",l.init(),!0===i.M.config.debug&&(window.Spyne={version:d}),(0,a.D)(i.M.config),(0,c.oG)(i.M.config)}static listChannels(){return Array.from(l.map.keys())}static getChannelActions(e){return l.getChannelActions(e)}static registerChannel(e){if(!1!==i.M.initialized)return l.registerStream(e);console.warn("Spyne has not been initialized")}}},930(e,t,r){r.d(t,{V:()=>a});var s=r(192),n=r(225),o=r(131);let i=n.M;class a{constructor(e={}){let{name:t,config:r,parentEl:s}=e;this.props=e,void 0===r&&(r=(0,o.clone)(e)),this.name=t||"empty",this.props.name=t,r=a.mergeDefaultConfig(r,this.defaultConfig()),this.props.parentEl=s||a.createParentEl(),this.props.config=r,void 0!==this.props.traits&&this.addTraits(this.props.traits)}register(e){i=e,this.props.pluginName=this.props.name,!1!==i.initialized?(this.onBeforeRegistered(),this.props.config=(0,o.clone)(this.props.config),i.addPluginConfig(this.name,this.props.config),this.onRegistered(),this.onRender()):console.warn(`Spyne Warning: SpyneApp has not been initialized yet! Cannot register plugin "${this.name}".`)}get SpyneAppProperties(){return i}static mergeDefaultConfig(e={},t=this.defaultConfig()){return Object.assign(t,e)}static getSpyneApp(e,t){!1===i.initialized?console.warn(`Spyne Warning: Unable to install plugin, ${e}! SpyneApp has not been initialized!`):i.addPluginConfig(e,t)}static updateSpyneConfig(e,t,r){return!0===(0,o.pathSatisfies)((0,o.is)(Object),["config","plugins",t])(e)?(!0===e.config.debug&&console.warn(`Spyne Warning: The plugin, ${t}, already exists`),!1):(e.config.plugins[t]=r,e.config.plugins[t])}static createParentEl(e){return e||document.getElementById("spyne-plugins")||(()=>{const e=new s.r({id:"spyne-plugins"});document.body.appendChild(e.render());const t=document.getElementById("spyne-plugins");return t.style.cssText="position:absolute; top:0;left:0;width:100%;height:100%;min-height:100vh;z-index:1000000; pointer-events:none",t})()}addTraits(e){"Array"!==e.constructor.name&&(e=[e]),e.forEach(e=>new e(this))}onBeforeRegistered(){this.checkForRequiredWindowEvent()}checkForRequiredWindowEvent(){const e=this.props.requiredEvents??[],t=n.M.getChannelConfig("WINDOW"),r=e.filter(e=>!t.events.includes(e));r.length>0&&console.warn(`plugin "${this.props.name}" requires the following config.WINDOW.events, --\x3e ${r.join(", ")} <--`)}defaultConfig(){return{}}onRegistered(){}onRender(){}}},9(e,t,r){r.d(t,{G:()=>a});var s=r(968),n=r(531),o=r(131),i=r(672);class a{constructor(e,t,r,s){(0,i.UO)(!0),this._mapFn=a.setMapFn(e),this._url=a.setUrl(e),this._responseType=a.setResponseType(e),this._serverOptions=a.setServerOptions(e),this._subscriber=void 0!==t?t:e=>console.log("FETCH RETURNED ",e),this.debug=void 0!==e.debug&&e.debug,this.channelName=s;const n={mapFn:this.mapFn,url:this.url,serverOptions:this.serverOptions,responseType:this.responseType,debug:this.debug};!0!==r&&a.startWindowFetch(n,this._subscriber,this.channelName)}static startWindowFetch(e,t,r){const{mapFn:o,url:a,serverOptions:c,responseType:l,debug:d}=e,E=!0===d?e=>console.log("DEBUG FETCH :",e,{url:a,serverOptions:c,responseType:l,channelName:r}):()=>{},p=(0,s.from)(window.fetch(a,c)).pipe((0,n.tap)(E),(0,n.flatMap)(e=>(0,s.from)(e[l]())),(0,n.map)((t=>{const s={channelName:r,url:a,responseType:l,serverOptions:c};return r=>{const n=!0===e?.disableSanitize;if(n){const e="undefined"!=typeof process&&process.env?"production":"development",t=`SPYNE SECURITY WARNING — Sanitization disabled for fetch from ${a}. Data will enter the reactive stream unsanitized. Only use disableSanitize=true for trusted or controlled sources.`;if("production"===e)throw new Error(`SpyneJS security policy violation: disableSanitize=true is not allowed in production (${a}).`);console.warn(`%c${t}`,"color:#f33;font-weight:bold;")}const o=n?r:(0,i.Ay)(r);return t(o,s)}})(o)),(0,n.publish)());p.connect(),p.subscribe(t)}static setMapFn(e){return(0,o.compose)((0,o.defaultTo)(e=>e),(0,o.prop)("mapFn"))(e)}static setUrl(e){const t=(0,o.prop)("url",e);return void 0===t&&console.warn("SPYNE WARNING: URL is undefined for data channel"),t}static setResponseType(e){return(0,o.defaultTo)("json",(0,o.prop)("responseType",e))}get mapFn(){return this._mapFn}get url(){return this._url}get serverOptions(){return this._serverOptions}get responseType(){return this._responseType}static stringifyBodyIfItExists(e){return(0,o.when)((0,o.propIs)(Object,"body"),(0,o.compose)((0,o.over)((0,o.lensProp)("body"),JSON.stringify)))(e)}static updateMethodWhenBodyExists(e){const t=(0,o.has)("body"),r=(0,o.propEq)("GET","method"),s=(0,o.allPass)([t,r]);return(0,o.when)(s,(0,o.assoc)("method","POST"))(e)}static setServerOptions(e){const t=(0,o.pick)(["method","headers","body","mode","credentials","cache","redirect","referrer","referrerPolicy","integrity","keepalive"],e);let r=(0,o.mergeDeepRight)(a.baseOptions(),t);return r=a.updateMethodWhenBodyExists(r),r=a.stringifyBodyIfItExists(r),r}static baseOptions(){return{method:"GET",headers:new Headers({Accept:"application/json, text/plain, */*"}),mode:"cors",credentials:"same-origin",cache:"default",redirect:"follow",referrer:"client",referrerPolicy:"no-referrer-when-downgrade",integrity:"",keepalive:!1}}}},589(e,t,r){r.d(t,{C:()=>E});var s=r(131),n=r(225);const o=(0,s.compose)(s.not,(0,s.is)(Array)),i=(0,s.compose)(s.not,s.isEmpty),a=(0,s.allPass)([(0,s.is)(String),i]),c=(0,s.allPass)([(0,s.is)(Array),i]),l=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)])),d=(0,s.compose)((0,s.allPass)([i,o,(0,s.is)(Object)]));class E{constructor(e,t={},r,o){l(e)&&(t=e,e=(0,s.prop)("selector",t),o=o||(0,s.prop)("testMode",t));const i=[r,(0,s.prop)("debugLabel",t)];r=(0,s.compose)((0,s.find)((0,s.is)(String)))(i);let p=(0,s.omit)(["debugLabel","label","selector","props","testMode","propFilters"],t);void 0!==t.props?p=(0,s.mergeAll)([t.props,p]):void 0!==t.propFilters&&(p=(0,s.mergeAll)([t.propFilters,p])),t.propFilters=p;const{propFilters:h}=t,N=a(e)?E.filterSelector([e],r):void 0,u=c(e)?E.filterSelector(e,r):void 0,m=d(h)?E.filterData(h,r):void 0;let _=(0,s.reject)(s.isNil,[N,u,m]);const T=(0,s.isEmpty)(_);return T&&(_=[(0,s.always)(!1)],!0===n.M.debug&&!0!==o&&console.warn(`Spyne Warning: The Channel Filter, with selector: ${e}, and propFilters:${h} appears to be empty!`)),!0===o?{selector:e,propFilters:h,debugLabel:r,filters:t,testMode:o,filtersAreEmpty:T}:(0,s.allPass)(_)}static filterData(e,t){const r=t;return(()=>{if((0,s.isEmpty)(e))return(0,s.always)(!1);e=(0,s.map)((e,t,r)=>{let n=s.F;if((e=>(0,s.is)(String,e))(e)||(e=>(0,s.is)(Boolean,e))(e)||(e=>(0,s.is)(Number,e))(e))o=e,n=e=>e===o;else{if("function"==typeof e)return e;if((e=>(0,s.is)(Array,e))(e)||l(e))return console.warn(`ChannelPayloadFilter: Property "${e}" is an array/object, which is not allowed. This property will always return false.`),n}var o;return n},e);const t=(0,s.where)(e);return(0,s.compose)(t,t=>{if(void 0===r)return t;const n={};return(0,s.forEachObjIndexed)((e,r)=>{n[r]=e((0,s.prop)(r,t))},e),console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${r}"] - values: `,"color:orange;",{propsBooleans:n,comparedObj:t}),t},(0,s.defaultTo)({}),e=>{const{payload:t,srcElement:r,event:s}=e||{};return Object.assign({},e,r,s,t)})})()}static checkPayloadSelector(e,t,r){const{payload:n,srcElement:o,event:i}=r||{},a=[o,n,(0,s.prop)("srcElement",i),r].reduce((e,t)=>{const r=(0,s.prop)("el",t);return E.elIsDomElement(r)&&void 0===e&&(e=r),e},void 0),c=e=>e.isEqualNode(a),l=e=>{const t=Array.from(document.querySelectorAll(e));return(0,s.map)(c,t)};if(void 0!==t){const r=(0,s.compose)(s.flatten,(0,s.map)(l))(e),n=e;console.log(`%c CHANNEL PAYLOAD FILTER DEBUGGER ["${t}"] - selectors: `,"color:orange;",{el:a,selectorsArr:n,nodeArrResultsDebugger:r})}if("object"!=typeof a)return!1;const d=(0,s.compose)(s.flatten,(0,s.map)(l))(e);return!0!==(0,s.isEmpty)(d)&&(0,s.any)((0,s.equals)(!0),d)}static elIsDomElement(e){return(0,s.is)(String,e)&&(e=document.querySelector(e)),(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(e)}static filterSelector(e,t){const r=(0,s.reject)(s.isEmpty,e);return(0,s.curry)(E.checkPayloadSelector)(r,t)}}},907(e,t,r){function s(e){return e&&"object"==typeof e&&"[object RegExp]"!==Object.prototype.toString.call(e)&&"[object Date]"!==Object.prototype.toString.call(e)}function n(e,t){return t&&!0===t.clone&&s(e)?i((r=e,Array.isArray(r)?[]:{}),e,t):e;var r}function o(e,t,r){const o=e.slice();return t.forEach(function(t,a){void 0===o[a]?o[a]=n(t,r):s(t)?o[a]=i(e[a],t,r):-1===e.indexOf(t)&&o.push(n(t,r))}),o}function i(e,t,r){const a=Array.isArray(t),c=(r||{arrayMerge:o}).arrayMerge||o;return a?Array.isArray(e)?c(e,t,r):n(t,r):function(e,t,r){const o={};return s(e)&&Object.keys(e).forEach(function(t){o[t]=n(e[t],r)}),Object.keys(t).forEach(function(a){s(t[a])&&e[a]?o[a]=i(e[a],t[a],r):o[a]=n(t[a],r)}),o}(e,t,r)}r.d(t,{$:()=>i}),i.all=function(e,t){if(!Array.isArray(e)||e.length<2)throw new Error("first argument should be an array with at least two elements");return e.reduce(function(e,r){return i(e,r,t)})}},64(e,t,r){r.d(t,{FZ:()=>i,Ir:()=>n,Lx:()=>a,OZ:()=>o,RK:()=>c,V0:()=>l});var s=r(131);const n=async(e,t)=>{window.setTimeout(async()=>{await new Promise(e=>setTimeout(e,1)),window.requestAnimationFrame(e)},t)},o=e=>{if(void 0!==e.constructor.name)return e.constructor.name;const t=e.toString();return(0,s.defaultTo)(String(t).substr(0,12),(0,s.match)(/^(function\s)(\w+)(\(.*)$/,t)[2])},i=(e,t)=>void 0!==e[t]?t:(0,s.compose)(s.head,(0,s.filter)((0,s.compose)((0,s.test)(s.__,t),e=>new RegExp(e))))((0,s.keys)(e)),a=e=>{const t={};for(const r in e)t[r]=e[r];return t},c=e=>{const t=(0,s.compose)((0,s.complement)(s.isEmpty),s.head,s.values),r=(0,s.compose)((0,s.complement)(s.isNil),s.head,s.values);return(0,s.allPass)([t,r])(e)};function l(e,t=[]){const r=(0,s.concat)(["length","name","prototype","constructor"],t),n=(0,s.compose)((0,s.without)(r),s.uniq),o=n(Object.getOwnPropertyNames(e.constructor.prototype)),i=n(Object.getOwnPropertyNames(e.constructor));return{methods:o,staticMethods:i,allMethods:(0,s.concat)(o,i)}}},158(e,t,r){r.d(t,{gc:()=>n});var s=r(131);function n(){setTimeout(()=>{(0,s.forEach)(e=>{},this)},1)}},445(e,t,r){function s(){return{createpropsMap:function(){const e=new WeakMap,t={vsid:this.props.vsid};return e.set(t,this.props),{key:t,weakMap:e}},gc:function(){for(const e in this)delete this[e]},createId:function(){return Math.random().toString(36).replace(/\d/gm,"").substring(1,8)},setTraceFunc:function(e){return!0===e?console.log:()=>{}}}}r.d(t,{z:()=>s})},643(e,t,r){r.d(t,{N:()=>n});var s=r(54);function n(){return{testFunc:function(e){console.log("stream mixin is ",e)},sendRoutePayload:function(e,t){return new s.u("CHANNEL_ROUTE",e,t,"subscribe")},sendUIPayload:function(e,t){return new s.u("CHANNEL_UI",e,t,"subscribe")}}}},521(e,t,r){r.d(t,{g:()=>o});var s=r(173),n=r(131);class o{constructor(e){const t=String(e.props.name),r=`${t}_ROUTE_UPDATER`;return(0,n.curry)(o.createTemporaryViewStreamObj)({id:r,name:t})}static createTemporaryViewStreamObj(e,t){const{name:r,id:n}=e,o=t,i=new s.A({id:n,name:r,data:t});i.onRendered=()=>{i.sendInfoToChannel("CHANNEL_ROUTE",o)},i.afterBroadcastEvents=()=>{i.disposeViewStream()},i.appendToNull()}}},961(e,t,r){r.d(t,{l:()=>o});var s=r(131),n=r(225);const o=function(e){const{__proxy__proxyName:t}=e;if(void 0!==t){const r=n.M.getProxyReviver(t);if("function"==typeof r)return((e,t)=>{const{__proxy__proxyName:r}=e;void 0===r&&console.error("object is not proxy object ",e);const n=(r,n)=>{const o=(0,s.path)(n,e),{__proxy__isProxy:i,__proxy__props:a}=o;return i?t(r,a):r},o=n((0,s.clone)(e),[]),i=(e,t)=>{const r=t||[];Object.entries(e).forEach(([t,s])=>{const o=(e=>{let t=typeof e;return["number","boolean","string"].includes(t)?t="primitive":"object"===t&&(Array.isArray(e)?t="array":null===e&&(t="undefined")),t})(s),a=[...r];a.push(t),"object"!==o&&"array"!==o||(e[t]=n(s,a),i(s,a))})};return i(o),o})(e,r)}const r=(0,s.is)(Array),o=(0,s.is)(Object);var i;return!1===r(i=e)&&!0===o(i)?(0,s.compose)(s.fromPairs,s.toPairs,s.clone)(e):(0,s.clone)(e)}},672(e,t,r){r.d(t,{Ay:()=>m,UO:()=>u,oG:()=>h,v8:()=>N});var s=r(636),n=r.n(s),o=r(225);let i,a=!1,c=!1;const l={ALLOWED_TAGS:["a","b","i","em","strong","u","p","br","ul","dl","dt","dd","ol","li","hr","blockquote","pre","code","span","div","section","article","aside","header","footer","h1","h2","h3","h4","h5","h6","table","thead","tbody","tr","td","th","img","figure","figcaption","video","source","iframe","input","button","label","link"],ADD_TAGS:["iframe","input","button","link"],ALLOWED_ATTR:["href","src","alt","class","title","width","height","style","target","rel","controls","poster","type","rows","cols"],ALLOW_DATA_ATTR:!0,FORBID_ATTR:["onerror","onload","onclick","onmouseover","onfocus","onblur","onchange"],FORBID_TAGS:["script","object","embed","meta"],SAFE_URL_PATTERN:/^(https?:|mailto:|tel:|data:image\/)/i},d={FORBID_TAGS:["script","iframe","object","embed","form","input","button","link","meta"],FORBID_ATTR:["onerror","onload","onclick","onmouseover","onfocus","onblur","onchange"],ALLOW_DATA_ATTR:!1},E=()=>{try{const e=o.M?.mode||"production";if("authoring"===e||"development"===e)return"richtext"}catch(e){}return"app"};function p(e="app"){const t="richtext"===e?l:d;return r=>{let s=n().sanitize(r,t);return"richtext"===e&&(s=s.replace(/<(a|img)\b([^>]+?)>/gi,e=>e.replace(/\b(href|src)="([^"]*)"/gi,(e,t,r)=>e))),s}}const h=(e={})=>{if(a)return void console.warn("sanitizeData is already configured. Reconfiguration is not allowed.");const{strict:t=!1}=e,r=e=>{const t=p(e),r=e=>{if(Array.isArray(e))return e.map(r);if(e&&"object"==typeof e){const s={};for(const[n,o]of Object.entries(e))s[n]="string"==typeof o?t(o):r(o);return s}return"string"==typeof e?t(e):e};return r};i=(e,s={})=>{const{disableSanitize:n=!1,mode:o}=s,i=o||(c||t?"app":E());return n?e:r(i)(e)},h.sanitizeDataForce=(e,t)=>{const s=t||E();return r(s)(e)},a=!0},N=(e,t)=>{if(!e)return;const r=p(t||E()),s=/<(?:script|object|embed|form|input|button|link|meta)[^>]*>|on\w+=|javascript:/i;if("string"==typeof e.value&&s.test(e.value)){const t=r(e.value);t!==e.value&&(e.value=t)}if(e.isContentEditable&&"string"==typeof e.innerHTML&&s.test(e.innerHTML)){const t=r(e.innerHTML);t!==e.innerHTML&&(e.innerHTML=t)}},u=(e=!0)=>{c=!!e},m=(e,t={})=>{if(!a)throw new Error("sanitizeData is not configured. Call sanitizeDataConfigure() first.");return i(e,t)}},49(e,t,r){r.d(t,{A:()=>c,D:()=>a});var s=r(636),n=r.n(s);let o,i=!1;const a=e=>{if(i)console.warn("sanitizeHTML is already configured. Reconfiguration is not allowed.");else{if(e.strict)if(window.trustedTypes){const e=window.trustedTypes.createPolicy("default",{createHTML:e=>n().sanitize(e,{RETURN_TRUSTED_TYPE:!1})});o=t=>e.createHTML(t)}else o=e=>n().sanitize(e);else o=e=>e;i=!0}},c=e=>{if(!i)throw new Error("sanitizeHTML is not configured. Call sanitizeHTMLConfigure() with appropriate config.");return o(e)}},225(e,t,r){r.d(t,{M:()=>A});var s=r(167),n=r(511),o=r(519),i=r(907);let a,c,l,d,E=!0,p=!1;const h=[];let N,u;const m=[],_=new Map,T=new o.O,A=new class{constructor(){d=!1}get channelsMap(){return l}get initialized(){return d}get config(){return a}get debug(){return E}static listChannels(){return Array.from(c.map.keys())}initialize(e={},t={},r,s){return c=r,a=(0,i.$)(e,t),a.channels&&a.channels.ROUTE&&(a=s.conformRouteObject(a)),u=a?.IMG_PATH,E=void 0!==a.debug?a.debug:E,this.getChannelActions=c.getChannelActions.bind(c),this.listRegisteredChannels=c.listRegisteredChannels.bind(c),d=!0,this._initialized=d,this.setChannelsMap(),t?.baseHref&&this.setHeadBaseHref(t.baseHref),a}setHeadBaseHref(e){const t=document.createElement("base");t.href=e,document.head.appendChild(t)}conformRouteConfig(e=!1){a=s.H.conformRouteObject(a,e)}setChannelsMap(){const e=c.getStream.bind(c),t=c.testStream.bind(c),r=c.getProxySubject.bind(c);l={getStream:e,testStream:t,getProxySubject:r}}setProp(e,t,r=!1){return r?(a.ephemeralProps[e]=t,t):(a.tmpProps[e]=t,e)}getProp(e){if(a.ephemeralProps.hasOwnProperty(e)){const t=a.ephemeralProps[e];return delete a.ephemeralProps[e],t}return a?.tmpProps?.[e]}createTempProp(e){const t=Math.random().toString(36).slice(2,8);return this.setProp(t,e,!0),t}setChannelConfig(e,t){return a.channels[e]=t,a.channels[e]}getChannelConfig(e,t=a){if("CHANNEL_ROUTE"===e?e="ROUTE":"CHANNEL_WINDOW"===e&&(e="WINDOW"),void 0===t||void 0===a.channels)return void console.warn("Spyne warning: Spyne config object is empty!");const r=a.channels[e];if(void 0!==r)return r;console.warn(`Spyne warning: Spyne configuration for channel, ${e} is empty!`)}registerChannel(){}addPluginConfig(e,t={}){void 0===a.plugins&&(a.plugins={}),this.addPluginMethods(t.pluginMethods),a.plugins[e]=t}getPluginsMethodObj(e){return e&&this.addPluginMethods(e),T.pluginMethodsObj}addPluginMethods(e){e&&T.addMethods(e)}doNotTrackChannel(e){m.push(e)}getUntrackedChannelsList(){return m}registerProxyReviver(e,t){_.set(e,t)}registerPlugin(e){this._initialized||console.warn("SpyneApp is not initialized yet. Plugin will not be fully registered."),e.register(this)}getProxyReviver(e){return _.get(e)}getPluginConfigByPluginName(e){return a.plugins[e]}get IMG_PATH(){return u}get excludeChannelsFromConsole(){return h}set excludeChannelsFromConsole(e){"string"==typeof e?h.includes(e)||h.push(e):Array.isArray(e)?e.forEach(e=>{"string"!=typeof e||h.includes(e)||h.push(e)}):console.warn("Invalid value provided to excludeChannelsFromConsole. Only strings or arrays are allowed.")}get linksData(){return console.warn("get links data in SpyneAppProperties is deprecated, use navLinks"),N}set linksData(e){console.warn("set links data in SpyneAppProperties is deprecated, use navLinks")}get navLinks(){return N}set navLinks(e){N=e}get enableCMSProxies(){return p}getHrefFromData(e={}){return n.Q.convertParamsToRoute(e)}set enableCMSProxies(e=!0){p=Boolean(e)}setCMSProxyMethod(e){this.enableCMSProxies=!0,this.formatTemplateForProxyData=e}tempGetChannelsInstance(){}tempGetConfig(){}}},519(e,t,r){r.d(t,{O:()=>a});var s=r(131);const n=Object.create({}),o=(0,s.compose)(s.not,(0,s.is)(Array)),i=(0,s.compose)((0,s.allPass)([o,(0,s.is)(Object)]));class a{constructor(){n.foo=()=>console.log("used for testing purposes.")}addMethod(e,t,r=!1){if(!0===Object.prototype.hasOwnProperty.call(n,e)){const t=`Spyne Warning: the method name, ${e}, already exists.`;if(r)return t;console.warn(t)}else n[e]=t}addMethods(e={},t=!1){let r;return!1===i(e)?(r=`Spyne Warning: the pluginMethods property, ${JSON.stringify(e)} needs to be an object.`,t?r:void console.warn(r)):(0,s.keys)(e).map(n=>{const o=(0,s.prop)(n,e);if("function"==typeof o)this.addMethod(n,o,t);else{if(r=`the value for ${n} is not a valid function.`,t)return r;console.warn(r)}}).join(",")}checkIfMethodExists(e){}get pluginMethodsObj(){return n}}},732(e,t,r){r.d(t,{g:()=>o});var s=r(64),n=r(131);class o{constructor(e,t="",r=!0){return this.parentContext=e,this.omittedMethods=["autoBinder","initAutoBinder","getEnhancerMethods","checkForMalformedMethods","caller","arguments","bindParentViewStream"],this.prefix=t,!0===r&&this.autoBinder(),this.allMethodsList}initAutoBinder(){this.autoBinder()}getEnhancerMethods(){return(0,s.V0)(this,this.omittedMethods)}checkForMalformedMethods(e){if(""===this.prefix)return void console.warn(`SPYNE WARNING: The following SpyneTrait ${this.constructor.name} needs a prefix`);const t=(0,n.reject)(e=>0===e.indexOf(this.prefix),e);if(t.length>=1){const e=`Spyne Warning: The following method(s) in ${this.constructor.name} require the prefix, "${this.prefix}": [${t.join(", ")}];`;console.warn(e)}}bindParentViewStream(e,t){this.checkForMalformedMethods(e.allMethods);const r={},s=(e,s=!1)=>{const n=!0===s?this.constructor:this;"function"==typeof n[e]&&(r[e]=t[e]=n[e].bind(t))},o=(0,n.curryN)(2,s)(n.__,!0);return(0,n.map)(o,e.staticMethods),(0,n.map)(s,e.methods),r}autoBinder(){const e=this.getEnhancerMethods();return this.allMethodsList=this.bindParentViewStream(e,this.parentContext),this.allMethodsList}}},511(e,t,r){r.d(t,{Q:()=>o});var s=r(131),n=r(225);class o{constructor(){this.checkIfObjIsNotEmptyOrNil=o.checkIfObjIsNotEmptyOrNil.bind(this)}static checkIfObjIsNotEmptyOrNil(e){const t=(0,s.compose)((0,s.complement)(s.isEmpty),s.head,s.values),r=(0,s.compose)((0,s.complement)(s.isNil),s.head,s.values);return(0,s.allPass)([t,r])(e)}static checkIfParamValueMatchesRegex(e,t){const r=(0,s.reject)((0,s.equals)("routeName")),n=(0,s.compose)(r,s.keys),o=(0,s.compose)((0,s.find)(t=>(0,s.test)(new RegExp(t),e)),n)(t);return(0,s.is)(String,o)&&(t=(0,s.assoc)(e,(0,s.prop)(o,t),t)),t}static formatStrAsWindowLocation(e){return{hash:e,search:e,pathname:e}}static getLocationStrByType(e,t=!1,r=window.location){const n={slash:"pathname",query:"search",hash:"hash"}[!0===t?"hash":e];return(0,s.prop)(n,r).replace(/^(\/)?(#)?(\/)?(.*)$/,"$4")}static createRouteArrayFromParams(e,t,r="slash",n){const o=[],i=t=>{const r={},a=t.routeName;let c=void 0!==e[a]?e[a]:(0,s.prop)(a,n);const l=typeof t[c];"string"===l?c=t[c]:"undefined"===l&&(t=this.checkIfParamValueMatchesRegex(c,t)),r[a]=c,this.checkIfObjIsNotEmptyOrNil(r)&&o.push(r);const d=(0,s.is)(Object,t),E=(0,s.has)(c,t),p=(0,s.has)("routePath",t);if(!0===(E&&d)){const e=t[c];(0,s.has)("routePath",e)&&i(e.routePath)}else!0===p&&void 0!==c&&i(t.routePath)};return i(t),o}static createSlashString(e){const t=(0,s.reject)(s.isNil),r=(0,s.when)((0,s.complement)(s.isNil,s.__),(0,s.join)("/")),n=(0,s.replace)(/^(\^*)(.*|^\$)(\$)$/,"$2");return(0,s.compose)(n,r,t,s.flatten,(0,s.map)(s.values))(e)}static createQueryString(e){const t=(0,s.reject)(s.isNil),r=this.checkIfObjIsNotEmptyOrNil,n=(0,s.compose)((0,s.join)("="),s.flatten,s.toPairs),o=(0,s.ifElse)(r,n,(0,s.always)(void 0)),i=(0,s.map)(o),a=(0,s.when)((0,s.complement)(s.isEmpty),(0,s.concat)("?"));return(0,s.compose)(a,(0,s.join)("&"),t,i)(e)}static checkPayloadForRegexOverrides(e,t,r="Value"){const n=(0,s.compose)(e=>(0,s.prop)(`${e}${r}`,t),s.head,s.keys);return(0,s.map)(e=>{const t=n(e);return void 0!==t?(0,s.assoc)((0,s.compose)(s.head,s.keys)(e),t,e):e},e)}static checkForRouteValWithMultipleVals(e){return!0===Array.isArray(e)?e.map(e=>("object"==typeof e&&(e=Object.keys(e).reduce((t,r)=>(t[r]=(e=>{const t=e.match(/^[^|]*/);return t?"^$"===t[0]?"":t[0]:e})(e[r]),t),{})),e)):e}static checkForRouteValsPartMatch(e,t={}){return e.map(e=>{const r={...e};return Object.keys(r).forEach(e=>{var s,n;Object.prototype.hasOwnProperty.call(r,e)&&t[e]&&(r[e]=(s=t[e],(n=r[e]).split("|").some(e=>((e,t)=>{const r=e.replace(/[-/\\^$+?.()|[\]{}]/g,"\\$&").replace(/\*/g,"[\\w\\d_-]*");return new RegExp(`^${r}$`).test(t)})(e,s))?s:n))}),r})}static convertParamsToRoute(e,t=n.M.config.channels.ROUTE,r,s){const i=void 0!==r?r:t.type,a=t.isHash,c=t.routes.routePath,l=void 0!==s?s:this.getLocationStrByType(i,a),d=this.convertRouteToParams(l,t,i).routeData;let E=this.createRouteArrayFromParams(e,c,i,d);return E=o.checkPayloadForRegexOverrides(E,e),E=o.checkForRouteValWithMultipleVals(E),"query"===i?this.createQueryString(E):this.createSlashString(E)}static findIndexOfMatchedStringOrRegex(e,t){const r=t.includes(".+"),n=(0,s.replace)(/^$/,"^$"),o=(0,s.either)((0,s.propEq)(e,"str"),(0,s.compose)((0,s.test)(s.__,e),(0,s.prop)("re")));return(0,s.compose)((0,s.findLastIndex)((0,s.equals)(!0)),(0,s.map)(o),(0,s.map)(e=>{return{str:e,re:(t=e,r&&(t.startsWith("^")||(t="^"+t),t.endsWith("$")||(t+="$")),new RegExp(t))};var t}),(0,s.map)(n))(t)}static checkIfValueShouldMapToParam(e,t,r){const n=(0,s.compose)((0,s.map)(s.last),(0,s.map)((0,s.filter)((0,s.is)(String))),s.toPairs)(e),i=o.findIndexOfMatchedStringOrRegex(t,n);let a=t;if(i>=0){const t=n[i],r=(0,s.invert)(e),o=(0,s.compose)(s.head,(0,s.defaultTo)([]),(0,s.prop)(t))(r);!0===/^([-$\w]*)$/.test(o)&&!0===(0,s.is)(String,o)&&(a=o)}return a}static createArrFromSlashStr(e){return e.replace(/^([/])?(.*)$/,"$2").split("/")}static convertSlashRouteStrToParamsObj(e,t,r){const n=t,o=this.createArrFromSlashStr(t),i=[],a=[];let c=e;(0,s.reduce)((e,t)=>{const n=this.checkIfValueShouldMapToParam(c,t,r);c=this.checkIfParamValueMatchesRegex(t,c);const o=(0,s.either)(s.isEmpty,s.isNil);void 0!==c&&(e=>e!==(0,s.last)(i))(c.routeName)&&!1===o(n)&&(i.push(c.routeName),a.push(n));const l=[t,"routePath"],d=(0,s.path)(l,c),E=(0,s.path)(["routePath"],c);void 0!==d?c=d:void 0!==E&&(c=E)},0,o);const l=(0,s.zipObj)(i,a),d=this.getLastArrVal(i);return{paths:i,pathInnermost:d,routeData:l,routeValue:n}}static getLastArrVal(e){return t=e,void 0!==(0,s.last)(t)?(0,s.last)(t):"";var t}static createDefaultParamFromEmptyStr(e,t){const r={};return r[e.routeName]=this.checkIfValueShouldMapToParam(e,t),r}static convertQueryStrToParams(e,t,r){const n=t,o=t.replace(/^([?])?(.*)$/,"$2"),i=(0,s.compose)((0,s.map)((0,s.split)("=")),(0,s.split)("&"))(o);let a=(0,s.fromPairs)(i),c=(0,s.map)(s.head,i);return!0===(0,s.isEmpty)(t)&&(a=this.createDefaultParamFromEmptyStr(e,t,r),c=(0,s.keys)(a)),{paths:c,pathInnermost:this.getLastArrVal(c),routeData:a,routeValue:n}}static convertRouteToParams(e,t,r){if(void 0===t)return{};const n=void 0!==r?r:t.type,o=(0,s.defaultTo)({},(0,s.prop)("regexTokens",t)),i=t.routes.routePath;return"query"===n?this.convertQueryStrToParams(i,e):(e=e.replace(/\/$|$/,"/"),this.convertSlashRouteStrToParamsObj(i,e,o))}}},167(e,t,r){r.d(t,{H:()=>i});var s=r(968),n=r(131),o=r(511);class i{constructor(){this.createPopStateStream=i.createPopStateStream.bind(this)}static createPopStateStream(e){(0,s.fromEventPattern)(function(e){window.onpopstate=e},function(){window.onpopstate=function(){}}).subscribe(e)}static getLastArrVal(e){return t=e,void 0!==(0,n.last)(t)?(0,n.last)(t):"";var t}static compareRouteKeywords(e={},t){const r=(e,t)=>void 0!==t?(0,n.pick)(t,e):e;let s=r(e,t);return{pickValues:r,compare:(e={},t)=>{const o=r(e,t),i=e=>(0,n.compose)(n.keys,(0,n.filter)((0,n.propEq)(!0,e))),a=(0,n.compose)((0,n.map)(e=>{const t=(0,n.prop)(e,s),r=(0,n.prop)(e,o),i=(0,n.equals)(t,r),a=void 0!==t,c=void 0!==r,l=!i,d=!1===a&&!0===c,E=!0===a&&!1===c,p={};return p[e]={same:i,changed:l,added:d,removed:E,previousExists:a,nextExists:c},p}),n.uniq,(0,n.chain)(n.keys))([s,o]),c=(0,n.chain)(i("changed"),a),l=(0,n.chain)(i("added"),a),d=(0,n.chain)(i("removed"),a);return s=o,{pathsAdded:l,pathsRemoved:d,pathsChanged:c}},getComparer:()=>s}}static getRouteArrData(e,t){const r=(0,n.filter)((0,n.includes)(n.__,e),t);return{paths:r,pathInnermost:i.getLastArrVal(r)}}static flattenConfigObject(e){const t=e=>(0,n.chain)(([e,r])=>"object"!=typeof r||null===r||Array.isArray(r)?[[e,r]]:(0,n.map)(([t,r])=>[`${e}.${t}`,r],t(r)),(0,n.toPairs)(e));return(0,n.values)((0,n.fromPairs)(t(e)))}static addRouteDatasets(e){const{type:t,isHash:r}=e,s=s=>("query"===t?"":!0===r?"#":"/")+o.Q.convertParamsToRoute(s,e).replace(/^(.*\/)([\w-]*\/?)(.*)$/gm,"$1$2"),i=/^([A-Za-z0-9_-])+$/m,a=(e=[],t,r={})=>{let{routeName:o}=t;return(0,n.toPairs)(t).reduce((t,c)=>{const[l,d]=c,E=(0,n.is)(Object,d),p=e=>(0,n.test)(i,e)?(e=>String(e).replace(/([-_])/g," ").toUpperCase())(e):l;if("routeName"===l||"404"===l)return t;o=o||(0,n.prop)("routeName",d);let h=(0,n.clone)(r);if(h[o]=String(l).replace(/([^A-Za-z0-9-_])/g,""),!0===E){if(1===(0,n.keys)(h).length){const e=(0,n.path)(["routePath","routeName"],d);if(e){const o=(0,n.clone)(h);o[e]="",o.navLevel=(0,n.keys)(r).length,o.title=p(l),o.href=s(o),t.push(o)}}h=a(e,d,h)}else h.title=p(l),h.href=s(h);return h.navLevel=(0,n.keys)(r).length,t.push(h),t},[])},c=a([],e.routes);let l=(0,n.flatten)(c);return l=function e(t){return t.map(t=>{for(const r in t)void 0===r||"undefined"===r||void 0===t[r]?delete t[r]:t[r]&&"object"==typeof t[r]&&!Array.isArray(t[r])&&(t[r]=e([t[r]])[0]);return t})}(l),{routeDatasetsArr:l,routeNamesArr:(e=>{const t=(0,n.reject)((0,n.includes)(n.__,["title","href","navLevel","undefined"]));return(0,n.compose)(n.uniq,t,n.flatten,(0,n.map)(n.keys))(e)})(l)}}static conformRouteObject(e={},t=!1){const r=(0,n.path)(["channels","ROUTE"],e);let{add404s:s}=void 0!==r?r:e;s=s||t;const o=e=>{const t=e[1],r=(0,n.is)(Array,t);return""===t?e[1]="^$":r&&(e[1]=t.join("|")),e},a=(0,n.compose)(n.fromPairs,(0,n.map)(e=>{const[t,r]=e,i=s?{404:".+"}:{},c=(0,n.is)(Object,r),l=(0,n.is)(Array,r),d="routePath"===t;return!0===c&&!1===l&&(e[1]=a(e[1]),d&&(e[1]=(0,n.compose)((0,n.mergeDeepRight)(i),n.fromPairs,(0,n.map)(o),n.toPairs)(e[1]))),e}),n.toPairs);if(void 0!==r){e.channels.ROUTE=a(e.channels.ROUTE);const t=i.addRouteDatasets(e.channels.ROUTE);return e.channels.ROUTE=(0,n.mergeRight)(e.channels.ROUTE,t),e}return a(e)}static getLocationData(){return(0,n.pickAll)(["href","origin","protocol","host","hostname","port","pathname","search","hash"],window.location)}}},432(e,t,r){r.d(t,{Y:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(){this.createDomObservableFromEvent=i.createDomObservableFromEvent.bind(this)}static createDomObservableFromEvent(e,t,r=!0,o=window){return t=void 0===t?e=>e:t,(0,s.fromEventPattern)(t=>o.addEventListener(e,t,{passive:r}),()=>{o[e]=e=>e}).pipe((0,n.map)(t))}static createMediaQuery(e){const t=window.matchMedia(e);return this.checkIfValidMediaQuery(t,e),!1!==t&&t}static checkIfValidMediaQuery(e,t){const r=e=>e.replace(/\s+/gm,""),s=void 0!==e.matches&&r(e.media).indexOf(r(t))>=0;return!1===s&&(t=>{console.warn(`Spyne Info: the following query string, "${t}", has been optimized to "${e.media}" by the browser and may not be a valid Media Query item!`)})(t),s}static createMediaQueryHandler(e,t){const r=(e=>t=>(t.mediaQueryName=e,t))(t),o=(i=e,{addHandler:e=>{i.addListener(e)},removeHandler:e=>{i.onchange=()=>{}}});var i;return new s.fromEventPattern(o.addHandler,o.removeHandler).pipe((0,n.map)(r))}static createMergedObsFromObj(e){const t=e.mediaQueries||e.mediaQueries,r=[];return(0,o.mapObjIndexed)((e,t,s)=>{const n=i.createMediaQuery(e);return!1!==n&&r.push(i.createMediaQueryHandler(n,t)),r},t),r}}},393(e,t,r){r.d(t,{W:()=>n,d:()=>o});const s=(e=!1,t=1,r="ease",s=!1)=>`${!0===s?"opacity:0;":""}transition: opacity ${t}s ${r}; opacity: ${!0===e?1:0};`;function n(e,t){const r=1*window.getComputedStyle(e).opacity,n=s(!0,t,"ease",1===r);e.style.cssText+=n}function o(e,t,r){const n=s(!1,t,"ease");e.style.cssText+=n,e.addEventListener("transitionend",r,!1)}},518(e,t,r){r.d(t,{j:()=>i});var s=r(968),n=r(531),o=r(131);class i{constructor(e){this.props.observableStreams=i.createDirectionalObservables()}static createDirectionalFiltersObject(){const e="internal",t="parent",r="child";return{P:[t],C:[r],PCI:[t,e,r],CI:[r,e],PI:[t,e],PC:[t,r]}}static addDefaultDir(e){return(0,o.flip)(o.mergeRight)({$dir:["internal"]},(0,o.clone)(e))}static addDownInternalDir(e,t=["internal","down"]){return(0,o.flip)(o.mergeRight)((0,o.clone)(e),{$dir:t})}static addChildAndInternalDir(e,t=["child","down"]){return(0,o.flip)(o.mergeRight)((0,o.clone)(e),{$dir:t})}static mapToDefaultDir(e){return this.addDefaultDir(e)}static createDirectionalObservables(e=new s.Subject,t,r){void 0!==t&&void 0!==r&&(e.viewName=t,e.vsid=r);const i=e=>(0,o.propSatisfies)(t=>t.includes(e),"$dir"),a=i("parent"),c=i("child"),l=i("internal"),d=e=>(0,o.mergeRight)({from$:e}),E=d("child"),p=d("internal"),h=d("parent"),N=e.pipe((0,n.filter)(e=>void 0!==e&&void 0!==e.action)),u=e.pipe((0,n.filter)(l),(0,n.map)(p)),m=e.pipe((0,n.filter)(a),(0,n.map)(E)),_=e.pipe((0,n.filter)(c),(0,n.map)(h)),T={parent:m,internal:u,child:_};return{raw$:N,toInternal$:u,toParent$:m,toChild$:_,completeAll:()=>{(0,o.forEach)(e=>{e.complete(),e.isStopped=!0},[N,u,m,_])},completeStream:(e=[])=>{void 0!==e&&e.length>=1&&e.forEach(e=>{var t;void 0!==T[e]&&((t=T[e]).complete(),t.isStopped=!0)})}}}}},291(e,t,r){r.d(t,{X:()=>i});var s=r(131),n=r(49),o=r(225);class i{constructor(e,t={},r={}){this.template=this.formatTemplate(e),this.isProxyData=!0===t.__cms__isProxy,this.testMode=r?.testMode,this.template=i.normalizeTripleBrackets(this.template),!0===this.isProxyData&&(!0===o.M.enableCMSProxies?this.template=o.M.formatTemplateForProxyData(this.template):console.warn("You need to be logged in to use the CMS Tools.")),(()=>{!0===(0,s.is)(Array,t)&&(t={spyneData:t},this.template=this.template.replace("{{/}}","{{/spyneData}}"),this.template=this.template.replace("{{#}}","{{#spyneData}}"))})(),this.templateData=t,this.currentOuterLoopData=null;const n=i.getStringArray(this.template);let a=this.template.match(i.findTmplLoopsRE());a=null===a?[]:a;const c=i.parseTmplLoopsRE(),l=this.parseTheTmplLoop.bind(this),d=(0,s.includes)(s.__,a),E=(0,s.ifElse)(d,e=>e.replace(c,l),this.addParams.bind(this));this.finalArr=n.map(E)}static isPrimitiveTag(e){return/({{\.\*?}})/.test(e)}static normalizeTripleBrackets(e){return"string"!=typeof e||-1===e.indexOf("{{{")?e:e.replace(/\{\{\{([^{}]+?)\}\}\}/g,"{{$1}}")}static getNestedDataReducer(e={},t=""){return/(\.)/gm.test(String(t))?String(t).split(".").reduce((e,t)=>e[t]?e[t]:"string"==typeof e?e:"",e):e[t]??""}static getStringArray(e){const t=e.split(i.findTmplLoopsRE()),r=/^([\\n\s\W]+)$/,n=t.filter((e,t)=>!(t>=2&&(t-2)%3==0));return(0,s.reject)(e=>e.match(r),n)}static findTmplLoopsRE(){return/({{#([\w.]+)}}[\w\n\s\W]+?{{\/\2}})/gm}static parseTmplLoopsRE(){return/({{#([\w.]+)}})([\w\n\s\W]+?)({{\/\2}})/gm}static innerLoopRE(){return/({{#([\w.]+)}})([\w\n\s\W]+?)({{\/\2}})/gm}static swapParamsForTagsRE(){return/({{)(.*?)(}})/gm}static hasLoop(e){return i.innerLoopRE().test(e)}removeThis(){void 0!==this&&(this.finalArr=void 0,this.templateData=void 0,this.template=void 0)}renderDocFrag(){let e=i.replaceImgPath(this.finalArr.join(""));!0!==this.testMode&&(e=(0,n.A)(e));const t=/^([^>]*?)(<){1}(\b)(thead|col|colgroup|tbody|td|tfoot|tr|th)(\b)([^\0]*)$/.test(e)?e:document.createRange().createContextualFragment(e);return window.setTimeout(this.removeThis,2),t}renderToString(){let e=this.finalArr.join("");return e=i.replaceImgPath(e),window.setTimeout(this.removeThis,2),e}getTemplateString(){return this.finalArr.join("")}formatTemplate(e){return!0===["SCRIPT","TEMPLATE"].includes((0,s.prop)("nodeName",e))?e.innerHTML:e}getDataValFromPathStr(e,t){const r=String(e).split(".");return(0,s.path)(r,t)||""}addParams(e){return e.replace(i.swapParamsForTagsRE(),(e,t,r,s)=>i.getNestedDataReducer(this.templateData,r))}static replaceImgPath(e){const{IMG_PATH:t}=o.M;return void 0!==t?(e=e.replaceAll(/src\s*=\s*(['"])imgs\//g,`src=$1${t}`)).replaceAll(/url\(\s*(['"]?)imgs\//g,`url($1${t}`):e}processInnerLoop(e,t){const r=i.innerLoopRE();return e.replace(r,(e,r,n,a)=>{!0===i.hasLoop(a)&&(!0===o.M.debug&&!0!==this.testMode&&console.warn(`Spyne Warning: DomElementTemplate supports one level of nested array loops. A deeper nested loop was detected inside "{{#${n}}}". Consider restructuring via nested ViewStreams instead.`),a=a.replace(/{{[#/][\w.]+}}/g,""));const c=i.getNestedDataReducer(t,n);if(!0===(0,s.isNil)(c)||(0,s.isEmpty)(c))return"";const l=Array.isArray(c)?c:[c],d=this.currentOuterLoopData;this.currentOuterLoopData=c;const E=l.map((e,t)=>this.substituteForItem(a,e,t)).join("");return this.currentOuterLoopData=d,E})}substituteForItem(e,t,r){if("string"==typeof t){if(i.isPrimitiveTag(e)){const r=t.replace(/\$/g,"$$$$");return e.replace(i.swapParamsForTagsRE(),r)}const s=this.buildStringItemContext(t,r);return this.substituteObject(e,s)}const s=this.buildItemContext(t,r);return this.substituteObject(e,s)}buildStringItemContext(e,t){const r={spyneLoopKey:e,loopIndex:t,loopNum:t+1};if(!0===this.isProxyData){const t=this.currentOuterLoopData;if(t&&"object"==typeof t){r.__cms__dataId=t.__cms__dataId||"";const s=`__cms__keyFor_${e}`;r.origKey=void 0!==t[s]?t[s]:""}else r.__cms__dataId="",r.origKey=""}return r}buildItemContext(e,t){const r=Object.assign({},e,{loopIndex:t,loopNum:t+1});return!0===this.isProxyData&&(r.__cms__dataId=e.__cms__dataId,r.spyneLoopKey=e,r.loopIndex=t,r.loopNum=t+1),r}substituteObject(e,t){const r=/(\.)/gm,s={loopIndex:t.loopIndex,loopNum:t.loopNum};return e.replace(i.swapParamsForTagsRE(),(e,n,o)=>void 0!==s[o]?s[o]:!1===r.test(o)&&void 0!==t[o]?t[o]:this.getDataValFromPathStr(o,t))}parseTheTmplLoop(e,t,r,n){const o=n,a=i.getNestedDataReducer(this.templateData,r);if(!0===(0,s.isNil)(a)||(0,s.isEmpty)(a))return"";const c=this.currentOuterLoopData;this.currentOuterLoopData=a;const l=Array.isArray(a)?a:[a],d=i.hasLoop(o),E=l.map((e,t)=>{const r=d?this.processInnerLoop(o,e):o;return this.substituteForItem(r,e,t)}).join("");return this.currentOuterLoopData=c,E}}},192(e,t,r){r.d(t,{r:()=>a});var s=r(445),n=r(291),o=r(907),i=r(131);class a{constructor(e={},t=!1){var r;e.tagName=(r=e.tagName,(0,i.defaultTo)("div")(r)),e.attributes=void 0!==e.attributes?e.attributes:this.getDomAttributes(e),e.attrs=this.updateAttrs(e.attributes),e.fragment=document.createDocumentFragment(),this.testMode=t,this.props=e,this.addMixins()}setProp(e,t){this.props[e]=t}getProp(e){return this.props[e]}get el(){return this.props.el}setElAttrs(e,t){return this.getProp("attrs").forEach((t,r)=>{"dataset"===r?(0,i.forEachObjIndexed)((t,r)=>{e.dataset[r]=t},t):e.setAttribute(r,t)}),e}updateAttrs(e,t){const r=void 0!==t?t:new Map;return(0,i.mapObjIndexed)((e,t)=>r.set(t,e),e),r}addTemplate(e){const t=this.getProp("template");return void 0!==t?(t=>{let r=this.getProp("data");r=(0,i.is)(Object,r)?r:{};const s=new n.X(t,r,{testMode:this?.testMode}).renderDocFrag();return(0,i.is)(String,s)?e.innerHTML=s:e.appendChild(s),e})(t):e}createElement(e="div"){return document.createElement(e)}addContent(e){const t=this.getProp("data");if(!0===(0,i.is)(String,t)){const r=document.createTextNode(t);e.appendChild(r)}return e}execute(){const e=(0,i.pipe)(this.createElement.bind(this),this.setElAttrs.bind(this),this.addTemplate.bind(this),this.addContent.bind(this))(this.getProp("tagName"));this.props.el=e}render(){return this.execute(),this.props.template=void 0,this.props.data=void 0,this.props.attributes=void 0,this.getProp("el")}renderToHTMLString(){return this.execute(),this.props.template=void 0,this.props.data=void 0,this.props.attributes=void 0,this.getProp("el").outerHTML}returnIfDefined(e,t){if(void 0!==t){const r=void 0===t;e[t]=!1===r?t:(0,o.$)(e[t],t)}}updateprops(e){return this.returnIfDefined(this.props,e),this}updatepropsAndRun(e){return this.updateprops(e),this.execute(),this.getProp("fragment")}unmount(){void 0!==this.props&&(this.getProp("el").remove(),this.props=void 0,this.gc())}updateTag(e="div"){this.updateprops(e)}updateAttributes(e={}){this.updateprops(e)}updateTemplate(e){this.updateprops(e)}updateData(e={}){this.updateprops(e)}addTagAndRender(e="div"){this.updatepropsAndRun(e)}addAttrsibutesAndRender(e={}){this.updatepropsAndRun(e)}addTemplateAndRender(e){this.updatepropsAndRun(e)}addDataAndRender(e={}){this.updatepropsAndRun(e)}addMixins(){const e=(0,s.z)();this.gc=e.gc.bind(this)}getDomAttributes(e){return(0,i.pick)(this.attributesArray,e)}get attributesArray(){return["accept","accept-charset","accesskey","action","align","allow","alt","async","autocapitalize","autocomplete","autofocus","autoplay","bgcolor","border","buffered","challenge","charset","checked","cite","class","code","codebase","color","cols","colspan","content","contenteditable","contextmenu","controls","coords","crossorigin","csp","dataset","datetime","decoding","default","defer","dir","dirname","disabled","download","draggable","dropzone","enctype","for","form","formaction","headers","height","hidden","high","href","hreflang","http-equiv","icon","id","importance","integrity","ismap","itemprop","keytype","kind","label","lang","language","lazyload","list","loop","low","manifest","max","maxlength","minlength","media","method","min","multiple","muted","name","novalidate","open","optimum","pattern","ping","placeholder","poster","preload","radiogroup","readonly","referrerpolicy","rel","required","reversed","rows","rowspan","sandbox","scope","scoped","selected","shape","size","sizes","slot","span","spellcheck","src","srcdoc","srclang","srcset","start","step","style","summary","tabindex","target","title","translate","type","usemap","value","width","wrap"]}}},992(e,t,r){r.d(t,{e:()=>d});var s=r(643),n=r(64),o=r(225),i=r(968),a=r(531),c=r(131);const l=!0===o.M.debug;class d{constructor(e,t){this.addMixins(),this.props=e,this.broadcastFn=t,this.broadcaster(this.broadcastFn)}addDblClickEvt(e){return(0,i.fromEvent)(e,"dblclick").pipe((0,a.map)(e=>{const t=(0,c.clone)(e);return t.typeOverRide="dblclick",t}))}broadcast(e){if(e.length<=0&&!0===l)return void console.warn(`Spyne Warning: The nested array in ${this.props.name}.broadcastEvents appears to be empty --\x3e vsid:${this.props.vsid}!`);const t={UI:this.sendUIPayload,ROUTE:this.sendRoutePayload},[r,s,o]=e;let a,d=this.props.el.querySelectorAll(r);if(d.length<=0){const e=this.props.el,t=t=>{t===e&&(d=[t])};(()=>{const s=(null!==e.parentElement?e.parentElement:document).querySelectorAll(r);s.forEach=Array.prototype.forEach,s.forEach(t)})()}const E=void 0!==o;!0==(void 0===d||d.length<=0)&&!0===l?console.warn(`Spyne Warning: The item ${r}, does not appear to exist in ${this.props.name} --\x3e vsid:${this.props.vsid}!`):(d.forEach=Array.prototype.forEach,d.forEach(e=>{const r="dblClick"!==s?(0,i.fromEvent)(e,s,{preventDefault:()=>!0}):this.addDblClickEvt(e);a=e.dataset.channel;const o={};var l;o.payload=(0,n.Lx)(e.dataset),o.payload=(0,c.omit)(["channel"],o.payload),o.channel=a,o.srcElement={},o.srcElement.id=this.props.id,o.srcElement.vsid=this.props.vsid,o.srcElement.isLocalEvent=E,o.srcElement.srcEvent=s,o.srcElement.el=e,(0,t[l=a,"ROUTE"===l||"CHANNEL_ROUTE"===l?"ROUTE":("UI"!==l&&"CHANNEL_UI"!==l&&void 0!==l&&console.warn(`SpyneJS warning: The channel, ${l}, is not allowed here, only "UI" or "ROUTE" are valid channels, defaulting to CHANNEL_UI`),"UI")])(r,o)}))}broadcaster(e){e().forEach(e=>this.broadcast(e))}addMixins(){const e=(0,s.N)();this.sendUIPayload=e.sendUIPayload,this.sendRoutePayload=e.sendRoutePayload}}},300(e,t,r){r.d(t,{q:()=>l});var s=r(192),n=r(393),o=r(518),i=r(907),a=r(968),c=r(131);class l{constructor(e,t={},r="",s="theName"){this.addMixins(),this._state="INIT",this.vsid=r,this.el=t.el,this.vsName=s,this.defaults={debug:!1,extendedHashMethods:{}},this.options=(0,i.$)(this.defaults,t),this.addActionListeners().forEach(e=>{const[t,r]=e;this.options.extendedHashMethods[t]=e=>this[r](e)}),this.options.hashMethods=this.setHashMethods(this.options.extendedHashMethods),this.sink$=e,this.sink$.subscribe(this.onObsSinkSubscribe.bind(this)),this.$dirs=o.j.createDirectionalFiltersObject(),this.addDefaultDir=o.j.addDefaultDir,this.sourceStreams=o.j.createDirectionalObservables(new a.Subject,this.vsName,this.vsid),this._source$=this.sourceStreams.toInternal$}addActionListeners(){return[]}setHashMethods(e={}){const t={VS_DETRITUS_COLLECT:e=>this.onGarbageCollect(e),READY_FOR_VS_DETRITUS_COLLECT:e=>this.onReadyForGC(e),EXTIRPATE:e=>this.onDispose(e),VS_SPAWN:e=>this.onRender(e),VS_SPAWN_AND_ATTACH_TO_PARENT:e=>this.onRenderAndAttachToParent(e),VS_SPAWN_AND_ATTACH_TO_DOM:e=>this.onRenderAndAttachToDom(e),ATTACH_CHILD_TO_SELF:e=>this.onAttachChildToSelf(e)};return(0,i.$)(t,e)}createDomItem(){this.props=void 0!==this.props?this.props:{};const e=(0,c.filter)(e=>void 0!==e,(0,c.pick)(["id","className"],this.props)),{tagName:t,data:r,template:n}=this.props;return new s.r(t,e,r,n)}onDisposeCompleted(e){}animateInTween(e,t){(0,n.W)(e,t)}animateOutTween(e,t,r){(0,n.d)(e,t,r)}setAnimateIn(e){if(!0===e.animateIn){const t=void 0!==e.el?e.el:this.domItem.el;this.animateInTween(t,e.animateInTime)}}disposeMethod(e){const t=void 0!==e.el.el?e.el.el:e.el,r={action:"READY_FOR_VS_DETRITUS_COLLECT",$dir:this.$dirs.PI,el:t},s=(0,a.bindCallback)((e,r)=>{this.animateOutTween(t,e.animateOutTime,r)}),n=e=>{this._source$.next(r)},o=!0===e.animateOut?e=>(s(e).subscribe(n),{action:"EXTIRPATING",$dir:this.$dirs.CI}):()=>({action:"EXTIRPATE_AND_READY_FOR_VS_DETRITUS_COLLECT",$dir:this.$dirs.CI});return o(e)}onDispose(e){return this.disposeMethod(e)}removeStream(){void 0!==this.sourceStreams&&this.sourceStreams.completeStream(["internal","child"])}onReadyForGC(e){this.removeStream()}onGarbageCollect(e){void 0!==this.domItem&&this.domItem.unmount(),void 0!==this.sourceStreams&&this.sourceStreams.completeStream(["parent"])}getSourceStream(){return this._source$}combineDomItems(e){if(void 0!==this.el)return;const t=(0,c.isNil)(e.query)?e.node:e.query;({appendChild:(e,t)=>e.appendChild(t),after:(e,t)=>e.after(t)}[e.attachType]||((e,t)=>e.insertBefore(t,e.firstChild)))(t,this.domItem.render()),this.setAnimateIn(e)}onAttachChildToSelf(e){const t=e.childRenderData;return this.combineDomItems(t),{action:"CHILD_ATTACHED",$dir:this.$dirs.PI}}onRenderAndAttachToParent(e){return this.onRender(e),this.combineDomItems(e),{action:"VS_SPAWNED_AND_ATTACHED_TO_PARENT",el:this.el||this.domItem.el,$dir:this.$dirs.PI}}renderDomItem(e){const[t,r,n,o]=e;return this.domItem=new s.r({tagName:t,attributes:r,data:n,template:o}),this.domItem}onRender(e){return{action:"VS_SPAWNED",el:this.el||(e=>this.renderDomItem(e))((0,c.props)(["tagName","domAttributes","data","template"],e)),$dir:this.$dirs.I}}extendedMethods(e){}onRenderAndAttachToDom(e){return e.attachData.el=(e=>this.renderDomItem(e))((0,c.props)(["tagName","domAttributes","data","template"],e)),this.combineDomItems(e.attachData),{action:"VS_SPAWNED_AND_ATTACHED_TO_DOM",el:this.el||e.attachData.el.el,$dir:this.$dirs.CI}}onObsSinkSubscribe(e){const t=e.action,r=(0,c.defaultTo)(e=>this.extendedMethods(e)),s=r(this.options.hashMethods[t])(e);void 0!==s&&(e=>{this._source$.next(e)})(Object.freeze(s))}addMixins(){}}},54(e,t,r){r.d(t,{u:()=>a});var s=r(225),n=r(961),o=r(158),i=r(131);class a{constructor(e,t,r,s="subscribe",n=!1){const o={name:e,observable:t,data:r,action:s};this.sendToDirectorStream(o)}sendToDirectorStream(e){const t=s.M.channelsMap.getStream("DISPATCHER"),r=(0,n.l)(e);t.next(r),e=void 0}static deepClone(e){const t=(0,i.is)(Array),r=(0,i.is)(Object);var s;return!1===t(s=e)&&!0===r(s)?(0,i.compose)(i.fromPairs,i.toPairs,i.clone)(e):(0,i.clone)(e)}static getMouseEventKeys(){return["altKey","bubbles","cancelBubble","cancelable","clientX","clientY","composed","ctrlKey","currentTarget","defaultPrevented","detail","eventPhase","fromElement","isTrusted","layerX","layerY","metaKey","movementX","movementY","offsetX","offsetY","pageX","pageY","path","relatedTarget","returnValue","screenX","screenY","shiftKey","sourceCapabilities","srcElement","target","timeStamp","toElement","type","view","which","x","y"]}addMixins(){this.gc=o.gc}}},707(e,t,r){r.d(t,{T:()=>E});var s=r(131),n=r(225);function o(){return!0===n.M.debug}function i(e){return(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"))(e)}function a(e,t,r=!1){const n=l(e,t,r);return 1===n.length?(0,s.head)(n):n}function c(e,t,r){const n=document.querySelector(e),i=(0,s.compose)((0,s.lte)(0),(0,s.defaultTo)(-1),(0,s.prop)("nodeType"));if(null===n||!1!==i(n)){if(void 0!==t&&String(t).trim().length>0){function a(e){try{return document.querySelectorAll(e).length>0}catch(e){return!1}}const c=a(t);!0===r&&!0===o()&&!1===c&&console.warn(`Spyne Warning: the selector, ${t} does not exist in this el, ${e}`)}}else console.warn(`Spyne Warning: the el object is not a valid single element, ${n}`)}function l(e,t,r=!1){let s=!1;const n=(r=>{let n=[];try{n=document.querySelectorAll(r)}catch(e){n=[]}try{s=document.querySelector(t)===document.querySelector(e),!0===s&&(n=[document.querySelector(t)])}catch(e){}return n})(void 0!==t?`${e} ${t}`:e);return!0===r&&c(!0===s?"body":e,t,r),n}function d(e,t,r){return l(t,r).forEach(t=>{t.style.cssText=e}),this}function E(e,t){function r(t){return E(e,t)}return c(e="string"==typeof e?e:function(e){let t=`${Math.random().toString(36).replace(/\d/gm,"").substring(1,8)}`;return void 0===e.dataset.vsid?e.dataset.vsid=t:t=e.dataset.vsid,`[data-vsid='${t}']`}(e),t,!1),r.map=r=>Array.from(l(e,t)).map(r),r.forEach=r=>Array.from(l(e,t)).map(r),r.getNodeListArray=()=>l(e,t),r.addClass=r=>(l(e,t).forEach(e=>e.classList.add(r)),this),r.removeClass=r=>(l(e,t).forEach(e=>{e.classList.remove(r)}),this),r.setClass=r=>(l(e,t).forEach(e=>{const t=(0,s.compose)((0,s.reject)(s.isEmpty),(0,s.split)(" "))(e.className),n=r.split(" ");t.forEach(t=>e.classList.remove(t)),n.forEach(t=>e.classList.add(t))}),this),r.unmount=()=>{},r.toggleClass=(r,s)=>(l(e,t).forEach(e=>{(s=void 0!==s?s:!e.classList.contains(r))?e.classList.add(r):e.classList.remove(r)}),this),r.toggle=(e,t)=>(r.toggleClass(e,t),this),r.appendChild=e=>(0!==r.el.length?r.el.appendChild(e):console.warn(`Spyne Warning: The selector, ${t} does not appear to be valid!`),r.el),r.addAnimClass=r=>{requestAnimationFrame(()=>{l(e,t).forEach(e=>{try{e.classList.add(r)}catch(e){}})})},r.setActiveItem2=(r,s)=>{const n=l(e,t),c="string"==typeof s?a(e,s):s;return!0===i(c)?n.forEach(e=>e.isEqualNode(c)?e.classList.add(r):e.classList.remove(r)):!0===o()&&console.warn(`Spyne Warning: The selector, ${s}, does not appear to be a valid item in setActiveItem: ${r}`),this},r.setActiveItem=(r,s)=>{const n=l(e,t),c="string"==typeof s?a(e,s):s;if(n.forEach(e=>e.classList.remove(r)),!0===i(c)){const e=Array.from(n).find(e=>e===c);e?e.classList.add(r):!0===o()&&console.warn(`Spyne Warning: The selector, ${s}, is valid but does not match any item in setActiveItem: ${r}`)}else!0===o()&&console.warn(`Spyne Warning: The selector, ${s}, does not appear to be a valid item in setActiveItem: ${r}`);return this},Object.defineProperty(r,"el",{get:()=>a(e,t,!0)}),Object.defineProperty(r,"els",{get:()=>l(e,t)}),Object.defineProperty(r,"len",{get:()=>l(e,t,!1).length}),Object.defineProperty(r,"exists",{get:()=>l(e,t,!1).length>=1}),Object.defineProperty(r,"exist",{get:()=>l(e,t,!1).length>=1}),Object.defineProperty(r,"nodeList",{get:()=>l(e,t)}),Object.defineProperty(r,"arr",{get:()=>{const r=a(e,t,!0);return void 0===r?[]:void 0===r.length?[r]:Array.from(r)}}),Object.defineProperty(r,"inline",{set:r=>d(r,e,t),get:()=>r}),Object.defineProperty(r,"inlineCss",{set:r=>d(r,e,t),get:()=>r}),r}},173(e,t,r){r.d(t,{A:()=>T});var s=r(445),n=r(225),o=r(907),i=r(961),a=r(64),c=r(300),l=r(584),d=r(992),E=r(54),p=r(589),h=r(518),N=r(707),u=r(968),m=r(531),_=r(131);class T{constructor(e={}){this.vsnum=Math.random(),this.addMixins(),this._postRenderCalled=!1,this.defaults=()=>{const t=this.createId(),r=e.id?e.id:t;return{vsid:t,id:r,tagName:"div",el:void 0,data:void 0,animateIn:!1,animateInTime:.5,animateOut:!1,animateOutTime:.5,sendLifecyleEvents:!1,hashId:`#${r}`,id$:`#${r}`,viewClass:c.q,extendedSourcesHashMethods:{},debug:!1,template:void 0,node:document.createDocumentFragment(),name:(0,a.OZ)(this)}},this._state={},this.$dirs=h.j.createDirectionalFiltersObject(),this.addDefaultDirection=h.j.addDefaultDir,this.addDownInternalDir=h.j.addDownInternalDir,this.props=(0,o.$)(this.defaults(),e),this.sendLifecycleMethod=!0===this.props.sendLifecyleEvents?this.sendLifecycleMethodActive.bind(this):this.sendLifecycleMethodInactive.bind(this);const t=this.attributesArray;this.props.domAttributes=(0,_.pick)(t,this.props),void 0!==this.props.traits&&this.addTraits(this.props.traits),this.loadAllMethods(),this.props.action="LOADED",this.sink$=new u.Subject,this.props.elIsAlreadyRenderedBool=this.elAlreadyExistsFn(this.props);const r=this.props.viewClass;this.view=new r(this.sink$,{el:this.props.el},this.props.vsid,this.props.id),this.sourceStreams=this.view.sourceStreams,this._rawSource$=this.view.getSourceStream(),this._rawSource$.viewName=this.props.name,this.sendEventsDownStream=this.sendEventsDownStreamFn,this.initViewStream(),this.isDevMode=T.isDevMode(),this.props.addedChannels=[],this.checkIfElementAlreadyExists()}get source$(){return this._source$}get attributesArray(){return["accesskey","class","contenteditable","dir","draggable","hidden","id","lang","spellcheck","style","tabindex","title","translate","aria-autocomplete","aria-checked","aria-disabled","aria-expanded","aria-haspopup","aria-hidden","aria-invalid","aria-label","aria-level","aria-multiline","aria-multiselectable","aria-orientation","aria-pressed","aria-readonly","aria-required","aria-selected","aria-sort","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext","aria-atomic","aria-busy","aria-live","aria-relevant","aria-dropeffect","aria-grabbed","aria-activedescendant","aria-controls","aria-describedby","aria-flowto","aria-labelledby","aria-owns","aria-posinset","aria-setsize","accept","autocomplete","autofocus","checked","dirname","disabled","form","formaction","formenctype","formmethod","formnovalidate","formtarget","list","max","maxlength","min","minlength","multiple","name","pattern","placeholder","readonly","required","size","step","value","alt","srcset","sizes","usemap","ismap","href","target","download","ping","rel","hreflang","as","media","accept-charset","action","enctype","novalidate","content","charset","http-equiv","async","defer","integrity","nomodule","nonce","referrerpolicy","autocapitalize","autoplay","buffered","challenge","cite","code","codebase","color","cols","colspan","contextmenu","controls","coords","crossorigin","csp","dataset","datetime","decoding","default","for","headers","high","icon","importance","itemprop","keytype","kind","label","language","lazyload","loop","low","manifest","method","muted","open","optimum","poster","preload","radiogroup","reversed","role","rows","rowspan","sandbox","scope","scoped","selected","shape","slot","span","srcdoc","src","type","srclang","start","summary","wrap","width","height"]}static isDevMode(){return n.M.debug}static checkIfActionsAreRegistered(e=[],t){if(t.length>0){const r=t=>{const r=new RegExp(t);if((0,_.findIndex)((0,_.test)(r),s)<0){const r=1===e.length?"from added channel":"from added channels";console.warn(`Spyne Warning: The action, ${t}, in ${this.props.name}, does not match any of the registered actions ${r}, ${e.join(", ")}`)}},s=(e=>{const t=e.map(e=>n.M.getChannelActions(e));return(0,_.flatten)(t)})(e);t.forEach(r)}}static isValidNestedArr(e){const t=(0,_.equals)(!0),r=(0,_.all)(t),s=(0,_.is)(String),n=(0,_.compose)(r,(0,_.map)(s),(0,_.slice)(0,2),(0,_.defaultTo)([]));return(0,_.compose)(r,(0,_.map)(n),(0,_.defaultTo)([]))(e)}static elIsDomElement(e){return(0,_.is)(String,e)&&(e=document.querySelector(e)),(0,_.compose)((0,_.lte)(0),(0,_.defaultTo)(-1),(0,_.prop)("nodeType"))(e)}updatePropsToMatchEl(){const e=(0,_.compose)(_.toLower,(0,_.either)((0,_.prop)("tagName"),(0,_.always)("")));this.props.tagName=e(this.props.el)}elAlreadyExistsFn(e){const t=(0,_.compose)((0,_.lte)(0),(0,_.defaultTo)(-1),(0,_.prop)("nodeType"));return(0,_.propSatisfies)((0,_.allPass)([e=>document.body.contains(e),t]),"el")(e)}checkIfElementAlreadyExists(){!0===this.props.elIsAlreadyRenderedBool?(this.updatePropsToMatchEl(),this.postRender()):null===this.props.el&&console.error(`Spyne Error: The defined element for this ViewStream instance, ${this.constructor.name}, appears to not exist.`)}loadAllMethods(){const e=(0,_.curry)(this.onChannelMethodCall.bind(this));this.addActionListeners().forEach(t=>{let[r,s,n]=t;(0,_.is)(String,n)&&(n=new p.C({selector:n})),this.props.extendedSourcesHashMethods[r]=e(s,n)}),this.props.hashSourceMethods=this.setSourceHashMethods(this.props.extendedSourcesHashMethods)}addActionListeners(){return[]}onChannelMethodCall(e,t,r){if(void 0!==r.$dir&&r.$dir.includes("child")&&!0!==this.deleted){const e=(0,o.$)({},r);e.$dir=this.$dirs.C,this.sourceStreams.raw$.next(e)}!0===(0,_.defaultTo)((0,_.always)(!0),t)(r)&&(t=>{void 0===this[e]?console.warn(`Spyne Warning: The method, ${e} does not appear to exist in ${this.constructor.name}!`):this[e](t)})(r=(0,_.omit)(["$dir"],r))}setSourceHashMethods(e={}){const t={EXTIRPATING:e=>this.checkParentDispose(e),EXTIRPATE:e=>this.disposeViewStream(e),VS_SPAWNED:e=>this.onVSRendered(e),VS_SPAWNED_AND_ATTACHED_TO_DOM:e=>this.onVSRendered(e),VS_SPAWNED_AND_ATTACHED_TO_PARENT:e=>this.onVSRendered(e),READY_FOR_VS_DETRITUS_COLLECT:e=>this.onReadyToGC(e),VS_NULLITY:()=>({})};return o.$.all([{},t,e])}initViewStream(){this._source$=this._rawSource$.pipe((0,m.map)(e=>this.onMapViewSource(e)),(0,m.takeWhile)(this.notGCSTATE)),this.initAutoMergeSourceStreams(),this.updateSourceSubscription(this._source$,!0)}notGCSTATE(e){return!e.action.includes("READY_FOR_VS_DETRITUS_COLLECT")}eqGCSTATE(e){return!e.action.includes("READY_FOR_VS_DETRITUS_COLLECT")}notCOMPLETED(e){return!e.action.includes("COMPLETED")}notGCCOMPLETE(e){return!e.action.includes("GC_COMPLETE")}testVal(e){console.log("TESTING VALL IS ",e)}addParentStream(e,t){this.parent$=e.pipe((0,m.filter)(e=>void 0!==e&&void 0!==e.action),(0,m.map)(e=>{const t=(0,o.$)({},e);return"EXTIRPATE_AND_READY_FOR_VS_DETRITUS_COLLECT"===t.action&&(this.disposeViewStream(t),t.action="READY_FOR_VS_DETRITUS_COLLECT"),t})),this.updateSourceSubscription(this.parent$,!1,"PARENT"),this.renderAndAttachToParent(t)}addChildStream(e){const t=e.pipe((0,m.filter)(e=>void 0!==e&&void 0!==e.action),(0,m.tap)(e=>this.tracer("addChildStraem do ",e)),(0,m.map)(e=>e),(0,m.finalize)(e=>this.onChildCompleted(t.source)));this.updateSourceSubscription(t,!0,"CHILD")}onChildDisposed(e){}onChildCompleted(e){const t=(e=>{const t=e=>{for(;void 0!==e.destination;)e=t(e.destination);return e};return(0,_.pick)(["id","vsid"],t(e))})(e);return this.tracer("onChildCompleted ",this.vsnum,e),this.onChildDisposed(t,e),t}initAutoMergeSourceStreams(){const e={next:this.onSubscribeToSourcesNext.bind(this),error:this.onSubscribeToSourcesError.bind(this),complete:this.onSubscribeToSourcesComplete.bind(this)},t=()=>{this.props.el$=void 0,this.uberSource$.complete(),this.autoSubscriber$.complete(),this.sink$.complete(),this.props=void 0,this.deleted=!0,this.tracer("completeAll",this.deleted,this.props)},r=()=>{s-=1,0===s&&t()};let s=0;this.uberSource$=new u.Subject,this.autoMergeSubject$=this.uberSource$.pipe((0,m.mergeMap)(e=>{const t=e.observable.pipe((0,m.filter)(e=>void 0!==e&&void 0!==e.action),(0,m.map)(e=>{const t=(0,o.$)({},e);return t.action=e.action,this.tracer("autoMergeSubject$",t),t}));return!1===e.autoClosesBool?t:(s+=1,t.pipe((0,m.finalize)(r)))})),this.autoSubscriber$=this.autoMergeSubject$.pipe((0,m.filter)(e=>void 0!==e&&void 0!==e.action)).subscribe(e)}updateSourceSubscription(e,t=!1,r){const s={observable:e,autoClosesBool:t,rel:r};this.tracer("updateSourceSubscription ",this.vsnum,s),this.uberSource$.next(s)}onSubscribeToSourcesNext(e={}){const t=(0,_.defaultTo)(e=>this.sendExtendedStreams(e)),r=(0,a.FZ)(this.props.hashSourceMethods,e.action);t(this.props.hashSourceMethods[r])(e),this.tracer("onSubscribeToSourcesNext",{payload:e})}onSubscribeToSourcesError(e=""){console.log("ALL ERROR ",this.constructor.name,e)}onSubscribeToSourcesComplete(){this.tracer("onSubscribeToSourcesComplete","VS_DETRITUS_COLLECT"),this.openSpigot("VS_DETRITUS_COLLECT")}sendExtendedStreams(e){this.tracer("sendExtendedStreams",e),this.openSpigot(e.action,e)}renderAndAttachToParent(e){this.openSpigot("VS_SPAWN_AND_ATTACH_TO_PARENT",e)}renderView(){this.openSpigot("VS_SPAWN")}renderViewAndAttachToDom(e,t,r){const s={node:e,type:t,attachType:r};this.openSpigot("VS_SPAWN_AND_ATTACH_TO_DOM",{attachData:s})}checkParentDispose(e){"parent"===e.from$&&this.disposeViewStream(e)}onBeforeDispose(){}setTimeout(e,t=0,r=!1){window.setTimeout((...t)=>{if(void 0!==this&&void 0!==this.props){const s=!0===r?e.bind(this):e;(0,_.apply)(s,t)}},t)}disposeViewStream(e){this.onBeforeDispose(),this.openSpigot("EXTIRPATE")}onChildDispose(e){}onParentDisposing(e){this.openSpigot("EXTIRPATE")}onReadyToGC(e){const t=void 0!==e.from$&&"internal"===e.from$;this.tracer("onReadyToGC",t,e)}openSpigot(e,t={}){if(void 0!==this.props){this.props.action=e;const r=(0,_.mergeRight)(this.props,t);this.sink$.next(Object.freeze(r))}}setAttachData(e,t){return{node:this.props.el,type:"ViewStreamObservable",attachType:e,query:(()=>{const e=this.props.el.querySelector(t);return!0===T.isDevMode()&&(0,_.is)(String,t)&&(0,_.isNil)(e)&&console.warn(`Spyne Warning: The appendView query in ${this.props.name}, '${t}', appears to not exist!`),e})()}}getParentEls(e,t){const r=e=>e.parentElement;let s=0,n=e;for(;s<t;)n=r(n),s++;return n}setAttachParentData(e,t,r){t=""!==t?t:void 0;const s=this.getParentEls(this.props.el,r);return{node:s,type:"ViewStreamObservable",attachType:e,query:s.querySelector(t)}}onMapViewSource(e={}){return this.props=(0,_.mergeRight)(this.props,e),e}exchangeViewsWithChild(e,t){this.addChildStream(e.sourceStreams.toParent$),e.addParentStream(this.sourceStreams.toChild$,t)}appendToDom(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be appendedToDom. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","appendChild")}appendToDomAfter(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be appendedToDomAfter. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","after")}prependToDom(e){void 0!==this.props.el&&console.warn(`Spyne Warning: The ViewStream, ${this.props.name}, has an element, ${this.props.el}, that is already rendered and does not need to be prependedToDom. This may create unsusual side effects!`),this.renderViewAndAttachToDom(e,"dom","prependChild")}appendView(e,t){this.exchangeViewsWithChild(e,this.setAttachData("appendChild",t))}appendViewAfter(e,t){this.exchangeViewsWithChild(e,this.setAttachData("after",t))}appendViewToParentEl(e,t,r=1){this.exchangeViewsWithChild(e,this.setAttachParentData("appendChild",t,r))}prependViewToParentEl(e,t,r=1){this.exchangeViewsWithChild(e,this.setAttachParentData("prependChild",t,r))}prependView(e,t){this.exchangeViewsWithChild(e,this.setAttachData("prependChild",t))}appendToNull(){const e=document.getElementById("spyne-null-views");this.renderViewAndAttachToDom(e,"dom","appendChild")}onVSRendered(e){"internal"===e.from$&&this.postRender()}postRender(){if(!0!==this._postRenderedCalled){if(this.beforeAfterRender(),this.afterRender(),this.onRendered(),requestAnimationFrame(()=>this.onAnimFrameAfterRendered()),!0===this.isDevMode){const e=this.broadcastEvents();!1===T.isValidNestedArr(e)&&console.warn(`Spyne Warning: The array returned from broadcastEvents in ${this.props.name}, '${JSON.stringify(e)}', does not appear to be properly formatted!`)}this.initializeChannels(),this.viewsStreamBroadcaster=new d.e(this.props,this.broadcastEvents.bind(this)),this.afterBroadcastEvents(),this._postRenderedCalled=!0}}addTraits(e){"Array"!==e.constructor.name&&(e=[e]),e.forEach(e=>{new e(this)})}afterBroadcastEvents(){if(!0===this.isDevMode){const e=e=>e[0],t=this.addActionListeners(),r=t.map(e);if(!1===T.isValidNestedArr(t))console.warn(`Spyne Warning: The array returned from addActionsListeners in ${this.props.name}, '${JSON.stringify(t)}', does not appear to be properly formatted!`);else{const e=e=>{const t=(0,_.defaultTo)("",e[1]);!1===(0,_.is)(Function,this[t])&&console.warn(`Spyne Warning: The method in addActionListeners nested Array, '${JSON.stringify(e)}', in ${this.props.name}, does not appear to exist!`)};(0,_.compose)((0,_.forEach)(e),(0,_.defaultTo)([]))(t)}const s=()=>{void 0!==(0,_.path)(["props","addedChannels"],this)&&T.checkIfActionsAreRegistered.bind(this)(this.props.addedChannels,r)};this.setTimeout(s,500)}}setDataVSID(){this.props.el.dataset.vsid=this.props.vsid}beforeAfterRender(){this.setDataVSID(),this.props.el$=(0,N.T)(this.props.el)}downStream(){}onRendered(){}onAnimFrameAfterRendered(){}afterRender(){}broadcastEvents(){return[]}getChannel(e){return(0,_.ifElse)(e=>(0,l.ns)().includes(e),e=>n.M.channelsMap.getStream(e).observer.pipe((0,m.takeWhile)(e=>!0!==this.deleted)),e=>console.warn(`channel name ${e} is not within ${l.ns}`))(e)}initializeChannels(){Array.isArray(this?.props?.channels)?this?.props?.channels?.forEach(e=>{const[t,r=!1]=Array.isArray(e)?e:[e];this?.addChannel(t,r)}):Array.isArray(this?.props?.channel)&&console.warn("props.channel is not a ViewStream property. Do you mean props.channels?")}addChannel(e,t=!1,r=!1,s=!1){const n=!0===r?this.$dirs.CI:this.$dirs.I;if(!0===this?.props?.addedChannels?.includes(e))return;const o=(0,_.path)(["srcElement","isLocalEvent"]),i=(0,_.path)(["srcElement","vsid"]),a=[(0,m.map)(e=>{const t=e;return t.$dir=n,t}),(0,m.filter)(e=>{const t=i(e);return!0!==o(e)||t===this.props.vsid})];!0===t&&a.unshift((0,m.skip)(1));const c=this.getChannel(e).pipe(...a);this.updateSourceSubscription(c,!1),this.props.addedChannels.push(e)}checkIfChannelExists(e){const t=n.M.channelsMap.testStream(e);return!0!==t&&console.warn(`SPYNE WARNING: The ChannelPayload from ${this.props.name}, has been sent to a channel, ${e}, that has not been registered!`),t}sendInfoToChannel(e,t={},r){const s=t,n=(0,_.defaultTo)("VIEWSTREAM_EVENT"),o=(0,_.compose)(n,(0,_.prop)(e)),a={payload:s,action:r=r||o({CHANNEL_ROUTE:"CHANNEL_ROUTE_CHANGE_EVENT"})};try{if(a.srcElement=(0,_.compose)((0,_.pick)(["id","vsid","class","tagName"]),(0,_.prop)("props"))(this),!0===this.checkIfChannelExists(e)){!1===/CHANNEL_LIFECYCLE/.test(r)&&Object.defineProperties(a,{payload:{get:()=>(0,i.l)(t)}});const s=(0,u.of)(a);return new E.u(e,s,a)}}catch(e){console.warn("SPYNE WARNING ",e)}}tracer(...e){this.sendLifecycleMethod(...e)}sendLifecycleMethodInactive(){}sendLifecycleMethodActive(e,t){const r="VS_DETRITUS_COLLECT"===t;!0===(0,_.where)({from$:(0,_.equals)("internal"),action:(0,_.equals)("VS_SPAWNED_AND_ATTACHED_TO_PARENT")},t)?this.sendInfoToChannel("CHANNEL_LIFECYCLE",{action:"CHANNEL_LIFECYCLE_RENDERED_EVENT"},"CHANNEL_LIFECYCLE_RENDERED_EVENT"):!0===r&&this.sendInfoToChannel("CHANNEL_LIFECYCLE",{action:"CHANNEL_LIFECYCLE_DISPOSED_EVENT"},"CHANNEL_LIFECYCLE_DISPOSED_EVENT")}createActionFilter(e,t){return new p.C(e,t)}isLocalEvent(e){const t=(0,_.path)(["srcElement","el"],e),r=(0,_.path)(["props","el"],this);return T.elIsDomElement(r)&&T.elIsDomElement(t)&&r.contains(t)}addMixins(){const e=(0,s.z)();this.createId=e.createId}}},636(e){e.exports=r},131(e){e.exports=t},968(t){t.exports=e},531(e){e.exports=s}},o={};function i(e){var t=o[e];if(void 0!==t)return t.exports;var r=o[e]={exports:{}};return n[e](r,r.exports,i),r.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};i.r(a),i.d(a,{Channel:()=>_.c,ChannelFetch:()=>T.e,ChannelFetchUtil:()=>A.G,ChannelPayload:()=>C.m,ChannelPayloadFilter:()=>g.C,ChannelsMap:()=>c.H,DomElement:()=>l.r,DomElementTemplate:()=>d.X,SpyneApp:()=>L.D,SpyneAppProperties:()=>y.M,SpynePlugin:()=>I.V,SpyneTrait:()=>u.g,ViewStream:()=>h.A,ViewStreamBroadcaster:()=>N.e,ViewStreamElement:()=>E.q,ViewStreamPayload:()=>m.u,ViewStreamSelector:()=>p.T,deepMerge:()=>S.$,safeClone:()=>f.l,sanitizeData:()=>O.Ay,sanitizeEventTarget:()=>O.v8});var c=i(470),l=i(192),d=i(291),E=i(300),p=i(707),h=i(173),N=i(992),u=i(732),m=i(54),_=i(2),T=i(126),A=i(9),C=i(980),g=i(589),I=i(930),S=i(907),f=i(961),y=i(225),L=i(713),O=i(672);return a})());
|
|
3
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxNQUFPLFdBRTdEelEsT0FBT3dRLGVBQWV6VixFQUFTLGFBQWMsQ0FBRTBWLE9BQU8sSyIsInNvdXJjZXMiOlsid2VicGFjazovL3NweW5lL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLWZldGNoLWNsYXNzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWwtcGF5bG9hZC1jbGFzcy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9jaGFubmVsLXByb3h5LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWwuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvY2hhbm5lbHMtY29uZmlnLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL2NoYW5uZWxzLW1hcC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLWFpLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtbGlmZWN5Y2xlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL2NoYW5uZWxzL3NweW5lLWNoYW5uZWwtcm91dGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvY2hhbm5lbHMvc3B5bmUtY2hhbm5lbC11aS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9jaGFubmVscy9zcHluZS1jaGFubmVsLXdpbmRvdy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS9zcHluZS1hcHAuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvc3B5bmUtcGx1Z2lucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9jaGFubmVsLWZldGNoLXV0aWwuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvY2hhbm5lbC1wYXlsb2FkLWZpbHRlci5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9kZWVwLW1lcmdlLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL2ZycC10b29scy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9nYy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9taXhpbnMvYmFzZS1jb3JlLW1peGlucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9taXhpbnMvYmFzZS1zdHJlYW1zLW1peGlucy5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9yb3V0ZS1jaGFubmVsLXVwZGF0ZXIuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc2FmZS1jbG9uZS5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS91dGlscy9zYW5pdGl6ZS1kYXRhLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3Nhbml0aXplLWh0bWwuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtcGx1Z2lucy1tZXRob2RzLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXRyYWl0LmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUtdXJsLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC13aW5kb3cuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdXRpbHMvdmlld3N0cmVhbS1hbmltYXRpb25zLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3V0aWxzL3ZpZXdzdHJlYW0tb2JzZXJ2YWJsZXMuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3MvZG9tLWVsZW1lbnQtdGVtcGxhdGUuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3MvZG9tLWVsZW1lbnQuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tYnJvYWRjYXN0ZXIuanMiLCJ3ZWJwYWNrOi8vc3B5bmUvLi9zcmMvc3B5bmUvdmlld3Mvdmlldy1zdHJlYW0tZWxlbWVudC5qcyIsIndlYnBhY2s6Ly9zcHluZS8uL3NyYy9zcHluZS92aWV3cy92aWV3LXN0cmVhbS1wYXlsb2FkLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLXNlbGVjdG9yLmpzIiwid2VicGFjazovL3NweW5lLy4vc3JjL3NweW5lL3ZpZXdzL3ZpZXctc3RyZWFtLmpzIiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOlwiZG9tcHVyaWZ5XCIsXCJjb21tb25qczJcIjpcImRvbXB1cmlmeVwiLFwiYW1kXCI6XCJkb21wdXJpZnlcIixcInJvb3RcIjpcIkRPTVB1cmlmeVwifSIsIndlYnBhY2s6Ly9zcHluZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcInJhbWRhXCIsXCJjb21tb25qczJcIjpcInJhbWRhXCIsXCJhbWRcIjpcInJhbWRhXCIsXCJyb290XCI6XCJSXCJ9Iiwid2VicGFjazovL3NweW5lL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOlwicnhqc1wiLFwiY29tbW9uanMyXCI6XCJyeGpzXCIsXCJhbWRcIjpcInJ4anNcIixcInJvb3RcIjpcInJ4anNcIn0iLCJ3ZWJwYWNrOi8vc3B5bmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6W1wicnhqc1wiLFwib3BlcmF0b3JzXCJdLFwiY29tbW9uanMyXCI6W1wicnhqc1wiLFwib3BlcmF0b3JzXCJdLFwiYW1kXCI6XCJyeGpzL29wZXJhdG9yc1wiLFwicm9vdFwiOltcInJ4anNcIixcIm9wZXJhdG9yc1wiXX0iLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3NweW5lL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vc3B5bmUvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJyeGpzXCIpLCByZXF1aXJlKFwicmFtZGFcIiksIHJlcXVpcmUoXCJkb21wdXJpZnlcIiksIHJlcXVpcmUoXCJyeGpzXCIpW1wib3BlcmF0b3JzXCJdKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwic3B5bmVcIiwgW1wicnhqc1wiLCBcInJhbWRhXCIsIFwiZG9tcHVyaWZ5XCIsIFwicnhqcy9vcGVyYXRvcnNcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wic3B5bmVcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJyeGpzXCIpLCByZXF1aXJlKFwicmFtZGFcIiksIHJlcXVpcmUoXCJkb21wdXJpZnlcIiksIHJlcXVpcmUoXCJyeGpzXCIpW1wib3BlcmF0b3JzXCJdKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJzcHluZVwiXSA9IGZhY3Rvcnkocm9vdFtcInJ4anNcIl0sIHJvb3RbXCJSXCJdLCByb290W1wiRE9NUHVyaWZ5XCJdLCByb290W1wicnhqc1wiXVtcIm9wZXJhdG9yc1wiXSk7XG59KShzZWxmLCAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fOTY4X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzEzMV9fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX182MzZfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNTMxX18pID0+IHtcbnJldHVybiAiLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgQ2hhbm5lbEZldGNoVXRpbCB9IGZyb20gJy4uL3V0aWxzL2NoYW5uZWwtZmV0Y2gtdXRpbC5qcydcbmltcG9ydCB7IHBhdGgsIHBpY2ssIG1lcmdlRGVlcFJpZ2h0LCBhbGwsIGFsbFBhc3MsIGVpdGhlciwgdmFsdWVzLCBkZWZhdWx0VG8sIHJlamVjdCwgY29tcG9zZSwgaXNOaWwgfSBmcm9tICdyYW1kYSdcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxGZXRjaCBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsRmV0Y2hcbiAgICogQHR5cGUgZXh0ZW5kYWJsZVxuICAgKiBAZGVzY1xuICAgKiA8cD5DaGFubmVsRmV0Y2ggZXh0ZW5kcyBDaGFubmVsIGFuZCBpcyBkZXNpZ25lZCB0byBjcmVhdGUgYSBDaGFubmVsIGZyb20gZmV0Y2hlZCBodHRwIGRhdGEuPC9wPlxuICAgKiA8cD5BIENoYW5uZWxGZXRjaCBpbnN0YW5jZSBjYW4gYmUgY3JlYXRlZCB3aXRoIGp1c3QgdGhlIGNoYW5uZWwgbmFtZSBhbmQgdXJsIHByb3BlcnRpZXMuPC9wPlxuICAgKiA8cD5UaGUgZGF0YSBpcyBmZXRjaGVkIG9uY2UsIGJ1dCB0aGUgQ2hhbm5lbEZldGNoJ3MgZGF0YSBpcyBhbHdheXMgYXZhaWxhYmxlIHRvIG90aGVyIENoYW5uZWwgYW5kIFZpZXdTdHJlYW0gaW5zdGFuY2VzPC9wPlxuICAgKlxuICAgKiA8aDM+VGhlIENoYW5uZWxGZXRjaCBDbGFzczwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkV4dGVuZHMgQ2hhbm5lbCBhbmQgdXNlcyB0aGUgQ2hhbm5lbEZldGNoVXRpbCB0byBtYWtlIGFueSB0eXBlIG9mIGh0dHAocykgcmVxdWVzdC48L2xpPlxuICAgKiA8bGk+UmVxdWlyZXMgYSB1cmwgcHJvcGVydHkgYXQgaW5zdGFudGlhdGlvbi48L2xpPlxuICAgKiA8bGk+VGhlIHJlc3BvbnNlIGRhdGEgaXMgcHVibGlzaGVkIGFzIGEgQ2hhbm5lbFBheWxvYWQuPC9saT5cbiAgICogPGxpPlRoZSBhY3Rpb24gZm9yIHRoZSByZXR1cm5lZCBDaGFubmVsRmV0Y2ggZGF0YSBpcyBhbHdheXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQsIFwiQ0hBTk5FTF9OQU1FX1JFU1BPTlNFX0VWRU5UXCI8L2xpPlxuICAgKiA8bGk+VGhlIGRlZmF1bHQgcmVxdWVzdCB0eXBlIGlzIGEgR0VUIHJlcXVlc3QgdGhhdCByZXR1cm5zIGEgSlNPTiBvYmplY3QuPC9saT5cbiAgICogPGxpPkhvd2V2ZXIsIGFueSB0eXBlIG9mIHJlcXVlc3QgYW5kIHJldHVybiB0eXBlIGNhbiBiZSBjb25maWd1cmVkIGJ5IHVzaW5nIHRoZSBib2R5IHByb3BlcnR5IHdoZW4gY3JlYXRpbmcgdGhlIGluc3RhbmNlLjwvbGk+XG4gICAqIDxsaT5UaGUgbWFwRm4gZ2l2ZXMgYWNjZXNzIHRvIHRoZSByZXR1cm5lZCByZXNwb25zZSBhbmQgY2FuIGJlIHVzZSB0byBwYXJzZSB0aGUgZGF0YSBiZWZvcmUgaXQgaXMgcHVibGlzaGVkIHRvIG90aGVyIENoYW5uZWxzIGFuZCBWaWV3U3RyZWFtIGluc3RhbmNlcy48L2xpPlxuICAgKiA8bGk+Q2hhbm5lbCBGZXRjaCB3aWxsIHNlbmQgdGhlIGxhc3QgcmVzcG9uc2UgdG8gZnV0dXJlIHN1YnNjcmliZXJzLCBhbmQgd2lsbCBub3QgbWFrZSBmdXJ0aGVyIGh0dHAocykgcmVxdWVzdHMgdW5sZXNzIGRpcmVjdGVkIHRvIGRvICBzby48L2xpPlxuICAgKiA8bGk+RGF0YSBjYW4gYmUgRmV0Y2hlZCBhZ2FpbiwgYnkgc2VuZGluZyBhIFwiQ0hBTk5FTF9OQU1FX1VQREFURV9SRVNQT05TRV9FVkVOVFwiIGFjdGlvbiBmcm9tIGEgVmlld1N0cmVhbSdzIHNlbmRJbmZvVG9DaGFubmVsIG1ldGhvZC48L2xpPlxuICAgKiA8L3VsPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAqXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBuYW1lIC0gPSB1bmRlZmluZWQ7IFRoZSByZWdpc3RlcmVkIG5hbWUgZm9yIHRoZSBjaGFubmVsLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gcHJvcHMudXJsIC0gPSB1bmRlZmluZWQ7IFRoZSB1cmwgdG8gYmUgZmV0Y2hlZC5cbiAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gcHJvcHMubWFwRm4gLSA9IHVuZGVmaW5lZDsgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmZXRjaGVkIHJlc3BvbnNlIGFuZCBiZWhhdmVzIGxpa2UgYW55IG1hcCBtZXRob2QuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wcy5ib2R5IC0gPSB1bmRlZmluZWQ7IFRoaXMgd2lsbCB1cGRhdGUgdGhlIG9wdGlvbnMsIGluY2x1ZGluZyBoZWFkZXIgb3B0aW9ucywgc2VudCBhbG9uZyB3aXRoIHRoZSBmZXRjaCByZXF1ZXN0LiBEZWZhdWx0IG9wdGlvbnMgdXNlcyBhIEdFVCByZXF1ZXN0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVtcIjxoND5BIFZpZXdTdHJlYW0gSW5zdGFuY2UgU2VuZGluZyBBIEZldGNoIFVwZGF0ZSBSZXF1ZXN0PC9oND5cIl1cbiAgICogY29uc3QgYWN0aW9uID0gXCJDSEFOTkVMX0ZFVENIQ0hBTk5FTF9OQU1FX1VQREFURV9SRVNQT05TRV9FVkVOVFwiO1xuICAgKiBjb25zdCB1cmwgPSBcIi8vc2l0ZS5jb20vanNvbi9cIjtcbiAgICogY29uc3QgYm9keSA9IHtcbiAgICogICAgIG1ldGhvZDogXCJQT1NUXCJcbiAgICogfVxuICAgKlxuICAgKiB0aGlzLnNlbmRJbmZvVG9DaGFubmVsKFwiQ0hBTk5FTF9GRVRDSENIQU5ORUxfTkFNRVwiLCB7YWN0aW9uLCB1cmwsIGJvZHl9KTtcbiAgICpcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IobmFtZSwgcHJvcHMgPSB7fSkge1xuICAgIC8vIEFMTE9XIEZPUiBHRU5FUklDIE1BUCBQUk9QRVJUWVxuXG4gICAgQ2hhbm5lbEZldGNoLnZhbGlkYXRlTWFwTWV0aG9kKHByb3BzLCBuYW1lKVxuXG4gICAgaWYgKHByb3BzLm1hcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcm9wcy5tYXBGbiA9IHByb3BzLm1hcFxuICAgIH1cbiAgICBwcm9wcy5leHRlbmRlZEFjdGlvbnNBcnIgPSBbXG4gICAgICBgJHtuYW1lfV9SRVNQT05TRV9FVkVOVGAsXG4gICAgICBbYCR7bmFtZX1fUkVRVUVTVF9FVkVOVGAsICdvbkZldGNoVXBkYXRlJ11cbiAgICBdXG4gICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0cnVlXG4gICAgc3VwZXIobmFtZSwgcHJvcHMpXG4gIH1cblxuICBzdGF0aWMgdmFsaWRhdGVNYXBNZXRob2QocHJvcHMsIG5hbWUsIHRlc3RNb2RlID0gZmFsc2UpIHtcbiAgICBjb25zdCBpc05vdEVtcHR5ID0gYXJyID0+IGFyci5sZW5ndGggPj0gMVxuICAgIGNvbnN0IGlzTm90RnVuY3Rpb24gPSB2YWwgPT4gdHlwZW9mICh2YWwpICE9PSAnZnVuY3Rpb24nXG4gICAgY29uc3QgaXNVbmRlZmluZWRPcldyb25nVHlwZSA9IGVpdGhlcihpc05pbCwgaXNOb3RGdW5jdGlvbilcbiAgICBjb25zdCBpc1VuZGVmaW5lZCA9IGFsbChpc1VuZGVmaW5lZE9yV3JvbmdUeXBlKVxuICAgIGNvbnN0IGlzTm90VW5kZWZpbmVkQW5kSXNOb3RFbXB0eSA9IGFsbFBhc3MoW2lzVW5kZWZpbmVkLCBpc05vdEVtcHR5XSlcbiAgICBjb25zdCBtYXBNZXRob2RJc0ludmFsaWQgPSBjb21wb3NlKGlzTm90VW5kZWZpbmVkQW5kSXNOb3RFbXB0eSwgdmFsdWVzLCBwaWNrKFsnbWFwJywgJ21hcEZuJ10pKShwcm9wcylcblxuICAgIGlmIChtYXBNZXRob2RJc0ludmFsaWQpIHtcbiAgICAgIGlmICh0ZXN0TW9kZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgbWFwIG1ldGhvZCBmb3IgQ2hhbm5lbEZldGNoLCAke25hbWV9LCBhcHBlYXJzIHRvIGJlIGludmFsaWRgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIG9uUmVnaXN0ZXJlZChwcm9wcyA9IHRoaXMucHJvcHMpIHtcbiAgICBpZiAocHJvcHM/LnBhdXNlICE9PSB0cnVlKSB7XG4gICAgICB0aGlzLnN0YXJ0RmV0Y2goKVxuICAgIH1cbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKG5hbWUpIHtcbiAgICBjb25zdCBhcnIgPSBbXG4gICAgICAnQ0hBTk5FTF9SRVNQT05TRV9FVkVOVCcsXG4gICAgICBbJ0NIQU5ORUxfVVBEQVRFX1JFU1BPTlNFX0VWRU5UJywgJ29uRmV0Y2hVcGRhdGUnXSxcbiAgICAgIFsnQ0hBTk5FTF9GRVRDSF9SRVFVRVNUX0VWRU5UJywgJ29uRmV0Y2hVcGRhdGUnXVxuICAgIF1cblxuICAgIGNvbnN0IGV4dGVuZGVkQXJyID0gY29tcG9zZShkZWZhdWx0VG8oW10pLCBwYXRoKFsncHJvcHMnLCAnZXh0ZW5kZWRBY3Rpb25zQXJyJ10pKVxuICAgIHJldHVybiBhcnIuY29uY2F0KGV4dGVuZGVkQXJyKHRoaXMpKVxuICB9XG5cbiAgc3RhcnRGZXRjaChvcHRpb25zID0ge30sIHN1YnNjcmliZXIgPSB0aGlzLm9uRmV0Y2hSZXR1cm5lZC5iaW5kKHRoaXMpKSB7XG4gICAgY29uc3QgZmV0Y2hQcm9wcyA9IHRoaXMuY29uc29saWRhdGVBbGxGZXRjaFByb3BzKG9wdGlvbnMpXG4gICAgcmV0dXJuIG5ldyBDaGFubmVsRmV0Y2hVdGlsKGZldGNoUHJvcHMsIHN1YnNjcmliZXIsIGZhbHNlLCB0aGlzLnByb3BzLm5hbWUpXG4gIH1cblxuICBvbkZldGNoVXBkYXRlKGV2dCkge1xuICAgIGNvbnN0IHByb3BzT3B0aW9ucyA9IHRoaXMuZ2V0UHJvcHNGb3JGZXRjaChldnQpXG4gICAgdGhpcy5zdGFydEZldGNoKHByb3BzT3B0aW9ucylcbiAgfVxuXG4gIG9uRmV0Y2hSZXR1cm5lZChzdHJlYW1JdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ2hhbm5lbFBheWxvYWRJdGVtKHN0cmVhbUl0ZW0pXG4gIH1cblxuICBjcmVhdGVDaGFubmVsUGF5bG9hZEl0ZW0ocGF5bG9hZCwgYWN0aW9uID0gYCR7dGhpcy5wcm9wcy5uYW1lfV9SRVNQT05TRV9FVkVOVGApIHtcbiAgICBjb25zdCB7IG5hbWUsIHNlbmRDYWNoZWRQYXlsb2FkLCB1cmwgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCBzcmNFbGVtZW50ID0geyBuYW1lLCBzZW5kQ2FjaGVkUGF5bG9hZCwgdXJsIH1cbiAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQpXG4gIH1cblxuICBnZXRQcm9wc0ZvckZldGNoKGV2dCkge1xuICAgIGNvbnN0IGRhdGFPYmogPSBwYXRoKFsndmlld1N0cmVhbUluZm8nLCAncGF5bG9hZCddLCBldnQpXG4gICAgcmV0dXJuIHBpY2soWydtYXBGbicsICd1cmwnLCAnaGVhZGVyJywgJ2JvZHknLCAnbW9kZScsICdtZXRob2QnLCAncmVzcG9uc2VUeXBlJywgJ2RlYnVnJ10sIGRhdGFPYmopXG4gIH1cblxuICBjb25zb2xpZGF0ZUFsbEZldGNoUHJvcHMob3B0aW9ucywgcHJvcHMgPSB0aGlzLnByb3BzKSB7XG4gICAgY29uc3QgcHJvcHNPcHRpb25zID0gcGljayhbJ21hcEZuJywgJ3VybCcsICdoZWFkZXInLCAnYm9keScsICdtb2RlJywgJ21ldGhvZCcsICdyZXNwb25zZVR5cGUnLCAnZGVidWcnXSwgcHJvcHMpXG4gICAgY29uc3QgbWVyZ2VPcHRpb25zID0gKG8xLCBvMikgPT4gbWVyZ2VEZWVwUmlnaHQobzEsIG8yKVxuICAgIGNvbnN0IGZpbHRlck91dFVuZGVmaW5lZCA9IHJlamVjdChpc05pbClcbiAgICByZXR1cm4gY29tcG9zZShmaWx0ZXJPdXRVbmRlZmluZWQsIG1lcmdlT3B0aW9ucykocHJvcHNPcHRpb25zLCBvcHRpb25zKVxuICB9XG5cbiAgZ2V0IG9ic2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVyJFxuICB9XG59XG4iLCJpbXBvcnQge1xuICBtZXJnZUFsbCxcbiAgY2xvbmUsXG4gIGZyb21QYWlycyxcbiAgdG9QYWlycyxcbiAgY29tcG9zZSxcbiAgaW5jbHVkZXMsXG4gIHBpY2tBbGwsXG4gIGx0ZSxcbiAgZGVmYXVsdFRvLFxuICBwcm9wLFxuICBpc1xufSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgc2FmZUNsb25lIH0gZnJvbSAnLi4vdXRpbHMvc2FmZS1jbG9uZS5qcydcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxQYXlsb2FkIHtcbiAgLyoqXG4gICAqXG4gICAqIEFsbCBDaGFubmVsIGRhdGEgaXMgcHVibGlzaGVkIHVzaW5nIHRoaXMgaW50ZXJmYWNlLlxuICAgKiBAbW9kdWxlIENoYW5uZWxQYXlsb2FkXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2hhbm5lbE5hbWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHNyY0VsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICpcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGNoYW5uZWxOYW1lIC0gPSB1bmRlZmluZWQ7IFRoZSBuYW1lIG9mIHRoZSBDaGFubmVsIHRoYXQgaXMgc2VuZGluZyB0aGUgcGF5bG9hZC5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IGFjdGlvbiAtID0gdW5kZWZpbmVkOyBBbiBhY3Rpb24gc3RyaW5nIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoaW4gdGhlIENoYW5uZWwncyBhZGRSZWdpc3RlcmVkQWN0aW9ucyBtZXRob2QuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXlsb2FkIC0gPSB1bmRlZmluZWQ7IFRoZSBkYXRhIG9iamVjdC5cbiAgICogQHByb3BlcnR5IHtIVE1MRWxlbWVudH0gc3JjRWxlbWVudCAtID0ge307IFRoaXMgaXMgcG9wdWxhdGVkIHdoZW4gdHJpZ2dlcmVkIGZyb20gYSBWaWV3U3RyZWFtIGluc3RhbmNlLlxuICAgKiBAcHJvcGVydHkge1VJRXZlbnR9IGV2ZW50IC0gPSB1bmRlZmluZWQ7IFRoZSBVSUV2ZW50LCBpZiBhbnkuXG4gICAqIEByZXR1cm5zIFZhbGlkYXRlZCBDaGFubmVsUGF5bG9hZCBqc29uIG9iamVjdFxuICAgKi9cbiAgY29uc3RydWN0b3IoY2hhbm5lbE5hbWUsIGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQsIHRpbWVMYWJlbCkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSBjaGFubmVsTmFtZVxuICAgIC8vIHBheWxvYWQgPSBDaGFubmVsUGF5bG9hZC5kZWVwRnJlZXplKHBheWxvYWQpO1xuXG4gICAgaWYgKHRpbWVMYWJlbCkge1xuICAgICAgY29uc29sZS50aW1lKHRpbWVMYWJlbClcbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsUGF5bG9hZEl0ZW1PYmogPSB7IGNoYW5uZWxOYW1lLCBhY3Rpb24sIHNyY0VsZW1lbnQsIGV2ZW50IH1cbiAgICAvLyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2hhbm5lbFBheWxvYWRJdGVtT2JqLCAncGF5bG9hZCcsIHtnZXQ6ICgpID0+IGNsb25lKHBheWxvYWQpfSk7XG4gICAgY29uc3QgZnJvemVuUGF5bG9hZCA9IENoYW5uZWxQYXlsb2FkLmRlZXBGcmVlemUocGF5bG9hZClcbiAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmoucGF5bG9hZCA9IGZyb3plblBheWxvYWRcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaGVscHMgd2l0aCBkZXN0cnVjdHVyaW5nIGJ5IG1lcmdpbmcgYWxsIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqIEpTT04gT2JqZWN0XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFWyc8aDQ+RGVzdHJ1Y3R1cmluZyBQcm9wZXJ0aWVzIHVzaW5nIHRoZSBDaGFubmVsUGF5bG9hZCBwcm9wcyBNZXRob2Q8L2g0PiddXG4gICAgICogbGV0IHtlbCwgYWN0aW9uLCBteVZhbH0gPSBwYXlsb2FkLnByb3BzKCk7XG4gICAgICpcbiAgICAgKlxuICAgICAqL1xuXG4gICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwYXlsb2FkLCAncGF5bG9hZCcpKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWRTdHIgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKVxuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHRoZSBmb2xsb3dpbmcgcGF5bG9hZCBjb250YWlucyBhIG5lc3RlZCBwYXlsb2FkIHByb3BlcnR5IHdoaWNoIG1heSBjcmVhdGUgY29uZmxpY3RzOiBBY3Rpb246ICR7YWN0aW9ufSwgJHtwYXlsb2FkU3RyfWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoYW5uZWxBY3Rpb25zQXJyID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmdldENoYW5uZWxBY3Rpb25zKGNoYW5uZWwpXG5cbiAgICAgIENoYW5uZWxQYXlsb2FkLnZhbGlkYXRlQWN0aW9uKGFjdGlvbiwgY2hhbm5lbCwgY2hhbm5lbEFjdGlvbnNBcnIpXG4gICAgfVxuXG4gICAgY2hhbm5lbFBheWxvYWRJdGVtT2JqLmNsb25lID0gKCkgPT4gbWVyZ2VBbGwoW1xuICAgICAgeyBwYXlsb2FkOnNhZmVDbG9uZShjaGFubmVsUGF5bG9hZEl0ZW1PYmoucGF5bG9hZCkgfSxcbiAgICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5wYXlsb2FkLFxuICAgICAgeyBjaGFubmVsOiBjbG9uZShjaGFubmVsKSB9LFxuICAgICAgeyBldmVudDogY2xvbmUoZXZlbnQpIH0sXG4gICAgICB7IHNyY0VsZW1lbnQgfSxcbiAgICAgIGNsb25lKGNoYW5uZWxQYXlsb2FkSXRlbU9iai5zcmNFbGVtZW50KSwgeyBhY3Rpb246IGNsb25lKGNoYW5uZWxQYXlsb2FkSXRlbU9iai5hY3Rpb24pIH1cbiAgICBdKVxuXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHMgPSB7XG4gICAgICAkZGlyOiB7XG4gICAgICAgIGdldDogKCkgPT4gY2hhbm5lbFBheWxvYWRJdGVtT2JqLl9kaXIsXG4gICAgICAgIHNldDogKHZhbCkgPT4ge1xuICAgICAgICAgIGNoYW5uZWxQYXlsb2FkSXRlbU9iai5fZGlyID0gdmFsXG4gICAgICAgICAgcmV0dXJuIHZhbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoYW5uZWwgPT09ICdDSEFOTkVMX1JPVVRFJykge1xuICAgICAgLy8gY2hhbm5lbFBheWxvYWRJdGVtT2JqWydsb2NhdGlvbiddID0gQ2hhbm5lbFBheWxvYWQuZ2V0TG9jYXRpb25EYXRhKCk7XG4gICAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcy5sb2NhdGlvbiA9IHtcbiAgICAgICAgZ2V0OiAoKSA9PiBDaGFubmVsUGF5bG9hZC5nZXRMb2NhdGlvbkRhdGEoKVxuICAgICAgfVxuICAgICAgLyogY2hhbm5lbFBheWxvYWRJdGVtT2JqUHJvcHNbJ3JvdXRlRGF0YSddID0ge1xuICAgICAgICBnZXQ6ICgpPT5wcm9wKCdyb3V0ZURhdGEnLCBmcm96ZW5QYXlsb2FkKVxuICAgICAgfVxuKi9cbiAgICB9XG5cbiAgICBjaGFubmVsUGF5bG9hZEl0ZW1PYmouX2RpciA9IHVuZGVmaW5lZFxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoY2hhbm5lbFBheWxvYWRJdGVtT2JqLCBjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcylcblxuICAgIGlmICh0aW1lTGFiZWwpIHtcbiAgICAgIGNvbnNvbGUudGltZUVuZCh0aW1lTGFiZWwpXG4gICAgfVxuICAgIHJldHVybiBjaGFubmVsUGF5bG9hZEl0ZW1PYmpcbiAgfVxuXG4gIHN0YXRpYyB2YWxpZGF0ZUFjdGlvbihhY3Rpb24sIGNoYW5uZWwsIGFycikge1xuICAgIGNvbnN0IGlzSW5BcnIgPSBpbmNsdWRlcyhhY3Rpb24sIGFycilcbiAgICBpZiAoaXNJbkFyciA9PT0gZmFsc2UgJiYgU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYHdhcm5pbmc6IEFjdGlvbjogJyR7YWN0aW9ufScgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aGluIHRoZSAke2NoYW5uZWx9IGNoYW5uZWwhYClcbiAgICB9XG4gICAgcmV0dXJuIGlzSW5BcnJcbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvbkRhdGEoKSB7XG4gICAgY29uc3QgbG9jYXRpb25QYXJhbXNBcnIgPSBbXG4gICAgICAnaHJlZicsXG4gICAgICAnb3JpZ2luJyxcbiAgICAgICdwcm90b2NvbCcsXG4gICAgICAnaG9zdCcsXG4gICAgICAnaG9zdG5hbWUnLFxuICAgICAgJ3BvcnQnLFxuICAgICAgJ3BhdGhuYW1lJyxcbiAgICAgICdzZWFyY2gnLFxuICAgICAgJ2hhc2gnXVxuICAgIHJldHVybiBwaWNrQWxsKGxvY2F0aW9uUGFyYW1zQXJyLCB3aW5kb3cubG9jYXRpb24pXG4gIH1cblxuICBzdGF0aWMgZ2V0U3RyZWFtSXRlbSgpIHtcblxuICB9XG5cbiAgc3RhdGljIGRlZXBDbG9uZShvKSB7XG4gICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSlcbiAgICBjb25zdCBpc09iaiA9IGlzKE9iamVjdClcbiAgICBjb25zdCBpc0l0ZXIgPSBvYiA9PiBpc0FycihvYikgPT09IGZhbHNlICYmIGlzT2JqKG9iKSA9PT0gdHJ1ZVxuICAgIGNvbnN0IGlzSXRlcmFibGUgPSBpc0l0ZXIobylcbiAgICByZXR1cm4gaXNJdGVyYWJsZSA/IGNvbXBvc2UoZnJvbVBhaXJzLCB0b1BhaXJzLCBjbG9uZSkobykgOiBjbG9uZShvKVxuICB9XG5cbiAgc3RhdGljIGRlZXBGcmVlemUobykge1xuICAgIC8vIHJldHVybiBvO1xuICAgIC8vIHJldHVybiBPYmplY3QuZnJlZXplKG8pO1xuICAgIGNvbnN0IGVsSXNEb21FbGVtZW50ID0gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpXG5cbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShvKVxuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMobykuZm9yRWFjaChmdW5jdGlvbihwcm9wKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcHJvcCkgJiZcbiAgICAgICAgICAgIGVsSXNEb21FbGVtZW50KG9bcHJvcF0pID09PSBmYWxzZSAmJlxuICAgICAgICAgICAgb1twcm9wXSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgKHR5cGVvZiBvW3Byb3BdID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb1twcm9wXSA9PT0gJ2Z1bmN0aW9uJykgJiZcbiAgICAgICAgICAgICFPYmplY3QuaXNGcm96ZW4ob1twcm9wXSkpIHtcbiAgICAgICAgICBDaGFubmVsUGF5bG9hZC5kZWVwRnJlZXplKG9bcHJvcF0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJGUkVFWkUgRVJSIFwiLHtvLGV9KTtcbiAgICAgIHJldHVybiBvXG4gICAgfVxuXG4gICAgcmV0dXJuIG9cbiAgfVxuXG4gIHN0YXRpYyBnZXRNb3VzZUV2ZW50S2V5cygpIHtcbiAgICByZXR1cm4gWydhbHRLZXknLCAnYnViYmxlcycsICdjYW5jZWxCdWJibGUnLCAnY2FuY2VsYWJsZScsICdjbGllbnRYJywgJ2NsaWVudFknLCAnY29tcG9zZWQnLCAnY3RybEtleScsICdjdXJyZW50VGFyZ2V0JywgJ2RlZmF1bHRQcmV2ZW50ZWQnLCAnZGV0YWlsJywgJ2V2ZW50UGhhc2UnLCAnZnJvbUVsZW1lbnQnLCAnaXNUcnVzdGVkJywgJ2xheWVyWCcsICdsYXllclknLCAnbWV0YUtleScsICdtb3ZlbWVudFgnLCAnbW92ZW1lbnRZJywgJ29mZnNldFgnLCAnb2Zmc2V0WScsICdwYWdlWCcsICdwYWdlWScsICdwYXRoJywgJ3JlbGF0ZWRUYXJnZXQnLCAncmV0dXJuVmFsdWUnLCAnc2NyZWVuWCcsICdzY3JlZW5ZJywgJ3NoaWZ0S2V5JywgJ3NvdXJjZUNhcGFiaWxpdGllcycsICdzcmNFbGVtZW50JywgJ3RhcmdldCcsICd0aW1lU3RhbXAnLCAndG9FbGVtZW50JywgJ3R5cGUnLCAndmlldycsICd3aGljaCcsICd4JywgJ3knXVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBTdWJqZWN0LCBSZXBsYXlTdWJqZWN0LCBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBpbmNsdWRlcyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgZGVsYXlDYWxsIH0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzLmpzJ1xuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFByb3h5IGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIENoYW5uZWxQcm94eVxuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIEEgcHJveHkgY2hhbm5lbCBpcyBjcmVhdGVkIHdoZW4gYSBjaGFubmVsIGlzIHN1YnNjcmliZWQgdG8gYmVmb3JlIGl0IGlzIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihuYW1lLCBwcm9wcyA9IHt9KSB7XG4gICAgcHJvcHMuaXNQcm94eSA9IHRydWVcbiAgICBzdXBlcihuYW1lLCBwcm9wcylcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcbiAgICB0aGlzLnN1YmplY3QkID0gbmV3IFN1YmplY3QoKVxuICAgIHRoaXMucmVwbGF5U3ViJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpXG4gICAgdGhpcy5vYnNlcnZlciQgPSBtZXJnZSh0aGlzLnN1YmplY3QkLCB0aGlzLnJlcGxheVN1YiQpXG4gICAgY29uc3QgaXNEZXZNb2RlID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnXG4gICAgaWYgKGlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5jaGVja0lmQ2hhbm5lbElzU3RpbGxQcm94eShuYW1lKVxuICAgIH1cbiAgfVxuXG4gIGdldE1lcmdlZFN1YmplY3QocGVyaXN0RGF0YSA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHBlcmlzdERhdGEgPT09IHRydWUgPyB0aGlzLnJlcGxheVN1YiQgOiB0aGlzLnN1YmplY3QkXG4gIH1cblxuICBjaGVja0lmQ2hhbm5lbElzU3RpbGxQcm94eShjaGFubmVsTmFtZSkge1xuICAgIGNvbnN0IG5hbWUgPSBjaGFubmVsTmFtZVxuXG4gICAgY29uc3QgY2hlY2tJZlByb3h5ID0gKCkgPT4ge1xuICAgICAgY29uc3QgYm9vbCA9IGluY2x1ZGVzKG5hbWUsIFNweW5lQXBwUHJvcGVydGllcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzKCkpXG4gICAgICBpZiAoYm9vbCAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBjaGFubmVsLCAke25hbWV9IGRvZXMgbm90IGFwcGVhciB0byBiZSByZWdpc3RlcmVkIWApXG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVsYXlDYWxsKGNoZWNrSWZQcm94eSwgMTAwMClcbiAgfVxuXG4gIGdldCByZXBsYXlTdWJqZWN0KCkge1xuICAgIHJldHVybiB0aGlzLnJlcGxheVN1YiRcbiAgfVxuXG4gIGdldCBzdWJqZWN0KCkge1xuICAgIHJldHVybiB0aGlzLnN1YmplY3QkXG4gIH1cbn1cbiIsImltcG9ydCB7IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcyB9IGZyb20gJy4vY2hhbm5lbHMtY29uZmlnLmpzJ1xuaW1wb3J0IHsgQ2hhbm5lbFBheWxvYWQgfSBmcm9tICcuL2NoYW5uZWwtcGF5bG9hZC1jbGFzcy5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgUm91dGVDaGFubmVsVXBkYXRlciB9IGZyb20gJy4uL3V0aWxzL3JvdXRlLWNoYW5uZWwtdXBkYXRlci5qcydcblxuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgZm9ya0pvaW4sIEVNUFRZIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZpbHRlciwgbWFwLCB0YWtlLCBjb21iaW5lTGF0ZXN0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHtcbiAgaWZFbHNlLFxuICBpZGVudGl0eSxcbiAgaGVhZCxcbiAgbWVyZ2VBbGwsXG4gIG9iak9mLFxuICB2aWV3LFxuICBpcyxcbiAgY2hhaW4sXG4gIGxlbnNJbmRleCxcbiAgYWx3YXlzLFxuICBmcm9tUGFpcnMsXG4gIHBhdGgsXG4gIGlzRW1wdHksXG4gIGVxdWFscyxcbiAgcHJvcCxcbiAgcHJvcEVxXG4gICwgbWFwIGFzIHJNYXBcbn0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbFxuICAgKiBAdHlwZSBleHRlbmRhYmxlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoZSBDaGFubmVsIGNvbXBvbmVudCB3cmFwcyBtZXRob2RzIGFuZCBmdW5jdGlvbmFsaXR5IGFyb3VuZCBhbiBSeEpzIFN1YmplY3QsIHRvIGNyZWF0ZSBhIG9uZS13YXkgZGF0YSBmbG93IGJldHdlZW4gaXRzZWxmIGFuZCBvdGhlciBDaGFubmVscyBhbmQgVmlld1N0cmVhbXMuPC9wPlxuICAgKiA8cD5DaGFubmVscyBnZXQgZGF0YSBieSBpbXBvcnRpbmcganNvbiBvYmplY3RzLCBzdWJzY3JpYmluZyB0byBvdGhlciBDaGFubmVscyBhbmQgYnkgcGFyc2luZyBWaWV3U3RyZWFtIGluZm8uPC9wPlxuICAgKiA8aDM+VGhlIEJhc2ljIENoYW5uZWwgU3RydWN0dXJlPC9oMz5cbiAgICogPHVsPlxuICAgKiA8bGk+Q2hhbm5lbHMgcmVxdWlyZXMgYSB1bmlxdWUgbmFtZSwgZm9yIGV4YW1wbGUsIDxiPkNIQU5ORUxfTVlDSEFOTkVMPC9iPiwgd2hpY2ggY29tcG9uZW50cyB1c2UgdG8gc2VsZWN0IGFuZCBzdWJzY3JpYmUgdG8gYW55IGNoYW5uZWwuPC9saT5cbiAgICogPGxpPkNoYW5uZWxzIGFyZSBpbnN0YW50aWF0ZWQgYW5kICdyZWdpc3RlcmVkJyB3aXRoIHRoZSBMSU5LWydTcHluZUFwcCcsICdzcHluZS1hcHAnXS48L2xpPlxuICAgKiA8bGk+Q2hhbm5lbHMgcmVtYWluIHBlcnNpc3RlbnQgYW5kIGFyZSBub3QgZGVsZXRlZC48L2xpPlxuICAgKiA8L3VsPlxuICAgKiA8aDM+Q29tcG9uZW50cyB0aGF0IGV4dGVuZCBDaGFubmVsPC9oMz5cbiAgICogPHVsPlxuICAgKiA8bGk+VGhlIGZvdXIgU3B5bmUgQ2hhbm5lbHMsIExJTktbJ1NweW5lQ2hhbm5lbFVJJywgJ3NweW5lLWNoYW5uZWwtdS1pJ10sIExJTktbJ1NweW5lQ2hhbm5lbFdpbmRvdycsICdzcHluZS1jaGFubmVsLXdpbmRvdyddLCBMSU5LWydTcHluZUNoYW5uZWxSb3V0ZScsICdzcHluZS1jaGFubmVsLXJvdXRlJ10gYW5kIExJTktbJ1NweW5lQ2hhbm5lbExpZmVjeWNsZScsICdzcHluZS1jaGFubmVsLWxpZmVjeWNsZSddLCBhbGwgZXh0ZW5kIENoYW5uZWwuPC9saT5cbiAgICogPGxpPkNoYW5uZWxGZXRjaCBhbHNvIGV4dGVuZHMgQ2hhbm5lbCwgYWRkcyBhIENoYW5uZWxGZXRjaFV0aWwgY29tcG9uZW50IHRvIGltbWVkaWF0ZWx5IHB1Ymxpc2ggZmV0Y2hlZCByZXNwb25zZXMuPC9saT5cbiAgICogPC91bD5cbiAgICogPGgzPlNlbmRpbmcgQ2hhbm5lbFBheWxvYWRzPC9oMz5cbiAgICogICA8cD5DaGFubmVscyBzZW5kIGRhdGEgdXNpbmcgdGhlIDxhIGNsYXNzPSdsaW5rZXInIGRhdGEtY2hhbm5lbD1cIlJPVVRFXCIgIGRhdGEtZXZlbnQtcHJldmVudC1kZWZhdWx0PVwidHJ1ZVwiIGRhdGEtbWVudS1pdGVtPVwiY2hhbm5lbC1zZW5kLWNoYW5uZWwtcGF5bG9hZFwiICBocmVmPVwiL2d1aWRlL3JlZmVyZW5jZS9jaGFubmVsLXNlbmQtY2hhbm5lbC1wYXlsb2FkXCIgPnNlbmRDaGFubmVsUGF5bG9hZDwvYT5cbiAgIG1ldGhvZC48L3A+XG4gICAqXG4gICAqXG4gICAqIDxoMz5SZWNlaXZpbmcgRGF0YSBmcm9tIFZpZXdTdHJlYW0gSW5zdGFuY2VzPC9oMz5cbiAgICogPHA+Vmlld1N0cmVhbXMgY2FuIHNlbmQgZGF0YSB0byBhbnkgY3VzdG9tIGNoYW5uZWwgdXNpbmcgdGhlIDxhIGNsYXNzPSdsaW5rZXInIGRhdGEtY2hhbm5lbD1cIlJPVVRFXCIgIGRhdGEtZXZlbnQtcHJldmVudC1kZWZhdWx0PVwidHJ1ZVwiIGRhdGEtbWVudS1pdGVtPVwidmlldy1zdHJlYW0tc2VuZC1pbnRvLXRvLWNoYW5uZWxcIiAgaHJlZj1cIi9ndWlkZS9yZWZlcmVuY2Uvdmlldy1zdHJlYW0tc2VuZC1pbmZvLXRvLWNoYW5uZWxcIiA+c2VuZEluZm9Ub0NoYW5uZWw8L2E+XG4gICBtZXRob2QuIENoYW5uZWxzIGNhbSBsaXN0ZW4gdG8gYW55IFZpZXdTdHJlYW0gZGF0YSBkaXJlY3RlZCB0byBpdHNlbGYgdGhyb3VnaCB0aGUgZGVmYXVsdCBtZXRob2QsIDxhIGNsYXNzPSdsaW5rZXInIGRhdGEtY2hhbm5lbD1cIlJPVVRFXCIgIGRhdGEtZXZlbnQtcHJldmVudC1kZWZhdWx0PVwidHJ1ZVwiIGRhdGEtbWVudS1pdGVtPVwiY2hhbm5lbC1vbi12aWV3LXN0cmVhbS1pbmZvXCIgIGhyZWY9XCIvZ3VpZGUvcmVmZXJlbmNlL2NoYW5uZWwtb24tdmlldy1zdHJlYW0taW5mb1wiID5vblZpZXdTdHJlYW1JbmZvPC9hPi4gPC9wPlxuICAgKlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVtcIjxoND5SZWdpc3RlcmluZyBhIE5ldyBDaGFubmVsIEluc3RhbmNlPC9oND5cIl1cbiAgICogU3B5bmVBcHAucmVnaXN0ZXIobmV3IENoYW5uZWwoXCJDSEFOTkVMX01ZQ0hBTk5FTFwiKTtcbiAgICpcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBDSEFOTkVMX05BTUVcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFRoaXMganNvbiBvYmplY3QgdGFrZXMgaW4gcGFyYW1ldGVycyB0byBpbml0aWFsaXplIHRoZSBjaGFubmVsXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBDSEFOTkVMX05BTUUgLSA9IHVuZGVmaW5lZDsgVGhpcyB3aWxsIGJlIHRoZSByZWdpc3RlcmVkIG5hbWUgZm9yIHRoaXMgY2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BzIC0gPSB7fTsgVGhlIHByb3BzIG9iamVjdHMgYWxsb3dzIGZvciBjdXN0b20gcHJvcGVydGllcyBmb3IgdGhlIGNoYW5uZWwuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCAtID0gZmFsc2U7IFB1Ymxpc2hlcyBpdHMgbW9zdCBjdXJyZW50IHBheWxvYWQgdG8gbGF0ZSBzdWJzY3JpYmVycywgd2hlbiBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKENIQU5ORUxfTkFNRSwgcHJvcHMgPSB7fSkge1xuICAgIHRoaXMuYWRkUmVnaXN0ZXJlZEFjdGlvbnMuYmluZCh0aGlzKVxuICAgIHRoaXMuY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmooQ0hBTk5FTF9OQU1FLCBwcm9wcy5leHRlbmRlZEFjdGlvbnNBcnIpXG5cbiAgICAvLyBCYXNpYyBwcm9wcyBzZXR1cFxuICAgIHByb3BzLm5hbWUgPSBDSEFOTkVMX05BTUVcbiAgICBwcm9wcy5kZWZhdWx0QWN0aW9ucyA9IHByb3BzLmRhdGEgIT09IHVuZGVmaW5lZCA/IFtgJHtwcm9wcy5uYW1lfV9FVkVOVGBdIDogW11cbiAgICB0aGlzLnByb3BzID0gcHJvcHNcblxuICAgIHRoaXMucHJvcHMuaXNSZWdpc3RlcmVkID0gZmFsc2VcbiAgICB0aGlzLnByb3BzLmlzUHJveHkgPVxuICAgICAgdGhpcy5wcm9wcy5pc1Byb3h5ID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IHRoaXMucHJvcHMuaXNQcm94eVxuXG4gICAgLy8gRGV0ZXJtaW5lIGEgZGVmYXVsdCBmcm9tIHByZXNlbmNlIG9mIHByb3BzLmRhdGFcbiAgICBjb25zdCBkZWZhdWx0Q2FjaGVkUGF5bG9hZEJvb2wgPSB0aGlzLnByb3BzLmRhdGEgIT09IHVuZGVmaW5lZFxuXG4gICAgLy8gSWYgcHJvcHMucmVwbGF5IGlzIGRlZmluZWQsIG92ZXJyaWRlIHNlbmRDYWNoZWRQYXlsb2FkIHdpdGggaXQuXG4gICAgLy8gT3RoZXJ3aXNlLCB1c2UgdGhlIGV4aXN0aW5nIHNlbmRDYWNoZWRQYXlsb2FkIHByb3BlcnR5IG9yIGRlZmF1bHQuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnJlcGxheSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0aGlzLnByb3BzLnJlcGxheVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkID1cbiAgICAgICAgdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBkZWZhdWx0Q2FjaGVkUGF5bG9hZEJvb2xcbiAgICAgICAgICA6IHRoaXMucHJvcHMuc2VuZENhY2hlZFBheWxvYWRcbiAgICB9XG5cbiAgICB0aGlzLnNlbmRQYXlsb2FkVG9Sb3V0ZUNoYW5uZWwgPSBuZXcgUm91dGVDaGFubmVsVXBkYXRlcih0aGlzKVxuICAgIHRoaXMuY3JlYXRlQ2hhbm5lbEFjdGlvbk1ldGhvZHMoKVxuXG4gICAgLy8gU2V0IHVwIHN0cmVhbXNcbiAgICB0aGlzLnN0cmVhbXNDb250cm9sbGVyID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNoYW5uZWxzTWFwXG4gICAgY29uc3Qgb2JzZXJ2ZXIkID0gdGhpcy5nZXRNYWluT2JzZXJ2ZXIoKVxuICAgIHRoaXMuY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUgPSBDaGFubmVsLmNoZWNrRm9yUGVyc2lzdGVudERhdGFNb2RlLmJpbmQodGhpcylcbiAgICB0aGlzLm9ic2VydmVyJCA9IHRoaXMucHJvcHMub2JzZXJ2ZXIgPSBvYnNlcnZlciRcblxuICAgIC8vIFN1YnNjcmliZSB0byBESVNQQVRDSEVSXG4gICAgY29uc3QgZGlzcGF0Y2hlclN0cmVhbSQgPSB0aGlzLnN0cmVhbXNDb250cm9sbGVyLmdldFN0cmVhbSgnRElTUEFUQ0hFUicpXG4gICAgY29uc3QgcGF5bG9hZFByZWRCeUNoYW5uZWxOYW1lID0gcHJvcEVxKHByb3BzLm5hbWUsICduYW1lJylcbiAgICBkaXNwYXRjaGVyU3RyZWFtJFxuICAgICAgLnBpcGUoZmlsdGVyKHBheWxvYWRQcmVkQnlDaGFubmVsTmFtZSkpXG4gICAgICAuc3Vic2NyaWJlKCh2YWwpID0+IHRoaXMub25SZWNlaXZlZE9ic2VydmFibGUodmFsKSlcbiAgfVxuXG4gIGdldE1haW5PYnNlcnZlcigpIHtcbiAgICBpZiAodGhpcy5zdHJlYW1zQ29udHJvbGxlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBmb2xsb3dpbmcgY2hhbm5lbCwgJHt0aGlzLnByb3BzLm5hbWV9LCBhcHBlYXJzIHRvIGJlIHJlZ2lzdGVyZWQgYmVmb3JlIFNweW5lIGhhcyBiZWVuIGluaXRpYWxpemVkLmApXG4gICAgfVxuXG4gICAgY29uc3QgcHJveHlFeGlzdHMgPSB0aGlzLnN0cmVhbXNDb250cm9sbGVyLnRlc3RTdHJlYW0odGhpcy5wcm9wcy5uYW1lKVxuXG4gICAgaWYgKHByb3h5RXhpc3RzID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdHJlYW1zQ29udHJvbGxlci5nZXRQcm94eVN1YmplY3QodGhpcy5wcm9wcy5uYW1lLCB0aGlzLnByb3BzLnNlbmRDYWNoZWRQYXlsb2FkKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9PT0gdHJ1ZSA/IG5ldyBSZXBsYXlTdWJqZWN0KDEpIDogbmV3IFN1YmplY3QoKVxuICAgIH1cbiAgfVxuXG4gIC8vICBPVkVSUklERSBJTklUSUFMSVpBVElPTiBNRVRIT0RcbiAgLyoqXG4gICAqIDxwPihEZXByZWNhdGVkLiBVc2Ugb25SZWdpc3RlcmVkKS4gVGhpcyBtZXRob2QgaXMgZW1wdHkgYW5kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBDaGFubmVsIGhhcyBiZWVuIHJlZ2lzdGVyZWQuPC9wPlxuICAgKiA8cD5UYXNrcyBzdWNoIGFzIHN1YnNjcmliaW5nIHRvIG90aGVyIGNoYW5uZWxzLCBhbmQgc2VuZGluZyBpbml0aWFsIHBheWxvYWRzIGNhbiBiZSBhZGRlZCBoZXJlLjwvcD5cbiAgICovXG4gIG9uQ2hhbm5lbEluaXRpYWxpemVkKCkge1xuXG4gIH1cblxuICAvLyAgT1ZFUlJJREUgSU5JVElBTElaQVRJT04gTUVUSE9EXG4gIC8qKlxuICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBlbXB0eSBhbmQgaXMgY2FsbGVkIGFzIHNvb24gYXMgdGhlIENoYW5uZWwgaGFzIGJlZW4gcmVnaXN0ZXJlZC48L3A+XG4gICAqIDxwPlRhc2tzIHN1Y2ggYXMgc3Vic2NyaWJpbmcgdG8gb3RoZXIgY2hhbm5lbHMsIGFuZCBzZW5kaW5nIGluaXRpYWwgcGF5bG9hZHMgY2FuIGJlIGFkZGVkIGhlcmUuPC9wPlxuICAgKi9cbiAgb25SZWdpc3RlcmVkKHByb3BzID0gdGhpcy5wcm9wcykge1xuICAgIGlmIChwcm9wcy5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IE9iamVjdC5rZXlzKHRoaXMuY2hhbm5lbEFjdGlvbnMpWzBdXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIkNIQU5ORUxTIEFDVElPTlMgSVMgXCIsdGhpcy5jaGFubmVsQWN0aW9ucyk7XG4gICAgICAvLyBPYmplY3QodGhpcy5jaGFubmVsQWN0aW9ucykua2V5c1swXTtcbiAgICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcHJvcHMuZGF0YSlcbiAgICB9XG4gIH1cblxuICBnZXQgaXNQcm94eSgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5pc1Byb3h5XG4gIH1cblxuICBnZXQgY2hhbm5lbE5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMubmFtZVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIHJldHVybnMgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIGZvciB0aGUgY2hhbm5lbFxuICAgKi9cbiAgZ2V0IG9ic2VydmVyKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVyJFxuICB9XG5cbiAgY2hlY2tGb3JUcmFpdHMoKSB7XG4gICAgY29uc3QgYWRkVHJhaXRzID0gKHRyYWl0cykgPT4ge1xuICAgICAgaWYgKHRyYWl0cy5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnQXJyYXknKSB7XG4gICAgICAgIHRyYWl0cyA9IFt0cmFpdHNdXG4gICAgICB9XG4gICAgICBjb25zdCBhZGRUcmFpdCA9IChUcmFpdENsYXNzKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgVHJhaXRDbGFzcyh0aGlzKVxuICAgICAgfVxuXG4gICAgICB0cmFpdHMuZm9yRWFjaChhZGRUcmFpdClcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy50cmFpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYWRkVHJhaXRzKHRoaXMucHJvcHMudHJhaXRzKVxuICAgIH1cbiAgfVxuXG4gIC8vIERPIE5PVCBPVkVSUklERSBUSElTIE1FVEhPRFxuICBpbml0aWFsaXplU3RyZWFtKCkge1xuICAgIHRoaXMuY2hlY2tGb3JUcmFpdHMoKVxuICAgIHRoaXMub25DaGFubmVsSW5pdGlhbGl6ZWQoKVxuICAgIHRoaXMuY2hlY2tGb3JQZXJzaXN0ZW50RGF0YU1vZGUoKVxuICAgIHRoaXMub25SZWdpc3RlcmVkKClcbiAgICB0aGlzLnByb3BzLmlzUmVnaXN0ZXJlZCA9IHRydWVcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclBlcnNpc3RlbnREYXRhTW9kZShwcm9wcyA9IHRoaXMucHJvcHMsIGFjdGlvbnNPYmogPSB0aGlzLmNoYW5uZWxBY3Rpb25zKSB7XG4gICAgY29uc3QgYWN0aW9uc09iaklzRW1wdHkgPSBpc0VtcHR5KGFjdGlvbnNPYmopXG4gICAgY29uc3QgZGF0YUlzQWRkZWQgPSBwcm9wKCdkYXRhJywgcHJvcHMpICE9PSB1bmRlZmluZWRcbiAgICBjb25zdCBhdXRvU2V0VG9DYWNoZWRQYXlsb2FkID0gYWN0aW9uc09iaklzRW1wdHkgPT09IHRydWUgJiYgZGF0YUlzQWRkZWQgPT09IHRydWVcbiAgICBjb25zdCBzZXREZWZhdWx0QWN0aW9uc09iaiA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcHJvcHNcbiAgICAgIGNvbnN0IGFjdGlvblN0ciA9IGAke25hbWV9X0VWRU5UYFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgW2FjdGlvblN0cl0gOiBhY3Rpb25TdHJcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYXV0b1NldFRvQ2FjaGVkUGF5bG9hZCkge1xuICAgICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0cnVlXG4gICAgICBhY3Rpb25zT2JqID0gc2V0RGVmYXVsdEFjdGlvbnNPYmooKVxuXG4gICAgICBpZiAodGhpcy5jaGFubmVsQWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBhY3Rpb25zT2JqXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coXCJQUk9QUyBJUyBcIix7YWN0aW9uc09iaklzRW1wdHksIGRhdGFJc0FkZGVkLCBwcm9wcywgYWN0aW9uc09ian0sIHRoaXMuY2hhbm5lbEFjdGlvbnMpXG4gICAgcmV0dXJuIHsgcHJvcHMsIGFjdGlvbnNPYmogfVxuICB9XG5cbiAgc2V0VHJhY2UoYm9vbCkge1xuICB9XG5cbiAgY3JlYXRlQ2hhbm5lbEFjdGlvbnNPYmoobmFtZSwgZXh0ZW5kZWRBY3Rpb25zQXJyID0gW10pIHtcbiAgICBjb25zdCBnZXRBY3Rpb25WYWwgPSBpZkVsc2UoaXMoU3RyaW5nKSwgaWRlbnRpdHksIGhlYWQpXG4gICAgY29uc3QgbWFpbkFyciA9IGV4dGVuZGVkQWN0aW9uc0Fyci5jb25jYXQodGhpcy5hZGRSZWdpc3RlcmVkQWN0aW9ucyhuYW1lKSlcbiAgICBjb25zdCBhcnIgPSByTWFwKGdldEFjdGlvblZhbCwgbWFpbkFycilcbiAgICBjb25zdCBjb252ZXJ0ZXIgPSBzdHIgPT4gb2JqT2Yoc3RyLCBzdHIpXG4gICAgY29uc3Qgb2JqID0gbWVyZ2VBbGwoY2hhaW4oY29udmVydGVyLCBhcnIpKVxuICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBvYmpcbiAgfVxuXG4gIGNyZWF0ZUNoYW5uZWxBY3Rpb25NZXRob2RzKCkge1xuICAgIGNvbnN0IGRlZmF1bHRGbiA9ICdvblZpZXdTdHJlYW1JbmZvJ1xuICAgIGNvbnN0IGdldEFjdGlvblZhbCA9IGlmRWxzZShpcyhTdHJpbmcpLCBpZGVudGl0eSwgaGVhZClcbiAgICBjb25zdCBkZWxheUNoZWNrSWZUcmFpdE1ldGhvZEhhc0JlZW5BZGRlZCA9IChtZXRob2RTdHIsIHZhbCkgPT4ge1xuICAgICAgY29uc3QgZGVsYXllciA9ICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzW21ldGhvZFN0cl0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFwiJHt0aGlzLnByb3BzLm5hbWV9XCIsIFJFUVVJUkVTIFRIRSBGT0xMT1dJTkcgTUVUSE9EICR7bWV0aG9kU3RyfSBGT1IgQUNUSU9OLCAke3ZhbFswXX1gKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aW5kb3cuc2V0VGltZW91dChkZWxheWVyLCAxMDApXG4gICAgfVxuXG4gICAgY29uc3QgZ2V0Q3VzdG9tTWV0aG9kID0gdmFsID0+IHtcbiAgICAgIGNvbnN0IG1ldGhvZFN0ciA9IHZpZXcobGVuc0luZGV4KDEpLCB2YWwpXG4gICAgICBkZWxheUNoZWNrSWZUcmFpdE1ldGhvZEhhc0JlZW5BZGRlZChtZXRob2RTdHIsIHZhbClcbiAgICAgIHJldHVybiBtZXRob2RTdHJcbiAgICB9XG5cbiAgICBjb25zdCBnZXRBcnJNZXRob2QgPSAgaWZFbHNlKGlzKFN0cmluZyksIGFsd2F5cyhkZWZhdWx0Rm4pLCBnZXRDdXN0b21NZXRob2QpXG5cbiAgICBjb25zdCBjcmVhdGVPYmogPSB2YWwgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gZ2V0QWN0aW9uVmFsKHZhbClcbiAgICAgIGNvbnN0IG1ldGhvZCA9ICBnZXRBcnJNZXRob2QodmFsKVxuICAgICAgcmV0dXJuIFtrZXksIG1ldGhvZF1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWxBY3Rpb25NZXRob2RzID0gZnJvbVBhaXJzKHJNYXAoY3JlYXRlT2JqLCB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkpKVxuXG4gICAgLy8gY29uc29sZS5sb2coJ3RoZSBjaGFubmVsIGFjdGlvbiBtZXRob2RzICcsdGhpcy5jaGFubmVsQWN0aW9uTWV0aG9kcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+Q2hhbm5lbHMgc2VuZCBhbG9uZyBBY3Rpb24gbmFtZXMgYWxvbmcgd2l0aCBpdHMgcGF5bG9hZC48L3A+XG4gICAqIDxwPkJlZm9yZSBhbnkgYWN0aW9uIGNhbiBiZSB1c2VkLCB0aGF0IGFjdGlvbiBuZWVkcyB0byBiZSByZWdpc3RlcmVkIHVzaW5nIHRoaXMgbWV0aG9kLjwvcD5cbiAgICogPHA+Vmlld1N0cmVhbSBpbnN0YW5jZXMgY2FuIGZpbHRlciBDaGFubmVsUGF5bG9hZHMgYnkgYmluZGluZyBzcGVjaWZpYyBMSU5LWydhY3Rpb25zIHRvIGxvY2FsIG1ldGhvZHMnLCAndmlldy1zdHJlYW0tYWRkLWFjdGlvbi1saXN0ZW5lcnMnXS48L3A+XG4gICAqIDxwPkZvcmNpbmcgcmVnaXN0cmF0aW9uIG9mIGFjdGlvbnMgYWxsb3dzIFNweW5lIHRvIHZhbGlkYXRlIEFjdGlvbnMsIGFuZCBpcyBhbHNvIGEgdXNlZnVsIHdheSB0byBrZWVwIHRyYWNrIG9mIGFsbCBBY3Rpb25zIHRoYXQgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQuPC9wPlxuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBBcnJheSBvZiBTdHJpbmdzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlJlZ2lzdGVyaW5nIEFjdGlvbnMgaW4gdGhlIGFkZFJlZ2lzdGVyZWRBY3Rpb25zIG1ldGhvZDwvaDQ+XCJdXG4gICAqICAgIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgKiAgICAgcmV0dXJuIFtcbiAgICogICAgICAgICdDSEFOTkVMX01ZX0NIQU5ORUxfRVZFTlQnLFxuICAgKiAgICAgICAgJ0NIQU5ORUxfTVlfQ0hBTk5FTF9VUERBVEVfRVZFTlQnXG4gICAqICAgICAgIF07XG4gICAqICAgICAgfVxuICAgKlxuICAgKi9cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgbGV0IGFyciA9IFtdXG4gICAgaWYgKHBhdGgoWydwcm9wcycsICdkYXRhJ10sIHRoaXMpKSB7XG4gICAgICBhcnIgPSBbYCR7dGhpcy5wcm9wcy5uYW1lfV9FVkVOVGBdXG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIG9uUmVjZWl2ZWRPYnNlcnZhYmxlKG9iaikge1xuICAgIHRoaXMub25JbmNvbWluZ09ic2VydmFibGUob2JqKVxuICB9XG5cbiAgZ2V0QWN0aW9uTWV0aG9kRm9yT2JzZXJ2YWJsZShvYmopIHtcbiAgICBvYmoudW5wYWNrZWQgPSB0cnVlXG4gICAgY29uc3QgZGVmYXVsdEZuID0gdGhpcy5vblZpZXdTdHJlYW1JbmZvLmJpbmQodGhpcylcblxuICAgIGNvbnN0IG1ldGhvZFN0ciA9IHBhdGgoWydkYXRhJywgJ2FjdGlvbiddLCBvYmopXG4gICAgY29uc3QgbWV0aG9kVmFsID0gcHJvcChtZXRob2RTdHIsIHRoaXMuY2hhbm5lbEFjdGlvbk1ldGhvZHMpXG5cbiAgICBsZXQgZm4gPSBkZWZhdWx0Rm5cblxuICAgIGlmIChtZXRob2RWYWwgIT09IHVuZGVmaW5lZCAmJiBtZXRob2RWYWwgIT09ICdvblZpZXdTdHJlYW1JbmZvJykge1xuICAgICAgY29uc3QgbWV0aG9kRXhpc3RzID0gdHlwZW9mICh0aGlzW21ldGhvZFZhbF0pID09PSAnZnVuY3Rpb24nXG4gICAgICBpZiAobWV0aG9kRXhpc3RzID09PSB0cnVlKSB7XG4gICAgICAgIGZuID0gdGhpc1ttZXRob2RWYWxdLmJpbmQodGhpcylcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZm5cbiAgfVxuXG4gIG9uSW5jb21pbmdPYnNlcnZhYmxlKG9iaikge1xuICAgIGNvbnN0IGVxc05hbWUgPSBlcXVhbHMob2JqLm5hbWUsIHRoaXMucHJvcHMubmFtZSlcbiAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCB9ID0gb2JqLmRhdGFcbiAgICAvLyBjb25zb2xlLmxvZyhcIklOQ09NSU5HIFwiLHthY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnR9LCB7b2JqfSk7XG4gICAgY29uc3QgbWVyZ2VQcm9wcyA9IChkKSA9PiBtZXJnZUFsbChbZCwgeyBhY3Rpb246IHByb3AoJ2FjdGlvbicsIGQpIH0sIHByb3AoJ3BheWxvYWQnLCBkKSwgcHJvcCgnc3JjRWxlbWVudCcsIGQpXSlcbiAgICBjb25zdCBkYXRhT2JqID0gb2JzVmFsID0+ICh7XG4gICAgICBjbG9uZTogKCkgPT4gbWVyZ2VQcm9wcyhvYmouZGF0YSksXG4gICAgICBhY3Rpb24sXG4gICAgICBwYXlsb2FkLFxuICAgICAgc3JjRWxlbWVudCxcbiAgICAgIGV2ZW50OiBvYnNWYWxcbiAgICB9KVxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChvYmopID0+IG9iai5vYnNlcnZhYmxlLnBpcGUobWFwKGRhdGFPYmopKVxuICAgICAgLnN1YnNjcmliZSh0aGlzLmdldEFjdGlvbk1ldGhvZEZvck9ic2VydmFibGUob2JqKSlcbiAgICBjb25zdCBvbkVycm9yID0gKCkgPT4ge31cbiAgICByZXR1cm4gZXFzTmFtZSA9PT0gdHJ1ZSA/IG9uU3VjY2VzcyhvYmopIDogb25FcnJvcigpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogPHA+Vmlld1N0ZWFtIGluc3RhbmNlcyBjYW4gc2VuZCBpbmZvIHRvIGNoYW5uZWxzIHRocm91Z2ggaXRzIExJTktbJ3NlbmRJbmZvVG9DaGFubmVsLCAndmlldy1zdHJlYW0tc2VuZC1pbmZvLXRvLWNoYW5uZWwnXSBtZXRob2QuPC9wPlxuICAgKiA8cD5EYXRhIHJlY2VpdmVkIGZyb20gVmlld1N0cmVhbXMgYXJlIGRpcmVjdGVkIHRvIHRoaXMgbWV0aG9kLjwvcD5cbiAgICogPHA+Vmlld1N0cmVhbXMgc2VuZCBkYXRhIHVzaW5nIHRoZSBMSU5LWydWaWV3U3RyZWFtUGF5bG9hZCcsICd2aWV3LXN0cmVhbS1wYXlsb2FkJ10gZm9ybWF0LjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtWaWV3U3RyZWFtUGF5bG9hZH0gb2JqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlBhcnNpbmcgRGF0YSBSZXR1cm5lZCBmcm9tIGEgVmlld1N0cmVhbSBJbnN0YW5jZTwvaDQ+XCJdXG4gICAqIG9uVmlld1N0cmVhbUluZm8ob2JqKXtcbiAgICogICAgIGxldCBkYXRhID0gb2JqLnZpZXdTdHJlYW1JbmZvO1xuICAgKiAgICAgbGV0IGFjdGlvbiA9IGRhdGEuYWN0aW9uO1xuICAgKiAgICAgbGV0IG5ld1BheWxvYWQgPSB0aGlzLnBhcnNlVmlld1N0cmVhbURhdGEoZGF0YSk7XG4gICAqICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIG5ld1BheWxvYWQpO1xuICAgKiB9XG4gICAqXG4gICAqXG4gICAqL1xuICBvblZpZXdTdHJlYW1JbmZvKG9icykge1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqXG4gICAqIDxwPlRoaXMgbWV0aG9kIHRha2VzIGFuIGFjdGlvbiwgYSBkYXRhIG9iamVjdCBhbmQgb3RoZXIgcHJvcGVydGllcyB0byBjcmVhdGUgYW5kIHB1Ymxpc2ggYSBMSU5LWydDaGFubmVsUGF5bG9hZCcsICdjaGFubmVsLXBheWxvYWQnXSBvYmplY3QuPC9wPlxuICAgKiA8cD5PbmNlIHRoZSBhY3Rpb24gYW5kIHBheWxvYWQgaXMgdmFsaWRhdGVkLCB0aGlzIG1ldGhvZCB3aWxsIHB1Ymxpc2ggdGhlIGRhdGEgYnkgdXNpbmcgdGhlIGNoYW5uZWwncyBzb3VyY2UgU3ViamVjdCBuZXh0KCkgbWV0aG9kLlxuICAgKiA8cD5UaGlzIGNvbnNpc3RlbnQgZm9ybWF0IGFsbG93cyBzdWJzY3JpYmVycyB0byB1bmRlcnN0YW5kIGhvdyB0byBwYXJzZSBhbnkgaW5jb21pbmcgY2hhbm5lbCBkYXRhLjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvblxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBzcmNFbGVtZW50XG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JzZXJ2YWJsZX0gb2JzJFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gYWN0aW9uIC0gPSB1bmRlZmluZWQ7IFJlcXVpcmVkLiBBbiBhY3Rpb24gaXMgYSBzdHJpbmcsIHR5cGljYWxseSBpbiB0aGUgZm9ybWF0IG9mIFwiQ0hBTk5FTF9OQU1FX0FDVElPTl9OQU1FX0VWRU5UXCIsIGFuZCB0aGF0IGhhcyBiZWVuIGFkZGVkIGluIHRoZSBhZGRSZWdpc3RlcmVkQWN0aW9ucyBtZXRob2QuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXlsb2FkIC0gPSB1bmRlZmluZWQ7IFJlcXVpcmVkLiBUaGlzIGNhbiBiZSBhbnkgamF2YXNjcmlwdCBvYmplY3QgYW5kIGlzIHVzZWQgdG8gc2VuZCBhbnkgY3VzdG9tIGRhdGEuXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEVsZW1lbnR9IHNyY0VsZW1lbnQgLSA9IE5vdCBSZXF1aXJlZC4gdW5kZWZpbmVkOyBUaGlzIGNhbiBiZSBlaXRoZXIgdGhlIGVsZW1lbnQgcmV0dXJuZWQgZnJvbSB0aGUgVUkgQ2hhbm5lbCwgb3IgdGhlIHNyY0VsZW1lbnQgZnJvbSBhIFZpZXdTdHJlYW0gaW5zdGFuY2UuXG4gICAqIEBwcm9wZXJ0eSB7VUlFdmVudH0gZXZlbnQgLSA9IHVuZGVmaW5lZDsgTm90IFJlcXVpcmVkLiBUaGlzIHdpbGwgYmUgZGVmaW5lZCBpZiB0aGUgZXZlbnQgaXMgZnJvbSB0aGUgVUkgQ2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtPYnNlcnZhYmxlfSBvYnMkIC0gPSB0aGlzLm9ic2VydmVyOyBUaGlzIGRlZmF1bHQgaXMgdGhlIHNvdXJjZSBvYnNlcnZhYmxlIGZvciB0aGlzIGNoYW5uZWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+UHVibGlzaGluZyBhIENoYW5uZWxQYXlsb2FkPC9oND4nXVxuICAgKiBsZXQgYWN0aW9uID0gXCJDSEFOTkVMX01ZX0NIQU5ORUxfUkVHSVNURVJFRF9BQ1RJT05fRVZFTlRcIjtcbiAgICogbGV0IGRhdGEgPSB7Zm9vOlwiYmFyXCJ9O1xuICAgKiB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIGRhdGEpO1xuICAgKlxuICAgKi9cbiAgc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCA9IHt9LCBldmVudCA9IHt9LCBvYnMkID0gdGhpcy5vYnNlcnZlciQpIHtcbiAgICAvLyBNQUtFUyBBTEwgQ0hBTk5FTCBCQVNFIEFORCBEQVRBIFNUUkVBTVMgQ09OU0lTVEVOVFxuXG4gICAgY29uc3QgY2hhbm5lbFBheWxvYWRJdGVtID0gbmV3IENoYW5uZWxQYXlsb2FkKHRoaXMucHJvcHMubmFtZSwgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICAvLyBjb25zb2xlLmxvZyhcIkNIQU5ORUwgU1RSRUVNIElURU0gXCIsY2hhbm5lbFBheWxvYWRJdGVtKTtcblxuICAgIC8vIGNvbnN0IG9uTmV4dEZyYW1lID0gKCk9Pm9icyQubmV4dChjaGFubmVsUGF5bG9hZEl0ZW0pO1xuICAgIC8vIHJlcXVlc3RBbmltYXRpb25GcmFtZShvbk5leHRGcmFtZSlcblxuICAgIG9icyQubmV4dChjaGFubmVsUGF5bG9hZEl0ZW0pXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogPHA+QWxsb3dzIGNoYW5uZWxzIHRvIHN1YnNjcmliZSB0byBvdGhlciBjaGFubmVscy48L3A+XG4gICAqIDxwPlRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNvdXJjZSByeGpzIFN1YmplY3QgZm9yIHRoZSByZXF1ZXN0ZWQgQ2hhbm5lbCwgd2hpY2ggY2FuIGJlIGxpc3RlbmVkIHRvIGJ5IGNhbGxpbmcgaXRzIHN1YnNjcmliZSBtZXRob2QuPC9wPlxuICAgKiA8cD5Lbm93bGVkZ2Ugb2YgcnhqcyBpcyBub3QgcmVxdWlyZWQgdG8gc3Vic2NyaWJlIHRvIGFuZCBwYXJzZSBDaGFubmVsIGRhdGEuPC9wPlxuICAgKiA8cD5CdXQgYWNjZXNzaW5nIHRoZSByeGpzIFN1YmplY3QgZ2l2ZXMgZGV2ZWxvcGVycyB0aGUgYWJpbGl0eSB0byB1c2UgYWxsIG9mIHRoZSBhdmFpbGFibGUgcnhqcyBtYXBwaW5nIGFuZCBvYnNlcnZhYmxlIHRvb2xzLjwvcD5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNoYW5uZWxOYW1lIFRoZSByZWdpc3RlcmVkIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBjaGFubmVsLlxuICAgKiBAcmV0dXJuc1xuICAgKiBUaGUgc291cmNlIHJ4anMgU3ViamVjdCBvZiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwuXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFW1wiPGg0PlN1YnNjcmliaW5nIHRvIGEgQ2hhbm5lbCBVc2luZyB0aGUgZ2V0Q2hhbm5lbCBtZXRob2Q8L2g0PlwiXVxuICAgKiBsZXQgcm91dGUkID0gdGhpcy5nZXRDaGFubmVsKFwiQ0hBTk5FTF9ST1VURVwiKVxuICAgKiByb3V0ZSQuc3Vic2NyaWJlKGxvY2FsTWV0aG9kKTtcbiAgICpcbiAgICpcbiAgICovXG4gIGdldENoYW5uZWwoY2hhbm5lbE5hbWUsIHBheWxvYWRGaWx0ZXIpIHtcbiAgICBjb25zdCBpc1ZhbGlkQ2hhbm5lbCA9IGMgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMoYylcbiAgICBjb25zdCBlcnJvciA9IGMgPT4gY29uc29sZS53YXJuKFxuICAgICAgICBgY2hhbm5lbCBuYW1lICR7Y30gaXMgbm90IHdpdGhpbiAke3JlZ2lzdGVyZWRTdHJlYW1OYW1lc31gKVxuICAgIGNvbnN0IHN0YXJ0U3Vic2NyaWJlID0gKGMpID0+IHtcbiAgICAgIGNvbnN0IG9icyQgPSB0aGlzLnN0cmVhbXNDb250cm9sbGVyLmdldFN0cmVhbShjKS5vYnNlcnZlclxuICAgICAgaWYgKG9icyQuc291cmNlKSB7XG4gICAgICAgIG9icyQuc291cmNlLmNoYW5uZWxOYW1lID0gY2hhbm5lbE5hbWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9icyQuY2hhbm5lbE5hbWUgPSBjaGFubmVsTmFtZVxuICAgICAgfVxuXG4gICAgICBpZiAocGF5bG9hZEZpbHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBvYnMkLnBpcGUoZmlsdGVyKHBheWxvYWRGaWx0ZXIpKVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb2JzJFxuICAgIH1cbiAgICBjb25zdCBmbiA9IGlmRWxzZShpc1ZhbGlkQ2hhbm5lbCwgc3RhcnRTdWJzY3JpYmUsIGVycm9yKVxuICAgIHJldHVybiBmbihjaGFubmVsTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSBDaGFubmVscyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0byBmb3JrSm9pbiBDaGFubmVsLm9ic2VydmVyJFxuICAgKlxuICAgKiAqL1xuXG4gIG1lcmdlQ2hhbm5lbHMoY2hhbm5lbHNBcnIsIGVtaXRPbmNlID0gdHJ1ZSkge1xuICAgIC8vIDEpIE5vcm1hbGl6ZSBpbnB1dHMgdG8gT2JzZXJ2YWJsZXNcbiAgICBjb25zdCBjaGFubmVsT2JzZXJ2YWJsZXMgPSBjaGFubmVsc0Fyci5tYXAoaXRlbSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGNvbnN0IGNoYW4kID0gdGhpcy5nZXRDaGFubmVsKGl0ZW0pXG4gICAgICAgIHJldHVybiBlbWl0T25jZSA/IGNoYW4kLnBpcGUodGFrZSgxKSkgOiBjaGFuJFxuICAgICAgfVxuICAgICAgcmV0dXJuIGVtaXRPbmNlID8gaXRlbS5waXBlKHRha2UoMSkpIDogaXRlbVxuICAgIH0pXG5cbiAgICAvLyAyKSBDb21iaW5lIHRoZW1cbiAgICBsZXQgY29tYmluZWQkXG4gICAgaWYgKGVtaXRPbmNlKSB7IC8vIG9uZeKAkXNob3Q6IHNuYXBzaG90IHRoZW4gY29tcGxldGVcbiAgICAgIGNvbWJpbmVkJCA9IGZvcmtKb2luKGNoYW5uZWxPYnNlcnZhYmxlcylcbiAgICB9IGVsc2UgeyAvLyBsaXZlIHVwZGF0ZXM6IGNvbWJpbmVMYXRlc3RXaXRoXG4gICAgICBpZiAoY2hhbm5lbE9ic2VydmFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb21iaW5lZCQgPSBFTVBUWVxuICAgICAgfSBlbHNlIGlmIChjaGFubmVsT2JzZXJ2YWJsZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvbWJpbmVkJCA9IGNoYW5uZWxPYnNlcnZhYmxlc1swXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgW2ZpcnN0JCwgLi4ucmVzdCRdID0gY2hhbm5lbE9ic2VydmFibGVzXG4gICAgICAgIGNvbWJpbmVkJCA9IGZpcnN0JC5waXBlKGNvbWJpbmVMYXRlc3RXaXRoKC4uLnJlc3QkKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzKSBNYXAgYXJyYXkg4oaSIGtleWVkIG9iamVjdFxuICAgIC8vIHJldHVybiBjb21iaW5lZCQ7XG4gICAgcmV0dXJuIGNvbWJpbmVkJC5waXBlKFxuICAgICAgbWFwKHJlc3VsdHNBcnIgPT4ge1xuICAgICAgICBjb25zdCBvYmogPSB7fVxuICAgICAgICBjaGFubmVsc0Fyci5mb3JFYWNoKChpdGVtLCBpZHgpID0+IHtcbiAgICAgICAgICBjb25zdCBpdGVyS2V5ID0gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnID8gaXRlbSA6IGBjaGFubmVsXyR7aWR4fWBcbiAgICAgICAgICBjb25zdCBjbktleSA9IGl0ZW0/LnNvdXJjZT8uY2hhbm5lbE5hbWUgfHwgaXRlbT8uc291cmNlPy5zb3VyY2U/LmNoYW5uZWxOYW1lXG4gICAgICAgICAgY29uc3Qga2V5ID0gY25LZXkgfHwgaXRlcktleVxuICAgICAgICAgIG9ialtrZXldID0gcmVzdWx0c0FycltpZHhdXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBvYmpcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yTm90VHJhY2tGbGFnKHByb3BzID0ge30pIHtcbiAgICBpZiAocHJvcHMuZG9Ob3RUcmFjayA9PT0gdHJ1ZSkge1xuICAgICAgU3B5bmVBcHBQcm9wZXJ0aWVzLmRvTm90VHJhY2tDaGFubmVsKHByb3BzLmNoYW5uZWxOYW1lKVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBjb21wb3NlLCBwYXRoLCBpcyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5cbi8vIGNvbnNvbGUubG9nKCdjaGFubmVscyBjb25maWcgbG9hZGVkICcsUixSeCk7XG5jb25zdCByZWdpc3RlcmVkU3RyZWFtTmFtZXMgPSAoKSA9PiAoe1xuICBpbmNsdWRlczogICgpID0+IFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplZCA9PT0gdHJ1ZSA/IFNweW5lQXBwUHJvcGVydGllcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzKCkgOiBbJ0NIQU5ORUxfUk9VVEUnLCAnQ0hBTk5FTF9VSScsICdDSEFOTkVMX1dJTkRPVycsICdESVNQQVRDSEVSJ11cblxufSlcblxuLy8gZ2V0R2xvYmFsT2JqKCkuY2hhbm5lbHNMaXN0QXJyO1xuY29uc3QgcmVnaXN0ZXJlZFN0ZXBzID0gWydMT0FEJywgJ1JFTkRFUicsICdNT1VOVCcsICdVTk1PVU5UJywgJ0RJU1BPU0UnLCAnR0FSQkFHRV9DT0xMRUNUJywgJ1VQREFURSddXG5jb25zdCByZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzID0gWydwYXJlbnQnLCAnc2VsZicsICdjaGlsZCcsICdjaGlsZHJlbicsICd2aWV3J11cbmNvbnN0IHJlZ2lzdGVyZWRTdHJlYW1UeXBlcyA9IFsnT2JzZXJ2YWJsZScsICdCZWhhdmlvclN1YmplY3QnLCAnU3ViamVjdCcsICdPYnNlcnZlcicsICdTdWJzY3JpYmVyJywgJ0Zyb21FdmVudE9ic2VydmFibGUnXVxuY29uc3QgcmVnaXN0ZXJlZEFjdGlvbnMgPSBbJ3N1YnNjcmliZScsICdjb21iaW5lTGF0ZXN0J11cbmNvbnN0IGdldFJ4VHlwZSA9IChvYnMpID0+IG9icygpLmNvbnN0cnVjdG9yLm5hbWVcbi8vIGxldCBnZXRPYnNlcnZhYmxlVHlwZSA9IChvYnMpID0+IG9icy5jb25zdHJ1Y3Rvci5uYW1lO1xuY29uc3QgY29uZmlybU9ic2VydmFibGUgPSAob2JzKSA9PiBvYnMuc3Vic2NyaWJlICE9PSB1bmRlZmluZWRcbi8vIGxldCBwdWxsTWFpblJvdXRlID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoL14oXFwvPykoLiopKFxcLykoLiopL2csICckMicpO1xubGV0IGJhc2VWYWxpZGF0aW9ucyA9IFtdOyBsZXQgdmlld0luZm9WYWxpZGF0aW9ucyA9IFtdOyBsZXQgdWlWYWxpZGF0aW9ucyA9IFtdXG5sZXQgbGlmZXN0cmVhbVZhbGlkYXRpb25zID0gW107IGxldCBzdGVwVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBEaXNwb3NlVmFsaWRhdGlvbnMgPSBbXTsgbGV0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtdXG5sZXQgcm91dGVWYWxpZGF0aW9ucyA9IFtdOyBsZXQgU3RyZWFtc0NvbmZpZyA9IFtdXG5cbmlmIChjb21wb3NlICE9PSB1bmRlZmluZWQgJiYgT2JzZXJ2YWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4vLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFMTCBWQUxJREFUSU9OUyBBREQgVEhFIEJBU0UgVkFMSURBVElPTlMgVEhST1VHSCBDT05DQVRFTkFUSU9OXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYmFzZVZhbGlkYXRpb25zID0gW1xuICAgIHtcbiAgICAgIGVycm9yOiBgbmVlZCB0byBtYXRjaCBhIHZhbGlkIG5hbWUgd2l0aGluICR7cmVnaXN0ZXJlZFN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgIH0sXG5cbiAgICB7XG4gICAgICBlcnJvcjogJ3BhcmFtIFxcJ29ic2VydmFibGVcXCcgbXVzdCBjb250YWluIGEgdmFsaWQgT2JzZXJ2YWJsZScsXG4gICAgICAvLyBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbVR5cGVzLmluY2x1ZGVzKGdldE9ic2VydmFibGVUeXBlKHBheWxvYWQub2JzZXJ2YWJsZSkpXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gY29uZmlybU9ic2VydmFibGUocGF5bG9hZC5vYnNlcnZhYmxlKVxuICAgIH0sXG4gICAge1xuICAgICAgZXJyb3I6ICdwYXJhbSBhY3Rpb24gbXVzdCBiZSBhIHJlZ2lzdGVyZWQgYWN0aW9uJyxcbiAgICAgIHByZWRpY2F0ZTogcGF5bG9hZCA9PiByZWdpc3RlcmVkQWN0aW9ucy5pbmNsdWRlcyhwYXlsb2FkLmFjdGlvbilcbiAgICB9XG5cbiAgXVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRIRVNFIFZBTElEQVRJT05TIEFSRSBDT05DQVRFTkFURUQgV0hFTiBUSEUgT0JTRVJWQUJMRSBSRUZFUlMgVE8gQSBWSUVXXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmlld0luZm9WYWxpZGF0aW9ucyA9IFtcbiAgICB7XG4gICAgICBlcnJvcjogJ25lZWRzIHZzaWQgbnVtYmVyIGluIHNyY0VsZW1lbnQnLFxuICAgICAgcHJlZGljYXRlOiBjb21wb3NlKGlzKFN0cmluZyksIHBhdGgoWydkYXRhJywgJ3NyY0VsZW1lbnQnLCAndnNpZCddKSlcbiAgICB9LFxuICAgIHtcbiAgICAgIGVycm9yOiAnbmVlZHMgYSBpZCBpbiBzcmNFbGVtZW50JyxcbiAgICAgIHByZWRpY2F0ZTogY29tcG9zZShpcyhTdHJpbmcpLFxuICAgICAgICBwYXRoKFsnZGF0YScsICdzcmNFbGVtZW50JywgJ2lkJ10pKVxuICAgIH1cbiAgXVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTk8gU1BFQ0lGSUMgVUkgVkFMSURBVElPTlMgQVQgVEhJUyBUSU1FIC0tIElUIEpVU1QgQUREIE9USEVSU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHVpVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCB1aVZhbGlkYXRpb25zID0gW11cbiAgICByZXR1cm4gdWlWYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKS5jb25jYXQodmlld0luZm9WYWxpZGF0aW9ucylcbiAgfVxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5PIFNQRUNJRklDIExJRkVTVFJFQU0gVkFMSURBVElPTlMgQVQgVEhJUyBUSU1FIC0tIElUIEpVU1QgQUREIE9USEVSU1xuICBjb25zdCBsaWZlU3RyZWFtVmFsaWRhdGlvbnMgPSBbXG5cbiAgICB7XG4gICAgICBlcnJvcjogYG5lZWQgdG8gbWF0Y2ggYSB2YWxpZCBuYW1lIHdpdGhpbiAke3JlZ2lzdGVyZWRTdHJlYW1UeXBlc31gLFxuICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRTdHJlYW1OYW1lcygpLmluY2x1ZGVzKHBheWxvYWQubmFtZSlcbiAgICB9LFxuXG4gICAge1xuICAgICAgZXJyb3I6IGBuZWVkcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdGVwIHN0cmluZ3M6ICR7cmVnaXN0ZXJlZFN0ZXBzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0ZXBzLmluY2x1ZGVzKHBheWxvYWQuU1RFUClcbiAgICB9LFxuICAgIHtcbiAgICAgIGVycm9yOiBgdHlwZSBuZWVkcyB0byBvbmUgb2YgdGhlIGZvbGxvd2luZzogJHtyZWdpc3RlcmVkTGlmZVN0cmVhbVR5cGVzfWAsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZExpZmVTdHJlYW1UeXBlcy5pbmNsdWRlcyhwYXlsb2FkLnR5cGUpXG4gICAgfSxcblxuICAgIHtcbiAgICAgIGVycm9yOiAndmlld0lkIG5lZWRzIHRvIGJlIGFkZGVkICcsXG4gICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC52aWV3SWQgIT09IHVuZGVmaW5lZFxuICAgIH1cbiAgXVxuXG4gIHN0ZXBWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBWYWxpZGF0aW9ucyA9IFtdXG4gICAgcmV0dXJuIHN0ZXBWYWxpZGF0aW9ucy5jb25jYXQobGlmZVN0cmVhbVZhbGlkYXRpb25zKVxuICB9XG5cbiAgc3RlcERpc3Bvc2VWYWxpZGF0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHN0ZXBVcGRhdGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdESVNQT1NFIFNURVAgcmVxdWlyZXMgYSBkaXNwb3NlSXRlbSBwYXJhbSBpbiB0aGUgZGF0YSBvYmplY3QnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC5TVEVQID09PSAnRElTUE9TRScgJiZcbiAgICAgICAgICAgIHBheWxvYWQuZGF0YS5kaXNwb3NlSXRlbXMgIT09IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIF1cbiAgICByZXR1cm4gc3RlcFVwZGF0ZVZhbGlkYXRpb25zLmNvbmNhdChsaWZlU3RyZWFtVmFsaWRhdGlvbnMpXG4gIH1cblxuICBzdGVwVXBkYXRlVmFsaWRhdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzdGVwVXBkYXRlVmFsaWRhdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIGVycm9yOiAnVVBEQVRFIFNURVAgcmVxdWlyZXMgYSBkYXRhIG9iamVjdCAnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcGF5bG9hZC5TVEVQID09PSAnVVBEQVRFJyAmJiBwYXlsb2FkLmRhdGEgIT09XG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgIH1cbiAgICBdXG4gICAgcmV0dXJuIHN0ZXBVcGRhdGVWYWxpZGF0aW9ucy5jb25jYXQobGlmZVN0cmVhbVZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gbGlmZXN0cmVhbVZhbGlkYXRpb25zXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGlmZXN0cmVhbVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGxpZmVTdHJlYW1WYWxpZGF0aW9ucy5jb25jYXQoYmFzZVZhbGlkYXRpb25zKVxuICAgICAgLmNvbmNhdCh2aWV3SW5mb1ZhbGlkYXRpb25zKVxuICB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSEVSRSBJUyBUSEUgUk9VVEUgVkFMSURBVElPTlNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICByb3V0ZVZhbGlkYXRpb25zID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3Qgcm91dGVWYWxpZGF0aW9ucyA9IFtcbiAgICAgIC8qXG4gICAgICAqXG4gICAgICB7XG4gICAgICAgICAgZXJyb3I6IGBuZWVkcyBhIHZhbGlkIHJvdXRlIHN0cmluZyB3aXRoaW4gWyR7cmVnaXN0ZXJlZFJvdXRlc31dYCxcbiAgICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFJvdXRlcy5pbmNsdWRlcyhwdWxsTWFpblJvdXRlKHBheWxvYWQuZGF0YS5uYXZpZ2F0ZVRvKSlcbiAgICAgIH1cbiAgICAgICpcbiAgICAgICovXG5cbiAgICBdXG4gICAgcmV0dXJuIHJvdXRlVmFsaWRhdGlvbnMuY29uY2F0KGJhc2VWYWxpZGF0aW9ucykuY29uY2F0KHZpZXdJbmZvVmFsaWRhdGlvbnMpXG4gIH1cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKlxuICAqIFRIRSBJREVBIE9GIFN0cmVhbXNDb25maWcgSVMgVE8gQ09NUExFVEVMWSBHRU5FUkFURSBBTEwgQVBQIFNUUkVBTVMgVVNJTkcgVEhJUyBPQkpFQ1RcbiAgKiBUSElTIEhBUyBOT1QgQkVFTiBJTVBMRU1FTlRFRCAtLSBNQVkgQkUgQURERUQgSU4gQSBGVVRVUkUgVkVSU0lPTlxuICAqL1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFN0cmVhbXNDb25maWcgPSBmdW5jdGlvbigpIHtcbiAgICBjb25zdCBzdHJlYW1WYWxpZGF0aW9ucyA9IFtcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBcXCduYW1lXFwnIG11c3QgYmUgb2YgYSByZWdpc3RlcmVkIHR5cGUnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMocGF5bG9hZC5uYW1lKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBcXCdvYnNlcnZhYmxlXFwnIG11c3QgY29udGFpbiBhIHZhbGlkIE9ic2VydmFibGUnLFxuICAgICAgICBwcmVkaWNhdGU6IHBheWxvYWQgPT4gcmVnaXN0ZXJlZFN0cmVhbVR5cGVzLmluY2x1ZGVzKFxuICAgICAgICAgIGdldFJ4VHlwZShwYXlsb2FkLm9ic2VydmFibGUpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZXJyb3I6ICdwYXJhbSBhY3Rpb24gbXVzdCBiZSBhIHJlZ2lzdGVyZWQgYWN0aW9uJyxcbiAgICAgICAgcHJlZGljYXRlOiBwYXlsb2FkID0+IHJlZ2lzdGVyZWRBY3Rpb25zLmluY2x1ZGVzKHBheWxvYWQuYWN0aW9uKVxuICAgICAgfVxuXG4gICAgXVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmVhbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGluaXQ6IHtcbiAgICAgICAgICAgIG5hbWU6ICdESVNQQVRDSEVSJyxcbiAgICAgICAgICAgIG9ic2VydmFibGU6ICgpID0+IG5ldyBTdWJqZWN0KCksXG4gICAgICAgICAgICBhY3Rpb246ICdzdWJzY3JpYmUnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdHJ1Y3R1cmU6IHtcbiAgICAgICAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgICAgICAgIG9ic2VydmFibGU6IE9ic2VydmFibGUgfHwgU3ViamVjdCxcbiAgICAgICAgICAgIGFjdGlvbjogU3RyaW5nXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2YWxpZGF0aW9uczogc3RyZWFtVmFsaWRhdGlvbnNcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGluaXQ6IHtcbiAgICAgICAgICAgIG5hbWU6ICdVQlUnLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogKCkgPT4gbmV3IFN1YmplY3QoKSxcbiAgICAgICAgICAgIGFjdGlvbjogJ3N1YnNjcmliZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0cnVjdHVyZToge1xuICAgICAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICAgICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZSB8fCBTdWJqZWN0LFxuICAgICAgICAgICAgYWN0aW9uOiBTdHJpbmdcbiAgICAgICAgICB9LFxuICAgICAgICAgIHZhbGlkYXRpb25zOiBzdHJlYW1WYWxpZGF0aW9uc1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9XG59XG5leHBvcnQge1xuICBzdGVwRGlzcG9zZVZhbGlkYXRpb25zLCBzdGVwVXBkYXRlVmFsaWRhdGlvbnMsIHN0ZXBWYWxpZGF0aW9ucywgdWlWYWxpZGF0aW9ucywgcm91dGVWYWxpZGF0aW9ucywgbGlmZXN0cmVhbVZhbGlkYXRpb25zLCByZWdpc3RlcmVkU3RyZWFtTmFtZXMsIFN0cmVhbXNDb25maWdcbn1cbiIsImltcG9ydCB7IFNweW5lQ2hhbm5lbFJvdXRlIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLXJvdXRlLmpzJ1xuaW1wb3J0IHsgU3B5bmVDaGFubmVsVUkgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtdWkuanMnXG5pbXBvcnQgeyBTcHluZUNoYW5uZWxXaW5kb3cgfSBmcm9tICcuL3NweW5lLWNoYW5uZWwtd2luZG93LmpzJ1xuaW1wb3J0IHsgU3B5bmVDaGFubmVsTGlmZWN5Y2xlIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLWxpZmVjeWNsZS5qcydcbmltcG9ydCB7IFNweW5lQ2hhbm5lbEFJIH0gZnJvbSAnLi9zcHluZS1jaGFubmVsLWFpLmpzJ1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IENoYW5uZWxQcm94eSB9IGZyb20gJy4vY2hhbm5lbC1wcm94eS5qcydcbmltcG9ydCB7IHByb3BFcSwgcGx1Y2ssIHByb3AsIGZpbHRlciwgcGF0aEVxLCByZWplY3QsIGNvbXBvc2UsIGpvaW4sIG1hcCBhcyByTWFwIH0gZnJvbSAncmFtZGEnXG5cbmNvbnN0IF9tYXAgPSBuZXcgTWFwKClcblxuZXhwb3J0IGNsYXNzIENoYW5uZWxzTWFwIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbHNEZWxlZ2F0b3JcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGRlc2NcbiAgICogVGhpcyBvYmplY3QgY3JlYXRlcyB0aGUgbG9naWMgc28gdGhhdCBDaGFubmVscyBhbmQgVmlld1N0cmVhbXMgY2FuIGNvbW11bmljYXRlIHdpdGggZWFjaCBvdGhlclxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICAgIF9tYXAuc2V0KCdESVNQQVRDSEVSJywgbmV3IFN1YmplY3QoKSlcbiAgICB0aGlzLmxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMgPSBDaGFubmVsc01hcC5saXN0UmVnaXN0ZXJlZENoYW5uZWxzLmJpbmQodGhpcylcbiAgICB0aGlzLmdldENoYW5uZWxzTGlzdCA9IENoYW5uZWxzTWFwLmdldENoYW5uZWxzTGlzdC5iaW5kKHRoaXMpXG4gIH1cblxuICBnZXQgbWFwKCkge1xuICAgIHJldHVybiBfbWFwXG4gIH1cblxuICBzdGF0aWMgZ2V0Q2hhbm5lbHNMaXN0KCkge1xuICAgIGNvbnN0IHByb3h5TWFwRm4gPSAgKGssIHYpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGtbMF1cbiAgICAgIGNvbnN0IHZhbCA9IGtbMV0uY29uc3RydWN0b3IubmFtZVxuICAgICAgcmV0dXJuIHsga2V5LCB2YWwgfVxuICAgIH1cbiAgICByZXR1cm4gQXJyYXkuZnJvbShfbWFwLCBwcm94eU1hcEZuKVxuICB9XG5cbiAgc3RhdGljIGxpc3RSZWdpc3RlcmVkQ2hhbm5lbHMoc2hvd09ubHlQcm94aWVzID0gZmFsc2UpIHtcbiAgICBjb25zdCBwcm94eU1hcCA9IHRoaXMuZ2V0Q2hhbm5lbHNMaXN0KClcbiAgICBjb25zdCByZWplY3RQcm94eUZuID0gcmVqZWN0KHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZpbHRlclByb3h5Rm4gPSBmaWx0ZXIocHJvcEVxKCdDaGFubmVsUHJveHknLCAndmFsJykpXG4gICAgY29uc3QgZm4gPSBzaG93T25seVByb3hpZXMgPT09IHRydWUgPyBmaWx0ZXJQcm94eUZuIDogcmVqZWN0UHJveHlGblxuICAgIGNvbnN0IHJlbW92ZWRQcm94eUFyciA9IGZuKHByb3h5TWFwKVxuICAgIHJldHVybiBwbHVjayhbJ2tleSddLCByZW1vdmVkUHJveHlBcnIpXG4gIH1cblxuICBsaXN0UHJveHlDaGFubmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzKHRydWUpXG4gIH1cblxuICBjaGVja0Zvck1pc3NpbmdDaGFubmVscygpIHtcbiAgICBjb25zdCBwcm94eU1hcCA9IHRoaXMuZ2V0Q2hhbm5lbHNMaXN0KClcbiAgICBjb25zdCBmaWx0ZXJQcm94eUZuID0gZmlsdGVyKHByb3BFcSgnQ2hhbm5lbFByb3h5JywgJ3ZhbCcpKVxuICAgIGNvbnN0IGZpbHRlclByb3h5QXJyID0gZmlsdGVyUHJveHlGbihwcm94eU1hcClcblxuICAgIGlmIChmaWx0ZXJQcm94eUFyci5sZW5ndGggPj0gMSkge1xuICAgICAgY29uc3QgY2hhbm5lbFN0ciA9IGZpbHRlclByb3h5QXJyLmxlbmd0aCA9PT0gMSA/ICdDaGFubmVsIGhhcycgOiAnQ2hhbm5lbHMgaGF2ZSdcbiAgICAgIGNvbnN0IGNoYW5uZWxzID0gY29tcG9zZShqb2luKCcsICcpLCByTWFwKHByb3AoJ2tleScpKSkoZmlsdGVyUHJveHlBcnIpXG4gICAgICBjb25zdCBmaWx0ZXJQcmVmaXhXYXJuaW5nID0gYFNweW5lIFdhcm5pbmc6IFRoZSBmb2xsb3dpbmcgJHtjaGFubmVsU3RyfSBub3QgYmVlbiBpbml0aWFsaXplZDogJHtjaGFubmVsc31gXG4gICAgICBjb25zb2xlLndhcm4oZmlsdGVyUHJlZml4V2FybmluZylcbiAgICB9XG4gIH1cblxuICBpbml0KCkge1xuICAgIHRoaXMuY3JlYXRlTWFpblN0cmVhbXMoKVxuICB9XG5cbiAgY3JlYXRlTWFpblN0cmVhbXMoKSB7XG4gICAgdGhpcy5yb3V0ZVN0cmVhbSA9IG5ldyBTcHluZUNoYW5uZWxSb3V0ZSgpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfUk9VVEUnLCB0aGlzLnJvdXRlU3RyZWFtKVxuXG4gICAgdGhpcy51aVN0cmVhbSA9IG5ldyBTcHluZUNoYW5uZWxVSSgpXG4gICAgX21hcC5zZXQoJ0NIQU5ORUxfVUknLCB0aGlzLnVpU3RyZWFtKVxuXG4gICAgdGhpcy5kb21TdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsV2luZG93KClcbiAgICBfbWFwLnNldCgnQ0hBTk5FTF9XSU5ET1cnLCB0aGlzLmRvbVN0cmVhbSlcblxuICAgIHRoaXMudmlld1N0cmVhbUxpZmVjeWNsZSA9IG5ldyBTcHluZUNoYW5uZWxMaWZlY3ljbGUoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX0xJRkVDWUNMRScsIHRoaXMudmlld1N0cmVhbUxpZmVjeWNsZSlcblxuICAgIHRoaXMuYWlTdHJlYW0gPSBuZXcgU3B5bmVDaGFubmVsQUkoKVxuICAgIF9tYXAuc2V0KCdDSEFOTkVMX0FJJywgdGhpcy5haVN0cmVhbSlcblxuICAgIHRoaXMucm91dGVTdHJlYW0uaW5pdGlhbGl6ZVN0cmVhbSgpXG4gICAgdGhpcy5kb21TdHJlYW0uaW5pdGlhbGl6ZVN0cmVhbSgpXG4gIH1cblxuICBhZGRLZXlFdmVudChrZXkpIHtcbiAgICBfbWFwLmdldCgnVUknKS5hZGRLZXlFdmVudChrZXkpXG4gIH1cblxuICByZWdpc3RlclN0cmVhbSh2YWwpIHtcbiAgICBjb25zdCBuYW1lID0gdmFsLmNoYW5uZWxOYW1lXG4gICAgY29uc3QgbmFtZUV4aXN0cyA9IF9tYXAuaGFzKG5hbWUpXG4gICAgaWYgKG5hbWVFeGlzdHMpIHtcbiAgICAgIGNvbnN0IGlzQWxyZWFkeVJlZ2lzdGVyZCA9IGNvbXBvc2UocGF0aEVxKFsncHJvcHMnLCAnaXNSZWdpc3RlcmVkJ10sIHRydWUpKShfbWFwLmdldChuYW1lKSlcbiAgICAgIGlmIChpc0FscmVhZHlSZWdpc3RlcmQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgQ2hhbm5lbCwgJHtuYW1lfSwgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIWApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cblxuICAgIF9tYXAuc2V0KG5hbWUsIHZhbClcbiAgICB2YWwuaW5pdGlhbGl6ZVN0cmVhbSgpXG4gIH1cblxuICBnZXRDaGFubmVsQWN0aW9ucyhzdHIpIHtcbiAgICByZXR1cm4gX21hcC5nZXQoc3RyKS5hZGRSZWdpc3RlcmVkQWN0aW9ucygpXG4gIH1cblxuICBnZXRQcm94eVN1YmplY3QobmFtZSwgaXNSZXBsYXlTdWJqZWN0ID0gZmFsc2UpIHtcbiAgICBjb25zdCBzdWJqZWN0VHlwZSA9IGlzUmVwbGF5U3ViamVjdCA9PT0gdHJ1ZSA/ICdyZXBsYXlTdWJqZWN0JyA6ICdzdWJqZWN0J1xuXG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpW3N1YmplY3RUeXBlXVxuICB9XG5cbiAgdGVzdFN0cmVhbShuYW1lKSB7XG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpICE9PSB1bmRlZmluZWRcbiAgfVxuXG4gIGdldFN0cmVhbShuYW1lKSB7XG4gICAgaWYgKHRoaXMudGVzdFN0cmVhbShuYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgIF9tYXAuc2V0KG5hbWUsIG5ldyBDaGFubmVsUHJveHkobmFtZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIF9tYXAuZ2V0KG5hbWUpXG4gIH1cblxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIENPUkUgREVDT1JBVE9SU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gbGV0IGNvcmVNaXhpbnMgPSAgYmFzZUNvcmVNaXhpbnMoKTtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgU1RSRUFNUyBERUNPUkFUT1JTXG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBsZXQgc3RyZWFtc01peGlucyA9IEJhc2VTdHJlYW1zTWl4aW5zKCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IENoYW5uZWwgfSBmcm9tICcuL2NoYW5uZWwuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxBSSBleHRlbmRzIENoYW5uZWwge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZUNoYW5uZWxBSVxuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIEludGVybmFsIENoYW5uZWwgdGhhdCBwdWJsaXNoZXMgcmVuZGVyaW5nIGFuZCBkaXNwb3NpbmcgZXZlbnRzIG9mIGFsbCBWaWV3U3RyZWFtcyB3aG9zZSBwcm9wZXJ0eSwgcHJvcGVyLnNlbmRBSUV2ZW50cyBpcyBzZXQgdG8gdHJ1ZS5cbiAgICpcbiAgICogPGgzPlRoZSB0d28gYWN0aW9ucyB0aGF0IGFyZSByZWdzaXRlcmVkIGZvciB0aGlzIGNoYW5uZWwgYXJlOjwvaDM+XG4gICAqIDx1bD5cbiAgICogPGxpPkNIQU5ORUxfQUlfUkVOREVSRURfRVZFTlQ8L2xpPlxuICAgKiA8bGk+Q0hBTk5FTF9BSV9ESVNQT1NFRF9FVkVOVDwvbGk+XG4gICAqICA8L3VsPlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfQUknO1xuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoJ0NIQU5ORUxfQUknLCBwcm9wcylcbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnQ0hBTk5FTF9BSV9SRU5ERVJFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9BSV9ESVNQT1NFRF9FVkVOVCdcbiAgICBdXG4gIH1cblxuICBvblZpZXdTdHJlYW1JbmZvKG9iaikge1xuICAgIGNvbnN0IHsgYWN0aW9uLCBzcmNFbGVtZW50IH0gPSBvYmpcbiAgICBjb25zdCBwYXlsb2FkID0gc3JjRWxlbWVudFxuICAgIHBheWxvYWQuYWN0aW9uID0gYWN0aW9uXG4gICAgdGhpcy5vblNlbmRFdmVudChhY3Rpb24sIHBheWxvYWQpXG4gIH1cblxuICBvblNlbmRFdmVudChhY3Rpb25TdHIsIHBheWxvYWQgPSB7fSkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnNbYWN0aW9uU3RyXVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSB7fVxuICAgIGNvbnN0IGV2ZW50ID0gdW5kZWZpbmVkXG4gICAgY29uc3QgZGVsYXlTdHJlYW0gPSAoKSA9PiB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KGRlbGF5U3RyZWFtLCAwKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsTGlmZWN5Y2xlIGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFNweW5lQ2hhbm5lbExpZmVjeWNsZVxuICAgKiBAdHlwZSBjb3JlXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIEludGVybmFsIENoYW5uZWwgdGhhdCBwdWJsaXNoZXMgcmVuZGVyaW5nIGFuZCBkaXNwb3NpbmcgZXZlbnRzIG9mIGFsbCBWaWV3U3RyZWFtcyB3aG9zZSBwcm9wZXJ0eSwgcHJvcGVyLnNlbmRMaWZlY3ljbGVFdmVudHMgaXMgc2V0IHRvIHRydWUuXG4gICAqXG4gICAqIDxoMz5UaGUgdHdvIGFjdGlvbnMgdGhhdCBhcmUgcmVnc2l0ZXJlZCBmb3IgdGhpcyBjaGFubmVsIGFyZTo8L2gzPlxuICAgKiA8dWw+XG4gICAqIDxsaT5DSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVDwvbGk+XG4gICAqIDxsaT5DSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVDwvbGk+XG4gICAqICA8L3VsPlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfTElGRUNZQ0xFJztcbiAgICovXG5cbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKCdDSEFOTkVMX0xJRkVDWUNMRScsIHByb3BzKVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9MSUZFQ1lDTEVfRElTUE9TRURfRVZFTlQnXG4gICAgXVxuICB9XG5cbiAgb25WaWV3U3RyZWFtSW5mbyhvYmopIHtcbiAgICBjb25zdCB7IGFjdGlvbiwgc3JjRWxlbWVudCB9ID0gb2JqXG4gICAgY29uc3QgcGF5bG9hZCA9IHNyY0VsZW1lbnRcbiAgICBwYXlsb2FkLmFjdGlvbiA9IGFjdGlvblxuICAgIHRoaXMub25TZW5kRXZlbnQoYWN0aW9uLCBwYXlsb2FkKVxuICB9XG5cbiAgb25TZW5kRXZlbnQoYWN0aW9uU3RyLCBwYXlsb2FkID0ge30pIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zW2FjdGlvblN0cl1cbiAgICBjb25zdCBzcmNFbGVtZW50ID0ge31cbiAgICBjb25zdCBldmVudCA9IHVuZGVmaW5lZFxuICAgIGNvbnN0IGRlbGF5U3RyZWFtID0gKCkgPT4gdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICB3aW5kb3cuc2V0VGltZW91dChkZWxheVN0cmVhbSwgMClcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwgfSBmcm9tICcuLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLXVybC5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGUgfSBmcm9tICcuLi91dGlscy9zcHluZS11dGlscy1jaGFubmVsLXJvdXRlLmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0LCBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuaW1wb3J0IHtcbiAgcGljayxcbiAgZmluZCxcbiAgb21pdCxcbiAgb3ZlcixcbiAgbWVyZ2VSaWdodCxcbiAgaXMsXG4gIG9iak9mLFxuICBtZXJnZUFsbCxcbiAgcGF0aCxcbiAga2V5cyxcbiAgcHJvcCxcbiAgZXF1YWxzLFxuICBoZWFkLFxuICBjb21wb3NlLFxuICBsZW5zUHJvcCxcbiAgY2hhaW4sXG4gIHBpY2tBbGwsXG4gIGRlZmF1bHRUbyxcbiAgaXNFbXB0eSxcbiAgY29uY2F0LFxuICB3aGVuLFxuICBjb21wbGVtZW50LFxuICByZXZlcnNlLFxuICBjdXJyeU4sXG4gIF9fLFxuICB0ZXN0LFxuICByZXBsYWNlLFxuICB0b1BhaXJzLFxuICByZWR1Y2VcbiAgLCBmaWx0ZXIgYXMgcmFtZGFGaWx0ZXIsIG1lcmdlUmlnaHQgYXMgck1lcmdlXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVDaGFubmVsUm91dGUgZXh0ZW5kcyBDaGFubmVsIHtcbiAgY29uc3RydWN0b3IobmFtZSA9ICdDSEFOTkVMX1JPVVRFJywgcHJvcHMgPSB7fSkge1xuICAgIC8qKlxuICAgICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsUm91dGVcbiAgICAgKiBAdHlwZSBjb3JlXG4gICAgICpcbiAgICAgKiBAZGVzY1xuICAgICAqXG4gICAgICogPHA+VGhlIFNweW5lQ2hhbm5lbFJvdXRlIGhhcyB0aGUgdHdvIG1haW4gZHV0aWVzOlxuICAgICAqICA8dWw+XG4gICAgICogICA8bGk+Q29tYmluZSBkYXRhIHdpdGggdGhlIGN1cnJlbnQgd2luZG93IGxvY2F0aW9uIHRvIHVwZGF0ZSB0aGUgbG9jYXRpb24ncyBwYXRobmFtZS48L2xpPlxuICAgICAqICAgPGxpPkxpc3RlbiB0byB3aW5kb3cgbG9jYXRpb24gY2hhbmdlcyB0byB0cmFuc2xhdGUgdGhlIGxvY2F0aW9uIHBhdGhuYW1lIGludG8gYSBzZXJpZXMgb2YgbW9kZWwgcHJvcGVydGllcy48L2xpPlxuICAgICAqIDwvdWw+XG4gICAgICogPHA+SW4gYm90aCBjYXNlcywgdGhpcyBjaGFubmVsIHNlbmRzIGEgQ2hhbm5lbFBheWxvYWQgY29udGFpbmluZyB1cGRhdGVkIHJvdXRlIHByb3BlcnRpZXMuPC9wPlxuICAgICAqXG4gICAgICogPGgzPlRoZSB0d28gYWN0aW9ucyB0aGF0IGFyZSByZWdzaXRlcmVkIGZvciB0aGUgUm91dGUgY2hhbm5lbCBhcmU6PC9oMz5cbiAgICAgKiA8dWw+XG4gICAgICogPGxpPkNIQU5ORUxfUk9VVEVfREVFUExJTktfRVZFTlQ8L2xpPlxuICAgICAqIDxsaT5DSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVDwvbGk+XG4gICAgICogIDwvdWw+XG4gICAgICpcbiAgICAgKiAgICA8aDM+VGhlIFJvdXRlcyBDb25maWd1cmF0aW9uIE9iamVjdDwvaDM+XG4gICAgICogICAgPHA+VGhyIHJvdXRlcyBjb25maWd1cmF0aW9uIG9iamVjdCBpcyB1c2VkIHRvIG1hcCB0aGUgbG9jYXRpb24gc3RyaW5nIHRvIGFuZCBmcm9tIGEgcm91dGUgbW9kZWwuPC9wPlxuICAgICAqXG4gICAgICogICAgIDxwcmU+ICAgICAgICAgICB7XG4gICAgICogICAgICAgICAgICAgICAgcm91dGVQYXRoOiB7XG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU5hbWU6ICdsZXZlbE9uZVByb3AnLFxuICAgICAqICAgICAgICAgICAgICAgICAgcm91dGVPcHRpb24xOiAnYnJhbmNoaW5nLWVuZHMtaGVyZScsXG4gICAgICogICAgICAgICAgICAgICAgICByb3V0ZU9wdGlvbjI6IHtcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIHJvdXRlUGF0aDoge1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZU5hbWU6ICdsZXZlbFR3b1Byb3AnLFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25MZXZlbDI6ICdsZXZlbC0yLWJyYW5jaC1lbmRzLWhlcmUnXG4gICAgICpcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgKiAgICAgICAgICAgICAgICB9XG4gICAgICogICAgICAgICAgICB9XG4gICAgICpcbiAgICAgKiAgICAgICAgICA8L3ByZT5cbiAgICAgKiAgICAgPHA+VGhpcyBjb25maWcgb2JqZWN0IGNvbnNpc3RzIG9mIG5lc3RlZCByb3V0ZVBhdGggb2JqZWN0cyB0aGF0IGNvcnJlc3BvbmRzIHRvIGFsbCBvZiB0aGUgYnJhbmNoaW5nIHBvc3NpYmxpdGllcyBmb3IgdGhlIGFwcC48L3A+XG4gICAgICogICAgPHA+VGhlIHJvdXRlTmFtZSB2YWx1ZSBpcyB0aGUgcHJvcGVydHkgbmFtZSBmb3IgZWFjaCByb3V0ZVBhdGguPC9wPlxuICAgICAqICAgIDxoMz5Sb3V0ZSBPcHRpb25zPC9oMz5cbiAgICAgKiAgICA8cD5BIHJvdXRlUGF0aCBtYXkgY29udGFpbiBzZXZlcmFsIHJvdXRlIG9wdGlvbiBrZXktdmFsdWUgcGFpcnMsIHdoaWNoIGlzIHVzZWQgdG8gbWFwIGJldHdlZW4gZGF0YSBhbmQgdGhlIHdpbmRvdyBsb2NhdGlvbi48L3A+XG4gICAgICogICAgPHVsIGNsYXNzPSdiYXNpYyc+XG4gICAgICogICAgICA8bGk+XG4gICAgICogICAgICAgICA8aDUgY2xhc3M9J2Jhc2ljJz5UaGUgUm91dGUgT3B0aW9uIEtleSAob3IgbGVmdCB2YWx1ZSk8L2g1PlxuICAgICAqICAgICAgICAgPHVsIGNsYXNzPSdkZWNpbWFsJz5cbiAgICAgKiAgICAgICAgIDxsaT5NYXBzIHRoZSB3aW5kb3cgbG9jYXRpb24gdG8gcm91dGUgZGF0YSBwcm9wZXJ0aWVzPC9saT5cbiAgICAgKiAgICAgICAgIDxsaT5UaGlzIGNoYW5uZWwgY2FuICdmaWxsIGluIHRoZSBibGFua3MnIHNvIHRoYXQgb25seSB0aGUgdXBkYXRlZCBsZXZlbCByb3V0ZU5hbWVzIGFyZSByZXF1aXJlZCB0byByZXZpc2UgdGhlIHdpbmRvdyBsb2NhdGlvbjwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkNhbiBiZSBhIHJlZ2V4IHBhdHRlcm4gc28gdGhhdCBtdWx0aXBsZSBkYXRhIHByb3BlcnRpZXMgY2FuIHNoYXJlIHRoZSBzYW1lIGJyYW5jaGluZyBsb2dpYzwvbGk+XG4gICAgICogICAgICAgICAgPC91bD5cbiAgICAgKiAgICAgIDwvbGk+XG4gICAgICpcbiAgICAgKiAgICAgIDxsaT5cbiAgICAgKiAgICAgICAgICAgPGg1IGNsYXNzPSdiYXNpYyc+VGhlIFJvdXRlIE9wdGlvbiBWYWx1ZSAob3IgcmlnaHQgdmFsdWUpPC9oNT5cbiAgICAgKiAgICAgICAgICAgPHVsIGNsYXNzPSdkZWNpbWFsJz5cbiAgICAgKiAgICAgICAgICAgPGxpPk1hcHMgZGF0YSBwcm9wZXJ0aWVzIHRvIHBhcnQgb2YgYSB3aW5kb3cgbG9jYXRpb248L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5EZXRlcm1pbmVzIHRoZSBzdHJpbmcgdmFsdWUgZm9yIGl0cyBsZXZlbCBvZiB0aGUgd2luZG93IGxvY2F0aW9uPC9saT5cbiAgICAgKiAgICAgICAgICA8bGk+VGhlIHZhbHVlIGNhbiBiZSBhIHJlZ2V4IHBhdHRlcm4gc28gdGhhdCBtdWx0aXBsZSBsb2NhdGlvbnMgY2FuIG1hcCB0byBzYW1lIHJvdXRlRGF0YSBwcm9wZXJ0eTwvbGk+XG4gICAgICogICAgICAgICAgPGxpPkJyYW5jaGluZyBlbmRzIGZvciB0aGUgcm91dGUgb3B0aW9uIHdoZW4gdGhpcyB2YWx1ZSBpcyBhIGVpdGhlciBhIFN0cmluZyBvciBhIHJlZ2V4IHBhdHRlcm48L2xpPlxuICAgICAqICAgICAgICAgIDxsaT5CcmFuY2hpbmcgY29udGludWVzIGZvciB0aGUgcm91dGUgb3B0aW9uIHdoZW4gdGhpcyB2YWx1ZSBpcyBhIG5lc3RlZCByb3V0ZVBhdGggb2JqZWN0PC9saT5cbiAgICAgKiAgICAgICAgICA8L3VsPlxuICAgICAqICAgICAgPC9saT5cbiAgICAgKiAgICAgIDwvdWw+XG4gICAgICpcbiAgICAgKiAgICAgIDxoMz5FbmhhbmNpbmcgVGhlIEFwcCdzIFJvdXRpbmcgTG9naWM8L2gzPlxuICAgICAqICAgICAgPHA+VGhlIGJlc3QgcHJhY3RpY2UgZm9yIGEgU3B5bmUgQXBwIGlzIHRvIGhhdmUgb25lIGNvbXBvbmVudCwgYSBjdXN0b20gY2hhbm5lbCwgbGlzdGVuIHRvIHRoZSBTcHluZVJvdXRlQ2hhbm5lbC4gQWxsIG90aGVyIGNvbXBvbmVudHMgd2lsbCB0aGVuIGxpc3RlbiB0byB0aGUgY3VzdG9tIHJvdXRlIGNoYW5uZWwuIFRoaXMgYWxsb3dzIHRoZSBjdXN0b20gcm91dGUgY2hhbm5lbCB0byBlbmhhbmNlIHJvdXRpbmcgbG9naWMgd2l0aCBtb3JlIGRhdGEgYW5kIGN1c3RvbSBhY3Rpb25zLjwvcD5cbiAgICAgKiAgICAgIDxwPllvdSBjYW4gc2VlIHRoaXMgY3VzdG9tIHJvdXRpbmcgY2hhbm5lbCBpbiBhY3Rpb24gaW4gdGhlIFNweW5lIFN0YXJ0ZXIgQXBwPC9wPlxuICAgICAqXG4gICAgICogICAgICA8aDQgY2xhc3M9J2Jhc2ljJz5FeGFtaW5pbmcgdGhpcyBTaXRlJ3MgUm91dGUgQ29uZmlndXJhdGlvbjwvaDQ+XG4gICAgICogICAgICA8YXJ0aWNsZSBjbGFzcz0nY29kZS1leGFtcGxlJyBpZD0ncm91dGVzLWNvbmZpZy1leGFtcGxlJz48L2FydGljbGU+XG4gICAgICogICAgICA8cD5Zb3UgY2FuIHNlZSB0aGlzIHNpdGUgcm91dGluZyBpbiBhY3Rpb24gYnkgb3BlbmluZyB1cCB0aGUgY29uc29sZSdzIHJvdXRlcyBwYW5lbDwvcD5cbiAgICAgKiAgICAgIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUnIGRhdGEtdHlwZT1cImNvbnNvbGVcIiBkYXRhLXZhbHVlPVwib3BlblwiIGRhdGEtY2hhbm5lbC10eXBlPVwicm91dGVcIj5DTElDSyBUTyBPUEVOIFJPVVRFIFBBTkVMPC9kaXY+XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIFRJVExFW1wiPGg0PkJpbmRpbmcgVUkgRUxlbWVudHMgdG8gdGhlIFJvdXRlIENoYW5uZWw8L2g0PlwiXVxuICAgICAqIC8vIFRoaXMgYWxzbyBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byBvdmVycmlkZSB0aGUgUm91dGVPcHRpb24gdmFsdWUgKHVzZWZ1bCB3aGVuIHRoZSB2YWx1ZSBpcyBhIHJlZ2V4IHBhdHRlcm4pXG4gICAgICogPGRpdiBjbGFzcz0nYnRuJyBkYXRhLWNoYW5uZWw9XCJST1VURVwiIGRhdGEtcGFnZS1pZD0naG9tZScgZGF0YS1wYWdlLWlkLXZhbHVlPScnPkhPTUU8L2Rpdj5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogVElUTEVbXCI8aDQ+VXBkYXRpbmcgdGhlIFJvdXRlIENoYW5uZWwgdXNpbmcgVmlld1N0cmVhbSZyc3F1bztzIHNlbmRJbmZvVG9DaGFubmVsPC9oND5cIl1cbiAgICAgKiBjb25zdCBkYXRhVXBkYXRlT2JqID0ge3BhZ2VJZDonZ3VpZGUnLCBzZWN0aW9uOidyZWZlcmVuY2UnLCBtZW51SXRlbTonc3B5bmUtcm91dGUtY2hhbm5lbCd9O1xuICAgICAqIHRoaXMuc2VuZEluZm9Ub0NoYW5uZWwoXCJDSEFOTkVMX1JPVVRFXCIsIGRhdGFVcGRhdGVPYmopO1xuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBUSVRMRVtcIjxoND5VcGRhdGluZyB0aGUgUm91dGUgQ2hhbm5lbCB1c2luZyBDaGFubmVsJnJzcXVvO3Mgc2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbDwvaDQ+XCJdXG4gICAgICogY29uc3QgZGF0YVVwZGF0ZU9iaiA9IHtwYWdlSWQ6J2d1aWRlJywgc2VjdGlvbjoncmVmZXJlbmNlJywgbWVudUl0ZW06J3NweW5lLXJvdXRlLWNoYW5uZWwnfTtcbiAgICAgKiB0aGlzLnNlbmRQYXlsb2FkVG9Sb3V0ZUNoYW5uZWwoZGF0YVVwZGF0ZU9iaik7XG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IGNvbmZpZy50eXBlIC0gPSAnc2xhc2gnOyBUaGlzIHByb3BlcnR5IGRldGVybWluZXMgdGhlIHVybCBzdHJ1Y3R1cmUgYnkgY29uZm9ybWluZyB0aGUgd2luZG93IHBhdGhuYW1lIHRvIGVpdGhlciB0aGUgc2xhc2gsIHF1ZXJ5IG9yIGhhc2ggZm9ybWF0cy5cbiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnLnJvdXRlcyAtID0ge3JvdXRlUGF0aDoge3JvdXRlTmFtZTonY2hhbmdlJ307IFRoaXMgbmVzdGVkIE9iamVjdCBpcyB1c2VkIHRvIGNvbnRydWN0IHRoZSB3aW5kb3cgcGF0aG5hbWUgYW5kIHRvIGV4cHJlc3MgdGhlIHdpbmRvdyBsb2NhdGlvbiBhcyBtb2RlbCB2YXJpYWJsZXMuXG4gICAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfUk9VVEUnO1xuICAgICAqXG4gICAgICovXG4gICAgcHJvcHMuc2VuZENhY2hlZFBheWxvYWQgPSB0cnVlXG4gICAgc3VwZXIoJ0NIQU5ORUxfUk9VVEUnLCBwcm9wcylcbiAgICB0aGlzLmNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqKClcbiAgICB0aGlzLnJvdXRlQ29uZmlnSnNvbiA9IHRoaXMuZ2V0Um91dGVDb25maWcoKVxuICAgIHRoaXMuYmluZFN0YXRpY01ldGhvZHMoKVxuICAgIHRoaXMubmF2VG9TdHJlYW0kID0gbmV3IFJlcGxheVN1YmplY3QoMSlcbiAgICB0aGlzLm9ic2VydmVyJCA9IHRoaXMubmF2VG9TdHJlYW0kLnBpcGUobWFwKGluZm8gPT4gdGhpcy5vbk1hcE5leHQoaW5mbykpKVxuICAgIHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNvbXBhcmVSb3V0ZUtleXdvcmRzKClcbiAgfVxuXG4gIGNoZWNrQ29uZmlnRm9ySGFzaCgpIHtcbiAgICAvLyBMRUdBQ1kgQ0hFQ0sgVE8gU0lNUExJRlkgQ09ORklHIEZPUiBIQVNIO1xuICAgIGNvbnN0IGlzSGFzaFR5cGUgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLnR5cGUgPT09ICdoYXNoJ1xuICAgIGlmIChpc0hhc2hUeXBlID09PSB0cnVlKSB7XG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLnR5cGUgPSAnc2xhc2gnXG4gICAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLmlzSGFzaCA9IHRydWVcbiAgICB9XG4gIH1cblxuICBvblJlZ2lzdGVyZWQoKSB7XG4gICAgdGhpcy5jaGVja0NvbmZpZ0Zvckhhc2goKVxuICAgIHRoaXMuaW5pdFN0cmVhbSgpXG4gIH1cblxuICBjcmVhdGVDaGFubmVsQWN0aW9uc09iaigpIHtcbiAgICBjb25zdCBhcnIgPSB0aGlzLmFkZFJlZ2lzdGVyZWRBY3Rpb25zKClcbiAgICBjb25zdCBjb252ZXJ0ZXIgPSBzdHIgPT4gb2JqT2Yoc3RyLCBzdHIpXG4gICAgY29uc3Qgb2JqID0gbWVyZ2VBbGwoY2hhaW4oY29udmVydGVyLCBhcnIpKVxuICAgIHRoaXMuY2hhbm5lbEFjdGlvbnMgPSBvYmpcbiAgfVxuXG4gIGFkZFJlZ2lzdGVyZWRBY3Rpb25zKCkge1xuICAgIHJldHVybiBbXG4gICAgICAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfUk9VVEVfQ09ORklHX1VQREFURURfRVZFTlQnLFxuICAgICAgWydDSEFOTkVMX1JPVVRFX1VQREFURV9DT05GSUdfRVZFTlQnLCAndXBkYXRlUm91dGVDb25maWcnXVxuICAgIF1cbiAgfVxuXG4gIHVwZGF0ZVJvdXRlQ29uZmlnKGUpIHtcbiAgICBjb25zdCBuZXdSb3V0ZXNPYmogID0gcGljayhbJ2lzSGFzaCcsICdpc0hpZGRlbicsICdyb3V0ZXMnLCAndHlwZSddLCBlLnBheWxvYWQpXG5cbiAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFID0gbWVyZ2VSaWdodChTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLCBuZXdSb3V0ZXNPYmopXG5cbiAgICBTcHluZUFwcFByb3BlcnRpZXMuY29uZm9ybVJvdXRlQ29uZmlnKClcblxuICAgIGNvbnN0IHJvdXRlQ29uZmlnID0gdGhpcy5nZXRSb3V0ZUNvbmZpZygpXG4gICAgY29uc3QgYWN0aW9uID0gJ0NIQU5ORUxfUk9VVEVfQ09ORklHX1VQREFURURfRVZFTlQnXG5cbiAgICAvLyByZXZlcnNlIGJlY2F1c2Ugcm91dGVEYXRhc2V0c0FyciB0dXJucyBvdXQgdGhhdCB3YXlcbiAgICByb3V0ZUNvbmZpZy5uYXZMaW5rcyA9IFsuLi5yb3V0ZUNvbmZpZz8ucm91dGVEYXRhc2V0c0Fycl1cblxuICAgIHRoaXMucm91dGVDb25maWdKc29uID0gcm91dGVDb25maWdcbiAgICB0aGlzLmJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKVxuXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCByb3V0ZUNvbmZpZywge30sIHt9LCB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIGdldFJvdXRlQ29uZmlnKCkge1xuICAgIGNvbnN0IHNweW5lQ29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZ1xuICAgIGNvbnN0IHJvdXRlQ29uZmlnID0gcGF0aChbJ2NoYW5uZWxzJywgJ1JPVVRFJ10sIHNweW5lQ29uZmlnKVxuICAgIGlmIChyb3V0ZUNvbmZpZy50eXBlID09PSAncXVlcnknKSB7XG4gICAgICByb3V0ZUNvbmZpZy5pc0hhc2ggPSBmYWxzZVxuICAgIH1cblxuICAgIGNvbnN0IGFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuZmxhdHRlbkNvbmZpZ09iamVjdChyb3V0ZUNvbmZpZy5yb3V0ZXMpXG4gICAgcm91dGVDb25maWcucGFyYW1zQXJyID0gYXJyXG4gICAgcmV0dXJuIHJvdXRlQ29uZmlnXG4gIH1cblxuICBpbml0U3RyZWFtKCkge1xuICAgIHRoaXMuZmlyc3RMb2FkU3RyZWFtJCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpXG4gICAgdGhpcy5vbkluY29taW5nRG9tRXZlbnQodW5kZWZpbmVkLCB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgJycgKyAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcpXG5cbiAgICBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmNyZWF0ZVBvcFN0YXRlU3RyZWFtKHRoaXMub25JbmNvbWluZ0RvbUV2ZW50LmJpbmQodGhpcykpXG5cbiAgICB0aGlzLm9ic2VydmVyJCA9IG1lcmdlKHRoaXMuZmlyc3RMb2FkU3RyZWFtJCxcbiAgICAgIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgb25NYXBOZXh0KGRhdGEsIGZpcnN0TG9hZGVkID0gZmFsc2UpIHtcbiAgICBkYXRhLmFjdGlvbiA9ICdDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCdcbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgc3RhdGljIHJlbW92ZVNTSUQocGF5bG9hZCkge1xuICAgIGNvbnN0IHJvdXRlTGVucyA9IGxlbnNQcm9wKFsncm91dGVEYXRhJ10pXG4gICAgY29uc3Qgb21pdFNTSUQgPSBvdmVyKHJvdXRlTGVucywgb21pdChbJ3ZzaWQnXSkpXG4gICAgcmV0dXJuIG9taXRTU0lEKHBheWxvYWQpXG4gIH1cblxuICBzdGF0aWMgb25JbmNvbWluZ0RvbUV2ZW50KGV2dCwgY29uZmlnID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIGFjdG4pIHtcbiAgICBjb25zdCBhY3Rpb24gPSBhY3RuICE9PSB1bmRlZmluZWRcbiAgICAgID8gYWN0blxuICAgICAgOiB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UXG5cbiAgICAvLyBDSEVDSyBJRiBUSElTIElTIEEgSElTVE9SWSBFVkVOVCBCWSBVU0lORyBUSEUgcm91dGVDb3VudCBQUk9QRVJUWVxuICAgIGNvbnN0IGV2ZW50Q291bnQgPSBwYXRoKFsnc3RhdGUnLCAncm91dGVDb3VudCddLCBldnQpXG4gICAgY29uc3QgaXNIaXN0b3J5Q291bnQgPSBpcyhOdW1iZXIsIGV2ZW50Q291bnQpID09PSB0cnVlXG4gICAgbGV0IHBheWxvYWQgPSB0aGlzLmdldERhdGFGcm9tU3RyaW5nKGNvbmZpZywgaXNIaXN0b3J5Q291bnQpXG4gICAgaWYgKGlzSGlzdG9yeUNvdW50ID09PSB0cnVlKSB7XG4gICAgICBwYXlsb2FkLnJvdXRlQ291bnQgPSBldmVudENvdW50XG4gICAgfVxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGlmIChhY3RuID09PSAnQ0hBTk5FTF9ST1VURV9ERUVQTElOS19FVkVOVCcpIHtcbiAgICAgIHBheWxvYWQubmF2TGlua3MgPSBwcm9wKCdyb3V0ZURhdGFzZXRzQXJyJywgY29uZmlnKVxuICAgICAgLy8gcGF5bG9hZC5saW5rc0RhdGEgPSBwYXlsb2FkLm5hdkxpbmtzXG4gICAgICAvLyBTcHluZUFwcFByb3BlcnRpZXMubGlua3NEYXRhID0gcGF5bG9hZC5uYXZMaW5rc1xuXG4gICAgICAvLyBkZWZpbmUgYW4gYWxpYXMgcHJvcGVydHkgdXNpbmcgT2JqZWN0LmRlZmluZVByb3BlcnR5XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocGF5bG9hZCwgJ2xpbmtzRGF0YScsIHtcbiAgICAgICAgZ2V0KCkge1xuICAgICAgICAgIC8vIGNvbnNvbGUud2FybignZ2V0IGxpbmtzIGRhdGEgaXMgZGVwcmVjYXRlZCBpbiBST1VURSBERUVQTElOSyBEQVRBLCB1c2UgbmF2TGlua3MnKVxuICAgICAgICAgIHJldHVybiB0aGlzLm5hdkxpbmtzXG4gICAgICAgIH0sXG4gICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgIGNvbnNvbGUud2Fybignc2V0IGxpbmtzIGRhdGEgaXMgZGVwcmVjYXRlZCBpbiBST1VURSBERUVQTElOSyBEQVRBLCB1c2UgbmF2TGlua3MnKVxuXG4gICAgICAgICAgLy8gdGhpcy5uYXZMaW5rcyA9IHZhbHVlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBrZXl3b3JkQXJycyA9IHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMuY29tcGFyZShwYXlsb2FkLnJvdXRlRGF0YSwgcGF5bG9hZC5wYXRocylcbiAgICBwYXlsb2FkID0gck1lcmdlKHBheWxvYWQsIGtleXdvcmRBcnJzKVxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgdW5kZWZpbmVkLCBldnQsIHRoaXMubmF2VG9TdHJlYW0kKVxuICB9XG5cbiAgc3RhdGljIGNoZWNrRm9yUm91dGVQYXJhbXNPdmVycmlkZXMocGF5bG9hZCkge1xuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JFdmVudE1ldGhvZHMob2JzKSB7XG4gICAgY29uc3QgcmUgPSAvXihldmVudCkoW0EtWl0uKikoW0EtWl0uKikkL2dtXG4gICAgY29uc3QgZ2V0TWV0aG9kcyA9IGNvbXBvc2UocmFtZGFGaWx0ZXIodGVzdChyZSkpLCBrZXlzLCBwcm9wKCdwYXlsb2FkJykpXG4gICAgY29uc3QgbWV0aG9kc0FyciA9IGdldE1ldGhvZHMob2JzKVxuICAgIGlmIChtZXRob2RzQXJyLmxlbmd0aCA+PSAxKSB7XG4gICAgICBjb25zdCBldnQgPSBwcm9wKCdldmVudCcsIG9icylcbiAgICAgIGlmIChldnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBtZXRob2RVcGRhdGUgPSAobWF0Y2gsIHAxLCBwMiwgcDMsIHA0KSA9PiBTdHJpbmcocDIpLnRvTG93ZXJDYXNlKCkgKyBwMyArIHA0XG4gICAgICAgIGNvbnN0IG1ldGhvZFN0clJlcGxhY2UgPSByZXBsYWNlKC9eKGV2ZW50KShbQS1aXSkoLiopKFtBLVpdLiopJC9nbSwgbWV0aG9kVXBkYXRlKVxuICAgICAgICBjb25zdCBydW5NZXRob2QgPSAobWV0aG9kU3RyKSA9PiB7XG4gICAgICAgICAgY29uc3QgbSA9IG1ldGhvZFN0clJlcGxhY2UobWV0aG9kU3RyKVxuICAgICAgICAgIGlmIChldnRbbV0gIT09IHVuZGVmaW5lZCkgeyBldnRbbV0oKSB9XG4gICAgICAgIH1cbiAgICAgICAgbWV0aG9kc0Fyci5mb3JFYWNoKHJ1bk1ldGhvZClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JzXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JFbmRSb3V0ZShwbCwgcm91dGVDb25maWdKc29uID0gdGhpcy5yb3V0ZUNvbmZpZ0pzb24sIGRlYnVnQm9vbCkge1xuICAgIGNvbnN0IGVuZFJvdXRlID0gY29tcG9zZShlcXVhbHMoJ3RydWUnKSwgcGF0aChbJ3BheWxvYWQnLCAnZW5kUm91dGUnXSkpKHBsKVxuXG4gICAgaWYgKGVuZFJvdXRlICE9PSB0cnVlKSB7XG4gICAgICByZXR1cm4gcGxcbiAgICB9XG4gICAgY29uc3QgZGVidWcgPSBkZWJ1Z0Jvb2wgIT09IHVuZGVmaW5lZCA/IGRlYnVnQm9vbCA6IFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZVxuICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gcGxcblxuICAgIGNvbnN0IGdldFByb3BWYWwgPSAocm91dGVQYXRoKSA9PiB7XG4gICAgICBjb25zdCByb3V0ZU5hbWUgPSBwcm9wKCdyb3V0ZU5hbWUnLCByb3V0ZVBhdGgpXG4gICAgICBpZiAocm91dGVOYW1lKSB7XG4gICAgICAgIGNvbnN0IGtleXNBcnIgPSBjb21wb3NlKGtleXMsIG9taXQoWydyb3V0ZU5hbWUnXSkpKHJvdXRlUGF0aClcbiAgICAgICAgY29uc3Qgcm91dGVOYW1lVmFsID0gcGF5bG9hZFtyb3V0ZU5hbWVdXG4gICAgICAgIGNvbnN0IHByZWQgPSBhcnJTdHIgPT4gbmV3IFJlZ0V4cChgXiR7YXJyU3RyfSRgKS50ZXN0KHJvdXRlTmFtZVZhbClcbiAgICAgICAgY29uc3Qgcm91dGVWYWwgPSBmaW5kKHByZWQsIGtleXNBcnIpXG4gICAgICAgIHJldHVybiByb3V0ZVZhbFxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBpdGVyID0gMFxuICAgIGNvbnN0IG9uUmVkdWNlUm91dGVQYXRocyA9IChhY2MgPSBbXSwgYXJyKSA9PiB7XG4gICAgICAvLyBjb25zdCBba2V5LCB2YWxdID0gYXJyXG4gICAgICBjb25zdCB2YWwgPSBhcnJbMV1cbiAgICAgIGNvbnN0IHsgcm91dGVQYXRoIH0gPSB2YWxcbiAgICAgIGNvbnN0IHJvdXRlTmFtZSA9IHByb3AoJ3JvdXRlTmFtZScsIHJvdXRlUGF0aClcbiAgICAgIGNvbnN0IHJvdXRlTmFtZVZhbCA9IGdldFByb3BWYWwocm91dGVQYXRoKVxuICAgICAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QsIHZhbClcbiAgICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXksIHZhbClcbiAgICAgIGNvbnN0IGl0ZXJPYmogPSBpc09iaiA9PT0gdHJ1ZSAmJiBpc0FyciA9PT0gZmFsc2VcbiAgICAgIGl0ZXIgPSBpdGVyICsgMVxuICAgICAgaWYgKGl0ZXJPYmopIHtcbiAgICAgICAgY29uc3QgbmV4dFJvdXRlUGF0aCA9IHJvdXRlUGF0aFtyb3V0ZU5hbWVWYWxdXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdrZXkgaXMgJyx7aXRlcixhY2Msa2V5LCByb3V0ZU5hbWUsIHJvdXRlTmFtZVZhbCwgaXRlck9iaiwgbmV4dFJvdXRlUGF0aH0pO1xuICAgICAgICBpZiAobmV4dFJvdXRlUGF0aCkge1xuICAgICAgICAgIGNvbXBvc2UocmV2ZXJzZSwgcmVkdWNlKG9uUmVkdWNlUm91dGVQYXRocywgYWNjKSwgdG9QYWlycykoeyBuZXh0Um91dGVQYXRoIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJLRVkgSVMgXCIse2l0ZXIsa2V5LCByb3V0ZU5hbWUsIHJvdXRlTmFtZVZhbH0pXG4gICAgICAgICAgaWYgKGl0ZXIgPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IHVzZSBvZiBlbmQgcm91dGUgbWV0aG9kIHNob3VsZCBhZGQgc3RhcnQgcm91dGUgdmFsdWUgb2YgXCIke3JvdXRlTmFtZX1cIi5gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2MucHVzaChyb3V0ZU5hbWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjXG4gICAgfVxuXG4gICAgY29uc3QgeyByb3V0ZXMgfSA9IHJvdXRlQ29uZmlnSnNvblxuXG4gICAgY29uc3QgZW5kUm91dGVWYWxBcnIgPSBjb21wb3NlKHJldmVyc2UsIHJlZHVjZShvblJlZHVjZVJvdXRlUGF0aHMsIFtdKSwgdG9QYWlycykoeyByb3V0ZXMgfSlcbiAgICAvLyBjb25zb2xlLmxvZygnZW5kIHJvdXRlIHZhbCBhcnIgJyxlbmRSb3V0ZVZhbEFycik7XG4gICAgaWYgKGVuZFJvdXRlVmFsQXJyLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZW5kUm91dGVWYWwgPSBlbmRSb3V0ZVZhbEFyclswXVxuICAgICAgcGwucGF5bG9hZFtlbmRSb3V0ZVZhbF0gPSAnJ1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgLy8gY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB0aGUgZW5kIHJvdXRlIHBhcmFtIGRpZCBub3QgeWllbGQgYW55IHJlc3VsdHMgZm9yICR7SlNPTi5zdHJpbmdpZnkocGF5bG9hZCl9IGApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwbFxuICB9XG5cbiAgb25WaWV3U3RyZWFtSW5mbyhwbCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHBsLmFjdGlvbiA/PyB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UXG5cbiAgICBmdW5jdGlvbiBkb21TdHJpbmdNYXBUb09iamVjdChkb21TdHJpbmdNYXApIHtcbiAgICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBkb21TdHJpbmdNYXApIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXTigJlzIGEgZGlyZWN0IHByb3BlcnR5ICh0aG91Z2ggZGF0YXNldCByYXJlbHkgaGFzIGFueXRoaW5nIG9uIHRoZSBwcm90b3R5cGUpOlxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvbVN0cmluZ01hcCwga2V5KSkge1xuICAgICAgICAgIG9ialtrZXldID0gZG9tU3RyaW5nTWFwW2tleV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialxuICAgIH1cblxuICAgIGlmIChwbD8uc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpIHtcbiAgICAgIHBsLnBheWxvYWQgPSBkb21TdHJpbmdNYXBUb09iamVjdChwbD8uc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpID8/IHBsLnBheWxvYWRcbiAgICB9XG5cbiAgICAvLyBjb25zb2xlLmxvZygnUk9VVEUgQ0hBTk5FTCBWU0kgJywgeyBwbCB9KVxuXG4gICAgU3B5bmVDaGFubmVsUm91dGUuY2hlY2tGb3JFdmVudE1ldGhvZHMocGwpXG4gICAgcGwgPSB0aGlzLmNoZWNrRm9yRW5kUm91dGUocGwpXG4gICAgbGV0IHBheWxvYWQgPSB0aGlzLmdldERhdGFGcm9tUGFyYW1zKHBsKVxuXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IHByb3AoJ3NyY0VsZW1lbnQnLCBwbClcbiAgICBjb25zdCBldmVudCA9IHByb3AoJ2V2ZW50JywgcGwpXG4gICAgY29uc3QgY2hhbmdlTG9jYXRpb25Cb29sID0gIXBheWxvYWQuaXNIaWRkZW5cbiAgICBjb25zdCBrZXl3b3JkQXJycyA9IHRoaXMuY29tcGFyZVJvdXRlS2V5d29yZHMuY29tcGFyZShwYXlsb2FkLnJvdXRlRGF0YSwgcGF5bG9hZC5wYXRocylcblxuICAgIHBheWxvYWQgPSByTWVyZ2UocGF5bG9hZCwga2V5d29yZEFycnMpXG4gICAgdGhpcy5zZW5kUm91dGVTdHJlYW0ocGF5bG9hZCwgY2hhbmdlTG9jYXRpb25Cb29sKVxuXG4gICAgcGF5bG9hZCA9IFNweW5lQ2hhbm5lbFJvdXRlLnJlbW92ZVNTSUQocGF5bG9hZClcblxuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQsXG4gICAgICB0aGlzLm5hdlRvU3RyZWFtJClcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0FuZENvbnZlcnRTdHJXaXRoUmVnZXhUb2tlbnMocm91dGVWYWx1ZSwgcmVnZXhUb2tlbk9iaikge1xuICAgIGNvbnN0IHRva2VuS2V5c0FyciA9IGtleXMocmVnZXhUb2tlbk9iailcblxuICAgIHJldHVybiB0b2tlbktleXNBcnJcbiAgfVxuXG4gIHNlbmRSb3V0ZVN0cmVhbShwYXlsb2FkLCBjaGFuZ2VXaW5kb3dMb2MgPSB0cnVlKSB7XG4gICAgaWYgKGNoYW5nZVdpbmRvd0xvYyA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zZXRXaW5kb3dMb2NhdGlvbihwYXlsb2FkKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRSb3V0ZVN0YXRlKCkge1xuICAgIHJldHVybiAnQ0hBTk5FTF9ST1VURV9DSEFOR0VfRVZFTlQnXG4gIH1cblxuICBzdGF0aWMgZ2V0SXNEZWVwTGlua0Jvb2woaXNIaXN0b3J5KSB7XG4gICAgcmV0dXJuIGlzSGlzdG9yeSA9PT0gZmFsc2UgJiYgdGhpcy5fcm91dGVDb3VudCA9PT0gMFxuICB9XG5cbiAgc3RhdGljIGdldFJvdXRlQ291bnQoaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5fcm91dGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9yb3V0ZUNvdW50ID0gMFxuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlQ291bnRcbiAgICB9XG4gICAgaWYgKGlzSGlzdG9yeSA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3JvdXRlQ291bnQgKz0gMVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcm91dGVDb3VudFxuICB9XG5cbiAgc3RhdGljIGdldEV4dHJhUGF5bG9hZFBhcmFtcyhjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBjb25zdCByb3V0ZUNvdW50ID0gdGhpcy5nZXRSb3V0ZUNvdW50KGlzSGlzdG9yeSlcbiAgICBjb25zdCBpc0RlZXBMaW5rID0gdGhpcy5nZXRJc0RlZXBMaW5rQm9vbChpc0hpc3RvcnkpXG4gICAgY29uc3QgaXNIYXNoID0gY29uZmlnLmlzSGFzaFxuICAgIGNvbnN0IGlzSGlkZGVuID0gY29uZmlnLmlzSGlkZGVuXG4gICAgY29uc3Qgcm91dGVUeXBlID0gY29uZmlnLnR5cGVcbiAgICByZXR1cm4geyByb3V0ZUNvdW50LCBpc0RlZXBMaW5rLCBpc0hhc2gsIGlzSGlzdG9yeSwgaXNIaWRkZW4sIHJvdXRlVHlwZSB9XG4gIH1cblxuICBzdGF0aWMgZ2V0RGF0YUZyb21QYXJhbXMocGwsIGNvbmZpZyA9IHRoaXMucm91dGVDb25maWdKc29uKSB7XG4gICAgbGV0IHJvdXRlRGF0YSA9IHByb3AoJ3BheWxvYWQnLCBwbClcblxuICAgIGNvbnN0IHJvdXRlVmFsdWUgPSB0aGlzLmdldFJvdXRlU3RyRnJvbVBhcmFtcyhyb3V0ZURhdGEsIGNvbmZpZylcblxuICAgIC8vIFdJTkRPVyBMT0NBVElPTiBIQVNOJ1QgQkVFTiBDSEFOR0VEIFlFVCwgU08gV0lMTCBHRVQgU1RSIFBBUkFNU1xuICAgIGNvbnN0IGdldFByb3BGcm9tQ29uZmlnID0gKHBycCwgZGVmYWx0KSA9PiBkZWZhdWx0VG8oZGVmYWx0LCBwcm9wKHBycCwgY29uZmlnKSlcbiAgICBjb25zdCB0eXBlRm9yU3RyID0gZ2V0UHJvcEZyb21Db25maWcoJ3R5cGUnLCAnc2xhc2gnKVxuICAgIGNvbnN0IGlzSGFzaEZvclN0ciA9IGdldFByb3BGcm9tQ29uZmlnKCdpc0hhc2gnLCBmYWxzZSlcbiAgICBjb25zdCBuZXh0V2luZG93TG9jID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5mb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uKHJvdXRlVmFsdWUpXG4gICAgY29uc3QgZGF0YUZyb21TdHIgPSB0aGlzLmdldERhdGFGcm9tTG9jYXRpb25TdHIodHlwZUZvclN0ciwgaXNIYXNoRm9yU3RyLCBuZXh0V2luZG93TG9jKVxuXG4gICAgY29uc3QgeyBwYXRoSW5uZXJtb3N0LCBwYXRocyB9ID0gZGF0YUZyb21TdHJcblxuICAgIHJvdXRlRGF0YSA9IHJNZXJnZShkYXRhRnJvbVN0ci5yb3V0ZURhdGEsIHJvdXRlRGF0YSlcblxuICAgIGNvbnN0IHsgcm91dGVDb3VudCwgaXNEZWVwTGluaywgaXNIYXNoLCBpc0hpc3RvcnksIGlzSGlkZGVuLCByb3V0ZVR5cGUgfSA9IHRoaXMuZ2V0RXh0cmFQYXlsb2FkUGFyYW1zKFxuICAgICAgY29uZmlnKVxuICAgIHJldHVybiB7XG4gICAgICBpc0RlZXBMaW5rLFxuICAgICAgcm91dGVDb3VudCxcbiAgICAgIHBhdGhJbm5lcm1vc3QsXG4gICAgICBwYXRocyxcbiAgICAgIHJvdXRlRGF0YSxcbiAgICAgIHJvdXRlVmFsdWUsXG4gICAgICBpc0hhc2gsXG4gICAgICBpc0hpZGRlbixcbiAgICAgIGlzSGlzdG9yeSxcbiAgICAgIHJvdXRlVHlwZVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXREYXRhRnJvbVN0cmluZyhjb25maWcgPSB0aGlzLnJvdXRlQ29uZmlnSnNvbiwgaXNIaXN0b3J5ID0gZmFsc2UpIHtcbiAgICBjb25zdCB0eXBlID0gY29uZmlnLnR5cGVcbiAgICBjb25zdCBoYXNoSXNUcnVlID0gY29uZmlnLmlzSGFzaCA9PT0gdHJ1ZVxuICAgIGNvbnN0IHN0ciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuZ2V0TG9jYXRpb25TdHJCeVR5cGUodHlwZSwgaGFzaElzVHJ1ZSlcbiAgICBjb25zdCB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfSA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldFBhcmFtc0Zyb21Sb3V0ZVN0cihcbiAgICAgIHN0ciwgY29uZmlnLCB0eXBlKVxuICAgIGNvbnN0IHsgcm91dGVDb3VudCwgaXNEZWVwTGluaywgaXNIYXNoLCByb3V0ZVR5cGUsIGlzSGlkZGVuIH0gPSB0aGlzLmdldEV4dHJhUGF5bG9hZFBhcmFtcyhcbiAgICAgIGNvbmZpZywgaXNIaXN0b3J5KVxuXG4gICAgY29uc3Qgb2JqID0ge1xuICAgICAgaXNEZWVwTGluayxcbiAgICAgIHJvdXRlQ291bnQsXG4gICAgICBwYXRoSW5uZXJtb3N0LFxuICAgICAgcGF0aHMsXG4gICAgICByb3V0ZURhdGEsXG4gICAgICByb3V0ZVZhbHVlLFxuICAgICAgaXNIYXNoLFxuICAgICAgaXNIaWRkZW4sXG4gICAgICBpc0hpc3RvcnksXG4gICAgICByb3V0ZVR5cGVcbiAgICB9XG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgc3RhdGljIGdldERhdGFGcm9tTG9jYXRpb25TdHIodCA9ICdzbGFzaCcsIGlzSGFzaCA9IHRoaXMucm91dGVDb25maWdKc29uLmlzSGFzaCwgbG9jID0gd2luZG93LmxvY2F0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IHRoaXMucm91dGVDb25maWdKc29uICE9PSB1bmRlZmluZWRcbiAgICAgID8gdGhpcy5yb3V0ZUNvbmZpZ0pzb24udHlwZVxuICAgICAgOiB0XG5cbiAgICBjb25zdCBzdHIgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmdldExvY2F0aW9uU3RyQnlUeXBlKHR5cGUsIGlzSGFzaCwgbG9jKVxuICAgIGNvbnN0IHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSB9ID0gdGhpcy5nZXRQYXJhbXNGcm9tUm91dGVTdHIoXG4gICAgICBzdHIsIHRoaXMucm91dGVDb25maWdKc29uLCB0eXBlKVxuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuZ2V0Um91dGVTdGF0ZSgpXG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QsIHJvdXRlRGF0YSwgcm91dGVWYWx1ZSwgYWN0aW9uIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvbkRhdGEoKSB7XG4gICAgY29uc3QgbG9jYXRpb25QYXJhbXNBcnIgPSBbXG4gICAgICAnaHJlZicsXG4gICAgICAnb3JpZ2luJyxcbiAgICAgICdwcm90b2NvbCcsXG4gICAgICAnaG9zdCcsXG4gICAgICAnaG9zdG5hbWUnLFxuICAgICAgJ3BvcnQnLFxuICAgICAgJ3BhdGhuYW1lJyxcbiAgICAgICdzZWFyY2gnLFxuICAgICAgJ2hhc2gnXVxuICAgIHJldHVybiBwaWNrQWxsKGxvY2F0aW9uUGFyYW1zQXJyLCB3aW5kb3cubG9jYXRpb24pXG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVTdHJGcm9tUGFyYW1zKHBhcmFtc0RhdGEsIHJvdXRlQ29uZmlnLCB0KSB7XG4gICAgY29uc3QgdHlwZSA9IHQgIT09IHVuZGVmaW5lZCA/IHQgOiByb3V0ZUNvbmZpZy50eXBlXG4gICAgY29uc3Qgb2JqID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jb252ZXJ0UGFyYW1zVG9Sb3V0ZShwYXJhbXNEYXRhLCByb3V0ZUNvbmZpZywgdHlwZSlcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBzdGF0aWMgZ2V0UGFyYW1zRnJvbVJvdXRlU3RyKHN0ciwgcm91dGVDb25maWcsIHQpIHtcbiAgICBjb25zdCB0eXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHJvdXRlQ29uZmlnLnR5cGVcbiAgICBjb25zdCBvYmogPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlVXJsLmNvbnZlcnRSb3V0ZVRvUGFyYW1zKHN0ciwgcm91dGVDb25maWcsIHR5cGUpXG4gICAgcmV0dXJuIG9ialxuICB9XG5cbiAgY2hlY2tFbXB0eVJvdXRlU3RyKHN0ciwgaXNIYXNoID0gZmFsc2UpIHtcbiAgICBjb25zdCBpc0VtcHR5Qm9vbCA9IGlzRW1wdHkoc3RyKVxuICAgIGNvbnN0IHBhdGhOYW1lSXNFbXB0eUJvb2wgPSBpc0VtcHR5Qm9vbCA9PT0gdHJ1ZSAmJiBpc0hhc2ggPT09IGZhbHNlXG4gICAgY29uc3QgaGFzaE5hbWVJc0VtcHR5Qm9vbCA9IGlzRW1wdHlCb29sID09PSB0cnVlICYmIGlzSGFzaCA9PT0gdHJ1ZVxuICAgIGNvbnN0IGhhc2hOYW1lQm9vbCA9IGlzRW1wdHlCb29sID09PSBmYWxzZSAmJiBpc0hhc2ggPT09IHRydWVcblxuICAgIGlmIChwYXRoTmFtZUlzRW1wdHlCb29sID09PSB0cnVlIHx8IGhhc2hOYW1lSXNFbXB0eUJvb2wgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiAnLydcbiAgICB9IGVsc2UgaWYgKGhhc2hOYW1lQm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIGNvbmNhdCgnIycsIHN0cilcbiAgICB9XG4gICAgcmV0dXJuIHN0clxuICB9XG5cbiAgc3RhdGljIHJlbW92ZUxhc3RTbGFzaChzdHIpIHtcbiAgICBjb25zdCByZSA9IC9eKC4qKShcXC8pJC9cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UocmUsICckMScpXG4gIH1cblxuICBzZXRXaW5kb3dMb2NhdGlvbihjaGFubmVsUGF5bG9hZCkge1xuICAgIGxldCB7IGlzSGFzaCwgcm91dGVWYWx1ZSwgcm91dGVUeXBlIH0gPSBjaGFubmVsUGF5bG9hZFxuICAgIHJvdXRlVmFsdWUgPSB0aGlzLmNoZWNrRW1wdHlSb3V0ZVN0cihyb3V0ZVZhbHVlLCBpc0hhc2gpXG4gICAgY29uc3QgeyByb3V0ZUNvdW50IH0gPSBjaGFubmVsUGF5bG9hZFxuICAgIGlmIChpc0hhc2ggPT09IHRydWUgfHwgcm91dGVUeXBlID09PSAncXVlcnknKSB7XG4gICAgICBjb25zdCBwYXRoTmFtZSA9IFNweW5lQ2hhbm5lbFJvdXRlLnJlbW92ZUxhc3RTbGFzaCh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpXG4gICAgICByb3V0ZVZhbHVlID0gcGF0aE5hbWUgKyByb3V0ZVZhbHVlXG4gICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUoeyByb3V0ZUNvdW50IH0sICcnLCByb3V0ZVZhbHVlKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjaGVja0ZvclNsYXNoID0gd2hlbihcbiAgICAgICAgY29tcG9zZShjb21wbGVtZW50KGVxdWFscygnLycpKSwgaGVhZCksIGNvbmNhdCgnLycsIF9fKSlcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh7IHJvdXRlQ291bnQgfSwgJycsIGNoZWNrRm9yU2xhc2gocm91dGVWYWx1ZSkpXG4gICAgfVxuICB9XG5cbiAgZ2V0V2luZG93TG9jYXRpb24oKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSAvLyBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgod2luZG93LmxvY2F0aW9uLmhhc2gpO1xuICB9XG5cbiAgYmluZFN0YXRpY01ldGhvZHMoKSB7XG4gICAgdGhpcy5jaGVja0ZvckVuZFJvdXRlID0gU3B5bmVDaGFubmVsUm91dGUuY2hlY2tGb3JFbmRSb3V0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRJc0RlZXBMaW5rQm9vbCA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldElzRGVlcExpbmtCb29sLmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tTG9jYXRpb25TdHIgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXREYXRhRnJvbUxvY2F0aW9uU3RyLmJpbmQoXG4gICAgICB0aGlzKVxuICAgIHRoaXMub25JbmNvbWluZ0RvbUV2ZW50ID0gU3B5bmVDaGFubmVsUm91dGUub25JbmNvbWluZ0RvbUV2ZW50LmJpbmQodGhpcylcbiAgICB0aGlzLmdldERhdGFGcm9tU3RyaW5nID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0RGF0YUZyb21TdHJpbmcuYmluZCh0aGlzKVxuICAgIHRoaXMuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0UGFyYW1zRnJvbVJvdXRlU3RyLmJpbmQodGhpcylcbiAgICB0aGlzLmdldExvY2F0aW9uRGF0YSA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldExvY2F0aW9uRGF0YS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXRSb3V0ZVN0YXRlID0gU3B5bmVDaGFubmVsUm91dGUuZ2V0Um91dGVTdGF0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5nZXREYXRhRnJvbVBhcmFtcyA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldERhdGFGcm9tUGFyYW1zLmJpbmQodGhpcylcbiAgICB0aGlzLmdldFJvdXRlQ291bnQgPSBTcHluZUNoYW5uZWxSb3V0ZS5nZXRSb3V0ZUNvdW50LmJpbmQodGhpcylcbiAgICB0aGlzLmdldEV4dHJhUGF5bG9hZFBhcmFtcyA9IFNweW5lQ2hhbm5lbFJvdXRlLmdldEV4dHJhUGF5bG9hZFBhcmFtcy5iaW5kKHRoaXMpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kc1dpdGhDb25maWdEYXRhKClcbiAgfVxuXG4gIGJpbmRTdGF0aWNNZXRob2RzV2l0aENvbmZpZ0RhdGEoKSB7XG4gICAgY29uc3QgY3VycmllZEdldFJvdXRlID0gY3VycnlOKDMsIFNweW5lQ2hhbm5lbFJvdXRlLmdldFJvdXRlU3RyRnJvbVBhcmFtcylcbiAgICB0aGlzLmdldFJvdXRlU3RyRnJvbVBhcmFtcyA9IGN1cnJpZWRHZXRSb3V0ZShfXywgdGhpcy5yb3V0ZUNvbmZpZ0pzb24sXG4gICAgICB0aGlzLnJvdXRlQ29uZmlnSnNvbi50eXBlKVxuICB9XG59XG4iLCJpbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsLmpzJ1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGVxdWFscywgcGF0aCwgY29tcG9zZSwgcHJvcCwgZmlsdGVyLCByZXBsYWNlLCBsZW5zUHJvcCwgb3Zlciwgb21pdCwgdGVzdCwga2V5cywgZWl0aGVyLCB0b1VwcGVyIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBzYW5pdGl6ZUV2ZW50VGFyZ2V0IH0gZnJvbSAnLi4vdXRpbHMvc2FuaXRpemUtZGF0YS5qcydcblxuZXhwb3J0IGNsYXNzIFNweW5lQ2hhbm5lbFVJIGV4dGVuZHMgQ2hhbm5lbCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFNweW5lQ2hhbm5lbFVJXG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+VGhpcyBDaGFubmVsIGxpc3RlbnMgdG8gYWxsIFVzZXIgRXZlbnRzIHRoYXQgaGF2ZSBiZWVuIHNldCB0byBicm9hZGNhc3QgYnkgVmlld1N0cmVhbSBpbnN0YW5jZXMsIHVzaW5nIHRoZSBicm9hZENhc3RFdmVudHMgbWV0aG9kLjwvcD5cbiAgICogPHA+SFRNTCBFbGVtZW50cyB0aGF0IGhhdmUgdGhlaXIgZGF0YSBjaGFubmVsIHByb3BlcnR5IHNldCB0byBcIlJPVVRFXCIgd2lsbCBicm9hZGNhc3QgdGhlaXIgdWkgZXZlbnQgdG8gdGhhdCBjaGFubmVsIGluc3RlYWQuPC9wPlxuICAgKiA8ZGl2IGNsYXNzPSdidG4gYnRuLWJsdWUtcmVmIGJ0bi1jb25zb2xlIG1vZGFsLWJ0bicgIGRhdGEtdHlwZT0nbW9kYWwtd2luZG93JyBkYXRhLXZhbHVlPSd1aUV2ZW50cyc+VmlldyBVSSBFdmVudHM8L2Rpdj48L2JyPjwvYnI+XG4gICAqIDxwPlNlZSBMSU5LWydWaWV3U3RyZWFtJywgJ3ZpZXctc3RyZWFtJ10gZm9yIGFuIGV4YW1wbGUgb24gaG93IHRvIGJpbmQgSFRNTCBFbGVtZW50cyB0byB0aGUgVUkgQ2hhbm5lbC48L3A+XG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gQ0hBTk5FTF9OQU1FIC0gPSAnQ0hBTk5FTF9VSSc7XG4gICAqXG4gICAqXG4gICAqL1xuXG4gIGNvbnN0cnVjdG9yKG5hbWUgPSAnQ0hBTk5FTF9VSScsIHByb3BzID0ge30pIHtcbiAgICBwcm9wcy5zZW5kQ2FjaGVkUGF5bG9hZCA9IGZhbHNlXG4gICAgc3VwZXIobmFtZSwgcHJvcHMpXG4gICAgdGhpcy5rZXlFdmVudHNMb2FkZWQgPSBmYWxzZVxuICAgIHRoaXMua2V5Q29kZUFyciA9IFtdXG4gIH1cblxuICBhZGRSZWdpc3RlcmVkQWN0aW9ucygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgJ0NIQU5ORUxfVUlfRE9NQ09OVEVOVExPQURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BQk9SVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BQ1RJVkFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BRERUUkFDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BRlRFUlBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FGVEVSU0NSSVBURVhFQ1VURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BTklNQVRJT05DQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQU5JTUFUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0FOSU1BVElPTklURVJBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BTklNQVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BUFBJTlNUQUxMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQVVESU9FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQVVESU9TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9BVVhDTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CRUZPUkVJTlBVVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CRUZPUkVQUklOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CRUZPUkVVTkxPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQkVHSU5FVkVOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9CTE9DS0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0JMVVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQk9VTkRBUllfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQlVGRkVSRURBTU9VTlRMT1dfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0FOQ0VMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NBTlBMQVlfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0FOUExBWVRIUk9VR0hfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NMT1NFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NMT1NJTkdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09NUExFVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09NUE9TSVRJT05FTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ09NUE9TSVRJT05TVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT01QT1NJVElPTlVQREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT05ORUNUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTk5FQ1RJT05TVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9DT05URU5UREVMRVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPTlRFWFRNRU5VX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NPUFlfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfQ1VFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0NVVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EQVRBQ0hBTk5FTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EQkxDTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9ERVZJQ0VDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfREVWSUNFTU9USU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RFVklDRU9SSUVOVEFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUkFHRU5URVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRFJBR0xFQVZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RSQUdTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9EUk9QX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0RVUkFUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VNUFRJRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VOREVWRU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VOREVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0VOVEVSUElDVFVSRUlOUElDVFVSRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GT0NVU19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9GT0NVU0lOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZPQ1VTT1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZPUk1EQVRBX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0ZVTExTQ1JFRU5DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfRlVMTFNDUkVFTkVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dBTUVQQURDT05ORUNURURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0FNRVBBRERJU0NPTk5FQ1RFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HQVRIRVJJTkdTVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9HRVNUVVJFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dFU1RVUkVFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfR0VTVFVSRVNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0dPVFBPSU5URVJDQVBUVVJFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0hBU0hDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSUNFQ0FORElEQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lDRUNBTkRJREFURUVSUk9SX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0lDRUNPTk5FQ1RJT05TVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JQ0VHQVRIRVJJTkdTVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JTlBVVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JTlBVVFNPVVJDRVNDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfSU5TVEFMTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9JTlZBTElEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0tFWURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfS0VZVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTEFOR1VBR0VDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTEVBVkVQSUNUVVJFSU5QSUNUVVJFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTE9BREVEREFUQV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FERURNRVRBREFUQV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT0FERU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX0xPQURTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9MT1NUUE9JTlRFUkNBUFRVUkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTUFSS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NRVJDSEFOVFZBTElEQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTUVTU0FHRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NRVNTQUdFRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFRU5URVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9NT1VTRU1PVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VPVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTU9VU0VPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX01PVVNFVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfTVVURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9ORUdPVElBVElPTk5FRURFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9OT01BVENIX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX05PVElGSUNBVElPTkNMSUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX09GRkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfT05MSU5FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX09QRU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfT1JJRU5UQVRJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUEFHRUhJREVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUEFHRVNIT1dfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUEFTVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUEFVU0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUEFZRVJERVRBSUxDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUEFZTUVOVE1FVEhPRENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QTEFZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BMQVlJTkdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkNBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSRU5URVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUkxFQVZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJMT0NLQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1BPSU5URVJMT0NLRVJST1JfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUk1PVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9JTlRFUk9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVST1ZFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QT0lOVEVSVVBfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUE9QU1RBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUFJPR1JFU1NfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUFVTSF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9QVVNIU1VCU0NSSVBUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JBVEVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVBRFlTVEFURUNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRUpFQ1RJT05IQU5ETEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFTU9WRVRSQUNLX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFTU9WRVNUUkVBTV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVBFQVRFVkVOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNFVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNJWkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfUkVTT1VSQ0VUSU1JTkdCVUZGRVJGVUxMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1JFU1VMVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9SRVNVTUVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0NST0xMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFQVJDSF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUVLRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VFS0lOR19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNURURDQU5ESURBVEVQQUlSQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NFTEVDVEVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TRUxFQ1RJT05DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0VMRUNUU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU0hJUFBJTkdBRERSRVNTQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NISVBQSU5HT1BUSU9OQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NJR05BTElOR1NUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NMT1RDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU09VTkRFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU09VTkRTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUEVFQ0hFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1BFRUNIU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1FVRUVaRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TUVVFRVpFRU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NRVUVFWkVTVEFSVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9TVEFMTEVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NUQVRFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NUT1JBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1VCTUlUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1NVQ0NFU1NfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfU1VTUEVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9USU1FT1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RJTUVVUERBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9HR0xFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPTkVDSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9VQ0hDQU5DRUxfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9VQ0hFTkRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVE9VQ0hNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RPVUNIU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBQ0tfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBTlNJVElPTkNBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9UUkFOU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1RSQU5TSVRJT05SVU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVFJBTlNJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1VOSEFORExFRFJFSkVDVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9VTkxPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVU5NVVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1VQR1JBREVORUVERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVkVSU0lPTkNIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WSVNJQklMSVRZQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZPSUNFU0NIQU5HRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVk9MVU1FQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWUFDVElWQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWUJMVVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZQ09OTkVDVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlERUFDVElWQVRFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1ZSRElTUExBWURJU0NPTk5FQ1RfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZRk9DVVNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZUE9JTlRFUlJFU1RSSUNURURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfVlJESVNQTEFZUE9JTlRFUlVOUkVTVFJJQ1RFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9WUkRJU1BMQVlQUkVTRU5UQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dBSVRJTkdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfVUlfV0VCR0xDT05URVhUQ1JFQVRJT05FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJHTENPTlRFWFRMT1NUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQkdMQ09OVEVYVFJFU1RPUkVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQktJVE1PVVNFRk9SQ0VDSEFOR0VEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQktJVE1PVVNFRk9SQ0VET1dOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dFQktJVE1PVVNFRk9SQ0VVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9VSV9XRUJLSVRNT1VTRUZPUkNFV0lMTEJFR0lOX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1VJX1dIRUVMX0VWRU5UJ1xuICAgIF1cbiAgfVxuXG4gIGxvYWRLZXlTdHJlYW0oKSB7XG4gICAgY29uc3Qga2V5VXBzID0gT2JzZXJ2YWJsZS5mcm9tRXZlbnQoZG9jdW1lbnQsICdrZXl1cCcpXG4gICAgY29uc3QgZmlsdGVyS2V5cyA9IGUgPT4gdGhpcy5rZXlDb2RlQXJyLmluZGV4T2YoZS5rZXlDb2RlKSA+PSAwXG4gICAgdGhpcy5rZXlQcmVzc2VzJCA9IGtleVVwcy5ncm91cEJ5KGUgPT4gZS5rZXlDb2RlKVxuICAgICAgLm1lcmdlQWxsKClcbiAgICAgIC5maWx0ZXIoZmlsdGVyS2V5cylcbiAgICAgIC5yZXBlYXQoKVxuICAgICAgLnN1YnNjcmliZSh0aGlzLm9uS2V5UHJlc3NlZC5iaW5kKHRoaXMpKVxuICB9XG5cbiAgYWRkS2V5RXZlbnQobnVtKSB7XG4gICAgaWYgKHRoaXMua2V5RXZlbnRzTG9hZGVkID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5sb2FkS2V5U3RyZWFtKClcbiAgICB9XG4gICAgdGhpcy5rZXlFdmVudHNMb2FkZWQgPSB0cnVlXG4gICAgdGhpcy5yZWdpc3RlcktleShudW0pXG4gIH1cblxuICByZWdpc3RlcktleShjKSB7XG4gICAgdGhpcy5rZXlDb2RlQXJyLnB1c2goYylcbiAgfVxuXG4gIG9uS2V5UHJlc3NlZChldnQpIHtcbiAgICAvLyBjb25zb2xlLmxvZygna2V5IGlzICcsIGV2dCk7XG4gIH1cblxuICBzdGF0aWMgcmVtb3ZlU1NJRChwbCkge1xuICAgIGNvbnN0IHJvdXRlTGVucyA9IGxlbnNQcm9wKFsncGF5bG9hZCddKVxuICAgIGNvbnN0IG9taXRTU0lEID0gb3Zlcihyb3V0ZUxlbnMsIG9taXQoWyd2c2lkJ10pKVxuICAgIHJldHVybiBvbWl0U1NJRChwbClcbiAgfVxuXG4gIG9uSW5jb21pbmdPYnNlcnZhYmxlKG9iaikge1xuICAgIGNvbnN0IGVxc05hbWUgPSBlcXVhbHMob2JqLm5hbWUsIHRoaXMucHJvcHMubmFtZSlcbiAgICBvYmouZGF0YSA9IFNweW5lQ2hhbm5lbFVJLnJlbW92ZVNTSUQob2JqLmRhdGEpXG4gICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50IH0gPSBvYmouZGF0YVxuICAgIGNvbnN0IGRhdGFPYmogPSBvYnNWYWwgPT4gKHsgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQ6IG9ic1ZhbCB9KVxuICAgIGNvbnN0IG9uU3VjY2VzcyA9IChvYmopID0+IG9iai5vYnNlcnZhYmxlLnBpcGUobWFwKGRhdGFPYmopKVxuICAgICAgLnN1YnNjcmliZSh0aGlzLm9uVUlFdmVudC5iaW5kKHRoaXMpKVxuICAgIGNvbnN0IG9uRXJyb3IgPSAoKSA9PiB7fVxuICAgIHJldHVybiBlcXNOYW1lID09PSB0cnVlID8gb25TdWNjZXNzKG9iaikgOiBvbkVycm9yKClcbiAgfVxuXG4gIGdldEFjdGlvblN0YXRlKHZhbCkge1xuICAgIGNvbnN0IHR5cGVWYWwgPSBwYXRoKFsnZXZlbnQnLCAndHlwZSddKVxuICAgIGNvbnN0IHR5cGVPdmVyUmlkZVZhbCA9IHBhdGgoWydldmVudCcsICd0eXBlT3ZlclJpZGUnXSlcbiAgICBjb25zdCBldmVudFR5cGUgPSBjb21wb3NlKHRvVXBwZXIsIGVpdGhlcih0eXBlT3ZlclJpZGVWYWwsIHR5cGVWYWwpKVxuICAgIGNvbnN0IHR5cGUgPSBldmVudFR5cGUodmFsKVxuICAgIGNvbnN0IG1haW5BY3Rpb24gPSAnQ0hBTk5FTF9VSSdcbiAgICByZXR1cm4gdHlwZSAhPT0gdW5kZWZpbmVkID8gYCR7bWFpbkFjdGlvbn1fJHt0eXBlfV9FVkVOVGAgOiBtYWluQWN0aW9uXG4gIH1cblxuICBzdGF0aWMgY2hlY2tGb3JFdmVudE1ldGhvZHMob2JzKSB7XG4gICAgY29uc3QgcmUgPSAvXihldmVudCkoW0EtWl0uKikoW0EtWl0uKikkL2dtXG4gICAgY29uc3QgZ2V0TWV0aG9kcyA9IGNvbXBvc2UoZmlsdGVyKHRlc3QocmUpKSwga2V5cywgcHJvcCgncGF5bG9hZCcpKVxuICAgIGNvbnN0IG1ldGhvZHNBcnIgPSBnZXRNZXRob2RzKG9icylcbiAgICBpZiAobWV0aG9kc0Fyci5sZW5ndGggPj0gMSkge1xuICAgICAgY29uc3QgZXZ0ID0gcHJvcCgnZXZlbnQnLCBvYnMpXG4gICAgICBpZiAoZXZ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbWV0aG9kVXBkYXRlID0gKG1hdGNoLCBwMSwgcDIsIHAzLCBwNCkgPT4gU3RyaW5nKHAyKS50b0xvd2VyQ2FzZSgpICsgcDMgKyBwNFxuICAgICAgICBjb25zdCBtZXRob2RTdHJSZXBsYWNlID0gcmVwbGFjZSgvXihldmVudCkoW0EtWl0pKC4qKShbQS1aXS4qKSQvZ20sIG1ldGhvZFVwZGF0ZSlcbiAgICAgICAgY29uc3QgcnVuTWV0aG9kID0gKG1ldGhvZFN0cikgPT4ge1xuICAgICAgICAgIGNvbnN0IG0gPSBtZXRob2RTdHJSZXBsYWNlKG1ldGhvZFN0cilcbiAgICAgICAgICBpZiAoZXZ0W21dICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIChldnRbbV0pID09PSAnZnVuY3Rpb24nKSB7IGV2dFttXSgpIH1cbiAgICAgICAgfVxuICAgICAgICBtZXRob2RzQXJyLmZvckVhY2gocnVuTWV0aG9kKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYnNcbiAgfVxuXG4gIG9uVUlFdmVudChvYnMpIHtcbiAgICBmdW5jdGlvbiBkb21TdHJpbmdNYXBUb09iamVjdChkb21TdHJpbmdNYXApIHtcbiAgICAgIGNvbnN0IG9iaiA9IHt9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBkb21TdHJpbmdNYXApIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXTigJlzIGEgZGlyZWN0IHByb3BlcnR5ICh0aG91Z2ggZGF0YXNldCByYXJlbHkgaGFzIGFueXRoaW5nIG9uIHRoZSBwcm90b3R5cGUpOlxuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGRvbVN0cmluZ01hcCwga2V5KSkge1xuICAgICAgICAgIG9ialtrZXldID0gZG9tU3RyaW5nTWFwW2tleV1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG9ialxuICAgIH1cblxuICAgIG9icy5wYXlsb2FkID0gZG9tU3RyaW5nTWFwVG9PYmplY3Qob2JzPy5zcmNFbGVtZW50Py5lbD8uZGF0YXNldCkgPz8gb2JzLnBheWxvYWRcblxuICAgIFNweW5lQ2hhbm5lbFVJLmNoZWNrRm9yRXZlbnRNZXRob2RzKG9icylcbiAgICBvYnMuYWN0aW9uID0gdGhpcy5nZXRBY3Rpb25TdGF0ZShvYnMpXG4gICAgY29uc3QgYWN0aW9uID0gb2JzLmFjdGlvbi8vIHRoaXMuZ2V0QWN0aW9uU3RhdGUob2JzKTtcbiAgICAvLyBjb25zdCB7IHNyY0VsZW1lbnQgfSA9IG9ic1xuICAgIGNvbnN0IHsgcGF5bG9hZCwgc3JjRWxlbWVudCB9ID0gb2JzXG5cbiAgICBjb25zdCBldmVudCA9IG9icy5ldmVudFxuICAgIHNhbml0aXplRXZlbnRUYXJnZXQoZXZlbnQ/LnRhcmdldClcbiAgICAvLyBjb25zdCBwYXlsb2FkID0gZG9tU3RyaW5nTWFwVG9PYmplY3Qoc3JjRWxlbWVudD8uZWw/LmRhdGFzZXQpID8/IG9icy5wYXlsb2FkXG4gICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbCB9IGZyb20gJy4vY2hhbm5lbC5qcydcbmltcG9ydCB7IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgfSBmcm9tICcuLi91dGlscy9mcnAtdG9vbHMuanMnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsV2luZG93IH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC13aW5kb3cuanMnXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAsIGRlYm91bmNlVGltZSwgc2tpcFdoaWxlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBjdXJyeSwgcGljaywgcGFydGlhbFJpZ2h0LCBtYXBPYmpJbmRleGVkLCBhcHBseSwgbWFwIGFzIHJNYXAgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4uL3V0aWxzL2RlZXAtbWVyZ2UuanMnXG5cbmV4cG9ydCBjbGFzcyBTcHluZUNoYW5uZWxXaW5kb3cgZXh0ZW5kcyBDaGFubmVsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgU3B5bmVDaGFubmVsV2luZG93XG4gICAqIEB0eXBlIGNvcmVcbiAgICpcbiAgICogQGRlc2NcbiAgICogVGhlIFdpbmRvdyBDaGFubmVsIHdpbGwgbGlzdGVuIHRvIHdpbmRvdyBhbmQgZG9jdW1lbnQgZXZlbnRzIHRoYXQgYXJlIHNldCBpbiBpdHMgY29uZmlndXJhdGlvbiBmaWxlXG4gICAqIDxkaXYgY2xhc3M9J2J0biBidG4tYmx1ZS1yZWYgYnRuLWNvbnNvbGUgbW9kYWwtYnRuJyAgZGF0YS10eXBlPSdtb2RhbC13aW5kb3cnIGRhdGEtdmFsdWU9J3dpbmRvd0V2ZW50cyc+VmlldyBXaW5kb3cgRXZlbnRzPC9kaXY+PC9icj48L2JyPlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtTdHJpbmd9IENIQU5ORUxfTkFNRVxuICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcgLSA9IHt9OyBUaGUgY29uZmlnIGhhcyBzZXZlcmFsIG9wdGlvbnMgdXNlZCB0byBsaXN0ZW4gdG8gd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMuXG4gICAqIEBwcm9wZXJ0eSB7QXJyYXl9IGNvbmZpZy5ldmVudHMgLSA9IFtdOyBBbnkgd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMgY2FuIGJlIGFkZGVkIGhlcmUuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBjb25maWcubWVkaWFRdWVyaWVzIC0gPSB7fTsgTWVkaWEgcXVlcmllcyBhcmUgYWRkZWQgYXMga2V5LHZhbHVlIHBhaXJzOyB0aGUga2V5IGlzIHRoZSBuYW1lIG9mIHRoZSBib29sZWFuIGZvciB0aGUgcXVlcnksIHRoZSB2YWx1ZSBpcyB0aGUgcXVlcnkgaXRzZWxmLlxuICAgKiBAcHJvcGVydHkge0Jvb2xlYW59IGNvbmZpZy5saXN0ZW5Gb3JSZXNpemUgLSA9IHRydWU7IFRoaXMgaXMgZGVmYXVsdCBsaXN0ZW5pbmcgZm9yIHJlc2l6ZSBldmVudC5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcubGlzdGVuRm9yT3JpZW50YXRpb24gLSA9IHRydWU7IExpc3RlbiBmb3IgaG9yaXpvbnRhbCBhbmQgbGFuZHNjYXBlIG9yaWVudGF0aW9uIGNoYW5nZXMgb24gbW9iaWxlIGRldmljZXMuXG4gICAqIEBwcm9wZXJ0eSB7Qm9vbGVhbn0gY29uZmlnLmxpc3RlbkZvck1vdXNlV2hlZWwgLSA9IGZhbHNlOyBJZiBzZXQgdG8gdHJ1ZSwgd2lsbCBsaXN0ZW4gZm9yIG1vdXNlV2hlZWwgYW5kIHdpbGwgYWRkIGRpcmVjdGlvbiBhbmQgZGlzdGFuY2UgcGFyYW1ldGVycy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JSZXNpemUgLSA9IDIwMDsgVGhlIHRpbWUgYmV0d2VlbiByZXNpemUgZXZlbnRzIGluIG1pbGxpc2Vjb25kcy5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSBjb25maWcuZGVib3VuY2VNU1RpbWVGb3JTY3JvbGwgLSA9IDE1MDsgVGhlIHRpbWUgYmV0d2VlbiBzY3JvbGwgZXZlbnRzIGluIG1pbGxpc2Vjb25kcy5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IENIQU5ORUxfTkFNRSAtID0gJ0NIQU5ORUxfV0lORE9XJztcbiAgICpcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKENIQU5ORUxfTkFNRSA9ICdDSEFOTkVMX1dJTkRPVycpIHtcbiAgICBzdXBlcihDSEFOTkVMX05BTUUpXG4gICAgdGhpcy5iaW5kU3RhdGljTWV0aG9kcygpXG4gICAgdGhpcy5jdXJyZW50U2Nyb2xsWSA9IDBcbiAgfVxuXG4gIGluaXRpYWxpemVTdHJlYW0oKSB7XG4gICAgdGhpcy5kb21DaGFubmVsQ29uZmlnID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZy5jaGFubmVscy5XSU5ET1dcbiAgICBjb25zdCBvYnMkQXJyID0gdGhpcy5nZXRBY3RpdmVPYnNlcnZhYmxlcygpXG4gICAgY29uc3QgZG9tJCA9IG1lcmdlKC4uLm9icyRBcnIpXG4gICAgdGhpcy5kb20kID0gZG9tJFxuICAgIGRvbSQuc3Vic2NyaWJlKHAgPT4ge1xuICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBwXG4gICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50KVxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgZ2V0TW91c2VXaGVlbE1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19XSEVFTF9FVkVOVFxuICAgIGNvbnN0IHNjcm9sbERpciA9IGV2ZW50LmRlbHRhWSA8PSAwID8gJ3VwJyA6ICdkb3duJ1xuICAgIGNvbnN0IHsgZGVsdGFYLCBkZWx0YVksIGRlbHRhWiB9ID0gZXZlbnRcbiAgICBjb25zdCBwYXlsb2FkID0geyBzY3JvbGxEaXIsIGRlbHRhWCwgZGVsdGFZLCBkZWx0YVogfVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlQ3VycmllZEdlbmVyaWNFdmVudChhY3Rpb25TdHIpIHtcbiAgICBjb25zdCBhY3Rpb24gPSBgQ0hBTk5FTF9XSU5ET1dfJHthY3Rpb25TdHIudG9VcHBlckNhc2UoKX1fRVZFTlRgXG4gICAgY29uc3QgY3VycnlGbiA9IGN1cnJ5KFNweW5lQ2hhbm5lbFdpbmRvdy5tYXBHZW5lcmljRXZlbnQpXG4gICAgcmV0dXJuIGN1cnJ5Rm4oYWN0aW9uKVxuICB9XG5cbiAgc3RhdGljIG1hcEdlbmVyaWNFdmVudChhY3RuLCBldmVudCkge1xuICAgIC8vIGNvbnNvbGUubG9nKFwibWFwIGdlbmVyaWMgZXZlbnQgXCIsYWN0bik7XG4gICAgY29uc3QgYWN0aW9uID0gYWN0blxuICAgIGNvbnN0IHBheWxvYWQgPSBldmVudFxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgZ2V0UmVzaXplTWFwRm4oZXZlbnQpIHtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmNoYW5uZWxBY3Rpb25zLkNIQU5ORUxfV0lORE9XX1JFU0laRV9FVkVOVFxuICAgIGNvbnN0IHBheWxvYWQgPSBwaWNrKFxuICAgICAgWydpbm5lcldpZHRoJywgJ2lubmVySGVpZ2h0JywgJ291dGVyV2lkdGgnLCAnb3V0ZXJIZWlnaHQnXSwgd2luZG93KVxuICAgIGNvbnN0IHNyY0VsZW1lbnQgPSBldmVudC5zcmNFbGVtZW50XG4gICAgcmV0dXJuIHsgYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9XG4gIH1cblxuICBzdGF0aWMgZ2V0T3JpZW50YXRpb25NYXBGbihldmVudCkge1xuICAgIGNvbnN0IGFjdGlvbiA9IHRoaXMuY2hhbm5lbEFjdGlvbnMuQ0hBTk5FTF9XSU5ET1dfT1JJRU5UQVRJT05fRVZFTlRcbiAgICBjb25zdCBvcmllbnRhdGlvblN0ciA9ICcob3JpZW50YXRpb246IHBvcnRyYWl0KSdcbiAgICBjb25zdCBpc1BvcnRyYWl0Qm9vbCA9IHdpbmRvdy5tYXRjaE1lZGlhKG9yaWVudGF0aW9uU3RyKS5tYXRjaGVzXG4gICAgY29uc3QgcGF5bG9hZCA9IHBpY2soXG4gICAgICBbJ2lubmVyV2lkdGgnLCAnaW5uZXJIZWlnaHQnLCAnb3V0ZXJXaWR0aCcsICdvdXRlckhlaWdodCddLCB3aW5kb3cpXG4gICAgcGF5bG9hZC5vcmllbnRhdGlvbiA9IGlzUG9ydHJhaXRCb29sID09PSB0cnVlXG4gICAgICA/ICdwb3J0cmFpdCdcbiAgICAgIDogJ2xhbmRzY2FwZSdcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICB9XG5cbiAgZ2V0TWVkaWFRdWVyeU1hcEZuKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5jaGFubmVsQWN0aW9ucy5DSEFOTkVMX1dJTkRPV19NRURJQV9RVUVSWV9FVkVOVFxuICAgIGNvbnN0IHBheWxvYWQgPSBwaWNrKFsnbWF0Y2hlcycsICdtZWRpYScsICdtZWRpYVF1ZXJ5TmFtZSddLCBldmVudClcbiAgICBjb25zdCBzcmNFbGVtZW50ID0gZXZlbnQuc3JjRWxlbWVudFxuICAgIHJldHVybiB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfVxuICB9XG5cbiAgY3JlYXRlTW91c2VXaGVlbE9ic2VydmFibGUoY29uZmlnKSB7XG4gICAgY29uc3QgZGVib3VuY2VUID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsXG5cbiAgICByZXR1cm4gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCgnd2hlZWwnLFxuICAgICAgU3B5bmVDaGFubmVsV2luZG93LmdldE1vdXNlV2hlZWxNYXBGbi5iaW5kKHRoaXMpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZShkZWJvdW5jZVQpXG4gICAgICApXG4gIH1cblxuICBzdGF0aWMgZ2V0U2Nyb2xsRGF0YSgpIHtcbiAgICBsZXQgY3VycmVudFNjcm9sbFkgPSAwXG5cbiAgICBjb25zdCBnZXRTY3JvbGxEYXRhID0gKHNjcm9sbFkpID0+IHtcbiAgICAgIGNvbnN0IHNjcm9sbERpc3RhbmNlID0gY3VycmVudFNjcm9sbFkgLSBzY3JvbGxZXG4gICAgICBjb25zdCBzY3JvbGxEaXIgPSBzY3JvbGxEaXN0YW5jZSA+PSAwID8gJ3VwJyA6ICdkb3duJ1xuICAgICAgY3VycmVudFNjcm9sbFkgPSBzY3JvbGxZXG4gICAgICByZXR1cm4geyBzY3JvbGxZLCBzY3JvbGxEaXN0YW5jZSwgc2Nyb2xsRGlyIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFNjcm9sbERhdGFcbiAgfVxuXG4gIHN0YXRpYyBnZXRTY3JvbGxZKHNjcm9sbEVsZW1lbnQpIHtcbiAgICByZXR1cm4gc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldCAhPT0gdW5kZWZpbmVkID8gc2Nyb2xsRWxlbWVudC5wYWdlWU9mZnNldCA6IHNjcm9sbEVsZW1lbnQuc2Nyb2xsVG9wXG4gIH1cblxuICBzdGF0aWMgZ2V0U2Nyb2xsTWFwRm4oZXZlbnQsIGludGVydmFsLCBhY3Rpb24sIHNjcm9sbERhdGFGbiwgc2Nyb2xsRWxlbWVudCkge1xuICAgIGNvbnN0IHNjcm9sbFkgPSBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0U2Nyb2xsWShzY3JvbGxFbGVtZW50KVxuICAgIGNvbnN0IHBheWxvYWQgPSBzY3JvbGxEYXRhRm4oc2Nyb2xsWSlcbiAgICBjb25zdCB7IHNjcm9sbERpc3RhbmNlIH0gPSBwYXlsb2FkXG4gICAgY29uc3Qgc3JjRWxlbWVudCA9IGV2ZW50LnNyY0VsZW1lbnRcbiAgICByZXR1cm4geyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIHNjcm9sbERpc3RhbmNlLCBldmVudCB9XG4gIH1cblxuICBjcmVhdGVTY3JvbGxPYnNlcnZhYmxlKGNvbmZpZywgc2Nyb2xsRWxlbWVudCA9IHdpbmRvdywgaXNQYXNzaXZlID0gdHJ1ZSkge1xuICAgIGNvbnN0IHNraXBXaGVuRGlySXNNaXNzaW5nID0gZXZ0ID0+IGV2dC5zY3JvbGxEaXN0YW5jZSA9PT0gMFxuICAgIGNvbnN0IGRUaW1lID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsXG5cbiAgICBjb25zdCBlbGVtZW50ID0gc2Nyb2xsRWxlbWVudFxuXG4gICAgY29uc3QgaXNXaW5kb3cgPSBzY3JvbGxFbGVtZW50ID09PSB3aW5kb3dcblxuICAgIGNvbnN0IHNjcm9sbEVsRm9yVmFscyA9IGNvbmZpZy5zY3JvbGxFbEZvclZhbHMgIT09IHVuZGVmaW5lZCA/IGNvbmZpZy5zY3JvbGxFbEZvclZhbHMgOiBzY3JvbGxFbGVtZW50XG4gICAgY29uc3QgYWN0aW9uID0gaXNXaW5kb3cgPyAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VWRU5UJyA6ICdDSEFOTkVMX1dJTkRPV19FTEVNRU5UX1NDUk9MTF9FVkVOVCdcblxuICAgIGNvbnN0IHNjcm9sbERhdGFGbiA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxEYXRhKClcbiAgICAvLyBjb25zb2xlLmxvZyhcIlNDUk9MTCBFTEVNRU5UIFwiLGFjdGlvbixzY3JvbGxFbGVtZW50LCBzY3JvbGxFbEZvclZhbHMpO1xuICAgIGNvbnN0IHNjcm9sbE1hcEZuID0gcGFydGlhbFJpZ2h0KFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxNYXBGbiwgW2FjdGlvbiwgc2Nyb2xsRGF0YUZuLCBzY3JvbGxFbEZvclZhbHMsIGlzUGFzc2l2ZSwgZWxlbWVudF0pLmJpbmQodGhpcylcblxuICAgIC8vIGNvbnNvbGUubG9nKFwiY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZSBcIiwge3Njcm9sbE1hcEZuLCBzY3JvbGxEYXRhRm4sIGFjdGlvbiwgY29uZmlnLCBzY3JvbGxFbGVtZW50LCBlbGVtZW50fSlcblxuICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KCdzY3JvbGwnLFxuICAgICAgc2Nyb2xsTWFwRm4sIGlzUGFzc2l2ZSwgZWxlbWVudClcbiAgICAgIC5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoZFRpbWUpLFxuICAgICAgICBza2lwV2hpbGUoc2tpcFdoZW5EaXJJc01pc3NpbmcpLFxuICAgICAgICBtYXAocCA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3U2Nyb2xsWSA9IFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRTY3JvbGxZKGVsZW1lbnQpXG4gICAgICAgICAgcC5wYXlsb2FkLnNjcm9sbERpc3RhbmNlQWJzID0gTWF0aC5hYnModGhpcy5jdXJyZW50U2Nyb2xsWSAtIG5ld1Njcm9sbFkpXG4gICAgICAgICAgdGhpcy5jdXJyZW50U2Nyb2xsWSA9IG5ld1Njcm9sbFlcbiAgICAgICAgICByZXR1cm4gcFxuICAgICAgICB9KVxuICAgICAgKVxuICB9XG5cbiAgY3JlYXRlT3JpZW50YXRpb25PYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIC8vIGNvbnNvbGUubG9nKFwiYWRkIG9yaWVudGF0aW9uXCIpO29yaWVudGF0aW9uY2hhbmdlXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ29yaWVudGF0aW9uY2hhbmdlJyxcbiAgICAgIFNweW5lQ2hhbm5lbFdpbmRvdy5nZXRPcmllbnRhdGlvbk1hcEZuLmJpbmQodGhpcykpXG4gIH1cblxuICBjcmVhdGVSZXNpemVPYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIGNvbnN0IGRUaW1lID0gY29uZmlnLmRlYm91bmNlTVNUaW1lRm9yUmVzaXplXG4gICAgLy8gY29uc29sZS5sb2coJ3Jlc2l6ZSB0aGlzICcsIHRoaXMpO1xuXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQoJ3Jlc2l6ZScsXG4gICAgICBTcHluZUNoYW5uZWxXaW5kb3cuZ2V0UmVzaXplTWFwRm4uYmluZCh0aGlzKSkucGlwZShkZWJvdW5jZVRpbWUoZFRpbWUpKVxuICB9XG5cbiAgZ2V0RXZlbnRzRnJvbUNvbmZpZyhjb25maWcgPSB0aGlzLmRvbUNoYW5uZWxDb25maWcpIHtcbiAgICBjb25zdCBvYnMkQXJyID0gY29uZmlnLmV2ZW50c1xuXG4gICAgY29uc3QgYWRkV2luZG93RXZlbnRUb0FyciA9IHN0ciA9PiB7XG4gICAgICBjb25zdCBtYXBGbiA9IFNweW5lQ2hhbm5lbFdpbmRvdy5jcmVhdGVDdXJyaWVkR2VuZXJpY0V2ZW50KHN0cilcbiAgICAgIHJldHVybiBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvdy5jcmVhdGVEb21PYnNlcnZhYmxlRnJvbUV2ZW50KHN0ciwgbWFwRm4pXG4gICAgfVxuXG4gICAgcmV0dXJuIHJNYXAoYWRkV2luZG93RXZlbnRUb0Fyciwgb2JzJEFycilcbiAgfVxuXG4gIGdldEFjdGl2ZU9ic2VydmFibGVzKGNvbmZpZyA9IHRoaXMuZG9tQ2hhbm5lbENvbmZpZykge1xuICAgIGxldCBvYnMkQXJyID0gW11cblxuICAgIC8vIENIRUNLIFRPIEFERCBNRURJQSBRVUVSWSBPQlNFUlZBQkxFXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uZmlnLmxpc3RlbkZvck1lZGlhUXVlcmllcyA9IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwoXG4gICAgICBjb25maWcubWVkaWFRdWVyaWVzKSB8fCBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsKFxuICAgICAgY29uZmlnLm1lZGlhUXVlcmllcylcblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICBjb25zdCBtZXRob2RzID0ge1xuICAgICAgbGlzdGVuRm9yUmVzaXplOiB0aGlzLmNyZWF0ZVJlc2l6ZU9ic2VydmFibGUuYmluZCh0aGlzKSxcbiAgICAgIGxpc3RlbkZvck9yaWVudGF0aW9uOiB0aGlzLmNyZWF0ZU9yaWVudGF0aW9uT2JzZXJ2YWJsZS5iaW5kKHRoaXMpLFxuICAgICAgbGlzdGVuRm9yU2Nyb2xsOiB0aGlzLmNyZWF0ZVNjcm9sbE9ic2VydmFibGUuYmluZCh0aGlzKSxcbiAgICAgIGxpc3RlbkZvcldoZWVsOiB0aGlzLmNyZWF0ZU1vdXNlV2hlZWxPYnNlcnZhYmxlLmJpbmQodGhpcylcbiAgICB9XG5cbiAgICBjb25zdCBhZGRPYnNlcnZhYmxlVG9BcnIgPSAobWV0aG9kLCBrZXksIGkpID0+IHtcbiAgICAgIGNvbnN0IGFkZE9ic0Jvb2wgPSBjb25maWdba2V5XVxuICAgICAgaWYgKGFkZE9ic0Jvb2wpIHtcbiAgICAgICAgb2JzJEFyci5wdXNoKG1ldGhvZChjb25maWcpKVxuICAgICAgfVxuICAgIH1cblxuICAgIG1hcE9iakluZGV4ZWQoYWRkT2JzZXJ2YWJsZVRvQXJyLCBtZXRob2RzKVxuXG4gICAgLy8gJ2xpc3RlbkZvck1lZGlhUXVlcmllcycgOiB0aGlzLmdldE1lZGlhUXVlcnlPYnNlcnZhYmxlLmJpbmQodGhpcylcbiAgICB0aGlzLmNoZWNrRm9yTWVkaWFRdWVyaWVzKGNvbmZpZy5saXN0ZW5Gb3JNZWRpYVF1ZXJpZXMpXG5cbiAgICBjb25zdCBldmVudHNBcnIgPSB0aGlzLmdldEV2ZW50c0Zyb21Db25maWcoY29uZmlnKVxuICAgIG9icyRBcnIgPSBvYnMkQXJyLmNvbmNhdChldmVudHNBcnIpXG5cbiAgICByZXR1cm4gb2JzJEFyclxuICB9XG5cbiAgY2hlY2tGb3JNZWRpYVF1ZXJpZXMoYm9vbCkge1xuICAgIGNvbnN0IHNlbmRNUVN0cmVhbSA9IHAgPT4ge1xuICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50IH0gPSBwXG4gICAgICB0aGlzLnNlbmRDaGFubmVsUGF5bG9hZChhY3Rpb24sIHBheWxvYWQsIHNyY0VsZW1lbnQsIGV2ZW50LFxuICAgICAgICB0aGlzLm9ic2VydmVyJClcbiAgICB9XG5cbiAgICBpZiAoYm9vbCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5nZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZSh0aGlzLmRvbUNoYW5uZWxDb25maWcpXG4gICAgICAgIC5zdWJzY3JpYmUoc2VuZE1RU3RyZWFtKVxuICAgIH1cbiAgfVxuXG4gIGdldE1lZGlhUXVlcnlPYnNlcnZhYmxlKGNvbmZpZykge1xuICAgIGNvbnN0IGFyciA9IHRoaXMuY3JlYXRlTWVyZ2VkT2JzRnJvbU9iaihjb25maWcpXG4gICAgLy8gY29uc29sZS5sb2coXCJBUlIgSVMgXCIse2Fycn0pO1xuICAgIGNvbnN0IG9icyQgPSBhcHBseShtZXJnZSwgYXJyKVxuICAgIHJldHVybiBvYnMkLnBpcGUobWFwKHRoaXMuZ2V0TWVkaWFRdWVyeU1hcEZuLmJpbmQodGhpcykpKVxuICB9XG5cbiAgYWRkUmVnaXN0ZXJlZEFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BQk9SVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQUZURVJQUklOVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQU5JTUFUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BTklNQVRJT05JVEVSQVRJT05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0FOSU1BVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19BUFBJTlNUQUxMRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JFRk9SRVBSSU5UX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19CRUZPUkVVTkxPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JFR0lORVZFTlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0JMVVJfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NBQ0hFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ0xPU0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0NPTVBPU0lUSU9ORU5EX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT01QT1NJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19DT01QT1NJVElPTlVQREFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ09QWV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfQ1VUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EQkxDTElDS19FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFQ0hBTkdFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VMSUdIVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFTU9USU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ERVZJQ0VPUklFTlRBVElPTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfREVWSUNFUFJPWElNSVRZX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01BVFRSSUJVVEVOQU1FQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRE9NQVRUUk1PRElGSUVEX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19ET01DSEFSQUNURVJEQVRBTU9ESUZJRURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUNPTlRFTlRMT0FERURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RPTUVMRU1FTlROQU1FQ0hBTkdFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR0VORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRFJBR0VOVEVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHTEVBVkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19EUkFHU1RBUlRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RSQUdfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0RST1BfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0VMRU1FTlRfU0NST0xMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRk9DVVNJTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfRk9DVVNfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0ZVTExTQ1JFRU5DSEFOR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0ZVTExTQ1JFRU5FUlJPUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfSEFTSENIQU5HRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfSU5QVVRfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0lOVkFMSURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0tFWURPV05fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX0tFWVBSRVNTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19LRVlVUF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTE9BRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTUVESUFfUVVFUllfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01FU1NBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX01PVVNFRE9XTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VFTlRFUl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VMRUFWRV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VNT1ZFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRU9VVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfTU9VU0VPVkVSX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRVVQX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19NT1VTRVdIRUVMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19PRkZMSU5FX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19PTkxJTkVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09QRU5fRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX09SSUVOVEFUSU9OX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QQUdFSElERV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUEFHRVNIT1dfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BBU1RFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19QT1BTVEFURV9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUE9QU1RBVEVfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1BST0dSRVNTRVZFTlRTX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19SRVNFVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfRUxFTUVOVF9BRERFRF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfU0NST0xMX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19TQ1JPTExfTE9DS19FVkVOVCcsXG4gICAgICBbJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9MT0NLX0VWRU5UJywgJ29uU2Nyb2xsTG9ja0V2ZW50J10sXG4gICAgICBbJ0NIQU5ORUxfV0lORE9XX1NFVF9FTEVNRU5UX1RPX1NDUk9MTF9FVkVOVCcsICdvblNldEVsZW1lbnRUb1Njcm9sbCddLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NUT1JBR0VfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1NVQk1JVF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTkNBTkNFTF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTkVORF9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTlJVTl9FVkVOVCcsXG4gICAgICAnQ0hBTk5FTF9XSU5ET1dfVFJBTlNJVElPTlNUQVJUX0VWRU5UJyxcbiAgICAgICdDSEFOTkVMX1dJTkRPV19VTkxPQURfRVZFTlQnLFxuICAgICAgJ0NIQU5ORUxfV0lORE9XX1dIRUVMX0VWRU5UJ1xuICAgIF1cbiAgfVxuXG4gIG9uU2Nyb2xsTG9ja0V2ZW50KGUpIHtcbiAgICAvLyBERVBSRUNBVEVEIC0tIE1PVkVEIFRPIHNweW5lLXBsdWdpbi1zY3JvbGwtbG9jaztcbiAgfVxuXG4gIG9uU2V0RWxlbWVudFRvU2Nyb2xsKGUpIHtcbiAgICBsZXQgeyBjb25maWcsIGVsLCBzY3JvbGxFbGVtZW50IH0gPSBlLnBheWxvYWRcbiAgICBjb25maWcgPSBjb25maWcgfHwge31cbiAgICBjb25maWcgPSBkZWVwTWVyZ2UodGhpcy5kb21DaGFubmVsQ29uZmlnLCBjb25maWcpXG5cbiAgICBzY3JvbGxFbGVtZW50ID0gc2Nyb2xsRWxlbWVudCB8fCBlbFxuXG4gICAgY29uc3QgYWN0aW9uID0gJ0NIQU5ORUxfV0lORE9XX1NDUk9MTF9FTEVNRU5UX0FEREVEX0VWRU5UJ1xuICAgIHRoaXMuc2VuZENoYW5uZWxQYXlsb2FkKGFjdGlvbiwgeyBlbCB9LCBlbClcblxuICAgIHRoaXMuY3JlYXRlU2Nyb2xsT2JzZXJ2YWJsZShjb25maWcsIHNjcm9sbEVsZW1lbnQpXG4gICAgICAuc3Vic2NyaWJlKHAgPT4ge1xuICAgICAgICBjb25zdCB7IGFjdGlvbiwgcGF5bG9hZCwgc3JjRWxlbWVudCwgZXZlbnQgfSA9IHBcbiAgICAgICAgdGhpcy5zZW5kQ2hhbm5lbFBheWxvYWQoYWN0aW9uLCBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudClcbiAgICAgIH0pXG4gIH1cblxuICBiaW5kU3RhdGljTWV0aG9kcygpIHtcbiAgICB0aGlzLmNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVkaWFRdWVyeUhhbmRsZXIuYmluZChcbiAgICAgIHRoaXMpXG4gICAgdGhpcy5jcmVhdGVNZXJnZWRPYnNGcm9tT2JqID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVyZ2VkT2JzRnJvbU9iai5iaW5kKFxuICAgICAgdGhpcylcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ2hhbm5lbHNNYXAgfSBmcm9tICcuL2NoYW5uZWxzL2NoYW5uZWxzLW1hcC5qcydcbmltcG9ydCB7IFZpZXdTdHJlYW0gfSBmcm9tICcuL3ZpZXdzL3ZpZXctc3RyZWFtLmpzJ1xuaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4vdXRpbHMvc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBzYW5pdGl6ZUhUTUxDb25maWd1cmUgfSBmcm9tICcuL3V0aWxzL3Nhbml0aXplLWh0bWwuanMnXG5pbXBvcnQgeyBzYW5pdGl6ZURhdGFDb25maWd1cmUgfSBmcm9tICcuL3V0aWxzL3Nhbml0aXplLWRhdGEuanMnXG5cbmNvbnN0IF9jaGFubmVscyA9IG5ldyBDaGFubmVsc01hcCgpXG5jb25zdCB2ZXJzaW9uID0gJzAuMjIuMydcblxuY2xhc3MgU3B5bmVBcHBsaWNhdGlvbiB7XG4gIC8qKlxuICAgKlxuICAgKiBTcHluZUFwcCBjcmVhdGVzIHRoZSBnbG9iYWwgU3B5bmUgb2JqZWN0LCBhbmQgY3JlYXRlcyB0aGUgZm9sbG93aW5nIGl0ZW1zXG4gICAqIDx1bD5cbiAgICpcbiAgICogPGxpPkxJTktbJ0NoYW5uZWxzTWFwJywgJ2NoYW5uZWxzLWNvbnRyb2xsZXInXSB0aGF0IGRpcmVjdHMgdGhlIGZsb3cgb2YgZGF0YSB0byBhbGwgQ2hhbm5lbHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsVUknLCAnc3B5bmUtY2hhbm5lbC11LWknXSwgdGhhdCBicm9hZGNhc3QgYWxsIHVzZXIgaW50ZXJhY3Rpb24gZXZlbnRzPC9saT5cbiAgICogPGxpPkxJTktbJ1NweW5lQ2hhbm5lbFJvdXRlJywgJ3NweW5lLWNoYW5uZWwtcm91dGUnXSwgdGhhdCBicm9hZGNhc3Qgd2luZG93IGxvY2F0aW9uIGNoYW5nZXMgYW5kIGlzIHRoZSBvbmx5IG90aGVyIGNoYW5uZWwgdGhhdCBjYW4gYmUgYm91bmQgdG8gdXNlciBldmVudHM8L2xpPlxuICAgKiA8bGk+TElOS1snU3B5bmVDaGFubmVsV2luZG93JywgJ3NweW5lLWNoYW5uZWwtd2luZG93J10sIHRoYXQgYnJvYWRjYXN0IGFsbCByZXF1ZXN0ZWQgd2luZG93IGFuZCBkb2N1bWVudCBldmVudHMsIHN1Y2ggYXMgc2Nyb2xsaW5nLCByZXNpemluZyBhbmQgbWVkaWEgcXVlcmllczwvbGk+XG4gICAqIDxsaT5MSU5LWydTcHluZUNoYW5uZWxMaWZlY3ljbGUnLCAnc3B5bmUtY2hhbm5lbC1saWZlY3ljbGUnXSwgdGhhdCBicm9hZGNhc3RzIHJlbmRlcmluZyBhbmQgcmVtb3Zpbmcgb2YgVmlld1N0cmVhbSBlbGVtZW50cyB0aGF0IGhhdmUgYmVlbiBkaXJlY3RlZCB0byBicm9hZGNhc3QgdGhlaXIgbGlmZWN5Y2xlIGV2ZW50czwvbGk+XG4gICAqIDwvdWw+XG4gICAqXG4gICAqXG4gICAqIEBtb2R1bGUgU3B5bmVBcHBcbiAgICogQHR5cGUgY29yZVxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ1xuICAgKiBAcHJvcGVydHkge09iamVjdH0gY29uZmlnIC0gPSB7fTsgVGhpcyBnbG9iYWwgY29uZmlnIG9iamVjdCBpcyBtYWlubHkgdXNlZCB0byBwcm92aWRlIGNvbmZpZ3VyYXRpb24gZGV0YWlscyBmb3IgdHdvIFNweW5lQ2hhbm5lbHMsIENIQU5ORUxfUk9VVEUgYW5kIENIQU5ORUxfV0lORE9XLlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uXG4gIH1cblxuICBnZXQgY2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIF9jaGFubmVsc1xuICB9XG5cbiAgaW5pdChjb25maWcgPSB7fSwgdGVzdE1vZGUgPSBmYWxzZSkge1xuICAgIC8vIHRoaXMuY2hhbm5lbHMgPSBuZXcgQ2hhbm5lbHNNYXAoKTtcbiAgICAvKiFcbiAgICAgKiBTcHluZSAwLjIyLjRcbiAgICAgKiBodHRwczovL3NweW5lanMub3JnXG4gICAgICpcbiAgICAgKiBAbGljZW5zZVxuICAgICAqIENvcHlyaWdodCAyMDE3LTIwMjUsIEZyYW5rIEJhdGlzdGEsXG4gICAgICogUmVsZXZhbnQgQ29udGV4dCwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICAgICAqXG4gICAgICogTGljZW5zZWQgdW5kZXIgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgICAqIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICAgKiBBIGNvcHkgb2YgdGhlIExpY2Vuc2UgaXMgbG9jYXRlZCBpbiB0aGUgcHJvamVjdCByb290LCBvciBhdDpcbiAgICAgKiBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xncGwtMy4wLmh0bWxcbiAgICAgKlxuICAgICAqIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IGRpc3RyaWJ1dGlvbi5cbiAgICAgKi9cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG4gICAgaWYoU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSB0cnVlKXtcbiAgICAgIGlmICh0ZXN0TW9kZSl7XG4gICAgICAgIHJldHVybiAnVGhlIFNweW5lIEFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQhJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVGhlIFNweW5lIEFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQhJyk7XG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvL2NvbnN0IGltZ1BhdGggPSBJTUdfUEFUSCB8fCB1bmRlZmluZWQ7XG4gICAgY29uc3QgaW1nUGF0aCA9ICh0eXBlb2YgSU1HX1BBVEggIT09ICd1bmRlZmluZWQnKSA/IElNR19QQVRIIDogdW5kZWZpbmVkO1xuICAgIGxldCBkZWZhdWx0Q29uZmlnID0ge1xuICAgICAgc2Nyb2xsTG9jazogZmFsc2UsXG4gICAgICBzY3JvbGxMb2NrWDogMzEsXG4gICAgICBzY3JvbGxMb2NrWTogMCxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgIHN0cmljdDogZmFsc2UsXG4gICAgICBiYXNlSHJlZjogdW5kZWZpbmVkLFxuICAgICAgSU1HX1BBVEg6IGltZ1BhdGgsXG4gICAgICBwbHVnaW5NZXRob2RzOntcblxuICAgICAgfSxcbiAgICAgIHBsdWdpbnM6e1xuXG4gICAgICB9LFxuICAgICAgdG1wOiB7fSxcbiAgICAgIGVwaGVtZXJhbFByb3BzOiB7fSxcbiAgICAgIHRtcFByb3BzOiB7fSxcbiAgICAgIGNoYW5uZWxzOiB7XG4gICAgICAgIFdJTkRPVzoge1xuICAgICAgICAgIG1lZGlhUXVlcmllczoge1xuXG4gICAgICAgICAgfSxcbiAgICAgICAgICBldmVudHM6IFtdLFxuICAgICAgICAgIGxpc3RlbkZvclJlc2l6ZTogdHJ1ZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JPcmllbnRhdGlvbjogdHJ1ZSxcbiAgICAgICAgICBsaXN0ZW5Gb3JTY3JvbGw6IGZhbHNlLFxuICAgICAgICAgIGxpc3RlbkZvck1vdXNlV2hlZWw6IGZhbHNlLFxuICAgICAgICAgIGxpc3RlbkZvcldoZWVsOiBmYWxzZSxcbiAgICAgICAgICBkZWJvdW5jZU1TVGltZUZvclJlc2l6ZTogMjAwLFxuICAgICAgICAgIGRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsOiAxNTBcbiAgICAgICAgfSxcblxuICAgICAgICBST1VURToge1xuICAgICAgICAgIHR5cGU6ICdzbGFzaCcsXG4gICAgICAgICAgaXNIYXNoOiBmYWxzZSxcbiAgICAgICAgICBpc0hpZGRlbjogZmFsc2UsXG4gICAgICAgICAgYWRkNDA0czogZmFsc2UsXG4gICAgICAgICAgcm91dGVzOiB7XG4gICAgICAgICAgICAncm91dGVQYXRoJyA6IHtcbiAgICAgICAgICAgICAgJ3JvdXRlTmFtZScgOiAnY2hhbmdlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoY29uZmlnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHJvdXRlVXRpbHMgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlO1xuICAgICAgIGNvbmZpZyA9IFNweW5lQXBwUHJvcGVydGllcy5pbml0aWFsaXplKGRlZmF1bHRDb25maWcsIGNvbmZpZywgX2NoYW5uZWxzLCByb3V0ZVV0aWxzKTtcbiAgICAgICAvL2NvbnNvbGUubG9nKFwiU1BZTkUgQVBQIFBST1BTIFwiLFNweW5lQXBwUHJvcGVydGllcyk7XG4gICAgICAvL3dpbmRvdy5TcHluZSA9IHRoaXM7XG4gICAgICAvL3dpbmRvdy5TcHluZVsnY29uZmlnJ10gPSBkZWVwTWVyZ2UoZGVmYXVsdENvbmZpZywgY29uZmlnKVxuICAgIH1cbiAgICB0aGlzLnBsdWdpbnNGbiA9IFNweW5lQXBwUHJvcGVydGllcy5nZXRQbHVnaW5zTWV0aG9kT2JqKGNvbmZpZ1sncGx1Z2luTWV0aG9kcyddKTtcbiAgICB0aGlzLmdldENoYW5uZWxBY3Rpb25zID0gKHN0cikgPT4gX2NoYW5uZWxzLmdldENoYW5uZWxBY3Rpb25zKHN0cik7XG4gICAgdGhpcy5yZWdpc3RlckNoYW5uZWwgPSAodmFsKSA9PiBfY2hhbm5lbHMucmVnaXN0ZXJTdHJlYW0odmFsKTtcbiAgICB0aGlzLnJlZ2lzdGVyUGx1Z2luID0gKHBsdWdpbkluc3RhbmNlKSA9PiBTcHluZUFwcFByb3BlcnRpZXMucmVnaXN0ZXJQbHVnaW4ocGx1Z2luSW5zdGFuY2UpO1xuICAgIHRoaXMucmVnaXN0ZXJEYXRhQ2hhbm5lbCA9IChvYnMkKSA9PiBfY2hhbm5lbHMucmVnaXN0ZXJTdHJlYW0ob2JzJCk7XG4gICAgdGhpcy5saXN0Q2hhbm5lbHMgPSAoKSA9PiBBcnJheS5mcm9tKF9jaGFubmVscy5tYXAua2V5cygpKTtcbiAgICBsZXQgbnVsbEhvbGRlciA9IG5ldyBWaWV3U3RyZWFtKHsgaWQ6J3NweW5lLW51bGwtdmlld3MnIH0pO1xuICAgIG51bGxIb2xkZXIuYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAgbnVsbEhvbGRlci5wcm9wcy5lbC5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6bm9uZTsgb3BhY2l0eTowOyBwb2ludGVyLWV2ZW50czpub25lOyc7XG4gICAgX2NoYW5uZWxzLmluaXQoKTtcblxuICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmRlYnVnPT09dHJ1ZSl7XG4gICAgICAgd2luZG93LlNweW5lID0ge3ZlcnNpb259O1xuICAgIH1cblxuICAgIHNhbml0aXplSFRNTENvbmZpZ3VyZShTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnKTtcbiAgICBzYW5pdGl6ZURhdGFDb25maWd1cmUoU3B5bmVBcHBQcm9wZXJ0aWVzLmNvbmZpZylcblxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgbW9zdGx5IHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0Pkxpc3RpbmcgdGhlIHJlZ2lzdGVyZWVkIENoYW5uZWxzIGluIHRoZSBicm93c2VyIGNvbnNvbGU8L2g0PiddXG4gICAqIFNweW5lQXBwLmxpc3RDaGFubmVscygpO1xuICAgKlxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgY2hhbm5lbHNcbiAgICovXG4gIHN0YXRpYyBsaXN0Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oX2NoYW5uZWxzLm1hcC5rZXlzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byBjaGVjayBpbiB0aGUgY29uc29sZSBvciBpbiB0aGUgY29kZSB3aGF0IGFjdGlvbnMgYXJlIGF2YWlsYWJsZSB0byBiZSBsaXN0ZW5lZCB0by5cbiAgICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7QXJyYXl9IEFuIGFycmF5IG9mIEFjdGlvbnMgdGhhdCBjYW4gYmUgbGlzdGVuZWQgdG9cbiAgICovXG4gIHN0YXRpYyBnZXRDaGFubmVsQWN0aW9ucyhzdHIpIHtcbiAgICByZXR1cm4gX2NoYW5uZWxzLmdldENoYW5uZWxBY3Rpb25zKHN0cik7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBhZGQgdGhlIGNoYW5uZWwgdG8gdGhlIHJlZ2lzdGVyZWQgbGlzdCBzbyB0aGF0IGl0IGNhbiBzdWJzY3JpYmVkIGJ5IGFsbCBWaWV3U3RyZWFtIGFuZCBDaGFubmVsIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHtDaGFubmVsfSBjXG4gICAqXG4gICAqXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJDaGFubmVsKGMpIHtcbiAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmluaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKCdTcHluZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF9jaGFubmVscy5yZWdpc3RlclN0cmVhbShjKTtcbiAgICB9XG4gIH1cbn1cblxuXG5leHBvcnQgbGV0IFNweW5lQXBwID0gbmV3IFNweW5lQXBwbGljYXRpb24oKTtcbiIsImltcG9ydCB7IERvbUVsZW1lbnQgfSBmcm9tICcuL3ZpZXdzL2RvbS1lbGVtZW50LmpzJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi91dGlscy9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcbmltcG9ydCB7IGlzLCBjbG9uZSwgcGF0aFNhdGlzZmllcyB9IGZyb20gJ3JhbWRhJ1xubGV0IF9zcHluZUFwcFByb3BzID0gU3B5bmVBcHBQcm9wZXJ0aWVzXG5leHBvcnQgY2xhc3MgU3B5bmVQbHVnaW4ge1xuICBjb25zdHJ1Y3Rvcihwcm9wcyA9IHt9KSB7XG4gICAgbGV0IHsgbmFtZSwgY29uZmlnLCBwYXJlbnRFbCB9ID0gcHJvcHNcbiAgICB0aGlzLnByb3BzID0gcHJvcHNcblxuICAgIGlmIChjb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnID0gY2xvbmUocHJvcHMpXG4gICAgfVxuXG4gICAgdGhpcy5uYW1lID0gbmFtZSB8fCAnZW1wdHknXG4gICAgdGhpcy5wcm9wcy5uYW1lID0gbmFtZVxuICAgIGNvbmZpZyA9IFNweW5lUGx1Z2luLm1lcmdlRGVmYXVsdENvbmZpZyhjb25maWcsIHRoaXMuZGVmYXVsdENvbmZpZygpKVxuICAgIHRoaXMucHJvcHMucGFyZW50RWwgPSBwYXJlbnRFbCB8fCBTcHluZVBsdWdpbi5jcmVhdGVQYXJlbnRFbCgpXG4gICAgLy8gU3B5bmVQbHVnaW4uZ2V0U3B5bmVBcHAobmFtZSwgY29uZmlnKVxuICAgIHRoaXMucHJvcHMuY29uZmlnID0gY29uZmlnXG4gICAgaWYgKHRoaXMucHJvcHMudHJhaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYWRkVHJhaXRzKHRoaXMucHJvcHMudHJhaXRzKVxuICAgIH1cblxuICAgIC8vIHRoaXMub25CZWZvcmVSZWdpc3RlcmVkKClcbiAgICAvLyB0aGlzLm9uUmVnaXN0ZXJlZCgpXG4gICAgLy8gdGhpcy5vblJlbmRlcigpXG4gIH1cblxuICAvKipcbiAgICogTm93IHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGFwcCBkZWNpZGVzIHRvIHJlZ2lzdGVyIHRoZSBwbHVnaW4uXG4gICAqIFRoaXMgd2F5LCB0aGUgcGx1Z2luIG5vIGxvbmdlciBoYXMgdG8gaW1wb3J0IG9yIHJlbHkgb24gaXRzIG93biB2ZXJzaW9uXG4gICAqIG9mIFNweW5lQXBwUHJvcGVydGllcy4gSW5zdGVhZCwgaXQgaXMgKnBhc3NlZCogdGhlIGF1dGhvcml0YXRpdmUgaW5zdGFuY2UuXG4gICAqL1xuICByZWdpc3RlcihzcHluZUFwcFByb3BzKSB7XG4gICAgLy8gMS4gU2F2ZSBhIHJlZmVyZW5jZSB0byB0aGUgcmVhbCBTcHluZUFwcFByb3BlcnRpZXNcbiAgICBfc3B5bmVBcHBQcm9wcyA9IHNweW5lQXBwUHJvcHNcbiAgICB0aGlzLnByb3BzLnBsdWdpbk5hbWUgPSB0aGlzLnByb3BzLm5hbWVcblxuICAgIC8vIHRoaXMucHJvcHMuY29uZmlnID0gX3NweW5lQXBwUHJvcHMuZ2V0UGx1Z2luQ29uZmlnQnlQbHVnaW5OYW1lKHRoaXMucHJvcHMucGx1Z2luTmFtZSlcblxuICAgIGlmIChfc3B5bmVBcHBQcm9wcy5pbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgU3B5bmUgV2FybmluZzogU3B5bmVBcHAgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldCEgQ2Fubm90IHJlZ2lzdGVyIHBsdWdpbiBcIiR7dGhpcy5uYW1lfVwiLmBcbiAgICAgIClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMub25CZWZvcmVSZWdpc3RlcmVkKClcblxuICAgIC8vIDIuIEFkZCBwbHVnaW4gY29uZmlnIGluIHRoZSByZWFsIFNweW5lQXBwUHJvcGVydGllc1xuICAgIHRoaXMucHJvcHMuY29uZmlnID0gY2xvbmUodGhpcy5wcm9wcy5jb25maWcpXG4gICAgX3NweW5lQXBwUHJvcHMuYWRkUGx1Z2luQ29uZmlnKHRoaXMubmFtZSwgdGhpcy5wcm9wcy5jb25maWcpXG5cbiAgICAvLyBJZiB5b3UgaGF2ZSBwbHVnaW4tbGV2ZWwgbG9naWMgdGhhdCBkZXBlbmRzIG9uIHRoZSByZWFsIHNweW5lQXBwLFxuICAgIC8vIHlvdSBjYW4gYWRkIGl0IGhlcmUsIGUuZy46XG4gICAgLy8gc3B5bmVBcHBQcm9wcy5hZGRQbHVnaW5NZXRob2RzKHRoaXMucHJvcHMuY29uZmlnLnBsdWdpbk1ldGhvZHMpXG5cbiAgICAvLyAzLiBJZiB5b3UgaGF2ZSBvdGhlciBwbHVnaW4gbGlmZWN5Y2xlIG1ldGhvZHNcbiAgICB0aGlzLm9uUmVnaXN0ZXJlZCgpXG4gICAgdGhpcy5vblJlbmRlcigpXG4gIH1cblxuICBnZXQgU3B5bmVBcHBQcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiBfc3B5bmVBcHBQcm9wc1xuICB9XG5cbiAgc3RhdGljIG1lcmdlRGVmYXVsdENvbmZpZyhjb25maWcgPSB7fSwgZGVmYXVsdENvbmZpZyA9IHRoaXMuZGVmYXVsdENvbmZpZygpKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZGVmYXVsdENvbmZpZywgY29uZmlnKVxuICB9XG5cbiAgc3RhdGljIGdldFNweW5lQXBwKG5hbWUsIGNvbmZpZykge1xuICAgIGlmIChfc3B5bmVBcHBQcm9wcy5pbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVW5hYmxlIHRvIGluc3RhbGwgcGx1Z2luLCAke25hbWV9ISBTcHluZUFwcCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhYClcbiAgICAgIC8vIFNweW5lQXBwLmluaXQoKVxuICAgIH0gZWxzZSB7XG4gICAgICBfc3B5bmVBcHBQcm9wcy5hZGRQbHVnaW5Db25maWcobmFtZSwgY29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyB1cGRhdGVTcHluZUNvbmZpZyhzcHluZUFwcCwgcGx1Z2luTmFtZSwgcGx1Z2luQ29uZmlnKSB7XG4gICAgY29uc3QgcGF0aEV4aXN0cyA9IHBhdGhTYXRpc2ZpZXMoaXMoT2JqZWN0KSwgWydjb25maWcnLCAncGx1Z2lucycsIHBsdWdpbk5hbWVdKShzcHluZUFwcClcblxuICAgIGlmIChwYXRoRXhpc3RzID09PSB0cnVlKSB7XG4gICAgICBpZiAoc3B5bmVBcHAuY29uZmlnLmRlYnVnID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIHBsdWdpbiwgJHtwbHVnaW5OYW1lfSwgYWxyZWFkeSBleGlzdHNgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHNweW5lQXBwLmNvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdID0gcGx1Z2luQ29uZmlnXG4gICAgcmV0dXJuIHNweW5lQXBwLmNvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUGFyZW50RWwoZWwpIHtcbiAgICBjb25zdCBjcmVhdGVQbHVnaW5QYXJlbnRFbCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHBsdWdpbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NweW5lLXBsdWdpbnMnKVxuXG4gICAgICBjb25zdCBjcmVhdGVQbHVnaW5FbCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgcGx1Z2luRWwgPSBuZXcgRG9tRWxlbWVudCh7XG4gICAgICAgICAgaWQ6ICdzcHluZS1wbHVnaW5zJ1xuICAgICAgICB9KVxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBsdWdpbkVsLnJlbmRlcigpKVxuICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcHluZS1wbHVnaW5zJylcbiAgICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7bGVmdDowO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7bWluLWhlaWdodDoxMDB2aDt6LWluZGV4OjEwMDAwMDA7IHBvaW50ZXItZXZlbnRzOm5vbmUnXG4gICAgICAgIHJldHVybiBlbFxuICAgICAgfVxuICAgICAgcmV0dXJuIHBsdWdpbkVsIHx8IGNyZWF0ZVBsdWdpbkVsKClcbiAgICB9XG5cbiAgICByZXR1cm4gZWwgfHwgY3JlYXRlUGx1Z2luUGFyZW50RWwoKVxuICB9XG5cbiAgYWRkVHJhaXRzKHRyYWl0cykge1xuICAgIGlmICh0cmFpdHMuY29uc3RydWN0b3IubmFtZSAhPT0gJ0FycmF5Jykge1xuICAgICAgdHJhaXRzID0gW3RyYWl0c11cbiAgICB9XG4gICAgY29uc3QgYWRkVHJhaXQgPSAoVHJhaXRDbGFzcykgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBUcmFpdENsYXNzKHRoaXMpXG4gICAgfVxuXG4gICAgdHJhaXRzLmZvckVhY2goYWRkVHJhaXQpXG4gIH1cblxuICBvbkJlZm9yZVJlZ2lzdGVyZWQoKSB7XG4gICAgLy8gdGhpcy5wcm9wcy5wbHVnaW5OYW1lID0gdGhpcy5wcm9wcy5uYW1lXG4gICAgLy8gdGhpcy5wcm9wcy5jb25maWcgPSBfc3B5bmVBcHBQcm9wcy5nZXRQbHVnaW5Db25maWdCeVBsdWdpbk5hbWUodGhpcy5wcm9wcy5wbHVnaW5OYW1lKVxuICAgIHRoaXMuY2hlY2tGb3JSZXF1aXJlZFdpbmRvd0V2ZW50KClcbiAgfVxuXG4gIGNoZWNrRm9yUmVxdWlyZWRXaW5kb3dFdmVudCgpIHtcbiAgICBjb25zdCByZXF1aXJlZEV2ZW50cyA9IHRoaXMucHJvcHMucmVxdWlyZWRFdmVudHMgPz8gW11cbiAgICBjb25zdCB3aW5kb3dDb25maWcgPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0Q2hhbm5lbENvbmZpZygnV0lORE9XJylcblxuICAgIGNvbnN0IG1pc3NpbmdFdmVudHMgPSByZXF1aXJlZEV2ZW50cy5maWx0ZXIoZXZ0ID0+ICF3aW5kb3dDb25maWcuZXZlbnRzLmluY2x1ZGVzKGV2dCkpXG5cbiAgICAvLyBJZiBhbnkgYXJlIG1pc3NpbmcsIGxvZyBhIHNpbmdsZSB3YXJuaW5nIGxpc3RpbmcgdGhlbVxuICAgIGlmIChtaXNzaW5nRXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgcGx1Z2luIFwiJHt0aGlzLnByb3BzLm5hbWV9XCIgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBjb25maWcuV0lORE9XLmV2ZW50cywgLS0+ICR7bWlzc2luZ0V2ZW50cy5qb2luKCcsICcpfSA8LS1gXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgZGVmYXVsdENvbmZpZygpIHtcbiAgICByZXR1cm4ge1xuXG4gICAgfVxuICB9XG5cbiAgb25SZWdpc3RlcmVkKCkge1xuXG4gIH1cblxuICBvblJlbmRlcigpIHtcblxuICB9XG59XG4iLCJpbXBvcnQgeyBmcm9tIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGZsYXRNYXAsIG1hcCwgcHVibGlzaCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgeyBjb21wb3NlLCBwcm9wLCBkZWZhdWx0VG8sIG92ZXIsIGxlbnNQcm9wLCBoYXMsIHByb3BFcSwgd2hlbiwgcHJvcElzLCBhbGxQYXNzLCBhc3NvYywgcGljaywgbWVyZ2VEZWVwUmlnaHQgfSBmcm9tICdyYW1kYSdcbmltcG9ydCBzYW5pdGl6ZURhdGEsIHsgc2V0U2FuaXRpemVEYXRhRm9yY2VTdHJpY3QgfSBmcm9tICcuL3Nhbml0aXplLWRhdGEuanMnXG5cbmV4cG9ydCBjbGFzcyBDaGFubmVsRmV0Y2hVdGlsIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgQ2hhbm5lbEZldGNoVXRpbFxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIFRoaXMgaXMgdGhlIGNvcmUgb2JqZWN0IHVzZWQgZm9yIENoYW5uZWxGZXRjaC4gVGhpcyB1dGlsaXR5IHdyYXBzIHRoZSBqYXZhc2NyaXB0IGZldGNoIGFwaSBpbnRvIGFuIG9ic2VydmFibGUuXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBQcm9wZXJ0aWVzIHVzZWQgdG8gY3JlYXRlIHRoZSBmZXRjaCByZXF1ZXN0XG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1YnNjcmliZXIgQSBtZXRob2QgYXNzaWduZWQgdG8gbGlzdGVuIHRvIHRoZSByZXN1bHRcbiAgICogQHBhcmFtIHtCb29sZWFufSB0ZXN0TW9kZSBDb250cm9scyB0aGUgaW5pdGlhbGl6dGlvbiBmb3IgdW5pdCB0ZXN0c1xuICAgKlxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy51cmwgLSA9IHVuZGVmaW5lZDsgVGhlIHVybCB1c2VkIGZvciB0aGUgcmVxdWVzdFxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy5zZXJ2ZXJPcHRpb25zIC0gPSB1bmRlZmluZWQ7IFRoZSBwcm9wZXJ0aWVzLCBoZWFkZXIsIGJvZHksIG1vZGUsIG1ldGhvZCwgZm9yIHRoZSByZXF1ZXN0XG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBvcHRpb25zLm1hcEZuIC0gPSB1bmRlZmluZWQ7IEEgbWV0aG9kIHRoYXQgY2FuIGJlIHVzZWQgdG8gcGFyc2UgdGhlIGRhdGEgYmVmb3JlIGl0J3MgcmV0dXJuZWRcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMucmVzcG9uc2VUeXBlIC0gPSAnanNvbic7IERlZmF1bHQgaXMganNvblxuICAgKiBAcHJvcGVydHkge09iamVjdH0gb3B0aW9ucy5kZWJ1ZyAtID0gZmFsc2U7IHdpbGwgdHJhY2UgdGhlIGZldGNoIHJlc3BvbnNlIHRvIHRoZSBjb25zb2xlIGJlZm9yIHRoZSBvYnNlcnZhYmxlIGNvbXBsZXRlc1xuICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBTdWJzY3JpYmVyIC0gPSB1bmRlZmluZWQ7IHRoZSBtZXRob2QgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBmZXRjaCBpcyBjb21wbGV0ZS5cbiAgICogQHByb3BlcnR5IHtCb29sZWFufSB0ZXN0TW9kZSAtID0gZmFsc2U7IFVzZWQgZm9yIHVuaXQgdGVzdGluZy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGZldGNoZWQgcmVzcG9uc2UgcGFyc2VkIGJ5IHRoZSBzZXQgcGFyYW1ldGVycy5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5Vc2luZyBDaGFubmVsRmV0Y2hVdGlsIHRvIFJldHJpZXZlIGFuIEltYWdlPC9oND4nXVxuICAgKlxuICAgKiAgIGNvbnN0IHVybCA9IFwiL3N0YXRpYy9pbWFnZXMvbXlpbWFnZS5qcGdcIjtcbiAgICogICBjb25zdCByZXNwb25zZVR5cGUgPSBcImJsb2JcIjtcbiAgICogICBjb25zdCBvbkltZ0Jsb2JSZXR1cm5lZCA9IChibG9iKT0+e1xuICAgKiAgICAgICAgbGV0IGJsb2JVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgKiAgICAgICAgdGhpcy5hcHBlbmRWaWV3KFxuICAgKiAgICAgICAgICAgIG5ldyBWaWV3U3RyZWFtKHtcbiAgICogICAgICAgICAgICAgIHRhZ05hbWU6ICdpbWcnLFxuICAgKiAgICAgICAgICAgICAgc3JjOiBibG9iVXJsLFxuICAgKiAgICAgICAgICAgICAgd2lkdGg6MzAwXG4gICAqICAgICAgICAgICAgfSlcbiAgICogICAgICAgICAgICl9XG4gICAqXG4gICAqICAgbmV3IENoYW5uZWxGZXRjaFV0aWwoe3VybCwgcmVzcG9uc2VUeXBlfSwgb25JbWdCbG9iUmV0dXJuZWQpO1xuICAgKlxuICAgKlxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zLCBzdWJzY3JpYmVyLCB0ZXN0TW9kZSwgQ0hBTk5FTF9OQU1FKSB7XG4gICAgc2V0U2FuaXRpemVEYXRhRm9yY2VTdHJpY3QodHJ1ZSlcblxuICAgIGNvbnN0IHRlc3RTdWJzY3JpYmVyID0gKHApID0+IGNvbnNvbGUubG9nKCdGRVRDSCBSRVRVUk5FRCAnLCBwKVxuXG4gICAgdGhpcy5fbWFwRm4gPSBDaGFubmVsRmV0Y2hVdGlsLnNldE1hcEZuKG9wdGlvbnMpXG4gICAgdGhpcy5fdXJsID0gQ2hhbm5lbEZldGNoVXRpbC5zZXRVcmwob3B0aW9ucylcbiAgICB0aGlzLl9yZXNwb25zZVR5cGUgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFJlc3BvbnNlVHlwZShvcHRpb25zKVxuICAgIHRoaXMuX3NlcnZlck9wdGlvbnMgPSBDaGFubmVsRmV0Y2hVdGlsLnNldFNlcnZlck9wdGlvbnMob3B0aW9ucylcbiAgICB0aGlzLl9zdWJzY3JpYmVyID0gc3Vic2NyaWJlciAhPT0gdW5kZWZpbmVkID8gc3Vic2NyaWJlciA6IHRlc3RTdWJzY3JpYmVyXG4gICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWcgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVidWcgOiBmYWxzZVxuICAgIHRoaXMuY2hhbm5lbE5hbWUgPSBDSEFOTkVMX05BTUVcblxuICAgIGNvbnN0IGZldGNoUHJvcHMgPSB7XG4gICAgICBtYXBGbjogdGhpcy5tYXBGbixcbiAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICBzZXJ2ZXJPcHRpb25zOiB0aGlzLnNlcnZlck9wdGlvbnMsXG4gICAgICByZXNwb25zZVR5cGU6IHRoaXMucmVzcG9uc2VUeXBlLFxuICAgICAgZGVidWc6IHRoaXMuZGVidWdcbiAgICB9XG4gICAgaWYgKHRlc3RNb2RlICE9PSB0cnVlKSB7XG4gICAgICBDaGFubmVsRmV0Y2hVdGlsLnN0YXJ0V2luZG93RmV0Y2goZmV0Y2hQcm9wcywgdGhpcy5fc3Vic2NyaWJlciwgdGhpcy5jaGFubmVsTmFtZSlcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgc3RhcnRXaW5kb3dGZXRjaChwcm9wcywgc3Vic2NyaWJlciwgY2hhbm5lbE5hbWUpIHtcbiAgICBjb25zdCB7IG1hcEZuLCB1cmwsIHNlcnZlck9wdGlvbnMsIHJlc3BvbnNlVHlwZSwgZGVidWcgfSA9IHByb3BzXG4gICAgY29uc3QgdGFwTG9nRGVidWcgPSBwID0+IGNvbnNvbGUubG9nKCdERUJVRyBGRVRDSCA6JywgcCwgeyB1cmwsIHNlcnZlck9wdGlvbnMsIHJlc3BvbnNlVHlwZSwgY2hhbm5lbE5hbWUgfSlcbiAgICBjb25zdCB0YXBMb2cgPSBkZWJ1ZyA9PT0gdHJ1ZSA/IHRhcExvZ0RlYnVnIDogKCkgPT4ge31cblxuICAgIGNvbnN0IG1hcFdyYXBwZXIgPSAobWFwTWV0aG9kKSA9PiB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IHsgY2hhbm5lbE5hbWUsIHVybCwgcmVzcG9uc2VUeXBlLCBzZXJ2ZXJPcHRpb25zIH1cblxuICAgICAgcmV0dXJuIChkYXRhKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpc2FibGVTYW5pdGl6ZSA9IHByb3BzPy5kaXNhYmxlU2FuaXRpemUgPT09IHRydWVcblxuICAgICAgICBpZiAoZGlzYWJsZVNhbml0aXplKSB7XG4gICAgICAgICAgY29uc3QgZW52ID0gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBwcm9jZXNzLmVudi5OT0RFX0VOVilcbiAgICAgICAgICAgID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlZcbiAgICAgICAgICAgIDogJ2RldmVsb3BtZW50J1xuXG4gICAgICAgICAgY29uc3QgbXNnID0gYFNQWU5FIFNFQ1VSSVRZIFdBUk5JTkcg4oCUIFNhbml0aXphdGlvbiBkaXNhYmxlZCBmb3IgZmV0Y2ggZnJvbSAke3VybH0uIERhdGEgd2lsbCBlbnRlciB0aGUgcmVhY3RpdmUgc3RyZWFtIHVuc2FuaXRpemVkLiBPbmx5IHVzZSBkaXNhYmxlU2FuaXRpemU9dHJ1ZSBmb3IgdHJ1c3RlZCBvciBjb250cm9sbGVkIHNvdXJjZXMuYFxuXG4gICAgICAgICAgaWYgKGVudiA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNweW5lSlMgc2VjdXJpdHkgcG9saWN5IHZpb2xhdGlvbjogZGlzYWJsZVNhbml0aXplPXRydWUgaXMgbm90IGFsbG93ZWQgaW4gcHJvZHVjdGlvbiAoJHt1cmx9KS5gKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGAlYyR7bXNnfWAsXG4gICAgICAgICAgICAgICdjb2xvcjojZjMzO2ZvbnQtd2VpZ2h0OmJvbGQ7J1xuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNhbml0aXplZERhdGEgPSBkaXNhYmxlU2FuaXRpemUgPyBkYXRhIDogc2FuaXRpemVEYXRhKGRhdGEpXG4gICAgICAgIHJldHVybiBtYXBNZXRob2Qoc2FuaXRpemVkRGF0YSwgbWV0YWRhdGEpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uc29sZS5sb2coJ1NFUlZFUiBPUFRJT05TICcsIHsgcHJvcHMsIHNlcnZlck9wdGlvbnMgfSlcblxuICAgIGNvbnN0IHJlc3BvbnNlJCA9IGZyb20od2luZG93LmZldGNoKHVybCwgc2VydmVyT3B0aW9ucykpXG4gICAgICAucGlwZSh0YXAodGFwTG9nKSwgZmxhdE1hcChyID0+IGZyb20ocltyZXNwb25zZVR5cGVdKCkpKSxcbiAgICAgICAgbWFwKG1hcFdyYXBwZXIobWFwRm4pKSxcbiAgICAgICAgcHVibGlzaCgpKVxuXG4gICAgcmVzcG9uc2UkLmNvbm5lY3QoKVxuXG4gICAgcmVzcG9uc2UkLnN1YnNjcmliZShzdWJzY3JpYmVyKVxuICB9XG5cbiAgc3RhdGljIHNldE1hcEZuKG9wdHMpIHtcbiAgICBjb25zdCBnZXRGbiA9IGNvbXBvc2UoZGVmYXVsdFRvKChwKSA9PiBwKSwgcHJvcCgnbWFwRm4nKSlcbiAgICByZXR1cm4gZ2V0Rm4ob3B0cylcbiAgfVxuXG4gIHN0YXRpYyBzZXRVcmwob3B0cykge1xuICAgIGNvbnN0IHVybCA9IHByb3AoJ3VybCcsIG9wdHMpXG4gICAgaWYgKHVybCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1NQWU5FIFdBUk5JTkc6IFVSTCBpcyB1bmRlZmluZWQgZm9yIGRhdGEgY2hhbm5lbCcpXG4gICAgfVxuICAgIHJldHVybiB1cmxcbiAgfVxuXG4gIHN0YXRpYyBzZXRSZXNwb25zZVR5cGUob3B0cykge1xuICAgIHJldHVybiBkZWZhdWx0VG8oJ2pzb24nLCBwcm9wKCdyZXNwb25zZVR5cGUnLCBvcHRzKSlcbiAgfVxuXG4gIGdldCBtYXBGbigpIHtcbiAgICByZXR1cm4gdGhpcy5fbWFwRm5cbiAgfVxuXG4gIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybFxuICB9XG5cbiAgZ2V0IHNlcnZlck9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlcnZlck9wdGlvbnNcbiAgfVxuXG4gIGdldCByZXNwb25zZVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3BvbnNlVHlwZVxuICB9XG5cbiAgc3RhdGljIHN0cmluZ2lmeUJvZHlJZkl0RXhpc3RzKG9iaikge1xuICAgIGNvbnN0IGNvbnZlcnRUb0pTT04gPSB3aGVuKHByb3BJcyhPYmplY3QsICdib2R5JyksIGNvbXBvc2Uob3ZlcihsZW5zUHJvcCgnYm9keScpLCBKU09OLnN0cmluZ2lmeSkpKVxuXG4gICAgcmV0dXJuIGNvbnZlcnRUb0pTT04ob2JqKVxuICB9XG5cbiAgc3RhdGljIHVwZGF0ZU1ldGhvZFdoZW5Cb2R5RXhpc3RzKG9wdHMpIHtcbiAgICBjb25zdCBoYXNCb2R5ID0gaGFzKCdib2R5JylcbiAgICBjb25zdCBtZXRob2RJc0dldCA9IHByb3BFcSgnR0VUJywgJ21ldGhvZCcpXG4gICAgY29uc3QgcHJlZCA9IGFsbFBhc3MoW2hhc0JvZHksIG1ldGhvZElzR2V0XSlcbiAgICByZXR1cm4gd2hlbihwcmVkLCBhc3NvYygnbWV0aG9kJywgJ1BPU1QnKSkob3B0cylcbiAgfVxuXG4gIHN0YXRpYyBzZXRTZXJ2ZXJPcHRpb25zKG9wdHMpIHtcbiAgICBjb25zdCBvcHRpb25zID0gcGljayhbXG4gICAgICAnbWV0aG9kJyxcbiAgICAgICdoZWFkZXJzJyxcbiAgICAgICdib2R5JyxcbiAgICAgICdtb2RlJyxcbiAgICAgICdjcmVkZW50aWFscycsXG4gICAgICAnY2FjaGUnLFxuICAgICAgJ3JlZGlyZWN0JyxcbiAgICAgICdyZWZlcnJlcicsXG4gICAgICAncmVmZXJyZXJQb2xpY3knLFxuICAgICAgJ2ludGVncml0eScsXG4gICAgICAna2VlcGFsaXZlJ1xuICAgIF0sIG9wdHMpXG4gICAgbGV0IG1lcmdlZE9wdGlvbnMgPSBtZXJnZURlZXBSaWdodChDaGFubmVsRmV0Y2hVdGlsLmJhc2VPcHRpb25zKCksIG9wdGlvbnMpXG4gICAgbWVyZ2VkT3B0aW9ucyA9IENoYW5uZWxGZXRjaFV0aWwudXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMobWVyZ2VkT3B0aW9ucylcbiAgICBtZXJnZWRPcHRpb25zID0gQ2hhbm5lbEZldGNoVXRpbC5zdHJpbmdpZnlCb2R5SWZJdEV4aXN0cyhtZXJnZWRPcHRpb25zKVxuICAgIHJldHVybiBtZXJnZWRPcHRpb25zXG4gIH1cblxuICBzdGF0aWMgYmFzZU9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1ldGhvZDogJ0dFVCcsIC8vIERlZmF1bHQgbWV0aG9kXG4gICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKidcbiAgICAgIH0pLFxuICAgICAgbW9kZTogJ2NvcnMnLCAvLyBEZWZhdWx0IG1vZGVcbiAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLCAvLyBEZWZhdWx0IGNyZWRlbnRpYWxzIHBvbGljeVxuICAgICAgY2FjaGU6ICdkZWZhdWx0JywgLy8gRGVmYXVsdCBjYWNoZSBwb2xpY3lcbiAgICAgIHJlZGlyZWN0OiAnZm9sbG93JywgLy8gRGVmYXVsdCByZWRpcmVjdCBwb2xpY3lcbiAgICAgIHJlZmVycmVyOiAnY2xpZW50JywgLy8gRGVmYXVsdCByZWZlcnJlciBwb2xpY3lcbiAgICAgIHJlZmVycmVyUG9saWN5OiAnbm8tcmVmZXJyZXItd2hlbi1kb3duZ3JhZGUnLCAvLyBEZWZhdWx0IHJlZmVycmVyIHBvbGljeVxuICAgICAgaW50ZWdyaXR5OiAnJywgLy8gRGVmYXVsdCBpbnRlZ3JpdHlcbiAgICAgIGtlZXBhbGl2ZTogZmFsc2UgLy8gRGVmYXVsdCBrZWVwYWxpdmVcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGlzLFxuICByZWplY3QsXG4gIGlzTmlsLFxuICBmaW5kLFxuICBhbGxQYXNzLFxuICBmb3JFYWNoT2JqSW5kZXhlZCxcbiAgbm90LFxuICBpc0VtcHR5LFxuICBhbHdheXMsXG4gIGNvbXBvc2UsXG4gIGVxdWFscyxcbiAgcHJvcCxcbiAgd2hlcmUsXG4gIGRlZmF1bHRUbyxcbiAgbWVyZ2VBbGwsXG4gIEYsXG4gIG9taXQsXG4gIGZsYXR0ZW4sXG4gIGFueSxcbiAgY3VycnksXG4gIGx0ZVxuICAsIG1hcCBhcyByTWFwXG59IGZyb20gJ3JhbWRhJ1xuXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5jb25zdCBpc05vdEFyciA9IGNvbXBvc2Uobm90LCBpcyhBcnJheSkpXG5jb25zdCBpc05vdEVtcHR5ID0gY29tcG9zZShub3QsIGlzRW1wdHkpXG5jb25zdCBpc05vbkVtcHR5U3RyID0gYWxsUGFzcyhbaXMoU3RyaW5nKSwgaXNOb3RFbXB0eV0pXG5jb25zdCBpc05vbkVtcHR5QXJyID0gYWxsUGFzcyhbaXMoQXJyYXkpLCBpc05vdEVtcHR5XSlcbmNvbnN0IGlzT2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90QXJyLCBpcyhPYmplY3QpXSkpXG5jb25zdCBpc05vbkVtcHR5T2JqZWN0Rm4gPSBjb21wb3NlKGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90QXJyLCBpcyhPYmplY3QpXSkpXG5cbmNvbnN0IGlzU3RyaW5nICA9ICh2YWwpID0+IGlzKFN0cmluZywgdmFsKVxuY29uc3QgaXNCb29sZWFuID0gKHZhbCkgPT4gaXMoQm9vbGVhbiwgdmFsKVxuY29uc3QgaXNOdW1iZXIgID0gKHZhbCkgPT4gaXMoTnVtYmVyLCB2YWwpXG5jb25zdCBpc0FycmF5Rm4gPSAodmFsKSA9PiBpcyhBcnJheSwgdmFsKVxuXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFBheWxvYWRGaWx0ZXIge1xuICAvKipcbiAgICogQG1vZHVsZSBDaGFubmVsUGF5bG9hZEZpbHRlclxuICAgKiBAdHlwZSB1dGlsXG4gICAqXG4gICAqXG4gICAqIEBkZXNjXG4gICAqIDxwPlRoaXMgdXRpbGl0eSBmaWx0ZXJzIENoYW5uZWxQYXlsb2FkIG9iamVjdHMgYnkgdXNpbmcgcXVlcnkgc2VsZWN0b3JzIGFuZC9vciBieSBjb21wYXJpbmcgZGF0YSBwcm9wZXJ0aWVzPC9wPlxuICAgKiA8aDM+VGhlIENoYW5uZWxQYXlsb2FkRmlsdGVyIGZlYXR1cmVzPC9oMz5cbiAgICogPHVsPlxuICAgKiAgIDxsaT5DYW4gYmUgdXNlZCBieSBDaGFubmVscyBhbmQgVmlld1N0cmVhbXM8L2xpPlxuICAgKiAgIDxsaT5DaGFubmVsUGF5bG9hZEZpbHRlciBpbnN0YW5jZXMgY2FuIGJlIHVzZWQgYXMgdGhlIHRoaXJkIHBhcmFtZXRlciB3aGVuIGJpbmRpbmcgYWN0aW9ucyB0byBWaWV3U3RyZWFtIG1ldGhvZHMuPC9saT5cbiAgICogICA8bGk+U2VsZWN0b3JzIGNhbiBiZSBhIHF1ZXJ5IHN0cmluZywgYW4gYXJyYXkgb2Ygc2VsZWN0b3Igc3RyaW5ncywgb3IgdGhlIHNlbGVjdG9yIGNhbiBiZSBhbiBhY3R1YWwgZG9tIGVsZW1lbnQuPC9saT5cbiAgICogICA8bGk+U2VsZWN0b3JzIGFyZSBub3QgcmVxdWlyZWQgYW5kIGNhbiBiZSBkaXNyZWdhcmRlZCBieSBhZGRpbmcgXCJcIiBvciB1bmRlZmluZWQgYXMgdGhlIHNlbGVjdG9yIHByb3BlcnR5LjwvbGk+XG4gICAqICAgPGxpPlRoZSBkYXRhIG9iamVjdCBjb21wYXJlcyB0aGUgdmFsdWVzIGZyb20gdGhlIHByb3BzKCkgbWV0aG9kIG9mIGEgQ2hhbm5lbFBheWxvYWQgb2JqZWN0PC9saT5cbiAgICogICA8bGk+SW50ZXJuYWxseSwgVGhlIGRhdGEgb2JqZWN0IGlzIGNvbmZvcm1lZCB0byBhIHNwZWMgb2JqZWN0IGZvciByYW1kYSZyc3F1bztzIEVYVFsnd2hlcmUnLCAnLy9yYW1kYWpzLmNvbS9kb2NzLyN3aGVyZSddIG1ldGhvZDwvbGk+XG4gICAqICAgPC91bD5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfEFycmF5fEhUTUxFbGVtZW50fSBzZWxlY3RvciBUaGUgbWF0Y2hpbmcgZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gZmlsdGVycyBPYmplY3QgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0b3IsIHByb3BzLCBhbmQgZGVidWdMYWJlbCBwYXJhbXMuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wRmlsdGVycyBBIGpzb24gb2JqZWN0IGNvbnRhaW5pbmcgZmlsdGVyaW5nIG1ldGhvZHMgZm9yIGNoYW5uZWwgcHJvcHMgdmFyaWFibGVzLlxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ3xBcnJheXxIVE1MRWxlbWVudH0gc2VsZWN0b3IgLSA9ICcnOyBUaGUgbWF0Y2hpbmcgZWxlbWVudC5cbiAgICogQHByb3BlcnR5IHtPYmplY3R9IHByb3BGaWx0ZXJzIC0gPSB7fTsgQSBqc29uIG9iamVjdCBjb250YWluaW5nIGNvbXByYXRvcnMgZm9yIGFueSBleHBlY3RlZCBwcm9wZXJ0eSB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIEJvb2xlYW5cbiAgICpcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogVElUTEVbJzxoND5GaWx0ZXJpbmcgdXNpbmcgU2VsZWN0b3JzIGFuZCBhIFByb3BlcnR5IENvbXBhcmF0b3IgV2l0aGluIGEgVmlld1N0cmVhbSBJbnN0YW5jZTwvaDQ+J11cbiAgICogICAgY29uc3QgbXlTZWxlY3RvcnMgPSBbJ3VsJywgJ2xpOmZpcnN0LWNoaWxkJ107XG4gICAqICAgIGNvbnN0IHByb3BGaWx0ZXJzID0ge1xuICAgKiAgICAgIGxpbmtUeXBlOiBcImV4dGVybmFsXCJcbiAgICogICAgfTtcbiAgICogICAgY29uc3QgbXlGaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIobXlTZWxlY3RvcnMsIHByb3BGaWx0ZXJzKTtcbiAgICpcbiAgICogICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgIHJldHVybiBbXG4gICAqICAgICAgICAgICAgICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCBteUZpbHRlcl1cbiAgICogICAgICAgICAgICAgXVxuICAgKiAgICAgICAgICB9XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+RmlsdGVyaW5nIFVzaW5nIE1ldGhvZCBhbmQgU3RyaW5nIENvbXBhcmF0b3JzIFdpdGhpbiBhIFZpZXdTdHJlYW0gSW5zdGFuY2U8L2g0PiddXG4gICAqICAgIGNvbnN0IHByb3BGaWx0ZXJzID0ge1xuICAgKiAgICAgIHR5cGU6IFwic2Nyb2xsaW5nLWVsZW1lbnRcIixcbiAgICogICAgICBzY3JvbGxOdW06ICAobik9Pm4+PTEyMDAgJiYgbjw9NTAwMDtcbiAgICogICAgfTtcbiAgICogICAgY29uc3QgbXlGaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIoJycsIHByb3BGaWx0ZXJzKTtcbiAgICpcbiAgICogICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgIHJldHVybiBbXG4gICAqICAgICAgICAgICAgICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCBteUZpbHRlcl1cbiAgICogICAgICAgICAgICAgXVxuICAgKiAgICAgICAgICB9XG4gICAqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIFRJVExFWyc8aDQ+QSBTaW1wbGUgUHJvcGVydHkgRmlsdGVyaW5nIEV4YW1wbGUgV2l0aGluIGEgQ2hhbm5lbCBJbnN0YW5jZTwvaDQ+J11cbiAgICogLy8gRmlsdGVyIGZvciBhIGJ1dHRvbiB3aXRoIGEgZGF0YSB0eXBlIG9mICdsaW5rJ1xuICAgKiBjb25zdCBteUZpbHRlciA9IG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcignJyB7dHlwZTogXCJsaW5rXCJ9KTtcbiAgICpcbiAgICogdGhpcy5nZXRDaGFubmVsKFwiQ0hBTk5FTF9VSVwiKVxuICAgKiAucGlwZShmaWx0ZXIobXlGaWx0ZXIpKVxuICAgKiAuc3Vic2NyaWJlKG15Q2hhbm5lbE1ldGhvZCk7XG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzZWxlY3RvciwgZmlsdGVycyA9IHt9LCBkZWJ1Z0xhYmVsLCB0ZXN0TW9kZSkge1xuICAgIGNvbnN0IHNlbGVjdG9ySXNPYmogPSBpc09iamVjdEZuKHNlbGVjdG9yKVxuXG4gICAgaWYgKHNlbGVjdG9ySXNPYmopIHtcbiAgICAgIGZpbHRlcnMgPSBzZWxlY3RvclxuICAgICAgc2VsZWN0b3IgPSBwcm9wKCdzZWxlY3RvcicsIGZpbHRlcnMpXG4gICAgICB0ZXN0TW9kZSA9IHRlc3RNb2RlIHx8IHByb3AoJ3Rlc3RNb2RlJywgZmlsdGVycylcbiAgICB9XG5cbiAgICBjb25zdCBkZWJ1Z0xhYmVsQXJyID0gW2RlYnVnTGFiZWwsIHByb3AoJ2RlYnVnTGFiZWwnLCBmaWx0ZXJzKV1cblxuICAgIGRlYnVnTGFiZWwgPSBjb21wb3NlKGZpbmQoaXMoU3RyaW5nKSkpKGRlYnVnTGFiZWxBcnIpXG5cbiAgICBsZXQgcHJvcHMgPSBvbWl0KFsnZGVidWdMYWJlbCcsICdsYWJlbCcsICdzZWxlY3RvcicsICdwcm9wcycsICd0ZXN0TW9kZScsICdwcm9wRmlsdGVycyddLCBmaWx0ZXJzKVxuICAgIGlmIChmaWx0ZXJzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHByb3BzID0gbWVyZ2VBbGwoW2ZpbHRlcnMucHJvcHMsIHByb3BzXSlcbiAgICB9IGVsc2UgaWYgKGZpbHRlcnMucHJvcEZpbHRlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcHJvcHMgPSBtZXJnZUFsbChbZmlsdGVycy5wcm9wRmlsdGVycywgcHJvcHNdKVxuICAgIH1cblxuICAgIGZpbHRlcnMucHJvcEZpbHRlcnMgPSBwcm9wc1xuXG4gICAgY29uc3QgeyBwcm9wRmlsdGVycyB9ID0gZmlsdGVyc1xuXG4gICAgY29uc3QgYWRkU3RyaW5nU2VsZWN0b3JGaWx0ZXIgPSAgaXNOb25FbXB0eVN0cihzZWxlY3RvcikgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJTZWxlY3Rvcihbc2VsZWN0b3JdLCBkZWJ1Z0xhYmVsKSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IGFkZEFycmF5U2VsZWN0b3JGaWx0ZXIgPSAgIGlzTm9uRW1wdHlBcnIoc2VsZWN0b3IpID8gQ2hhbm5lbFBheWxvYWRGaWx0ZXIuZmlsdGVyU2VsZWN0b3Ioc2VsZWN0b3IsIGRlYnVnTGFiZWwpIDogdW5kZWZpbmVkXG4gICAgY29uc3QgYWRkRGF0YUZpbHRlciA9IGlzTm9uRW1wdHlPYmplY3RGbihwcm9wRmlsdGVycykgPyBDaGFubmVsUGF5bG9hZEZpbHRlci5maWx0ZXJEYXRhKHByb3BGaWx0ZXJzLCBkZWJ1Z0xhYmVsKSA6IHVuZGVmaW5lZFxuXG4gICAgbGV0IGZpbHRlcnNBcnIgPSByZWplY3QoaXNOaWwsIFthZGRTdHJpbmdTZWxlY3RvckZpbHRlciwgYWRkQXJyYXlTZWxlY3RvckZpbHRlciwgYWRkRGF0YUZpbHRlcl0pXG5cbiAgICAvLyBJRiBBUlJBWSBJUyBFTVBUWSBBTFdBWVMgUkVUVVJOIEZBTFNFO1xuXG4gICAgY29uc3QgZmlsdGVyc0FyZUVtcHR5ID0gaXNFbXB0eShmaWx0ZXJzQXJyKVxuXG4gICAgaWYgKGZpbHRlcnNBcmVFbXB0eSkge1xuICAgICAgZmlsdGVyc0FyciA9IFthbHdheXMoZmFsc2UpXVxuICAgICAgaWYgKFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZSAmJiB0ZXN0TW9kZSAhPT0gdHJ1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBDaGFubmVsIEZpbHRlciwgd2l0aCBzZWxlY3RvcjogJHtzZWxlY3Rvcn0sIGFuZCBwcm9wRmlsdGVyczoke3Byb3BGaWx0ZXJzfSBhcHBlYXJzIHRvIGJlIGVtcHR5IWApXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0ZXN0TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuIHsgc2VsZWN0b3IsIHByb3BGaWx0ZXJzLCBkZWJ1Z0xhYmVsLCBmaWx0ZXJzLCB0ZXN0TW9kZSwgZmlsdGVyc0FyZUVtcHR5IH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUGFzcyhmaWx0ZXJzQXJyKVxuICB9XG5cbiAgc3RhdGljIGZpbHRlckRhdGEoZmlsdGVySnNvbiwgZmlsdGVyZGVidWdMYWJlbCkge1xuICAgIGNvbnN0IGRlYnVnTGFiZWwgPSBmaWx0ZXJkZWJ1Z0xhYmVsXG5cbiAgICBjb25zdCBjb21wYXJlRGF0YSA9ICgpID0+IHtcbiAgICAgIC8vIERPIE5PVCBBTExPVyBBTiBFTVBUWSBPQkpFQ1QgVE8gUkVUVVJOIFRSVUVzXG4gICAgICBpZiAoaXNFbXB0eShmaWx0ZXJKc29uKSkge1xuICAgICAgICByZXR1cm4gYWx3YXlzKGZhbHNlKVxuICAgICAgfVxuXG4gICAgICAvLyAgQ0hFQ0tTIEFMTCBWQUxVRVMgSU4gSlNPTiBUTyBERVRFUk1JTkUgSUYgVEhFUkUgQVJFIEZJTFRFUklORyBNRVRIT0RTXG5cbiAgICAgIGNvbnN0IGNyZWF0ZUN1cnJ5Q29tcGFyYXRvciA9IGNvbXBhcmVTdHIgPT4gKHN0cikgPT4ge1xuICAgICAgICByZXR1cm4gc3RyID09PSBjb21wYXJlU3RyXG4gICAgICB9XG4gICAgICBjb25zdCBjaGVja1RvQ29udmVydFRvRm4gPSAodmFsLCBrZXksIG9iaikgPT4ge1xuICAgICAgICBsZXQgZm5WYWwgPSBGXG4gICAgICAgIGlmIChpc1N0cmluZyh2YWwpIHx8IGlzQm9vbGVhbih2YWwpIHx8IGlzTnVtYmVyKHZhbCkpIHtcbiAgICAgICAgICBmblZhbCA9IGNyZWF0ZUN1cnJ5Q29tcGFyYXRvcih2YWwpXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiB2YWxcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5Rm4odmFsKSB8fCBpc09iamVjdEZuKHZhbCkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBDaGFubmVsUGF5bG9hZEZpbHRlcjogUHJvcGVydHkgXCIke3ZhbH1cIiBpcyBhbiBhcnJheS9vYmplY3QsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiBgICtcbiAgICAgICAgICAgICAgJ1RoaXMgcHJvcGVydHkgd2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlLidcbiAgICAgICAgICApXG4gICAgICAgICAgcmV0dXJuIGZuVmFsXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuVmFsXG4gICAgICB9XG4gICAgICBmaWx0ZXJKc29uID0gck1hcChjaGVja1RvQ29udmVydFRvRm4sIGZpbHRlckpzb24pXG5cbiAgICAgIC8vIFRBUCBMT0dHRVJcbiAgICAgIGNvbnN0IHRhcExvZ2dlciA9IChjb21wYXJlZE9iaikgPT4ge1xuICAgICAgICBpZiAoZGVidWdMYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBhcmVkT2JqXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJvcHNCb29sZWFucyA9IHt9XG4gICAgICAgIGNvbnN0IG1hcEJvb2xzID0gKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICBwcm9wc0Jvb2xlYW5zW2tleV0gPSB2YWx1ZShwcm9wKGtleSwgY29tcGFyZWRPYmopKVxuICAgICAgICB9XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKG1hcEJvb2xzLCBmaWx0ZXJKc29uKVxuICAgICAgICBjb25zb2xlLmxvZyhgJWMgQ0hBTk5FTCBQQVlMT0FEIEZJTFRFUiBERUJVR0dFUiBbXCIke2RlYnVnTGFiZWx9XCJdIC0gdmFsdWVzOiAgICBgLCAnY29sb3I6b3JhbmdlOycsIHsgcHJvcHNCb29sZWFucywgY29tcGFyZWRPYmogfSlcblxuICAgICAgICByZXR1cm4gY29tcGFyZWRPYmpcbiAgICAgIH1cblxuICAgICAgLy8gRU5EIFRBUCBMT0dHRVJcbiAgICAgIGNvbnN0IGZNZXRob2QgPSB3aGVyZShmaWx0ZXJKc29uKVxuXG4gICAgICBjb25zdCBnZXRGaWx0ZXJpbmdPYmogPSAgKHYpID0+IHtcbiAgICAgICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gdiB8fCB7fVxuICAgICAgICBjb25zdCBvID0gT2JqZWN0LmFzc2lnbih7fSwgdiwgc3JjRWxlbWVudCwgZXZlbnQsIHBheWxvYWQpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdvIGlzICcsbyk7XG4gICAgICAgIHJldHVybiBvXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wb3NlKGZNZXRob2QsIHRhcExvZ2dlciwgZGVmYXVsdFRvKHt9KSwgZ2V0RmlsdGVyaW5nT2JqKVxuICAgIH1cblxuICAgIHJldHVybiBjb21wYXJlRGF0YSgpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tQYXlsb2FkU2VsZWN0b3IoYXJyLCBkZWJ1Z0xhYmVsLCBzcmNQYXlsb2FkKSB7XG4gICAgLy8gRUxFTUVOVCBGUk9NIFBBWUxPQURzXG4gICAgY29uc3QgeyBwYXlsb2FkLCBzcmNFbGVtZW50LCBldmVudCB9ID0gc3JjUGF5bG9hZCB8fCB7fVxuXG4gICAgY29uc3QgcmVkdWNlRmluZEVsID0gKGFjYywgc3JjKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IHByb3AoJ2VsJywgc3JjKVxuICAgICAgaWYgKENoYW5uZWxQYXlsb2FkRmlsdGVyLmVsSXNEb21FbGVtZW50KGVsKSAmJiBhY2MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhY2MgPSBlbFxuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH1cblxuICAgIGNvbnN0IGVsID0gW3NyY0VsZW1lbnQsIHBheWxvYWQsIHByb3AoJ3NyY0VsZW1lbnQnLCBldmVudCksIHNyY1BheWxvYWRdLnJlZHVjZShyZWR1Y2VGaW5kRWwsIHVuZGVmaW5lZClcblxuICAgIC8vIFJFVFVSTiBCT09MRUFOIE1BVENIIFdJVEggUEFZTE9BRCBFTFxuICAgIGNvbnN0IGNvbXBhcmVFbHMgPSAoZWxDb21wYXJlKSA9PiBlbENvbXBhcmUuaXNFcXVhbE5vZGUoKGVsKSlcblxuICAgIC8vIExPT1AgVEhST1VHSCBOT0RFUyBJTiBxdWVyeVNlbGVjdG9yQWxsKClcbiAgICBjb25zdCBtYXBOb2RlQXJyV2l0aEVsID0gKHNlbCkgPT4ge1xuICAgICAgLy8gY29udmVydCBub2RlbGlzdCB0byBhcnJheSBvZiBlbHNcbiAgICAgIGNvbnN0IG5vZGVBcnIgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsKSlcbiAgICAgIC8vIGVscyBhcnJheSB0byBib29sZWFuIGFycmF5XG4gICAgICByZXR1cm4gck1hcChjb21wYXJlRWxzLCBub2RlQXJyKVxuICAgIH1cblxuICAgIGlmIChkZWJ1Z0xhYmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG5vZGVBcnJSZXN1bHRzRGVidWdnZXIgPSBjb21wb3NlKGZsYXR0ZW4sIHJNYXAobWFwTm9kZUFycldpdGhFbCkpKGFycilcbiAgICAgIGNvbnN0IHNlbGVjdG9yc0FyciA9IGFyclxuICAgICAgY29uc29sZS5sb2coYCVjIENIQU5ORUwgUEFZTE9BRCBGSUxURVIgREVCVUdHRVIgW1wiJHtkZWJ1Z0xhYmVsfVwiXSAtIHNlbGVjdG9yczogYCwgJ2NvbG9yOm9yYW5nZTsnLCB7IGVsLCBzZWxlY3RvcnNBcnIsIG5vZGVBcnJSZXN1bHRzRGVidWdnZXIgfSlcbiAgICB9XG5cbiAgICAvLyBDSEVDSyBJRiBQQVlMT0FEIEVMIEVYSVNUU1xuICAgIGlmICh0eXBlb2YgKGVsKSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIExPT1AgVEhST1VHSCBBTEwgU0VMRUNUT1JTIElOIE1BSU4gQVJSQVlcbiAgICBjb25zdCBub2RlQXJyUmVzdWx0ID0gY29tcG9zZShmbGF0dGVuLCByTWFwKG1hcE5vZGVBcnJXaXRoRWwpKShhcnIpXG4gICAgaWYgKGlzRW1wdHkobm9kZUFyclJlc3VsdCkgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiBhbnkoZXF1YWxzKHRydWUpLCBub2RlQXJyUmVzdWx0KVxuICB9XG5cbiAgc3RhdGljIGVsSXNEb21FbGVtZW50KG8pIHtcbiAgICBpZiAoaXMoU3RyaW5nLCBvKSkge1xuICAgICAgbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobylcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpKG8pXG4gIH1cblxuICBzdGF0aWMgZmlsdGVyU2VsZWN0b3Ioc2VsZWN0b3JBcnIsIGRlYnVnTGFiZWwpIHtcbiAgICBjb25zdCBhcnIgPSByZWplY3QoaXNFbXB0eSwgc2VsZWN0b3JBcnIpXG4gICAgY29uc3QgcGF5bG9hZENoZWNrID0gY3VycnkoQ2hhbm5lbFBheWxvYWRGaWx0ZXIuY2hlY2tQYXlsb2FkU2VsZWN0b3IpXG4gICAgcmV0dXJuIHBheWxvYWRDaGVjayhhcnIsIGRlYnVnTGFiZWwpXG4gIH1cbn1cbiIsImZ1bmN0aW9uIGlzTWVyZ2VhYmxlT2JqZWN0KHZhbCkge1xuICBjb25zdCBub25OdWxsT2JqZWN0ID0gdmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnXG4gIHJldHVybiBub25OdWxsT2JqZWN0ICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpICE9PSAnW29iamVjdCBSZWdFeHBdJyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSAhPT0gJ1tvYmplY3QgRGF0ZV0nXG59XG5cbmZ1bmN0aW9uIGVtcHR5VGFyZ2V0KHZhbCkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWwpID8gW10gOiB7fVxufVxuXG5mdW5jdGlvbiBjbG9uZUlmTmVjZXNzYXJ5KHZhbHVlLCBvcHRpb25zQXJndW1lbnQpIHtcbiAgY29uc3QgY2xvbmUgPSBvcHRpb25zQXJndW1lbnQgJiYgb3B0aW9uc0FyZ3VtZW50LmNsb25lID09PSB0cnVlXG4gIHJldHVybiAoY2xvbmUgJiYgaXNNZXJnZWFibGVPYmplY3QodmFsdWUpKVxuICAgID8gZGVlcE1lcmdlKGVtcHR5VGFyZ2V0KHZhbHVlKSxcbiAgICAgIHZhbHVlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgOiB2YWx1ZVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0QXJyYXlNZXJnZSh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gdGFyZ2V0LnNsaWNlKClcbiAgc291cmNlLmZvckVhY2goZnVuY3Rpb24oZSwgaSkge1xuICAgIGlmICh0eXBlb2YgZGVzdGluYXRpb25baV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBkZXN0aW5hdGlvbltpXSA9IGNsb25lSWZOZWNlc3NhcnkoZSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSBpZiAoaXNNZXJnZWFibGVPYmplY3QoZSkpIHtcbiAgICAgIGRlc3RpbmF0aW9uW2ldID0gZGVlcE1lcmdlKHRhcmdldFtpXSwgZSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0gZWxzZSBpZiAodGFyZ2V0LmluZGV4T2YoZSkgPT09IC0xKSB7XG4gICAgICBkZXN0aW5hdGlvbi5wdXNoKGNsb25lSWZOZWNlc3NhcnkoZSwgb3B0aW9uc0FyZ3VtZW50KSlcbiAgICB9XG4gIH0pXG4gIHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBtZXJnZU9iamVjdCh0YXJnZXQsIHNvdXJjZSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0ge31cbiAgaWYgKGlzTWVyZ2VhYmxlT2JqZWN0KHRhcmdldCkpIHtcbiAgICBPYmplY3Qua2V5cyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgICBkZXN0aW5hdGlvbltrZXldID0gY2xvbmVJZk5lY2Vzc2FyeSh0YXJnZXRba2V5XSwgb3B0aW9uc0FyZ3VtZW50KVxuICAgIH0pXG4gIH1cbiAgT2JqZWN0LmtleXMoc291cmNlKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICghaXNNZXJnZWFibGVPYmplY3Qoc291cmNlW2tleV0pIHx8ICF0YXJnZXRba2V5XSkge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGNsb25lSWZOZWNlc3Nhcnkoc291cmNlW2tleV0sIG9wdGlvbnNBcmd1bWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IGRlZXBNZXJnZSh0YXJnZXRba2V5XSwgc291cmNlW2tleV0sIG9wdGlvbnNBcmd1bWVudClcbiAgICB9XG4gIH0pXG4gIHJldHVybiBkZXN0aW5hdGlvblxufVxuXG5mdW5jdGlvbiBkZWVwTWVyZ2UodGFyZ2V0LCBzb3VyY2UsIG9wdGlvbnNBcmd1bWVudCkge1xuICBjb25zdCBhcnJheSA9IEFycmF5LmlzQXJyYXkoc291cmNlKVxuICBjb25zdCBvcHRpb25zID0gb3B0aW9uc0FyZ3VtZW50IHx8IHsgYXJyYXlNZXJnZTogZGVmYXVsdEFycmF5TWVyZ2UgfVxuICBjb25zdCBhcnJheU1lcmdlID0gb3B0aW9ucy5hcnJheU1lcmdlIHx8IGRlZmF1bHRBcnJheU1lcmdlXG5cbiAgaWYgKGFycmF5KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodGFyZ2V0KVxuICAgICAgPyBhcnJheU1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gICAgICA6IGNsb25lSWZOZWNlc3Nhcnkoc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0KHRhcmdldCwgc291cmNlLCBvcHRpb25zQXJndW1lbnQpXG4gIH1cbn1cblxuZGVlcE1lcmdlLmFsbCA9IGZ1bmN0aW9uIGRlZXBtZXJnZUFsbChhcnJheSwgb3B0aW9uc0FyZ3VtZW50KSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcnJheSkgfHwgYXJyYXkubGVuZ3RoIDwgMikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXkgd2l0aCBhdCBsZWFzdCB0d28gZWxlbWVudHMnKVxuICB9XG5cbiAgLy8gd2UgYXJlIHN1cmUgdGhlcmUgYXJlIGF0IGxlYXN0IDIgdmFsdWVzLCBzbyBpdCBpcyBzYWZlIHRvIGhhdmUgbm8gaW5pdGlhbCB2YWx1ZVxuICByZXR1cm4gYXJyYXkucmVkdWNlKGZ1bmN0aW9uKHByZXYsIG5leHQpIHtcbiAgICByZXR1cm4gZGVlcE1lcmdlKHByZXYsIG5leHQsIG9wdGlvbnNBcmd1bWVudClcbiAgfSlcbn1cblxuZXhwb3J0IHsgZGVlcE1lcmdlIH1cbiIsImltcG9ydCB7IGRlZmF1bHRUbywgbWF0Y2gsIGZvckVhY2gsIHRlc3QsIGluY2x1ZGVzLCB3aXRob3V0LCBjb21wbGVtZW50LCBpc0VtcHR5LCB2YWx1ZXMsIGlzTmlsLCBmaWx0ZXIsIF9fLCBrZXlzLCBjb21wb3NlLCBoZWFkLCBtYXAsIGNvbmQsIFQsIGFsbFBhc3MsIGNvbmNhdCwgdW5pcSB9IGZyb20gJ3JhbWRhJ1xuY29uc3QgaXNJT1MgPSAoKSA9PiB7XG4gIGNvbnN0IHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKClcbiAgLy8gbGV0IHNhZmFyaSA9IC9zYWZhcmkvLnRlc3QodXNlckFnZW50KTtcbiAgY29uc3QgaW9zID0gL2lwaG9uZXxpcG9kfGlwYWQvLnRlc3QodXNlckFnZW50KVxuICByZXR1cm4gaW9zID09PSB0cnVlXG59XG5cbmNvbnN0IGRlbGF5Q2FsbCA9IGFzeW5jKGZuLCB0aW1lKSA9PiB7XG4gIGZ1bmN0aW9uIHNsZWVwKG1zKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpXG4gIH1cblxuICBjb25zdCB0aW1lb3V0SGFuZGxlciA9IGFzeW5jKCkgPT4ge1xuICAgIGF3YWl0IHNsZWVwKDEpXG4gICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbilcbiAgfVxuXG4gIHdpbmRvdy5zZXRUaW1lb3V0KHRpbWVvdXRIYW5kbGVyLCB0aW1lKVxufVxuXG5jb25zdCBnZXRDb25zdHJ1Y3Rvck5hbWUgPSAob2JqKSA9PiB7XG4gIGlmIChvYmouY29uc3RydWN0b3IubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIG9iai5jb25zdHJ1Y3Rvci5uYW1lXG4gIH1cbiAgY29uc3QgcmUgPSAvXihmdW5jdGlvblxccykoXFx3KykoXFwoLiopJC9cbiAgY29uc3Qgc3RyID0gb2JqLnRvU3RyaW5nKClcbiAgcmV0dXJuIGRlZmF1bHRUbyhTdHJpbmcoc3RyKS5zdWJzdHIoMCwgMTIpLCBtYXRjaChyZSwgc3RyKVsyXSlcbn1cblxuY29uc3QgYXJyRnJvbU1hcEtleXMgPSAobWFwKSA9PiB7XG4gIGNvbnN0IGFyciA9IFtdXG4gIGNvbnN0IGFkZEtleXNUb0FyciA9ICh2LCBrLCBpKSA9PiBhcnIucHVzaChrKVxuICBmb3JFYWNoKGFkZEtleXNUb0FyciwgbWFwKVxuICByZXR1cm4gYXJyXG59XG5cbmNvbnN0IGZpbmRTdHJGcm9tUmVnZXhBcnIgPSAob2JqLCBzdHIpID0+IHtcbiAgaWYgKG9ialtzdHJdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gc3RyXG4gIH1cbiAgY29uc3QgY2hlY2tJZk1hdGNoID0gcyA9PiB0ZXN0KG5ldyBSZWdFeHAocyksIHN0cilcbiAgY29uc3QgY2hlY2tTdHJNYXRjaCA9IGluY2x1ZGVzKHN0cilcbiAgY29uc3QgY2hlY2tJZlJlZ0V4TWF0Y2ggPSBjb21wb3NlKGluY2x1ZGVzKHRydWUpLCBtYXAoY2hlY2tJZk1hdGNoKSlcbiAgY29uc3QgcnVuTWF0Y2hDaGVja3MgPSBjb25kKFtcbiAgICBbY2hlY2tTdHJNYXRjaCwgKCkgPT4gc3RyXSxcbiAgICBbY2hlY2tJZlJlZ0V4TWF0Y2gsICgpID0+IHN0cl0sXG4gICAgW1QsICgpID0+IHVuZGVmaW5lZF1cbiAgXSlcbiAgcmV0dXJuIHJ1bk1hdGNoQ2hlY2tzKG9iailcbn1cblxuY29uc3QgZmluZFN0ck9yUmVnZXhNYXRjaFN0ciA9IChvYmosIHN0cikgPT4ge1xuICBpZiAob2JqW3N0cl0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBzdHJcbiAgfVxuICBjb25zdCBjcmVhdGVSZSA9IHMgPT4gbmV3IFJlZ0V4cChzKVxuICBjb25zdCBjaGVja2VySWZSZWdleE1hdGNoRXhpc3RzID0gY29tcG9zZShoZWFkLCBmaWx0ZXIoY29tcG9zZSh0ZXN0KF9fLCBzdHIpLCBjcmVhdGVSZSkpKVxuICByZXR1cm4gY2hlY2tlcklmUmVnZXhNYXRjaEV4aXN0cyhrZXlzKG9iaikpXG59XG5cbmNvbnN0IGNsb3Nlc3QgPSAoYXJyYXksIG51bSkgPT4ge1xuICBsZXQgaSA9IDBcbiAgbGV0IG1pbkRpZmYgPSAxMDAwXG4gIGxldCBhbnNcbiAgZm9yIChpIGluIGFycmF5KSB7XG4gICAgY29uc3QgbSA9IE1hdGguYWJzKG51bSAtIGFycmF5W2ldKVxuICAgIGlmIChtIDwgbWluRGlmZikge1xuICAgICAgbWluRGlmZiA9IG1cbiAgICAgIGFucyA9IGFycmF5W2ldXG4gICAgfVxuICB9XG4gIHJldHVybiBhbnNcbn1cblxuY29uc3QgY29udmVydERvbVN0cmluZ01hcFRvT2JqID0gKGRvbU1hcCkgPT4ge1xuICBjb25zdCBvYmogPSB7fVxuICBmb3IgKGNvbnN0IGQgaW4gZG9tTWFwKSB7XG4gICAgb2JqW2RdID0gZG9tTWFwW2RdXG4gIH1cbiAgcmV0dXJuIG9ialxufVxuXG4vLyBjb25zdCBwYXNzUGFnZURhdGEgPSBwaWNrKFsncGFyYW1zJywgJ3JvdXRlSWQnLCAnZGF0YSddLCBfXyk7XG5cbmNvbnN0IHN1YnNjcmliZUZuID0ge1xuICBuZXh0OiAgICAgeCA9PiBjb25zb2xlLmxvZyhgbmV4dCAgICAgICR7eH1gKSxcbiAgZXJyb3I6ICAgIHggPT4gY29uc29sZS5sb2coYGVycm9yICAgICAke3h9YCksXG4gIGNvbXBsZXRlOiB4ID0+IGNvbnNvbGUubG9nKGBjb21wbGV0ZSAgJHt4fWApXG59XG5cbmNvbnN0IHJpZ2h0ID0geCA9PiAoe1xuICBtYXA6IGYgPT4gcmlnaHQoZih4KSksXG4gIGZvbGQ6IChmLCBnKSA9PiBnKHgpLFxuICBpbnNwZWN0OiAoKSA9PiBgcmlnaHQoJHt4fSlgXG5cbn0pXG5cbmNvbnN0IGlmTmlsVGhlblVwZGF0ZSA9ICh2YWwsIG5ld1ZhbCkgPT4ge1xuICBjb25zdCBpc05pbEJvb2wgPSBpc05pbCh2YWwpXG4gIHJldHVybiBpc05pbEJvb2wgPyBuZXdWYWwgOiB2YWxcbn1cblxuY29uc3QgbGVmdCA9IHggPT4gKHtcbiAgbWFwOiBmID0+IGxlZnQoeCksXG4gIGZvbGQ6IChmLCBnKSA9PiBmKHgpLFxuICBpbnNwZWN0OiAoKSA9PiBgbGVmdCgke3h9KWBcbn0pXG5cbmNvbnN0IGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwgPSAob2JqKSA9PiB7XG4gIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNFbXB0eSksIGhlYWQsIHZhbHVlcylcbiAgY29uc3QgaXNOb3ROaWwgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNOaWwpLCBoZWFkLCB2YWx1ZXMpXG4gIGNvbnN0IGlzTm90TmlsQW5kSXNOb3RFbXB0eSA9IGFsbFBhc3MoW2lzTm90RW1wdHksIGlzTm90TmlsXSlcbiAgcmV0dXJuIGlzTm90TmlsQW5kSXNOb3RFbXB0eShvYmopXG59XG5cbmNvbnN0IGZyb21OdWxsYWJsZSA9IHggPT4geCAhPT0gbnVsbCA/IHJpZ2h0KHgpIDogbGVmdChudWxsKVxuXG5jb25zdCBmaW5kSW5PYmogPSAob2JqLCB2YWwsIGVycm9yID0gbnVsbCkgPT4ge1xuICBjb25zdCBmb3VuZCA9IG9ialt2YWxdXG4gIHJldHVybiBmb3VuZCA/IHJpZ2h0KGZvdW5kKSA6IGxlZnQoZXJyb3IpXG59XG5jb25zdCBwdWxsUm91dGVJbmZvID0gKCkgPT4ge1xuICBjb25zdCBzdHIgPSBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgod2luZG93LmxvY2F0aW9uLmhhc2gpXG4gIGNvbnN0IHJvdXRlSWQgPSBwdWxsTWFpblJvdXRlKHN0cilcbiAgY29uc3QgcGFyYW1zID0gcHVsbFBhcmFtcyhzdHIpXG4gIHJldHVybiB7IHJvdXRlSWQsIHBhcmFtcyB9XG59XG5cbmZ1bmN0aW9uIGdldEFsbE1ldGhvZE5hbWVzKGluc3RhbmNlLCBvbWl0dGVkTWV0aG9kcyA9IFtdKSB7XG4gIC8vIE9wdGlvbmFsbHkgcmVuYW1lIGBpbnN0YW5jZWAgdG8gc29tZXRoaW5nIG1vcmUgZGVzY3JpcHRpdmU6XG4gIGNvbnN0IGJhc2VDbGFzc01ldGhvZHNBcnIgPSBbJ2xlbmd0aCcsICduYW1lJywgJ3Byb3RvdHlwZScsICdjb25zdHJ1Y3RvciddXG4gIGNvbnN0IGNvbWJpbmVkT21pdHRlZE1ldGhvZHMgPSBjb25jYXQoYmFzZUNsYXNzTWV0aG9kc0Fyciwgb21pdHRlZE1ldGhvZHMpXG5cbiAgLy8gRmlsdGVyIG91dCBvbWl0dGVkXG4gIGNvbnN0IG9taXRQcm9wc0Zyb21BcnIgPSBjb21wb3NlKHdpdGhvdXQoY29tYmluZWRPbWl0dGVkTWV0aG9kcyksIHVuaXEpXG5cbiAgLy8gUHVsbCBvdXQgaW5zdGFuY2UgbWV0aG9kc1xuICBjb25zdCBtZXRob2RzID0gb21pdFByb3BzRnJvbUFycihcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbnN0YW5jZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpXG4gIClcblxuICAvLyBQdWxsIG91dCBzdGF0aWMgbWV0aG9kc1xuICBjb25zdCBzdGF0aWNNZXRob2RzID0gb21pdFByb3BzRnJvbUFycihcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbnN0YW5jZS5jb25zdHJ1Y3RvcilcbiAgKVxuXG4gIGNvbnN0IGFsbE1ldGhvZHMgPSBjb25jYXQobWV0aG9kcywgc3RhdGljTWV0aG9kcylcblxuICByZXR1cm4geyBtZXRob2RzLCBzdGF0aWNNZXRob2RzLCBhbGxNZXRob2RzIH1cbn1cblxuLyogY29uc3QgZ2V0QWxsTWV0aG9kTmFtZXMzID0gKF90aGlzID0gdGhpcywgb21pdHRlZE1ldGhvZHMgPSBbXSkgPT4ge1xuICBjb25zdCBnZXRQcm9wTmFtZXNBcnIgPSAob2JqID0gdGhpcywgb21pdHRlZE1ldGhvZHMgPSBbXSkgPT4ge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopXG4gIH1cbiAgLy8gRmlsdGVyIE1ldGhvZHNcbiAgY29uc3QgYmFzZUNsYXNzTWV0aG9kc0FyciA9IFsnbGVuZ3RoJywgJ25hbWUnLCAncHJvdG90eXBlJywgJ2NvbnN0cnVjdG9yJ11cbiAgb21pdHRlZE1ldGhvZHMgPSBjb25jYXQoYmFzZUNsYXNzTWV0aG9kc0Fyciwgb21pdHRlZE1ldGhvZHMpXG4gIGNvbnN0IG9taXRQcm9wc0Zyb21BcnIgPSBjb21wb3NlKHdpdGhvdXQob21pdHRlZE1ldGhvZHMpLCB1bmlxKVxuXG4gIC8vIFBVTEwgT1VUIE1FVEhPRCBOQU1FU1xuICBjb25zdCBtZXRob2RzID0gb21pdFByb3BzRnJvbUFycihPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhfdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpKVxuICBjb25zdCBzdGF0aWNNZXRob2RzID0gb21pdFByb3BzRnJvbUFycihnZXRQcm9wTmFtZXNBcnIoX3RoaXMuY29uc3RydWN0b3IpKVxuICBjb25zdCBhbGxNZXRob2RzID0gY29uY2F0KG1ldGhvZHMsIHN0YXRpY01ldGhvZHMpXG5cbiAgcmV0dXJuIHsgbWV0aG9kcywgc3RhdGljTWV0aG9kcywgYWxsTWV0aG9kcyB9XG4gIC8vIHJldHVybiAnZm4nO1xufSAqL1xuXG4vLyBST1VURSBSRUdFWCBFWFBSRVNTSU9OU1xuY29uc3QgcmVtb3ZlU2xhc2hlcyA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihcXC8pKC4qKS9nLCAnJDInKVxuY29uc3Qgcm91dGVSRSA9IC9eKFxcLz8pKFxcdyopKFxcLz8pKC4qKS9nXG5jb25zdCBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGggPSAoc3RyKSA9PiBzdHIucmVwbGFjZSgvXigjXFwvPykoLiopLywgJyQyJylcbmNvbnN0IHB1bGxTbGFzaEZyb21QYXRoID0gKHN0cikgPT4gc3RyLnJlcGxhY2UoL14oXFwvPykoLiopLywgJyQyJylcbmNvbnN0IHB1bGxNYWluUm91dGUgPSAoc3RyKSA9PiBzdHIucmVwbGFjZShyb3V0ZVJFLCAnJDInKVxuY29uc3QgcHVsbFBhcmFtcyA9ICAgIChzdHIpID0+IHN0ci5yZXBsYWNlKHJvdXRlUkUsICckNCcpXG5jb25zdCBwdWxsVHJhbnNsYXRlWCA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihtYXRyaXgpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKikoLC4qKS8sICckNicpXG5jb25zdCBwdWxsVHJhbnNsYXRlWSA9IHN0ciA9PiBzdHIucmVwbGFjZSgvXihtYXRyaXgpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKiwpKC4qXFxkKSguKikvLCAnJDcnKVxuY29uc3QgcHVsbFRyYW5zbGF0ZVlGcm9tSGVhZGVyID0gc3RyID0+IHN0ci5yZXBsYWNlKC9eKHRyYW5zZm9ybTogbWF0cml4KSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCosKSguKlxcZCopKFxcKS4qOykvLCAnJDYnKVxuZXhwb3J0IHsgZ2V0Q29uc3RydWN0b3JOYW1lLCBhcnJGcm9tTWFwS2V5cywgZ2V0QWxsTWV0aG9kTmFtZXMsIGZpbmRTdHJPclJlZ2V4TWF0Y2hTdHIsIGZpbmRTdHJGcm9tUmVnZXhBcnIsIGNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwsIGlzSU9TLCBwdWxsUm91dGVJbmZvLCBwdWxsVHJhbnNsYXRlWUZyb21IZWFkZXIsIHB1bGxTbGFzaEZyb21QYXRoLCBwdWxsSGFzaEFuZFNsYXNoRnJvbVBhdGgsIGNsb3Nlc3QsIHB1bGxUcmFuc2xhdGVZLCBwdWxsVHJhbnNsYXRlWCwgcHVsbE1haW5Sb3V0ZSwgcHVsbFBhcmFtcywgcmlnaHQsIGxlZnQsIGZyb21OdWxsYWJsZSwgZmluZEluT2JqLCBpZk5pbFRoZW5VcGRhdGUsIHJlbW92ZVNsYXNoZXMsIHN1YnNjcmliZUZuLCBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmosIGRlbGF5Q2FsbCB9XG4iLCJpbXBvcnQgeyBmb3JFYWNoIH0gZnJvbSAncmFtZGEnXG5leHBvcnQgZnVuY3Rpb24gZ2MoKSB7XG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc3QgbG9vcE0gPSBtID0+IHVuZGVmaW5lZFxuICAgIGZvckVhY2gobG9vcE0sIHRoaXMpXG4gIH1cbiAgc2V0VGltZW91dChjbGVhbnVwLCAxKVxufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGJhc2VDb3JlTWl4aW5zKCkge1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZXByb3BzTWFwOiBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IHdtID0gbmV3IFdlYWtNYXAoKVxuICAgICAgY29uc3Qgb2JqS2V5ID0geyB2c2lkOiB0aGlzLnByb3BzLnZzaWQgfVxuICAgICAgd20uc2V0KG9iaktleSwgdGhpcy5wcm9wcylcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogb2JqS2V5LFxuICAgICAgICB3ZWFrTWFwOiB3bVxuICAgICAgfVxuICAgIH0sXG4gICAgZ2M6IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yIChjb25zdCBtIGluIHRoaXMpIHtcbiAgICAgICAgZGVsZXRlIHRoaXNbbV1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzXG4gICAgfSxcbiAgICBjcmVhdGVJZDogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBsZXQgbnVtID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgxMDAwMDAwMCkgKiAxMDAwMDAwMCk7XG4gICAgICAvLyBjb25zdCBudW0gPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOCk7O1xuICAgICAgY29uc3QgbnVtID0gKCkgPT4gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikucmVwbGFjZSgvXFxkL2dtLCAnJykuc3Vic3RyaW5nKDEsIDgpXG4gICAgICByZXR1cm4gbnVtKClcbiAgICAgIC8vIHJldHVybiBgdnNpZC0ke251bSgpfWA7XG4gICAgfSxcbiAgICBzZXRUcmFjZUZ1bmM6IGZ1bmN0aW9uKGRlYnVnKSB7XG4gICAgICByZXR1cm4gZGVidWcgPT09IHRydWVcbiAgICAgICAgPyBjb25zb2xlLmxvZ1xuICAgICAgICA6ICgpID0+IHtcbiAgICAgICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBWaWV3U3RyZWFtUGF5bG9hZCB9IGZyb20gJy4uLy4uL3ZpZXdzL3ZpZXctc3RyZWFtLXBheWxvYWQuanMnXG5cbmV4cG9ydCBmdW5jdGlvbiBiYXNlU3RyZWFtc01peGlucygpIHtcbiAgcmV0dXJuIHtcbiAgICB0ZXN0RnVuYzogZnVuY3Rpb24oc3RyKSB7XG4gICAgICBjb25zb2xlLmxvZygnc3RyZWFtIG1peGluIGlzICcsIHN0cilcbiAgICB9LFxuICAgIHNlbmRSb3V0ZVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgLyoqIFRPRE86IEFERCBBIENIRUNLIEZPUiBFTkQgUk9VVEUgQU5EIFRSQU5TRk9STSBUTyBFTVBUWSAqL1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnQ0hBTk5FTF9ST1VURScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpXG4gICAgfSxcbiAgICBzZW5kVUlQYXlsb2FkOiBmdW5jdGlvbihvYnMsIGRhdGEpIHtcbiAgICAgIHJldHVybiBuZXcgVmlld1N0cmVhbVBheWxvYWQoJ0NIQU5ORUxfVUknLCBvYnMsIGRhdGEsICdzdWJzY3JpYmUnKVxuICAgIH1cbiAgICAvKlxuICAgIHNlbmRJbmZvVG9DaGFubmVsOiBmdW5jdGlvbihjaGFubmVsTmFtZSwgcGF5bG9hZCkge1xuICAgICAgY29uc3QgZ2V0UHJvcCA9IHN0ciA9PiBwcm9wKHN0ciwgdGhpcy5wcm9wcyk7XG4gICAgICBjb25zdCBjaGFubmVsID0gY2hhbm5lbE5hbWU7XG4gICAgICBsZXQgc3JjRWxlbWVudCA9IHtcbiAgICAgICAgdnNpZDogZ2V0UHJvcCgndnNpZCcpLFxuICAgICAgICBlbDogZ2V0UHJvcCgnZWwnKSxcbiAgICAgICAgdmlld05hbWU6IGdldFByb3AoJ25hbWUnKVxuICAgICAgfTtcbiAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICBwYXlsb2FkLCBjaGFubmVsLCBzcmNFbGVtZW50XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZChjaGFubmVsTmFtZSwgbmV3IG9mKCcnKSwgZGF0YSxcbiAgICAgICAgJ3N1YnNjcmliZScpO1xuICAgIH0sXG4gICAgKi9cbiAgICAvKiAgICBzZW5kTGlmZVN0cmVhbVBheWxvYWQ6IGZ1bmN0aW9uKG9icywgZGF0YSkge1xuICAgICAgcmV0dXJuIG5ldyBWaWV3U3RyZWFtUGF5bG9hZCgnTElGRVNUUkVBTScsIG9icywgZGF0YSwgJ3N1YnNjcmliZScpO1xuICAgIH0sXG5cbiAgICBjcmVhdGVMaWZlU3RyZWFtUGF5bG9hZDogZnVuY3Rpb24oU1RFUCwgZGF0YSA9IHt9LCB0eXBlID0gJ3BhcmVudCcpIHtcbiAgICAgIGxldCB2aWV3SWQgPSBgJHt0aGlzLnByb3BzLm5hbWV9OiAke3RoaXMucHJvcHMudnNpZH1gO1xuICAgICAgcmV0dXJuIG5ldyBMaWZlc3RyZWFtUGF5bG9hZCgnTElGRVNUUkVBTScsIFNURVAsIHR5cGUsIHZpZXdJZCwgZGF0YSkuZGF0YTtcbiAgICB9ICovXG4gIH1cbn1cbiIsImltcG9ydCB7IFZpZXdTdHJlYW0gfSBmcm9tICcuLi92aWV3cy92aWV3LXN0cmVhbS5qcydcbmltcG9ydCB7IGN1cnJ5IH0gZnJvbSAncmFtZGEnXG5leHBvcnQgY2xhc3MgUm91dGVDaGFubmVsVXBkYXRlciB7XG4gIGNvbnN0cnVjdG9yKGN4dCkge1xuICAgIGNvbnN0IG5hbWUgPSBTdHJpbmcoY3h0LnByb3BzLm5hbWUpXG4gICAgY29uc3QgaWQgPSBgJHtuYW1lfV9ST1VURV9VUERBVEVSYFxuXG4gICAgY29uc3Qgc2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSA9IGN1cnJ5KFJvdXRlQ2hhbm5lbFVwZGF0ZXIuY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iailcbiAgICByZXR1cm4gc2VuZFJvdXRlQ2hhbm5lbFVwZGF0ZSh7IGlkLCBuYW1lIH0pXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlVGVtcG9yYXJ5Vmlld1N0cmVhbU9iaihwcm9wcywgZGF0YSkge1xuICAgIGNvbnN0IHsgbmFtZSwgaWQgfSAgPSBwcm9wc1xuICAgIGNvbnN0IHBheWxvYWQgPSBkYXRhXG4gICAgY29uc3QgdnMgPSBuZXcgVmlld1N0cmVhbSh7XG4gICAgICBpZCwgbmFtZSwgZGF0YVxuICAgIH0pXG5cbiAgICB2cy5vblJlbmRlcmVkID0gKCkgPT4ge1xuICAgICAgdnMuc2VuZEluZm9Ub0NoYW5uZWwoJ0NIQU5ORUxfUk9VVEUnLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIHZzLmFmdGVyQnJvYWRjYXN0RXZlbnRzID0gKCkgPT4ge1xuICAgICAgdnMuZGlzcG9zZVZpZXdTdHJlYW0oKVxuICAgIH1cblxuICAgIHZzLmFwcGVuZFRvTnVsbCgpXG4gIH1cbn1cbiIsImltcG9ydCB7IGNsb25lLCBjb21wb3NlLCBmcm9tUGFpcnMsIGlzLCBwYXRoLCB0b1BhaXJzIH0gZnJvbSAncmFtZGEnXG5pbXBvcnQgeyBTcHluZUFwcFByb3BlcnRpZXMgfSBmcm9tICcuL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5jb25zdCBnZXRQcm9wVHlwZSA9IChwcnApID0+IHtcbiAgbGV0IHR5cGUgPSB0eXBlb2YgcHJwXG4gIGlmIChbJ251bWJlcicsICdib29sZWFuJywgJ3N0cmluZyddLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgdHlwZSA9ICdwcmltaXRpdmUnXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcnApKSB7XG4gICAgICB0eXBlID0gJ2FycmF5J1xuICAgIH0gZWxzZSBpZiAocHJwID09PSBudWxsKSB7XG4gICAgICB0eXBlID0gJ3VuZGVmaW5lZCdcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHR5cGVcbn1cblxuY29uc3QgY21zRGF0YVJldml2ZU5lc3RlZFByb3h5T2JqID0gKHByb3h5T2JqLCBwcm94eVJldml2ZXJNZXRob2QpID0+IHtcbiAgY29uc3QgeyBfX3Byb3h5X19wcm94eU5hbWUgfSA9IHByb3h5T2JqXG5cbiAgaWYgKF9fcHJveHlfX3Byb3h5TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc29sZS5lcnJvcignb2JqZWN0IGlzIG5vdCBwcm94eSBvYmplY3QgJywgcHJveHlPYmopXG4gIH1cblxuICBjb25zdCBjbG9uZU5lc3RlZFByb3h5T2JqID0gKHRhcmdldCwgcGF0aEFycikgPT4ge1xuICAgIGNvbnN0IG5lc3RlZFByb3h5T2JqID0gcGF0aChwYXRoQXJyLCBwcm94eU9iailcbiAgICBjb25zdCB7IF9fcHJveHlfX2lzUHJveHksIF9fcHJveHlfX3Byb3BzIH0gPSBuZXN0ZWRQcm94eU9ialxuICAgIHJldHVybiBfX3Byb3h5X19pc1Byb3h5ID8gcHJveHlSZXZpdmVyTWV0aG9kKHRhcmdldCwgX19wcm94eV9fcHJvcHMpIDogdGFyZ2V0XG4gIH1cblxuICBjb25zdCByb290T2JqID0gY2xvbmVOZXN0ZWRQcm94eU9iaihjbG9uZShwcm94eU9iaiksIFtdKVxuXG4gIGNvbnN0IHByb3h5SXRlcmFibGUgPSAoaXRlck9iaiwgaXRlclBhdGgpID0+IHtcbiAgICBjb25zdCBkYXRhUGF0aCA9IGl0ZXJQYXRoIHx8IFtdXG4gICAgY29uc3QgbG9vcE9iaiA9IChba2V5LCBwcm9wXSkgPT4ge1xuICAgICAgY29uc3QgdHlwZSA9IGdldFByb3BUeXBlKHByb3ApXG4gICAgICBjb25zdCBjbG9uZWRQYXRoID0gWy4uLmRhdGFQYXRoXVxuICAgICAgY2xvbmVkUGF0aC5wdXNoKGtleSlcbiAgICAgIGlmICh0eXBlID09PSAnb2JqZWN0JyB8fCB0eXBlID09PSAnYXJyYXknKSB7XG4gICAgICAgIGl0ZXJPYmpba2V5XSA9IGNsb25lTmVzdGVkUHJveHlPYmoocHJvcCwgY2xvbmVkUGF0aClcbiAgICAgICAgcHJveHlJdGVyYWJsZShwcm9wLCBjbG9uZWRQYXRoKVxuICAgICAgfVxuICAgIH1cbiAgICBPYmplY3QuZW50cmllcyhpdGVyT2JqKS5mb3JFYWNoKGxvb3BPYmopXG4gIH1cblxuICBwcm94eUl0ZXJhYmxlKHJvb3RPYmopXG4gIC8vIGNvbnNvbGUudGltZUVuZCgncHJveGlmeTInKTtcblxuICByZXR1cm4gcm9vdE9ialxufVxuXG5leHBvcnQgY29uc3Qgc2FmZUNsb25lID0gZnVuY3Rpb24obykge1xuICBjb25zdCB7IF9fcHJveHlfX3Byb3h5TmFtZSB9ID0gb1xuICBpZiAoX19wcm94eV9fcHJveHlOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBwcm94eVJldml2ZXJNZXRob2QgPSBTcHluZUFwcFByb3BlcnRpZXMuZ2V0UHJveHlSZXZpdmVyKF9fcHJveHlfX3Byb3h5TmFtZSlcbiAgICBpZiAodHlwZW9mIHByb3h5UmV2aXZlck1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGNtc0RhdGFSZXZpdmVOZXN0ZWRQcm94eU9iaihvLCBwcm94eVJldml2ZXJNZXRob2QpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSlcbiAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QpXG4gIGNvbnN0IGlzSXRlciA9IG9iID0+IGlzQXJyKG9iKSA9PT0gZmFsc2UgJiYgaXNPYmoob2IpID09PSB0cnVlXG4gIGNvbnN0IGlzSXRlcmFibGUgPSBpc0l0ZXIobylcbiAgcmV0dXJuIGlzSXRlcmFibGUgPyBjb21wb3NlKGZyb21QYWlycywgdG9QYWlycywgY2xvbmUpKG8pIDogY2xvbmUobylcbn1cbiIsIi8vIHNyYy91dGlscy9zYW5pdGl6ZS1kYXRhLmpzXG5pbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4vc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5cbmxldCBfc2FuaXRpemVEYXRhXG5sZXQgaXNDb25maWd1cmVkID0gZmFsc2VcbmxldCBmb3JjZVN0cmljdCA9IGZhbHNlIC8vIGxlZ2FjeSBjb21wYXRpYmlsaXR5IHRvZ2dsZVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIE1vZGUgY29uZmlndXJhdGlvbnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IFNBRkVfRk9SX1JJQ0hfVEVYVCA9IHtcbiAgQUxMT1dFRF9UQUdTOiBbXG4gICAgJ2EnLCAnYicsICdpJywgJ2VtJywgJ3N0cm9uZycsICd1JywgJ3AnLCAnYnInLCAndWwnLCAnZGwnLCAnZHQnLCAnZGQnLCAnb2wnLCAnbGknLCAnaHInLFxuICAgICdibG9ja3F1b3RlJywgJ3ByZScsICdjb2RlJywgJ3NwYW4nLCAnZGl2JywgJ3NlY3Rpb24nLCAnYXJ0aWNsZScsICdhc2lkZScsXG4gICAgJ2hlYWRlcicsICdmb290ZXInLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLFxuICAgICd0YWJsZScsICd0aGVhZCcsICd0Ym9keScsICd0cicsICd0ZCcsICd0aCcsICdpbWcnLCAnZmlndXJlJywgJ2ZpZ2NhcHRpb24nLFxuICAgICd2aWRlbycsICdzb3VyY2UnLCAnaWZyYW1lJywgJ2lucHV0JywgJ2J1dHRvbicsICdsYWJlbCcsICdsaW5rJ1xuICBdLFxuICBBRERfVEFHUzogWydpZnJhbWUnLCAnaW5wdXQnLCAnYnV0dG9uJywgJ2xpbmsnXSxcbiAgQUxMT1dFRF9BVFRSOiBbXG4gICAgJ2hyZWYnLCAnc3JjJywgJ2FsdCcsICdjbGFzcycsICd0aXRsZScsICd3aWR0aCcsICdoZWlnaHQnLCAnc3R5bGUnLCAndGFyZ2V0JywgJ3JlbCcsXG4gICAgJ2NvbnRyb2xzJywgJ3Bvc3RlcicsICd0eXBlJywgJ3Jvd3MnLCAnY29scydcbiAgXSxcbiAgQUxMT1dfREFUQV9BVFRSOiB0cnVlLFxuICBGT1JCSURfQVRUUjogWydvbmVycm9yJywgJ29ubG9hZCcsICdvbmNsaWNrJywgJ29ubW91c2VvdmVyJywgJ29uZm9jdXMnLCAnb25ibHVyJywgJ29uY2hhbmdlJ10sXG4gIEZPUkJJRF9UQUdTOiBbJ3NjcmlwdCcsICdvYmplY3QnLCAnZW1iZWQnLCAnbWV0YSddLFxuICBTQUZFX1VSTF9QQVRURVJOOiAvXihodHRwcz86fG1haWx0bzp8dGVsOnxkYXRhOmltYWdlXFwvKS9pXG59XG5cbmNvbnN0IFNBRkVfRk9SX0FQUCA9IHtcbiAgRk9SQklEX1RBR1M6IFsnc2NyaXB0JywgJ2lmcmFtZScsICdvYmplY3QnLCAnZW1iZWQnLCAnZm9ybScsICdpbnB1dCcsICdidXR0b24nLCAnbGluaycsICdtZXRhJ10sXG4gIEZPUkJJRF9BVFRSOiBbJ29uZXJyb3InLCAnb25sb2FkJywgJ29uY2xpY2snLCAnb25tb3VzZW92ZXInLCAnb25mb2N1cycsICdvbmJsdXInLCAnb25jaGFuZ2UnXSxcbiAgQUxMT1dfREFUQV9BVFRSOiBmYWxzZVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIERldGVybWluZSBzYW5pdGl6YXRpb24gbW9kZSBmcm9tIFNweW5lQXBwUHJvcGVydGllc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuY29uc3QgcmVzb2x2ZURlZmF1bHRNb2RlID0gKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IG1vZGUgPSBTcHluZUFwcFByb3BlcnRpZXM/Lm1vZGUgfHwgcHJvY2Vzcz8uZW52Py5OT0RFX0VOVlxuICAgIGlmIChtb2RlID09PSAnYXV0aG9yaW5nJyB8fCBtb2RlID09PSAnZGV2ZWxvcG1lbnQnKSByZXR1cm4gJ3JpY2h0ZXh0J1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gRmFsbGJhY2s6IGFzc3VtZSBwcm9kdWN0aW9uIHN0cmljdCBtb2RlXG4gIH1cbiAgcmV0dXJuICdhcHAnXG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuZnVuY3Rpb24gbWFrZVNhbml0aXplRm4obW9kZSA9ICdhcHAnKSB7XG4gIGlmIChwcm9jZXNzPy5lbnY/Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgbW9kZSA9ICdyaWNodGV4dCdcbiAgfVxuXG4gIGNvbnN0IGNmZyA9IG1vZGUgPT09ICdyaWNodGV4dCcgPyBTQUZFX0ZPUl9SSUNIX1RFWFQgOiBTQUZFX0ZPUl9BUFBcblxuICByZXR1cm4gKGh0bWwpID0+IHtcbiAgICBsZXQgY2xlYW4gPSBET01QdXJpZnkuc2FuaXRpemUoaHRtbCwgY2ZnKVxuXG4gICAgLy8gSW4gcmljaHRleHQgbW9kZSwgZW5mb3JjZSBzYWZlIFVSTCBzY2hlbWVzIGZvciBocmVmL3NyY1xuICAgIGlmIChtb2RlID09PSAncmljaHRleHQnKSB7XG4gICAgICBjbGVhbiA9IGNsZWFuLnJlcGxhY2UoLzwoYXxpbWcpXFxiKFtePl0rPyk+L2dpLCAobWF0Y2gpID0+IHtcbiAgICAgICAgcmV0dXJuIG1hdGNoLnJlcGxhY2UoL1xcYihocmVmfHNyYyk9XCIoW15cIl0qKVwiL2dpLCAobSwgYXR0ciwgdmFsKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIG1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBjbGVhblxuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29uZmlndXJlIG9uY2UgKGtlcHQgZm9yIGNvbXBhdGliaWxpdHkpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBzYW5pdGl6ZURhdGFDb25maWd1cmUgPSAoY29uZmlnID0ge30pID0+IHtcbiAgaWYgKGlzQ29uZmlndXJlZCkge1xuICAgIGNvbnNvbGUud2Fybignc2FuaXRpemVEYXRhIGlzIGFscmVhZHkgY29uZmlndXJlZC4gUmVjb25maWd1cmF0aW9uIGlzIG5vdCBhbGxvd2VkLicpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCB7IHN0cmljdCA9IGZhbHNlIH0gPSBjb25maWdcbiAgY29uc3QgcHJvY2Vzc0ZhY3RvcnkgPSAobW9kZSkgPT4ge1xuICAgIGNvbnN0IHNhbml0aXplU3RyID0gbWFrZVNhbml0aXplRm4obW9kZSlcbiAgICBjb25zdCBwcm9jZXNzID0gKHZhbCkgPT4ge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIHZhbC5tYXAocHJvY2VzcylcbiAgICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3Qgb3V0ID0ge31cbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModmFsKSkge1xuICAgICAgICAgIG91dFtrXSA9ICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpID8gc2FuaXRpemVTdHIodikgOiBwcm9jZXNzKHYpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dFxuICAgICAgfVxuICAgICAgcmV0dXJuICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykgPyBzYW5pdGl6ZVN0cih2YWwpIDogdmFsXG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzXG4gIH1cblxuICBfc2FuaXRpemVEYXRhID0gKGRhdGEsIG9wdHMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHsgZGlzYWJsZVNhbml0aXplID0gZmFsc2UsIG1vZGUgfSA9IG9wdHNcbiAgICBjb25zdCBsZWdhY3lTdHJpY3QgPSBmb3JjZVN0cmljdCB8fCBzdHJpY3RcbiAgICBjb25zdCBlZmZlY3RpdmVNb2RlID0gbW9kZSB8fCAobGVnYWN5U3RyaWN0ID8gJ2FwcCcgOiByZXNvbHZlRGVmYXVsdE1vZGUoKSlcbiAgICBpZiAoZGlzYWJsZVNhbml0aXplKSByZXR1cm4gZGF0YVxuICAgIHJldHVybiBwcm9jZXNzRmFjdG9yeShlZmZlY3RpdmVNb2RlKShkYXRhKVxuICB9XG5cbiAgc2FuaXRpemVEYXRhQ29uZmlndXJlLnNhbml0aXplRGF0YUZvcmNlID0gKGRhdGEsIG1vZGUpID0+IHtcbiAgICBjb25zdCBlZmZlY3RpdmUgPSBtb2RlIHx8IHJlc29sdmVEZWZhdWx0TW9kZSgpXG4gICAgcmV0dXJuIHByb2Nlc3NGYWN0b3J5KGVmZmVjdGl2ZSkoZGF0YSlcbiAgfVxuXG4gIGlzQ29uZmlndXJlZCA9IHRydWVcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb25maWd1cmFibGUgcnVudGltZSBzYW5pdGl6ZXJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNhbml0aXplRGF0YSA9IChkYXRhLCBvcHRzID0ge30pID0+IHtcbiAgaWYgKCFpc0NvbmZpZ3VyZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Nhbml0aXplRGF0YSBpcyBub3QgY29uZmlndXJlZC4gQ2FsbCBzYW5pdGl6ZURhdGFDb25maWd1cmUoKSBmaXJzdC4nKVxuICB9XG4gIC8vIHJldHVybiBkYXRhO1xuICByZXR1cm4gX3Nhbml0aXplRGF0YShkYXRhLCBvcHRzKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFsd2F5cy1vbiBzYW5pdGl6ZXIgd2l0aCBlbnZpcm9ubWVudCBkZWZhdWx0XG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb25zdCBzYW5pdGl6ZURhdGFGb3JjZSA9IChkYXRhLCBtb2RlKSA9PiB7XG4gIGlmICghaXNDb25maWd1cmVkIHx8ICFzYW5pdGl6ZURhdGFDb25maWd1cmUuc2FuaXRpemVEYXRhRm9yY2UpIHtcbiAgICBjb25zdCBzYW5pdGl6ZVN0ciA9IG1ha2VTYW5pdGl6ZUZuKG1vZGUgfHwgcmVzb2x2ZURlZmF1bHRNb2RlKCkpXG4gICAgcmV0dXJuICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpID8gc2FuaXRpemVTdHIoZGF0YSkgOiBkYXRhXG4gIH1cbiAgcmV0dXJuIHNhbml0aXplRGF0YUNvbmZpZ3VyZS5zYW5pdGl6ZURhdGFGb3JjZShkYXRhLCBtb2RlKVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEV2ZW50LXRhcmdldCBzYW5pdGl6ZXJcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNhbml0aXplRXZlbnRUYXJnZXQgPSAoZWwsIG1vZGUpID0+IHtcbiAgaWYgKCFlbCkgcmV0dXJuXG4gIGNvbnN0IGVmZmVjdGl2ZU1vZGUgPSBtb2RlIHx8IHJlc29sdmVEZWZhdWx0TW9kZSgpXG4gIGNvbnN0IHNhbml0aXplU3RyID0gbWFrZVNhbml0aXplRm4oZWZmZWN0aXZlTW9kZSlcbiAgLy8gY29uc3QgVU5TQUZFX1JFID0gLzwoPzpzY3JpcHR8aWZyYW1lfG9iamVjdHxlbWJlZHxmb3JtfGlucHV0fGJ1dHRvbnxsaW5rfG1ldGEpW14+XSo+fG9uXFx3Kz18amF2YXNjcmlwdDovaVxuICBjb25zdCBVTlNBRkVfUkUgPSAvPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8Zm9ybXxpbnB1dHxidXR0b258bGlua3xtZXRhKVtePl0qPnxvblxcdys9fGphdmFzY3JpcHQ6L2lcbiAgaWYgKHR5cGVvZiBlbC52YWx1ZSA9PT0gJ3N0cmluZycgJiYgVU5TQUZFX1JFLnRlc3QoZWwudmFsdWUpKSB7XG4gICAgY29uc3QgY2xlYW4gPSBzYW5pdGl6ZVN0cihlbC52YWx1ZSlcbiAgICBpZiAoY2xlYW4gIT09IGVsLnZhbHVlKSBlbC52YWx1ZSA9IGNsZWFuXG4gIH1cbiAgaWYgKGVsLmlzQ29udGVudEVkaXRhYmxlICYmIHR5cGVvZiBlbC5pbm5lckhUTUwgPT09ICdzdHJpbmcnICYmIFVOU0FGRV9SRS50ZXN0KGVsLmlubmVySFRNTCkpIHtcbiAgICBjb25zdCBjbGVhbiA9IHNhbml0aXplU3RyKGVsLmlubmVySFRNTClcbiAgICBpZiAoY2xlYW4gIT09IGVsLmlubmVySFRNTCkgZWwuaW5uZXJIVE1MID0gY2xlYW5cbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbnN0IHNldFNhbml0aXplRGF0YUZvcmNlU3RyaWN0ID0gKGJvb2wgPSB0cnVlKSA9PiB7IGZvcmNlU3RyaWN0ID0gISFib29sIH1cblxuZXhwb3J0IHtcbiAgc2FuaXRpemVEYXRhQ29uZmlndXJlLFxuICBzYW5pdGl6ZURhdGEsXG4gIHNhbml0aXplRGF0YUZvcmNlLFxuICBzYW5pdGl6ZUV2ZW50VGFyZ2V0LFxuICBzZXRTYW5pdGl6ZURhdGFGb3JjZVN0cmljdFxufVxuZXhwb3J0IGRlZmF1bHQgc2FuaXRpemVEYXRhXG4iLCJpbXBvcnQgRE9NUHVyaWZ5IGZyb20gJ2RvbXB1cmlmeSdcblxubGV0IF9zYW5pdGl6ZUhUTUxcbmxldCBpc0NvbmZpZ3VyZWQgPSBmYWxzZVxuXG5jb25zdCBzYW5pdGl6ZUhUTUxDb25maWd1cmUgPSAoY29uZmlnKSA9PiB7XG4gIGlmICghaXNDb25maWd1cmVkKSB7XG4gICAgaWYgKGNvbmZpZy5zdHJpY3QpIHtcbiAgICAgIGlmICh3aW5kb3cudHJ1c3RlZFR5cGVzKSB7XG4gICAgICAgIGNvbnN0IHBvbGljeSA9IHdpbmRvdy50cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCdkZWZhdWx0Jywge1xuICAgICAgICAgIGNyZWF0ZUhUTUw6ICh0b19lc2NhcGUpID0+IERPTVB1cmlmeS5zYW5pdGl6ZSh0b19lc2NhcGUsIHsgUkVUVVJOX1RSVVNURURfVFlQRTogZmFsc2UgfSlcbiAgICAgICAgfSlcblxuICAgICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IHBvbGljeS5jcmVhdGVIVE1MKGh0bWwpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IERPTVB1cmlmeS5zYW5pdGl6ZShodG1sKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBfc2FuaXRpemVIVE1MID0gKGh0bWwpID0+IGh0bWwgLy8gTm8gc2FuaXRpemF0aW9uIGlmIG5vdCByZXF1aXJlZFxuICAgIH1cbiAgICBpc0NvbmZpZ3VyZWQgPSB0cnVlXG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS53YXJuKCdzYW5pdGl6ZUhUTUwgaXMgYWxyZWFkeSBjb25maWd1cmVkLiBSZWNvbmZpZ3VyYXRpb24gaXMgbm90IGFsbG93ZWQuJylcbiAgfVxufVxuXG5jb25zdCBzYW5pdGl6ZUhUTUwgPSAoaHRtbCkgPT4ge1xuICBpZiAoIWlzQ29uZmlndXJlZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2FuaXRpemVIVE1MIGlzIG5vdCBjb25maWd1cmVkLiBDYWxsIHNhbml0aXplSFRNTENvbmZpZ3VyZSgpIHdpdGggYXBwcm9wcmlhdGUgY29uZmlnLicpXG4gIH1cbiAgcmV0dXJuIF9zYW5pdGl6ZUhUTUwoaHRtbClcbn1cblxuZXhwb3J0IHsgc2FuaXRpemVIVE1MQ29uZmlndXJlIH1cbmV4cG9ydCBkZWZhdWx0IHNhbml0aXplSFRNTFxuIiwiaW1wb3J0IHsgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB9IGZyb20gJy4vc3B5bmUtdXRpbHMtY2hhbm5lbC1yb3V0ZS5qcydcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwgfSBmcm9tICcuL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUtdXJsLmpzJ1xuaW1wb3J0IHsgU3B5bmVQbHVnaW5zTWV0aG9kcyB9IGZyb20gJy4vc3B5bmUtcGx1Z2lucy1tZXRob2RzLmpzJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi9kZWVwLW1lcmdlLmpzJ1xuXG5sZXQgX2NvbmZpZ1xubGV0IF9jaGFubmVsc1xubGV0IF9jaGFubmVsc01hcFxubGV0IF9pbml0aWFsaXplZFxubGV0IF9kZWJ1ZyA9IHRydWVcbmxldCBfZW5hYmxlQ01TUHJveGllcyA9IGZhbHNlXG5jb25zdCBfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUgPSBbXVxuLyogZXNsaW50LWRpc2FibGUgKi9cbmxldCBfbGlua3NEYXRhXG5sZXQgX25hdkxpbmtzXG5sZXQgX0lNR19QQVRIXG5jb25zdCBfZG9Ob3RUcmFja0NoYW5uZWxzQXJyID0gW11cbmNvbnN0IF9wcm94aWVzTWFwID0gbmV3IE1hcCgpXG5cbmZ1bmN0aW9uIHJhbmRvbTZDaGFycygpIHtcbiAgLy8gRm9yIHNpbXBsaWNpdHk6IHNsaWNlKDIsIDgpIGdldHMgNiByYW5kb20gY2hhcnMgZnJvbSB0aGUgc3Vic3RyaW5nXG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA4KTtcbn1cblxuY29uc3QgX3NweW5lUGx1Z2luTWV0aG9kcyA9IG5ldyBTcHluZVBsdWdpbnNNZXRob2RzKClcblxuY2xhc3MgU3B5bmVBcHBQcm9wZXJ0aWVzQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBfaW5pdGlhbGl6ZWQgPSBmYWxzZVxuICB9XG5cbiAgZ2V0IGNoYW5uZWxzTWFwKCkge1xuICAgIHJldHVybiBfY2hhbm5lbHNNYXBcbiAgfVxuXG4gIGdldCBpbml0aWFsaXplZCgpIHtcbiAgICByZXR1cm4gX2luaXRpYWxpemVkXG4gIH1cblxuICBnZXQgY29uZmlnKCkge1xuICAgIHJldHVybiBfY29uZmlnXG4gIH1cblxuICBnZXQgZGVidWcoKSB7XG4gICAgcmV0dXJuIF9kZWJ1Z1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgbW9zdGx5IHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBUSVRMRVsnPGg0Pkxpc3RpbmcgdGhlIHJlZ2lzdGVyZWVkIENoYW5uZWxzIGluIHRoZSBicm93c2VyIGNvbnNvbGU8L2g0PiddXG4gICAqIFNweW5lQXBwLmxpc3RDaGFubmVscygpO1xuICAgKlxuICAgKiBAcmV0dXJucyBBIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgY2hhbm5lbHNcbiAgICovXG4gIHN0YXRpYyBsaXN0Q2hhbm5lbHMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oX2NoYW5uZWxzLm1hcC5rZXlzKCkpXG4gIH1cblxuICBpbml0aWFsaXplKGRlZmF1bHRDb25maWcgPSB7fSwgY29uZmlnID0ge30sIGNoYW5uZWxzTWFwLCByb3V0ZVV0aWxzKSB7XG4gICAgX2NoYW5uZWxzID0gY2hhbm5lbHNNYXBcbiAgICBfY29uZmlnID0gZGVlcE1lcmdlKGRlZmF1bHRDb25maWcsIGNvbmZpZylcbiAgICAvLyBjb25zb2xlLmxvZyhcImNvbmZpZyBpcyBcIiwgeyBkZWZhdWx0Q29uZmlnLGNvbmZpZyB9KTtcbiAgICBpZiAoX2NvbmZpZy5jaGFubmVscyAmJiBfY29uZmlnLmNoYW5uZWxzLlJPVVRFKSB7XG4gICAgICAvLyBfY29uZmlnID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5jb25mb3JtUm91dGVPYmplY3QoX2NvbmZpZylcbiAgICAgIF9jb25maWcgPSByb3V0ZVV0aWxzLmNvbmZvcm1Sb3V0ZU9iamVjdChfY29uZmlnKVxuICAgIH1cbiAgICBfSU1HX1BBVEggPSBfY29uZmlnPy5JTUdfUEFUSFxuICAgIF9kZWJ1ZyA9IF9jb25maWcuZGVidWcgIT09IHVuZGVmaW5lZCA/IF9jb25maWcuZGVidWcgOiBfZGVidWdcbiAgICB0aGlzLmdldENoYW5uZWxBY3Rpb25zID0gX2NoYW5uZWxzLmdldENoYW5uZWxBY3Rpb25zLmJpbmQoX2NoYW5uZWxzKVxuICAgIHRoaXMubGlzdFJlZ2lzdGVyZWRDaGFubmVscyA9IF9jaGFubmVscy5saXN0UmVnaXN0ZXJlZENoYW5uZWxzLmJpbmQoX2NoYW5uZWxzKVxuICAgIF9pbml0aWFsaXplZCA9IHRydWVcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IF9pbml0aWFsaXplZFxuICAgIHRoaXMuc2V0Q2hhbm5lbHNNYXAoKVxuICAgIGlmIChjb25maWc/LmJhc2VIcmVmKSB7XG4gICAgICB0aGlzLnNldEhlYWRCYXNlSHJlZihjb25maWcuYmFzZUhyZWYpXG4gICAgfVxuICAgIHJldHVybiBfY29uZmlnXG4gIH1cblxuICBzZXRIZWFkQmFzZUhyZWYoc3RyKSB7XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGJhc2UgZWxlbWVudFxuICAgIGNvbnN0IGJhc2VUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiYXNlJylcbiAgICAvLyBTZXQgdGhlIGhyZWYgYXR0cmlidXRlIHRvIHRoZSBkZXNpcmVkIGJhc2UgVVJMXG4gICAgYmFzZVRhZy5ocmVmID0gc3RyIC8vIFlvdSBjYW4gc2V0IHRoaXMgdG8gYW55IGJhc2UgVVJMXG4gICAgLy8gQXBwZW5kIHRoZSBiYXNlIGVsZW1lbnQgdG8gdGhlIGhlYWQgc2VjdGlvbiBvZiB0aGUgZG9jdW1lbnRcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGJhc2VUYWcpXG4gIH1cblxuICBjb25mb3JtUm91dGVDb25maWcoYWRkNDA0UHJvcHMgPSBmYWxzZSkge1xuICAgIC8qKlxuICAgICAqIFRISVMgTUVUSE9EIElTIFBSSU1BUklMWSBVU0VEIEZPUiBTUEEgR0VOIFNJVEUgR0VORVJBVElPTlxuICAgICAqL1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgX2NvbmZpZyA9IFNweW5lVXRpbHNDaGFubmVsUm91dGUuY29uZm9ybVJvdXRlT2JqZWN0KF9jb25maWcsIGFkZDQwNFByb3BzKVxuICB9XG5cbiAgc2V0Q2hhbm5lbHNNYXAoKSB7XG4gICAgY29uc3QgZ2V0U3RyZWFtID0gX2NoYW5uZWxzLmdldFN0cmVhbS5iaW5kKF9jaGFubmVscylcbiAgICBjb25zdCB0ZXN0U3RyZWFtID0gIF9jaGFubmVscy50ZXN0U3RyZWFtLmJpbmQoX2NoYW5uZWxzKVxuICAgIGNvbnN0IGdldFByb3h5U3ViamVjdCA9IF9jaGFubmVscy5nZXRQcm94eVN1YmplY3QuYmluZChfY2hhbm5lbHMpXG5cbiAgICBfY2hhbm5lbHNNYXAgPSB7IGdldFN0cmVhbSwgdGVzdFN0cmVhbSwgZ2V0UHJveHlTdWJqZWN0IH1cbiAgfVxuXG4gIHNldFByb3Aoa2V5LCB2YWwsIGlzVGVtcCA9IGZhbHNlKSB7XG4gICAgaWYgKGlzVGVtcCkge1xuICAgICAgX2NvbmZpZy5lcGhlbWVyYWxQcm9wc1trZXldID0gdmFsO1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgX2NvbmZpZy50bXBQcm9wc1trZXldID0gdmFsO1xuICAgIH1cbiAgICByZXR1cm4gIGtleTtcbiAgfVxuXG4gIGdldFByb3Aoa2V5KSB7XG4gICAgaWYgKF9jb25maWcuZXBoZW1lcmFsUHJvcHMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgY29uc3QgdGVtcFZhbCA9IF9jb25maWcuZXBoZW1lcmFsUHJvcHNba2V5XTtcbiAgICAgIGRlbGV0ZSBfY29uZmlnLmVwaGVtZXJhbFByb3BzW2tleV07XG4gICAgICByZXR1cm4gdGVtcFZhbDtcbiAgICB9XG4gICAgcmV0dXJuIF9jb25maWc/LnRtcFByb3BzPy5ba2V5XTtcbiAgfVxuXG4gIGNyZWF0ZVRlbXBQcm9wKHZhbHVlKSB7XG4gICAgY29uc3Qga2V5ID0gcmFuZG9tNkNoYXJzKCk7XG4gICAgdGhpcy5zZXRQcm9wKGtleSwgdmFsdWUsIHRydWUpOyAvLyBpc1RlbXAgPSB0cnVlXG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG5cbiAgc2V0Q2hhbm5lbENvbmZpZyhjaGFubmVsTmFtZSwgY29uZmlnKSB7XG4gICAgX2NvbmZpZy5jaGFubmVsc1tjaGFubmVsTmFtZV0gPSBjb25maWdcbiAgICByZXR1cm4gX2NvbmZpZy5jaGFubmVsc1tjaGFubmVsTmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgdG8gY2hlY2sgaW4gdGhlIGNvbnNvbGUgb3IgaW4gdGhlIGNvZGUgd2hhdCBhY3Rpb25zIGFyZSBhdmFpbGFibGUgdG8gYmUgbGlzdGVuZWQgdG8uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZVxuICAgKiBAcmV0dXJucyB7QXJyYXl9IEFuIGFycmF5IG9mIEFjdGlvbnMgdGhhdCBjYW4gYmUgbGlzdGVuZWQgdG9cbiAgICovXG4gIC8qICBnZXRDaGFubmVsQWN0aW9ucyhjaGFubmVsTmFtZSkge1xuICAgIHJldHVybiBfY2hhbm5lbHMuZ2V0Q2hhbm5lbEFjdGlvbnMoY2hhbm5lbE5hbWUpO1xuICB9ICovXG5cbiAgZ2V0Q2hhbm5lbENvbmZpZyhjaGFubmVsTmFtZSwgY29uZmlnID0gX2NvbmZpZykge1xuICAgIGlmIChjaGFubmVsTmFtZSA9PT0gJ0NIQU5ORUxfUk9VVEUnKSB7XG4gICAgICBjaGFubmVsTmFtZSA9ICdST1VURSdcbiAgICB9IGVsc2UgaWYgKGNoYW5uZWxOYW1lID09PSAnQ0hBTk5FTF9XSU5ET1cnKSB7XG4gICAgICBjaGFubmVsTmFtZSA9ICdXSU5ET1cnXG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZyA9PT0gdW5kZWZpbmVkIHx8IF9jb25maWcuY2hhbm5lbHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKCdTcHluZSB3YXJuaW5nOiBTcHluZSBjb25maWcgb2JqZWN0IGlzIGVtcHR5IScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaGFubmVsQ29uZmlnID0gX2NvbmZpZy5jaGFubmVsc1tjaGFubmVsTmFtZV1cblxuICAgIGlmIChjaGFubmVsQ29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgd2FybmluZzogU3B5bmUgY29uZmlndXJhdGlvbiBmb3IgY2hhbm5lbCwgJHtjaGFubmVsTmFtZX0gaXMgZW1wdHkhYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHJldHVybiBjaGFubmVsQ29uZmlnXG4gIH1cblxuICByZWdpc3RlckNoYW5uZWwoKSB7XG5cbiAgfVxuXG4gIGFkZFBsdWdpbkNvbmZpZyhwbHVnaW5OYW1lLCBwbHVnaW5Db25maWcgPSB7fSkge1xuICAgIGlmIChfY29uZmlnLnBsdWdpbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgX2NvbmZpZy5wbHVnaW5zID0ge31cbiAgICB9XG4gICAgdGhpcy5hZGRQbHVnaW5NZXRob2RzKHBsdWdpbkNvbmZpZy5wbHVnaW5NZXRob2RzKVxuXG4gICAgX2NvbmZpZy5wbHVnaW5zW3BsdWdpbk5hbWVdID0gcGx1Z2luQ29uZmlnXG4gIH1cblxuICBnZXRQbHVnaW5zTWV0aG9kT2JqKHBsdWdpbk1ldGhvZHNPYmopIHtcbiAgICBpZiAocGx1Z2luTWV0aG9kc09iaikge1xuICAgICAgdGhpcy5hZGRQbHVnaW5NZXRob2RzKHBsdWdpbk1ldGhvZHNPYmopXG4gICAgfVxuXG4gICAgcmV0dXJuIF9zcHluZVBsdWdpbk1ldGhvZHMucGx1Z2luTWV0aG9kc09ialxuICB9XG5cbiAgYWRkUGx1Z2luTWV0aG9kcyhwbHVnaW5NZXRob2RzKSB7XG4gICAgaWYgKHBsdWdpbk1ldGhvZHMpIHtcbiAgICAgIF9zcHluZVBsdWdpbk1ldGhvZHMuYWRkTWV0aG9kcyhwbHVnaW5NZXRob2RzKVxuICAgIH1cbiAgfVxuXG4gIGRvTm90VHJhY2tDaGFubmVsKGNoYW5uZWxOYW1lKSB7XG4gICAgX2RvTm90VHJhY2tDaGFubmVsc0Fyci5wdXNoKGNoYW5uZWxOYW1lKVxuICB9XG5cbiAgZ2V0VW50cmFja2VkQ2hhbm5lbHNMaXN0KCkge1xuICAgIHJldHVybiBfZG9Ob3RUcmFja0NoYW5uZWxzQXJyXG4gIH1cblxuICByZWdpc3RlclByb3h5UmV2aXZlcihuYW1lLCBtZXRob2QpIHtcbiAgICBfcHJveGllc01hcC5zZXQobmFtZSwgbWV0aG9kKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiUkVHSVNURVJEIFBST1hZIFJFVklWRVJcIixfcHJveGllc01hcCwgX3Byb3hpZXNNYXAuZ2V0KG5hbWUpKTtcbiAgfVxuXG4gIC8vIFRoaXMgaXMgdGhlIG5ldyBtZXRob2QgeW91IGFkZFxuICByZWdpc3RlclBsdWdpbihwbHVnaW5JbnN0YW5jZSkge1xuICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybignU3B5bmVBcHAgaXMgbm90IGluaXRpYWxpemVkIHlldC4gUGx1Z2luIHdpbGwgbm90IGJlIGZ1bGx5IHJlZ2lzdGVyZWQuJylcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coXCJJTlNUQU5DRSBcIix0aGlzLCBwbHVnaW5JbnN0YW5jZSlcblxuICAgIHBsdWdpbkluc3RhbmNlLnJlZ2lzdGVyKHRoaXMpXG4gIH1cblxuICBnZXRQcm94eVJldml2ZXIocHJveHlOYW1lKSB7XG4gICAgcmV0dXJuIF9wcm94aWVzTWFwLmdldChwcm94eU5hbWUpXG4gIH1cblxuICBnZXRQbHVnaW5Db25maWdCeVBsdWdpbk5hbWUocGx1Z2luTmFtZSkge1xuICAgIHJldHVybiBfY29uZmlnLnBsdWdpbnNbcGx1Z2luTmFtZV1cbiAgfVxuXG4gIGdldCBJTUdfUEFUSCgpIHtcbiAgICByZXR1cm4gX0lNR19QQVRIXG4gIH1cblxuICBnZXQgZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUoKSB7XG4gICAgcmV0dXJuIF9leGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZVxuICB9XG5cbiAgLy8gU2V0dGVyIGZvciBfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGVcbiAgc2V0IGV4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFB1c2ggYSBzaW5nbGUgc3RyaW5nIGludG8gdGhlIGFycmF5IGlmIG5vdCBhbHJlYWR5IHByZXNlbnRcbiAgICAgIGlmICghX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICBfZXhjbHVkZUNoYW5uZWxzRnJvbUNvbnNvbGUucHVzaCh2YWx1ZSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvLyBNZXJnZSBhbiBhcnJheSBpbnRvIHRoZSBleGlzdGluZyBhcnJheSwgYXZvaWRpbmcgZHVwbGljYXRlc1xuICAgICAgdmFsdWUuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyAmJiAhX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlLmluY2x1ZGVzKGl0ZW0pKSB7XG4gICAgICAgICAgX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIHZhbHVlIHByb3ZpZGVkIHRvIGV4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlLiBPbmx5IHN0cmluZ3Mgb3IgYXJyYXlzIGFyZSBhbGxvd2VkLicpXG4gICAgfVxuICB9XG5cbiAgZ2V0IGxpbmtzRGF0YSgpIHtcbiAgICBjb25zb2xlLndhcm4oJ2dldCBsaW5rcyBkYXRhIGluIFNweW5lQXBwUHJvcGVydGllcyBpcyBkZXByZWNhdGVkLCB1c2UgbmF2TGlua3MnKVxuICAgIHJldHVybiBfbmF2TGlua3NcbiAgfVxuXG4gIHNldCBsaW5rc0RhdGEoYXJyKSB7XG4gICAgY29uc29sZS53YXJuKCdzZXQgbGlua3MgZGF0YSBpbiBTcHluZUFwcFByb3BlcnRpZXMgaXMgZGVwcmVjYXRlZCwgdXNlIG5hdkxpbmtzJylcbiAgfVxuXG4gIGdldCBuYXZMaW5rcygpIHtcbiAgICByZXR1cm4gX25hdkxpbmtzXG4gIH1cblxuICBzZXQgbmF2TGlua3MoYXJyKSB7XG4gICAgX25hdkxpbmtzID0gYXJyXG4gIH1cblxuICBnZXQgZW5hYmxlQ01TUHJveGllcygpe1xuICAgIHJldHVybiBfZW5hYmxlQ01TUHJveGllc1xuICB9XG5cbiAgZ2V0SHJlZkZyb21EYXRhKHJvdXRlUHJvcHM9e30pe1xuXG4gICAgcmV0dXJuIFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY29udmVydFBhcmFtc1RvUm91dGUocm91dGVQcm9wcyk7XG5cbiAgfVxuXG4gIHNldCBlbmFibGVDTVNQcm94aWVzKGJvb2w9dHJ1ZSl7XG4gICAgX2VuYWJsZUNNU1Byb3hpZXMgPSBCb29sZWFuKGJvb2wpO1xuICB9XG5cbiAgc2V0Q01TUHJveHlNZXRob2QoZm4pe1xuICAgIHRoaXMuZW5hYmxlQ01TUHJveGllcyA9IHRydWU7XG4gICAgdGhpcy5mb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YSA9IGZuO1xuXG4gIH1cblxuICB0ZW1wR2V0Q2hhbm5lbHNJbnN0YW5jZSgpIHtcblxuICB9XG5cbiAgdGVtcEdldENvbmZpZygpIHtcblxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBTcHluZUFwcFByb3BlcnRpZXMgPSBuZXcgU3B5bmVBcHBQcm9wZXJ0aWVzQ2xhc3MoKVxuIiwiaW1wb3J0IHsgYWxsUGFzcywgY29tcG9zZSwgaXMsIGtleXMsIG5vdCwgcHJvcCB9IGZyb20gJ3JhbWRhJ1xuXG5jb25zdCBfcGx1Z2luTWV0aG9kc09iaiA9IE9iamVjdC5jcmVhdGUoe30pXG5cbmNvbnN0IGlzTm90QXJyID0gY29tcG9zZShub3QsIGlzKEFycmF5KSlcbi8vIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKG5vdCwgaXNFbXB0eSlcbi8vIGNvbnN0IGlzTm9uRW1wdHlTdHIgPSBhbGxQYXNzKFtpcyhTdHJpbmcpLCBpc05vdEVtcHR5XSlcbi8vIGNvbnN0IGlzTm9uRW1wdHlBcnIgPSBhbGxQYXNzKFtpcyhBcnJheSksIGlzTm90RW1wdHldKVxuY29uc3QgaXNPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcbi8vIGNvbnN0IGlzTm9uRW1wdHlPYmplY3RGbiA9IGNvbXBvc2UoYWxsUGFzcyhbaXNOb3RFbXB0eSwgaXNOb3RBcnIsIGlzKE9iamVjdCldKSlcblxuZXhwb3J0IGNsYXNzIFNweW5lUGx1Z2luc01ldGhvZHMge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBfcGx1Z2luTWV0aG9kc09iai5mb28gPSAoKSA9PiBjb25zb2xlLmxvZygndXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4nKVxuICB9XG5cbiAgYWRkTWV0aG9kKGtleSwgZm4sIHRlc3QgPSBmYWxzZSkge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoX3BsdWdpbk1ldGhvZHNPYmosIGtleSkgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHdhcm5TdHIgPSBgU3B5bmUgV2FybmluZzogdGhlIG1ldGhvZCBuYW1lLCAke2tleX0sIGFscmVhZHkgZXhpc3RzLmBcbiAgICAgIGlmICh0ZXN0KSB7XG4gICAgICAgIHJldHVybiB3YXJuU3RyXG4gICAgICB9XG4gICAgICBjb25zb2xlLndhcm4od2FyblN0cilcbiAgICB9IGVsc2Uge1xuICAgICAgX3BsdWdpbk1ldGhvZHNPYmpba2V5XSA9IGZuXG4gICAgfVxuICB9XG5cbiAgYWRkTWV0aG9kcyhtZXRob2RzT2JqID0ge30sIHRlc3QgPSBmYWxzZSkge1xuICAgIGxldCB3YXJuU3RyXG5cbiAgICBjb25zdCBpc09iaiA9IGlzT2JqZWN0Rm4obWV0aG9kc09iailcblxuICAgIGlmIChpc09iaiA9PT0gZmFsc2UpIHtcbiAgICAgIHdhcm5TdHIgPSBgU3B5bmUgV2FybmluZzogdGhlIHBsdWdpbk1ldGhvZHMgcHJvcGVydHksICR7SlNPTi5zdHJpbmdpZnkobWV0aG9kc09iail9IG5lZWRzIHRvIGJlIGFuIG9iamVjdC5gXG4gICAgICBpZiAodGVzdCkge1xuICAgICAgICByZXR1cm4gd2FyblN0clxuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKHdhcm5TdHIpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjaGVja0VhY2hLZXlGb3JWYWxpZE1ldGhvZCA9IChrZXlTdHIpID0+IHtcbiAgICAgIGNvbnN0IG1ldGhvZFZhbCA9IHByb3Aoa2V5U3RyLCBtZXRob2RzT2JqKVxuXG4gICAgICBjb25zdCBpc0Z1bmN0aW9uID0gdHlwZW9mIChtZXRob2RWYWwpID09PSAnZnVuY3Rpb24nXG5cbiAgICAgIGlmIChpc0Z1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuYWRkTWV0aG9kKGtleVN0ciwgbWV0aG9kVmFsLCB0ZXN0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2FyblN0ciA9IGB0aGUgdmFsdWUgZm9yICR7a2V5U3RyfSBpcyBub3QgYSB2YWxpZCBmdW5jdGlvbi5gXG4gICAgICAgIGlmICh0ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuIHdhcm5TdHJcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4od2FyblN0cilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG1ldGhvZEtleXMgPSBrZXlzKG1ldGhvZHNPYmopXG5cbiAgICByZXR1cm4gbWV0aG9kS2V5cy5tYXAoY2hlY2tFYWNoS2V5Rm9yVmFsaWRNZXRob2QpLmpvaW4oJywnKVxuICB9XG5cbiAgY2hlY2tJZk1ldGhvZEV4aXN0cyhrZXkpIHtcblxuICB9XG5cbiAgZ2V0IHBsdWdpbk1ldGhvZHNPYmooKSB7XG4gICAgcmV0dXJuIF9wbHVnaW5NZXRob2RzT2JqXG4gIH1cbn1cbiIsImltcG9ydCB7IGdldEFsbE1ldGhvZE5hbWVzIH0gZnJvbSAnLi9mcnAtdG9vbHMuanMnXG5pbXBvcnQgeyByZWplY3QsIGN1cnJ5TiwgX18sIG1hcCB9IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVUcmFpdCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFNweW5lVHJhaXRcbiAgICogQHR5cGUgZXh0ZW5kYWJsZVxuICAgKiBAcGFyYW0ge3RoaXN9IHBhcmVudENvbnRleHRcbiAgICogQHBhcmFtIHtTdHJpbmd9IHByZWZpeFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGF1dG9Jbml0XG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcHJvcGVydHkge3RoaXN9IHBhcmVudENvbnRlbnQgLSA9IHVuZGVmaW5lZDsgVGhpcyBiaW5kcyBhbGwgbWV0aG9kcyB3aXRoaW4gU3B5bmVUcmFpdCBpbnRvIHRoZSBwYXJlbnRDb250ZXh0J3Mgb2JqZWN0XG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBwcmVmaXggLSA9IHVuZGVmaW5lZDsgU3B5bmVUcmFpdHMgZm9yY2VzIGFsbCBtZXRob2QgbmFtZXMgdG8gYmVnaW4gd2l0aCB0aGUgc2FtZSBwcmVmaXguIFRoaXMgYWxsb3dzIG90aGVyIG9iamVjdHMgdG8gcXVpY2tseSB1bmRlcnN0YW5kIHdoZXJlIHRoZSBvcmlnaW5hbCBtZXRob2QgaXMgc2V0LlxuICAgKiBAZGVzY1xuICAgKiBTcHluZVRyYWl0cyBhbGxvdyB0aGUgZWhhbmNpbmcgb2YgY2xhc3NlcyBhbmQgb3RoZXIgb2JqZWN0cyB3aXRob3V0IGhhdmluZyB0byBleHRlbmQgY2xhc3NlcyBvciBtYW5pcHVsYXRlIGZ1bmN0aW9uIHByb3RvdHlwZXNcbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IocGFyZW50Q29udGV4dCwgcHJlZml4ID0gJycsIGF1dG9Jbml0ID0gdHJ1ZSkge1xuICAgIHRoaXMucGFyZW50Q29udGV4dCA9IHBhcmVudENvbnRleHRcbiAgICB0aGlzLm9taXR0ZWRNZXRob2RzID0gW1xuICAgICAgJ2F1dG9CaW5kZXInLFxuICAgICAgJ2luaXRBdXRvQmluZGVyJyxcbiAgICAgICdnZXRFbmhhbmNlck1ldGhvZHMnLFxuICAgICAgJ2NoZWNrRm9yTWFsZm9ybWVkTWV0aG9kcycsXG4gICAgICAnY2FsbGVyJyxcbiAgICAgICdhcmd1bWVudHMnLFxuICAgICAgJ2JpbmRQYXJlbnRWaWV3U3RyZWFtJ11cblxuICAgIHRoaXMucHJlZml4ID0gcHJlZml4XG5cbiAgICBpZiAoYXV0b0luaXQgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuYXV0b0JpbmRlcigpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFsbE1ldGhvZHNMaXN0XG4gIH1cblxuICBpbml0QXV0b0JpbmRlcigpIHtcbiAgICB0aGlzLmF1dG9CaW5kZXIoKVxuICB9XG5cbiAgZ2V0RW5oYW5jZXJNZXRob2RzKCkge1xuICAgIHJldHVybiBnZXRBbGxNZXRob2ROYW1lcyh0aGlzLCB0aGlzLm9taXR0ZWRNZXRob2RzKVxuICB9XG5cbiAgY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzKG1ldGhvZHNBcnIpIHtcbiAgICBpZiAodGhpcy5wcmVmaXggPT09ICcnKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNQWU5FIFdBUk5JTkc6IFRoZSBmb2xsb3dpbmcgU3B5bmVUcmFpdCAke3RoaXMuY29uc3RydWN0b3IubmFtZX0gbmVlZHMgYSBwcmVmaXhgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIC8vIGxldCByZVN0ciA9IGBeKCR7dGhpcy5wcmVmaXh9KSguKikkYDtcbiAgICAvLyBsZXQgcmUgPSBuZXcgUmVnRXhwKHJlU3RyKTtcbiAgICBjb25zdCBoYXNQcmVmaXggPSAoc3RyKSA9PiBzdHIuaW5kZXhPZih0aGlzLnByZWZpeCkgPT09IDBcblxuICAgIGNvbnN0IG1hbGZvcm1lZE1ldGhvZHNBcnIgPSByZWplY3QoaGFzUHJlZml4LCBtZXRob2RzQXJyKVxuICAgIGlmIChtYWxmb3JtZWRNZXRob2RzQXJyLmxlbmd0aCA+PSAxKSB7XG4gICAgICBjb25zdCB3YXJuaW5nU3RyID0gYFNweW5lIFdhcm5pbmc6IFRoZSBmb2xsb3dpbmcgbWV0aG9kKHMpIGluICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSByZXF1aXJlIHRoZSBwcmVmaXgsIFwiJHt0aGlzLnByZWZpeH1cIjogWyR7bWFsZm9ybWVkTWV0aG9kc0Fyci5qb2luKCcsICcpfV07YFxuICAgICAgY29uc29sZS53YXJuKHdhcm5pbmdTdHIpXG4gICAgfVxuICB9XG5cbiAgYmluZFBhcmVudFZpZXdTdHJlYW0obWV0aG9kc09iaiwgY29udGV4dCkge1xuICAgIHRoaXMuY2hlY2tGb3JNYWxmb3JtZWRNZXRob2RzKG1ldGhvZHNPYmouYWxsTWV0aG9kcylcbiAgICBjb25zdCBvYmogPSB7fVxuICAgIGNvbnN0IGJpbmRNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtID0gKHN0ciwgaXNTdGF0aWMgPSBmYWxzZSkgPT4ge1xuICAgICAgY29uc3QgY29uc3RydWN0b3JUeXBlID0gaXNTdGF0aWMgPT09IHRydWUgPyB0aGlzLmNvbnN0cnVjdG9yIDogdGhpc1xuICAgICAgY29uc3QgcHJvcGVydHlUeXBlID0gdHlwZW9mIChjb25zdHJ1Y3RvclR5cGVbc3RyXSlcbiAgICAgIGlmIChwcm9wZXJ0eVR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb2JqW3N0cl0gPSBjb250ZXh0W3N0cl0gPSBjb25zdHJ1Y3RvclR5cGVbc3RyXS5iaW5kKGNvbnRleHQpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYmluZEN1cnJ5ID0gY3VycnlOKDIsIGJpbmRNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtKVxuICAgIGNvbnN0IGJpbmRTdGF0aWNNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtID0gYmluZEN1cnJ5KF9fLCB0cnVlKVxuICAgIC8vIE1BUCBTVEFUSUMgTUVUSE9EU1xuICAgIG1hcChiaW5kU3RhdGljTWV0aG9kc1RvUGFyZW50Vmlld1N0cmVhbSwgbWV0aG9kc09iai5zdGF0aWNNZXRob2RzKVxuICAgIC8vIE1BUCBNQUlOIE1FVEhPRFNcbiAgICBtYXAoYmluZE1ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0sIG1ldGhvZHNPYmoubWV0aG9kcylcbiAgICByZXR1cm4gb2JqXG4gIH1cblxuICBhdXRvQmluZGVyKCkge1xuICAgIGNvbnN0IGFsbE1ldGhvZHMgPSB0aGlzLmdldEVuaGFuY2VyTWV0aG9kcygpXG4gICAgLy8gY29uc29sZS5sb2coJ2FsbCAnLGFsbE1ldGhvZHMpO1xuICAgIHRoaXMuYWxsTWV0aG9kc0xpc3QgPSB0aGlzLmJpbmRQYXJlbnRWaWV3U3RyZWFtKGFsbE1ldGhvZHMsIHRoaXMucGFyZW50Q29udGV4dClcbiAgICByZXR1cm4gdGhpcy5hbGxNZXRob2RzTGlzdFxuICB9XG59XG4iLCJpbXBvcnQgeyBpc0VtcHR5LCBoZWFkLCB2YWx1ZXMsIGNvbXBvc2UsIHByb3AsIGNvbXBsZW1lbnQsIGlzTmlsLCBhbGxQYXNzLCByZWR1Y2UsIGZpbHRlciwgZXF1YWxzLCB0b1BhaXJzLCByZXBsYWNlLCBlaXRoZXIsIHByb3BFcSwgX18sIGludmVydCwgcGF0aCwgemlwT2JqLCByZWplY3QsIGtleXMsIGZpbmQsIGFzc29jLCBpcywgaGFzLCB3aGVuLCBzcGxpdCwgYWx3YXlzLCBjb25jYXQsIGpvaW4sIGZsYXR0ZW4sIG1hcCwgaWZFbHNlLCB0ZXN0LCBmaW5kTGFzdEluZGV4LCBsYXN0LCBkZWZhdWx0VG8sIGZyb21QYWlycyB9IGZyb20gJ3JhbWRhJ1xuaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi9zcHluZS1hcHAtcHJvcGVydGllcy5qcydcblxuZXhwb3J0IGNsYXNzIFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvKipcbiAgICAgKiBAbW9kdWxlIFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmxcbiAgICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGRlc2NcbiAgICAgKiBJbnRlcm5hbCB1cmwgbWV0aG9kcyBmb3IgdGhlIFNweW5lUm91dGVDaGFubmVsXG4gICAgICovXG4gICAgdGhpcy5jaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsLmJpbmQodGhpcylcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsKG9iaikge1xuICAgIGNvbnN0IGlzTm90RW1wdHkgPSBjb21wb3NlKGNvbXBsZW1lbnQoaXNFbXB0eSksIGhlYWQsIHZhbHVlcylcbiAgICBjb25zdCBpc05vdE5pbCA9IGNvbXBvc2UoY29tcGxlbWVudChpc05pbCksIGhlYWQsIHZhbHVlcylcbiAgICBjb25zdCBpc05vdE5pbEFuZElzTm90RW1wdHkgPSBhbGxQYXNzKFtpc05vdEVtcHR5LCBpc05vdE5pbF0pXG4gICAgcmV0dXJuIGlzTm90TmlsQW5kSXNOb3RFbXB0eShvYmopXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZlBhcmFtVmFsdWVNYXRjaGVzUmVnZXgocGFyYW1WYWx1ZSwgcm91dGVPYmopIHtcbiAgICBjb25zdCByZWplY3RQYXJhbUtleSA9IHJlamVjdChlcXVhbHMoJ3JvdXRlTmFtZScpKVxuICAgIGNvbnN0IGtleXNBcnIgPSBjb21wb3NlKHJlamVjdFBhcmFtS2V5LCBrZXlzKVxuICAgIGNvbnN0IHRlc3RGb3JSZWdleE1hdGNoID0gc3RyID0+IHRlc3QobmV3IFJlZ0V4cChzdHIpLCBwYXJhbVZhbHVlKVxuICAgIGNvbnN0IGNoZWNrZXIgPSBjb21wb3NlKGZpbmQodGVzdEZvclJlZ2V4TWF0Y2gpLCBrZXlzQXJyKVxuICAgIGNvbnN0IHJlZ2V4TWF0Y2hTdHIgPSBjaGVja2VyKHJvdXRlT2JqKVxuICAgIGlmIChpcyhTdHJpbmcsIHJlZ2V4TWF0Y2hTdHIpKSB7XG4gICAgICByb3V0ZU9iaiA9IGFzc29jKHBhcmFtVmFsdWUsIHByb3AocmVnZXhNYXRjaFN0ciwgcm91dGVPYmopLCByb3V0ZU9iailcbiAgICB9XG4gICAgcmV0dXJuIHJvdXRlT2JqXG4gIH1cblxuICBzdGF0aWMgZm9ybWF0U3RyQXNXaW5kb3dMb2NhdGlvbihzdHIpIHtcbiAgICBjb25zdCBoYXNoID0gc3RyXG4gICAgY29uc3Qgc2VhcmNoID0gc3RyXG4gICAgY29uc3QgcGF0aG5hbWUgPSBzdHJcbiAgICByZXR1cm4geyBoYXNoLCBzZWFyY2gsIHBhdGhuYW1lIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhdGlvblN0ckJ5VHlwZSh0LCBpc0hhc2ggPSBmYWxzZSwgbG9jID0gd2luZG93LmxvY2F0aW9uKSB7XG4gICAgY29uc3QgdHlwZSA9IGlzSGFzaCA9PT0gdHJ1ZSA/ICdoYXNoJyA6IHRcblxuICAgIGNvbnN0IHR5cGVNYXAgPSB7XG4gICAgICBzbGFzaDogJ3BhdGhuYW1lJyxcbiAgICAgIHF1ZXJ5OiAnc2VhcmNoJyxcbiAgICAgIGhhc2g6ICdoYXNoJ1xuICAgIH1cbiAgICBjb25zdCBwcm9wVmFsID0gdHlwZU1hcFt0eXBlXVxuICAgIGNvbnN0IHN0ciAgPSBwcm9wKHByb3BWYWwsIGxvYylcbiAgICBjb25zdCBjaGVja0ZvclNsYXNoQW5kSGFzaCA9IC9eKFxcLyk/KCMpPyhcXC8pPyguKikkL1xuICAgIC8vIGNvbnNvbGUubG9nKFwiREFUQSBMT0MgU1RSIFwiLHtzdHIsIGxvYywgcHJvcCwgdHlwZSxpc0hhc2h9KTtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoY2hlY2tGb3JTbGFzaEFuZEhhc2gsICckNCcpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUm91dGVBcnJheUZyb21QYXJhbXMoZGF0YSwgcm91dGUsIHQgPSAnc2xhc2gnLCBwYXJhbXNGcm9tTG9jKSB7XG4gICAgY29uc3QgdXJsQXJyID0gW11cbiAgICBjb25zdCBsb29wVGhyb3VnaFBhcmFtID0gKHJvdXRlT2JqKSA9PiB7XG4gICAgICBjb25zdCB1cmxPYmogPSB7fVxuICAgICAgY29uc3Qga2V5d29yZCA9IHJvdXRlT2JqLnJvdXRlTmFtZSAvLyBQQVJBTSBGT1JNIFNQWU5FIENPTkZJR1xuICAgICAgbGV0IHBhcmFtVmFsRnJvbURhdGEgPSBkYXRhW2tleXdvcmRdICE9PSB1bmRlZmluZWQgPyBkYXRhW2tleXdvcmRdIDogcHJvcChrZXl3b3JkLCBwYXJhbXNGcm9tTG9jKSAvLyBQVUxMIFZBTFVFIEZPUiBUSElTIFBBUkFNIEZST00gREFUQVxuICAgICAgY29uc3QgcGFyYW1WYWxUeXBlID0gdHlwZW9mIChyb3V0ZU9ialtwYXJhbVZhbEZyb21EYXRhXSlcblxuICAgICAgaWYgKHBhcmFtVmFsVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcGFyYW1WYWxGcm9tRGF0YSA9IHJvdXRlT2JqW3BhcmFtVmFsRnJvbURhdGFdXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtVmFsVHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcm91dGVPYmogPSB0aGlzLmNoZWNrSWZQYXJhbVZhbHVlTWF0Y2hlc1JlZ2V4KHBhcmFtVmFsRnJvbURhdGEsIHJvdXRlT2JqKVxuICAgICAgfVxuXG4gICAgICB1cmxPYmpba2V5d29yZF0gPSBwYXJhbVZhbEZyb21EYXRhXG5cbiAgICAgIGlmICh0aGlzLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWwodXJsT2JqKSkge1xuICAgICAgICB1cmxBcnIucHVzaCh1cmxPYmopXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzT2JqZWN0ID0gaXMoT2JqZWN0LCByb3V0ZU9iailcbiAgICAgIGNvbnN0IG9iamVjdFBhcmFtRXhpc3RzID0gaGFzKHBhcmFtVmFsRnJvbURhdGEsIHJvdXRlT2JqKVxuICAgICAgY29uc3Qgb2JqZWN0Q29udGFpbnNSb3V0ZSA9IGhhcygncm91dGVQYXRoJywgcm91dGVPYmopXG4gICAgICBjb25zdCByZWN1cnNpdmVseUNhbGxMb29wQm9vbCA9IG9iamVjdFBhcmFtRXhpc3RzICYmIGlzT2JqZWN0XG4gICAgICBpZiAocmVjdXJzaXZlbHlDYWxsTG9vcEJvb2wgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgbmV3T2JqID0gcm91dGVPYmpbcGFyYW1WYWxGcm9tRGF0YV1cbiAgICAgICAgaWYgKGhhcygncm91dGVQYXRoJywgbmV3T2JqKSkge1xuICAgICAgICAgIGxvb3BUaHJvdWdoUGFyYW0obmV3T2JqLnJvdXRlUGF0aClcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvYmplY3RDb250YWluc1JvdXRlID09PSB0cnVlICYmIHBhcmFtVmFsRnJvbURhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsb29wVGhyb3VnaFBhcmFtKHJvdXRlT2JqLnJvdXRlUGF0aClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb29wVGhyb3VnaFBhcmFtKHJvdXRlKVxuXG4gICAgcmV0dXJuIHVybEFyclxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVNsYXNoU3RyaW5nKGFycikge1xuICAgIGNvbnN0IGFyckNsZWFyID0gcmVqZWN0KGlzTmlsKVxuICAgIGNvbnN0IG5vdFVuZGVmaW5lZCA9IHdoZW4oY29tcGxlbWVudChpc05pbCwgX18pLCBqb2luKCcvJykpXG4gICAgY29uc3Qgc3RyaXBSZWdleCA9IHJlcGxhY2UoL14oXFxeKikoLip8XlxcJCkoXFwkKSQvLCAnJDInKVxuICAgIGNvbnN0IGpvaW5lciA9IGNvbXBvc2Uoc3RyaXBSZWdleCwgbm90VW5kZWZpbmVkLCBhcnJDbGVhciwgZmxhdHRlbiwgbWFwKHZhbHVlcykpXG4gICAgcmV0dXJuIGpvaW5lcihhcnIpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUXVlcnlTdHJpbmcoYXJyKSB7XG4gICAgY29uc3QgYXJyQ2xlYXIgPSByZWplY3QoaXNOaWwpXG5cbiAgICBjb25zdCBpc05vdE5pbEFuZElzTm90RW1wdHkgPSB0aGlzLmNoZWNrSWZPYmpJc05vdEVtcHR5T3JOaWxcblxuICAgIGNvbnN0IGNyZWF0ZVBhaXIgPSBjb21wb3NlKFxuICAgICAgam9pbignPScpLFxuICAgICAgZmxhdHRlbixcbiAgICAgIHRvUGFpcnMpXG5cbiAgICBjb25zdCBjaGVja1BhaXIgPSBpZkVsc2UoXG4gICAgICBpc05vdE5pbEFuZElzTm90RW1wdHksXG4gICAgICBjcmVhdGVQYWlyLFxuICAgICAgYWx3YXlzKHVuZGVmaW5lZClcbiAgICApXG5cbiAgICBjb25zdCBtYXBBcnJheU9mUGFpcnMgPSBtYXAoY2hlY2tQYWlyKVxuXG4gICAgY29uc3QgY2hlY2tJZlN0cklzRW1wdHkgPSB3aGVuKFxuICAgICAgY29tcGxlbWVudChpc0VtcHR5KSxcbiAgICAgIGNvbmNhdCgnPycpKVxuXG4gICAgY29uc3QgY3JlYXRlUXMgPSBjb21wb3NlKFxuICAgICAgY2hlY2tJZlN0cklzRW1wdHksXG4gICAgICBqb2luKCcmJyksXG4gICAgICBhcnJDbGVhcixcbiAgICAgIG1hcEFycmF5T2ZQYWlycylcblxuICAgIHJldHVybiBjcmVhdGVRcyhhcnIpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tQYXlsb2FkRm9yUmVnZXhPdmVycmlkZXModXJsc0FyciwgZGF0YSwgcGFyc2VTdHJpbmcgPSAnVmFsdWUnKSB7XG4gICAgLy8gQ0hFQ0sgSUYgUEFZTE9BRCBIQVMgQU5ZIE9WRVJSSURFU1xuICAgIGNvbnN0IGdldFByb3BWYWxPdmVycmlkZSA9IChrZXkpID0+IHByb3AoYCR7a2V5fSR7cGFyc2VTdHJpbmd9YCwgZGF0YSlcblxuICAgIC8vIEdFVCBBTlkgUE9TU0lCTEUgVkFMVUUgVVNJTkcgVEhFIENVUlJFTlQgS0VZXG4gICAgY29uc3QgZ2V0T3ZlcnJpZGVWYWwgPSBjb21wb3NlKGdldFByb3BWYWxPdmVycmlkZSwgaGVhZCwga2V5cylcblxuICAgIC8vIE1BUCBBTEwgT0JKRUNUIFZBTFMgVE8gVEVTVCBGT1IgT1ZFUlJJREVTXG4gICAgY29uc3QgbWFwVXJsUHJvcHMgPSAocHJvcCkgPT4ge1xuICAgICAgY29uc3Qgb3ZlcnJpZGVWYWwgPSBnZXRPdmVycmlkZVZhbChwcm9wKVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIm92ZXJyaWRlIHZhbCBcIixvdmVycmlkZVZhbCwgZGF0YSk7XG4gICAgICAvLyBpZiByZWdleCB2YWx1ZSBpcyBmb3VuZFxuICAgICAgaWYgKG92ZXJyaWRlVmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGFzc29jKGNvbXBvc2UoaGVhZCwga2V5cykocHJvcCksIG92ZXJyaWRlVmFsLCBwcm9wKVxuICAgICAgfVxuICAgICAgLy8gaWRlbnRpdHlcbiAgICAgIHJldHVybiBwcm9wXG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcChtYXBVcmxQcm9wcywgdXJsc0FycilcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclJvdXRlVmFsV2l0aE11bHRpcGxlVmFscyh1cmxzQXJyKSB7XG4gICAgLy8gRGVmaW5lIHRoZSBpbnRlcm5hbCBtZXRob2QgdG8gZXh0cmFjdCB0aGUgc3RyaW5nIGJlZm9yZSB0aGUgcGlwZVxuICAgIGNvbnN0IGdldFN0cmluZ0JlZm9yZVBpcGUgPSAoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goL15bXnxdKi8pXG4gICAgICByZXR1cm4gbWF0Y2ggPyAobWF0Y2hbMF0gPT09ICdeJCcgPyAnJyA6IG1hdGNoWzBdKSA6IGlucHV0XG4gICAgfVxuXG4gICAgY29uc3QgbWFwVXJsQXJyT2JqID0gKG9iaikgPT4ge1xuICAgICAgY29uc3QgcGlwZVJlZHVjZXIgPSAoYWNjLCBrZXkpID0+IHtcbiAgICAgICAgYWNjW2tleV0gPSBnZXRTdHJpbmdCZWZvcmVQaXBlKG9ialtrZXldKVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvYmogPSBPYmplY3Qua2V5cyhvYmopLnJlZHVjZShwaXBlUmVkdWNlciwge30pXG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodXJsc0FycikgPT09IHRydWUpIHtcbiAgICAgIHJldHVybiB1cmxzQXJyLm1hcChtYXBVcmxBcnJPYmopXG4gICAgfVxuXG4gICAgcmV0dXJuIHVybHNBcnJcbiAgfVxuXG4gIHN0YXRpYyBjaGVja0ZvclJvdXRlVmFsc1BhcnRNYXRjaCh1cmxzQXJyLCBkYXRhID0ge30pIHtcbiAgICAvKipcbiAgICAgKiAxLiBMb29wIHRocm91Z2ggdXJsc0FyclxuICAgICAqIDIuIExvb3AgdGhyb3VnaCBwcm9wZXJ0aWVzXG4gICAgICogMy4gQXBwbHkgbWF0Y2hHbG9iUGF0dGVybiB0byBlYWNoIHByb3BlcnR5IHZhbHVlIGFuZCBjaGVjayBmb3IgbWF0Y2ggd2l0aCBkYXRhIG9iamVjdCBwcm9wZXJ0eVxuICAgICAqIDQuIFJldHVybiB0aGUgdXBkYXRlZCBvYmplY3Qgd2l0aCBtYXRjaGVkIHZhbHVlcywgb3Iga2VlcCB0aGUgb3JpZ2luYWwgcGF0dGVybiBpZiBubyBtYXRjaFxuICAgICAqL1xuXG4gICAgY29uc3QgbWF0Y2hHbG9iUGF0dGVybiA9IChzdHIsIGdsb2JQYXR0ZXJuKSA9PiB7XG4gICAgICBjb25zdCBnbG9iUGF0dGVybk1hdGNoID0gKHBhdHRlcm4sIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVzY2FwZWRQYXR0ZXJuID0gcGF0dGVyblxuICAgICAgICAgIC5yZXBsYWNlKC9bLS9cXFxcXiQrPy4oKXxbXFxde31dL2csICdcXFxcJCYnKSAvLyBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgICAgICAgLnJlcGxhY2UoL1xcKi9nLCAnW1xcXFx3XFxcXGRfLV0qJykgLy8gKiBzaG91bGQgbWF0Y2ggYW55IHNlcXVlbmNlIG9mIGFscGhhbnVtZXJpYywgdW5kZXJzY29yZXMsIG9yIGRhc2hlc1xuXG4gICAgICAgIGNvbnN0IHJlZ2V4UGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke2VzY2FwZWRQYXR0ZXJufSRgKSAvLyBNYXRjaCB0aGUgZnVsbCBzdHJpbmdcbiAgICAgICAgcmV0dXJuIHJlZ2V4UGF0dGVybi50ZXN0KHZhbHVlKVxuICAgICAgfVxuXG4gICAgICAvLyBTcGxpdCB0aGUgZ2xvYlBhdHRlcm4gYnkgcGlwZSAofClcbiAgICAgIGNvbnN0IHBhdHRlcm5zID0gZ2xvYlBhdHRlcm4uc3BsaXQoJ3wnKVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgc3RyaW5nIG1hdGNoZXMgYW55IG9mIHRoZSBwYXR0ZXJuc1xuICAgICAgY29uc3QgaGFzTWF0Y2ggPSBwYXR0ZXJucy5zb21lKChwYXR0ZXJuKSA9PiBnbG9iUGF0dGVybk1hdGNoKHBhdHRlcm4sIHN0cikpXG5cbiAgICAgIC8vIFJldHVybiB0aGUgc3RyaW5nIGlmIHRoZXJlJ3MgYSBtYXRjaCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZ2xvYiBwYXR0ZXJuXG4gICAgICByZXR1cm4gaGFzTWF0Y2ggPyBzdHIgOiBnbG9iUGF0dGVyblxuICAgIH1cblxuICAgIC8vIEZ1bmN0aW9uIHRvIGNoZWNrIGFuZCByZXBsYWNlIG1hdGNoaW5nIHByb3BlcnRpZXNcbiAgICBjb25zdCByZXBsYWNlTWF0Y2hpbmdQcm9wZXJ0eSA9IChvYmopID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRPYmogPSB7IC4uLm9iaiB9IC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIG9iamVjdCB0byBhdm9pZCBtdXRhdGlvblxuXG4gICAgICAvLyBGdW5jdGlvbiB0byBjaGVjayBlYWNoIHByb3BlcnR5IGFuZCBhcHBseSBtYXRjaEdsb2JQYXR0ZXJuXG4gICAgICBjb25zdCBjaGVja0FuZFJlcGxhY2VQcm9wZXJ0eSA9IChrZXkpID0+IHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh1cGRhdGVkT2JqLCBrZXkpICYmIGRhdGFba2V5XSkge1xuICAgICAgICAgIHVwZGF0ZWRPYmpba2V5XSA9IG1hdGNoR2xvYlBhdHRlcm4oZGF0YVtrZXldLCB1cGRhdGVkT2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3RcbiAgICAgIE9iamVjdC5rZXlzKHVwZGF0ZWRPYmopLmZvckVhY2goY2hlY2tBbmRSZXBsYWNlUHJvcGVydHkpXG5cbiAgICAgIHJldHVybiB1cGRhdGVkT2JqXG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBhcnJheSBhbmQgcmVwbGFjZSBtYXRjaGluZyBwcm9wZXJ0aWVzXG4gICAgcmV0dXJuIHVybHNBcnIubWFwKHJlcGxhY2VNYXRjaGluZ1Byb3BlcnR5KVxuICB9XG5cbiAgc3RhdGljIGNvbnZlcnRQYXJhbXNUb1JvdXRlKGRhdGEsIHIgPSBTcHluZUFwcFByb3BlcnRpZXMuY29uZmlnLmNoYW5uZWxzLlJPVVRFLCB0LCBsb2NTdHIpIHtcbiAgICBjb25zdCB1cmxUeXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHIudHlwZVxuICAgIGNvbnN0IGlzSGFzaCA9IHIuaXNIYXNoXG4gICAgY29uc3Qgcm91dGUgPSByLnJvdXRlcy5yb3V0ZVBhdGhcbiAgICBjb25zdCBsb2NhdGlvblN0ciA9IGxvY1N0ciAhPT0gdW5kZWZpbmVkID8gbG9jU3RyIDogdGhpcy5nZXRMb2NhdGlvblN0ckJ5VHlwZSh1cmxUeXBlLCBpc0hhc2gpXG4gICAgY29uc3QgcGFyYW1zRnJvbUN1cnJlbnRMb2NhdGlvbiA9IHRoaXMuY29udmVydFJvdXRlVG9QYXJhbXMobG9jYXRpb25TdHIsIHIsIHVybFR5cGUpLnJvdXRlRGF0YVxuICAgIGxldCB1cmxBcnIgPSB0aGlzLmNyZWF0ZVJvdXRlQXJyYXlGcm9tUGFyYW1zKGRhdGEsIHJvdXRlLCB1cmxUeXBlLCBwYXJhbXNGcm9tQ3VycmVudExvY2F0aW9uKVxuXG4gICAgdXJsQXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja1BheWxvYWRGb3JSZWdleE92ZXJyaWRlcyh1cmxBcnIsIGRhdGEpXG4gICAgdXJsQXJyID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybC5jaGVja0ZvclJvdXRlVmFsV2l0aE11bHRpcGxlVmFscyh1cmxBcnIpXG4gICAgLy8gVEhJUyBXSUxMIE1BVENIIEVYQUNUTFkgVEhFIFBST1BFUlRZIElELCBTTyBwYWdlSWQ9XCJkYXNoYm9hcmRfMVwiIHdpbGwgcmV0dXJuIHRoYXQgaW5zdGVhZCBvZiBnbG9iUGF0dGVyblswXVxuICAgIC8vIHVybEFyciA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY2hlY2tGb3JSb3V0ZVZhbHNQYXJ0TWF0Y2godXJsQXJyLCBkYXRhKVxuICAgIC8vIGNvbnNvbGUubG9nKCdQQVJBTVMgVE8gUk9VVEUgJywgeyBkYXRhLCByLCB1cmxBcnIsIGxvY2F0aW9uU3RyLCBwYXJhbXNGcm9tQ3VycmVudExvY2F0aW9uIH0pXG5cbiAgICAvLyBUSElTIENSRUFURVMgQSBRVUVSWSBQQVRIIFNUUlxuICAgIGlmICh1cmxUeXBlID09PSAncXVlcnknKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVRdWVyeVN0cmluZyh1cmxBcnIpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU2xhc2hTdHJpbmcodXJsQXJyKVxuICB9XG5cbiAgc3RhdGljIGZpbmRJbmRleE9mTWF0Y2hlZFN0cmluZ09yUmVnZXgobWFpblN0ciwgcGFyYW1zQXJyKSB7XG4gICAgY29uc3QgaXM0MDQgPSBwYXJhbXNBcnIuaW5jbHVkZXMoJy4rJylcblxuICAgIGNvbnN0IHJlRm4gPSAocykgPT4ge1xuICAgICAgaWYgKGlzNDA0KSB7XG4gICAgICAgIGlmICghcy5zdGFydHNXaXRoKCdeJykpIHtcbiAgICAgICAgICBzID0gJ14nICsgc1xuICAgICAgICB9XG4gICAgICAgIGlmICghcy5lbmRzV2l0aCgnJCcpKSB7XG4gICAgICAgICAgcyA9IHMgKyAnJCdcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFJlZ0V4cChzKVxuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrRm9yRW1wdHkgPSAgcmVwbGFjZSgvXiQvLCAnXiQnKVxuICAgIGNvbnN0IGNyZWF0ZVN0clJlZ2V4VGVzdCA9IChzdHIpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0cixcbiAgICAgICAgcmU6IHJlRm4oc3RyKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNoZWNrRm9yRWl0aGVyU3RyT3JSZU1hdGNoID0gIGVpdGhlcihcbiAgICAgIHByb3BFcShtYWluU3RyLCAnc3RyJyksIGNvbXBvc2UodGVzdChfXywgbWFpblN0ciksIHByb3AoJ3JlJykpXG4gICAgKVxuXG4gICAgY29uc3QgZmluZE1hdGNoSW5kZXggPSBjb21wb3NlKGZpbmRMYXN0SW5kZXgoZXF1YWxzKHRydWUpKSwgbWFwKGNoZWNrRm9yRWl0aGVyU3RyT3JSZU1hdGNoKSwgbWFwKGNyZWF0ZVN0clJlZ2V4VGVzdCksIG1hcChjaGVja0ZvckVtcHR5KSlcblxuICAgIHJldHVybiBmaW5kTWF0Y2hJbmRleChwYXJhbXNBcnIpXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZlZhbHVlU2hvdWxkTWFwVG9QYXJhbShvYmosIHN0ciwgcmVnZXhUb2tlbnMpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy8gICAgICAgVEhJUyBJUyBBIFZFUlkgSU1QT1JUQU5UIE1FVEhPRFxuICAgIC8vICAgICAgIElUIENPTVBBUkVTIFRIRSBTVFJJTkcgVE8gQkUgTUFUQ0hFRCBXSVRIIFRIRSBST1VURSBQQVRIIE9CSkVDVFxuICAgIC8vICAgICAgIEFORCBJVCBXSUxMIFJFVFVSTiBPTkUgT0YgVEhSRUUgVEhJTkdTXG4gICAgLy8gICAgICAgMS4gVEhFIFNUUklORyBJVFNFTEZcbiAgICAvLyAgICAgICAyLiBBIE1BVENISU5HIEtFWSBGUk9NIFRIRSBDVVJSRU5UIE9CSkVDVFxuICAgIC8vICAgICAgIDMuIFRIRSBST1VURU5BTUVcbiAgICAvL1xuXG4gICAgLy8gR08gVEhST1VHSCBLRVlTIEFORCBDSEVDSyBJRiBSRUdFWCBNQVRDSEVTXG5cbiAgICAvLyBHTyBUSFJPVUdIIFJPVVRFIENPTkZJRyBUTyBGSUdVUkUgT1VUIElGIFZBTCBPUiBLRVkgU0hPVUxEIEJFIENPTVBBUkVEXG4gICAgLy8gaWYgdGhlIHZhbHVlIGlzIGFuIG9iamVjdCwgY2hvb3NlIHRoZSBrZXkgb2YgdGhlIHJvdXRlIHBhdGggdG8gY2hlY2sgYWdhaW5zdFxuICAgIGNvbnN0IGdldFZhbENvbXBhcmVBcnIgPSBjb21wb3NlKG1hcChsYXN0KSwgbWFwKGZpbHRlcihpcyhTdHJpbmcpKSksIHRvUGFpcnMpXG5cbiAgICAvLyBDUkVBVEUgVEhFIEFSUkFZIE9GIEVJVEhFUiBWQUxTIE9SIEtFWVNcbiAgICBjb25zdCBwYXJhbXNBcnIgPSBnZXRWYWxDb21wYXJlQXJyKG9iailcblxuICAgIC8vIFJFU1VMVFMgRlJPTSBQQVJBTSBDSEVDS1xuICAgIC8vIGxldCBwYXJhbUluZGV4ID0gY2hlY2tGb3JQYXJhbXNNYXRjaChwYXJhbXNBcnIpO1xuXG4gICAgY29uc3QgcGFyYW1JbmRleCA9IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuZmluZEluZGV4T2ZNYXRjaGVkU3RyaW5nT3JSZWdleChzdHIsIHBhcmFtc0FycilcblxuICAgIC8vIERFRkFVTFQgVkFMIEZPUiBTVFJJTkdcbiAgICBsZXQgcGFyYW1TdHIgPSBzdHJcblxuICAgIC8vIExFR0FDWSBNRVRIT0QgLS0gVFVSTiBPRkZcbiAgICAvLyBXSEVOIFRIRVJFIElTIEEgTUFUQ0ggRlJPTSBUSEUgQ1VSUkVOVCBST1VURSBQQVRIIE9CSkVDVFxuICAgIGlmIChwYXJhbUluZGV4ID49IDApIHtcbiAgICAgIGNvbnN0IHBhcmFtID0gcGFyYW1zQXJyW3BhcmFtSW5kZXhdXG4gICAgICBjb25zdCBpbnZlcnRlZE9iaiA9IGludmVydChvYmopXG5cbiAgICAgIC8vIFBVTEwgSU5WRVJURUQgT0JKRUNUIFRPIFNFRSBJRiBTVFIgTUFUQ0hFU1xuICAgICAgY29uc3QgZ2V0UGFyYW1JbnZlcnRlZCA9IGNvbXBvc2UoaGVhZCwgZGVmYXVsdFRvKFtdKSwgcHJvcChwYXJhbSkpXG4gICAgICBjb25zdCBwYXJhbUludmVydGVkID0gZ2V0UGFyYW1JbnZlcnRlZChpbnZlcnRlZE9iailcbiAgICAgIC8vIHNweW5lIDExLjAuMTtcbiAgICAgIGNvbnN0IHJlID0gIC9eKFstJFxcd10qKSQvXG4gICAgICBjb25zdCBrZXlNYXRjaCA9ICByZS50ZXN0KHBhcmFtSW52ZXJ0ZWQpXG5cbiAgICAgIGlmIChrZXlNYXRjaCA9PT0gdHJ1ZSAmJiBpcyhTdHJpbmcsIHBhcmFtSW52ZXJ0ZWQpID09PSB0cnVlKSB7XG4gICAgICAgIHBhcmFtU3RyID0gcGFyYW1JbnZlcnRlZFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJhbVN0clxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUFyckZyb21TbGFzaFN0cihzdHIpIHtcbiAgICBjb25zdCBzbGFzaFJlID0gL14oWy9dKT8oLiopJC9cbiAgICByZXR1cm4gc3RyLnJlcGxhY2Uoc2xhc2hSZSwgJyQyJykuc3BsaXQoJy8nKVxuICB9XG5cbiAgc3RhdGljIGNvbnZlcnRTbGFzaFJvdXRlU3RyVG9QYXJhbXNPYmoodG9wTGV2ZWxSb3V0ZSwgc3RyLCByZWdleFRva2Vucykge1xuICAgIGNvbnN0IHJvdXRlVmFsdWUgPSBzdHJcbiAgICBjb25zdCB2YWx1ZXNBcnIgPSB0aGlzLmNyZWF0ZUFyckZyb21TbGFzaFN0cihzdHIpXG4gICAgY29uc3QgcGF0aHMgPSBbXVxuICAgIGNvbnN0IHJvdXRlZFZhbHVlc0FyciA9IFtdXG4gICAgbGV0IGxhdGVzdE9iaiA9IHRvcExldmVsUm91dGVcbiAgICBjb25zdCBjcmVhdGVQYXJhbXNGcm9tU3RyID0gKHRvdGFsLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IHJvdXRlVmFsdWVTdHIgPSB0aGlzLmNoZWNrSWZWYWx1ZVNob3VsZE1hcFRvUGFyYW0obGF0ZXN0T2JqLCBjdXJyZW50VmFsdWUsIHJlZ2V4VG9rZW5zKVxuXG4gICAgICBsYXRlc3RPYmogPSB0aGlzLmNoZWNrSWZQYXJhbVZhbHVlTWF0Y2hlc1JlZ2V4KGN1cnJlbnRWYWx1ZSwgbGF0ZXN0T2JqKVxuICAgICAgY29uc3QgcHJldlBhdGhOb3RFcUN1cnJlbnRQYXRoID0gKHN0cikgPT4gc3RyICE9PSBsYXN0KHBhdGhzKVxuXG4gICAgICBjb25zdCBpc0VtcHR5T3JOaWwgPSBlaXRoZXIoaXNFbXB0eSwgaXNOaWwpXG5cbiAgICAgIGlmIChsYXRlc3RPYmogIT09IHVuZGVmaW5lZCAmJiBwcmV2UGF0aE5vdEVxQ3VycmVudFBhdGgobGF0ZXN0T2JqLnJvdXRlTmFtZSkgJiYgaXNFbXB0eU9yTmlsKHJvdXRlVmFsdWVTdHIpID09PSBmYWxzZSkge1xuICAgICAgICBwYXRocy5wdXNoKGxhdGVzdE9iai5yb3V0ZU5hbWUpXG4gICAgICAgIHJvdXRlZFZhbHVlc0Fyci5wdXNoKHJvdXRlVmFsdWVTdHIpXG4gICAgICB9XG4gICAgICBjb25zdCBzdHJQYXRoID0gW2N1cnJlbnRWYWx1ZSwgJ3JvdXRlUGF0aCddXG4gICAgICBjb25zdCByb3V0ZVBhcmFtUGF0aCA9IFsncm91dGVQYXRoJ11cbiAgICAgIGNvbnN0IG9iamVjdEZyb21TdHIgPSBwYXRoKHN0clBhdGgsIGxhdGVzdE9iailcbiAgICAgIGNvbnN0IG9iamVjdEZyb21Sb3V0ZVBhcmFtID0gcGF0aChyb3V0ZVBhcmFtUGF0aCwgbGF0ZXN0T2JqKVxuXG4gICAgICBpZiAob2JqZWN0RnJvbVN0ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxhdGVzdE9iaiA9IG9iamVjdEZyb21TdHJcbiAgICAgIH0gZWxzZSBpZiAob2JqZWN0RnJvbVJvdXRlUGFyYW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsYXRlc3RPYmogPSBvYmplY3RGcm9tUm91dGVQYXJhbVxuICAgICAgfVxuICAgIH1cblxuICAgIHJlZHVjZShjcmVhdGVQYXJhbXNGcm9tU3RyLCAwLCB2YWx1ZXNBcnIpXG4gICAgY29uc3Qgcm91dGVEYXRhID0gemlwT2JqKHBhdGhzLCByb3V0ZWRWYWx1ZXNBcnIpXG4gICAgY29uc3QgcGF0aElubmVybW9zdCA9IHRoaXMuZ2V0TGFzdEFyclZhbChwYXRocylcbiAgICByZXR1cm4geyBwYXRocywgcGF0aElubmVybW9zdCwgcm91dGVEYXRhLCByb3V0ZVZhbHVlIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRMYXN0QXJyVmFsKGFycikge1xuICAgIGNvbnN0IGdldExhc3RQYXJhbSA9IChhKSA9PiBsYXN0KGEpICE9PSB1bmRlZmluZWQgPyBsYXN0KGEpIDogJydcbiAgICByZXR1cm4gZ2V0TGFzdFBhcmFtKGFycilcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVEZWZhdWx0UGFyYW1Gcm9tRW1wdHlTdHIodG9wTGV2ZWxSb3V0ZSwgc3RyKSB7XG4gICAgY29uc3Qgb2JqID0ge31cbiAgICBjb25zdCBrZXl3b3JkID0gdG9wTGV2ZWxSb3V0ZS5yb3V0ZU5hbWVcbiAgICBvYmpba2V5d29yZF0gPSB0aGlzLmNoZWNrSWZWYWx1ZVNob3VsZE1hcFRvUGFyYW0odG9wTGV2ZWxSb3V0ZSwgc3RyKVxuICAgIHJldHVybiBvYmpcbiAgfVxuXG4gIHN0YXRpYyBjb252ZXJ0UXVlcnlTdHJUb1BhcmFtcyh0b3BMZXZlbFJvdXRlLCBzdHIsIHJlZ2V4VG9rZW5zKSB7XG4gICAgY29uc3QgcXVlcnlSZSA9IC9eKFs/XSk/KC4qKSQvXG4gICAgY29uc3Qgcm91dGVWYWx1ZSA9IHN0clxuICAgIGNvbnN0IHN0ckFyciA9IHN0ci5yZXBsYWNlKHF1ZXJ5UmUsICckMicpXG4gICAgY29uc3QgY29udmVydFRvUGFyYW1zID0gY29tcG9zZShtYXAoc3BsaXQoJz0nKSksIHNwbGl0KCcmJykpXG4gICAgY29uc3QgcGFyYW1zQXJyID0gY29udmVydFRvUGFyYW1zKHN0ckFycilcbiAgICBsZXQgcm91dGVEYXRhID0gZnJvbVBhaXJzKHBhcmFtc0FycilcblxuICAgIGxldCBwYXRocyA9IG1hcChoZWFkLCBwYXJhbXNBcnIpXG5cbiAgICBpZiAoaXNFbXB0eShzdHIpID09PSB0cnVlKSB7XG4gICAgICByb3V0ZURhdGEgPSB0aGlzLmNyZWF0ZURlZmF1bHRQYXJhbUZyb21FbXB0eVN0cih0b3BMZXZlbFJvdXRlLCBzdHIsIHJlZ2V4VG9rZW5zKVxuICAgICAgcGF0aHMgPSBrZXlzKHJvdXRlRGF0YSlcbiAgICB9XG4gICAgY29uc3QgcGF0aElubmVybW9zdCA9IHRoaXMuZ2V0TGFzdEFyclZhbChwYXRocylcblxuICAgIHJldHVybiB7IHBhdGhzLCBwYXRoSW5uZXJtb3N0LCByb3V0ZURhdGEsIHJvdXRlVmFsdWUgfVxuICB9XG5cbiAgc3RhdGljIGNvbnZlcnRSb3V0ZVRvUGFyYW1zKHN0ciwgcm91dGVDb25maWcsIHQpIHtcbiAgICBjb25zdCBhZGRTbGFzaCA9ICh1cmwpID0+IHVybC5yZXBsYWNlKC9cXC8kfCQvLCAnLycpXG4gICAgaWYgKHJvdXRlQ29uZmlnID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgICBjb25zdCB0eXBlID0gdCAhPT0gdW5kZWZpbmVkID8gdCA6IHJvdXRlQ29uZmlnLnR5cGVcbiAgICBjb25zdCByZWdleFRva2VucyA9IGRlZmF1bHRUbyh7fSwgcHJvcCgncmVnZXhUb2tlbnMnLCByb3V0ZUNvbmZpZykpXG4gICAgY29uc3QgdG9wTGV2ZWxSb3V0ZSA9IHJvdXRlQ29uZmlnLnJvdXRlcy5yb3V0ZVBhdGhcblxuICAgIGlmICh0eXBlID09PSAncXVlcnknKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0UXVlcnlTdHJUb1BhcmFtcyh0b3BMZXZlbFJvdXRlLCBzdHIpXG4gICAgfVxuICAgIHN0ciA9IGFkZFNsYXNoKHN0cilcblxuICAgIHJldHVybiB0aGlzLmNvbnZlcnRTbGFzaFJvdXRlU3RyVG9QYXJhbXNPYmoodG9wTGV2ZWxSb3V0ZSwgc3RyLCByZWdleFRva2VucylcbiAgfVxufVxuIiwiaW1wb3J0IHsgZnJvbUV2ZW50UGF0dGVybiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBsYXN0LCBmbGF0dGVuLCBjbG9uZSwgcGljaywgcHJvcCwgcGlja0FsbCwgcGF0aCwgZXF1YWxzLCBjb21wb3NlLCBrZXlzLCBmaWx0ZXIsIHByb3BFcSwgdW5pcSwgbWFwLCBfXywgY2hhaW4sIGlzLCBpbmNsdWRlcywgZnJvbVBhaXJzLCByZWplY3QsIG1lcmdlRGVlcFJpZ2h0LCBtZXJnZVJpZ2h0LCB0ZXN0LCB0b1BhaXJzLCB2YWx1ZXMgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwgfSBmcm9tICcuL3NweW5lLXV0aWxzLWNoYW5uZWwtcm91dGUtdXJsLmpzJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8qKlxuICAgICAqIEBtb2R1bGUgU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVxuICAgICAqIEB0eXBlIGludGVybmFsXG4gICAgICpcbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAZGVzY1xuICAgICAqIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcyBmb3IgdGhlIFNweW5lUm91dGVDaGFubmVsXG4gICAgICpcbiAgICAgKi9cbiAgICB0aGlzLmNyZWF0ZVBvcFN0YXRlU3RyZWFtID0gU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZS5jcmVhdGVQb3BTdGF0ZVN0cmVhbS5iaW5kKHRoaXMpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUG9wU3RhdGVTdHJlYW0oc3Vic2NyaWJlRm4pIHtcbiAgICBjb25zdCBhZGRIYW5kbGVyID0gZnVuY3Rpb24oaGFuZGxlcikge1xuICAgICAgd2luZG93Lm9ucG9wc3RhdGUgPSBoYW5kbGVyXG4gICAgfVxuICAgIGNvbnN0IHJlbW92ZUhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oKSB7fVxuICAgIH1cbiAgICBjb25zdCBwb3B1cE9icyQgPSBmcm9tRXZlbnRQYXR0ZXJuKGFkZEhhbmRsZXIsIHJlbW92ZUhhbmRsZXIpXG5cbiAgICBwb3B1cE9icyQuc3Vic2NyaWJlKHN1YnNjcmliZUZuKVxuICB9XG5cbiAgc3RhdGljIGdldExhc3RBcnJWYWwoYXJyKSB7XG4gICAgY29uc3QgZ2V0TGFzdFBhcmFtID0gKGEpID0+IGxhc3QoYSkgIT09IHVuZGVmaW5lZCA/IGxhc3QoYSkgOiAnJ1xuICAgIHJldHVybiBnZXRMYXN0UGFyYW0oYXJyKVxuICB9XG5cbiAgc3RhdGljIGNvbXBhcmVSb3V0ZUtleXdvcmRzKG9iaiA9IHt9LCBhcnIpIHtcbiAgICBjb25zdCBwaWNrVmFsdWVzID0gKG8sIGEpID0+IGEgIT09IHVuZGVmaW5lZCA/IHBpY2soYSwgbykgOiBvXG4gICAgbGV0IG9iajEgPSBwaWNrVmFsdWVzKG9iaiwgYXJyKVxuICAgIHJldHVybiB7XG4gICAgICBwaWNrVmFsdWVzLFxuICAgICAgY29tcGFyZTogKG9iaiA9IHt9LCBhcnIpID0+IHtcbiAgICAgICAgY29uc3Qgb2JqMiA9IHBpY2tWYWx1ZXMob2JqLCBhcnIpXG4gICAgICAgIGNvbnN0IGNvbXBhcmVQcm9wcyA9IHAgPT4ge1xuICAgICAgICAgIGNvbnN0IHAxID0gcHJvcChwLCBvYmoxKVxuICAgICAgICAgIGNvbnN0IHAyID0gcHJvcChwLCBvYmoyKVxuICAgICAgICAgIGNvbnN0IHNhbWUgPSBlcXVhbHMocDEsIHAyKVxuICAgICAgICAgIGNvbnN0IHByZXZpb3VzRXhpc3RzID0gcDEgIT09IHVuZGVmaW5lZFxuICAgICAgICAgIGNvbnN0IG5leHRFeGlzdHMgPSBwMiAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgY29uc3QgY2hhbmdlZCA9ICFzYW1lXG4gICAgICAgICAgY29uc3QgYWRkZWQgPSBwcmV2aW91c0V4aXN0cyA9PT0gZmFsc2UgJiYgbmV4dEV4aXN0cyA9PT0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IHJlbW92ZWQgPSBwcmV2aW91c0V4aXN0cyA9PT0gdHJ1ZSAmJiBuZXh0RXhpc3RzID09PSBmYWxzZVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUDogXCIscCx7c2FtZSwgcHJldmlvdXNFeGlzdHMsIG5leHRFeGlzdHN9KTtcbiAgICAgICAgICBjb25zdCBvYmogPSB7fVxuICAgICAgICAgIG9ialtwXSA9IHsgc2FtZSwgY2hhbmdlZCwgYWRkZWQsIHJlbW92ZWQsIHByZXZpb3VzRXhpc3RzLCBuZXh0RXhpc3RzIH1cbiAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjcmVhdGVQcmVkID0gcCA9PiBjb21wb3NlKGtleXMsIGZpbHRlcihwcm9wRXEodHJ1ZSwgcCkpKVxuXG4gICAgICAgIGNvbnN0IGdldFByb3BzU3RhdGUgPSBjb21wb3NlKG1hcChjb21wYXJlUHJvcHMpLCB1bmlxLCBjaGFpbihrZXlzKSkoW29iajEsIG9iajJdKVxuICAgICAgICBjb25zdCBwYXRoc0NoYW5nZWQgPSBjaGFpbihjcmVhdGVQcmVkKCdjaGFuZ2VkJyksIGdldFByb3BzU3RhdGUpXG4gICAgICAgIGNvbnN0IHBhdGhzQWRkZWQgPSBjaGFpbihjcmVhdGVQcmVkKCdhZGRlZCcpLCBnZXRQcm9wc1N0YXRlKVxuICAgICAgICBjb25zdCBwYXRoc1JlbW92ZWQgPSBjaGFpbihjcmVhdGVQcmVkKCdyZW1vdmVkJyksIGdldFByb3BzU3RhdGUpXG4gICAgICAgIG9iajEgPSBvYmoyXG4gICAgICAgIHJldHVybiB7IHBhdGhzQWRkZWQsIHBhdGhzUmVtb3ZlZCwgcGF0aHNDaGFuZ2VkIH1cbiAgICAgIH0sXG5cbiAgICAgIGdldENvbXBhcmVyOiAoKSA9PiBvYmoxXG5cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0Um91dGVBcnJEYXRhKHJvdXRlQXJyLCBwYXJhbXNBcnIpIHtcbiAgICBjb25zdCBwYXRocyA9ICBmaWx0ZXIoaW5jbHVkZXMoX18sIHJvdXRlQXJyKSwgcGFyYW1zQXJyKVxuICAgIGNvbnN0IHBhdGhJbm5lcm1vc3QgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmdldExhc3RBcnJWYWwocGF0aHMpXG4gICAgLy8gY29uc29sZS5sb2coJ2FyciBhbmQgcm91dGVOYW1lICcse3BhdGhzLCBwYXRoSW5uZXJtb3N0fSk7XG4gICAgcmV0dXJuIHsgcGF0aHMsIHBhdGhJbm5lcm1vc3QgfVxuICB9XG5cbiAgc3RhdGljIGZsYXR0ZW5Db25maWdPYmplY3Qob2JqKSB7XG4gICAgY29uc3QgZ28gPSAob2JqXykgPT4gY2hhaW4oKFtrLCB2XSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2ID09PSAnb2JqZWN0JyAmJiB2ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgIHJldHVybiBtYXAoKFtrXywgdl9dKSA9PiBbYCR7a30uJHtrX31gLCB2X10sIGdvKHYpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtbaywgdl1dXG4gICAgICB9XG4gICAgfSwgdG9QYWlycyhvYmpfKSlcblxuICAgIC8vIGNvbnNvbGUubG9nKFwiRkxBVFRFTjogXCIsIHZhbHVlcyhmcm9tUGFpcnMoZ28ob2JqKSkpKTtcbiAgICByZXR1cm4gdmFsdWVzKGZyb21QYWlycyhnbyhvYmopKSlcbiAgfVxuXG4gIHN0YXRpYyBhZGRSb3V0ZURhdGFzZXRzKGNoYW5uZWxSb3V0ZU9iaikge1xuICAgIC8vIGNoYW5uZWxSb3V0ZU9iai50eXBlPSdxdWVyeSc7XG5cbiAgICBmdW5jdGlvbiByZW1vdmVVbmRlZmluZWQoYXJyKSB7XG4gICAgICByZXR1cm4gYXJyLm1hcChvYmogPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQgfHwga2V5ID09PSAndW5kZWZpbmVkJyB8fCBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWxldGUgb2JqW2tleV1cbiAgICAgICAgICB9IGVsc2UgaWYgKG9ialtrZXldICYmIHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkob2JqW2tleV0pKSB7XG4gICAgICAgICAgICAvLyByZWN1cnNlIGlmIG5lc3RlZCBvYmplY3RcbiAgICAgICAgICAgIG9ialtrZXldID0gcmVtb3ZlVW5kZWZpbmVkKFtvYmpba2V5XV0pWzBdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvYmpcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3QgeyB0eXBlLCBpc0hhc2ggfSA9IGNoYW5uZWxSb3V0ZU9ialxuXG4gICAgLy8gY3JlYXRlIGhyZWYgYW5kIGNoZWNrIHRvIHNlZSBpZiBuZWVkIHRvIGNvbnZlcnQgdG8gaGFzaCBocmVmIGxpbmtzXG4gICAgY29uc3QgZ2V0SFJFRiA9IChvYmopID0+IHtcbiAgICAgIGNvbnN0IHNhbnRpemVIUkVGID0gc3RyID0+IHtcbiAgICAgICAgY29uc3QgaHJlZlJFID0gL14oLipcXC8pKFtcXHctXSpcXC8/KSguKikkL2dtXG4gICAgICAgIC8vIGNvbnN0IGhyZWZSRSA9IC9eKC4qXFwvKShbXFx3LV0qKSguKikkL2dtO1xuICAgICAgICBzdHIgPSBzdHIucmVwbGFjZShocmVmUkUsICckMSQyJylcbiAgICAgICAgLy8gc3RyID0gU3RyaW5nKHN0cikucmVwbGFjZSgnXiQnLCBcIlwiKTtcbiAgICAgICAgcmV0dXJuIHN0clxuICAgICAgfVxuXG4gICAgICBjb25zdCBoZWFkU3RyVmFsID0gdHlwZSA9PT0gJ3F1ZXJ5JyA/ICcnIDogaXNIYXNoID09PSB0cnVlID8gJyMnIDogJy8nXG4gICAgICBjb25zdCBocmVmU3RyID0gIFNweW5lVXRpbHNDaGFubmVsUm91dGVVcmwuY29udmVydFBhcmFtc1RvUm91dGUob2JqLCBjaGFubmVsUm91dGVPYmopXG4gICAgICByZXR1cm4gaGVhZFN0clZhbCArIHNhbnRpemVIUkVGKGhyZWZTdHIpXG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIHNwZWNpYWwgY2hhcnMgZnJvbSBocmVmXG4gICAgY29uc3Qgc2FuaXRpemVTdHIgPSAoc3RyKSA9PiBTdHJpbmcoc3RyKS5yZXBsYWNlKC8oW15BLVphLXowLTktX10pL2csICcnKVxuXG4gICAgLy8gdGVzdCB3aGV0aGVyIHRvIHVzZSBrZXkgb3IgdmFsXG4gICAgY29uc3QgaXNWYWxpZFN0clJFID0gL14oW0EtWmEtejAtOV8tXSkrJC9tXG5cbiAgICBjb25zdCBjcmVhdGVJbml0aWFsVmFsRm4gPSAoYWNjTWFpbiA9IFtdLCByb3V0ZVBhdGhPYmosIG9iakFjYyA9IHt9KSA9PiB7XG4gICAgICBsZXQgeyByb3V0ZU5hbWUgfSA9IHJvdXRlUGF0aE9ialxuXG4gICAgICBjb25zdCBwcm9wc1JlZHVjZXIgPSAoYWNjLCBhcnJQYWlyKSA9PiB7XG4gICAgICAgIGNvbnN0IFtrZXksIHZhbF0gPSBhcnJQYWlyXG4gICAgICAgIGNvbnN0IGlzT2JqZWN0ID0gaXMoT2JqZWN0LCB2YWwpXG5cbiAgICAgICAgY29uc3QgY3JlYXRlVGl0bGUgPSAoc3RyKSA9PiBTdHJpbmcoc3RyKS5yZXBsYWNlKC8oWy1fXSkvZywgJyAnKS50b1VwcGVyQ2FzZSgpXG5cbiAgICAgICAgY29uc3QgZ2V0TGlua1RleHQgPSBzdHIgPT4gdGVzdChpc1ZhbGlkU3RyUkUsIHN0cikgPyBjcmVhdGVUaXRsZShzdHIpIDoga2V5XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ3JvdXRlTmFtZScgfHwga2V5ID09PSAnNDA0Jykge1xuICAgICAgICAgIHJldHVybiBhY2NcbiAgICAgICAgfVxuXG4gICAgICAgIHJvdXRlTmFtZSA9IHJvdXRlTmFtZSB8fCBwcm9wKCdyb3V0ZU5hbWUnLCB2YWwpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVEhFIEtFWSBJUyBcIix7a2V5LHZhbCxyb3V0ZU5hbWV9KVxuXG4gICAgICAgIGxldCBvID0gY2xvbmUob2JqQWNjKVxuICAgICAgICBvW3JvdXRlTmFtZV0gPSBzYW5pdGl6ZVN0cihrZXkpXG5cbiAgICAgICAgaWYgKGlzT2JqZWN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgaWYgKGtleXMobykubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJSb3V0ZU5hbWUgPSBwYXRoKFsncm91dGVQYXRoJywgJ3JvdXRlTmFtZSddLCB2YWwpXG4gICAgICAgICAgICBpZiAoc3ViUm91dGVOYW1lKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9CYXNlID0gY2xvbmUobylcbiAgICAgICAgICAgICAgb0Jhc2Vbc3ViUm91dGVOYW1lXSA9ICcnXG4gICAgICAgICAgICAgIG9CYXNlLm5hdkxldmVsID0ga2V5cyhvYmpBY2MpLmxlbmd0aFxuICAgICAgICAgICAgICBvQmFzZS50aXRsZSA9IGdldExpbmtUZXh0KGtleSlcbiAgICAgICAgICAgICAgb0Jhc2UuaHJlZiA9IGdldEhSRUYob0Jhc2UpXG4gICAgICAgICAgICAgIGFjYy5wdXNoKG9CYXNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvID0gY3JlYXRlSW5pdGlhbFZhbEZuKGFjY01haW4sIHZhbCwgbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvLnRpdGxlID0gZ2V0TGlua1RleHQoa2V5KVxuICAgICAgICAgIG8uaHJlZiA9IGdldEhSRUYobylcbiAgICAgICAgfVxuICAgICAgICBvLm5hdkxldmVsID0ga2V5cyhvYmpBY2MpLmxlbmd0aFxuICAgICAgICBhY2MucHVzaChvKVxuICAgICAgICByZXR1cm4gYWNjXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0b1BhaXJzKHJvdXRlUGF0aE9iaikucmVkdWNlKHByb3BzUmVkdWNlciwgW10pXG4gICAgfVxuXG4gICAgY29uc3QgcmVkdWNlZEFyciA9IGNyZWF0ZUluaXRpYWxWYWxGbihbXSwgY2hhbm5lbFJvdXRlT2JqLnJvdXRlcylcbiAgICBsZXQgcm91dGVEYXRhc2V0c0FyciA9IGZsYXR0ZW4ocmVkdWNlZEFycilcbiAgICByb3V0ZURhdGFzZXRzQXJyID0gcmVtb3ZlVW5kZWZpbmVkKHJvdXRlRGF0YXNldHNBcnIpXG5cbiAgICBjb25zdCBnZXROYXZQcm9wcyA9IChkYXRhc2V0c0FycikgPT4ge1xuICAgICAgY29uc3QgZXhjbHVkZSA9IHJlamVjdChpbmNsdWRlcyhfXywgWyd0aXRsZScsICdocmVmJywgJ25hdkxldmVsJywgJ3VuZGVmaW5lZCddKSlcbiAgICAgIGNvbnN0IGdldE1haW5LZXlzID0gY29tcG9zZSh1bmlxLCBleGNsdWRlLCBmbGF0dGVuLCBtYXAoa2V5cykpXG4gICAgICByZXR1cm4gZ2V0TWFpbktleXMoZGF0YXNldHNBcnIpXG4gICAgfVxuICAgIGNvbnN0IHJvdXRlTmFtZXNBcnIgPSBnZXROYXZQcm9wcyhyb3V0ZURhdGFzZXRzQXJyKVxuXG4gICAgcmV0dXJuIHsgcm91dGVEYXRhc2V0c0Fyciwgcm91dGVOYW1lc0FyciB9XG4gIH1cblxuICBzdGF0aWMgY29uZm9ybVJvdXRlT2JqZWN0KGNoYW5uZWxSb3V0ZU9iaiA9IHt9LCBhZGQ0MDRQcm9wcyA9IGZhbHNlKSB7XG4gICAgY29uc3QgY2hhbm5lbHNSb3V0ZVBhdGggPSBwYXRoKFsnY2hhbm5lbHMnLCAnUk9VVEUnXSwgY2hhbm5lbFJvdXRlT2JqKVxuICAgIGxldCB7IGFkZDQwNHMgfSA9IGNoYW5uZWxzUm91dGVQYXRoICE9PSB1bmRlZmluZWQgPyBjaGFubmVsc1JvdXRlUGF0aCA6IGNoYW5uZWxSb3V0ZU9ialxuICAgIGFkZDQwNHMgPSBhZGQ0MDRzIHx8IGFkZDQwNFByb3BzXG4gICAgY29uc3QgcGFyc2VSb3V0ZVBhdGggPSAoYSkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gYVsxXVxuICAgICAgY29uc3QgaXNBcnIgPSBpcyhBcnJheSwgdmFsKVxuICAgICAgaWYgKHZhbCA9PT0gJycpIHtcbiAgICAgICAgYVsxXSA9ICdeJCdcbiAgICAgIH0gZWxzZSBpZiAoaXNBcnIpIHtcbiAgICAgICAgYVsxXSA9IHZhbC5qb2luKCd8JylcbiAgICAgIH1cbiAgICAgIHJldHVybiBhXG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNkdWNlQ29uZmlnID0gKGFycikgPT4ge1xuICAgICAgY29uc3QgW2tleSwgdmFsXSA9IGFyclxuICAgICAgY29uc3Qgb2JqNDA0ID0gYWRkNDA0cyA/IHsgNDA0OiAnLisnIH0gOiB7fVxuICAgICAgY29uc3QgaXNPYmogPSBpcyhPYmplY3QsIHZhbClcbiAgICAgIGNvbnN0IGlzQXJyID0gaXMoQXJyYXksIHZhbClcbiAgICAgIGNvbnN0IGl0ZXJPYmogPSBpc09iaiA9PT0gdHJ1ZSAmJiBpc0FyciA9PT0gZmFsc2VcbiAgICAgIGNvbnN0IGlzUm91dGVQYXRoID0ga2V5ID09PSAncm91dGVQYXRoJ1xuICAgICAgaWYgKGl0ZXJPYmopIHtcbiAgICAgICAgYXJyWzFdID0gY29uZmlnTWFwcGVyRm4oYXJyWzFdKVxuICAgICAgICBpZiAoaXNSb3V0ZVBhdGgpIHtcbiAgICAgICAgICBhcnJbMV0gPSBjb21wb3NlKG1lcmdlRGVlcFJpZ2h0KG9iajQwNCksIGZyb21QYWlycywgbWFwKHBhcnNlUm91dGVQYXRoKSwgdG9QYWlycykoYXJyWzFdKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJyXG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnTWFwcGVyRm4gPSBjb21wb3NlKGZyb21QYWlycywgbWFwKHRyYW5zZHVjZUNvbmZpZyksIHRvUGFpcnMpXG5cbiAgICBpZiAoY2hhbm5lbHNSb3V0ZVBhdGggIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFID0gY29uZmlnTWFwcGVyRm4oY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFKVxuICAgICAgY29uc3QgZXh0cmFSb3V0ZURhdGEgPSBTcHluZVV0aWxzQ2hhbm5lbFJvdXRlLmFkZFJvdXRlRGF0YXNldHMoY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFKVxuICAgICAgY2hhbm5lbFJvdXRlT2JqLmNoYW5uZWxzLlJPVVRFID0gbWVyZ2VSaWdodChjaGFubmVsUm91dGVPYmouY2hhbm5lbHMuUk9VVEUsIGV4dHJhUm91dGVEYXRhKVxuICAgICAgcmV0dXJuIGNoYW5uZWxSb3V0ZU9ialxuICAgIH1cblxuICAgIHJldHVybiBjb25maWdNYXBwZXJGbihjaGFubmVsUm91dGVPYmopXG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYXRpb25EYXRhKCkge1xuICAgIGNvbnN0IGxvY2F0aW9uUGFyYW1zQXJyID0gW1xuICAgICAgJ2hyZWYnLFxuICAgICAgJ29yaWdpbicsXG4gICAgICAncHJvdG9jb2wnLFxuICAgICAgJ2hvc3QnLFxuICAgICAgJ2hvc3RuYW1lJyxcbiAgICAgICdwb3J0JyxcbiAgICAgICdwYXRobmFtZScsXG4gICAgICAnc2VhcmNoJyxcbiAgICAgICdoYXNoJ11cbiAgICByZXR1cm4gcGlja0FsbChsb2NhdGlvblBhcmFtc0Fyciwgd2luZG93LmxvY2F0aW9uKVxuICB9XG59XG4iLCJpbXBvcnQgeyBmcm9tRXZlbnRQYXR0ZXJuIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgbWFwT2JqSW5kZXhlZCB9IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cge1xuICAvKipcbiAgICogQG1vZHVsZSBTcHluZVV0aWxzQ2hhbm5lbFdpbmRvd1xuICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQGRlc2NcbiAgICogSW50ZXJuYWwgdXRpbGl0eSBtZXRob2RzIGZvciBTcHluZVdpbmRvd0NoYW5uZWxcbiAgICpcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCA9IFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZURvbU9ic2VydmFibGVGcm9tRXZlbnQuYmluZChcbiAgICAgIHRoaXMpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudChldmVudE5hbWUsIG1hcEZuLCBpc1Bhc3NpdmUgPSB0cnVlLCBlbGVtZW50ID0gd2luZG93KSB7XG4gICAgY29uc3QgYWRkSGFuZGxlciA9IGhhbmRsZXIgPT4gZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcixcbiAgICAgIHsgcGFzc2l2ZTogaXNQYXNzaXZlIH0pXG4gICAgY29uc3QgcmVtb3ZlSGFuZGxlciA9ICgpID0+IHsgZWxlbWVudFtldmVudE5hbWVdID0gKHApID0+IHAgfVxuICAgIG1hcEZuID0gbWFwRm4gPT09IHVuZGVmaW5lZCA/IChwKSA9PiBwIDogbWFwRm5cbiAgICByZXR1cm4gZnJvbUV2ZW50UGF0dGVybihhZGRIYW5kbGVyLCByZW1vdmVIYW5kbGVyKS5waXBlKG1hcChtYXBGbikpXG4gIH1cblxuICAvLyBNRURJQSBRVUVSSUVTXG4gIHN0YXRpYyBjcmVhdGVNZWRpYVF1ZXJ5KHN0cikge1xuICAgIGNvbnN0IG1xID0gd2luZG93Lm1hdGNoTWVkaWEoc3RyKVxuICAgIHRoaXMuY2hlY2tJZlZhbGlkTWVkaWFRdWVyeShtcSwgc3RyKVxuICAgIHJldHVybiBtcSAhPT0gZmFsc2UgPyBtcSA6IGZhbHNlXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZlZhbGlkTWVkaWFRdWVyeShtcSwgc3RyKSB7XG4gICAgY29uc3Qgbm9TcGFjZXMgPSBzdHIgPT4gc3RyLnJlcGxhY2UoL1xccysvZ20sICcnKVxuICAgIGNvbnN0IGlzVmFsaWRCb29sID0gbXEubWF0Y2hlcyAhPT0gdW5kZWZpbmVkICYmIG5vU3BhY2VzKG1xLm1lZGlhKS5pbmRleE9mKG5vU3BhY2VzKHN0cikpID49IDBcbiAgICBjb25zdCB3YXJuTXNnID0gc3RyID0+IGNvbnNvbGUud2FybihgU3B5bmUgSW5mbzogdGhlIGZvbGxvd2luZyBxdWVyeSBzdHJpbmcsIFwiJHtzdHJ9XCIsIGhhcyBiZWVuIG9wdGltaXplZCB0byBcIiR7bXEubWVkaWF9XCIgYnkgdGhlIGJyb3dzZXIgYW5kIG1heSBub3QgYmUgYSB2YWxpZCBNZWRpYSBRdWVyeSBpdGVtIWApXG4gICAgaWYgKGlzVmFsaWRCb29sID09PSBmYWxzZSkge1xuICAgICAgd2Fybk1zZyhzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc1ZhbGlkQm9vbFxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyKHF1ZXJ5LCBrZXkpIHtcbiAgICBjb25zdCBrZXlGbiA9IGtleSA9PiBwID0+IHtcbiAgICAgIHAubWVkaWFRdWVyeU5hbWUgPSBrZXlcbiAgICAgIHJldHVybiBwXG4gICAgfVxuXG4gICAgY29uc3QgbWFwS2V5ID0ga2V5Rm4oa2V5KVxuXG4gICAgY29uc3QgaGFuZGxlcnMgPSAocSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWRkSGFuZGxlcjogKGhhbmRsZXIpID0+IHsgcS5hZGRMaXN0ZW5lcihoYW5kbGVyKSB9LFxuICAgICAgICByZW1vdmVIYW5kbGVyOiAoaGFuZGxlcikgPT4geyBxLm9uY2hhbmdlID0gKCkgPT4ge30gfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtZWRpYVF1ZXJ5SGFuZGxlciA9IGhhbmRsZXJzKHF1ZXJ5KVxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5ldy1jYXAgKi9cbiAgICByZXR1cm4gbmV3IGZyb21FdmVudFBhdHRlcm4oXG4gICAgICBtZWRpYVF1ZXJ5SGFuZGxlci5hZGRIYW5kbGVyLFxuICAgICAgbWVkaWFRdWVyeUhhbmRsZXIucmVtb3ZlSGFuZGxlcilcbiAgICAgIC5waXBlKG1hcChtYXBLZXkpKVxuICB9XG5cbiAgc3RhdGljIGNyZWF0ZU1lcmdlZE9ic0Zyb21PYmooY29uZmlnKSB7XG4gICAgY29uc3QgbWVkaWFRdWVyaWVzT2JqID0gY29uZmlnLm1lZGlhUXVlcmllcyB8fCBjb25maWcubWVkaWFRdWVyaWVzXG4gICAgY29uc3QgYXJyID0gW11cblxuICAgIGNvbnN0IGxvb3BRdWVyaWVzID0gKHZhbCwga2V5LCBvYmopID0+IHtcbiAgICAgIGNvbnN0IG1xID0gU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3cuY3JlYXRlTWVkaWFRdWVyeSh2YWwpXG4gICAgICBpZiAobXEgIT09IGZhbHNlKSB7XG4gICAgICAgIGFyci5wdXNoKFNweW5lVXRpbHNDaGFubmVsV2luZG93LmNyZWF0ZU1lZGlhUXVlcnlIYW5kbGVyKG1xLCBrZXkpKVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFyclxuICAgIH1cblxuICAgIG1hcE9iakluZGV4ZWQobG9vcFF1ZXJpZXMsIG1lZGlhUXVlcmllc09iailcbiAgICByZXR1cm4gYXJyXG4gIH1cbn1cbiIsImNvbnN0IGNyZWF0ZUZhZGVySW5saW5lVGV4dCA9IChpc0luQm9vbCA9IGZhbHNlLCB0ID0gMSwgZSA9ICdlYXNlJywgc3RhcnRaZXJvQm9vbCA9IGZhbHNlKSA9PiB7XG4gIGNvbnN0IGluaXRPcGFjaXR5WmVybyA9IHN0YXJ0WmVyb0Jvb2wgPT09IHRydWUgPyAnb3BhY2l0eTowOycgOiAnJ1xuICBjb25zdCBvcGFjaXR5ID0gaXNJbkJvb2wgPT09IHRydWUgPyAxIDogMFxuICByZXR1cm4gYCR7aW5pdE9wYWNpdHlaZXJvfXRyYW5zaXRpb246IG9wYWNpdHkgJHt0fXMgJHtlfTsgb3BhY2l0eTogJHtvcGFjaXR5fTtgXG59XG5leHBvcnQgZnVuY3Rpb24gZmFkZWluKGVsLCB0KSB7XG4gIGNvbnN0IGN1cnJlbnRPcGFjaXR5ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpLm9wYWNpdHkgKiAxXG4gIGNvbnN0IHN0YXJ0QXRaZXJvID0gY3VycmVudE9wYWNpdHkgPT09IDFcbiAgY29uc3QgaW5saW5lQ3NzID0gY3JlYXRlRmFkZXJJbmxpbmVUZXh0KHRydWUsIHQsICdlYXNlJywgc3RhcnRBdFplcm8pXG4gIGVsLnN0eWxlLmNzc1RleHQgKz0gaW5saW5lQ3NzXG59XG5leHBvcnQgZnVuY3Rpb24gZmFkZW91dChlbCwgdCwgY2FsbGJhY2spIHtcbiAgY29uc3QgaW5saW5lQ3NzID0gY3JlYXRlRmFkZXJJbmxpbmVUZXh0KGZhbHNlLCB0LCAnZWFzZScpXG4gIGVsLnN0eWxlLmNzc1RleHQgKz0gaW5saW5lQ3NzXG5cbiAgLy8gd2luZG93LnNldFRpbWVvdXQoY2FsbGJhY2ssIHQgKiAxMDAwKTtcbiAgZWwuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGNhbGxiYWNrLCBmYWxzZSlcbn1cbiIsImltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IGZsaXAsIG1lcmdlUmlnaHQsIGNsb25lLCBmb3JFYWNoLCBwcm9wU2F0aXNmaWVzIH0gZnJvbSAncmFtZGEnXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbU9ic2VydmFibGUge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIC8qKlxuICAgICAqIEBtb2R1bGUgVmlld1N0cmVhbU9ic2VydmFibGVcbiAgICAgKiBAdHlwZSBpbnRlcm5hbFxuICAgICAqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQGRlc2NcbiAgICAgKiBJbnRlcm5hbCBvYnNlcnZhYmxlIHRoYXQgY3JlYXRlcyB0aGUgVmlld1N0cmVhbSBPYnNlcnZhYmxlIHRoYXQgYnJhbmNoZXMgb3V0IHRvIHBhcmVudCwgaW50ZXJuYWwgYW5kIGNoaWxkIGRpcmVjdGlvbnNcbiAgICAgKi9cbiAgICB0aGlzLnByb3BzLm9ic2VydmFibGVTdHJlYW1zID0gVmlld1N0cmVhbU9ic2VydmFibGUuY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcygpXG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRGlyZWN0aW9uYWxGaWx0ZXJzT2JqZWN0KCkge1xuICAgIGNvbnN0IGRpckludGVybmFsID0gJ2ludGVybmFsJ1xuICAgIGNvbnN0IGRpclBhcmVudCA9ICdwYXJlbnQnXG4gICAgY29uc3QgZGlyQ2hpbGQgPSAnY2hpbGQnXG4gICAgcmV0dXJuIHtcbiAgICAgIFA6IFtkaXJQYXJlbnRdLFxuICAgICAgQzogW2RpckNoaWxkXSxcbiAgICAgIFBDSTogW2RpclBhcmVudCwgZGlySW50ZXJuYWwsIGRpckNoaWxkXSxcbiAgICAgIENJOiBbZGlyQ2hpbGQsIGRpckludGVybmFsXSxcbiAgICAgIFBJOiBbZGlyUGFyZW50LCBkaXJJbnRlcm5hbF0sXG4gICAgICBQQzogW2RpclBhcmVudCwgZGlyQ2hpbGRdXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFkZERlZmF1bHREaXIob2JqKSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBmbGlwKG1lcmdlUmlnaHQpXG4gICAgcmV0dXJuIGRlZmF1bHRzKHsgJGRpcjpbJ2ludGVybmFsJ10gfSwgY2xvbmUob2JqKSlcbiAgfVxuXG4gIHN0YXRpYyBhZGREb3duSW50ZXJuYWxEaXIob2JqLCBhcnIgPSBbJ2ludGVybmFsJywgJ2Rvd24nXSkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gZmxpcChtZXJnZVJpZ2h0KVxuICAgIHJldHVybiBkZWZhdWx0cyhjbG9uZShvYmopLCB7ICRkaXI6YXJyIH0pXG4gIH1cblxuICBzdGF0aWMgYWRkQ2hpbGRBbmRJbnRlcm5hbERpcihvYmosIGFyciA9IFsnY2hpbGQnLCAnZG93biddKSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSBmbGlwKG1lcmdlUmlnaHQpXG4gICAgcmV0dXJuIGRlZmF1bHRzKGNsb25lKG9iaiksIHsgJGRpcjphcnIgfSlcbiAgfVxuXG4gIHN0YXRpYyBtYXBUb0RlZmF1bHREaXIocCkge1xuICAgIHJldHVybiB0aGlzLmFkZERlZmF1bHREaXIocClcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVEaXJlY3Rpb25hbE9ic2VydmFibGVzKG9icyQgPSBuZXcgU3ViamVjdCgpLCB2aWV3TmFtZSwgdnNpZCkge1xuICAgIGlmICh2aWV3TmFtZSAhPT0gdW5kZWZpbmVkICYmIHZzaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb2JzJC52aWV3TmFtZSA9IHZpZXdOYW1lXG4gICAgICBvYnMkLnZzaWQgPSB2c2lkXG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyU3RyZWFtcyA9IHZhbCA9PiBwcm9wU2F0aXNmaWVzKGFyclR5cGUgPT4gYXJyVHlwZS5pbmNsdWRlcyh2YWwpLCAnJGRpcicpXG4gICAgY29uc3QgZmlsdGVyUGFyZW50ID0gZmlsdGVyU3RyZWFtcygncGFyZW50JylcbiAgICBjb25zdCBmaWx0ZXJDaGlsZCA9IGZpbHRlclN0cmVhbXMoJ2NoaWxkJylcbiAgICBjb25zdCBmaWx0ZXJJbnRlcm5hbCA9IGZpbHRlclN0cmVhbXMoJ2ludGVybmFsJylcblxuICAgIGNvbnN0IGFkZGZyb20kID0gcmVsU3RyID0+IG1lcmdlUmlnaHQoeyBmcm9tJDpyZWxTdHIgfSlcbiAgICBjb25zdCBhZGRQYXJlbnRmcm9tJCA9IGFkZGZyb20kKCdjaGlsZCcpXG4gICAgY29uc3QgYWRkSW50ZXJuYWxmcm9tJCA9IGFkZGZyb20kKCdpbnRlcm5hbCcpXG4gICAgY29uc3QgYWRkQ2hpbGRmcm9tJCA9IGFkZGZyb20kKCdwYXJlbnQnKVxuXG4gICAgY29uc3QgcmF3JCA9ICBvYnMkXG4gICAgICAucGlwZShmaWx0ZXIoKHBheWxvYWQpID0+IHBheWxvYWQgIT09IHVuZGVmaW5lZCAmJiBwYXlsb2FkLmFjdGlvbiAhPT0gdW5kZWZpbmVkKSlcblxuICAgIGNvbnN0IHRvSW50ZXJuYWwkID0gb2JzJC5waXBlKGZpbHRlcihmaWx0ZXJJbnRlcm5hbCksIG1hcChhZGRJbnRlcm5hbGZyb20kKSlcbiAgICBjb25zdCB0b1BhcmVudCQgPSBvYnMkLnBpcGUoZmlsdGVyKGZpbHRlclBhcmVudCksIG1hcChhZGRQYXJlbnRmcm9tJCkpXG4gICAgY29uc3QgdG9DaGlsZCQgPSBvYnMkLnBpcGUoZmlsdGVyKGZpbHRlckNoaWxkKSwgbWFwKGFkZENoaWxkZnJvbSQpKVxuXG4gICAgY29uc3Qgc3RyZWFtT2JqID0ge1xuICAgICAgcGFyZW50OiB0b1BhcmVudCQsXG4gICAgICBpbnRlcm5hbDogdG9JbnRlcm5hbCQsXG4gICAgICBjaGlsZDogdG9DaGlsZCRcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZVN0cmVhbSA9IChhcnIgPSBbXSkgPT4ge1xuICAgICAgY29uc3QgZW5kU3RyZWFtID0gbyA9PiB7XG4gICAgICAgIG8uY29tcGxldGUoKVxuICAgICAgICBvLmlzU3RvcHBlZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2V0Q29tcGxldGVTdHJlYW0gPSAoc3RyKSA9PiB7XG4gICAgICAgIGlmIChzdHJlYW1PYmpbc3RyXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgb2JzJCA9IHN0cmVhbU9ialtzdHJdXG4gICAgICAgICAgZW5kU3RyZWFtKG9icyQpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFyciAhPT0gdW5kZWZpbmVkICYmIGFyci5sZW5ndGggPj0gMSkge1xuICAgICAgICBhcnIuZm9yRWFjaChzZXRDb21wbGV0ZVN0cmVhbSlcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY29tcGxldGVBbGwgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjb21wbGV0ZVN0cmVhbSA9IG8gPT4ge1xuICAgICAgICBvLmNvbXBsZXRlKClcbiAgICAgICAgby5pc1N0b3BwZWQgPSB0cnVlXG4gICAgICB9XG4gICAgICBmb3JFYWNoKGNvbXBsZXRlU3RyZWFtLCBbcmF3JCwgdG9JbnRlcm5hbCQsIHRvUGFyZW50JCwgdG9DaGlsZCRdKVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICByYXckLCB0b0ludGVybmFsJCwgdG9QYXJlbnQkLCB0b0NoaWxkJCwgY29tcGxldGVBbGwsIGNvbXBsZXRlU3RyZWFtXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBpbmNsdWRlcywgX18sIGlmRWxzZSwgcGF0aCwgcHJvcCwgcmVqZWN0LCBpcywgaXNOaWwsIGlzRW1wdHkgfSBmcm9tICdyYW1kYSdcbmltcG9ydCBzYW5pdGl6ZUhUTUwgZnJvbSAnLi4vdXRpbHMvc2FuaXRpemUtaHRtbC5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG4vKipcbiAqIERvbUVsZW1lbnRUZW1wbGF0ZVxuICpcbiAqIE11c3RhY2hlLWNvbXBhdGlibGUgdGVtcGxhdGUgZW5naW5lIHVzZWQgYnkgVmlld1N0cmVhbSBhbmQgRG9tRWxlbWVudCBmb3IgSFRNTCByZW5kZXJpbmcuXG4gKlxuICogU3VwcG9ydGVkIHN5bnRheDpcbiAqICAge3trZXl9fSAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgaW50ZXJwb2xhdGlvbiwgSFRNTC1lc2NhcGVkXG4gKiAgIHt7a2V5LnBhdGgudG8udmFsdWV9fSAgICAgICAgICAgIGRvdC1ub3RhdGlvbiBwcm9wZXJ0eSBhY2Nlc3NcbiAqICAge3sja2V5fX0uLi57ey9rZXl9fSAgICAgICAgICAgICAgYXJyYXkvb2JqZWN0IHNlY3Rpb25zXG4gKiAgIHt7Ln19ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgZWxlbWVudCBpbnNpZGUgYSBsb29wXG4gKiAgIHt7I319Li4ue3svfX0gICAgICAgICAgICAgICAgICAgIHRvcC1sZXZlbCBiYXJlIGFycmF5IChwYXNzZWQgYXMgYGRhdGFgKVxuICpcbiAqIE5lc3Rpbmc6XG4gKiAgIERvbUVsZW1lbnRUZW1wbGF0ZSBzdXBwb3J0cyBleGFjdGx5IE9ORSBsZXZlbCBvZiBuZXN0ZWQgYXJyYXkgc2VjdGlvbnMuXG4gKiAgIEEgdGVtcGxhdGUgbGlrZSB7eyNyb3dzfX0uLi57eyNjZWxsc319Li4ue3svY2VsbHN9fS4uLnt7L3Jvd3N9fSBpcyBzdXBwb3J0ZWQuXG4gKiAgIERlZXBlciBuZXN0aW5nIOKAlCB7eyNhfX17eyNifX17eyNjfX0uLi57ey9jfX17ey9ifX17ey9hfX0g4oCUIGlzIE5PVCBzdXBwb3J0ZWQuXG4gKlxuICogICBXaGVuIGEgdGVtcGxhdGUgaGFzIGRlZXBlciBuZXN0aW5nLCBhIHdhcm5pbmcgaXMgbG9nZ2VkIGluIGRlYnVnIG1vZGUgYW5kXG4gKiAgIHRoZSB0aGlyZC1sZXZlbCBsb29wIGlzIG5vdCBwcm9jZXNzZWQuIFRoaXMgaXMgYSBkZWxpYmVyYXRlIGRlc2lnbiBjaG9pY2U6XG4gKiAgIGRlZXAgaGllcmFyY2hpY2FsIHJlbmRlcmluZyBiZWxvbmdzIGluIG5lc3RlZCBWaWV3U3RyZWFtcywgbm90IGluIHRlbXBsYXRlcy5cbiAqICAgTmVzdGVkIFZpZXdTdHJlYW1zIHByb3ZpZGUgcHJvcGVyIGxpZmVjeWNsZSBzZW1hbnRpY3MsIGlzb2xhdGVkIHJlbmRlcmluZyxcbiAqICAgYW5kIGNsZWFyZXIgYXJjaGl0ZWN0dXJhbCBib3VuZGFyaWVzIHRoYW4gYXJiaXRyYXJpbHktbmVzdGVkIHRlbXBsYXRlcy5cbiAqXG4gKiBOb3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbiBuZXN0ZWQgbG9vcHM6XG4gKiAgIC0gQ01TIHByb3h5IG1ldGFkYXRhIChfX2Ntc19fZGF0YUlkLCBfX2Ntc19fa2V5Rm9yXyopLiBJbm5lci1sb29wIENNU1xuICogICAgIGVkaXRpbmcgaXMgYSBmdXR1cmUgZW5oYW5jZW1lbnQ7IHVudGlsIHRoZW4sIGNvbnRlbnQgaW5zaWRlIGFuIGlubmVyXG4gKiAgICAgbG9vcCBpcyByZW5kZXJlZCBhcyByZWFkLW9ubHkgZnJvbSB0aGUgQ01TIHBlcnNwZWN0aXZlLlxuICovXG5leHBvcnQgY2xhc3MgRG9tRWxlbWVudFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IodGVtcGxhdGUsIGRhdGEgPSB7fSwgb3B0cyA9IHt9KSB7XG4gICAgdGhpcy50ZW1wbGF0ZSA9IHRoaXMuZm9ybWF0VGVtcGxhdGUodGVtcGxhdGUpXG4gICAgdGhpcy5pc1Byb3h5RGF0YSA9IGRhdGEuX19jbXNfX2lzUHJveHkgPT09IHRydWVcbiAgICB0aGlzLnRlc3RNb2RlID0gb3B0cz8udGVzdE1vZGVcblxuICAgIC8vIE5vcm1hbGl6ZSB0cmlwbGUtYnJhY2tldCB0YWdzIHRvIGRvdWJsZS1icmFja2V0LlxuICAgIC8vXG4gICAgLy8gRG9tRWxlbWVudFRlbXBsYXRlIHRyZWF0cyB7e3trZXl9fX0gYXMgYW4gYWxpYXMgZm9yIHt7a2V5fX0g4oCUIGJvdGhcbiAgICAvLyBpbnRlcnBvbGF0ZSB0aGUgdmFsdWUgYXMtaXMuIE11c3RhY2hlJ3MgY29udmVudGlvbiBvZiBcInRyaXBsZS1icmFja2V0XG4gICAgLy8gbWVhbnMgdW5lc2NhcGVkXCIgZG9lc24ndCBhcHBseSBoZXJlIGJlY2F1c2UgU3B5bmVKUyBoYW5kbGVzIGVzY2FwaW5nXG4gICAgLy8gYW5kIHNhbml0aXphdGlvbiB0aHJvdWdoIGBzYW5pdGl6ZS1kYXRhYCAoa2V5ZWQgb24gU3B5bmVBcHAgbW9kZSlcbiAgICAvLyBiZWZvcmUgdmFsdWVzIHJlYWNoIHRoZSB0ZW1wbGF0ZSwgbm90IHRocm91Z2ggc3ludGF4LWxldmVsIGVzY2FwaW5nLlxuICAgIC8vXG4gICAgLy8gV2UgYWNjZXB0IHRyaXBsZS1icmFja2V0IHN5bnRheCBzbyB0aGF0IGF1dGhvcnMgYW5kIEFJIGZhbWlsaWFyIHdpdGhcbiAgICAvLyBzdGFuZGFyZCBNdXN0YWNoZSBkb24ndCBoYXZlIHRoZWlyIHRlbXBsYXRlcyBzaWxlbnRseSBicmVhayB3aGVuIHRoZXlcbiAgICAvLyByZWFjaCBmb3Ige3t7a2V5fX19IG91dCBvZiBoYWJpdC4gVGhlIG5vcm1hbGl6YXRpb24gaGFwcGVucyBvbmNlIGhlcmUsXG4gICAgLy8gc28gdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZSBvbmx5IGV2ZXIgcmVhc29ucyBhYm91dCBkb3VibGUtYnJhY2tldCB0YWdzLlxuICAgIHRoaXMudGVtcGxhdGUgPSBEb21FbGVtZW50VGVtcGxhdGUubm9ybWFsaXplVHJpcGxlQnJhY2tldHModGhpcy50ZW1wbGF0ZSlcblxuICAgIGlmICh0aGlzLmlzUHJveHlEYXRhID09PSB0cnVlKSB7XG4gICAgICBpZiAoU3B5bmVBcHBQcm9wZXJ0aWVzLmVuYWJsZUNNU1Byb3hpZXMgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IFNweW5lQXBwUHJvcGVydGllcy5mb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YSh0aGlzLnRlbXBsYXRlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdZb3UgbmVlZCB0byBiZSBsb2dnZWQgaW4gdG8gdXNlIHRoZSBDTVMgVG9vbHMuJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjaGVja0ZvckFycmF5RGF0YSA9ICgpID0+IHtcbiAgICAgIGlmIChpcyhBcnJheSwgZGF0YSkgPT09IHRydWUpIHtcbiAgICAgICAgZGF0YSA9IHsgc3B5bmVEYXRhOmRhdGEgfVxuICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZS5yZXBsYWNlKCd7ey99fScsICd7ey9zcHluZURhdGF9fScpXG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlLnJlcGxhY2UoJ3t7I319JywgJ3t7I3NweW5lRGF0YX19JylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjaGVja0ZvckFycmF5RGF0YSgpXG5cbiAgICB0aGlzLnRlbXBsYXRlRGF0YSA9IGRhdGFcblxuICAgIC8vIFN0YXNoIHVzZWQgYnkgcGVyLWl0ZXJhdGlvbiBzdWJzdGl0dXRpb24gc28gdGhhdCBDTVMgcHJveHkgbG9va3Vwc1xuICAgIC8vIGZvciBzdHJpbmctYXJyYXkgaXRlbXMgKHdoZXJlIF9fY21zX19kYXRhSWQgLyBfX2Ntc19fa2V5Rm9yXyogbGl2ZSBvblxuICAgIC8vIHRoZSBQQVJFTlQgYXJyYXksIG5vdCBvbiB0aGUgaW5kaXZpZHVhbCBzdHJpbmcgZWxlbWVudHMpIGNhbiBmaW5kIHRoZVxuICAgIC8vIHBhcmVudCBvYmplY3QgYXQgcmVuZGVyIHRpbWUuIFNldCBieSBwYXJzZVRoZVRtcGxMb29wLCBjbGVhcmVkIHdoZW5cbiAgICAvLyB0aGF0IGxvb3AgY29tcGxldGVzLlxuICAgIHRoaXMuY3VycmVudE91dGVyTG9vcERhdGEgPSBudWxsXG5cbiAgICBjb25zdCBzdHJBcnIgPSBEb21FbGVtZW50VGVtcGxhdGUuZ2V0U3RyaW5nQXJyYXkodGhpcy50ZW1wbGF0ZSlcblxuICAgIGxldCBzdHJNYXRjaGVzID0gdGhpcy50ZW1wbGF0ZS5tYXRjaChEb21FbGVtZW50VGVtcGxhdGUuZmluZFRtcGxMb29wc1JFKCkpXG4gICAgc3RyTWF0Y2hlcyA9IHN0ck1hdGNoZXMgPT09IG51bGwgPyBbXSA6IHN0ck1hdGNoZXNcblxuICAgIGNvbnN0IHBhcnNlVG1wbExvb3BzUkUgPSBEb21FbGVtZW50VGVtcGxhdGUucGFyc2VUbXBsTG9vcHNSRSgpXG5cbiAgICBjb25zdCBwYXJzZVRtcGxMb29wRm4gPSB0aGlzLnBhcnNlVGhlVG1wbExvb3AuYmluZCh0aGlzKVxuXG4gICAgY29uc3QgbWFwVG1wbExvb3AgPSAoc3RyKSA9PiB7XG4gICAgICByZXR1cm4gc3RyLnJlcGxhY2UocGFyc2VUbXBsTG9vcHNSRSwgcGFyc2VUbXBsTG9vcEZuKVxuICAgIH1cblxuICAgIGNvbnN0IGZpbmRUbXBsTG9vcHNQcmVkID0gaW5jbHVkZXMoX18sIHN0ck1hdGNoZXMpXG4gICAgY29uc3QgY2hlY2tGb3JNYXRjaGVzID0gaWZFbHNlKFxuICAgICAgZmluZFRtcGxMb29wc1ByZWQsXG4gICAgICBtYXBUbXBsTG9vcCxcbiAgICAgIHRoaXMuYWRkUGFyYW1zLmJpbmQodGhpcykpXG5cbiAgICB0aGlzLmZpbmFsQXJyID0gc3RyQXJyLm1hcChjaGVja0Zvck1hdGNoZXMpXG4gIH1cblxuICBzdGF0aWMgaXNQcmltaXRpdmVUYWcoc3RyKSB7XG4gICAgcmV0dXJuIC8oe3tcXC5cXCo/fX0pLy50ZXN0KHN0cilcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIHRyaXBsZS1icmFja2V0IHRhZ3MgdG8gZG91YmxlLWJyYWNrZXQgZm9ybS5cbiAgICpcbiAgICogICB7e3trZXl9fX0gICAgICAg4oaSIHt7a2V5fX1cbiAgICogICB7e3thLmIuY319fSAgICAg4oaSIHt7YS5iLmN9fVxuICAgKiAgIHt7ey59fX0gICAgICAgICDihpIge3sufX1cbiAgICogICB7e3suKn19fSAgICAgICAg4oaSIHt7Lip9fVxuICAgKlxuICAgKiBTZWN0aW9uIG1hcmtlcnMge3sja2V5fX0gYW5kIHt7L2tleX19IGFyZSBhbHJlYWR5IHR3by1icmFja2V0IGJ5XG4gICAqIGNvbnZlbnRpb24gYW5kIGFyZSBub3QgYWZmZWN0ZWQuIFRhZ3Mgb2YgdGhlIHdyb25nIHNoYXBlICh1bmJhbGFuY2VkLFxuICAgKiBmb3VyIG9yIG1vcmUgYnJhY2tldHMsIGV0Yy4pIGFyZSBsZWZ0IHVudG91Y2hlZCDigJQgYW55dGhpbmcgdGhlIG1haW5cbiAgICogcGFyc2VyIGRvZXNuJ3QgcmVjb2duaXplIGxhdGVyIHdpbGwgcmVuZGVyIGFzIGxpdGVyYWwgdGV4dCwgd2hpY2ggaXNcbiAgICogdGhlIGNvcnJlY3QgZmFpbHVyZSBtb2RlIGZvciBhIGxvZ2ljLWxlc3MgdGVtcGxhdGUgZW5naW5lLlxuICAgKlxuICAgKiBUaGlzIGV4aXN0cyBiZWNhdXNlIERvbUVsZW1lbnRUZW1wbGF0ZSB0cmVhdHMge3t7a2V5fX19IGFuZCB7e2tleX19XG4gICAqIGFzIGludGVyY2hhbmdlYWJsZSDigJQgc2FuaXRpemF0aW9uIGFuZCBlc2NhcGluZyBhcmUgY29uZmlnLWRyaXZlblxuICAgKiB0aHJvdWdoIGBzYW5pdGl6ZS1kYXRhYCwgbm90IHN5bnRheC1kcml2ZW4gdGhyb3VnaCBicmFja2V0IGNvdW50LlxuICAgKiBOb3JtYWxpemluZyBhdCBjb25zdHJ1Y3Rpb24gdGltZSBtZWFucyB0aGUgcmVzdCBvZiB0aGUgZW5naW5lIChsb29wXG4gICAqIHJlZ2V4ZXMsIENNUyBwcm94eSB3cmFwcGluZywgdmFyaWFibGUgc3Vic3RpdHV0aW9uKSBvbmx5IHJlYXNvbnNcbiAgICogYWJvdXQgb25lIGJyYWNrZXQgc3R5bGUuXG4gICAqL1xuICBzdGF0aWMgbm9ybWFsaXplVHJpcGxlQnJhY2tldHModGVtcGxhdGUpIHtcbiAgICBpZiAodHlwZW9mIHRlbXBsYXRlICE9PSAnc3RyaW5nJyB8fCB0ZW1wbGF0ZS5pbmRleE9mKCd7e3snKSA9PT0gLTEpIHtcbiAgICAgIHJldHVybiB0ZW1wbGF0ZVxuICAgIH1cbiAgICAvLyBNYXRjaCBiYWxhbmNlZCB0cmlwbGUtYnJhY2tldHMgY29udGFpbmluZyBhbnl0aGluZyB0aGF0IGlzbid0IGFcbiAgICAvLyBicmFjZSBjaGFyYWN0ZXIuIEtlZXBzIHRoZSBjYXB0dXJlZCBpbm5lciBjb250ZW50LCBzdHJpcHMgdGhlXG4gICAgLy8gb3V0ZXIgdGhpcmQgYnJhY2Ugb24gZWFjaCBzaWRlLlxuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXHtcXHtcXHsoW157fV0rPylcXH1cXH1cXH0vZywgJ3t7JDF9fScpXG4gIH1cblxuICAvLyBGSU5EIENPUlJFQ1QgTkVTVEVEIERBVEFcbiAgc3RhdGljIGdldE5lc3RlZERhdGFSZWR1Y2VyKGRhdGEgPSB7fSwgcGFyYW0gPSAnJykge1xuICAgIGNvbnN0IGRhdGFSZWR1Y2VyID0gKG5lc3RlZERhdGEsIHN0cikgPT4ge1xuICAgICAgaWYgKG5lc3RlZERhdGFbc3RyXSkge1xuICAgICAgICByZXR1cm4gbmVzdGVkRGF0YVtzdHJdXG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIG5lc3RlZERhdGEgPT09ICdzdHJpbmcnID8gbmVzdGVkRGF0YSA6ICcnXG4gICAgfVxuXG4gICAgcmV0dXJuIC8oXFwuKS9nbS50ZXN0KFN0cmluZyhwYXJhbSkpID8gU3RyaW5nKHBhcmFtKS5zcGxpdCgnLicpLnJlZHVjZShkYXRhUmVkdWNlciwgZGF0YSkgOiBkYXRhW3BhcmFtXSA/PyAnJ1xuICB9XG5cbiAgc3RhdGljIGdldFN0cmluZ0FycmF5KHRlbXBsYXRlKSB7XG4gICAgY29uc3Qgc3RyQXJyID0gdGVtcGxhdGUuc3BsaXQoRG9tRWxlbWVudFRlbXBsYXRlLmZpbmRUbXBsTG9vcHNSRSgpKVxuICAgIGNvbnN0IGVtcHR5UkUgPSAvXihbXFxcXG5cXHNcXFddKykkL1xuICAgIC8vIGZpbmRUbXBsTG9vcHNSRSBoYXMgVFdPIGNhcHR1cmUgZ3JvdXBzICh0aGUgZnVsbCBsb29wIG1hdGNoLCBhbmQgdGhlXG4gICAgLy8gXFwyLWJhY2tyZWZlcmVuY2VkIGtleSBuYW1lKS4gV2hlbiB1c2VkIHdpdGggU3RyaW5nLnByb3RvdHlwZS5zcGxpdCwgdGhlXG4gICAgLy8gc2Vjb25kIGdyb3VwIGlzIGVtaXR0ZWQgaW50byB0aGUgcmVzdWx0IGFycmF5IGFzIGEgbGVha2VkIGNodW5rLlxuICAgIC8vXG4gICAgLy8gVGhlIGNodW5rcyBhcnJpdmUgaW4gYSBwcmVkaWN0YWJsZSAzLXN0ZXAgY3ljbGU6XG4gICAgLy8gICBpbmRleCAwOiAgICAgICAgICAgICAgICBwcmUtdGV4dCBiZWZvcmUgdGhlIGZpcnN0IGxvb3BcbiAgICAvLyAgIGluZGV4IDE6IGZ1bGwgbWF0Y2ggICAgIHRoZSBsb29wIChrZWVwKVxuICAgIC8vICAgaW5kZXggMjogZ3JvdXAtMiBsZWFrICAgdGhlIGxvb3AncyBrZXkgbmFtZSAoZGlzY2FyZClcbiAgICAvLyAgIGluZGV4IDM6ICAgICAgICAgICAgICAgIGJldHdlZW4tbG9vcHMgdGV4dFxuICAgIC8vICAgaW5kZXggNDogZnVsbCBtYXRjaFxuICAgIC8vICAgaW5kZXggNTogZ3JvdXAtMiBsZWFrXG4gICAgLy8gICAuLi5cbiAgICAvLyBTbyBhbnkgaW5kZXggaSB3aGVyZSBpID49IDIgYW5kIChpIC0gMikgJSAzID09PSAwIGlzIGEga2V5LW5hbWUgbGVha1xuICAgIC8vIHRoYXQgc2hvdWxkIG5vdCBmbG93IGludG8gdGhlIHJlbmRlciBwaXBlbGluZS5cbiAgICBjb25zdCB3aXRob3V0TGVha3MgPSBzdHJBcnIuZmlsdGVyKChfLCBpKSA9PiAhKGkgPj0gMiAmJiAoaSAtIDIpICUgMyA9PT0gMCkpXG4gICAgY29uc3QgZmlsdGVyT3V0RW1wdHlTdHJpbmdzID0gcyA9PiBzLm1hdGNoKGVtcHR5UkUpXG4gICAgY29uc3QgZmluYWxTdHIgPSByZWplY3QoZmlsdGVyT3V0RW1wdHlTdHJpbmdzLCB3aXRob3V0TGVha3MpXG5cbiAgICByZXR1cm4gZmluYWxTdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdleCB0aGF0IGZpbmRzIHRvcC1sZXZlbCBsb29wIHNlY3Rpb25zLCBwYWlyaW5nIGVhY2ggb3BlbmluZyB0YWcgd2l0aCBhXG4gICAqIGNsb3NpbmcgdGFnIG9mIHRoZSBTQU1FIE5BTUUgdmlhIHRoZSBcXDIgYmFja3JlZmVyZW5jZS4gVGhpcyBpcyB3aGF0IG1ha2VzXG4gICAqIHt7I3Jvd3N9fTx0cj57eyNjZWxsc319PHRkPnt7Ln19PC90ZD57ey9jZWxsc319PC90cj57ey9yb3dzfX0gbWF0Y2ggYXMgYVxuICAgKiBzaW5nbGUgb3V0ZXIgbG9vcCByYXRoZXIgdGhhbiBnZXR0aW5nIHRydW5jYXRlZCBhdCB0aGUgaW5uZXIge3svY2VsbHN9fS5cbiAgICovXG4gIHN0YXRpYyBmaW5kVG1wbExvb3BzUkUoKSB7XG4gICAgcmV0dXJuIC8oe3sjKFtcXHcuXSspfX1bXFx3XFxuXFxzXFxXXSs/e3tcXC9cXDJ9fSkvZ21cbiAgfVxuXG4gIHN0YXRpYyBwYXJzZVRtcGxMb29wc1JFKCkge1xuICAgIHJldHVybiAvKHt7IyhbXFx3Ll0rKX19KShbXFx3XFxuXFxzXFxXXSs/KSh7e1xcL1xcMn19KS9nbVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2V4IGZvciBmaW5kaW5nIGEgc2luZ2xlIGlubmVyIGxvb3AgaW5zaWRlIGFuIG91dGVyIGxvb3AncyBib2R5LlxuICAgKiBJZGVudGljYWwgaW4gZm9ybSB0byBwYXJzZVRtcGxMb29wc1JFLCBidXQgY3JlYXRlZCBmcmVzaCB0byBhdm9pZFxuICAgKiBzaGFyZWQtbGFzdEluZGV4IGJ1Z3Mgd2l0aCBnbG9iYWwgcmVnZXhlcyB3aGVuIHVzZWQgaW4gLnJlcGxhY2UgY2FsbGJhY2tzLlxuICAgKi9cbiAgc3RhdGljIGlubmVyTG9vcFJFKCkge1xuICAgIHJldHVybiAvKHt7IyhbXFx3Ll0rKX19KShbXFx3XFxuXFxzXFxXXSs/KSh7e1xcL1xcMn19KS9nbVxuICB9XG5cbiAgc3RhdGljIHN3YXBQYXJhbXNGb3JUYWdzUkUoKSB7XG4gICAgcmV0dXJuIC8oe3spKC4qPykofX0pL2dtXG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0cyB3aGV0aGVyIGEgdGVtcGxhdGUgYm9keSBjb250YWlucyBhbnkge3sja2V5fX0uLi57ey9rZXl9fSBwYWlyLlxuICAgKiBVc2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBpbm5lci1sb29wIHBhc3MgaXMgbmVlZGVkLCBhbmQgdG8gZGV0ZWN0XG4gICAqIHR3by1sZXZlbCBuZXN0aW5nIGZvciB3YXJuaW5nIHB1cnBvc2VzLlxuICAgKi9cbiAgc3RhdGljIGhhc0xvb3Aoc3RyKSB7XG4gICAgcmV0dXJuIERvbUVsZW1lbnRUZW1wbGF0ZS5pbm5lckxvb3BSRSgpLnRlc3Qoc3RyKVxuICB9XG5cbiAgcmVtb3ZlVGhpcygpIHtcbiAgICBpZiAodGhpcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZpbmFsQXJyID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnRlbXBsYXRlRGF0YSA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy50ZW1wbGF0ZSA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyBSZXR1cm5zIGEgZG9jdW1lbnQgZnJhZ21lbnQgZ2VuZXJhdGVkIGZyb20gdGhlIHRlbXBsYXRlIGFuZCBhbnkgYWRkZWQgZGF0YS5cbiAgICovXG4gIHJlbmRlckRvY0ZyYWcoKSB7XG4gICAgbGV0IGh0bWwgPSBEb21FbGVtZW50VGVtcGxhdGUucmVwbGFjZUltZ1BhdGgodGhpcy5maW5hbEFyci5qb2luKCcnKSlcbiAgICBpZiAodGhpcy50ZXN0TW9kZSAhPT0gdHJ1ZSkge1xuICAgICAgaHRtbCA9IHNhbml0aXplSFRNTChodG1sKVxuICAgIH1cbiAgICBjb25zdCBpc1RhYmxlU3ViVGFnID0gL14oW14+XSo/KSg8KXsxfShcXGIpKHRoZWFkfGNvbHxjb2xncm91cHx0Ym9keXx0ZHx0Zm9vdHx0cnx0aCkoXFxiKShbXlxcMF0qKSQvLnRlc3QoaHRtbClcbiAgICBjb25zdCBlbCA9IGlzVGFibGVTdWJUYWcgPyBodG1sIDogZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoaHRtbClcblxuICAgIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMucmVtb3ZlVGhpcywgMilcbiAgICByZXR1cm4gZWxcbiAgfVxuXG4gIHJlbmRlclRvU3RyaW5nKCkge1xuICAgIGxldCBodG1sID0gdGhpcy5maW5hbEFyci5qb2luKCcnKVxuICAgIGh0bWwgPSBEb21FbGVtZW50VGVtcGxhdGUucmVwbGFjZUltZ1BhdGgoaHRtbClcbiAgICB3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJlbW92ZVRoaXMsIDIpXG4gICAgcmV0dXJuIGh0bWxcbiAgfVxuXG4gIGdldFRlbXBsYXRlU3RyaW5nKCkge1xuICAgIHJldHVybiB0aGlzLmZpbmFsQXJyLmpvaW4oJycpXG4gIH1cblxuICBmb3JtYXRUZW1wbGF0ZSh0ZW1wbGF0ZSkge1xuICAgIHJldHVybiBbJ1NDUklQVCcsICdURU1QTEFURSddLmluY2x1ZGVzKHByb3AoJ25vZGVOYW1lJywgdGVtcGxhdGUpKSA9PT0gdHJ1ZSA/IHRlbXBsYXRlLmlubmVySFRNTCA6IHRlbXBsYXRlXG4gIH1cblxuICBnZXREYXRhVmFsRnJvbVBhdGhTdHIocGF0aFN0ciwgZGF0YUZpbGUpIHtcbiAgICBjb25zdCBwYXRoQXJyID0gU3RyaW5nKHBhdGhTdHIpLnNwbGl0KCcuJylcbiAgICBjb25zdCBwYXRoRGF0YSA9IHBhdGgocGF0aEFyciwgZGF0YUZpbGUpXG4gICAgcmV0dXJuIHBhdGhEYXRhIHx8ICcnXG4gIH1cblxuICBhZGRQYXJhbXMoc3RyKSB7XG4gICAgY29uc3QgcmVwbGFjZVRhZ3MgPSAoc3RyLCBwMSwgcDIsIHAzKSA9PiB7XG4gICAgICByZXR1cm4gRG9tRWxlbWVudFRlbXBsYXRlLmdldE5lc3RlZERhdGFSZWR1Y2VyKHRoaXMudGVtcGxhdGVEYXRhLCBwMilcbiAgICB9XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKERvbUVsZW1lbnRUZW1wbGF0ZS5zd2FwUGFyYW1zRm9yVGFnc1JFKCksIHJlcGxhY2VUYWdzKVxuICB9XG5cbiAgc3RhdGljIHJlcGxhY2VJbWdQYXRoKHRlbXBsYXRlU3RyKSB7XG4gICAgY29uc3QgeyBJTUdfUEFUSCB9ID0gU3B5bmVBcHBQcm9wZXJ0aWVzXG4gICAgaWYgKElNR19QQVRIICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRlbXBsYXRlU3RyID0gdGVtcGxhdGVTdHIucmVwbGFjZUFsbCgvc3JjXFxzKj1cXHMqKFsnXCJdKWltZ3NcXC8vZywgYHNyYz0kMSR7SU1HX1BBVEh9YClcbiAgICAgIHJldHVybiB0ZW1wbGF0ZVN0ci5yZXBsYWNlQWxsKC91cmxcXChcXHMqKFsnXCJdPylpbWdzXFwvL2csIGB1cmwoJDEke0lNR19QQVRIfWApXG4gICAgfVxuICAgIHJldHVybiB0ZW1wbGF0ZVN0clxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgc2luZ2xlIGlubmVyIGxvb3AgKG9uZSBsZXZlbCBkb3duKSBpbnNpZGUgYW4gb3V0ZXItbG9vcCBib2R5LFxuICAgKiB1c2luZyBgcGFyZW50SXRlbWAgYXMgdGhlIGRhdGEgY29udGV4dC4gSWYgdGhlIGlubmVyIGJvZHkgaXRzZWxmIGNvbnRhaW5zXG4gICAqIGFub3RoZXIgbG9vcCwgYSBkZWJ1Zy1tb2RlIHdhcm5pbmcgaXMgbG9nZ2VkIGFuZCB0aGF0IGRlZXBlciBsb29wIGlzIG5vdFxuICAgKiBwcm9jZXNzZWQuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGJvZHkgc3RyaW5nIHdpdGggYW55IGlubmVyIGxvb3AgZXhwYW5kZWQsIHJlYWR5IGZvclxuICAgKiBvdXRlci1sZXZlbCB2YXJpYWJsZSBzdWJzdGl0dXRpb24uXG4gICAqL1xuICBwcm9jZXNzSW5uZXJMb29wKGJvZHlTdHIsIHBhcmVudEl0ZW0pIHtcbiAgICBjb25zdCBpbm5lclJFID0gRG9tRWxlbWVudFRlbXBsYXRlLmlubmVyTG9vcFJFKClcblxuICAgIHJldHVybiBib2R5U3RyLnJlcGxhY2UoaW5uZXJSRSwgKGZ1bGxNYXRjaCwgb3BlblRhZywgaW5uZXJLZXksIGlubmVyQm9keSAvKiwgY2xvc2VUYWcgKi8pID0+IHtcbiAgICAgIC8vIERldGVjdCBkaXNhbGxvd2VkIHNlY29uZC1sZXZlbCBuZXN0aW5nIGluc2lkZSB0aGUgaW5uZXIgYm9keS5cbiAgICAgIGlmIChEb21FbGVtZW50VGVtcGxhdGUuaGFzTG9vcChpbm5lckJvZHkpID09PSB0cnVlKSB7XG4gICAgICAgIGlmIChTcHluZUFwcFByb3BlcnRpZXMuZGVidWcgPT09IHRydWUgJiYgdGhpcy50ZXN0TW9kZSAhPT0gdHJ1ZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdTcHluZSBXYXJuaW5nOiBEb21FbGVtZW50VGVtcGxhdGUgc3VwcG9ydHMgb25lIGxldmVsIG9mIG5lc3RlZCBhcnJheSBsb29wcy4gJyArXG4gICAgICAgICAgICBgQSBkZWVwZXIgbmVzdGVkIGxvb3Agd2FzIGRldGVjdGVkIGluc2lkZSBcInt7IyR7aW5uZXJLZXl9fX1cIi4gYCArXG4gICAgICAgICAgICAnQ29uc2lkZXIgcmVzdHJ1Y3R1cmluZyB2aWEgbmVzdGVkIFZpZXdTdHJlYW1zIGluc3RlYWQuJ1xuICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICAvLyBTdHJpcCB1bnN1cHBvcnRlZCBkZWVwZXItbGV2ZWwgc2VjdGlvbiB0YWdzIHNvIHRoZXkgZG9uJ3QgZW1pdCBhc1xuICAgICAgICAvLyBnYXJibGVkIHZhcmlhYmxlcyBkdXJpbmcgc3Vic3RpdHV0aW9uIGJlbG93LlxuICAgICAgICBpbm5lckJvZHkgPSBpbm5lckJvZHkucmVwbGFjZSgve3tbIy9dW1xcdy5dK319L2csICcnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpbm5lckRhdGEgPSBEb21FbGVtZW50VGVtcGxhdGUuZ2V0TmVzdGVkRGF0YVJlZHVjZXIocGFyZW50SXRlbSwgaW5uZXJLZXkpXG5cbiAgICAgIGlmIChpc05pbChpbm5lckRhdGEpID09PSB0cnVlIHx8IGlzRW1wdHkoaW5uZXJEYXRhKSkge1xuICAgICAgICByZXR1cm4gJydcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW5uZXJBcnIgPSBBcnJheS5pc0FycmF5KGlubmVyRGF0YSkgPyBpbm5lckRhdGEgOiBbaW5uZXJEYXRhXVxuXG4gICAgICAvLyBXaGlsZSBwcm9jZXNzaW5nIGFuIGlubmVyIGxvb3AsIHRoZSBcIm91dGVyXCIgZGF0YSBmb3IgQ01TIHN0cmluZy1pdGVtXG4gICAgICAvLyBsb29rdXBzIGlzIHRoZSBjdXJyZW50IGlubmVyRGF0YSAodGhlIGFycmF5L29iamVjdCB0aGUgaW5uZXIgaXRlbXNcbiAgICAgIC8vIGJlbG9uZyB0byksIG5vdCB0aGUgb3JpZ2luYWwgb3V0ZXItbG9vcCBhcnJheS4gU3dhcCBpdCBpbiwgcmVzdG9yZVxuICAgICAgLy8gd2hlbiB0aGUgaW5uZXIgcGFzcyBjb21wbGV0ZXMuXG4gICAgICBjb25zdCBwcmV2aW91c091dGVyID0gdGhpcy5jdXJyZW50T3V0ZXJMb29wRGF0YVxuICAgICAgdGhpcy5jdXJyZW50T3V0ZXJMb29wRGF0YSA9IGlubmVyRGF0YVxuXG4gICAgICBjb25zdCByZW5kZXJlZCA9IGlubmVyQXJyLm1hcCgoaW5uZXJJdGVtLCBpbm5lcklkeCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdWJzdGl0dXRlRm9ySXRlbShpbm5lckJvZHksIGlubmVySXRlbSwgaW5uZXJJZHgpXG4gICAgICB9KS5qb2luKCcnKVxuXG4gICAgICB0aGlzLmN1cnJlbnRPdXRlckxvb3BEYXRhID0gcHJldmlvdXNPdXRlclxuICAgICAgcmV0dXJuIHJlbmRlcmVkXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJzdGl0dXRlcyB7ey4uLn19IHZhcmlhYmxlcyBpbiBgc3RyYCB1c2luZyBgaXRlbWAgYXMgdGhlIGRhdGEgY29udGV4dC5cbiAgICpcbiAgICogVGhyZWUgY2FzZXM6XG4gICAqXG4gICAqICAgMS4gU3RyaW5nIGl0ZW0gKyBwcmltaXRpdmUge3sufX0ve3suKn19IHRlbXBsYXRlOlxuICAgKiAgICAgIGRpcmVjdCB0ZXh0IHN1YnN0aXR1dGlvbiAobm8gQ01TIHdyYXBwaW5nIHBvc3NpYmxlIOKAlCB0aGlzIHBhdGggb25seVxuICAgKiAgICAgIHJ1bnMgd2hlbiBmb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YSBoYXMgTk9UIHdyYXBwZWQgdGhlIHRhZykuXG4gICAqXG4gICAqICAgMi4gU3RyaW5nIGl0ZW0gKyBub24tcHJpbWl0aXZlIHRlbXBsYXRlOlxuICAgKiAgICAgIGNhbiBoYXBwZW4gdHdvIHdheXM6IChhKSBhIHNlY3Rpb24gaXRlcmF0aW5nIHN0cmluZ3Mgd2hlcmVcbiAgICogICAgICBmb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YSBoYXMgcmVwbGFjZWQge3sufX0ve3suKn19IHdpdGhcbiAgICogICAgICB7e3NweW5lTG9vcEtleX19ICsge3tvcmlnS2V5fX0gaW5zaWRlIGEgPHNweW5lLWNtcy1pdGVtPiB3cmFwcGVyLFxuICAgKiAgICAgIG9yIChiKSBhIG5vbi1wcm94eSB0ZW1wbGF0ZSB3aXRoIHBvc2l0aW9uYWwgdG9rZW5zIG9ubHkuXG4gICAqICAgICAgQnVpbGQgYSBjb250ZXh0IHRoYXQgc2F0aXNmaWVzIGJvdGgg4oCUIHNweW5lTG9vcEtleSA9IHRoZSBzdHJpbmcsXG4gICAqICAgICAgcGx1cyBfX2Ntc19fZGF0YUlkIC8gb3JpZ0tleSBsb29rZWQgdXAgb24gdGhlIHBhcmVudCBhcnJheSB3aGVuXG4gICAqICAgICAgcHJveHkgZGF0YSBpcyBhY3RpdmUuXG4gICAqXG4gICAqICAgMy4gT2JqZWN0IGl0ZW06XG4gICAqICAgICAgdGhlIGNvbnZlbnRpb25hbCBwYXRoIOKAlCBidWlsZCBhIGxvb2t1cCBvYmplY3Qgd2l0aCB0aGUgaXRlbSdzXG4gICAqICAgICAgcHJvcGVydGllcyBwbHVzIHBvc2l0aW9uYWwgdG9rZW5zLCBzdWJzdGl0dXRlIGJ5IHByb3BlcnR5IG5hbWVcbiAgICogICAgICBvciBkb3QtcGF0aC5cbiAgICovXG4gIHN1YnN0aXR1dGVGb3JJdGVtKHN0ciwgaXRlbSwgaW5kZXgpIHtcbiAgICAvLyBDYXNlIDE6IHN0cmluZyBpdGVtIHdpdGggYSBwcmltaXRpdmUtdGFnIHRlbXBsYXRlLlxuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChEb21FbGVtZW50VGVtcGxhdGUuaXNQcmltaXRpdmVUYWcoc3RyKSkge1xuICAgICAgICBjb25zdCBlc2NhcGVkID0gaXRlbS5yZXBsYWNlKC9cXCQvZywgJyQkJCQnKSAvLyAkIC0+ICQkIGZvciByZXBsYWNlKCkgbGl0ZXJhbCBzYWZldHlcbiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKERvbUVsZW1lbnRUZW1wbGF0ZS5zd2FwUGFyYW1zRm9yVGFnc1JFKCksIGVzY2FwZWQpXG4gICAgICB9XG5cbiAgICAgIC8vIENhc2UgMjogc3RyaW5nIGl0ZW0gd2l0aCBhIG5vbi1wcmltaXRpdmUgdGVtcGxhdGUuXG4gICAgICBjb25zdCBjdHggPSB0aGlzLmJ1aWxkU3RyaW5nSXRlbUNvbnRleHQoaXRlbSwgaW5kZXgpXG4gICAgICByZXR1cm4gdGhpcy5zdWJzdGl0dXRlT2JqZWN0KHN0ciwgY3R4KVxuICAgIH1cblxuICAgIC8vIENhc2UgMzogb2JqZWN0IGl0ZW0uXG4gICAgY29uc3QgZGF0YU9iaiA9IHRoaXMuYnVpbGRJdGVtQ29udGV4dChpdGVtLCBpbmRleClcbiAgICByZXR1cm4gdGhpcy5zdWJzdGl0dXRlT2JqZWN0KHN0ciwgZGF0YU9iailcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIHBlci1pdGVyYXRpb24gbG9va3VwIGNvbnRleHQgZm9yIGEgU1RSSU5HIGl0ZW0uXG4gICAqXG4gICAqIEFsd2F5cyBpbmNsdWRlczpcbiAgICogICAtIHNweW5lTG9vcEtleTogdGhlIHN0cmluZyBpdHNlbGYgKG1hdGNoZXMgdGhlIENNUyBwcm94eSB3cmFwcGluZyxcbiAgICogICAgIHdoaWNoIHJlcGxhY2VzIHt7Ln19L3t7Lip9fSBpbnNpZGUgc3RyaW5nIGxvb3BzIHdpdGgge3tzcHluZUxvb3BLZXl9fSlcbiAgICogICAtIGxvb3BJbmRleCAvIGxvb3BOdW06IHBvc2l0aW9uYWwgdG9rZW5zXG4gICAqXG4gICAqIFdoZW4gcHJveHkgZGF0YSBpcyBhY3RpdmUsIGFkZGl0aW9uYWxseSBpbmNsdWRlczpcbiAgICogICAtIF9fY21zX19kYXRhSWQ6IHRoZSBDTVMgaWRlbnRpZmllciBmb3IgdGhlIFBBUkVOVCBhcnJheSAodGhlIHN0cmluZ1xuICAgKiAgICAgaXRlbXMgdGhlbXNlbHZlcyBhcmUgcHJpbWl0aXZlcyBhbmQgZG9uJ3QgY2FycnkgdGhlIGlkKVxuICAgKiAgIC0gb3JpZ0tleTogdGhlIG9yaWdpbmFsIGtleSB0aGUgQ01TIHVzZXMgdG8gYWRkcmVzcyB0aGlzIHNwZWNpZmljXG4gICAqICAgICBzdHJpbmcgd2l0aGluIGl0cyBwYXJlbnQsIGxvb2tlZCB1cCB2aWEgX19jbXNfX2tleUZvcl88aXRlbT5cbiAgICovXG4gIGJ1aWxkU3RyaW5nSXRlbUNvbnRleHQoaXRlbSwgaW5kZXgpIHtcbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgc3B5bmVMb29wS2V5OiBpdGVtLFxuICAgICAgbG9vcEluZGV4OiBpbmRleCxcbiAgICAgIGxvb3BOdW06IGluZGV4ICsgMVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzUHJveHlEYXRhID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBvdXRlckRhdGEgPSB0aGlzLmN1cnJlbnRPdXRlckxvb3BEYXRhXG4gICAgICBpZiAob3V0ZXJEYXRhICYmIHR5cGVvZiBvdXRlckRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGNvbnRleHQuX19jbXNfX2RhdGFJZCA9IG91dGVyRGF0YS5fX2Ntc19fZGF0YUlkIHx8ICcnXG4gICAgICAgIGNvbnN0IGtleUlkU3RyID0gYF9fY21zX19rZXlGb3JfJHtpdGVtfWBcbiAgICAgICAgY29udGV4dC5vcmlnS2V5ID0gb3V0ZXJEYXRhW2tleUlkU3RyXSAhPT0gdW5kZWZpbmVkID8gb3V0ZXJEYXRhW2tleUlkU3RyXSA6ICcnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb250ZXh0Ll9fY21zX19kYXRhSWQgPSAnJ1xuICAgICAgICBjb250ZXh0Lm9yaWdLZXkgPSAnJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBwZXItaXRlcmF0aW9uIGxvb2t1cCBjb250ZXh0IGZvciBhbiBPQkpFQ1QgaXRlbSwgaW5jbHVkaW5nXG4gICAqIENNUy1wcm94eSBtZXRhZGF0YSB3aGVuIHRoaXMgdGVtcGxhdGUgaXMgcmVuZGVyaW5nIHByb3hpZWQgZGF0YS5cbiAgICovXG4gIGJ1aWxkSXRlbUNvbnRleHQoaXRlbSwgaW5kZXgpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwge1xuICAgICAgbG9vcEluZGV4OiBpbmRleCxcbiAgICAgIGxvb3BOdW06IGluZGV4ICsgMVxuICAgIH0pXG5cbiAgICBpZiAodGhpcy5pc1Byb3h5RGF0YSA9PT0gdHJ1ZSkge1xuICAgICAgY29udGV4dC5fX2Ntc19fZGF0YUlkID0gaXRlbS5fX2Ntc19fZGF0YUlkXG4gICAgICBjb250ZXh0LnNweW5lTG9vcEtleSA9IGl0ZW1cbiAgICAgIGNvbnRleHQubG9vcEluZGV4ID0gaW5kZXhcbiAgICAgIGNvbnRleHQubG9vcE51bSA9IGluZGV4ICsgMVxuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMge3trZXl9fSBhbmQge3thLmIuY319IHRva2VucyBpbiBgc3RyYCB1c2luZyBgY3R4YCBhcyB0aGUgc291cmNlLlxuICAgKi9cbiAgc3Vic3RpdHV0ZU9iamVjdChzdHIsIGN0eCkge1xuICAgIGNvbnN0IHJlRG90ID0gLyhcXC4pL2dtXG4gICAgY29uc3QgcG9zaXRpb25hbCA9IHsgbG9vcEluZGV4OiBjdHgubG9vcEluZGV4LCBsb29wTnVtOiBjdHgubG9vcE51bSB9XG5cbiAgICBjb25zdCByZXBsYWNlciA9IChtYXRjaCwgcDEsIHAyKSA9PiB7XG4gICAgICAvLyBBdXRvLWluamVjdGVkIHBvc2l0aW9uYWwgdG9rZW5zIHRha2UgcHJlY2VkZW5jZVxuICAgICAgaWYgKHBvc2l0aW9uYWxbcDJdICE9PSB1bmRlZmluZWQpIHJldHVybiBwb3NpdGlvbmFsW3AyXVxuXG4gICAgICAvLyBTaW1wbGUga2V5IGFjY2Vzc1xuICAgICAgaWYgKHJlRG90LnRlc3QocDIpID09PSBmYWxzZSAmJiBjdHhbcDJdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGN0eFtwMl1cbiAgICAgIH1cblxuICAgICAgLy8gRG90LXBhdGggYWNjZXNzXG4gICAgICByZXR1cm4gdGhpcy5nZXREYXRhVmFsRnJvbVBhdGhTdHIocDIsIGN0eClcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoRG9tRWxlbWVudFRlbXBsYXRlLnN3YXBQYXJhbXNGb3JUYWdzUkUoKSwgcmVwbGFjZXIpXG4gIH1cblxuICAvKipcbiAgICogRW50cnkgcG9pbnQgZm9yIGVhY2ggdG9wLWxldmVsIGxvb3AgbWF0Y2guIEV4dHJhY3RzIGxvb3AgZGF0YSwgcnVucyB0aGVcbiAgICogaW5uZXItbG9vcCBwYXNzIG9uIHRoZSBib2R5IGZvciBlYWNoIGl0ZXJhdGlvbiwgdGhlbiBzdWJzdGl0dXRlcyBvdXRlclxuICAgKiB2YXJpYWJsZXMuXG4gICAqL1xuICBwYXJzZVRoZVRtcGxMb29wKHN0ciwgcDEsIHAyLCBwMykge1xuICAgIGNvbnN0IG91dGVyQm9keSA9IHAzXG4gICAgY29uc3QgZWxEYXRhID0gRG9tRWxlbWVudFRlbXBsYXRlLmdldE5lc3RlZERhdGFSZWR1Y2VyKHRoaXMudGVtcGxhdGVEYXRhLCBwMilcblxuICAgIGlmIChpc05pbChlbERhdGEpID09PSB0cnVlIHx8IGlzRW1wdHkoZWxEYXRhKSkge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuXG4gICAgLy8gU3Rhc2ggdGhlIG91dGVyIGRhdGEgc28gdGhhdCBwZXItaXRlcmF0aW9uIHN1YnN0aXR1dGlvbiBjYW4gbG9vayB1cFxuICAgIC8vIENNUyBwcm94eSBtZXRhZGF0YSAoX19jbXNfX2RhdGFJZCwgX19jbXNfX2tleUZvcl8qKSB0aGF0IGxpdmVzIG9uIHRoZVxuICAgIC8vIHBhcmVudCBhcnJheSBvYmplY3Qg4oCUIG5vdCBvbiBpbmRpdmlkdWFsIHN0cmluZyBlbGVtZW50cy5cbiAgICBjb25zdCBwcmV2aW91c091dGVyID0gdGhpcy5jdXJyZW50T3V0ZXJMb29wRGF0YVxuICAgIHRoaXMuY3VycmVudE91dGVyTG9vcERhdGEgPSBlbERhdGFcblxuICAgIGNvbnN0IGVsQXJyID0gQXJyYXkuaXNBcnJheShlbERhdGEpID8gZWxEYXRhIDogW2VsRGF0YV1cblxuICAgIC8vIFdoZXRoZXIgdGhlIG91dGVyIGJvZHkgY29udGFpbnMgYW4gaW5uZXIgbG9vcCBpcyBjaGVhcCB0byB0ZXN0IGFuZCBsZXRzXG4gICAgLy8gdXMgc2tpcCB0aGUgaW5uZXItbG9vcCBwcm9jZXNzaW5nIGVudGlyZWx5IGZvciB0aGUgY29tbW9uIHNpbmdsZS1sZXZlbCBjYXNlLlxuICAgIGNvbnN0IGJvZHlIYXNJbm5lckxvb3AgPSBEb21FbGVtZW50VGVtcGxhdGUuaGFzTG9vcChvdXRlckJvZHkpXG5cbiAgICBjb25zdCByZW5kZXJlZCA9IGVsQXJyLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHkgPSBib2R5SGFzSW5uZXJMb29wXG4gICAgICAgID8gdGhpcy5wcm9jZXNzSW5uZXJMb29wKG91dGVyQm9keSwgaXRlbSlcbiAgICAgICAgOiBvdXRlckJvZHlcblxuICAgICAgcmV0dXJuIHRoaXMuc3Vic3RpdHV0ZUZvckl0ZW0oYm9keSwgaXRlbSwgaW5kZXgpXG4gICAgfSkuam9pbignJylcblxuICAgIHRoaXMuY3VycmVudE91dGVyTG9vcERhdGEgPSBwcmV2aW91c091dGVyXG4gICAgcmV0dXJuIHJlbmRlcmVkXG4gIH1cbn1cbiIsImltcG9ydCB7IGJhc2VDb3JlTWl4aW5zIH0gZnJvbSAnLi4vdXRpbHMvbWl4aW5zL2Jhc2UtY29yZS1taXhpbnMuanMnXG5pbXBvcnQgeyBEb21FbGVtZW50VGVtcGxhdGUgfSBmcm9tICcuL2RvbS1lbGVtZW50LXRlbXBsYXRlLmpzJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZS5qcydcbmltcG9ydCB7IGlzLCBkZWZhdWx0VG8sIHBpY2ssIG1hcE9iakluZGV4ZWQsIGZvckVhY2hPYmpJbmRleGVkLCBwaXBlIH0gZnJvbSAncmFtZGEnXG5cbmNsYXNzIERvbUVsZW1lbnQge1xuICAvKipcbiAgICogQG1vZHVsZSBEb21FbGVtZW50XG4gICAqIEB0eXBlIHV0aWxcbiAgICpcbiAgICogQGRlc2NcbiAgICogPHA+VGhpcyBpcyB0aGUgVmlld1N0cmVhbSByZW5kZXJpbmcgZW5naW5lLjwvcD5cbiAgICogPHA+VGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgcHJvY2VzcyBmb3IgY3JlYXRpbmcgSFRNTEVsZW1lbnRzIHRoYXQgZG8gbm90IHJlcXVpcmUgdGhlIGxvZ2ljIGFuZCBvdmVyaGVhZCBvZiBhIFZpZXdTdHJlYW0gaW5zdGFuY2UuPC9wPlxuICAgKiA8YnV0dG9uIGNsYXNzPSdtb2RhbC1idG4gYnRuIGJ0bi1ibHVlLXJlZicgZGF0YS10eXBlPSdtb2RhbC13aW5kb3cnIGRhdGEtbnVtPTgwMCBkYXRhLXZhbHVlPSdhdHRyaWJ1dGVzJz5WaWV3IEF0dHJpYnV0ZXM8L2J1dHRvbj5cbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lIHRoZSB0YWduYW1lIGZvciB0aGlzIGRvbSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXR0cmlidXRlcyBhbnkgZG9tRWxlbWVudCBhdHRyaWJ1dGUgKGV4Y2VwdCBmb3IgY2xhc3MgKVxuICAgKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IGRhdGEgc3RyaW5nIGZvciB0ZXh0IHRhZ3MgYW5kIGpzb24gZm9yIHRlbXBsYXRlc1xuICAgKiBAcGFyYW0ge3RlbXBsYXRlfSB0ZW1wbGF0ZVxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gcHJvcHMudGFnTmFtZSAtID0gJ2Rpdic7IERlZmF1bHQgZm9yIHRhZ05hbWUuXG4gICAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwcm9wcy5hdHRyaWJ1dGVzIC0gPSB7fTsgVGhpcyBjYW4gYmUgYW55IHZhbGlkIEhUTUwgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gdGFnTmFtZS5cbiAgICogQHByb3BlcnR5IHtTdHJpbmd8T2JqZWN0fSBwcm9wcy5kYXRhID0gdW5kZWZpbmVkOyBUaGlzIGlzIGVpdGhlciBhIFN0cmluZyBmb3IgYW4gZWxlbWVudCBvciBKU09OIGRhdGEgb2JqZWN0IGZvciBhIHRlbXBsYXRlLlxuICAgKiBAcHJvcGVydHkge1N0cmluZ3xIVE1MfSBwcm9wcy50ZW1wbGF0ZSA9IHVuZGVmaW5lZDsgSWYgYSB0ZW1wbGF0ZSBpcyBkZWZpbmVkLCB0aGUgRG9tRWxlbWVudCB3aWxsIHVzZSBpdC5cbiAgICpcbiAgICovXG5cbiAgY29uc3RydWN0b3IocHJvcHMgPSB7fSwgdGVzdE1vZGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGNoZWNrRGVmYXVsdCA9IChkZmx0LCB2YWwpID0+IGRlZmF1bHRUbyhkZmx0KSh2YWwpXG5cbiAgICBwcm9wcy50YWdOYW1lID0gY2hlY2tEZWZhdWx0KCdkaXYnLCBwcm9wcy50YWdOYW1lKVxuXG4gICAgcHJvcHMuYXR0cmlidXRlcyA9IHByb3BzLmF0dHJpYnV0ZXMgIT09IHVuZGVmaW5lZCA/IHByb3BzLmF0dHJpYnV0ZXMgOiB0aGlzLmdldERvbUF0dHJpYnV0ZXMocHJvcHMpXG4gICAgcHJvcHMuYXR0cnMgPSB0aGlzLnVwZGF0ZUF0dHJzKHByb3BzLmF0dHJpYnV0ZXMpXG5cbiAgICBwcm9wcy5mcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgIHRoaXMudGVzdE1vZGUgPSB0ZXN0TW9kZVxuICAgIHRoaXMucHJvcHMgPSBwcm9wc1xuXG4gICAgdGhpcy5hZGRNaXhpbnMoKVxuICB9XG5cbiAgc2V0UHJvcChrZXksIHZhbCkge1xuICAgIHRoaXMucHJvcHNba2V5XSA9IHZhbFxuICB9XG5cbiAgZ2V0UHJvcCh2YWwpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wc1t2YWxdXG4gIH1cblxuICBnZXQgZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZWxcbiAgfVxuXG4gIHNldEVsQXR0cnMoZWwsIHBhcmFtcykge1xuICAgIGNvbnN0IGFkZEF0dHJpYnV0ZXMgPSAodmFsLCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGFkZFRvRGF0YXNldCA9ICh2YWwsIGtleSkgPT4geyBlbC5kYXRhc2V0W2tleV0gPSB2YWwgfVxuICAgICAgaWYgKGtleSA9PT0gJ2RhdGFzZXQnKSB7XG4gICAgICAgIGZvckVhY2hPYmpJbmRleGVkKGFkZFRvRGF0YXNldCwgdmFsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWwuc2V0QXR0cmlidXRlKGtleSwgdmFsKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmdldFByb3AoJ2F0dHJzJykuZm9yRWFjaChhZGRBdHRyaWJ1dGVzKVxuICAgIHJldHVybiBlbFxuICB9XG5cbiAgdXBkYXRlQXR0cnMocGFyYW1zLCBtKSB7XG4gICAgY29uc3QgdGhlTWFwID0gbSAhPT0gdW5kZWZpbmVkID8gbSA6IG5ldyBNYXAoKVxuICAgIGNvbnN0IGFkZEF0dHJpYnV0ZXMgPSAodmFsLCBrZXkpID0+IHRoZU1hcC5zZXQoa2V5LCB2YWwpXG4gICAgbWFwT2JqSW5kZXhlZChhZGRBdHRyaWJ1dGVzLCBwYXJhbXMpXG4gICAgcmV0dXJuIHRoZU1hcFxuICB9XG5cbiAgYWRkVGVtcGxhdGUoZWwpIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuZ2V0UHJvcCgndGVtcGxhdGUnKVxuXG4gICAgY29uc3QgYWRkVG1wbCA9ICh0ZW1wbGF0ZSkgPT4ge1xuICAgICAgbGV0IGRhdGEgPSB0aGlzLmdldFByb3AoJ2RhdGEnKVxuICAgICAgZGF0YSA9IGlzKE9iamVjdCwgZGF0YSkgPyBkYXRhIDoge31cbiAgICAgIGNvbnN0IGZyYWcgPSBuZXcgRG9tRWxlbWVudFRlbXBsYXRlKHRlbXBsYXRlLCBkYXRhLCB7IHRlc3RNb2RlOiB0aGlzPy50ZXN0TW9kZSB9KS5yZW5kZXJEb2NGcmFnKClcbiAgICAgIGNvbnN0IGZyYWdJc1N0cmluZyA9IGlzKFN0cmluZywgZnJhZylcbiAgICAgIGZyYWdJc1N0cmluZyA/IGVsLmlubmVySFRNTCA9IGZyYWcgOiBlbC5hcHBlbmRDaGlsZChmcmFnKVxuICAgICAgcmV0dXJuIGVsXG4gICAgfVxuICAgIGNvbnN0IGRvTm90aGluZyA9IChlbCkgPT4gZWxcbiAgICByZXR1cm4gdGVtcGxhdGUgIT09IHVuZGVmaW5lZCA/IGFkZFRtcGwodGVtcGxhdGUpIDogZG9Ob3RoaW5nKGVsKVxuICB9XG5cbiAgY3JlYXRlRWxlbWVudCh0YWdOYW1lID0gJ2RpdicpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKVxuICB9XG5cbiAgYWRkQ29udGVudChlbCkge1xuICAgIGNvbnN0IHRleHQgPSAodGhpcy5nZXRQcm9wKCdkYXRhJykpXG4gICAgY29uc3QgaXNUZXh0ID0gaXMoU3RyaW5nLCB0ZXh0KVxuICAgIGlmIChpc1RleHQgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHR4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpXG4gICAgICBlbC5hcHBlbmRDaGlsZCh0eHQpXG4gICAgfVxuICAgIHJldHVybiBlbFxuICB9XG5cbiAgZXhlY3V0ZSgpIHtcbiAgICBjb25zdCBlbCA9IHBpcGUoXG4gICAgICB0aGlzLmNyZWF0ZUVsZW1lbnQuYmluZCh0aGlzKSxcbiAgICAgIHRoaXMuc2V0RWxBdHRycy5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5hZGRUZW1wbGF0ZS5iaW5kKHRoaXMpLFxuICAgICAgdGhpcy5hZGRDb250ZW50LmJpbmQodGhpcylcbiAgICApKHRoaXMuZ2V0UHJvcCgndGFnTmFtZScpKVxuICAgIC8vIHRoaXMuZ2V0UHJvcCgnZnJhZ21lbnQnKS5hcHBlbmRDaGlsZChlbCk7XG4gICAgdGhpcy5wcm9wcy5lbCA9IGVsXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCByZW5kZXIgdGhlIEhUTUwgRWxlbWVudFxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9IEhUTUxFbGVtZW50XG4gICAqL1xuICByZW5kZXIoKSB7XG4gICAgdGhpcy5leGVjdXRlKClcbiAgICB0aGlzLnByb3BzLnRlbXBsYXRlID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5kYXRhID0gdW5kZWZpbmVkXG4gICAgdGhpcy5wcm9wcy5hdHRyaWJ1dGVzID0gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuZ2V0UHJvcCgnZWwnKVxuICB9XG5cbiAgcmVuZGVyVG9IVE1MU3RyaW5nKCkge1xuICAgIHRoaXMuZXhlY3V0ZSgpXG4gICAgdGhpcy5wcm9wcy50ZW1wbGF0ZSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucHJvcHMuZGF0YSA9IHVuZGVmaW5lZFxuICAgIHRoaXMucHJvcHMuYXR0cmlidXRlcyA9IHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmdldFByb3AoJ2VsJykub3V0ZXJIVE1MXG4gIH1cblxuICByZXR1cm5JZkRlZmluZWQob2JqLCB2YWwpIHtcbiAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzT2JqID0gdHlwZW9mICh2YWwpID09PSAndW5kZWZpbmVkJ1xuICAgICAgaXNPYmogPT09IGZhbHNlID8gb2JqW3ZhbF0gPSB2YWwgOiBvYmpbdmFsXSA9IGRlZXBNZXJnZShvYmpbdmFsXSwgdmFsKVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZXByb3BzKHZhbCkge1xuICAgIHRoaXMucmV0dXJuSWZEZWZpbmVkKHRoaXMucHJvcHMsIHZhbClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgdXBkYXRlcHJvcHNBbmRSdW4odmFsKSB7XG4gICAgdGhpcy51cGRhdGVwcm9wcyh2YWwpXG4gICAgdGhpcy5leGVjdXRlKClcbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wKCdmcmFnbWVudCcpXG4gIH1cblxuICB1bm1vdW50KCkge1xuICAgIGlmICh0aGlzLnByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZ2V0UHJvcCgnZWwnKS5yZW1vdmUoKVxuICAgICAgdGhpcy5wcm9wcyA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5nYygpXG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVGFnKHRhZ05hbWUgPSAnZGl2JykgeyB0aGlzLnVwZGF0ZXByb3BzKHRhZ05hbWUpIH1cbiAgdXBkYXRlQXR0cmlidXRlcyhhdHRycyA9IHt9KSB7IHRoaXMudXBkYXRlcHJvcHMoYXR0cnMpIH1cbiAgdXBkYXRlVGVtcGxhdGUodGVtcGxhdGUpIHsgdGhpcy51cGRhdGVwcm9wcyh0ZW1wbGF0ZSkgfVxuICB1cGRhdGVEYXRhKGRhdGEgPSB7fSkgeyB0aGlzLnVwZGF0ZXByb3BzKGRhdGEpIH1cbiAgYWRkVGFnQW5kUmVuZGVyKHRhZ05hbWUgPSAnZGl2JykgeyB0aGlzLnVwZGF0ZXByb3BzQW5kUnVuKHRhZ05hbWUpIH1cbiAgYWRkQXR0cnNpYnV0ZXNBbmRSZW5kZXIoYXR0cnMgPSB7fSkgeyB0aGlzLnVwZGF0ZXByb3BzQW5kUnVuKGF0dHJzKSB9XG4gIGFkZFRlbXBsYXRlQW5kUmVuZGVyKHRlbXBsYXRlKSB7IHRoaXMudXBkYXRlcHJvcHNBbmRSdW4odGVtcGxhdGUpIH1cbiAgYWRkRGF0YUFuZFJlbmRlcihkYXRhID0ge30pIHsgdGhpcy51cGRhdGVwcm9wc0FuZFJ1bihkYXRhKSB9XG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJBU0UgQ09SRSBNSVhJTlNcbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYWRkTWl4aW5zKCkge1xuICAgIGNvbnN0IGNvcmVNaXhpbnMgPSBiYXNlQ29yZU1peGlucygpXG4gICAgdGhpcy5nYyA9IGNvcmVNaXhpbnMuZ2MuYmluZCh0aGlzKVxuICB9XG5cbiAgZ2V0RG9tQXR0cmlidXRlcyhwcm9wcykge1xuICAgIHJldHVybiBwaWNrKHRoaXMuYXR0cmlidXRlc0FycmF5LCBwcm9wcylcbiAgfVxuXG4gIGdldCBhdHRyaWJ1dGVzQXJyYXkoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICdhY2NlcHQnLFxuICAgICAgJ2FjY2VwdC1jaGFyc2V0JyxcbiAgICAgICdhY2Nlc3NrZXknLFxuICAgICAgJ2FjdGlvbicsXG4gICAgICAnYWxpZ24nLFxuICAgICAgJ2FsbG93JyxcbiAgICAgICdhbHQnLFxuICAgICAgJ2FzeW5jJyxcbiAgICAgICdhdXRvY2FwaXRhbGl6ZScsXG4gICAgICAnYXV0b2NvbXBsZXRlJyxcbiAgICAgICdhdXRvZm9jdXMnLFxuICAgICAgJ2F1dG9wbGF5JyxcbiAgICAgICdiZ2NvbG9yJyxcbiAgICAgICdib3JkZXInLFxuICAgICAgJ2J1ZmZlcmVkJyxcbiAgICAgICdjaGFsbGVuZ2UnLFxuICAgICAgJ2NoYXJzZXQnLFxuICAgICAgJ2NoZWNrZWQnLFxuICAgICAgJ2NpdGUnLFxuICAgICAgJ2NsYXNzJyxcbiAgICAgICdjb2RlJyxcbiAgICAgICdjb2RlYmFzZScsXG4gICAgICAnY29sb3InLFxuICAgICAgJ2NvbHMnLFxuICAgICAgJ2NvbHNwYW4nLFxuICAgICAgJ2NvbnRlbnQnLFxuICAgICAgJ2NvbnRlbnRlZGl0YWJsZScsXG4gICAgICAnY29udGV4dG1lbnUnLFxuICAgICAgJ2NvbnRyb2xzJyxcbiAgICAgICdjb29yZHMnLFxuICAgICAgJ2Nyb3Nzb3JpZ2luJyxcbiAgICAgICdjc3AnLFxuICAgICAgJ2RhdGFzZXQnLFxuICAgICAgJ2RhdGV0aW1lJyxcbiAgICAgICdkZWNvZGluZycsXG4gICAgICAnZGVmYXVsdCcsXG4gICAgICAnZGVmZXInLFxuICAgICAgJ2RpcicsXG4gICAgICAnZGlybmFtZScsXG4gICAgICAnZGlzYWJsZWQnLFxuICAgICAgJ2Rvd25sb2FkJyxcbiAgICAgICdkcmFnZ2FibGUnLFxuICAgICAgJ2Ryb3B6b25lJyxcbiAgICAgICdlbmN0eXBlJyxcbiAgICAgICdmb3InLFxuICAgICAgJ2Zvcm0nLFxuICAgICAgJ2Zvcm1hY3Rpb24nLFxuICAgICAgJ2hlYWRlcnMnLFxuICAgICAgJ2hlaWdodCcsXG4gICAgICAnaGlkZGVuJyxcbiAgICAgICdoaWdoJyxcbiAgICAgICdocmVmJyxcbiAgICAgICdocmVmbGFuZycsXG4gICAgICAnaHR0cC1lcXVpdicsXG4gICAgICAnaWNvbicsXG4gICAgICAnaWQnLFxuICAgICAgJ2ltcG9ydGFuY2UnLFxuICAgICAgJ2ludGVncml0eScsXG4gICAgICAnaXNtYXAnLFxuICAgICAgJ2l0ZW1wcm9wJyxcbiAgICAgICdrZXl0eXBlJyxcbiAgICAgICdraW5kJyxcbiAgICAgICdsYWJlbCcsXG4gICAgICAnbGFuZycsXG4gICAgICAnbGFuZ3VhZ2UnLFxuICAgICAgJ2xhenlsb2FkJyxcbiAgICAgICdsaXN0JyxcbiAgICAgICdsb29wJyxcbiAgICAgICdsb3cnLFxuICAgICAgJ21hbmlmZXN0JyxcbiAgICAgICdtYXgnLFxuICAgICAgJ21heGxlbmd0aCcsXG4gICAgICAnbWlubGVuZ3RoJyxcbiAgICAgICdtZWRpYScsXG4gICAgICAnbWV0aG9kJyxcbiAgICAgICdtaW4nLFxuICAgICAgJ211bHRpcGxlJyxcbiAgICAgICdtdXRlZCcsXG4gICAgICAnbmFtZScsXG4gICAgICAnbm92YWxpZGF0ZScsXG4gICAgICAnb3BlbicsXG4gICAgICAnb3B0aW11bScsXG4gICAgICAncGF0dGVybicsXG4gICAgICAncGluZycsXG4gICAgICAncGxhY2Vob2xkZXInLFxuICAgICAgJ3Bvc3RlcicsXG4gICAgICAncHJlbG9hZCcsXG4gICAgICAncmFkaW9ncm91cCcsXG4gICAgICAncmVhZG9ubHknLFxuICAgICAgJ3JlZmVycmVycG9saWN5JyxcbiAgICAgICdyZWwnLFxuICAgICAgJ3JlcXVpcmVkJyxcbiAgICAgICdyZXZlcnNlZCcsXG4gICAgICAncm93cycsXG4gICAgICAncm93c3BhbicsXG4gICAgICAnc2FuZGJveCcsXG4gICAgICAnc2NvcGUnLFxuICAgICAgJ3Njb3BlZCcsXG4gICAgICAnc2VsZWN0ZWQnLFxuICAgICAgJ3NoYXBlJyxcbiAgICAgICdzaXplJyxcbiAgICAgICdzaXplcycsXG4gICAgICAnc2xvdCcsXG4gICAgICAnc3BhbicsXG4gICAgICAnc3BlbGxjaGVjaycsXG4gICAgICAnc3JjJyxcbiAgICAgICdzcmNkb2MnLFxuICAgICAgJ3NyY2xhbmcnLFxuICAgICAgJ3NyY3NldCcsXG4gICAgICAnc3RhcnQnLFxuICAgICAgJ3N0ZXAnLFxuICAgICAgJ3N0eWxlJyxcbiAgICAgICdzdW1tYXJ5JyxcbiAgICAgICd0YWJpbmRleCcsXG4gICAgICAndGFyZ2V0JyxcbiAgICAgICd0aXRsZScsXG4gICAgICAndHJhbnNsYXRlJyxcbiAgICAgICd0eXBlJyxcbiAgICAgICd1c2VtYXAnLFxuICAgICAgJ3ZhbHVlJyxcbiAgICAgICd3aWR0aCcsXG4gICAgICAnd3JhcCdcbiAgICBdXG4gIH1cbn1cbmNvbnN0IERvbUVsID0gRG9tRWxlbWVudFxuZXhwb3J0IHsgRG9tRWxlbWVudCwgRG9tRWwgfVxuIiwiaW1wb3J0IHsgYmFzZVN0cmVhbXNNaXhpbnMgfSBmcm9tICcuLi91dGlscy9taXhpbnMvYmFzZS1zdHJlYW1zLW1peGlucy5qcydcbmltcG9ydCB7IGNvbnZlcnREb21TdHJpbmdNYXBUb09iaiB9IGZyb20gJy4uL3V0aWxzL2ZycC10b29scy5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgZnJvbUV2ZW50IH0gZnJvbSAncnhqcydcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgY2xvbmUsIG9taXQgfSBmcm9tICdyYW1kYSdcbmNvbnN0IGlzRGV2TW9kZSA9IFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZVxuXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbUJyb2FkY2FzdGVyIHtcbiAgLyoqXG4gICAqIFRoZSBjbGFzcyB0YWtlcyBpbiBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhlICdicm9hZGNhc3RFdmVudHMnIG1ldGhvZCBhbmQgZGlyZWN0cyB0aGUgZXZlbnRzIHRvIGVpdGhlciB0aGUgVUkgb3IgUk9VVEUgY2hhbm5lbHNcbiAgICogQG1vZHVsZSBWaWV3U3RyZWFtQnJvYWRjYXN0ZXJcbiAgICogQHR5cGUgaW50ZXJuYWxcbiAgICpcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBicm9hZGNhc3RGblxuICAgKi9cblxuICBjb25zdHJ1Y3Rvcihwcm9wcywgYnJvYWRjYXN0Rm4pIHtcbiAgICB0aGlzLmFkZE1peGlucygpXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzXG4gICAgdGhpcy5icm9hZGNhc3RGbiA9IGJyb2FkY2FzdEZuXG4gICAgdGhpcy5icm9hZGNhc3Rlcih0aGlzLmJyb2FkY2FzdEZuKVxuICB9XG5cbiAgYWRkRGJsQ2xpY2tFdnQocSkge1xuICAgIGNvbnN0IGRibGNsaWNrJCA9IGZyb21FdmVudChxLCAnZGJsY2xpY2snKVxuICAgIC8vIGNvbnNvbGUubG9nKCdBRERJTkcgREJMIENMSUNLICcsIHEpO1xuICAgIGNvbnN0IHN0cmVhbSQgPSBkYmxjbGljayQucGlwZShcbiAgICAgIG1hcChwID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNsb25lKHApXG4gICAgICAgIC8vIEFERCBET1VCTEVDTElDSyBUTyBVSSBFVkVOVFNcbiAgICAgICAgZGF0YS50eXBlT3ZlclJpZGUgPSAnZGJsY2xpY2snXG4gICAgICAgIHJldHVybiBkYXRhXG4gICAgICB9KSlcbiAgICByZXR1cm4gc3RyZWFtJFxuICB9XG5cbiAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBCUk9BRENBU1QgQlVUVE9OIEVWRU5UU1xuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGJyb2FkY2FzdChhcmdzKSB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoIDw9IDAgJiYgaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBuZXN0ZWQgYXJyYXkgaW4gJHt0aGlzLnByb3BzLm5hbWV9LmJyb2FkY2FzdEV2ZW50cyBhcHBlYXJzIHRvIGJlIGVtcHR5IC0tPiB2c2lkOiR7dGhpcy5wcm9wcy52c2lkfSFgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIC8vIHBheWxvYWRzIHRvIHNlbmQsIGJhc2VkIG9uIGVpdGhlciB0aGUgYXJyYXkgb3IgdGhlIGVsZW1lbnRzIGRhdGFNYXBcbiAgICBjb25zdCBjaGFubmVsUGF5bG9hZHMgPSB7XG4gICAgICBVSTogdGhpcy5zZW5kVUlQYXlsb2FkLFxuICAgICAgUk9VVEU6IHRoaXMuc2VuZFJvdXRlUGF5bG9hZFxuICAgIH1cbiAgICAvLyBzcHJlYWQgb3BlcmF0b3IgdG8gc2VsZWN0IHZhcmlhYmxlcyBmcm9tIGFycmF5c1xuICAgIGNvbnN0IFtzZWxlY3RvciwgZXZlbnQsIGxvY2FsXSA9IGFyZ3NcbiAgICAvLyBidG4gcXVlcnlcbiAgICBsZXQgY2hhbm5lbCAvLyBob2lzdCBjaGFubmVsIGFuZCBsYXRlciBjaGVjayBpZiBjaG5sIGV4aXN0c1xuICAgIGxldCBxdWVyeSA9IHRoaXMucHJvcHMuZWwucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcblxuICAgIGlmIChxdWVyeS5sZW5ndGggPD0gMCkge1xuICAgICAgY29uc3QgZWwgPSB0aGlzLnByb3BzLmVsXG4gICAgICBjb25zdCBjaGVja1BhcmVudEVscyA9IChlbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChlbGVtZW50ID09PSBlbCkge1xuICAgICAgICAgIHF1ZXJ5ID0gW2VsZW1lbnRdXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcGx1Y2tFbEZyb21QYXJlbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsUGFyZW50ID0gZWwucGFyZW50RWxlbWVudCAhPT0gbnVsbCA/IGVsLnBhcmVudEVsZW1lbnQgOiBkb2N1bWVudFxuICAgICAgICBjb25zdCBlbFNlbGVjdGVkID0gZWxQYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICAgICAgZWxTZWxlY3RlZC5mb3JFYWNoID0gQXJyYXkucHJvdG90eXBlLmZvckVhY2hcbiAgICAgICAgZWxTZWxlY3RlZC5mb3JFYWNoKGNoZWNrUGFyZW50RWxzKVxuICAgICAgfVxuXG4gICAgICBwbHVja0VsRnJvbVBhcmVudCgpXG4gICAgfVxuXG4gICAgY29uc3QgaXNMb2NhbEV2ZW50ID0gbG9jYWwgIT09IHVuZGVmaW5lZFxuICAgIGNvbnN0IGFkZE9ic2VydmFibGUgPSAocSkgPT4ge1xuICAgICAgLy8gdGhlICBidG4gb2JzZXJ2YWJsZVxuICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9IGV2ZW50ICE9PSAnZGJsQ2xpY2snXG4gICAgICAgID8gZnJvbUV2ZW50KHEsIGV2ZW50LCB7IHByZXZlbnREZWZhdWx0OiAoKSA9PiB0cnVlIH0pXG4gICAgICAgIDogdGhpcy5hZGREYmxDbGlja0V2dChxKVxuICAgICAgLy8gc2VsZWN0IGNoYW5uZWwgYW5kIGRhdGEgdmFsdWVzIGZyb20gZWl0aGVyIHRoZSBhcnJheSBvciB0aGUgZWxlbWVudCdzIGRvbSBNYXBcbiAgICAgIGNoYW5uZWwgPSBxLmRhdGFzZXQuY2hhbm5lbC8vIGlmTmlsVGhlblVwZGF0ZShjaG5sLCBxLmRhdGFzZXQuY2hhbm5lbCk7XG4gICAgICBjb25zdCBkYXRhID0ge30vLyBjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmoocS5kYXRhc2V0KTtcbiAgICAgIGRhdGEucGF5bG9hZCA9IGNvbnZlcnREb21TdHJpbmdNYXBUb09iaihxLmRhdGFzZXQpXG4gICAgICBkYXRhLnBheWxvYWQgPSBvbWl0KFsnY2hhbm5lbCddLCBkYXRhLnBheWxvYWQpXG4gICAgICBkYXRhLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgICAvLyBwYXlsb2FkIG5lZWRzIHZzaWQjIHRvIHBhc3MgdmVyaWZpY2F0aW9uXG5cbiAgICAgIGRhdGEuc3JjRWxlbWVudCA9IHt9Ly8gcGljayhbJ3ZzaWQnLCd2aWV3TmFtZSddLCBkYXRhKTtcbiAgICAgIGRhdGEuc3JjRWxlbWVudC5pZCA9IHRoaXMucHJvcHMuaWRcbiAgICAgIGRhdGEuc3JjRWxlbWVudC52c2lkID0gdGhpcy5wcm9wcy52c2lkXG4gICAgICBkYXRhLnNyY0VsZW1lbnQuaXNMb2NhbEV2ZW50ID0gaXNMb2NhbEV2ZW50XG4gICAgICAvLyBkYXRhLnNyY0VsZW1lbnRbJ3ZpZXdOYW1lJ10gPSB0aGlzLnByb3BzLm5hbWU7XG4gICAgICBkYXRhLnNyY0VsZW1lbnQuc3JjRXZlbnQgPSBldmVudFxuICAgICAgZGF0YS5zcmNFbGVtZW50LmVsID0gcVxuICAgICAgLy8gc2VsZWN0IHRoZSBjb3JyZWN0IHBheWxvYWRcblxuICAgICAgZnVuY3Rpb24gZ2V0VmFsaWRDaGFubmVsKGNoKSB7XG4gICAgICAgIGlmIChjaCA9PT0gJ1JPVVRFJyB8fCBjaCA9PT0gJ0NIQU5ORUxfUk9VVEUnKSB7XG4gICAgICAgICAgcmV0dXJuICdST1VURSdcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2ggIT09ICdVSScgJiYgY2ggIT09ICdDSEFOTkVMX1VJJyAmJiBjaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBTcHluZUpTIHdhcm5pbmc6IFRoZSBjaGFubmVsLCAke2NofSwgaXMgbm90IGFsbG93ZWQgaGVyZSwgb25seSBcIlVJXCIgb3IgXCJST1VURVwiIGFyZSB2YWxpZCBjaGFubmVscywgZGVmYXVsdGluZyB0byBDSEFOTkVMX1VJYClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ1VJJ1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGFubmVsUGF5bG9hZCA9IGNoYW5uZWxQYXlsb2Fkc1tnZXRWYWxpZENoYW5uZWwoY2hhbm5lbCldXG4gICAgICAvLyBydW4gcGF5bG9hZFxuICAgICAgY2hhbm5lbFBheWxvYWQob2JzZXJ2YWJsZSwgZGF0YSlcbiAgICB9XG4gICAgY29uc3QgcXVlcnlJc05pbCA9IHF1ZXJ5ID09PSB1bmRlZmluZWQgfHwgcXVlcnkubGVuZ3RoIDw9IDBcbiAgICBpZiAocXVlcnlJc05pbCA9PT0gdHJ1ZSAmJiBpc0Rldk1vZGUgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGl0ZW0gJHtzZWxlY3Rvcn0sIGRvZXMgbm90IGFwcGVhciB0byBleGlzdCBpbiAke3RoaXMucHJvcHMubmFtZX0gLS0+IHZzaWQ6JHt0aGlzLnByb3BzLnZzaWR9IWApXG5cbiAgICAgIC8vIGFkZE9ic2VydmFibGUocXVlcnksIGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcXVlcnkuZm9yRWFjaCA9IEFycmF5LnByb3RvdHlwZS5mb3JFYWNoXG4gICAgICBxdWVyeS5mb3JFYWNoKGFkZE9ic2VydmFibGUpXG4gICAgfVxuICB9XG5cbiAgYnJvYWRjYXN0ZXIoYXJyRm4pIHtcbiAgICBjb25zdCBicm9hZGNhc3RBcnIgPSBhcnJGbigpXG4gICAgYnJvYWRjYXN0QXJyLmZvckVhY2goYXJncyA9PiB0aGlzLmJyb2FkY2FzdChhcmdzKSlcbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBhZGRNaXhpbnMoKSB7XG4gICAgLy8gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBCQVNFIFNUUkVBTSBNSVhJTlNcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHN0cmVhbU1peGlucyA9IGJhc2VTdHJlYW1zTWl4aW5zKClcbiAgICB0aGlzLnNlbmRVSVBheWxvYWQgPSBzdHJlYW1NaXhpbnMuc2VuZFVJUGF5bG9hZFxuICAgIHRoaXMuc2VuZFJvdXRlUGF5bG9hZCA9IHN0cmVhbU1peGlucy5zZW5kUm91dGVQYXlsb2FkXG4gIH1cbn1cbiIsImltcG9ydCB7IERvbUVsZW1lbnQgfSBmcm9tICcuL2RvbS1lbGVtZW50LmpzJ1xuaW1wb3J0IHsgZmFkZWluLCBmYWRlb3V0IH0gZnJvbSAnLi4vdXRpbHMvdmlld3N0cmVhbS1hbmltYXRpb25zLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbU9ic2VydmFibGUgfSBmcm9tICcuLi91dGlscy92aWV3c3RyZWFtLW9ic2VydmFibGVzLmpzJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZS5qcydcbmltcG9ydCB7IFN1YmplY3QsIGJpbmRDYWxsYmFjayB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBmaWx0ZXIsIGlzTmlsLCBwaWNrLCBwcm9wcywgZGVmYXVsdFRvIH0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtRWxlbWVudCB7XG4gIC8qKlxuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1FbGVtZW50XG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqIEBkZXNjXG4gICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgY2xhc3MgdGhhdCBpcyBwYXJ0IG9mIHRoZSBWaWV3U3RyZWFtIG9ic2VydmFibGUgc3lzdGVtLlxuICAgKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtPYnNlcnZhYmxlfSBzaW5rJFxuICAgKiBAcGFyYW0ge09iamVjdH0gdmlld1Byb3BzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2c2lkXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2c05hbWVcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHNpbmskLCB2aWV3UHJvcHMgPSB7fSwgdnNpZCA9ICcnLCB2c05hbWUgPSAndGhlTmFtZScpIHtcbiAgICB0aGlzLmFkZE1peGlucygpXG4gICAgdGhpcy5fc3RhdGUgPSAnSU5JVCdcbiAgICB0aGlzLnZzaWQgPSB2c2lkXG4gICAgdGhpcy5lbCA9IHZpZXdQcm9wcy5lbFxuICAgIHRoaXMudnNOYW1lID0gdnNOYW1lXG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIGRlYnVnOmZhbHNlLFxuICAgICAgZXh0ZW5kZWRIYXNoTWV0aG9kczoge31cbiAgICB9XG4gICAgdGhpcy5vcHRpb25zID0gZGVlcE1lcmdlKHRoaXMuZGVmYXVsdHMsIHZpZXdQcm9wcylcbiAgICBjb25zdCBjcmVhdGVFeHRyYVN0YXRlc01ldGhvZCA9IChhcnIpID0+IHtcbiAgICAgIGNvbnN0IFthY3Rpb24sIGZ1bmNTdHJdID0gYXJyXG4gICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kZWRIYXNoTWV0aG9kc1thY3Rpb25dID0gKHApID0+IHRoaXNbZnVuY1N0cl0ocClcbiAgICB9XG4gICAgdGhpcy5hZGRBY3Rpb25MaXN0ZW5lcnMoKS5mb3JFYWNoKGNyZWF0ZUV4dHJhU3RhdGVzTWV0aG9kKVxuICAgIHRoaXMub3B0aW9ucy5oYXNoTWV0aG9kcyA9IHRoaXMuc2V0SGFzaE1ldGhvZHModGhpcy5vcHRpb25zLmV4dGVuZGVkSGFzaE1ldGhvZHMpXG4gICAgdGhpcy5zaW5rJCA9IHNpbmskXG4gICAgdGhpcy5zaW5rJFxuICAgICAgLnN1YnNjcmliZSh0aGlzLm9uT2JzU2lua1N1YnNjcmliZS5iaW5kKHRoaXMpKVxuXG4gICAgdGhpcy4kZGlycyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCgpXG4gICAgdGhpcy5hZGREZWZhdWx0RGlyID0gVmlld1N0cmVhbU9ic2VydmFibGUuYWRkRGVmYXVsdERpclxuICAgIHRoaXMuc291cmNlU3RyZWFtcyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsT2JzZXJ2YWJsZXMobmV3IFN1YmplY3QoKSwgdGhpcy52c05hbWUsIHRoaXMudnNpZClcbiAgICB0aGlzLl9zb3VyY2UkID0gdGhpcy5zb3VyY2VTdHJlYW1zLnRvSW50ZXJuYWwkIC8vICBuZXcgU3ViamVjdCgpO1xuICB9XG5cbiAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgc2V0SGFzaE1ldGhvZHMoZXh0ZW5kZWRIYXNoTWV0aG9kc09iaiA9IHt9KSB7XG4gICAgY29uc3QgZGVmYXVsdEhhc2hNZXRob2RzID0ge1xuICAgICAgVlNfREVUUklUVVNfQ09MTEVDVCAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uR2FyYmFnZUNvbGxlY3QocCksXG4gICAgICBSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCAgICAgICAgICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uUmVhZHlGb3JHQyhwKSxcbiAgICAgIEVYVElSUEFURSAgICAgICAgICAgICAgICAgICAgICAgIDogKHApID0+IHRoaXMub25EaXNwb3NlKHApLFxuICAgICAgVlNfU1BBV04gICAgICAgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5vblJlbmRlcihwKSxcbiAgICAgIFZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fUEFSRU5UICAgIDogKHApID0+IHRoaXMub25SZW5kZXJBbmRBdHRhY2hUb1BhcmVudChwKSxcbiAgICAgIFZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fRE9NICAgICAgIDogKHApID0+IHRoaXMub25SZW5kZXJBbmRBdHRhY2hUb0RvbShwKSxcbiAgICAgIEFUVEFDSF9DSElMRF9UT19TRUxGICAgICAgICAgICA6IChwKSA9PiB0aGlzLm9uQXR0YWNoQ2hpbGRUb1NlbGYocClcbiAgICB9XG4gICAgcmV0dXJuIGRlZXBNZXJnZShkZWZhdWx0SGFzaE1ldGhvZHMsIGV4dGVuZGVkSGFzaE1ldGhvZHNPYmopXG4gIH1cblxuICBjcmVhdGVEb21JdGVtKCkge1xuICAgIHRoaXMucHJvcHMgPSB0aGlzLnByb3BzICE9PSB1bmRlZmluZWQgPyB0aGlzLnByb3BzIDoge31cbiAgICBjb25zdCByZW1vdmVJc05pbCA9ICh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkXG4gICAgY29uc3QgYXR0cnMgPSBmaWx0ZXIocmVtb3ZlSXNOaWwsIHBpY2soWydpZCcsICdjbGFzc05hbWUnXSwgdGhpcy5wcm9wcykpXG4gICAgY29uc3QgeyB0YWdOYW1lLCBkYXRhLCB0ZW1wbGF0ZSB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiBuZXcgRG9tRWxlbWVudCh0YWdOYW1lLCBhdHRycywgZGF0YSwgdGVtcGxhdGUpXG4gIH1cblxuICBvbkRpc3Bvc2VDb21wbGV0ZWQoZCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdidiBzZWxmIGRpc3Bvc2VkIGFmdGVyIGFuaW1hdGVPdXQgJywgZCwgdGhpcyk7XG4gIH1cblxuICBhbmltYXRlSW5Ud2VlbihlbCwgdGltZSkge1xuICAgIGZhZGVpbihlbCwgdGltZSlcbiAgfVxuXG4gIGFuaW1hdGVPdXRUd2VlbihlbCwgdGltZSwgY2FsbGJhY2spIHtcbiAgICAvLyBjb25zb2xlLmxvZygnYW5pbSBvdXQgJywge2VsLCB0aW1lLCBjYWxsYmFja30pO1xuICAgIGZhZGVvdXQoZWwsIHRpbWUsIGNhbGxiYWNrKVxuICB9XG5cbiAgc2V0QW5pbWF0ZUluKGQpIHtcbiAgICBpZiAoZC5hbmltYXRlSW4gPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGVsID0gZC5lbCAhPT0gdW5kZWZpbmVkID8gZC5lbCA6IHRoaXMuZG9tSXRlbS5lbFxuICAgICAgdGhpcy5hbmltYXRlSW5Ud2VlbihlbCwgZC5hbmltYXRlSW5UaW1lKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZFxuICAgKiBAcmV0dXJucyBwYXlsb2FkIHRoYXQgY29uZmlybXMgZGlzcG9zZVxuICAgKi9cblxuICBkaXNwb3NlTWV0aG9kKGQpIHtcbiAgICBjb25zdCBlbCA9IGQuZWwuZWwgIT09IHVuZGVmaW5lZCA/IGQuZWwuZWwgOiBkLmVsIC8vIERPTSBJVEVNUyBIQVZFIFRIRUlSIEVMIElURU1TIE5FU1RFRFxuXG4gICAgY29uc3QgZ2NEYXRhID0geyBhY3Rpb246J1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJywgJGRpcjp0aGlzLiRkaXJzLlBJLCBlbCB9XG5cbiAgICBjb25zdCBhbmltYXRlT3V0ID0gKGQsIGNhbGxiYWNrKSA9PiB7XG4gICAgICB0aGlzLmFuaW1hdGVPdXRUd2VlbihlbCwgZC5hbmltYXRlT3V0VGltZSwgY2FsbGJhY2spXG4gICAgfVxuXG4gICAgY29uc3QgZmFkZU91dE9icyA9IGJpbmRDYWxsYmFjayhhbmltYXRlT3V0KVxuICAgIGNvbnN0IG9uRmFkZW91dENvbXBsZXRlZCA9IChlKSA9PiB7XG4gICAgICB0aGlzLl9zb3VyY2UkLm5leHQoZ2NEYXRhKVxuICAgIH1cblxuICAgIGNvbnN0IG9uRmFkZW91dE9icyA9IChkKSA9PiB7XG4gICAgICBmYWRlT3V0T2JzKGQpXG4gICAgICAgIC5zdWJzY3JpYmUob25GYWRlb3V0Q29tcGxldGVkKVxuICAgICAgcmV0dXJuIHsgYWN0aW9uOidFWFRJUlBBVElORycsICRkaXI6dGhpcy4kZGlycy5DSSB9XG4gICAgfVxuICAgIGNvbnN0IG9uRW1wdHlPYnMgPSAoKSA9PiAoeyBhY3Rpb246J0VYVElSUEFURV9BTkRfUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnLCAkZGlyOnRoaXMuJGRpcnMuQ0kgfSlcbiAgICBjb25zdCBmbiA9IGQuYW5pbWF0ZU91dCA9PT0gdHJ1ZSA/IG9uRmFkZW91dE9icyA6IG9uRW1wdHlPYnNcbiAgICByZXR1cm4gZm4oZClcbiAgfVxuXG4gIG9uRGlzcG9zZShkKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzcG9zZU1ldGhvZChkKVxuICB9XG5cbiAgcmVtb3ZlU3RyZWFtKCkge1xuICAgIC8vIHRoaXMuc291cmNlU3RyZWFtcy5jb21wbGV0ZUFsbCgpO1xuICAgIGlmICh0aGlzLnNvdXJjZVN0cmVhbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zb3VyY2VTdHJlYW1zLmNvbXBsZXRlU3RyZWFtKFsnaW50ZXJuYWwnLCAnY2hpbGQnXSlcbiAgICB9XG4gIH1cblxuICBvblJlYWR5Rm9yR0MocCkge1xuICAgIHRoaXMucmVtb3ZlU3RyZWFtKClcbiAgfVxuXG4gIG9uR2FyYmFnZUNvbGxlY3QocCkge1xuICAgIGlmICh0aGlzLmRvbUl0ZW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5kb21JdGVtLnVubW91bnQoKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnNvdXJjZVN0cmVhbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zb3VyY2VTdHJlYW1zLmNvbXBsZXRlU3RyZWFtKFsncGFyZW50J10pXG4gICAgfVxuXG4gICAgZGVsZXRlIHRoaXNcbiAgfVxuXG4gIGdldFNvdXJjZVN0cmVhbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlJFxuICB9XG5cbiAgY29tYmluZURvbUl0ZW1zKGQpIHtcbiAgICBpZiAodGhpcy5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBjb250YWluZXIgPSAgaXNOaWwoZC5xdWVyeSkgPyBkLm5vZGUgOiBkLnF1ZXJ5XG4gICAgY29uc3QgcHJlcGVuZCA9IChub2RlLCBpdGVtKSA9PiBub2RlLmluc2VydEJlZm9yZShpdGVtLCBub2RlLmZpcnN0Q2hpbGQpXG4gICAgY29uc3QgYXBwZW5kID0gKG5vZGUsIGl0ZW0pID0+IG5vZGUuYXBwZW5kQ2hpbGQoaXRlbSlcbiAgICBjb25zdCBhZnRlciA9IChub2RlLCBpdGVtKSA9PiBub2RlLmFmdGVyKGl0ZW0pXG5cbiAgICBjb25zdCBkZWZhdWx0Rm4gPSBwcmVwZW5kXG4gICAgY29uc3QgYXR0YWNoVHlwZUhhc2ggPSB7XG4gICAgICBhcHBlbmRDaGlsZCA6IGFwcGVuZCxcbiAgICAgIGFmdGVyXG4gICAgfVxuICAgIC8vIERFVEVSTUlORSBXSEVUSEVSIFRPIFVTRSBBUFBFTkQgT1IgUFJFUEVORFxuICAgIC8vIE9OIENPTk5FQ1RJTkcgRE9NIElURU1TIFRPIEVBQ0ggT1RIRVJcbiAgICAvLyBsZXQgYXR0YWNoRnVuYyA9IGQuYXR0YWNoVHlwZSA9PT0gJ2FwcGVuZENoaWxkJyA/IGFwcGVuZCA6IHByZXBlbmQ7XG4gICAgY29uc3QgYXR0YWNoRnVuYyA9IGF0dGFjaFR5cGVIYXNoW2QuYXR0YWNoVHlwZV0gfHwgZGVmYXVsdEZuXG4gICAgYXR0YWNoRnVuYyhjb250YWluZXIsIHRoaXMuZG9tSXRlbS5yZW5kZXIoKSlcbiAgICB0aGlzLnNldEFuaW1hdGVJbihkKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBwXG4gICAqIEByZXR1cm5zIHBheWxvYWQgdG8gYXBwZW5kIGNoaWxkIGVsZW1lbnQgdG8gY3VycmVudCBlbGVtZW50XG4gICAqL1xuXG4gIG9uQXR0YWNoQ2hpbGRUb1NlbGYocCkge1xuICAgIGNvbnN0IGRhdGEgPSBwLmNoaWxkUmVuZGVyRGF0YVxuICAgIHRoaXMuY29tYmluZURvbUl0ZW1zKGRhdGEpXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogJ0NISUxEX0FUVEFDSEVEJyxcbiAgICAgICRkaXI6IHRoaXMuJGRpcnMuUElcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGRcbiAgICogQHJldHVybnMgcGF5bG9hZCB0aGF0IGF0dGFjaGVzIGN1cnJlbnQgY2hpbGQgZWxlbWVudCB0byBwYXJlbnRcbiAgICovXG4gIG9uUmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQoZCkge1xuICAgIHRoaXMub25SZW5kZXIoZClcbiAgICB0aGlzLmNvbWJpbmVEb21JdGVtcyhkKVxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246ICdWU19TUEFXTkVEX0FORF9BVFRBQ0hFRF9UT19QQVJFTlQnLFxuICAgICAgZWw6IHRoaXMuZWwgfHwgdGhpcy5kb21JdGVtLmVsLFxuICAgICAgJGRpcjogdGhpcy4kZGlycy5QSVxuICAgIH1cbiAgfVxuXG4gIHJlbmRlckRvbUl0ZW0oZCkge1xuICAgIGNvbnN0IFt0YWdOYW1lLCBhdHRyaWJ1dGVzLCBkYXRhLCB0ZW1wbGF0ZV0gPSBkXG4gICAgdGhpcy5kb21JdGVtID0gbmV3IERvbUVsZW1lbnQoeyB0YWdOYW1lLCBhdHRyaWJ1dGVzLCBkYXRhLCB0ZW1wbGF0ZSB9KVxuICAgIHJldHVybiB0aGlzLmRvbUl0ZW1cbiAgfVxuXG4gIG9uUmVuZGVyKGQpIHtcbiAgICBjb25zdCBnZXRFbCA9IChkYXRhKSA9PiB0aGlzLnJlbmRlckRvbUl0ZW0oZGF0YSlcbiAgICBjb25zdCBlbCA9IHRoaXMuZWwgfHwgZ2V0RWwocHJvcHMoWyd0YWdOYW1lJywgJ2RvbUF0dHJpYnV0ZXMnLCAnZGF0YScsICd0ZW1wbGF0ZSddLCBkKSlcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnVlNfU1BBV05FRCcsXG4gICAgICBlbCxcbiAgICAgICRkaXI6IHRoaXMuJGRpcnMuSVxuICAgIH1cbiAgfVxuXG4gIGV4dGVuZGVkTWV0aG9kcyhkYXRhKSB7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGRcbiAgICogQHJldHVybnNcbiAgICogUGF5bG9hZCBjb250YWluaW5nIHRoZSBhY3Rpb24sIGludGVybmFsIG9ic2VydmFibGUgYW5kIGVsZW1lbnQuXG4gICAqL1xuICBvblJlbmRlckFuZEF0dGFjaFRvRG9tKGQpIHtcbiAgICBjb25zdCBnZXRFbCA9IChkYXRhKSA9PiB0aGlzLnJlbmRlckRvbUl0ZW0oZGF0YSlcbiAgICBkLmF0dGFjaERhdGEuZWwgPSBnZXRFbChwcm9wcyhbJ3RhZ05hbWUnLCAnZG9tQXR0cmlidXRlcycsICdkYXRhJywgJ3RlbXBsYXRlJ10sIGQpKVxuICAgIHRoaXMuY29tYmluZURvbUl0ZW1zKGQuYXR0YWNoRGF0YSlcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiAnVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NJyxcbiAgICAgIGVsOiAgIHRoaXMuZWwgfHwgZC5hdHRhY2hEYXRhLmVsLmVsLFxuICAgICAgJGRpcjogdGhpcy4kZGlycy5DSVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBUaGUgVmlld1N0cmVhbSBkaXJlY3RzIGFsbCByZWxldmFudCBhY3Rpb25zIHRvIHRoZSBEb21FbGVtZW50IHRvIHJlbmRlciBhbmQgZGlzcG9zZSBvZiBpdHNlbGZcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHBheWxvYWRcbiAgICovXG4gIG9uT2JzU2lua1N1YnNjcmliZShwYXlsb2FkKSB7XG4gICAgY29uc3QgYWN0aW9uID0gcGF5bG9hZC5hY3Rpb25cbiAgICBjb25zdCBkZWZhdWx0VG9GbiA9IGRlZmF1bHRUbygoZGF0YSkgPT4gdGhpcy5leHRlbmRlZE1ldGhvZHMoZGF0YSkpXG4gICAgY29uc3QgZm4gPSBkZWZhdWx0VG9Gbih0aGlzLm9wdGlvbnMuaGFzaE1ldGhvZHNbYWN0aW9uXSlcbiAgICBjb25zdCBkYXRhID0gZm4ocGF5bG9hZClcbiAgICBjb25zdCBzZW5kRGF0YSA9IChkKSA9PiB0aGlzLl9zb3VyY2UkLm5leHQoZClcbiAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZW5kRGF0YShPYmplY3QuZnJlZXplKGRhdGEpKVxuICAgIH1cbiAgfVxuXG4gIGFkZE1peGlucygpIHtcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEJBU0UgQ09SRSBNSVhJTlNcbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIGxldCBjb3JlTWl4aW5zID0gYmFzZUNvcmVNaXhpbnMoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU3B5bmVBcHBQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vdXRpbHMvc3B5bmUtYXBwLXByb3BlcnRpZXMuanMnXG5pbXBvcnQgeyBzYWZlQ2xvbmUgfSBmcm9tICcuLi91dGlscy9zYWZlLWNsb25lLmpzJ1xuaW1wb3J0IHsgZ2MgfSBmcm9tICcuLi91dGlscy9nYy5qcydcbmltcG9ydCB7XG4gIGNvbXBvc2UsXG4gIGNsb25lLFxuICBmcm9tUGFpcnMsXG4gIHRvUGFpcnMsXG4gIGlzXG59IGZyb20gJ3JhbWRhJ1xuXG5leHBvcnQgY2xhc3MgVmlld1N0cmVhbVBheWxvYWQge1xuICAvKipcbiAgICpcbiAgICogT2JzZXJ2YWJsZXMgc2VudCBmcm9tIFZpZXdTdHJlYW1zIHRvIENoYW5uZWxzIGFyZSB2YWxpZGF0ZWQgYnkgdGhpcyBjbGFzc1xuICAgKlxuICAgKiBAbW9kdWxlIFZpZXdTdHJlYW1QYXlsb2FkXG4gICAqIEB0eXBlIGludGVybmFsXG4gICAqXG4gICAqIEBjb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge09ic2VydmFibGV9IG9ic2VydmFibGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFjdGlvblxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRlYnVnXG4gICAqL1xuICBjb25zdHJ1Y3RvcihuYW1lLCBvYnNlcnZhYmxlLCBkYXRhLCBhY3Rpb24gPSAnc3Vic2NyaWJlJywgZGVidWcgPSBmYWxzZSkge1xuICAgIC8vIHRoaXMuYWRkTWl4aW5zKCk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIG5hbWUsXG4gICAgICBvYnNlcnZhYmxlLFxuICAgICAgZGF0YSxcbiAgICAgIGFjdGlvblxuICAgIH1cbiAgICB0aGlzLnNlbmRUb0RpcmVjdG9yU3RyZWFtKG9wdGlvbnMpXG4gIH1cblxuICBzZW5kVG9EaXJlY3RvclN0cmVhbShwYXlsb2FkKSB7XG4gICAgY29uc3QgZGlyZWN0b3JTdHJlYW0kID0gU3B5bmVBcHBQcm9wZXJ0aWVzLmNoYW5uZWxzTWFwLmdldFN0cmVhbSgnRElTUEFUQ0hFUicpXG4gICAgY29uc3QgZnJvemVuUGF5bG9hZCA9IHNhZmVDbG9uZShwYXlsb2FkKVxuICAgIC8vIGNvbnNvbGUubG9nKFwiVlMgUEFZTE9BRCBcIixmcm96ZW5QYXlsb2FkKTtcbiAgICBkaXJlY3RvclN0cmVhbSQubmV4dChmcm96ZW5QYXlsb2FkKVxuICAgIHBheWxvYWQgPSB1bmRlZmluZWRcblxuICAgIGRlbGV0ZSB0aGlzXG4gIH1cblxuICBzdGF0aWMgZGVlcENsb25lKG8pIHtcbiAgICBjb25zdCBpc0FyciA9IGlzKEFycmF5KVxuICAgIGNvbnN0IGlzT2JqID0gaXMoT2JqZWN0KVxuICAgIGNvbnN0IGlzSXRlciA9IG9iID0+IGlzQXJyKG9iKSA9PT0gZmFsc2UgJiYgaXNPYmoob2IpID09PSB0cnVlXG4gICAgY29uc3QgaXNJdGVyYWJsZSA9IGlzSXRlcihvKVxuICAgIHJldHVybiBpc0l0ZXJhYmxlID8gY29tcG9zZShmcm9tUGFpcnMsIHRvUGFpcnMsIGNsb25lKShvKSA6IGNsb25lKG8pXG4gIH1cblxuICBzdGF0aWMgZ2V0TW91c2VFdmVudEtleXMoKSB7XG4gICAgcmV0dXJuIFsnYWx0S2V5JywgJ2J1YmJsZXMnLCAnY2FuY2VsQnViYmxlJywgJ2NhbmNlbGFibGUnLCAnY2xpZW50WCcsICdjbGllbnRZJywgJ2NvbXBvc2VkJywgJ2N0cmxLZXknLCAnY3VycmVudFRhcmdldCcsICdkZWZhdWx0UHJldmVudGVkJywgJ2RldGFpbCcsICdldmVudFBoYXNlJywgJ2Zyb21FbGVtZW50JywgJ2lzVHJ1c3RlZCcsICdsYXllclgnLCAnbGF5ZXJZJywgJ21ldGFLZXknLCAnbW92ZW1lbnRYJywgJ21vdmVtZW50WScsICdvZmZzZXRYJywgJ29mZnNldFknLCAncGFnZVgnLCAncGFnZVknLCAncGF0aCcsICdyZWxhdGVkVGFyZ2V0JywgJ3JldHVyblZhbHVlJywgJ3NjcmVlblgnLCAnc2NyZWVuWScsICdzaGlmdEtleScsICdzb3VyY2VDYXBhYmlsaXRpZXMnLCAnc3JjRWxlbWVudCcsICd0YXJnZXQnLCAndGltZVN0YW1wJywgJ3RvRWxlbWVudCcsICd0eXBlJywgJ3ZpZXcnLCAnd2hpY2gnLCAneCcsICd5J11cbiAgfVxuXG4gIGFkZE1peGlucygpIHtcbiAgICB0aGlzLmdjID0gZ2NcbiAgfVxufVxuIiwiaW1wb3J0IHsgaGVhZCwgY29tcG9zZSwgcmVqZWN0LCBzcGxpdCwgaXNFbXB0eSwgbHRlLCBkZWZhdWx0VG8sIHByb3AgfSBmcm9tICdyYW1kYSdcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVNweW5lU2VsZWN0b3JJZChlbCkge1xuICBjb25zdCBudW0gPSAoKSA9PiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5yZXBsYWNlKC9cXGQvZ20sICcnKS5zdWJzdHJpbmcoMSwgOClcbiAgbGV0IHZzaWQgPSBgJHtudW0oKX1gXG4gIGlmIChlbC5kYXRhc2V0LnZzaWQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVsLmRhdGFzZXQudnNpZCA9IHZzaWRcbiAgfSBlbHNlIHtcbiAgICB2c2lkID0gZWwuZGF0YXNldC52c2lkXG4gIH1cbiAgcmV0dXJuIGBbZGF0YS12c2lkPScke3ZzaWR9J11gXG59XG5cbmZ1bmN0aW9uIGlzRGV2TW9kZSgpIHtcbiAgcmV0dXJuIFNweW5lQXBwUHJvcGVydGllcy5kZWJ1ZyA9PT0gdHJ1ZVxufVxuXG5mdW5jdGlvbiBpc05vZGVFbGVtZW50KGVsKSB7XG4gIGNvbnN0IG5vZGVDaGVjayA9IGNvbXBvc2UobHRlKDApLCBkZWZhdWx0VG8oLTEpLCBwcm9wKCdub2RlVHlwZScpKVxuICByZXR1cm4gbm9kZUNoZWNrKGVsKVxufVxuXG5mdW5jdGlvbiBnZXRFbE9yTGlzdChjeHQsIHNlbCwgdmVyYm9zZUJvb2wgPSBmYWxzZSkge1xuICBjb25zdCBsaXN0ID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCwgdmVyYm9zZUJvb2wpXG4gIHJldHVybiBsaXN0Lmxlbmd0aCA9PT0gMSA/IGhlYWQobGlzdCkgOiBsaXN0XG59XG5cbmZ1bmN0aW9uIHRlc3RTZWxlY3RvcnMoY3h0LCBzZWwsIHZlcmJvc2VCb29sKSB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihjeHQpXG5cbiAgY29uc3QgZWxJc0RvbUVsZW1lbnQgPSBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSlcblxuICBpZiAoZWwgIT09IG51bGwgJiYgZWxJc0RvbUVsZW1lbnQoZWwpID09PSBmYWxzZSkge1xuICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogdGhlIGVsIG9iamVjdCBpcyBub3QgYSB2YWxpZCBzaW5nbGUgZWxlbWVudCwgJHtlbH1gKVxuICAgIHJldHVyblxuICB9XG5cbiAgaWYgKHNlbCAhPT0gdW5kZWZpbmVkICYmIFN0cmluZyhzZWwpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgZnVuY3Rpb24gaXNWYWxpZFNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgICAgIHJldHVybiBlbGVtZW50cy5sZW5ndGggPiAwIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgaXMgdmFsaWQgYW5kIHNlbGVjdHMgYXQgbGVhc3Qgb25lIGVsZW1lbnRcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlIC8vIENhdGNoaW5nIGFuIGV4Y2VwdGlvbiBtZWFucyB0aGUgc2VsZWN0b3IgaXMgaW52YWxpZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzVmFsaWRTZWxlY3RvckJvb2wgPSBpc1ZhbGlkU2VsZWN0b3Ioc2VsKVxuICAgIGlmICh2ZXJib3NlQm9vbCA9PT0gdHJ1ZSAmJiBpc0Rldk1vZGUoKSA9PT0gdHJ1ZSAmJiBpc1ZhbGlkU2VsZWN0b3JCb29sID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiB0aGUgc2VsZWN0b3IsICR7c2VsfSBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIGVsLCAke2N4dH1gKVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCB2ZXJib3NlQm9vbCA9IGZhbHNlKSB7XG4gIGNvbnN0IHNlbGVjdG9yID0gc2VsICE9PSB1bmRlZmluZWQgPyBgJHtjeHR9ICR7c2VsfWAgOiBjeHRcbiAgbGV0IGlzUGFyZW50ID0gZmFsc2VcblxuICBjb25zdCByZXR1cm5TZWxlY3RvcklmVmFsaWQgPSAoc2VsZWN0b3IpID0+IHtcbiAgICBsZXQgYXJyID0gW11cbiAgICB0cnkge1xuICAgICAgYXJyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICB9IGNhdGNoIChlKSB7IGFyciA9IFtdIH1cbiAgICB0cnkge1xuICAgICAgaXNQYXJlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbCkgPT09IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY3h0KVxuICAgICAgaWYgKGlzUGFyZW50ID09PSB0cnVlKSB7XG4gICAgICAgIGFyciA9IFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbCldXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gYXJyLy8gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gIH1cblxuICBjb25zdCBlbEFyciA9ICByZXR1cm5TZWxlY3RvcklmVmFsaWQoc2VsZWN0b3IpXG5cbiAgaWYgKHZlcmJvc2VCb29sID09PSB0cnVlKSB7XG4gICAgY29uc3QgbWFpblNlbCA9IGlzUGFyZW50ID09PSB0cnVlID8gJ2JvZHknIDogY3h0XG4gICAgdGVzdFNlbGVjdG9ycyhtYWluU2VsLCBzZWwsIHZlcmJvc2VCb29sKVxuICB9XG5cbiAgcmV0dXJuIGVsQXJyXG59XG5cbmZ1bmN0aW9uIHNldElubGluZUNzcyh2YWwsIGN4dCwgc2VsKSB7XG4gIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gIGNvbnN0IGFkZElubGluZUNzcyA9IGl0ZW0gPT4ge1xuICAgIGl0ZW0uc3R5bGUuY3NzVGV4dCA9IHZhbFxuICB9XG4gIGFyci5mb3JFYWNoKGFkZElubGluZUNzcylcbiAgcmV0dXJuIHRoaXNcbn1cblxuLyoqXG4gKlxuICogQG1vZHVsZSBWaWV3U3RyZWFtU2VsZWN0b3JcbiAqIEB0eXBlIHV0aWxcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xFbH0gY3h0IFRoZSBtYWluIGVsZW1lbnRcbiAqIEBwYXJhbSB7U3RyaW5nfEVsfSBUaGUgc2VsZWN0b3IgYXMgYSBTdHJpbmdcbiAqIEByZXR1cm5zIHtmdW5jdGlvbigqPSl9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuXG5mdW5jdGlvbiBWaWV3U3RyZWFtU2VsZWN0b3IoY3h0LCBzZWwpIHtcbiAgY3h0ID0gdHlwZW9mIChjeHQpID09PSAnc3RyaW5nJyA/IGN4dCA6IGdlbmVyYXRlU3B5bmVTZWxlY3RvcklkKGN4dClcbiAgdGVzdFNlbGVjdG9ycyhjeHQsIHNlbCwgZmFsc2UpXG5cbiAgZnVuY3Rpb24gc2VsZWN0b3Ioc2VsKSB7XG4gICAgcmV0dXJuIFZpZXdTdHJlYW1TZWxlY3RvcihjeHQsIHNlbClcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gbWFwIHRocm91Z2ggYSBOb2RlTGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgZWxlbWVudHNcbiAgICovXG4gIHNlbGVjdG9yLm1hcCA9IChmbikgPT4gQXJyYXkuZnJvbShnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKSkubWFwKGZuKVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gaXRlcmF0ZSB0aHJvdWdoIGEgTm9kZUxpc3RcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgZWxlbWVudHNcbiAgICovXG4gIHNlbGVjdG9yLmZvckVhY2ggPSAoZm4pID0+IEFycmF5LmZyb20oZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCkpLm1hcChmbilcblxuICBzZWxlY3Rvci5nZXROb2RlTGlzdEFycmF5ID0gKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcblxuICAvKipcbiAgICpcbiAgICogQWRkcyB0aGUgY2xhc3MgdG8gdGhlIEVsZW1lbnQgb3IgdG8gdGhlIE5vZGVMaXN0LlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY1xuICAgKlxuICAgKlxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gYyAtID0gdW5kZWZpbmVkOyBUaGUgY2xhc3MgdG8gYmUgYWRkZWQuXG4gICAqXG4gICAqKi9cbiAgc2VsZWN0b3IuYWRkQ2xhc3MgPSAoYykgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgY29uc3QgYWRkQ2xhc3MgPSBpdGVtID0+IGl0ZW0uY2xhc3NMaXN0LmFkZChjKVxuICAgIGFyci5mb3JFYWNoKGFkZENsYXNzKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICogQGRlc2MgUmVtb3ZlcyB0aGUgY2xhc3MgdG8gdGhlIEVsZW1lbnQgb3IgdG8gdGhlIE5vZGVMaXN0LlxuICAgKi9cbiAgc2VsZWN0b3IucmVtb3ZlQ2xhc3MgPSAoYykgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgY29uc3QgcmVtb3ZlQ2xhc3MgPSBpdGVtID0+IHtcbiAgICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShjKVxuICAgIH1cbiAgICBhcnIuZm9yRWFjaChyZW1vdmVDbGFzcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjXG4gICAqIEBkZXNjIFNldHMgdGhlIGNsYXNzIHRvIGVxdWFsIGV4YWN0bHkgdGhlIGNsYXNzIHN0cmluZy5cbiAgICovXG4gIHNlbGVjdG9yLnNldENsYXNzID0gKGMpID0+IHtcbiAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgIC8qKlxuICAgICogTk9OIElFIENMRUFORVIgU09MVVRJT05cbiAgICAqIGNvbnN0IHJlbW92ZUNsYXNzID0gaXRlbSA9PiBpdGVtLmNsYXNzTGlzdCA9IGM7XG4gICAgKiAgYXJyLmZvckVhY2gocmVtb3ZlQ2xhc3MpO1xuICAgICovXG5cbiAgICBjb25zdCBzZXRUaGVDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgY29uc3QgcmVtb3ZlQ2xhc3NTdHJBcnIgPSBjb21wb3NlKHJlamVjdChpc0VtcHR5KSwgc3BsaXQoJyAnKSkoaXRlbS5jbGFzc05hbWUpXG4gICAgICBjb25zdCBjbGFzc1N0ckFyciA9IGMuc3BsaXQoJyAnKVxuICAgICAgY29uc3QgcmVtb3ZlciA9IHMgPT4gaXRlbS5jbGFzc0xpc3QucmVtb3ZlKHMpXG4gICAgICBjb25zdCBhZGRlciA9IHNlbCA9PiBpdGVtLmNsYXNzTGlzdC5hZGQoc2VsKVxuICAgICAgcmVtb3ZlQ2xhc3NTdHJBcnIuZm9yRWFjaChyZW1vdmVyKVxuICAgICAgY2xhc3NTdHJBcnIuZm9yRWFjaChhZGRlcilcbiAgICB9XG4gICAgYXJyLmZvckVhY2goc2V0VGhlQ2xhc3MpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHNlbGVjdG9yLnVubW91bnQgPSAoKSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2coJ3VubW91bnRpbmcgc2VsZWN0b3IgJywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICogQHBhcmFtIHtCb29sZWFufSBib29sIERlZmF1bHQgaXMgdW5kZWZpbmVkLlxuICAgKiBAZGVzYyBTZXRzIHRoZSBjbGFzcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYm9vbGVhbiBvciB0aGUgdG9nZ2xlcyB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHRoaXMucHJvcHMuZWwkLnRvZ2dsZUNsYXNzKCdteWNsYXNzJywgdHJ1ZSk7XG4gICAqXG4gICAqL1xuICBzZWxlY3Rvci50b2dnbGVDbGFzcyA9IChjLCBib29sKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCB0b2dnbGVDbGFzcyA9IGl0ZW0gPT4ge1xuICAgICAgYm9vbCA9IGJvb2wgIT09IHVuZGVmaW5lZCA/IGJvb2wgOiAhaXRlbS5jbGFzc0xpc3QuY29udGFpbnMoYylcbiAgICAgIGJvb2wgPyBpdGVtLmNsYXNzTGlzdC5hZGQoYykgOiBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoYylcbiAgICB9XG4gICAgYXJyLmZvckVhY2godG9nZ2xlQ2xhc3MpXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHNlbGVjdG9yLnRvZ2dsZSA9IChjLCBib29sKSA9PiB7XG4gICAgc2VsZWN0b3IudG9nZ2xlQ2xhc3MoYywgYm9vbClcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIGh0bWwgdG8gdGhlIFNlbGVjdG9yJ3MgZWxlbWVudFxuICAgKiBAcGFyYW0gaHRtbEVsZW1lbnRcbiAgICovXG4gIHNlbGVjdG9yLmFwcGVuZENoaWxkID0gKGh0bWxFbGVtZW50KSA9PiB7XG4gICAgaWYgKHNlbGVjdG9yLmVsLmxlbmd0aCAhPT0gMCkge1xuICAgICAgc2VsZWN0b3IuZWwuYXBwZW5kQ2hpbGQoaHRtbEVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIHNlbGVjdG9yLCAke3NlbH0gZG9lcyBub3QgYXBwZWFyIHRvIGJlIHZhbGlkIWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdG9yLmVsXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQWRkcyBjbGFzcyB3aXRoIGEgZGVsYXkgb2YgMW1zIHRvIGFsbG93IGNzcyB0byByZWdpc3RlciBhIHRyYW5zaXRpb24uXG4gICAqIEBwYXJhbSBjXG4gICAqL1xuICBzZWxlY3Rvci5hZGRBbmltQ2xhc3MgPSAoYykgPT4ge1xuICAgIGNvbnN0IGRlbGF5QWRkQ2xhc3MgPSAoKSA9PiB7XG4gICAgICBjb25zdCBhcnIgPSBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsKVxuICAgICAgY29uc3QgYWRkQ2xhc3MgPSBpdGVtID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYylcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhcnIuZm9yRWFjaChhZGRDbGFzcylcbiAgICB9XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGRlbGF5QWRkQ2xhc3MpXG4gICAgLy8gd2luZG93LnNldFRpbWVvdXQoZGVsYXlBZGRDbGFzcywgMSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNcbiAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR9IGVsU2VsIFRoZSBzZWxlY3RvciBmb3IgdGhlIGVsZW1lbnQuXG4gICAqIEBkZXNjIFNldHMgdGhlIGNsYXNzIGFjdGl2ZSBIVE1MRWxlbWVudCBmcm9tIGEgTm9kZUxpc3QuXG4gICAqL1xuICBzZWxlY3Rvci5zZXRBY3RpdmVJdGVtMiA9IChjLCBlbFNlbCkgPT4ge1xuICAgIGNvbnN0IGFyciA9IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwpXG4gICAgY29uc3QgY3VycmVudEVsID0gdHlwZW9mIChlbFNlbCkgPT09ICdzdHJpbmcnID8gZ2V0RWxPckxpc3QoY3h0LCBlbFNlbCkgOiBlbFNlbFxuICAgIGNvbnN0IHRvZ2dsZUJvb2wgPSBpdGVtID0+IGl0ZW0uaXNFcXVhbE5vZGUoY3VycmVudEVsKSA/IGl0ZW0uY2xhc3NMaXN0LmFkZChjKSA6IGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShjKVxuICAgIGlmIChpc05vZGVFbGVtZW50KGN1cnJlbnRFbCkgPT09IHRydWUpIHtcbiAgICAgIGFyci5mb3JFYWNoKHRvZ2dsZUJvb2wpXG4gICAgfSBlbHNlIGlmIChpc0Rldk1vZGUoKSA9PT0gdHJ1ZSkge1xuICAgICAgLy8gY29uc29sZS5sb2coXCJTRUwgSVMgXCIsZWxTZWwsYyk7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBzZWxlY3RvciwgJHtlbFNlbH0sIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIGl0ZW0gaW4gc2V0QWN0aXZlSXRlbTogJHtjfWApXG4gICAgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzZWxlY3Rvci5zZXRBY3RpdmVJdGVtID0gKGMsIGVsU2VsKSA9PiB7XG4gICAgY29uc3QgYXJyID0gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbClcbiAgICBjb25zdCBjdXJyZW50RWwgPSB0eXBlb2YgZWxTZWwgPT09ICdzdHJpbmcnXG4gICAgICA/IGdldEVsT3JMaXN0KGN4dCwgZWxTZWwpXG4gICAgICA6IGVsU2VsXG5cbiAgICBhcnIuZm9yRWFjaChpdGVtID0+IGl0ZW0uY2xhc3NMaXN0LnJlbW92ZShjKSlcblxuICAgIGlmIChpc05vZGVFbGVtZW50KGN1cnJlbnRFbCkgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IG1hdGNoaW5nRWwgPSBBcnJheS5mcm9tKGFycikuZmluZChpdGVtID0+IGl0ZW0gPT09IGN1cnJlbnRFbClcblxuICAgICAgaWYgKG1hdGNoaW5nRWwpIHtcbiAgICAgICAgbWF0Y2hpbmdFbC5jbGFzc0xpc3QuYWRkKGMpXG4gICAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgU3B5bmUgV2FybmluZzogVGhlIHNlbGVjdG9yLCAke2VsU2VsfSwgaXMgdmFsaWQgYnV0IGRvZXMgbm90IG1hdGNoIGFueSBpdGVtIGluIHNldEFjdGl2ZUl0ZW06ICR7Y31gXG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzRGV2TW9kZSgpID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBTcHluZSBXYXJuaW5nOiBUaGUgc2VsZWN0b3IsICR7ZWxTZWx9LCBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB2YWxpZCBpdGVtIGluIHNldEFjdGl2ZUl0ZW06ICR7Y31gXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAZnVuY3Rpb24gZWxcbiAgICpcbiAgICogQGRlc2NcbiAgICogZ2V0dGVyIGZvciB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHJldHVybnNcbiAgICogVGhlIGEgc2luZ2xlIGVsZW1lbnQgb3IgYSBOb2RlTGlzdCBmcm9tIHRoZSBzZWxlY3RvclxuICAgKi9cblxuICAvKipcbiAgICpcbiAgICogQGZ1bmN0aW9uIGxlbmd0aFxuICAgKlxuICAgKiBAZGVzY1xuICAgKiBEZXRlcm1pbmVzIHRoZSBsZW5ndGggb2YgdGhlIE5vZGVMaXN0XG4gICAqXG4gICAqIEByZXR1cm5zXG4gICAqIFRoZSBsZW5ndGggb2YgdGhlIHNlbGVjdG9yIGFzIGEgTm9kZUxpc3RcbiAgICovXG5cbiAgLyoqXG4gICAqXG4gICAqIEBmdW5jdGlvbiBleGlzdHNcbiAgICpcbiAgICogQGRlc2NcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIHRoZSBzZWxlY3RlZCBlbGVtZW50IGV4aXN0c1xuICAgKlxuICAgKiBAcmV0dXJuc1xuICAgKiBCb29sZWFuXG4gICAqL1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2VsJywgeyBnZXQ6ICgpID0+IGdldEVsT3JMaXN0KGN4dCwgc2VsLCB0cnVlKSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdlbHMnLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCkgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnbGVuJywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIGZhbHNlKS5sZW5ndGggfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnZXhpc3RzJywgeyBnZXQ6ICgpID0+IGdldE5vZGVMaXN0QXJyYXkoY3h0LCBzZWwsIGZhbHNlKS5sZW5ndGggPj0gMSB9KVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZWN0b3IsICdleGlzdCcsIHsgZ2V0OiAoKSA9PiBnZXROb2RlTGlzdEFycmF5KGN4dCwgc2VsLCBmYWxzZSkubGVuZ3RoID49IDEgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnbm9kZUxpc3QnLCB7IGdldDogKCkgPT4gZ2V0Tm9kZUxpc3RBcnJheShjeHQsIHNlbCkgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnYXJyJywge1xuICAgIGdldDogKCkgPT4ge1xuICAgICAgY29uc3QgZWwgPSBnZXRFbE9yTGlzdChjeHQsIHNlbCwgdHJ1ZSlcbiAgICAgIGlmIChlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbXVxuICAgICAgfSBlbHNlIGlmIChlbC5sZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gW2VsXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oZWwpXG4gICAgICB9XG4gICAgfVxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzZWxlY3RvciwgJ2lubGluZScsIHsgc2V0OiAodmFsKSA9PiBzZXRJbmxpbmVDc3ModmFsLCBjeHQsIHNlbCksIGdldDogKCkgPT4gc2VsZWN0b3IgfSlcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGVjdG9yLCAnaW5saW5lQ3NzJywgeyBzZXQ6ICh2YWwpID0+IHNldElubGluZUNzcyh2YWwsIGN4dCwgc2VsKSwgZ2V0OiAoKSA9PiBzZWxlY3RvciB9KVxuXG4gIHJldHVybiBzZWxlY3RvclxufVxuXG5leHBvcnQgeyBWaWV3U3RyZWFtU2VsZWN0b3IgfVxuIiwiaW1wb3J0IHsgYmFzZUNvcmVNaXhpbnMgfSBmcm9tICcuLi91dGlscy9taXhpbnMvYmFzZS1jb3JlLW1peGlucy5qcydcbmltcG9ydCB7IFNweW5lQXBwUHJvcGVydGllcyB9IGZyb20gJy4uL3V0aWxzL3NweW5lLWFwcC1wcm9wZXJ0aWVzLmpzJ1xuaW1wb3J0IHsgZGVlcE1lcmdlIH0gZnJvbSAnLi4vdXRpbHMvZGVlcC1tZXJnZS5qcydcbmltcG9ydCB7IHNhZmVDbG9uZSB9IGZyb20gJy4uL3V0aWxzL3NhZmUtY2xvbmUuanMnXG5pbXBvcnQge1xuICBmaW5kU3RyT3JSZWdleE1hdGNoU3RyLFxuICBnZXRDb25zdHJ1Y3Rvck5hbWVcbn0gZnJvbSAnLi4vdXRpbHMvZnJwLXRvb2xzLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbUVsZW1lbnQgfSBmcm9tICcuL3ZpZXctc3RyZWFtLWVsZW1lbnQuanMnXG5pbXBvcnQgeyByZWdpc3RlcmVkU3RyZWFtTmFtZXMgfSBmcm9tICcuLi9jaGFubmVscy9jaGFubmVscy1jb25maWcuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtQnJvYWRjYXN0ZXIgfSBmcm9tICcuL3ZpZXctc3RyZWFtLWJyb2FkY2FzdGVyLmpzJ1xuaW1wb3J0IHsgVmlld1N0cmVhbVBheWxvYWQgfSBmcm9tICcuL3ZpZXctc3RyZWFtLXBheWxvYWQuanMnXG5pbXBvcnQgeyBDaGFubmVsUGF5bG9hZEZpbHRlciB9IGZyb20gJy4uL3V0aWxzL2NoYW5uZWwtcGF5bG9hZC1maWx0ZXIuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtT2JzZXJ2YWJsZSB9IGZyb20gJy4uL3V0aWxzL3ZpZXdzdHJlYW0tb2JzZXJ2YWJsZXMuanMnXG5pbXBvcnQgeyBWaWV3U3RyZWFtU2VsZWN0b3IgfSBmcm9tICcuL3ZpZXctc3RyZWFtLXNlbGVjdG9yLmpzJ1xuaW1wb3J0IHsgU3ViamVjdCwgb2YgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWVyZ2VNYXAsIG1hcCwgdGFrZVdoaWxlLCBmaWx0ZXIsIHRhcCwgc2tpcCwgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7XG4gIHBpY2ssXG4gIGNvbXBvc2UsXG4gIGlzTmlsLFxuICBhbGwsXG4gIGZvckVhY2gsXG4gIHRvTG93ZXIsXG4gIGVpdGhlcixcbiAgZmluZEluZGV4LFxuICBhcHBseSxcbiAgdGVzdCxcbiAgZmxhdHRlbixcbiAgcHJvcCxcbiAgYWx3YXlzLFxuICBsdGUsXG4gIGRlZmF1bHRUbyxcbiAgcHJvcFNhdGlzZmllcyxcbiAgYWxsUGFzcyxcbiAgY3VycnksXG4gIGlzLFxuICBzbGljZSxcbiAgcGF0aCxcbiAgb21pdCxcbiAgaWZFbHNlLFxuICBtZXJnZVJpZ2h0LFxuICB3aGVyZSxcbiAgZXF1YWxzXG4gICwgbWFwIGFzIHJNYXBcbn0gZnJvbSAncmFtZGEnXG5cbmV4cG9ydCBjbGFzcyBWaWV3U3RyZWFtIHtcbiAgLyoqXG4gICAqIEBtb2R1bGUgVmlld1N0cmVhbVxuICAgKlxuICAgKiBAZGVzY1xuICAgKlxuICAgKiA8cD5WaWV3U3RyZWFtIGlzIHRoZSBpbnRlcmFjdGl2ZS12aWV3IGNvbXBvbmVudCwgYW5kIGl0cyBjb3JlIGZ1bmN0aW9uYWxpdHkgaXMgY29tcHJpc2VkIG9mIHR3byBpbnRlcm5hbCBjb21wb25lbnRzOiA8L3A+XG4gICA8dWwgY2xhc3M9J2Jhc2ljJz5cbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3BzID0ge30pIHtcbiAgICB0aGlzLnZzbnVtID0gTWF0aC5yYW5kb20oKVxuICAgIHRoaXMuYWRkTWl4aW5zKClcbiAgICB0aGlzLl9wb3N0UmVuZGVyQ2FsbGVkID0gZmFsc2VcbiAgICB0aGlzLmRlZmF1bHRzID0gKCkgPT4ge1xuICAgICAgY29uc3QgdnNpZCA9IHRoaXMuY3JlYXRlSWQoKVxuICAgICAgY29uc3QgaWQgPSBwcm9wcy5pZCA/IHByb3BzLmlkIDogdnNpZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdnNpZCxcbiAgICAgICAgaWQsXG4gICAgICAgIHRhZ05hbWU6ICdkaXYnLFxuICAgICAgICBlbDogdW5kZWZpbmVkLFxuICAgICAgICBkYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGFuaW1hdGVJbjogZmFsc2UsXG4gICAgICAgIGFuaW1hdGVJblRpbWU6IDAuNSxcbiAgICAgICAgYW5pbWF0ZU91dDogZmFsc2UsXG4gICAgICAgIGFuaW1hdGVPdXRUaW1lOiAwLjUsXG4gICAgICAgIHNlbmRMaWZlY3lsZUV2ZW50czogZmFsc2UsXG4gICAgICAgIGhhc2hJZDogYCMke2lkfWAsXG4gICAgICAgIGlkJDogYCMke2lkfWAsXG4gICAgICAgIHZpZXdDbGFzczogVmlld1N0cmVhbUVsZW1lbnQsXG4gICAgICAgIGV4dGVuZGVkU291cmNlc0hhc2hNZXRob2RzOiB7fSxcbiAgICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgICB0ZW1wbGF0ZTogdW5kZWZpbmVkLFxuICAgICAgICBub2RlOiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG4gICAgICAgIG5hbWU6IGdldENvbnN0cnVjdG9yTmFtZSh0aGlzKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zdGF0ZSA9IHt9XG4gICAgdGhpcy4kZGlycyA9IFZpZXdTdHJlYW1PYnNlcnZhYmxlLmNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCgpXG4gICAgdGhpcy5hZGREZWZhdWx0RGlyZWN0aW9uID0gVmlld1N0cmVhbU9ic2VydmFibGUuYWRkRGVmYXVsdERpclxuICAgIHRoaXMuYWRkRG93bkludGVybmFsRGlyID0gVmlld1N0cmVhbU9ic2VydmFibGUuYWRkRG93bkludGVybmFsRGlyXG4gICAgLy8gdGhpcy5wcm9wcyA9IE9iamVjdC5hc3NpZ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUbih7fSwgdGhpcy5kZWZhdWx0cygpLCBwcm9wcyk7XG4gICAgdGhpcy5wcm9wcyA9IGRlZXBNZXJnZSh0aGlzLmRlZmF1bHRzKCksIHByb3BzKVxuICAgIHRoaXMuc2VuZExpZmVjeWNsZU1ldGhvZCA9IHRoaXMucHJvcHMuc2VuZExpZmVjeWxlRXZlbnRzID09PSB0cnVlID8gdGhpcy5zZW5kTGlmZWN5Y2xlTWV0aG9kQWN0aXZlLmJpbmQodGhpcykgOiB0aGlzLnNlbmRMaWZlY3ljbGVNZXRob2RJbmFjdGl2ZS5iaW5kKHRoaXMpXG4gICAgY29uc3QgYXR0cmlidXRlc0FyciA9IHRoaXMuYXR0cmlidXRlc0FycmF5XG4gICAgLy8gbGV0IGF0dHJpYnV0ZXNBcnIgPSBbJ2lkJywgJ2NsYXNzJywgJ2RhdGFzZXQnXTtcbiAgICB0aGlzLnByb3BzLmRvbUF0dHJpYnV0ZXMgPSBwaWNrKGF0dHJpYnV0ZXNBcnIsIHRoaXMucHJvcHMpXG4gICAgaWYgKHRoaXMucHJvcHMudHJhaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYWRkVHJhaXRzKHRoaXMucHJvcHMudHJhaXRzKVxuICAgIH1cbiAgICB0aGlzLmxvYWRBbGxNZXRob2RzKClcbiAgICB0aGlzLnByb3BzLmFjdGlvbiA9ICdMT0FERUQnXG4gICAgdGhpcy5zaW5rJCA9IG5ldyBTdWJqZWN0KClcbiAgICB0aGlzLnByb3BzLmVsSXNBbHJlYWR5UmVuZGVyZWRCb29sID0gdGhpcy5lbEFscmVhZHlFeGlzdHNGbih0aGlzLnByb3BzKVxuICAgIGNvbnN0IFZpZXdDbGFzcyA9IHRoaXMucHJvcHMudmlld0NsYXNzXG4gICAgdGhpcy52aWV3ID0gbmV3IFZpZXdDbGFzcyh0aGlzLnNpbmskLCB7IGVsOnRoaXMucHJvcHMuZWwgfSwgdGhpcy5wcm9wcy52c2lkLCB0aGlzLnByb3BzLmlkKS8vIG5ldyB0aGlzLnByb3BzLnZpZXdDbGFzcyh0aGlzLnNpbmskKTtcbiAgICB0aGlzLnNvdXJjZVN0cmVhbXMgPSB0aGlzLnZpZXcuc291cmNlU3RyZWFtc1xuICAgIHRoaXMuX3Jhd1NvdXJjZSQgPSB0aGlzLnZpZXcuZ2V0U291cmNlU3RyZWFtKClcbiAgICB0aGlzLl9yYXdTb3VyY2UkLnZpZXdOYW1lID0gdGhpcy5wcm9wcy5uYW1lXG4gICAgdGhpcy5zZW5kRXZlbnRzRG93blN0cmVhbSA9IHRoaXMuc2VuZEV2ZW50c0Rvd25TdHJlYW1GblxuICAgIHRoaXMuaW5pdFZpZXdTdHJlYW0oKVxuICAgIHRoaXMuaXNEZXZNb2RlID0gVmlld1N0cmVhbS5pc0Rldk1vZGUoKVxuICAgIHRoaXMucHJvcHMuYWRkZWRDaGFubmVscyA9IFtdXG4gICAgdGhpcy5jaGVja0lmRWxlbWVudEFscmVhZHlFeGlzdHMoKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSEFTSCBLRVkgQU5EIFNQSUdPVCBNRVRIT0RTPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGdldCBzb3VyY2UkKCkge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2UkXG4gIH1cblxuICBnZXQgYXR0cmlidXRlc0FycmF5KCkge1xuICAgIHJldHVybiBbXG4gICAgICAvLyBHbG9iYWwgQXR0cmlidXRlc1xuICAgICAgJ2FjY2Vzc2tleScsICdjbGFzcycsICdjb250ZW50ZWRpdGFibGUnLCAnZGlyJywgJ2RyYWdnYWJsZScsICdoaWRkZW4nLCAnaWQnLCAnbGFuZycsICdzcGVsbGNoZWNrJywgJ3N0eWxlJywgJ3RhYmluZGV4JywgJ3RpdGxlJywgJ3RyYW5zbGF0ZScsXG5cbiAgICAgIC8vIEFjY2Vzc2libGl0eSBBdHRyaWJ1dGVzXG4gICAgICAnYXJpYS1hdXRvY29tcGxldGUnLCAnYXJpYS1jaGVja2VkJywgJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1leHBhbmRlZCcsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaGlkZGVuJywgJ2FyaWEtaW52YWxpZCcsICdhcmlhLWxhYmVsJywgJ2FyaWEtbGV2ZWwnLCAnYXJpYS1tdWx0aWxpbmUnLCAnYXJpYS1tdWx0aXNlbGVjdGFibGUnLCAnYXJpYS1vcmllbnRhdGlvbicsICdhcmlhLXByZXNzZWQnLCAnYXJpYS1yZWFkb25seScsICdhcmlhLXJlcXVpcmVkJywgJ2FyaWEtc2VsZWN0ZWQnLCAnYXJpYS1zb3J0JywgJ2FyaWEtdmFsdWVtYXgnLCAnYXJpYS12YWx1ZW1pbicsICdhcmlhLXZhbHVlbm93JywgJ2FyaWEtdmFsdWV0ZXh0JywgJ2FyaWEtYXRvbWljJywgJ2FyaWEtYnVzeScsICdhcmlhLWxpdmUnLCAnYXJpYS1yZWxldmFudCcsICdhcmlhLWRyb3BlZmZlY3QnLCAnYXJpYS1ncmFiYmVkJywgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcsICdhcmlhLWNvbnRyb2xzJywgJ2FyaWEtZGVzY3JpYmVkYnknLCAnYXJpYS1mbG93dG8nLCAnYXJpYS1sYWJlbGxlZGJ5JywgJ2FyaWEtb3ducycsICdhcmlhLXBvc2luc2V0JywgJ2FyaWEtc2V0c2l6ZScsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIGlucHV0XG4gICAgICAnYWNjZXB0JywgJ2F1dG9jb21wbGV0ZScsICdhdXRvZm9jdXMnLCAnY2hlY2tlZCcsICdkaXJuYW1lJywgJ2Rpc2FibGVkJywgJ2Zvcm0nLCAnZm9ybWFjdGlvbicsXG4gICAgICAnZm9ybWVuY3R5cGUnLCAnZm9ybW1ldGhvZCcsICdmb3Jtbm92YWxpZGF0ZScsICdmb3JtdGFyZ2V0JywgJ2xpc3QnLCAnbWF4JywgJ21heGxlbmd0aCcsXG4gICAgICAnbWluJywgJ21pbmxlbmd0aCcsICdtdWx0aXBsZScsICduYW1lJywgJ3BhdHRlcm4nLCAncGxhY2Vob2xkZXInLCAncmVhZG9ubHknLCAncmVxdWlyZWQnLCAnc2l6ZScsICdzdGVwJywgJ3ZhbHVlJyxcblxuICAgICAgLy8gU3BlY2lmaWMgQXR0cmlidXRlcyBmb3IgaW1nXG4gICAgICAnYWx0JywgJ3NyY3NldCcsICdzaXplcycsICd1c2VtYXAnLCAnaXNtYXAnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBhIGFuZCBsaW5rXG4gICAgICAnaHJlZicsICd0YXJnZXQnLCAnZG93bmxvYWQnLCAncGluZycsICdyZWwnLCAnaHJlZmxhbmcnLCAnYXMnLCAnbWVkaWEnLFxuXG4gICAgICAvLyBTcGVjaWZpYyBBdHRyaWJ1dGVzIGZvciBmb3JtXG4gICAgICAnYWNjZXB0LWNoYXJzZXQnLCAnYWN0aW9uJywgJ2VuY3R5cGUnLCAnbm92YWxpZGF0ZScsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIG1ldGFcbiAgICAgICdjb250ZW50JywgJ2NoYXJzZXQnLCAnaHR0cC1lcXVpdicsXG5cbiAgICAgIC8vIFNwZWNpZmljIEF0dHJpYnV0ZXMgZm9yIHNjcmlwdFxuICAgICAgJ2FzeW5jJywgJ2RlZmVyJywgJ2ludGVncml0eScsICdub21vZHVsZScsICdub25jZScsICdyZWZlcnJlcnBvbGljeScsXG5cbiAgICAgIC8vIE90aGVyIEVsZW1lbnQtc3BlY2lmaWMgQXR0cmlidXRlc1xuICAgICAgJ2F1dG9jYXBpdGFsaXplJywgJ2F1dG9wbGF5JywgJ2J1ZmZlcmVkJywgJ2NoYWxsZW5nZScsICdjaXRlJywgJ2NvZGUnLCAnY29kZWJhc2UnLCAnY29sb3InLCAnY29scycsICdjb2xzcGFuJywgJ2NvbnRleHRtZW51JywgJ2NvbnRyb2xzJywgJ2Nvb3JkcycsICdjcm9zc29yaWdpbicsICdjc3AnLCAnZGF0YXNldCcsICdkYXRldGltZScsICdkZWNvZGluZycsICdkZWZhdWx0JywgJ2ZvcicsICdoZWFkZXJzJywgJ2hpZ2gnLCAnaWNvbicsICdpbXBvcnRhbmNlJywgJ2l0ZW1wcm9wJywgJ2tleXR5cGUnLCAna2luZCcsICdsYWJlbCcsICdsYW5ndWFnZScsICdsYXp5bG9hZCcsICdsb29wJywgJ2xvdycsICdtYW5pZmVzdCcsICdtZXRob2QnLCAnbXV0ZWQnLCAnb3BlbicsICdvcHRpbXVtJywgJ3Bvc3RlcicsICdwcmVsb2FkJywgJ3JhZGlvZ3JvdXAnLCAncmV2ZXJzZWQnLCAncm9sZScsICdyb3dzJywgJ3Jvd3NwYW4nLCAnc2FuZGJveCcsICdzY29wZScsICdzY29wZWQnLCAnc2VsZWN0ZWQnLCAnc2hhcGUnLCAnc2xvdCcsICdzcGFuJywgJ3NyY2RvYycsICdzcmMnLCAndHlwZScsICdzcmNsYW5nJywgJ3N0YXJ0JywgJ3N1bW1hcnknLCAnd3JhcCcsICd3aWR0aCcsICdoZWlnaHQnXG4gICAgXVxuICB9XG5cbiAgc3RhdGljIGlzRGV2TW9kZSgpIHtcbiAgICByZXR1cm4gU3B5bmVBcHBQcm9wZXJ0aWVzLmRlYnVnXG4gIH1cblxuICBzdGF0aWMgY2hlY2tJZkFjdGlvbnNBcmVSZWdpc3RlcmVkKGNoYW5uZWxzQXJyID0gW10sIGFjdGlvbnNBcnIpIHtcbiAgICBpZiAoYWN0aW9uc0Fyci5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBnZXRBbGxBY3Rpb25zID0gKGEpID0+IHtcbiAgICAgICAgY29uc3QgZ2V0UmVnaXN0ZXJlZEFjdGlvbnNBcnIgPSAoc3RyKSA9PiBTcHluZUFwcFByb3BlcnRpZXMuZ2V0Q2hhbm5lbEFjdGlvbnMoc3RyKVxuICAgICAgICBjb25zdCBhcnIgPSAgYS5tYXAoZ2V0UmVnaXN0ZXJlZEFjdGlvbnNBcnIpXG4gICAgICAgIHJldHVybiBmbGF0dGVuKGFycilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoZWNrRm9yTWF0Y2ggPSAoc3RyTWF0Y2gpID0+IHtcbiAgICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKHN0ck1hdGNoKVxuICAgICAgICBjb25zdCBhY3Rpb25JbmRleCA9IGZpbmRJbmRleCh0ZXN0KHJlKSwgZ2V0QWxsQWN0aW9uc0FycilcbiAgICAgICAgaWYgKGFjdGlvbkluZGV4IDwgMCkge1xuICAgICAgICAgIGNvbnN0IGNoYW5uZWxTeW50YXggPSBjaGFubmVsc0Fyci5sZW5ndGggPT09IDEgPyAnZnJvbSBhZGRlZCBjaGFubmVsJyA6ICdmcm9tIGFkZGVkIGNoYW5uZWxzJ1xuICAgICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGFjdGlvbiwgJHtzdHJNYXRjaH0sIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHRoZSByZWdpc3RlcmVkIGFjdGlvbnMgJHtjaGFubmVsU3ludGF4fSwgJHtjaGFubmVsc0Fyci5qb2luKCcsICcpfWApXG4gICAgICAgIH1cbiAgICAgICAgLy8gIGNvbnN0IHZzbnVtID0gKCk9PiBSLnRlc3QobmV3IFJlZ0V4cChzdHIpLCBcIkNIQU5ORUxfUk9VVEVfVEVTVF9FVkVOVFwiKVxuICAgICAgfVxuICAgICAgY29uc3QgZ2V0QWxsQWN0aW9uc0FyciA9IGdldEFsbEFjdGlvbnMoY2hhbm5lbHNBcnIpXG4gICAgICBhY3Rpb25zQXJyLmZvckVhY2goY2hlY2tGb3JNYXRjaClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQWRkIGFueSBxdWVyeSB3aXRoaW4gdGhlIFZpZXdTdHJlYW0ncyBkb20gYW5kIGFueSBkb20gZXZlbnRzIHRvIGF1dG9tYXRpY2FsbHkgYmUgb2JzZXJ2ZWQgYnkgdGhlIFVJIENoYW5uZWwuXG4gICAqIDxicj5cbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogIGJyb2FkY2FzdEV2ZW50cygpIHtcbiAgICogIC8vIEFERCBCVVRUT04gRVZFTlRTIEFTIE5FU1RFRCBBUlJBWVNcbiAgICogIHJldHVybiBbXG4gICAqICAgICAgIFsnI215LWJ1dHRvbicsICdtb3VzZW92ZXInXSxcbiAgICogICAgICAgWycjbXktaW5wdXQnLCAnY2hhbmdlJ11cbiAgICogICAgIF1cbiAgICogICB9XG4gICAqXG4gICAqXG4gICAqICovXG5cbiAgc3RhdGljIGlzVmFsaWROZXN0ZWRBcnIoZXZlbnRzQXJyKSB7XG4gICAgY29uc3QgaXNUcnVlID0gZXF1YWxzKHRydWUpXG4gICAgY29uc3QgYWxsSXNUcnVlID0gYWxsKGlzVHJ1ZSlcbiAgICBjb25zdCBpc1N0cmluZyA9IGlzKFN0cmluZylcbiAgICBjb25zdCBpc1ZhbGlkQXJyID0gY29tcG9zZShhbGxJc1RydWUsIHJNYXAoaXNTdHJpbmcpLCBzbGljZSgwLCAyKSwgZGVmYXVsdFRvKFtdKSlcbiAgICBjb25zdCBtYXBFdmVudHNBcnJGbiA9IGNvbXBvc2UoYWxsSXNUcnVlLCByTWFwKGlzVmFsaWRBcnIpLCBkZWZhdWx0VG8oW10pKVxuICAgIHJldHVybiBtYXBFdmVudHNBcnJGbihldmVudHNBcnIpXG4gIH1cblxuICBzdGF0aWMgZWxJc0RvbUVsZW1lbnQobykge1xuICAgIGlmIChpcyhTdHJpbmcsIG8pKSB7XG4gICAgICBvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvKVxuICAgIH1cblxuICAgIHJldHVybiBjb21wb3NlKGx0ZSgwKSwgZGVmYXVsdFRvKC0xKSwgcHJvcCgnbm9kZVR5cGUnKSkobylcbiAgfVxuXG4gIHVwZGF0ZVByb3BzVG9NYXRjaEVsKCkge1xuICAgIGNvbnN0IGdldFRhZ05hbWUgPSBjb21wb3NlKHRvTG93ZXIsIGVpdGhlcihwcm9wKCd0YWdOYW1lJyksIGFsd2F5cygnJykpKVxuICAgIHRoaXMucHJvcHMudGFnTmFtZSA9IGdldFRhZ05hbWUodGhpcy5wcm9wcy5lbClcbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBlbEFscmVhZHlFeGlzdHNGbihwcm9wcykge1xuICAgIGNvbnN0IGVsSXNEb21FbGVtZW50ID0gY29tcG9zZShsdGUoMCksIGRlZmF1bHRUbygtMSksIHByb3AoJ25vZGVUeXBlJykpXG4gICAgY29uc3QgZWxJc1JlbmRlcmVkID0gZWwgPT4gZG9jdW1lbnQuYm9keS5jb250YWlucyhlbClcbiAgICByZXR1cm4gcHJvcFNhdGlzZmllcyhhbGxQYXNzKFtlbElzUmVuZGVyZWQsIGVsSXNEb21FbGVtZW50XSksICdlbCcpKHByb3BzKVxuICB9XG5cbiAgY2hlY2tJZkVsZW1lbnRBbHJlYWR5RXhpc3RzKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmVsSXNBbHJlYWR5UmVuZGVyZWRCb29sID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVByb3BzVG9NYXRjaEVsKClcbiAgICAgIHRoaXMucG9zdFJlbmRlcigpXG4gICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLmVsID09PSBudWxsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTcHluZSBFcnJvcjogVGhlIGRlZmluZWQgZWxlbWVudCBmb3IgdGhpcyBWaWV3U3RyZWFtIGluc3RhbmNlLCAke3RoaXMuY29uc3RydWN0b3IubmFtZX0sIGFwcGVhcnMgdG8gbm90IGV4aXN0LmApXG4gICAgfVxuICB9XG5cbiAgbG9hZEFsbE1ldGhvZHMoKSB7XG4gICAgY29uc3QgY2hhbm5lbEZuID0gY3VycnkodGhpcy5vbkNoYW5uZWxNZXRob2RDYWxsLmJpbmQodGhpcykpXG4gICAgY29uc3QgY3JlYXRlRXh0cmFTdGF0ZXNNZXRob2QgPSAoYXJyKSA9PiB7XG4gICAgICBsZXQgW2FjdGlvbiwgZnVuY1N0ciwgYWN0aW9uRmlsdGVyXSA9IGFyclxuICAgICAgaWYgKGlzKFN0cmluZywgYWN0aW9uRmlsdGVyKSkge1xuICAgICAgICBhY3Rpb25GaWx0ZXIgPSBuZXcgQ2hhbm5lbFBheWxvYWRGaWx0ZXIoeyBzZWxlY3RvcjphY3Rpb25GaWx0ZXIgfSlcbiAgICAgIH1cbiAgICAgIHRoaXMucHJvcHMuZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHNbYWN0aW9uXSA9IGNoYW5uZWxGbihmdW5jU3RyLFxuICAgICAgICBhY3Rpb25GaWx0ZXIpXG4gICAgfVxuICAgIHRoaXMuYWRkQWN0aW9uTGlzdGVuZXJzKCkuZm9yRWFjaChjcmVhdGVFeHRyYVN0YXRlc01ldGhvZClcbiAgICB0aGlzLnByb3BzLmhhc2hTb3VyY2VNZXRob2RzID0gdGhpcy5zZXRTb3VyY2VIYXNoTWV0aG9kcyhcbiAgICAgIHRoaXMucHJvcHMuZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHMpXG4gIH1cblxuICAvKipcbiAgICogQmluZHMgY2hhbm5lbCBhY3Rpb25zIHRvIGxvY2FsIG1ldGhvZHMsIGZvcm1hdHRlZCBhcyBhcnJheSB2YWx1ZXMuXG4gICAqIDx1bD5cbiAgICogPGxpPjxiPkZpcnN0IHZhbHVlOjwvYj4gQWN0aW9uIG5hbWUsIGFzIGEgc3RyaW5nIG9yIGFzIGEgYmFzaWMgUmVndWxhciBFeHByZXNzaW9uLlxuICAgKiA8bGk+PGI+U2Vjb25kIHZhbHVlOjwvYj4gVGhlIG1ldGhvZCB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYWN0aW9uIGlzIHB1Ymxpc2hlZC5cbiAgICogPGxpPjxiPlRoaXJkIG9wdGlvbmFsIHZhbHVlOjwvYj4gVGhpcyBpcyBhIGZpbHRlciBvcHRpb24gdGhhdCBjYW4gYmUgYSBzZWxlY3RvciBzdHJpbmcuIG9yIGFuIGluc3RhbmNlIG9mIHRoZSBMSU5LWydjaGFubmVsUGF5bG9hZEZpbHRlcicsICdjaGFubmVsLXBheWxvYWQtZmlsdGVyJ10uXG4gICAqIDwvdWw+XG4gICAqIEBleGFtcGxlXG4gICAqICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgcmV0dXJuIFtcbiAgICogICAgIFsnQ0hBTk5FTF9VSV9DTElDS19FVkVOVCcsICdvbkNsaWNrRXZlbnQnLCAnbGkubXljbGFzcyddLFxuICAgKiAgICAgWydDSEFOTkVMX01ZX0NVU1RPTV9FVkVOVCcsICdvbkFjdGlvblJldHVybmVkJ11cbiAgICogICAgICAgICAgICBdXG4gICAqICAgICAgICAgICB9XG4gICAqXG4gICAqIEByZXR1cm5zIE5lc3RlZCBBcnJheVxuICAgKi9cbiAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgb25DaGFubmVsTWV0aG9kQ2FsbChzdHIsIGFjdGlvbkZpbHRlciwgcCkge1xuICAgIGNvbnN0IHJ1bkZ1bmMgPSAocGF5bG9hZCkgPT4ge1xuICAgICAgaWYgKHRoaXNbc3RyXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG1ldGhvZCwgJHtzdHJ9IGRvZXMgbm90IGFwcGVhciB0byBleGlzdCBpbiAke3RoaXMuY29uc3RydWN0b3IubmFtZX0hYClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbc3RyXShwYXlsb2FkKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwLiRkaXIgIT09IHVuZGVmaW5lZCAmJiBwLiRkaXIuaW5jbHVkZXMoJ2NoaWxkJykgJiZcbiAgICAgICAgdGhpcy5kZWxldGVkICE9PSB0cnVlKSB7XG4gICAgICBjb25zdCBvYmogPSBkZWVwTWVyZ2Uoe30sIHApLy8gT2JqZWN0LmFzc2lnbih7fSwgcCk7XG4gICAgICBvYmouJGRpciA9IHRoaXMuJGRpcnMuQ1xuICAgICAgdGhpcy5zb3VyY2VTdHJlYW1zLnJhdyQubmV4dChvYmopXG4gICAgfVxuICAgIGNvbnN0IGZpbHRlclBheWxvYWQgPSBkZWZhdWx0VG8oYWx3YXlzKHRydWUpLCBhY3Rpb25GaWx0ZXIpXG5cbiAgICBpZiAoZmlsdGVyUGF5bG9hZChwKSA9PT0gdHJ1ZSkge1xuICAgICAgcCA9IG9taXQoWyckZGlyJ10sIHApXG4gICAgICBydW5GdW5jKHApXG4gICAgfVxuICB9XG5cbiAgc2V0U291cmNlSGFzaE1ldGhvZHMoZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHMgPSB7fSkge1xuICAgIGNvbnN0IGhhc2hTb3VyY2VLZXlzID0ge1xuICAgICAgRVhUSVJQQVRJTkc6IChwKSA9PiB0aGlzLmNoZWNrUGFyZW50RGlzcG9zZShwKSxcbiAgICAgIEVYVElSUEFURTogKHApID0+IHRoaXMuZGlzcG9zZVZpZXdTdHJlYW0ocCksXG4gICAgICAvLyAnQ0hJTERfRVhUSVJQQVRFJyAgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5kaXNwb3NlVmlld1N0cmVhbShwKSxcbiAgICAgIFZTX1NQQVdORUQ6IChwKSA9PiB0aGlzLm9uVlNSZW5kZXJlZChwKSxcbiAgICAgIFZTX1NQQVdORURfQU5EX0FUVEFDSEVEX1RPX0RPTTogKHApID0+IHRoaXMub25WU1JlbmRlcmVkKHApLFxuICAgICAgVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UOiAocCkgPT4gdGhpcy5vblZTUmVuZGVyZWQocCksXG4gICAgICAvLyAnQ0hJTERfVlNfU1BBV05FRCcgICAgICAgICAgICAgICAgICAgOiAocCkgPT4gdGhpcy5hdHRhY2hDaGlsZFRvVmlldyhwKSxcbiAgICAgIFJFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUOiAocCkgPT4gdGhpcy5vblJlYWR5VG9HQyhwKSxcbiAgICAgIFZTX05VTExJVFk6ICgpID0+ICh7fSlcbiAgICB9XG4gICAgcmV0dXJuIGRlZXBNZXJnZS5hbGwoW3t9LCBoYXNoU291cmNlS2V5cywgZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHNdKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBNQUlOIFNUUkVBTSBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGluaXRWaWV3U3RyZWFtKCkge1xuICAgIHRoaXMuX3NvdXJjZSQgPSB0aGlzLl9yYXdTb3VyY2UkLnBpcGUobWFwKFxuICAgICAgKHBheWxvYWQpID0+IHRoaXMub25NYXBWaWV3U291cmNlKHBheWxvYWQpKSwgdGFrZVdoaWxlKHRoaXMubm90R0NTVEFURSkpXG5cbiAgICB0aGlzLmluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zKClcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbih0aGlzLl9zb3VyY2UkLCB0cnVlKVxuICB9XG5cbiAgbm90R0NTVEFURShwKSB7XG4gICAgcmV0dXJuICFwLmFjdGlvbi5pbmNsdWRlcygnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnKVxuICB9XG5cbiAgZXFHQ1NUQVRFKHApIHtcbiAgICByZXR1cm4gIXAuYWN0aW9uLmluY2x1ZGVzKCdSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCcpXG4gIH1cblxuICBub3RDT01QTEVURUQocCkge1xuICAgIHJldHVybiAhcC5hY3Rpb24uaW5jbHVkZXMoJ0NPTVBMRVRFRCcpXG4gIH1cblxuICBub3RHQ0NPTVBMRVRFKHApIHtcbiAgICByZXR1cm4gIXAuYWN0aW9uLmluY2x1ZGVzKCdHQ19DT01QTEVURScpXG4gIH1cblxuICB0ZXN0VmFsKHApIHtcbiAgICBjb25zb2xlLmxvZygnVEVTVElORyBWQUxMIElTICcsIHApXG4gIH1cblxuICBhZGRQYXJlbnRTdHJlYW0ob2JzLCBhdHRhY2hEYXRhKSB7XG4gICAgY29uc3QgZmlsdGVyT3V0TnVsbERhdGEgPSAoZGF0YSkgPT4gZGF0YSAhPT0gdW5kZWZpbmVkICYmIGRhdGEuYWN0aW9uICE9PVxuICAgICAgICB1bmRlZmluZWRcbiAgICBjb25zdCBjaGVja0lmRGlzcG9zZU9yRmFkZW91dCA9IChkKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gZGVlcE1lcmdlKHt9LCBkKVxuXG4gICAgICBpZiAoZGF0YS5hY3Rpb24gPT09ICdFWFRJUlBBVEVfQU5EX1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJykge1xuICAgICAgICB0aGlzLmRpc3Bvc2VWaWV3U3RyZWFtKGRhdGEpXG4gICAgICAgIGRhdGEuYWN0aW9uID0gJ1JFQURZX0ZPUl9WU19ERVRSSVRVU19DT0xMRUNUJ1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGFcbiAgICB9XG5cbiAgICB0aGlzLnBhcmVudCQgPSBvYnMucGlwZShcbiAgICAgIGZpbHRlcihmaWx0ZXJPdXROdWxsRGF0YSksXG4gICAgICBtYXAoY2hlY2tJZkRpc3Bvc2VPckZhZGVvdXQpKVxuICAgIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKHRoaXMucGFyZW50JCwgZmFsc2UsICdQQVJFTlQnKVxuICAgIHRoaXMucmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQoYXR0YWNoRGF0YSlcbiAgfVxuXG4gIGFkZENoaWxkU3RyZWFtKG9icyQpIHtcbiAgICBjb25zdCBmaWx0ZXJPdXROdWxsRGF0YSA9IChkYXRhKSA9PiBkYXRhICE9PSB1bmRlZmluZWQgJiYgZGF0YS5hY3Rpb24gIT09XG4gICAgICAgIHVuZGVmaW5lZFxuICAgIGNvbnN0IGNoaWxkJCA9IG9icyQucGlwZShcbiAgICAgIGZpbHRlcihmaWx0ZXJPdXROdWxsRGF0YSksXG4gICAgICB0YXAocCA9PiB0aGlzLnRyYWNlcignYWRkQ2hpbGRTdHJhZW0gZG8gJywgcCkpLFxuICAgICAgbWFwKChwKSA9PiB7XG4gICAgICAgIHJldHVybiBwXG4gICAgICB9KSxcbiAgICAgIGZpbmFsaXplKHAgPT4gdGhpcy5vbkNoaWxkQ29tcGxldGVkKGNoaWxkJC5zb3VyY2UpKSlcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbihjaGlsZCQsIHRydWUsICdDSElMRCcpXG4gIH1cblxuICBvbkNoaWxkRGlzcG9zZWQocCkge1xuXG4gIH1cblxuICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgb25DaGlsZENvbXBsZXRlZChwKSB7XG4gICAgY29uc3QgZmluZE5hbWUgPSAoeCkgPT4ge1xuICAgICAgY29uc3QgZmluYWxEZXN0ID0gKHkpID0+IHtcbiAgICAgICAgd2hpbGUgKHkuZGVzdGluYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHkgPSBmaW5hbERlc3QoeS5kZXN0aW5hdGlvbilcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBpY2soWydpZCcsICd2c2lkJ10sIGZpbmFsRGVzdCh4KSlcbiAgICB9XG4gICAgY29uc3QgY2hpbGRDb21wbGV0ZWREYXRhID0gZmluZE5hbWUocClcbiAgICB0aGlzLnRyYWNlcignb25DaGlsZENvbXBsZXRlZCAnLCB0aGlzLnZzbnVtLCBwKVxuICAgIC8vIGNvbnNvbGUubG9nKCdvYmogaXMgJyxjaGlsZENvbXBsZXRlZE5hbWUsb2JqLHRoaXMucHJvcHMpO1xuICAgIHRoaXMub25DaGlsZERpc3Bvc2VkKGNoaWxkQ29tcGxldGVkRGF0YSwgcClcbiAgICByZXR1cm4gY2hpbGRDb21wbGV0ZWREYXRhXG4gIH1cblxuICBpbml0QXV0b01lcmdlU291cmNlU3RyZWFtcygpIHtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09IFNVQlNDUklQVElPTiBTT1VSQ0UgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHN1YnNjcmliZXIgPSB7XG4gICAgICBuZXh0OiB0aGlzLm9uU3Vic2NyaWJlVG9Tb3VyY2VzTmV4dC5iaW5kKHRoaXMpLFxuICAgICAgZXJyb3I6IHRoaXMub25TdWJzY3JpYmVUb1NvdXJjZXNFcnJvci5iaW5kKHRoaXMpLFxuICAgICAgY29tcGxldGU6IHRoaXMub25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZS5iaW5kKHRoaXMpXG4gICAgfVxuICAgIC8vIGxldCB0YWtlQmVmb3JlR0NPbGQgPSAodmFsKSA9PiB2YWwuYWN0aW9uICE9PSAnVlNfREVUUklUVVNfQ09MTEVDVEVEJztcbiAgICAvLyBsZXQgdGFrZUJlZm9yZUdDID0gKHApID0+ICFwLmFjdGlvbi5pbmNsdWRlcygnUkVBRFlfRk9SX1ZTX0RFVFJJVFVTX0NPTExFQ1QnKTtcbiAgICAvLyBsZXQgbWFwVG9TdGF0ZSA9ICh2YWwpID0+ICh7YWN0aW9uOnZhbH0pO1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyA9PT09PT09PT09IE1FVEhPRFMgVE8gQ0hFQ0sgRk9SIFdIRU4gVE8gQ09NUExFVEUgVEhFIFNUUkVBTSA9PT09PT09PT1cbiAgICBjb25zdCBjb21wbGV0ZUFsbCA9ICgpID0+IHtcbiAgICAgIHRoaXMucHJvcHMuZWwkID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLnViZXJTb3VyY2UkLmNvbXBsZXRlKClcbiAgICAgIHRoaXMuYXV0b1N1YnNjcmliZXIkLmNvbXBsZXRlKClcbiAgICAgIHRoaXMuc2luayQuY29tcGxldGUoKVxuICAgICAgdGhpcy5wcm9wcyA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5kZWxldGVkID0gdHJ1ZVxuICAgICAgdGhpcy50cmFjZXIoJ2NvbXBsZXRlQWxsJywgdGhpcy5kZWxldGVkLCB0aGlzLnByb3BzKVxuICAgIH1cbiAgICBjb25zdCBkZWNyZW1lbnRPbk9ic2VydmFibGVDbG9zZWQgPSAoKSA9PiB7XG4gICAgICBvYnNDb3VudCAtPSAxXG4gICAgICBpZiAob2JzQ291bnQgPT09IDApIHtcbiAgICAgICAgY29tcGxldGVBbGwoKVxuICAgICAgfVxuICAgIH1cbiAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IElOSVQgU1RSRUFNIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbGV0IG9ic0NvdW50ID0gMFxuICAgIHRoaXMudWJlclNvdXJjZSQgPSBuZXcgU3ViamVjdCgpXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT0gQ09NUE9TRUQgUlhKUyBPQlNFUlZBQkxFID09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCBpbmNyZW1lbnRPYnNlcnZhYmxlc1RoYXRDbG9zZXMgPSAoKSA9PiB7IG9ic0NvdW50ICs9IDEgfVxuICAgIHRoaXMuYXV0b01lcmdlU3ViamVjdCQgPSB0aGlzLnViZXJTb3VyY2UkLnBpcGUobWVyZ2VNYXAoKG9ic0RhdGEpID0+IHtcbiAgICAgIGNvbnN0IGJyYW5jaE9ic2VydmFibGUkID0gb2JzRGF0YS5vYnNlcnZhYmxlLnBpcGUoZmlsdGVyKFxuICAgICAgICAocCkgPT4gcCAhPT0gdW5kZWZpbmVkICYmIHAuYWN0aW9uICE9PSB1bmRlZmluZWQpLCBtYXAocCA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdQQVlMT0FEIElTICcsIHAsIHRoaXMuY29uc3RydWN0b3IubmFtZSlcbiAgICAgICAgY29uc3QgcGF5bG9hZCA9IGRlZXBNZXJnZSh7fSwgcClcbiAgICAgICAgcGF5bG9hZC5hY3Rpb24gPSBwLmFjdGlvbi8vIGFkZFJlbGF0aW9uVG9TdGF0ZShvYnNEYXRhLnJlbCwgcC5hY3Rpb24pO1xuICAgICAgICB0aGlzLnRyYWNlcignYXV0b01lcmdlU3ViamVjdCQnLCBwYXlsb2FkKVxuICAgICAgICByZXR1cm4gcGF5bG9hZFxuICAgICAgfSkpXG5cbiAgICAgIGlmIChvYnNEYXRhLmF1dG9DbG9zZXNCb29sID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gYnJhbmNoT2JzZXJ2YWJsZSRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluY3JlbWVudE9ic2VydmFibGVzVGhhdENsb3NlcygpXG4gICAgICAgIHJldHVybiBicmFuY2hPYnNlcnZhYmxlJC5waXBlKGZpbmFsaXplKGRlY3JlbWVudE9uT2JzZXJ2YWJsZUNsb3NlZCkpXG4gICAgICB9XG4gICAgfSkpXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1VCU0NSSUJFUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICB0aGlzLmF1dG9TdWJzY3JpYmVyJCA9IHRoaXMuYXV0b01lcmdlU3ViamVjdCRcbiAgICAvLyAuZG8oKHApID0+IGNvbnNvbGUubG9nKCdTSU5LIERBVEEgJywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCBwKSlcbiAgICAgIC5waXBlKGZpbHRlcigocCkgPT4gcCAhPT0gdW5kZWZpbmVkICYmIHAuYWN0aW9uICE9PSB1bmRlZmluZWQpKVxuICAgICAgLnN1YnNjcmliZShzdWJzY3JpYmVyKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBNRVJHRSBTVFJFQU1TIFRPIE1BSU4gU1VCU0NSSUJFUiA9PT09PT09PT09PT09PT09PVxuICB1cGRhdGVTb3VyY2VTdWJzY3JpcHRpb24ob2JzJCwgYXV0b0Nsb3Nlc0Jvb2wgPSBmYWxzZSwgcmVsKSB7XG4gICAgLy8gY29uc3QgZGlyZWN0aW9uQXJyID0gc2VuZERvd25TdHJlYW0gPT09IHRydWUgPyB0aGlzLiRkaXJzLkRJIDogdGhpcy4kZGlycy5JO1xuICAgIGNvbnN0IG9iaiA9IHtcbiAgICAgIG9ic2VydmFibGU6IG9icyQsXG4gICAgICBhdXRvQ2xvc2VzQm9vbCxcbiAgICAgIHJlbFxuICAgIH1cbiAgICB0aGlzLnRyYWNlcigndXBkYXRlU291cmNlU3Vic2NyaXB0aW9uICcsIHRoaXMudnNudW0sIG9iailcbiAgICB0aGlzLnViZXJTb3VyY2UkLm5leHQob2JqKVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1VCU0NSSUJFUiBNRVRIT0RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBvblN1YnNjcmliZVRvU291cmNlc05leHQocGF5bG9hZCA9IHt9KSB7XG4gICAgY29uc3QgZGVmYXVsdFRvRm4gPSBkZWZhdWx0VG8oKHApID0+IHRoaXMuc2VuZEV4dGVuZGVkU3RyZWFtcyhwKSlcblxuICAgIC8vICoqKipVU0UgUkVHRVggQVMgUFJFRElDQVRFIENIRUNLIEZPUiBQQVlMT0FELkFDVElPTiBJTiBIQVNIIE1FVEhPRFMgT0JKXG4gICAgLy8gY29uc3QgaGFzaEFjdGlvbiA9IHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHNbcGF5bG9hZC5hY3Rpb25dO1xuICAgIGNvbnN0IGhhc2hBY3Rpb25TdHIgPSBmaW5kU3RyT3JSZWdleE1hdGNoU3RyKHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHMsXG4gICAgICBwYXlsb2FkLmFjdGlvbilcbiAgICBjb25zdCBoYXNoQWN0aW9uID0gdGhpcy5wcm9wcy5oYXNoU291cmNlTWV0aG9kc1toYXNoQWN0aW9uU3RyXVxuICAgIC8vIGNvbnNvbGUubG9nKCdTIFBBWUxPQUQgJywgdGhpcy5wcm9wcy5uYW1lLCB0eXBlb2YgKGhhc2hBY3Rpb24pLCBwYXlsb2FkKTtcblxuICAgIGNvbnN0IGZuID0gZGVmYXVsdFRvRm4oaGFzaEFjdGlvbilcblxuICAgIC8vIGNvbnNvbGUubG9nKCdoYXNoIG1ldGhvZHMgJywgZm4sIHRoaXMucHJvcHMubmFtZSwgcGF5bG9hZC5hY3Rpb24sIGhhc2hBY3Rpb25TdHIsIHRoaXMucHJvcHMuaGFzaFNvdXJjZU1ldGhvZHMpO1xuXG4gICAgZm4ocGF5bG9hZClcbiAgICAvLyBjb25zb2xlLmxvZyhmbiwgcGF5bG9hZCwgJyBUSEUgUEFZTE9BRCBGUk9NIFNVQlNDUklCRSBJUyAnLCAnIC0tLS0gJywgJyAtLS0+ICcsIHRoaXMucHJvcHMpO1xuICAgIC8vIGNvbnNvbGUubG9nKCdFWFRJUlBBVEVSIFZTIE5FWFQnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIHBheWxvYWQpO1xuXG4gICAgdGhpcy50cmFjZXIoJ29uU3Vic2NyaWJlVG9Tb3VyY2VzTmV4dCcsIHsgcGF5bG9hZCB9KVxuICB9XG5cbiAgb25TdWJzY3JpYmVUb1NvdXJjZXNFcnJvcihwYXlsb2FkID0gJycpIHtcbiAgICBjb25zb2xlLmxvZygnQUxMIEVSUk9SICAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIHBheWxvYWQpXG4gIH1cblxuICAvKlxuICAgIGF0dGFjaENoaWxkVG9WaWV3KGRhdGEpIHtcbiAgICAgIC8vIGxldCBjaGlsZFJlbmRlckRhdGEgPSBkYXRhLmF0dGFjaERhdGE7XG4gICAgICAvLyBjb25zb2xlLmxvZygnQ0hJTEQgREFUQSAnLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUsIGNoaWxkUmVuZGVyRGF0YSk7XG4gICAgICAvLyB0aGlzLm9wZW5TcGlnb3QoJ0FUVEFDSF9DSElMRF9UT19TRUxGJywge2NoaWxkUmVuZGVyRGF0YX0pO1xuICAgIH1cbiAgKi9cblxuICBvblN1YnNjcmliZVRvU291cmNlc0NvbXBsZXRlKCkge1xuICAgIC8vIGNvbnNvbGUubG9nKCc9PT09IEVYVElSUEFURVIgQUxMIENPTVBMRVRFRCA9PT09JywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICB0aGlzLnRyYWNlcignb25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZScsICdWU19ERVRSSVRVU19DT0xMRUNUJylcblxuICAgIHRoaXMub3BlblNwaWdvdCgnVlNfREVUUklUVVNfQ09MTEVDVCcpXG4gIH1cblxuICBzZW5kRXh0ZW5kZWRTdHJlYW1zKHBheWxvYWQpIHtcbiAgICB0aGlzLnRyYWNlcignc2VuZEV4dGVuZGVkU3RyZWFtcycsIHBheWxvYWQpXG4gICAgLy8gY29uc29sZS5sb2coJ2V4dGVuZGVkIG1ldGhvZHMgJywgcGF5bG9hZC5hY3Rpb24sIHBheWxvYWQpO1xuICAgIHRoaXMub3BlblNwaWdvdChwYXlsb2FkLmFjdGlvbiwgcGF5bG9hZClcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVlNfU1BBV04gTUVUSE9EUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHJlbmRlckFuZEF0dGFjaFRvUGFyZW50KGF0dGFjaERhdGEpIHtcbiAgICAvLyBsZXQgY2hpbGRSZW5kZXJEYXRhID0gYXR0YWNoRGF0YTtcbiAgICB0aGlzLm9wZW5TcGlnb3QoJ1ZTX1NQQVdOX0FORF9BVFRBQ0hfVE9fUEFSRU5UJywgYXR0YWNoRGF0YSlcbiAgfVxuXG4gIHJlbmRlclZpZXcoKSB7XG4gICAgdGhpcy5vcGVuU3BpZ290KCdWU19TUEFXTicpXG4gIH1cblxuICByZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgdHlwZSwgYXR0YWNoVHlwZSkge1xuICAgIGNvbnN0IGF0dGFjaERhdGEgPSB7IG5vZGUsIHR5cGUsIGF0dGFjaFR5cGUgfVxuICAgIHRoaXMub3BlblNwaWdvdCgnVlNfU1BBV05fQU5EX0FUVEFDSF9UT19ET00nLCB7IGF0dGFjaERhdGEgfSlcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRVhUSVJQQVRFIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNoZWNrUGFyZW50RGlzcG9zZShwKSB7XG4gICAgaWYgKHAuZnJvbSQgPT09ICdwYXJlbnQnKSB7XG4gICAgICB0aGlzLmRpc3Bvc2VWaWV3U3RyZWFtKHApXG4gICAgfVxuICB9XG5cbiAgb25CZWZvcmVEaXNwb3NlKCkge1xuXG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNJTkskIE1FVEhPRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqXG4gICAqIFdyYXBzIHdpbmRvdy5zZXRUaW1lb3V0IHdpdGggYSBjaGVjayB0byBzZWUgaWYgXCJ0aGlzXCIgVmlld1N0cmVhbSBlbGVtZW50IGFuZCBpdHMgcHJvcHMgcHJvcGVydHkgc3RpbGwgZXhpc3RzXG4gICAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb259IGZuIC0gPSAnZnVuY3Rpb24nOyBUaGUgbG9jYWwgbWV0aG9kIHRoYXQgaXMgdG8gYmUgY2FsbGVkLlxuICAgKiBAcHJvcGVydHkge251bWJlcn0gbXMgLSA9IDA7ICBUaGUgdGltZSwgaW4gbWlsbGVzZWNvbmRzLCBmb3IgdGhlIHRpbWVvdXQuXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYmluZCAtID0gZmFsc2U7ICBXaGVuIHRydWUsIHdpbGwgYmluZCB0aGUgbWV0aG9kIHRvICd0aGlzJy5cbiAgICpcbiAgICovXG5cbiAgc2V0VGltZW91dChmbiwgbXMgPSAwLCBiaW5kID0gZmFsc2UpIHtcbiAgICBjb25zdCB0aW1lb3V0TWV0aG9kID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmICh0aGlzICE9PSB1bmRlZmluZWQgJiYgdGhpcy5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZEZuID0gYmluZCA9PT0gdHJ1ZSA/IGZuLmJpbmQodGhpcykgOiBmblxuICAgICAgICBhcHBseShtZXRob2RGbiwgYXJncylcbiAgICAgIH1cbiAgICB9XG4gICAgd2luZG93LnNldFRpbWVvdXQodGltZW91dE1ldGhvZCwgbXMpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQmVnaW5zIHRoZSByZW1vdmFsIHByb2Nlc3Mgb2YgdGhlIFZpZXdTdHJlYW0gaW5zdGFuY2UgYWxvbmcgd2l0aCBhbGwgb2YgaXRzIGNoYWluZWQgVmlld1N0cmVhbSBjaGlsZHJlbi5cbiAgICovXG4gIGRpc3Bvc2VWaWV3U3RyZWFtKHApIHtcbiAgICAvLyBjb25zb2xlLmxvZygnRVhUSVJQQVRFUiBWUyBvbkRpc3Bvc2UgJywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICB0aGlzLm9uQmVmb3JlRGlzcG9zZSgpXG4gICAgdGhpcy5vcGVuU3BpZ290KCdFWFRJUlBBVEUnKVxuICB9XG5cbiAgb25DaGlsZERpc3Bvc2UocCkge1xuICB9XG5cbiAgb25QYXJlbnREaXNwb3NpbmcocCkge1xuICAgIC8vIHRoaXMudXBkYXRlU291cmNlU3Vic2NyaXB0aW9uKHRoaXMuX3NvdXJjZSQpO1xuICAgIHRoaXMub3BlblNwaWdvdCgnRVhUSVJQQVRFJylcbiAgfVxuXG4gIG9uUmVhZHlUb0dDKHApIHtcbiAgICBjb25zdCBpc0ludGVybmFsID0gcC5mcm9tJCAhPT0gdW5kZWZpbmVkICYmIHAuZnJvbSQgPT09ICdpbnRlcm5hbCdcbiAgICBpZiAoaXNJbnRlcm5hbCkge1xuICAgICAgLy8gdGhpcy5vcGVuU3BpZ290KCdWU19ERVRSSVRVU19DT0xMRUNUJyk7XG4gICAgfVxuICAgIHRoaXMudHJhY2VyKCdvblJlYWR5VG9HQycsIGlzSW50ZXJuYWwsIHApXG4gIH1cblxuICBvcGVuU3BpZ290KGFjdGlvbiwgb2JqID0ge30pIHtcbiAgICBpZiAodGhpcy5wcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnByb3BzLmFjdGlvbiA9IGFjdGlvblxuICAgICAgY29uc3QgZGF0YSA9IG1lcmdlUmlnaHQodGhpcy5wcm9wcywgb2JqKVxuICAgICAgLy8gbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb3BzLCBvYmopO1xuXG4gICAgICB0aGlzLnNpbmskLm5leHQoT2JqZWN0LmZyZWV6ZShkYXRhKSlcbiAgICB9XG4gIH1cblxuICBzZXRBdHRhY2hEYXRhKGF0dGFjaFR5cGUsIHF1ZXJ5KSB7XG4gICAgY29uc3QgY2hlY2tRdWVyeSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHEgPSB0aGlzLnByb3BzLmVsLnF1ZXJ5U2VsZWN0b3IocXVlcnkpXG4gICAgICBjb25zdCBpc0Rldk1vZGUgPSBWaWV3U3RyZWFtLmlzRGV2TW9kZSgpXG4gICAgICBpZiAoaXNEZXZNb2RlID09PSB0cnVlICYmIGlzKFN0cmluZywgcXVlcnkpICYmIGlzTmlsKHEpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGFwcGVuZFZpZXcgcXVlcnkgaW4gJHt0aGlzLnByb3BzLm5hbWV9LCAnJHtxdWVyeX0nLCBhcHBlYXJzIHRvIG5vdCBleGlzdCFgKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHFcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbm9kZTogdGhpcy5wcm9wcy5lbCxcbiAgICAgIHR5cGU6ICdWaWV3U3RyZWFtT2JzZXJ2YWJsZScsXG4gICAgICBhdHRhY2hUeXBlLFxuICAgICAgcXVlcnk6IGNoZWNrUXVlcnkocXVlcnkpXG4gICAgfVxuICB9XG5cbiAgZ2V0UGFyZW50RWxzKGVsLCBudW0pIHtcbiAgICBjb25zdCBnZXRFbGVtID0gZWwgPT4gZWwucGFyZW50RWxlbWVudFxuICAgIGxldCBpdGVyID0gMFxuICAgIGxldCBwYXJlbnRFbCA9IGVsXG4gICAgd2hpbGUgKGl0ZXIgPCBudW0pIHtcbiAgICAgIHBhcmVudEVsID0gZ2V0RWxlbShwYXJlbnRFbClcbiAgICAgIGl0ZXIrK1xuICAgIH1cbiAgICByZXR1cm4gcGFyZW50RWxcbiAgfVxuXG4gIHNldEF0dGFjaFBhcmVudERhdGEoYXR0YWNoVHlwZSwgcXVlcnksIGxldmVsKSB7XG4gICAgcXVlcnkgPSBxdWVyeSAhPT0gJycgPyBxdWVyeSA6IHVuZGVmaW5lZFxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldFBhcmVudEVscyh0aGlzLnByb3BzLmVsLCBsZXZlbClcbiAgICByZXR1cm4ge1xuICAgICAgbm9kZSxcbiAgICAgIHR5cGU6ICdWaWV3U3RyZWFtT2JzZXJ2YWJsZScsXG4gICAgICBhdHRhY2hUeXBlLFxuICAgICAgcXVlcnk6IG5vZGUucXVlcnlTZWxlY3RvcihxdWVyeSlcbiAgICB9XG4gIH1cblxuICBvbk1hcFZpZXdTb3VyY2UocGF5bG9hZCA9IHt9KSB7XG4gICAgdGhpcy5wcm9wcyA9IG1lcmdlUmlnaHQodGhpcy5wcm9wcywgcGF5bG9hZClcbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBBVFRBQ0ggU1RSRUFNIEFORCBET00gREFUQSBBR0dSRUdBVE9SUz09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQoY2hpbGRWaWV3LCBhdHRhY2hEYXRhKSB7XG4gICAgdGhpcy5hZGRDaGlsZFN0cmVhbShjaGlsZFZpZXcuc291cmNlU3RyZWFtcy50b1BhcmVudCQpXG4gICAgY2hpbGRWaWV3LmFkZFBhcmVudFN0cmVhbSh0aGlzLnNvdXJjZVN0cmVhbXMudG9DaGlsZCQsIGF0dGFjaERhdGEpXG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBhIFZpZXdTdHJlYW0gb2JqZWN0IHRvIGFuIGV4aXN0aW5nIGRvbSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIHRoZSBWaWV3U3RyZWFtIGNoaWxkIHRoYXQgaXMgdG8gYmUgYXR0YWNoZWQuXG4gICAqIEBleGFtcGxlXG4gICAqIC8vICByZXR1cm5zXG4gICAqIDxib2R5PlxuICAgKiAgICA8aDI+SGVsbG8gV29ybGQ8L2gyPlxuICAgKiA8L2JvZHk+XG4gICAqXG4gICAqIGxldCB2aWV3U3RyZWFtID0gbmV3IFZpZXdTdHJlYW0oJ2gyJywgJ0hlbGxvIFdvcmxkJyk7XG4gICAqIHZpZXdTdHJlYW0uYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqL1xuICBhcHBlbmRUb0RvbShub2RlKSB7XG4gICAgLy8gY29uc29sZS5sb2coXCJhcHBlbmQgdG8gZG9tIFwiLHRoaXMucHJvcHMudnNpZCwgdGhpcy5wcm9wcy5lbCk7XG4gICAgaWYgKHRoaXMucHJvcHMuZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc29sZS53YXJuKGBTcHluZSBXYXJuaW5nOiBUaGUgVmlld1N0cmVhbSwgJHt0aGlzLnByb3BzLm5hbWV9LCBoYXMgYW4gZWxlbWVudCwgJHt0aGlzLnByb3BzLmVsfSwgdGhhdCBpcyBhbHJlYWR5IHJlbmRlcmVkIGFuZCBkb2VzIG5vdCBuZWVkIHRvIGJlIGFwcGVuZGVkVG9Eb20uIFRoaXMgbWF5IGNyZWF0ZSB1bnN1c3VhbCBzaWRlIGVmZmVjdHMhYClcbiAgICB9XG4gICAgdGhpcy5yZW5kZXJWaWV3QW5kQXR0YWNoVG9Eb20obm9kZSwgJ2RvbScsICdhcHBlbmRDaGlsZCcpXG4gIH1cblxuICBhcHBlbmRUb0RvbUFmdGVyKG5vZGUpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBWaWV3U3RyZWFtLCAke3RoaXMucHJvcHMubmFtZX0sIGhhcyBhbiBlbGVtZW50LCAke3RoaXMucHJvcHMuZWx9LCB0aGF0IGlzIGFscmVhZHkgcmVuZGVyZWQgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgYXBwZW5kZWRUb0RvbUFmdGVyLiBUaGlzIG1heSBjcmVhdGUgdW5zdXN1YWwgc2lkZSBlZmZlY3RzIWApXG4gICAgfVxuICAgIHRoaXMucmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsICdkb20nLCAnYWZ0ZXInKVxuICB9XG5cbiAgLyoqXG4gICAqIFByZXBlbmRzIHRoZSBjdXJyZW50IFZpZXdTdHJlYW0gb2JqZWN0IHRvIGFuIGV4aXN0aW5nIGRvbSBlbGVtZW50LlxuICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIHRoZSBWaWV3U3RyZWFtIGNoaWxkIHRoYXQgaXMgdG8gYmUgYXR0YWNoZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHRoaXMucHJlcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKi9cblxuICBwcmVwZW5kVG9Eb20obm9kZSkge1xuICAgIGlmICh0aGlzLnByb3BzLmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIFZpZXdTdHJlYW0sICR7dGhpcy5wcm9wcy5uYW1lfSwgaGFzIGFuIGVsZW1lbnQsICR7dGhpcy5wcm9wcy5lbH0sIHRoYXQgaXMgYWxyZWFkeSByZW5kZXJlZCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBwcmVwZW5kZWRUb0RvbS4gVGhpcyBtYXkgY3JlYXRlIHVuc3VzdWFsIHNpZGUgZWZmZWN0cyFgKVxuICAgIH1cbiAgICB0aGlzLnJlbmRlclZpZXdBbmRBdHRhY2hUb0RvbShub2RlLCAnZG9tJywgJ3ByZXBlbmRDaGlsZCcpXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYXBwZW5kcyBhIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0LiA8YnI+QWZ0ZXIgdGhlIGF0dGFjaG1lbnQsIHJ4anMgb2JzZXJ2YWJsZXMgYXJlIGV4Y2hhbmdlZCBiZXR3ZWVuIHRoZSBwYXJlbnQgYW5kIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0cy48YnI+PGJyPlxuICAgKiBAcGFyYW0ge1ZpZXdTdHJlYW19IHYgdGhlIFZpZXdTdHJlYW0gY2hpbGQgdGhhdCBpcyB0byBiZSBhdHRhY2hlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5IGEgcXVlcnlTZWxlY3RvciB3aXRoaW4gdGhpcyBWaWV3U3RyZWFtLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyAgcmV0dXJuc1xuICAgKiA8Ym9keT5cbiAgICogICAgPG1haW4+XG4gICAqICAgICAgICA8aDI+SGVsbG8gV29ybGQ8L2gyPlxuICAgKiAgICA8L21haW4+XG4gICAqIDwvYm9keT5cbiAgICpcbiAgICpcbiAgICogbGV0IHBhcmVudFZpZXcgPSBuZXcgVmlld1N0cmVhbSgnbWFpbicpO1xuICAgKiBwYXJlbnRWaWV3LmFwcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKiBsZXQgY2hpbGRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oe3RhZ05hbWU6J2gyJywgZGF0YTonSGVsbG8gV29ybGQnfTtcbiAgICogcGFyZW50Vmlldy5hcHBlbmRWaWV3KGNoaWxkVmlldylcbiAgICpcbiAgICogKi9cbiAgYXBwZW5kVmlldyh2LCBxdWVyeSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LCB0aGlzLnNldEF0dGFjaERhdGEoJ2FwcGVuZENoaWxkJywgcXVlcnkpKVxuICB9XG5cbiAgYXBwZW5kVmlld0FmdGVyKHYsIHF1ZXJ5KSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsIHRoaXMuc2V0QXR0YWNoRGF0YSgnYWZ0ZXInLCBxdWVyeSkpXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYXBwZW5kcyBhIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0IHRvIGEgcGFyZW50IFZpZXdTdHJlYW0gb2JqZWN0LlxuICAgKiBAcGFyYW0ge1ZpZXdTdHJlYW19IHYgdGhlIFZpZXdTdHJlYW0gcGFyZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgYSBxdWVyeVNlbGVjdG9yIHdpdGhpbiB0aGlzIFZpZXdTdHJlYW0uXG4gICAqIEBwYXJhbSB7bGV2ZWx9IHRoaXMgcGFyYW1ldGVycyBjYW4gYXR0YWNoIHRoZSB2aWV3U3RyZWFtJ3MgZG9tIGVsZW1lbnQgdXAgdGhlIGRvbSB0cmVlIHdoaWxlIHN0aWxsIG1haW50YWluaW5nIHRoZSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwIG9mIHRoZSBWaWV3U3RyZWFtIG9iamVjdHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vICByZXR1cm5zXG4gICAqIDxib2R5PlxuICAgKiAgICA8bWFpbj5cbiAgICogICAgICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqICAgIDwvbWFpbj5cbiAgICogPC9ib2R5PlxuICAgKlxuICAgKlxuICAgKiBsZXQgcGFyZW50VmlldyA9IG5ldyBWaWV3U3RyZWFtKCdtYWluJyk7XG4gICAqIHBhcmVudFZpZXcuYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBjaGlsZFZpZXcuYXBwZW5kVG9QYXJlbnQocGFyZW50VmlldylcbiAgICpcbiAgICogKi9cblxuICBhcHBlbmRWaWV3VG9QYXJlbnRFbCh2LCBxdWVyeSwgbGV2ZWwgPSAxKSB7XG4gICAgdGhpcy5leGNoYW5nZVZpZXdzV2l0aENoaWxkKHYsXG4gICAgICB0aGlzLnNldEF0dGFjaFBhcmVudERhdGEoJ2FwcGVuZENoaWxkJywgcXVlcnksIGxldmVsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBwcmVwZW5kcyBhIGNoaWxkIFZpZXdTdHJlYW0gb2JqZWN0IHRvIGEgcGFyZW50IFZpZXdTdHJlYW0gb2JqZWN0LlxuICAgKiBAcGFyYW0ge1ZpZXdTdHJlYW19IHZcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1ZXJ5XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBsZXZlbFxuICAgKlxuICAgKiBAcHJvcGVydHkge1ZpZXdTdHJlYW19IHYgLSA9IHVuZGVmaW5lZDsgdGhlIFZpZXdTdHJlYW0gcGFyZW50LlxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gcXVlcnkgLSA9IHVuZGVmaW5lZDsgYSBxdWVyeVNlbGVjdG9yIHdpdGhpbiB0aGlzIFZpZXdTdHJlYW0uXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZXZlbCAtID0gMTsgdGhpcyBwYXJhbWV0ZXIgY2FuIGF0dGFjaCB0aGUgdmlld1N0cmVhbSdzIGRvbSBlbGVtZW50IHVwIHRoZSBkb20gdHJlZSB3aGlsZSBzdGlsbCBtYWludGFpbmluZyB0aGUgcGFyZW50LWNoaWxkIHJlbGF0aW9uc2hpcCBvZiB0aGUgVmlld1N0cmVhbSBvYmplY3RzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBsZXQgcGFyZW50VmlldyA9IG5ldyBWaWV3U3RyZWFtKCdtYWluJyk7XG4gICAqIHBhcmVudFZpZXcucHJlcGVuZFRvRG9tKGRvY3VtZW50LmJvZHkpO1xuICAgKlxuICAgKiBsZXQgY2hpbGRWaWV3ID0gbmV3IFZpZXdTdHJlYW0oe3RhZ05hbWU6J2gyJywgZGF0YTonSGVsbG8gV29ybGQnfTtcbiAgICogY2hpbGRWaWV3LnByZXBlbmRWaWV3VG9QYXJlbnRFbChwYXJlbnRWaWV3KVxuICAgKlxuICAgKiAqL1xuICBwcmVwZW5kVmlld1RvUGFyZW50RWwodiwgcXVlcnksIGxldmVsID0gMSkge1xuICAgIHRoaXMuZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCh2LFxuICAgICAgdGhpcy5zZXRBdHRhY2hQYXJlbnREYXRhKCdwcmVwZW5kQ2hpbGQnLCBxdWVyeSwgbGV2ZWwpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHByZXBlbmRzIGEgY2hpbGQgVmlld1N0cmVhbSBvYmplY3QgdG8gdGhlIGN1cnJlbnQgVmlld1N0cmVhbSBvYmplY3QuIDxicj5BZnRlciB0aGUgYXR0YWNobWVudCwgcnhqcyBvYnNlcnZhYmxlcyBhcmUgZXhjaGFuZ2VkIGJldHdlZW4gdGhlIHBhcmVudCBhbmQgY2hpbGQgVmlld1N0cmVhbSBvYmplY3RzLjxicj48YnI+XG4gICAqIEBwYXJhbSB7Vmlld1N0cmVhbX0gdiB0aGUgVmlld1N0cmVhbSBjaGlsZCB0aGF0IGlzIHRvIGJlIGF0dGFjaGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVlcnkgYSBxdWVyeVNlbGVjdG9yIHdpdGhpbiB0aGlzIFZpZXdTdHJlYW0uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vICByZXR1cm5zXG4gICAqIDxib2R5PlxuICAgKiAgICA8bWFpbj5cbiAgICogICAgICAgIDxoMj5IZWxsbyBXb3JsZDwvaDI+XG4gICAqICAgIDwvbWFpbj5cbiAgICogPC9ib2R5PlxuICAgKlxuICAgKiBsZXQgcGFyZW50VmlldyA9IG5ldyBWaWV3U3RyZWFtKCdtYWluJyk7XG4gICAqIHBhcmVudFZpZXcuYXBwZW5kVG9Eb20oZG9jdW1lbnQuYm9keSk7XG4gICAqXG4gICAqIGxldCBjaGlsZFZpZXcgPSBuZXcgVmlld1N0cmVhbSh7dGFnTmFtZTonaDInLCBkYXRhOidIZWxsbyBXb3JsZCd9O1xuICAgKiBwYXJlbnRWaWV3LnByZXBlbmRWaWV3KGNoaWxkVmlldyk7XG4gICAqXG4gICAqICovXG5cbiAgcHJlcGVuZFZpZXcodiwgcXVlcnkpIHtcbiAgICB0aGlzLmV4Y2hhbmdlVmlld3NXaXRoQ2hpbGQodiwgdGhpcy5zZXRBdHRhY2hEYXRhKCdwcmVwZW5kQ2hpbGQnLCBxdWVyeSkpXG4gIH1cblxuICAvKipcbiAgICogIEFwcGVuZHMgYSBWaWV3U3RyZWFtIG9iamVjdCB0aGF0IGFyZSBub3QgcmVuZGVyZWQgdG8gdGhlICNzcHluZS1udWxsLXZpZXdzIGRpdi5cbiAgICovXG4gIGFwcGVuZFRvTnVsbCgpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NweW5lLW51bGwtdmlld3MnKVxuICAgIHRoaXMucmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tKG5vZGUsICdkb20nLCAnYXBwZW5kQ2hpbGQnKVxuICB9XG5cbiAgb25WU1JlbmRlcmVkKHBheWxvYWQpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnVlNfU1BBV046ICcsIHRoaXMucHJvcHMubmFtZSwgcGF5bG9hZCk7XG4gICAgaWYgKHBheWxvYWQuZnJvbSQgPT09ICdpbnRlcm5hbCcpIHtcbiAgICAgIC8vIHRoaXMucHJvcHNbJ2VsJ10gPSBwYXlsb2FkLmVsLmVsO1xuXG4gICAgICB0aGlzLnBvc3RSZW5kZXIoKVxuICAgICAgLy8gdGhpcy5icm9hZGNhc3RlciA9IG5ldyBTcHluZS5WaWV3U3RyZWFtQnJvYWRjYXN0ZXIodGhpcy5wcm9wcywgdGhpcy5icm9hZGNhc3RFdmVudHMpO1xuICAgIH1cbiAgfVxuXG4gIHBvc3RSZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMuX3Bvc3RSZW5kZXJlZENhbGxlZCA9PT0gdHJ1ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5iZWZvcmVBZnRlclJlbmRlcigpXG4gICAgdGhpcy5hZnRlclJlbmRlcigpXG5cbiAgICB0aGlzLm9uUmVuZGVyZWQoKVxuICAgIGNvbnN0IHN0YXJ0QW5pbUZyYW1lQWZ0ZXJSZW5kZXJlZCA9ICgpID0+IHRoaXMub25BbmltRnJhbWVBZnRlclJlbmRlcmVkKClcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc3RhcnRBbmltRnJhbWVBZnRlclJlbmRlcmVkKVxuXG4gICAgaWYgKHRoaXMuaXNEZXZNb2RlID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBldmVudHNBcnIgPSB0aGlzLmJyb2FkY2FzdEV2ZW50cygpXG4gICAgICBjb25zdCBpc1ZhbGlkQXJyID0gVmlld1N0cmVhbS5pc1ZhbGlkTmVzdGVkQXJyKGV2ZW50c0FycilcbiAgICAgIGlmIChpc1ZhbGlkQXJyID09PSBmYWxzZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFNweW5lIFdhcm5pbmc6IFRoZSBhcnJheSByZXR1cm5lZCBmcm9tIGJyb2FkY2FzdEV2ZW50cyBpbiAke3RoaXMucHJvcHMubmFtZX0sICcke0pTT04uc3RyaW5naWZ5KGV2ZW50c0Fycil9JywgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHByb3Blcmx5IGZvcm1hdHRlZCFgKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmluaXRpYWxpemVDaGFubmVscygpXG4gICAgdGhpcy52aWV3c1N0cmVhbUJyb2FkY2FzdGVyID0gbmV3IFZpZXdTdHJlYW1Ccm9hZGNhc3Rlcih0aGlzLnByb3BzLCB0aGlzLmJyb2FkY2FzdEV2ZW50cy5iaW5kKHRoaXMpKVxuICAgIHRoaXMuYWZ0ZXJCcm9hZGNhc3RFdmVudHMoKVxuXG4gICAgdGhpcy5fcG9zdFJlbmRlcmVkQ2FsbGVkID0gdHJ1ZVxuICB9XG5cbiAgYWRkVHJhaXRzKHRyYWl0cykge1xuICAgIGlmICh0cmFpdHMuY29uc3RydWN0b3IubmFtZSAhPT0gJ0FycmF5Jykge1xuICAgICAgdHJhaXRzID0gW3RyYWl0c11cbiAgICB9XG4gICAgY29uc3QgYWRkVHJhaXQgPSAoVHJhaXRDbGFzcykgPT4ge1xuICAgICAgbmV3IFRyYWl0Q2xhc3ModGhpcylcbiAgICB9XG5cbiAgICB0cmFpdHMuZm9yRWFjaChhZGRUcmFpdClcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBNRVRIT0RTIFRPIEJFIEVYVEVOREVEID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGFmdGVyQnJvYWRjYXN0RXZlbnRzKCkge1xuICAgIGlmICh0aGlzLmlzRGV2TW9kZSA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgcHVsbEFjdGlvbnNGcm9tTGlzdCA9IChhcnIpID0+IGFyclswXVxuICAgICAgY29uc3QgbmVzdGVkQWN0aW9uc0FyciA9IHRoaXMuYWRkQWN0aW9uTGlzdGVuZXJzKClcblxuICAgICAgY29uc3QgYWN0aW9uc0FyciA9IG5lc3RlZEFjdGlvbnNBcnIubWFwKHB1bGxBY3Rpb25zRnJvbUxpc3QpXG5cbiAgICAgIGNvbnN0IGlzVmFsaWRBcnIgPSBWaWV3U3RyZWFtLmlzVmFsaWROZXN0ZWRBcnIobmVzdGVkQWN0aW9uc0FycilcblxuICAgICAgaWYgKGlzVmFsaWRBcnIgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIGFycmF5IHJldHVybmVkIGZyb20gYWRkQWN0aW9uc0xpc3RlbmVycyBpbiAke3RoaXMucHJvcHMubmFtZX0sICcke0pTT04uc3RyaW5naWZ5KG5lc3RlZEFjdGlvbnNBcnIpfScsIGRvZXMgbm90IGFwcGVhciB0byBiZSBwcm9wZXJseSBmb3JtYXR0ZWQhYClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGNoZWNrRm9yRXhpc3RpbmdNZXRob2QgPSAoYXJyKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWV0aG9kID0gZGVmYXVsdFRvKCcnLCBhcnJbMV0pXG4gICAgICAgICAgY29uc3QgaXNNZXRob2QgPSBpcyhGdW5jdGlvbiwgdGhpc1ttZXRob2RdKVxuICAgICAgICAgIGlmIChpc01ldGhvZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgU3B5bmUgV2FybmluZzogVGhlIG1ldGhvZCBpbiBhZGRBY3Rpb25MaXN0ZW5lcnMgbmVzdGVkIEFycmF5LCAnJHtKU09OLnN0cmluZ2lmeShhcnIpfScsIGluICR7dGhpcy5wcm9wcy5uYW1lfSwgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IWApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbXBvc2UoZm9yRWFjaChjaGVja0ZvckV4aXN0aW5nTWV0aG9kKSwgZGVmYXVsdFRvKFtdKSkobmVzdGVkQWN0aW9uc0FycilcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVsYXlGb3JQcm94eUNoYW5uZWxSZXNldHMgPSAoKSA9PiB7XG4gICAgICAgIGlmIChwYXRoKFsncHJvcHMnLCAnYWRkZWRDaGFubmVscyddLCB0aGlzKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgVmlld1N0cmVhbS5jaGVja0lmQWN0aW9uc0FyZVJlZ2lzdGVyZWQuYmluZCh0aGlzKSh0aGlzLnByb3BzLmFkZGVkQ2hhbm5lbHMsIGFjdGlvbnNBcnIpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0VGltZW91dChkZWxheUZvclByb3h5Q2hhbm5lbFJlc2V0cywgNTAwKVxuICAgIH1cbiAgfVxuXG4gIHNldERhdGFWU0lEKCkge1xuICAgIHRoaXMucHJvcHMuZWwuZGF0YXNldC52c2lkID0gdGhpcy5wcm9wcy52c2lkLy8gU3RyaW5nKHRoaXMucHJvcHMudnNpZCkucmVwbGFjZSgvXih2c2lkLSkoLiopJC8sICckMicpO1xuICB9XG5cbiAgYmVmb3JlQWZ0ZXJSZW5kZXIoKSB7XG4gICAgLyogICAgbGV0IGRtMiA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0ciA9ICcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERvbUl0ZW1TZWxlY3RvcnMoZWwsIHN0cik7XG4gICAgICAgICAgfTtcbiAgICAgICAgfTsgKi9cblxuICAgIC8vIHRoaXMucHJvcHMuZWwkID0gZG0yKHRoaXMucHJvcHMuZWwpO1xuICAgIHRoaXMuc2V0RGF0YVZTSUQoKVxuICAgIHRoaXMucHJvcHMuZWwkID0gVmlld1N0cmVhbVNlbGVjdG9yKHRoaXMucHJvcHMuZWwpXG4gICAgLy8gY29uc29sZS5sb2coJ0VMIElTICcsIHRoaXMucHJvcHMuZWwkLmVsQXJyKTtcbiAgICAvLyB3aW5kb3cudGhlRWwkID0gdGhpcy5wcm9wcy5lbCQ7XG4gIH1cblxuICAvLyBUSElTIElTIEFOIEVWRU5UIEhPTERFUiBNRVRIT0QgQkVDQVVTRSBTRU5ESU5HIERPV05TVFJFQU0gUkVRVUlSRSBUSEUgUEFSRU5UIFRPIEhBVkUgQSBNRVRIT0RcbiAgZG93blN0cmVhbSgpIHtcblxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbmRlcmVkLlxuICAgKlxuICAgKi9cblxuICBvblJlbmRlcmVkKCkge1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byBhZGQgYW5pbWF0aW9uIGNsYXNzZXMgdG8gYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIHJlbmRlcmluZy5cbiAgICpcbiAgICovXG5cbiAgb25BbmltRnJhbWVBZnRlclJlbmRlcmVkKCkge1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIChEZXByZWNhdGVkLiBVc2Ugb25SZW5kZXJlZCkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhcyBzb29uIGFzIHRoZSBlbGVtZW50IGhhcyBiZWVuIHJlbmRlcmVkLlxuICAgKlxuICAgKi9cblxuICBhZnRlclJlbmRlcigpIHtcbiAgfVxuXG4gIGJyb2FkY2FzdEV2ZW50cygpIHtcbiAgICAvLyBBREQgQlVUVE9OIEVWRU5UUyBBUyBORVNURUQgQVJSQVlTXG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQXV0b21hdGljYWxseSBjb25uZWN0IHRvIGFuIGluc3RhbmNlIG9mIHJlZ2lzdGVyZWQgY2hhbm5lbHMsIHN1Y2ggYXMgJ0RPTScsICdVSScsIGFuZCAnUk9VVEUnIGNoYW5uZWxzLlxuICAgKlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBsZXQgdWlDaGFubmVsID0gdGhpcy5nZXRDaGFubmVsKCdVSScpO1xuICAgKlxuICAgKiB1aUNoYW5uZWxcbiAgICogICAgLmZpbHRlcigocCkgPT4gcC5kYXRhLmlkPT09JyNteS1idXR0b24nKVxuICAgKiAgICAuc3Vic2NyaWJlKChwKSA9PiBjb25zb2xlLmxvZygnbXkgYnV0dG9uIHdhcyBjbGlja2VkICcsIHApKTtcbiAgICpcbiAgICogKi9cblxuICBnZXRDaGFubmVsKGNoYW5uZWwpIHtcbiAgICBjb25zdCBpc1ZhbGlkQ2hhbm5lbCA9IGMgPT4gcmVnaXN0ZXJlZFN0cmVhbU5hbWVzKCkuaW5jbHVkZXMoYylcbiAgICBjb25zdCBlcnJvciA9IGMgPT4gY29uc29sZS53YXJuKFxuICAgICAgICBgY2hhbm5lbCBuYW1lICR7Y30gaXMgbm90IHdpdGhpbiAke3JlZ2lzdGVyZWRTdHJlYW1OYW1lc31gKVxuICAgIGNvbnN0IHN0YXJ0U3Vic2NyaWJlID0gKGMpID0+IHtcbiAgICAgIGNvbnN0IG9icyQgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXAuZ2V0U3RyZWFtKGMpLm9ic2VydmVyXG5cbiAgICAgIHJldHVybiBvYnMkLnBpcGUodGFrZVdoaWxlKHAgPT4gdGhpcy5kZWxldGVkICE9PSB0cnVlKSlcbiAgICB9Ly8gZ2V0R2xvYmFsUGFyYW0oJ3N0cmVhbXNDb250cm9sbGVyJykuZ2V0U3RyZWFtKGMpLm9ic2VydmVyO1xuXG4gICAgY29uc3QgZm4gPSBpZkVsc2UoaXNWYWxpZENoYW5uZWwsIHN0YXJ0U3Vic2NyaWJlLCBlcnJvcilcblxuICAgIHJldHVybiBmbihjaGFubmVsKVxuICB9XG5cbiAgLyoqXG4gICAqIENIRUNLUyBUTyBTRUUgSUYgQ0hBTk5FTFMgSEFWRSBCRUVOIEFEREVEIFRPIHByb3BzLmNoYW5uZWxzIG9iamVjdDtcbiAgICovXG4gIGluaXRpYWxpemVDaGFubmVscygpIHtcbiAgICBjb25zdCBhZGRDaGFubmVsID0gKGNoYW5uZWwpID0+IHtcbiAgICAgIGNvbnN0IFtjaGFubmVsTmFtZSwgc2tpcEZpcnN0ID0gZmFsc2VdID0gQXJyYXkuaXNBcnJheShjaGFubmVsKSA/IGNoYW5uZWwgOiBbY2hhbm5lbF1cbiAgICAgIHRoaXM/LmFkZENoYW5uZWwoY2hhbm5lbE5hbWUsIHNraXBGaXJzdClcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcz8ucHJvcHM/LmNoYW5uZWxzKSkge1xuICAgICAgdGhpcz8ucHJvcHM/LmNoYW5uZWxzPy5mb3JFYWNoKGFkZENoYW5uZWwpXG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXM/LnByb3BzPy5jaGFubmVsKSkge1xuICAgICAgY29uc29sZS53YXJuKCdwcm9wcy5jaGFubmVsIGlzIG5vdCBhIFZpZXdTdHJlYW0gcHJvcGVydHkuIERvIHlvdSBtZWFuIHByb3BzLmNoYW5uZWxzPycpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIFByZWZlcnJlZCBtZXRob2QgdG8gY29ubmVjdCB0byBpbnN0YW5jZXMgb2YgcmVnaXN0ZXJlZCBjaGFubmVscywgc3VjaCBhcyAnRE9NJywgJ1VJJywgYW5kICdST1VURScgY2hhbm5lbHMuXG4gICAqXG4gICAqIEFkZCBDaGFubmVsIHdpbGwgYXV0b21hdGljYWxseSB1bnN1YnNjcmliZSB0byB0aGUgY2hhbm5lbCwgd2hlcmVhcyB0aGUgZ2V0Q2hhbm5lbCBtZXRob2QgcmVxdWlyZXMgdGhlIGRldmVsb3BlciB0byBtYW51YWxseSB1bnN1YnNjcmliZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgbmFtZSBvZiB0aGUgcmVnaXN0ZXJlZCBDaGFubmVsIHRoYXQgd2FzIGFkZGVkIHRvIHRoZSBDaGFubmVscyBDb250cm9sbGVyLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJvb2wgZmFsc2UsIGFkZCB0cnVlIGlmIHRoZSBWaWV3IHNob3VsZCB3YWl0IGZvciB0aGlzIGNoYW5uZWwgdG8gdW5zdWJzY3JpYmUgYmVmb3JlIHJlbW92aW5nIGl0c2VsZi5cbiAgICogQHBhcmFtIHtzZW5kRG93blN0cmVhbX0gYm9vbCBUaGUgZGlyZWN0aW9uIHdoZXJlIHRoZSBzdHJlYW0gaXMgYWxsb3dlZCB0byB0cmF2ZWwuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGxldCByb3V0ZUNoYW5uZWwgPSB0aGlzLmFkZENoYW5uZWwoJ1JPVVRFJyk7XG4gICAqXG4gICAqICAgICAgYWRkQWN0aW9uTGlzdGVuZXJzKCkge1xuICAgKiAgICAgICAgICAgcmV0dXJuIFtcbiAgICogICAgICAgICAgICAgWydDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCcsICdvbk1hcFJvdXRlRXZlbnQnXVxuICAgKiAgICAgICAgICAgXVxuICAgKiAgICAgICB9XG4gICAqXG4gICAqICAgICAgIG9uTWFwUm91dGVFdmVudChwKSB7XG4gICAqICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGUgcm91dGUgdmFsdWUgaXMgJywgcCk7XG4gICAqICAgICAgIH1cbiAgICpcbiAgICpcbiAgICogKi9cblxuICBhZGRDaGFubmVsKGNoYW5uZWxOYW1lLCBza2lwRmlyc3QgPSBmYWxzZSwgc2VuZERvd25TdHJlYW0gPSBmYWxzZSwgYm9vbCA9IGZhbHNlKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uQXJyID0gc2VuZERvd25TdHJlYW0gPT09IHRydWUgPyB0aGlzLiRkaXJzLkNJIDogdGhpcy4kZGlycy5JXG4gICAgY29uc3QgbWFwRGlyZWN0aW9uID0gcCA9PiB7XG4gICAgICAvLyBldCBwMiA9IGRlZmF1bHRUbyh7fSwgY2xvbmUocCkpO1xuICAgICAgY29uc3QgcGwgPSBwLy8gfHwge307XG4gICAgICBwbC4kZGlyID0gZGlyZWN0aW9uQXJyXG4gICAgICByZXR1cm4gcGxcbiAgICAgIC8vIHJldHVybiBkZWVwTWVyZ2UoZGlyT2JqLCBwMik7XG4gICAgICAvLyBPYmplY3QuYXNzaWduKHskZGlyOiBkaXJlY3Rpb25BcnJ9LCBjbG9uZShwKSlcbiAgICB9XG4gICAgaWYgKHRoaXM/LnByb3BzPy5hZGRlZENoYW5uZWxzPy5pbmNsdWRlcyhjaGFubmVsTmFtZSkgPT09IHRydWUpIHtcbiAgICAgIC8vIENIRUNLUyBJRiBDSEFOTkVMIEhBUyBBTFJFQURZIEJFRU4gQURERURcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBpc0xvY2FsRXZlbnRDaGVjayA9IHBhdGgoWydzcmNFbGVtZW50JywgJ2lzTG9jYWxFdmVudCddKVxuICAgIGNvbnN0IGNpZENoZWNrID0gcGF0aChbJ3NyY0VsZW1lbnQnLCAndnNpZCddKVxuICAgIGNvbnN0IGNpZE1hdGNoZXMgPSBwID0+IHtcbiAgICAgIGNvbnN0IHZzaWQgPSBjaWRDaGVjayhwKVxuICAgICAgY29uc3QgaXNMb2NhbEV2ZW50ID0gaXNMb2NhbEV2ZW50Q2hlY2socClcbiAgICAgIGNvbnN0IGZpbHRlckV2ZW50ID0gaXNMb2NhbEV2ZW50ICE9PSB0cnVlIHx8IHZzaWQgPT09IHRoaXMucHJvcHMudnNpZFxuICAgICAgLy8gY29uc29sZS5sb2coXCJjaGVja3MgXCIsdnNpZCx0aGlzLnByb3BzLnZzaWQsIGlzTG9jYWxFdmVudCxmaWx0ZXJFdmVudCk7XG4gICAgICByZXR1cm4gZmlsdGVyRXZlbnRcbiAgICB9XG5cbiAgICBjb25zdCBwaXBlQXJyID0gW21hcChtYXBEaXJlY3Rpb24pLCBmaWx0ZXIoY2lkTWF0Y2hlcyldXG4gICAgaWYgKHNraXBGaXJzdCA9PT0gdHJ1ZSkge1xuICAgICAgcGlwZUFyci51bnNoaWZ0KHNraXAoMSkpXG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbCQgPSB0aGlzLmdldENoYW5uZWwoY2hhbm5lbE5hbWUpLnBpcGUoLi4ucGlwZUFycilcbiAgICB0aGlzLnVwZGF0ZVNvdXJjZVN1YnNjcmlwdGlvbihjaGFubmVsJCwgZmFsc2UpXG4gICAgdGhpcy5wcm9wcy5hZGRlZENoYW5uZWxzLnB1c2goY2hhbm5lbE5hbWUpXG4gIH1cblxuICBjaGVja0lmQ2hhbm5lbEV4aXN0cyhjaGFubmVsTmFtZSkge1xuICAgIGNvbnN0IGNoYW5uZWxFeGlzdHMgPSBTcHluZUFwcFByb3BlcnRpZXMuY2hhbm5lbHNNYXAudGVzdFN0cmVhbShjaGFubmVsTmFtZSlcbiAgICBpZiAoY2hhbm5lbEV4aXN0cyAhPT0gdHJ1ZSkge1xuICAgICAgY29uc29sZS53YXJuKGBTUFlORSBXQVJOSU5HOiBUaGUgQ2hhbm5lbFBheWxvYWQgZnJvbSAke3RoaXMucHJvcHMubmFtZX0sIGhhcyBiZWVuIHNlbnQgdG8gYSBjaGFubmVsLCAke2NoYW5uZWxOYW1lfSwgdGhhdCBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZCFgKVxuICAgIH1cbiAgICByZXR1cm4gY2hhbm5lbEV4aXN0c1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjaGFubmVsTmFtZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWN0aW9uXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjaGFubmVsTmFtZSAtID0gdW5kZWZpbmVkOyBUaGUgbmFtZSBvZiB0aGUgcmVnaXN0ZXJlZCBDaGFubmVsLlxuICAgKiBAcHJvcGVydHkge29iamVjdH0gcGF5bG9hZCAtID0ge307IFRoZSBtYWluIGRhdGEgdG8gc2VuZCB0byB0aGUgY2hhbm5lbC5cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGFjdGlvbiAtID0gXCJWSUVXU1RSRUFNX0VWRU5UXCI7IFRoZSBhY3Rpb24gc2VudCB0byB0aGUgY2hhbm5lbC5cbiAgICogQGRlc2NcbiAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIHZlcnNhdGlsZSBhbmQgY29uc2lzdGVudCBtZXRob2QgdG8gY29tbXVuaWNhdGUgd2l0aCBhbGwgY2hhbm5lbHMuXG4gICAqXG4gICAqXG4gICAqL1xuXG4gIHNlbmRJbmZvVG9DaGFubmVsKGNoYW5uZWxOYW1lLCBwbCA9IHt9LCBhY3Rpb24pIHtcbiAgICBjb25zdCBwYXlsb2FkID0gcGxcblxuICAgIGNvbnN0IGRlZmF1bHRUb0FjdGlvbiA9IGRlZmF1bHRUbygnVklFV1NUUkVBTV9FVkVOVCcpXG4gICAgY29uc3QgY2hhbm5lbERlZmF1bHRBY3Rpb25IYXNoID0ge1xuICAgICAgQ0hBTk5FTF9ST1VURTogJ0NIQU5ORUxfUk9VVEVfQ0hBTkdFX0VWRU5UJ1xuICAgIH1cbiAgICBjb25zdCBnZXRBY3Rpb25GbiA9IGNvbXBvc2UoZGVmYXVsdFRvQWN0aW9uLCBwcm9wKGNoYW5uZWxOYW1lKSlcblxuICAgIGFjdGlvbiA9IGFjdGlvbiB8fCBnZXRBY3Rpb25GbihjaGFubmVsRGVmYXVsdEFjdGlvbkhhc2gpXG5cbiAgICBjb25zdCBkYXRhID0geyBwYXlsb2FkLCBhY3Rpb24gfVxuXG4gICAgdHJ5IHtcbiAgICAgIGRhdGEuc3JjRWxlbWVudCA9IGNvbXBvc2UocGljayhbJ2lkJywgJ3ZzaWQnLCAnY2xhc3MnLCAndGFnTmFtZSddKSwgcHJvcCgncHJvcHMnKSkodGhpcylcbiAgICAgIGlmICh0aGlzLmNoZWNrSWZDaGFubmVsRXhpc3RzKGNoYW5uZWxOYW1lKSA9PT0gdHJ1ZSkge1xuICAgICAgICBpZiAoL0NIQU5ORUxfTElGRUNZQ0xFLy50ZXN0KGFjdGlvbikgPT09IGZhbHNlKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZGF0YSwge1xuICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICBnZXQ6ICgpID0+IHNhZmVDbG9uZShwbClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9icyQgPSBvZihkYXRhKVxuICAgICAgICByZXR1cm4gbmV3IFZpZXdTdHJlYW1QYXlsb2FkKGNoYW5uZWxOYW1lLCBvYnMkLCBkYXRhKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignU1BZTkUgV0FSTklORyAnLCBlKVxuICAgIH1cbiAgfVxuXG4gIHRyYWNlciguLi5hcmdzKSB7XG4gICAgdGhpcy5zZW5kTGlmZWN5Y2xlTWV0aG9kKC4uLmFyZ3MpXG4gIH1cblxuICBzZW5kTGlmZWN5Y2xlTWV0aG9kSW5hY3RpdmUoKSB7XG5cbiAgfVxuXG4gIHNlbmRMaWZlY3ljbGVNZXRob2RBY3RpdmUodmFsLCBwKSB7XG4gICAgY29uc3QgaXNSZW5kZXJlZCA9IHdoZXJlKHtcbiAgICAgIGZyb20kOiBlcXVhbHMoJ2ludGVybmFsJyksXG4gICAgICBhY3Rpb246IGVxdWFscygnVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UJylcbiAgICB9LCBwKVxuICAgIGNvbnN0IGlzRGlzcG9zZWQgPSBwID09PSAnVlNfREVUUklUVVNfQ09MTEVDVCdcbiAgICBpZiAoaXNSZW5kZXJlZCA9PT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zZW5kSW5mb1RvQ2hhbm5lbCgnQ0hBTk5FTF9MSUZFQ1lDTEUnLCB7IGFjdGlvbjonQ0hBTk5FTF9MSUZFQ1lDTEVfUkVOREVSRURfRVZFTlQnIH0sICdDSEFOTkVMX0xJRkVDWUNMRV9SRU5ERVJFRF9FVkVOVCcpXG4gICAgfSBlbHNlIGlmIChpc0Rpc3Bvc2VkID09PSB0cnVlKSB7XG4gICAgICB0aGlzLnNlbmRJbmZvVG9DaGFubmVsKCdDSEFOTkVMX0xJRkVDWUNMRScsIHsgYWN0aW9uOidDSEFOTkVMX0xJRkVDWUNMRV9ESVNQT1NFRF9FVkVOVCcgfSwgJ0NIQU5ORUxfTElGRUNZQ0xFX0RJU1BPU0VEX0VWRU5UJylcbiAgICB9XG4gIH1cblxuICBjcmVhdGVBY3Rpb25GaWx0ZXIoc2VsZWN0b3JzLCBkYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBDaGFubmVsUGF5bG9hZEZpbHRlcihzZWxlY3RvcnMsIGRhdGEpXG4gIH1cblxuICBpc0xvY2FsRXZlbnQoY2hhbm5lbFBheWxvYWRJdGVtKSB7XG4gICAgY29uc3QgaXRlbUVsID0gcGF0aChbJ3NyY0VsZW1lbnQnLCAnZWwnXSwgY2hhbm5lbFBheWxvYWRJdGVtKVxuICAgIGNvbnN0IHRoaXNFbCA9IHBhdGgoWydwcm9wcycsICdlbCddLCB0aGlzKVxuICAgIC8vIGNvbnNvbGUubG9nKCd0aGlzIGVsIGlzICcse3RoaXNFbCwgaXRlbUVsfSk7XG4gICAgcmV0dXJuIFZpZXdTdHJlYW0uZWxJc0RvbUVsZW1lbnQodGhpc0VsKSAmJiBWaWV3U3RyZWFtLmVsSXNEb21FbGVtZW50KGl0ZW1FbCkgJiYgdGhpc0VsLmNvbnRhaW5zKGl0ZW1FbClcbiAgfVxuXG4gIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgYWRkTWl4aW5zKCkge1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQkFTRSBDT1JFIE1JWElOU1xuICAgIC8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgY29yZU1peGlucyA9IGJhc2VDb3JlTWl4aW5zKClcbiAgICB0aGlzLmNyZWF0ZUlkID0gY29yZU1peGlucy5jcmVhdGVJZFxuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzYzNl9fOyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMTMxX187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX185NjhfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzUzMV9fOyIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiXSwibmFtZXMiOlsicm9vdCIsImZhY3RvcnkiLCJleHBvcnRzIiwibW9kdWxlIiwicmVxdWlyZSIsImRlZmluZSIsImFtZCIsInNlbGYiLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX185NjhfXyIsIl9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfXzEzMV9fIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fNjM2X18iLCJfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX181MzFfXyIsIkNoYW5uZWxGZXRjaCIsImNvbnN0cnVjdG9yIiwibmFtZSIsInByb3BzIiwidmFsaWRhdGVNYXBNZXRob2QiLCJ1bmRlZmluZWQiLCJtYXAiLCJtYXBGbiIsImV4dGVuZGVkQWN0aW9uc0FyciIsInNlbmRDYWNoZWRQYXlsb2FkIiwic3VwZXIiLCJ0ZXN0TW9kZSIsImlzVW5kZWZpbmVkT3JXcm9uZ1R5cGUiLCJlaXRoZXIiLCJpc05pbCIsInZhbCIsImlzVW5kZWZpbmVkIiwiYWxsIiwiaXNOb3RVbmRlZmluZWRBbmRJc05vdEVtcHR5IiwiYWxsUGFzcyIsImFyciIsImxlbmd0aCIsImNvbXBvc2UiLCJ2YWx1ZXMiLCJwaWNrIiwiY29uc29sZSIsIndhcm4iLCJvblJlZ2lzdGVyZWQiLCJ0aGlzIiwicGF1c2UiLCJzdGFydEZldGNoIiwiYWRkUmVnaXN0ZXJlZEFjdGlvbnMiLCJleHRlbmRlZEFyciIsImRlZmF1bHRUbyIsInBhdGgiLCJjb25jYXQiLCJvcHRpb25zIiwic3Vic2NyaWJlciIsIm9uRmV0Y2hSZXR1cm5lZCIsImJpbmQiLCJmZXRjaFByb3BzIiwiY29uc29saWRhdGVBbGxGZXRjaFByb3BzIiwib25GZXRjaFVwZGF0ZSIsImV2dCIsInByb3BzT3B0aW9ucyIsImdldFByb3BzRm9yRmV0Y2giLCJzdHJlYW1JdGVtIiwiY3JlYXRlQ2hhbm5lbFBheWxvYWRJdGVtIiwicGF5bG9hZCIsImFjdGlvbiIsInVybCIsInNyY0VsZW1lbnQiLCJzZW5kQ2hhbm5lbFBheWxvYWQiLCJkYXRhT2JqIiwiZmlsdGVyT3V0VW5kZWZpbmVkIiwicmVqZWN0IiwibzEiLCJvMiIsIm1lcmdlRGVlcFJpZ2h0Iiwib2JzZXJ2ZXIiLCJvYnNlcnZlciQiLCJDaGFubmVsUGF5bG9hZCIsImNoYW5uZWxOYW1lIiwiZXZlbnQiLCJ0aW1lTGFiZWwiLCJjaGFubmVsIiwidGltZSIsImNoYW5uZWxQYXlsb2FkSXRlbU9iaiIsImZyb3plblBheWxvYWQiLCJkZWVwRnJlZXplIiwiZGVidWciLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJwYXlsb2FkU3RyIiwiSlNPTiIsInN0cmluZ2lmeSIsImNoYW5uZWxBY3Rpb25zQXJyIiwiZ2V0Q2hhbm5lbEFjdGlvbnMiLCJ2YWxpZGF0ZUFjdGlvbiIsImNsb25lIiwibWVyZ2VBbGwiLCJjaGFubmVsUGF5bG9hZEl0ZW1PYmpQcm9wcyIsIiRkaXIiLCJnZXQiLCJfZGlyIiwic2V0IiwibG9jYXRpb24iLCJnZXRMb2NhdGlvbkRhdGEiLCJkZWZpbmVQcm9wZXJ0aWVzIiwidGltZUVuZCIsImlzSW5BcnIiLCJpbmNsdWRlcyIsImluaXRpYWxpemVkIiwicGlja0FsbCIsIndpbmRvdyIsImdldFN0cmVhbUl0ZW0iLCJkZWVwQ2xvbmUiLCJvIiwiaXNBcnIiLCJpcyIsIkFycmF5IiwiaXNPYmoiLCJvYiIsImZyb21QYWlycyIsInRvUGFpcnMiLCJlbElzRG9tRWxlbWVudCIsImx0ZSIsInByb3AiLCJmcmVlemUiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiZm9yRWFjaCIsImlzRnJvemVuIiwiZSIsImdldE1vdXNlRXZlbnRLZXlzIiwiQ2hhbm5lbFByb3h5IiwiaXNQcm94eSIsInN1YmplY3QkIiwiU3ViamVjdCIsInJlcGxheVN1YiQiLCJSZXBsYXlTdWJqZWN0IiwibWVyZ2UiLCJjaGVja0lmQ2hhbm5lbElzU3RpbGxQcm94eSIsImdldE1lcmdlZFN1YmplY3QiLCJwZXJpc3REYXRhIiwibGlzdFJlZ2lzdGVyZWRDaGFubmVscyIsInJlcGxheVN1YmplY3QiLCJzdWJqZWN0IiwiQ2hhbm5lbCIsIkNIQU5ORUxfTkFNRSIsImNyZWF0ZUNoYW5uZWxBY3Rpb25zT2JqIiwiZGVmYXVsdEFjdGlvbnMiLCJkYXRhIiwiaXNSZWdpc3RlcmVkIiwiZGVmYXVsdENhY2hlZFBheWxvYWRCb29sIiwicmVwbGF5Iiwic2VuZFBheWxvYWRUb1JvdXRlQ2hhbm5lbCIsImNyZWF0ZUNoYW5uZWxBY3Rpb25NZXRob2RzIiwic3RyZWFtc0NvbnRyb2xsZXIiLCJjaGFubmVsc01hcCIsImdldE1haW5PYnNlcnZlciIsImNoZWNrRm9yUGVyc2lzdGVudERhdGFNb2RlIiwiZGlzcGF0Y2hlclN0cmVhbSQiLCJnZXRTdHJlYW0iLCJwYXlsb2FkUHJlZEJ5Q2hhbm5lbE5hbWUiLCJwcm9wRXEiLCJwaXBlIiwiZmlsdGVyIiwic3Vic2NyaWJlIiwib25SZWNlaXZlZE9ic2VydmFibGUiLCJ0ZXN0U3RyZWFtIiwiZ2V0UHJveHlTdWJqZWN0Iiwib25DaGFubmVsSW5pdGlhbGl6ZWQiLCJrZXlzIiwiY2hhbm5lbEFjdGlvbnMiLCJjaGVja0ZvclRyYWl0cyIsInRyYWl0cyIsIlRyYWl0Q2xhc3MiLCJhZGRUcmFpdHMiLCJpbml0aWFsaXplU3RyZWFtIiwiYWN0aW9uc09iaiIsImFjdGlvbnNPYmpJc0VtcHR5IiwiaXNFbXB0eSIsImRhdGFJc0FkZGVkIiwiYWN0aW9uU3RyIiwic2V0RGVmYXVsdEFjdGlvbnNPYmoiLCJzZXRUcmFjZSIsImJvb2wiLCJnZXRBY3Rpb25WYWwiLCJpZkVsc2UiLCJTdHJpbmciLCJpZGVudGl0eSIsImhlYWQiLCJtYWluQXJyIiwib2JqIiwiY2hhaW4iLCJzdHIiLCJvYmpPZiIsImRlbGF5Q2hlY2tJZlRyYWl0TWV0aG9kSGFzQmVlbkFkZGVkIiwibWV0aG9kU3RyIiwic2V0VGltZW91dCIsImdldEFyck1ldGhvZCIsImFsd2F5cyIsInZpZXciLCJsZW5zSW5kZXgiLCJjaGFubmVsQWN0aW9uTWV0aG9kcyIsIm9uSW5jb21pbmdPYnNlcnZhYmxlIiwiZ2V0QWN0aW9uTWV0aG9kRm9yT2JzZXJ2YWJsZSIsInVucGFja2VkIiwiZGVmYXVsdEZuIiwib25WaWV3U3RyZWFtSW5mbyIsIm1ldGhvZFZhbCIsImZuIiwiZXFzTmFtZSIsImVxdWFscyIsIm9ic1ZhbCIsIm1lcmdlUHJvcHMiLCJkIiwib2JzZXJ2YWJsZSIsIm9uU3VjY2VzcyIsIm9uRXJyb3IiLCJvYnMiLCJvYnMkIiwiY2hhbm5lbFBheWxvYWRJdGVtIiwibmV4dCIsImdldENoYW5uZWwiLCJwYXlsb2FkRmlsdGVyIiwiYyIsInNvdXJjZSIsIm1lcmdlQ2hhbm5lbHMiLCJjaGFubmVsc0FyciIsImVtaXRPbmNlIiwiY2hhbm5lbE9ic2VydmFibGVzIiwiaXRlbSIsImNoYW4kIiwidGFrZSIsImNvbWJpbmVkJCIsImZvcmtKb2luIiwiRU1QVFkiLCJmaXJzdCQiLCJyZXN0JCIsImNvbWJpbmVMYXRlc3RXaXRoIiwicmVzdWx0c0FyciIsImlkeCIsIml0ZXJLZXkiLCJjaGVja0Zvck5vdFRyYWNrRmxhZyIsImRvTm90VHJhY2siLCJkb05vdFRyYWNrQ2hhbm5lbCIsInJlZ2lzdGVyZWRTdHJlYW1OYW1lcyIsInJlZ2lzdGVyZWRTdGVwcyIsInJlZ2lzdGVyZWRMaWZlU3RyZWFtVHlwZXMiLCJyZWdpc3RlcmVkU3RyZWFtVHlwZXMiLCJyZWdpc3RlcmVkQWN0aW9ucyIsImJhc2VWYWxpZGF0aW9ucyIsInZpZXdJbmZvVmFsaWRhdGlvbnMiLCJ1aVZhbGlkYXRpb25zIiwibGlmZXN0cmVhbVZhbGlkYXRpb25zIiwic3RlcFZhbGlkYXRpb25zIiwic3RlcERpc3Bvc2VWYWxpZGF0aW9ucyIsInN0ZXBVcGRhdGVWYWxpZGF0aW9ucyIsInJvdXRlVmFsaWRhdGlvbnMiLCJTdHJlYW1zQ29uZmlnIiwiT2JzZXJ2YWJsZSIsImVycm9yIiwicHJlZGljYXRlIiwibGlmZVN0cmVhbVZhbGlkYXRpb25zIiwiU1RFUCIsInR5cGUiLCJ2aWV3SWQiLCJkaXNwb3NlSXRlbXMiLCJzdHJlYW1WYWxpZGF0aW9ucyIsImdldFJ4VHlwZSIsInN0cmVhbXMiLCJpbml0Iiwic3RydWN0dXJlIiwidmFsaWRhdGlvbnMiLCJfbWFwIiwiTWFwIiwiQ2hhbm5lbHNNYXAiLCJhZGRNaXhpbnMiLCJnZXRDaGFubmVsc0xpc3QiLCJmcm9tIiwiayIsInYiLCJrZXkiLCJzaG93T25seVByb3hpZXMiLCJwcm94eU1hcCIsInJlamVjdFByb3h5Rm4iLCJmaWx0ZXJQcm94eUZuIiwicmVtb3ZlZFByb3h5QXJyIiwicGx1Y2siLCJsaXN0UHJveHlDaGFubmVscyIsImNoZWNrRm9yTWlzc2luZ0NoYW5uZWxzIiwiZmlsdGVyUHJveHlBcnIiLCJmaWx0ZXJQcmVmaXhXYXJuaW5nIiwiam9pbiIsImNyZWF0ZU1haW5TdHJlYW1zIiwicm91dGVTdHJlYW0iLCJ1aVN0cmVhbSIsImRvbVN0cmVhbSIsInZpZXdTdHJlYW1MaWZlY3ljbGUiLCJhaVN0cmVhbSIsImFkZEtleUV2ZW50IiwicmVnaXN0ZXJTdHJlYW0iLCJoYXMiLCJwYXRoRXEiLCJpc1JlcGxheVN1YmplY3QiLCJzdWJqZWN0VHlwZSIsIlNweW5lQ2hhbm5lbEFJIiwib25TZW5kRXZlbnQiLCJTcHluZUNoYW5uZWxMaWZlY3ljbGUiLCJTcHluZUNoYW5uZWxSb3V0ZSIsInJvdXRlQ29uZmlnSnNvbiIsImdldFJvdXRlQ29uZmlnIiwiYmluZFN0YXRpY01ldGhvZHMiLCJuYXZUb1N0cmVhbSQiLCJpbmZvIiwib25NYXBOZXh0IiwiY29tcGFyZVJvdXRlS2V5d29yZHMiLCJjaGVja0NvbmZpZ0Zvckhhc2giLCJjb25maWciLCJjaGFubmVscyIsIlJPVVRFIiwiaXNIYXNoIiwiaW5pdFN0cmVhbSIsInVwZGF0ZVJvdXRlQ29uZmlnIiwibmV3Um91dGVzT2JqIiwibWVyZ2VSaWdodCIsImNvbmZvcm1Sb3V0ZUNvbmZpZyIsInJvdXRlQ29uZmlnIiwibmF2TGlua3MiLCJyb3V0ZURhdGFzZXRzQXJyIiwiYmluZFN0YXRpY01ldGhvZHNXaXRoQ29uZmlnRGF0YSIsInNweW5lQ29uZmlnIiwiZmxhdHRlbkNvbmZpZ09iamVjdCIsInJvdXRlcyIsInBhcmFtc0FyciIsImZpcnN0TG9hZFN0cmVhbSQiLCJvbkluY29taW5nRG9tRXZlbnQiLCJjcmVhdGVQb3BTdGF0ZVN0cmVhbSIsImZpcnN0TG9hZGVkIiwicmVtb3ZlU1NJRCIsInJvdXRlTGVucyIsImxlbnNQcm9wIiwib3ZlciIsIm9taXQiLCJvbWl0U1NJRCIsImFjdG4iLCJDSEFOTkVMX1JPVVRFX0NIQU5HRV9FVkVOVCIsImV2ZW50Q291bnQiLCJpc0hpc3RvcnlDb3VudCIsIk51bWJlciIsImdldERhdGFGcm9tU3RyaW5nIiwicm91dGVDb3VudCIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJlbnVtZXJhYmxlIiwia2V5d29yZEFycnMiLCJjb21wYXJlIiwicm91dGVEYXRhIiwicGF0aHMiLCJjaGVja0ZvclJvdXRlUGFyYW1zT3ZlcnJpZGVzIiwiY2hlY2tGb3JFdmVudE1ldGhvZHMiLCJtZXRob2RzQXJyIiwidGVzdCIsImdldE1ldGhvZHMiLCJtZXRob2RVcGRhdGUiLCJtYXRjaCIsInAxIiwicDIiLCJwMyIsInA0IiwidG9Mb3dlckNhc2UiLCJtZXRob2RTdHJSZXBsYWNlIiwicmVwbGFjZSIsInJ1bk1ldGhvZCIsIm0iLCJjaGVja0ZvckVuZFJvdXRlIiwicGwiLCJkZWJ1Z0Jvb2wiLCJpdGVyIiwib25SZWR1Y2VSb3V0ZVBhdGhzIiwiYWNjIiwicm91dGVQYXRoIiwicm91dGVOYW1lIiwicm91dGVOYW1lVmFsIiwia2V5c0FyciIsInByZWQiLCJhcnJTdHIiLCJSZWdFeHAiLCJmaW5kIiwiZ2V0UHJvcFZhbCIsIm5leHRSb3V0ZVBhdGgiLCJyZXZlcnNlIiwicmVkdWNlIiwicHVzaCIsImVuZFJvdXRlVmFsQXJyIiwiZW5kUm91dGVWYWwiLCJlbCIsImRhdGFzZXQiLCJkb21TdHJpbmdNYXAiLCJkb21TdHJpbmdNYXBUb09iamVjdCIsImdldERhdGFGcm9tUGFyYW1zIiwiY2hhbmdlTG9jYXRpb25Cb29sIiwiaXNIaWRkZW4iLCJzZW5kUm91dGVTdHJlYW0iLCJjaGVja0FuZENvbnZlcnRTdHJXaXRoUmVnZXhUb2tlbnMiLCJyb3V0ZVZhbHVlIiwicmVnZXhUb2tlbk9iaiIsImNoYW5nZVdpbmRvd0xvYyIsInNldFdpbmRvd0xvY2F0aW9uIiwiZ2V0Um91dGVTdGF0ZSIsImdldElzRGVlcExpbmtCb29sIiwiaXNIaXN0b3J5IiwiX3JvdXRlQ291bnQiLCJnZXRSb3V0ZUNvdW50IiwiZ2V0RXh0cmFQYXlsb2FkUGFyYW1zIiwiaXNEZWVwTGluayIsInJvdXRlVHlwZSIsImdldFJvdXRlU3RyRnJvbVBhcmFtcyIsImdldFByb3BGcm9tQ29uZmlnIiwicHJwIiwiZGVmYWx0IiwidHlwZUZvclN0ciIsImlzSGFzaEZvclN0ciIsIm5leHRXaW5kb3dMb2MiLCJmb3JtYXRTdHJBc1dpbmRvd0xvY2F0aW9uIiwiZGF0YUZyb21TdHIiLCJnZXREYXRhRnJvbUxvY2F0aW9uU3RyIiwicGF0aElubmVybW9zdCIsImhhc2hJc1RydWUiLCJnZXRMb2NhdGlvblN0ckJ5VHlwZSIsImdldFBhcmFtc0Zyb21Sb3V0ZVN0ciIsInQiLCJsb2MiLCJwYXJhbXNEYXRhIiwiY29udmVydFBhcmFtc1RvUm91dGUiLCJjb252ZXJ0Um91dGVUb1BhcmFtcyIsImNoZWNrRW1wdHlSb3V0ZVN0ciIsImlzRW1wdHlCb29sIiwicmVtb3ZlTGFzdFNsYXNoIiwiY2hhbm5lbFBheWxvYWQiLCJwYXRobmFtZSIsImhpc3RvcnkiLCJwdXNoU3RhdGUiLCJjaGVja0ZvclNsYXNoIiwid2hlbiIsImNvbXBsZW1lbnQiLCJfXyIsImdldFdpbmRvd0xvY2F0aW9uIiwiY3VycmllZEdldFJvdXRlIiwiY3VycnlOIiwiU3B5bmVDaGFubmVsVUkiLCJrZXlFdmVudHNMb2FkZWQiLCJrZXlDb2RlQXJyIiwibG9hZEtleVN0cmVhbSIsImtleVVwcyIsImZyb21FdmVudCIsImRvY3VtZW50Iiwia2V5UHJlc3NlcyQiLCJncm91cEJ5Iiwia2V5Q29kZSIsImluZGV4T2YiLCJyZXBlYXQiLCJvbktleVByZXNzZWQiLCJudW0iLCJyZWdpc3RlcktleSIsIm9uVUlFdmVudCIsImdldEFjdGlvblN0YXRlIiwidHlwZVZhbCIsInR5cGVPdmVyUmlkZVZhbCIsInRvVXBwZXIiLCJldmVudFR5cGUiLCJtYWluQWN0aW9uIiwidGFyZ2V0IiwiU3B5bmVDaGFubmVsV2luZG93IiwiY3VycmVudFNjcm9sbFkiLCJkb21DaGFubmVsQ29uZmlnIiwiV0lORE9XIiwib2JzJEFyciIsImdldEFjdGl2ZU9ic2VydmFibGVzIiwiZG9tJCIsInAiLCJnZXRNb3VzZVdoZWVsTWFwRm4iLCJDSEFOTkVMX1dJTkRPV19XSEVFTF9FVkVOVCIsInNjcm9sbERpciIsImRlbHRhWSIsImRlbHRhWCIsImRlbHRhWiIsImNyZWF0ZUN1cnJpZWRHZW5lcmljRXZlbnQiLCJ0b1VwcGVyQ2FzZSIsImN1cnJ5IiwibWFwR2VuZXJpY0V2ZW50IiwiY3VycnlGbiIsImdldFJlc2l6ZU1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfUkVTSVpFX0VWRU5UIiwiZ2V0T3JpZW50YXRpb25NYXBGbiIsIkNIQU5ORUxfV0lORE9XX09SSUVOVEFUSU9OX0VWRU5UIiwiaXNQb3J0cmFpdEJvb2wiLCJtYXRjaE1lZGlhIiwibWF0Y2hlcyIsIm9yaWVudGF0aW9uIiwiZ2V0TWVkaWFRdWVyeU1hcEZuIiwiQ0hBTk5FTF9XSU5ET1dfTUVESUFfUVVFUllfRVZFTlQiLCJjcmVhdGVNb3VzZVdoZWVsT2JzZXJ2YWJsZSIsImRlYm91bmNlVCIsImRlYm91bmNlTVNUaW1lRm9yU2Nyb2xsIiwiY3JlYXRlRG9tT2JzZXJ2YWJsZUZyb21FdmVudCIsImRlYm91bmNlVGltZSIsImdldFNjcm9sbERhdGEiLCJzY3JvbGxZIiwic2Nyb2xsRGlzdGFuY2UiLCJnZXRTY3JvbGxZIiwic2Nyb2xsRWxlbWVudCIsInBhZ2VZT2Zmc2V0Iiwic2Nyb2xsVG9wIiwiZ2V0U2Nyb2xsTWFwRm4iLCJpbnRlcnZhbCIsInNjcm9sbERhdGFGbiIsImNyZWF0ZVNjcm9sbE9ic2VydmFibGUiLCJpc1Bhc3NpdmUiLCJkVGltZSIsImVsZW1lbnQiLCJpc1dpbmRvdyIsInNjcm9sbEVsRm9yVmFscyIsInNjcm9sbE1hcEZuIiwicGFydGlhbFJpZ2h0Iiwic2tpcFdoaWxlIiwibmV3U2Nyb2xsWSIsInNjcm9sbERpc3RhbmNlQWJzIiwiTWF0aCIsImFicyIsImNyZWF0ZU9yaWVudGF0aW9uT2JzZXJ2YWJsZSIsImNyZWF0ZVJlc2l6ZU9ic2VydmFibGUiLCJkZWJvdW5jZU1TVGltZUZvclJlc2l6ZSIsImdldEV2ZW50c0Zyb21Db25maWciLCJldmVudHMiLCJsaXN0ZW5Gb3JNZWRpYVF1ZXJpZXMiLCJtZWRpYVF1ZXJpZXMiLCJtZXRob2RzIiwibGlzdGVuRm9yUmVzaXplIiwibGlzdGVuRm9yT3JpZW50YXRpb24iLCJsaXN0ZW5Gb3JTY3JvbGwiLCJsaXN0ZW5Gb3JXaGVlbCIsIm1hcE9iakluZGV4ZWQiLCJtZXRob2QiLCJpIiwiY2hlY2tGb3JNZWRpYVF1ZXJpZXMiLCJldmVudHNBcnIiLCJnZXRNZWRpYVF1ZXJ5T2JzZXJ2YWJsZSIsImNyZWF0ZU1lcmdlZE9ic0Zyb21PYmoiLCJhcHBseSIsIm9uU2Nyb2xsTG9ja0V2ZW50Iiwib25TZXRFbGVtZW50VG9TY3JvbGwiLCJjcmVhdGVNZWRpYVF1ZXJ5SGFuZGxlciIsIl9jaGFubmVscyIsInZlcnNpb24iLCJTcHluZUFwcCIsImRlZmF1bHRDb25maWciLCJzY3JvbGxMb2NrIiwic2Nyb2xsTG9ja1giLCJzY3JvbGxMb2NrWSIsInN0cmljdCIsImJhc2VIcmVmIiwiSU1HX1BBVEgiLCJwbHVnaW5NZXRob2RzIiwicGx1Z2lucyIsInRtcCIsImVwaGVtZXJhbFByb3BzIiwidG1wUHJvcHMiLCJsaXN0ZW5Gb3JNb3VzZVdoZWVsIiwiYWRkNDA0cyIsInJvdXRlVXRpbHMiLCJpbml0aWFsaXplIiwicGx1Z2luc0ZuIiwiZ2V0UGx1Z2luc01ldGhvZE9iaiIsInJlZ2lzdGVyQ2hhbm5lbCIsInJlZ2lzdGVyUGx1Z2luIiwicGx1Z2luSW5zdGFuY2UiLCJyZWdpc3RlckRhdGFDaGFubmVsIiwibGlzdENoYW5uZWxzIiwibnVsbEhvbGRlciIsImlkIiwiYXBwZW5kVG9Eb20iLCJib2R5Iiwic3R5bGUiLCJjc3NUZXh0IiwiU3B5bmUiLCJfc3B5bmVBcHBQcm9wcyIsIlNweW5lUGx1Z2luIiwicGFyZW50RWwiLCJtZXJnZURlZmF1bHRDb25maWciLCJjcmVhdGVQYXJlbnRFbCIsInJlZ2lzdGVyIiwic3B5bmVBcHBQcm9wcyIsInBsdWdpbk5hbWUiLCJvbkJlZm9yZVJlZ2lzdGVyZWQiLCJhZGRQbHVnaW5Db25maWciLCJvblJlbmRlciIsIlNweW5lQXBwUHJvcGVydGllcyIsImFzc2lnbiIsImdldFNweW5lQXBwIiwidXBkYXRlU3B5bmVDb25maWciLCJzcHluZUFwcCIsInBsdWdpbkNvbmZpZyIsInBhdGhTYXRpc2ZpZXMiLCJnZXRFbGVtZW50QnlJZCIsInBsdWdpbkVsIiwiYXBwZW5kQ2hpbGQiLCJyZW5kZXIiLCJjcmVhdGVQbHVnaW5FbCIsImNoZWNrRm9yUmVxdWlyZWRXaW5kb3dFdmVudCIsInJlcXVpcmVkRXZlbnRzIiwid2luZG93Q29uZmlnIiwiZ2V0Q2hhbm5lbENvbmZpZyIsIm1pc3NpbmdFdmVudHMiLCJDaGFubmVsRmV0Y2hVdGlsIiwiX21hcEZuIiwic2V0TWFwRm4iLCJfdXJsIiwic2V0VXJsIiwiX3Jlc3BvbnNlVHlwZSIsInNldFJlc3BvbnNlVHlwZSIsIl9zZXJ2ZXJPcHRpb25zIiwic2V0U2VydmVyT3B0aW9ucyIsIl9zdWJzY3JpYmVyIiwibG9nIiwic2VydmVyT3B0aW9ucyIsInJlc3BvbnNlVHlwZSIsInN0YXJ0V2luZG93RmV0Y2giLCJ0YXBMb2ciLCJyZXNwb25zZSQiLCJmZXRjaCIsInRhcCIsImZsYXRNYXAiLCJyIiwibWFwTWV0aG9kIiwibWV0YWRhdGEiLCJkaXNhYmxlU2FuaXRpemUiLCJlbnYiLCJwcm9jZXNzIiwibXNnIiwiRXJyb3IiLCJzYW5pdGl6ZWREYXRhIiwibWFwV3JhcHBlciIsInB1Ymxpc2giLCJjb25uZWN0Iiwib3B0cyIsImdldEZuIiwic3RyaW5naWZ5Qm9keUlmSXRFeGlzdHMiLCJwcm9wSXMiLCJjb252ZXJ0VG9KU09OIiwidXBkYXRlTWV0aG9kV2hlbkJvZHlFeGlzdHMiLCJoYXNCb2R5IiwibWV0aG9kSXNHZXQiLCJhc3NvYyIsIm1lcmdlZE9wdGlvbnMiLCJiYXNlT3B0aW9ucyIsImhlYWRlcnMiLCJIZWFkZXJzIiwiQWNjZXB0IiwibW9kZSIsImNyZWRlbnRpYWxzIiwiY2FjaGUiLCJyZWRpcmVjdCIsInJlZmVycmVyIiwicmVmZXJyZXJQb2xpY3kiLCJpbnRlZ3JpdHkiLCJrZWVwYWxpdmUiLCJpc05vdEFyciIsIm5vdCIsImlzTm90RW1wdHkiLCJpc05vbkVtcHR5U3RyIiwiaXNOb25FbXB0eUFyciIsImlzT2JqZWN0Rm4iLCJpc05vbkVtcHR5T2JqZWN0Rm4iLCJDaGFubmVsUGF5bG9hZEZpbHRlciIsInNlbGVjdG9yIiwiZmlsdGVycyIsImRlYnVnTGFiZWwiLCJkZWJ1Z0xhYmVsQXJyIiwicHJvcEZpbHRlcnMiLCJhZGRTdHJpbmdTZWxlY3RvckZpbHRlciIsImZpbHRlclNlbGVjdG9yIiwiYWRkQXJyYXlTZWxlY3RvckZpbHRlciIsImFkZERhdGFGaWx0ZXIiLCJmaWx0ZXJEYXRhIiwiZmlsdGVyc0FyciIsImZpbHRlcnNBcmVFbXB0eSIsImZpbHRlckpzb24iLCJmaWx0ZXJkZWJ1Z0xhYmVsIiwiZm5WYWwiLCJGIiwiaXNTdHJpbmciLCJCb29sZWFuIiwiaXNCb29sZWFuIiwiaXNOdW1iZXIiLCJjb21wYXJlU3RyIiwiaXNBcnJheUZuIiwiZk1ldGhvZCIsIndoZXJlIiwiY29tcGFyZWRPYmoiLCJwcm9wc0Jvb2xlYW5zIiwiZm9yRWFjaE9iakluZGV4ZWQiLCJjb21wYXJlRGF0YSIsImNoZWNrUGF5bG9hZFNlbGVjdG9yIiwic3JjUGF5bG9hZCIsInNyYyIsImNvbXBhcmVFbHMiLCJlbENvbXBhcmUiLCJpc0VxdWFsTm9kZSIsIm1hcE5vZGVBcnJXaXRoRWwiLCJzZWwiLCJub2RlQXJyIiwicXVlcnlTZWxlY3RvckFsbCIsIm5vZGVBcnJSZXN1bHRzRGVidWdnZXIiLCJmbGF0dGVuIiwic2VsZWN0b3JzQXJyIiwibm9kZUFyclJlc3VsdCIsImFueSIsInF1ZXJ5U2VsZWN0b3IiLCJzZWxlY3RvckFyciIsInBheWxvYWRDaGVjayIsImlzTWVyZ2VhYmxlT2JqZWN0IiwidG9TdHJpbmciLCJjbG9uZUlmTmVjZXNzYXJ5Iiwib3B0aW9uc0FyZ3VtZW50IiwiZGVlcE1lcmdlIiwiaXNBcnJheSIsImRlZmF1bHRBcnJheU1lcmdlIiwiZGVzdGluYXRpb24iLCJzbGljZSIsImFycmF5IiwiYXJyYXlNZXJnZSIsIm1lcmdlT2JqZWN0IiwicHJldiIsImRlbGF5Q2FsbCIsImFzeW5jIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJnZXRDb25zdHJ1Y3Rvck5hbWUiLCJzdWJzdHIiLCJmaW5kU3RyT3JSZWdleE1hdGNoU3RyIiwicyIsImNoZWNrZXJJZlJlZ2V4TWF0Y2hFeGlzdHMiLCJjb252ZXJ0RG9tU3RyaW5nTWFwVG9PYmoiLCJkb21NYXAiLCJjaGVja0lmT2JqSXNOb3RFbXB0eU9yTmlsIiwiaXNOb3ROaWwiLCJpc05vdE5pbEFuZElzTm90RW1wdHkiLCJnZXRBbGxNZXRob2ROYW1lcyIsImluc3RhbmNlIiwib21pdHRlZE1ldGhvZHMiLCJjb21iaW5lZE9taXR0ZWRNZXRob2RzIiwib21pdFByb3BzRnJvbUFyciIsIndpdGhvdXQiLCJ1bmlxIiwic3RhdGljTWV0aG9kcyIsImFsbE1ldGhvZHMiLCJnYyIsImJhc2VDb3JlTWl4aW5zIiwiY3JlYXRlcHJvcHNNYXAiLCJ3bSIsIldlYWtNYXAiLCJvYmpLZXkiLCJ2c2lkIiwid2Vha01hcCIsImNyZWF0ZUlkIiwicmFuZG9tIiwic3Vic3RyaW5nIiwic2V0VHJhY2VGdW5jIiwiYmFzZVN0cmVhbXNNaXhpbnMiLCJ0ZXN0RnVuYyIsInNlbmRSb3V0ZVBheWxvYWQiLCJzZW5kVUlQYXlsb2FkIiwiUm91dGVDaGFubmVsVXBkYXRlciIsImN4dCIsImNyZWF0ZVRlbXBvcmFyeVZpZXdTdHJlYW1PYmoiLCJzZW5kUm91dGVDaGFubmVsVXBkYXRlIiwidnMiLCJvblJlbmRlcmVkIiwic2VuZEluZm9Ub0NoYW5uZWwiLCJhZnRlckJyb2FkY2FzdEV2ZW50cyIsImRpc3Bvc2VWaWV3U3RyZWFtIiwiYXBwZW5kVG9OdWxsIiwic2FmZUNsb25lIiwiX19wcm94eV9fcHJveHlOYW1lIiwicHJveHlSZXZpdmVyTWV0aG9kIiwiZ2V0UHJveHlSZXZpdmVyIiwicHJveHlPYmoiLCJjbG9uZU5lc3RlZFByb3h5T2JqIiwicGF0aEFyciIsIm5lc3RlZFByb3h5T2JqIiwiX19wcm94eV9faXNQcm94eSIsIl9fcHJveHlfX3Byb3BzIiwicm9vdE9iaiIsInByb3h5SXRlcmFibGUiLCJpdGVyT2JqIiwiaXRlclBhdGgiLCJkYXRhUGF0aCIsImVudHJpZXMiLCJnZXRQcm9wVHlwZSIsImNsb25lZFBhdGgiLCJjbXNEYXRhUmV2aXZlTmVzdGVkUHJveHlPYmoiLCJfc2FuaXRpemVEYXRhIiwiaXNDb25maWd1cmVkIiwiZm9yY2VTdHJpY3QiLCJTQUZFX0ZPUl9SSUNIX1RFWFQiLCJBTExPV0VEX1RBR1MiLCJBRERfVEFHUyIsIkFMTE9XRURfQVRUUiIsIkFMTE9XX0RBVEFfQVRUUiIsIkZPUkJJRF9BVFRSIiwiRk9SQklEX1RBR1MiLCJTQUZFX1VSTF9QQVRURVJOIiwiU0FGRV9GT1JfQVBQIiwicmVzb2x2ZURlZmF1bHRNb2RlIiwibWFrZVNhbml0aXplRm4iLCJjZmciLCJodG1sIiwiY2xlYW4iLCJhdHRyIiwic2FuaXRpemVEYXRhQ29uZmlndXJlIiwicHJvY2Vzc0ZhY3RvcnkiLCJzYW5pdGl6ZVN0ciIsIm91dCIsImVmZmVjdGl2ZU1vZGUiLCJzYW5pdGl6ZURhdGFGb3JjZSIsImVmZmVjdGl2ZSIsInNhbml0aXplRXZlbnRUYXJnZXQiLCJVTlNBRkVfUkUiLCJpc0NvbnRlbnRFZGl0YWJsZSIsImlubmVySFRNTCIsInNldFNhbml0aXplRGF0YUZvcmNlU3RyaWN0IiwiX3Nhbml0aXplSFRNTCIsInNhbml0aXplSFRNTENvbmZpZ3VyZSIsInRydXN0ZWRUeXBlcyIsInBvbGljeSIsImNyZWF0ZVBvbGljeSIsImNyZWF0ZUhUTUwiLCJ0b19lc2NhcGUiLCJSRVRVUk5fVFJVU1RFRF9UWVBFIiwiX2NvbmZpZyIsIl9jaGFubmVsc01hcCIsIl9pbml0aWFsaXplZCIsIl9kZWJ1ZyIsIl9lbmFibGVDTVNQcm94aWVzIiwiX2V4Y2x1ZGVDaGFubmVsc0Zyb21Db25zb2xlIiwiX25hdkxpbmtzIiwiX0lNR19QQVRIIiwiX2RvTm90VHJhY2tDaGFubmVsc0FyciIsIl9wcm94aWVzTWFwIiwiX3NweW5lUGx1Z2luTWV0aG9kcyIsImNvbmZvcm1Sb3V0ZU9iamVjdCIsInNldENoYW5uZWxzTWFwIiwic2V0SGVhZEJhc2VIcmVmIiwiYmFzZVRhZyIsImNyZWF0ZUVsZW1lbnQiLCJocmVmIiwiYWRkNDA0UHJvcHMiLCJzZXRQcm9wIiwiaXNUZW1wIiwiZ2V0UHJvcCIsInRlbXBWYWwiLCJjcmVhdGVUZW1wUHJvcCIsInNldENoYW5uZWxDb25maWciLCJjaGFubmVsQ29uZmlnIiwiYWRkUGx1Z2luTWV0aG9kcyIsInBsdWdpbk1ldGhvZHNPYmoiLCJhZGRNZXRob2RzIiwiZ2V0VW50cmFja2VkQ2hhbm5lbHNMaXN0IiwicmVnaXN0ZXJQcm94eVJldml2ZXIiLCJwcm94eU5hbWUiLCJnZXRQbHVnaW5Db25maWdCeVBsdWdpbk5hbWUiLCJleGNsdWRlQ2hhbm5lbHNGcm9tQ29uc29sZSIsImxpbmtzRGF0YSIsImVuYWJsZUNNU1Byb3hpZXMiLCJnZXRIcmVmRnJvbURhdGEiLCJyb3V0ZVByb3BzIiwic2V0Q01TUHJveHlNZXRob2QiLCJmb3JtYXRUZW1wbGF0ZUZvclByb3h5RGF0YSIsInRlbXBHZXRDaGFubmVsc0luc3RhbmNlIiwidGVtcEdldENvbmZpZyIsIl9wbHVnaW5NZXRob2RzT2JqIiwiY3JlYXRlIiwiU3B5bmVQbHVnaW5zTWV0aG9kcyIsImZvbyIsImFkZE1ldGhvZCIsIndhcm5TdHIiLCJtZXRob2RzT2JqIiwia2V5U3RyIiwiY2hlY2tJZk1ldGhvZEV4aXN0cyIsIlNweW5lVHJhaXQiLCJwYXJlbnRDb250ZXh0IiwicHJlZml4IiwiYXV0b0luaXQiLCJhdXRvQmluZGVyIiwiYWxsTWV0aG9kc0xpc3QiLCJpbml0QXV0b0JpbmRlciIsImdldEVuaGFuY2VyTWV0aG9kcyIsImNoZWNrRm9yTWFsZm9ybWVkTWV0aG9kcyIsIm1hbGZvcm1lZE1ldGhvZHNBcnIiLCJ3YXJuaW5nU3RyIiwiYmluZFBhcmVudFZpZXdTdHJlYW0iLCJjb250ZXh0IiwiYmluZE1ldGhvZHNUb1BhcmVudFZpZXdTdHJlYW0iLCJpc1N0YXRpYyIsImNvbnN0cnVjdG9yVHlwZSIsImJpbmRTdGF0aWNNZXRob2RzVG9QYXJlbnRWaWV3U3RyZWFtIiwiYmluZEN1cnJ5IiwiU3B5bmVVdGlsc0NoYW5uZWxSb3V0ZVVybCIsImNoZWNrSWZQYXJhbVZhbHVlTWF0Y2hlc1JlZ2V4IiwicGFyYW1WYWx1ZSIsInJvdXRlT2JqIiwicmVqZWN0UGFyYW1LZXkiLCJyZWdleE1hdGNoU3RyIiwiY2hlY2tlciIsImhhc2giLCJzZWFyY2giLCJwcm9wVmFsIiwic2xhc2giLCJxdWVyeSIsImNyZWF0ZVJvdXRlQXJyYXlGcm9tUGFyYW1zIiwicm91dGUiLCJwYXJhbXNGcm9tTG9jIiwidXJsQXJyIiwibG9vcFRocm91Z2hQYXJhbSIsInVybE9iaiIsImtleXdvcmQiLCJwYXJhbVZhbEZyb21EYXRhIiwicGFyYW1WYWxUeXBlIiwiaXNPYmplY3QiLCJvYmplY3RQYXJhbUV4aXN0cyIsIm9iamVjdENvbnRhaW5zUm91dGUiLCJuZXdPYmoiLCJjcmVhdGVTbGFzaFN0cmluZyIsImFyckNsZWFyIiwibm90VW5kZWZpbmVkIiwic3RyaXBSZWdleCIsImpvaW5lciIsImNyZWF0ZVF1ZXJ5U3RyaW5nIiwiY3JlYXRlUGFpciIsImNoZWNrUGFpciIsIm1hcEFycmF5T2ZQYWlycyIsImNoZWNrSWZTdHJJc0VtcHR5IiwiY3JlYXRlUXMiLCJjaGVja1BheWxvYWRGb3JSZWdleE92ZXJyaWRlcyIsInVybHNBcnIiLCJwYXJzZVN0cmluZyIsImdldE92ZXJyaWRlVmFsIiwib3ZlcnJpZGVWYWwiLCJjaGVja0ZvclJvdXRlVmFsV2l0aE11bHRpcGxlVmFscyIsImlucHV0IiwiZ2V0U3RyaW5nQmVmb3JlUGlwZSIsImNoZWNrRm9yUm91dGVWYWxzUGFydE1hdGNoIiwidXBkYXRlZE9iaiIsImdsb2JQYXR0ZXJuIiwic3BsaXQiLCJzb21lIiwicGF0dGVybiIsImVzY2FwZWRQYXR0ZXJuIiwiZ2xvYlBhdHRlcm5NYXRjaCIsImxvY1N0ciIsInVybFR5cGUiLCJsb2NhdGlvblN0ciIsInBhcmFtc0Zyb21DdXJyZW50TG9jYXRpb24iLCJmaW5kSW5kZXhPZk1hdGNoZWRTdHJpbmdPclJlZ2V4IiwibWFpblN0ciIsImlzNDA0IiwiY2hlY2tGb3JFbXB0eSIsImNoZWNrRm9yRWl0aGVyU3RyT3JSZU1hdGNoIiwiZmluZExhc3RJbmRleCIsInJlIiwic3RhcnRzV2l0aCIsImVuZHNXaXRoIiwiZmluZE1hdGNoSW5kZXgiLCJjaGVja0lmVmFsdWVTaG91bGRNYXBUb1BhcmFtIiwicmVnZXhUb2tlbnMiLCJsYXN0IiwiZ2V0VmFsQ29tcGFyZUFyciIsInBhcmFtSW5kZXgiLCJwYXJhbVN0ciIsInBhcmFtIiwiaW52ZXJ0ZWRPYmoiLCJpbnZlcnQiLCJwYXJhbUludmVydGVkIiwiZ2V0UGFyYW1JbnZlcnRlZCIsImNyZWF0ZUFyckZyb21TbGFzaFN0ciIsImNvbnZlcnRTbGFzaFJvdXRlU3RyVG9QYXJhbXNPYmoiLCJ0b3BMZXZlbFJvdXRlIiwidmFsdWVzQXJyIiwicm91dGVkVmFsdWVzQXJyIiwibGF0ZXN0T2JqIiwidG90YWwiLCJjdXJyZW50VmFsdWUiLCJyb3V0ZVZhbHVlU3RyIiwiaXNFbXB0eU9yTmlsIiwicHJldlBhdGhOb3RFcUN1cnJlbnRQYXRoIiwic3RyUGF0aCIsIm9iamVjdEZyb21TdHIiLCJvYmplY3RGcm9tUm91dGVQYXJhbSIsInppcE9iaiIsImdldExhc3RBcnJWYWwiLCJhIiwiY3JlYXRlRGVmYXVsdFBhcmFtRnJvbUVtcHR5U3RyIiwiY29udmVydFF1ZXJ5U3RyVG9QYXJhbXMiLCJzdHJBcnIiLCJjb252ZXJ0VG9QYXJhbXMiLCJTcHluZVV0aWxzQ2hhbm5lbFJvdXRlIiwic3Vic2NyaWJlRm4iLCJmcm9tRXZlbnRQYXR0ZXJuIiwiaGFuZGxlciIsIm9ucG9wc3RhdGUiLCJwaWNrVmFsdWVzIiwib2JqMSIsIm9iajIiLCJjcmVhdGVQcmVkIiwiZ2V0UHJvcHNTdGF0ZSIsInNhbWUiLCJwcmV2aW91c0V4aXN0cyIsIm5leHRFeGlzdHMiLCJjaGFuZ2VkIiwiYWRkZWQiLCJyZW1vdmVkIiwicGF0aHNDaGFuZ2VkIiwicGF0aHNBZGRlZCIsInBhdGhzUmVtb3ZlZCIsImdldENvbXBhcmVyIiwiZ2V0Um91dGVBcnJEYXRhIiwicm91dGVBcnIiLCJnbyIsIm9ial8iLCJrXyIsInZfIiwiYWRkUm91dGVEYXRhc2V0cyIsImNoYW5uZWxSb3V0ZU9iaiIsImdldEhSRUYiLCJpc1ZhbGlkU3RyUkUiLCJjcmVhdGVJbml0aWFsVmFsRm4iLCJhY2NNYWluIiwicm91dGVQYXRoT2JqIiwib2JqQWNjIiwiYXJyUGFpciIsImdldExpbmtUZXh0IiwiY3JlYXRlVGl0bGUiLCJzdWJSb3V0ZU5hbWUiLCJvQmFzZSIsIm5hdkxldmVsIiwidGl0bGUiLCJyZWR1Y2VkQXJyIiwicmVtb3ZlVW5kZWZpbmVkIiwicm91dGVOYW1lc0FyciIsImRhdGFzZXRzQXJyIiwiZXhjbHVkZSIsImdldE1haW5LZXlzIiwiZ2V0TmF2UHJvcHMiLCJjaGFubmVsc1JvdXRlUGF0aCIsInBhcnNlUm91dGVQYXRoIiwiY29uZmlnTWFwcGVyRm4iLCJvYmo0MDQiLCJpc1JvdXRlUGF0aCIsImV4dHJhUm91dGVEYXRhIiwiU3B5bmVVdGlsc0NoYW5uZWxXaW5kb3ciLCJldmVudE5hbWUiLCJhZGRFdmVudExpc3RlbmVyIiwicGFzc2l2ZSIsImNyZWF0ZU1lZGlhUXVlcnkiLCJtcSIsImNoZWNrSWZWYWxpZE1lZGlhUXVlcnkiLCJub1NwYWNlcyIsImlzVmFsaWRCb29sIiwibWVkaWEiLCJ3YXJuTXNnIiwibWFwS2V5IiwibWVkaWFRdWVyeU5hbWUiLCJrZXlGbiIsIm1lZGlhUXVlcnlIYW5kbGVyIiwicSIsImFkZEhhbmRsZXIiLCJhZGRMaXN0ZW5lciIsInJlbW92ZUhhbmRsZXIiLCJvbmNoYW5nZSIsIm1lZGlhUXVlcmllc09iaiIsImNyZWF0ZUZhZGVySW5saW5lVGV4dCIsImlzSW5Cb29sIiwic3RhcnRaZXJvQm9vbCIsImZhZGVpbiIsImN1cnJlbnRPcGFjaXR5IiwiZ2V0Q29tcHV0ZWRTdHlsZSIsIm9wYWNpdHkiLCJpbmxpbmVDc3MiLCJmYWRlb3V0IiwiY2FsbGJhY2siLCJWaWV3U3RyZWFtT2JzZXJ2YWJsZSIsIm9ic2VydmFibGVTdHJlYW1zIiwiY3JlYXRlRGlyZWN0aW9uYWxPYnNlcnZhYmxlcyIsImNyZWF0ZURpcmVjdGlvbmFsRmlsdGVyc09iamVjdCIsImRpckludGVybmFsIiwiZGlyUGFyZW50IiwiZGlyQ2hpbGQiLCJQIiwiQyIsIlBDSSIsIkNJIiwiUEkiLCJQQyIsImFkZERlZmF1bHREaXIiLCJmbGlwIiwiZGVmYXVsdHMiLCJhZGREb3duSW50ZXJuYWxEaXIiLCJhZGRDaGlsZEFuZEludGVybmFsRGlyIiwibWFwVG9EZWZhdWx0RGlyIiwidmlld05hbWUiLCJmaWx0ZXJTdHJlYW1zIiwicHJvcFNhdGlzZmllcyIsImFyclR5cGUiLCJmaWx0ZXJQYXJlbnQiLCJmaWx0ZXJDaGlsZCIsImZpbHRlckludGVybmFsIiwiYWRkZnJvbSQiLCJyZWxTdHIiLCJmcm9tJCIsImFkZFBhcmVudGZyb20kIiwiYWRkSW50ZXJuYWxmcm9tJCIsImFkZENoaWxkZnJvbSQiLCJyYXckIiwidG9JbnRlcm5hbCQiLCJ0b1BhcmVudCQiLCJ0b0NoaWxkJCIsInN0cmVhbU9iaiIsInBhcmVudCIsImludGVybmFsIiwiY2hpbGQiLCJjb21wbGV0ZUFsbCIsImNvbXBsZXRlIiwiaXNTdG9wcGVkIiwiY29tcGxldGVTdHJlYW0iLCJEb21FbGVtZW50VGVtcGxhdGUiLCJ0ZW1wbGF0ZSIsImZvcm1hdFRlbXBsYXRlIiwiaXNQcm94eURhdGEiLCJfX2Ntc19faXNQcm94eSIsIm5vcm1hbGl6ZVRyaXBsZUJyYWNrZXRzIiwic3B5bmVEYXRhIiwiY2hlY2tGb3JBcnJheURhdGEiLCJ0ZW1wbGF0ZURhdGEiLCJjdXJyZW50T3V0ZXJMb29wRGF0YSIsImdldFN0cmluZ0FycmF5Iiwic3RyTWF0Y2hlcyIsImZpbmRUbXBsTG9vcHNSRSIsInBhcnNlVG1wbExvb3BzUkUiLCJwYXJzZVRtcGxMb29wRm4iLCJwYXJzZVRoZVRtcGxMb29wIiwiZmluZFRtcGxMb29wc1ByZWQiLCJjaGVja0Zvck1hdGNoZXMiLCJhZGRQYXJhbXMiLCJmaW5hbEFyciIsImlzUHJpbWl0aXZlVGFnIiwiZ2V0TmVzdGVkRGF0YVJlZHVjZXIiLCJuZXN0ZWREYXRhIiwiZW1wdHlSRSIsIndpdGhvdXRMZWFrcyIsIl8iLCJpbm5lckxvb3BSRSIsInN3YXBQYXJhbXNGb3JUYWdzUkUiLCJoYXNMb29wIiwicmVtb3ZlVGhpcyIsInJlbmRlckRvY0ZyYWciLCJyZXBsYWNlSW1nUGF0aCIsImNyZWF0ZVJhbmdlIiwiY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50IiwicmVuZGVyVG9TdHJpbmciLCJnZXRUZW1wbGF0ZVN0cmluZyIsImdldERhdGFWYWxGcm9tUGF0aFN0ciIsInBhdGhTdHIiLCJkYXRhRmlsZSIsInRlbXBsYXRlU3RyIiwicmVwbGFjZUFsbCIsInByb2Nlc3NJbm5lckxvb3AiLCJib2R5U3RyIiwicGFyZW50SXRlbSIsImlubmVyUkUiLCJmdWxsTWF0Y2giLCJvcGVuVGFnIiwiaW5uZXJLZXkiLCJpbm5lckJvZHkiLCJpbm5lckRhdGEiLCJpbm5lckFyciIsInByZXZpb3VzT3V0ZXIiLCJyZW5kZXJlZCIsImlubmVySXRlbSIsImlubmVySWR4Iiwic3Vic3RpdHV0ZUZvckl0ZW0iLCJpbmRleCIsImVzY2FwZWQiLCJjdHgiLCJidWlsZFN0cmluZ0l0ZW1Db250ZXh0Iiwic3Vic3RpdHV0ZU9iamVjdCIsImJ1aWxkSXRlbUNvbnRleHQiLCJzcHluZUxvb3BLZXkiLCJsb29wSW5kZXgiLCJsb29wTnVtIiwib3V0ZXJEYXRhIiwiX19jbXNfX2RhdGFJZCIsImtleUlkU3RyIiwib3JpZ0tleSIsInJlRG90IiwicG9zaXRpb25hbCIsIm91dGVyQm9keSIsImVsRGF0YSIsImVsQXJyIiwiYm9keUhhc0lubmVyTG9vcCIsIkRvbUVsZW1lbnQiLCJ0YWdOYW1lIiwiYXR0cmlidXRlcyIsImdldERvbUF0dHJpYnV0ZXMiLCJhdHRycyIsInVwZGF0ZUF0dHJzIiwiZnJhZ21lbnQiLCJjcmVhdGVEb2N1bWVudEZyYWdtZW50Iiwic2V0RWxBdHRycyIsInBhcmFtcyIsInNldEF0dHJpYnV0ZSIsInRoZU1hcCIsImFkZFRlbXBsYXRlIiwiZnJhZyIsImFkZFRtcGwiLCJhZGRDb250ZW50IiwidGV4dCIsInR4dCIsImNyZWF0ZVRleHROb2RlIiwiZXhlY3V0ZSIsInJlbmRlclRvSFRNTFN0cmluZyIsIm91dGVySFRNTCIsInJldHVybklmRGVmaW5lZCIsInVwZGF0ZXByb3BzIiwidXBkYXRlcHJvcHNBbmRSdW4iLCJ1bm1vdW50IiwicmVtb3ZlIiwidXBkYXRlVGFnIiwidXBkYXRlQXR0cmlidXRlcyIsInVwZGF0ZVRlbXBsYXRlIiwidXBkYXRlRGF0YSIsImFkZFRhZ0FuZFJlbmRlciIsImFkZEF0dHJzaWJ1dGVzQW5kUmVuZGVyIiwiYWRkVGVtcGxhdGVBbmRSZW5kZXIiLCJhZGREYXRhQW5kUmVuZGVyIiwiY29yZU1peGlucyIsImF0dHJpYnV0ZXNBcnJheSIsImlzRGV2TW9kZSIsIlZpZXdTdHJlYW1Ccm9hZGNhc3RlciIsImJyb2FkY2FzdEZuIiwiYnJvYWRjYXN0ZXIiLCJhZGREYmxDbGlja0V2dCIsInR5cGVPdmVyUmlkZSIsImJyb2FkY2FzdCIsImFyZ3MiLCJjaGFubmVsUGF5bG9hZHMiLCJVSSIsImxvY2FsIiwiY2hlY2tQYXJlbnRFbHMiLCJlbFNlbGVjdGVkIiwicGFyZW50RWxlbWVudCIsInBsdWNrRWxGcm9tUGFyZW50IiwiaXNMb2NhbEV2ZW50IiwicHJldmVudERlZmF1bHQiLCJjaCIsInNyY0V2ZW50IiwiYXJyRm4iLCJzdHJlYW1NaXhpbnMiLCJWaWV3U3RyZWFtRWxlbWVudCIsInNpbmskIiwidmlld1Byb3BzIiwidnNOYW1lIiwiX3N0YXRlIiwiZXh0ZW5kZWRIYXNoTWV0aG9kcyIsImFkZEFjdGlvbkxpc3RlbmVycyIsImZ1bmNTdHIiLCJoYXNoTWV0aG9kcyIsInNldEhhc2hNZXRob2RzIiwib25PYnNTaW5rU3Vic2NyaWJlIiwiJGRpcnMiLCJzb3VyY2VTdHJlYW1zIiwiX3NvdXJjZSQiLCJleHRlbmRlZEhhc2hNZXRob2RzT2JqIiwiZGVmYXVsdEhhc2hNZXRob2RzIiwiVlNfREVUUklUVVNfQ09MTEVDVCIsIm9uR2FyYmFnZUNvbGxlY3QiLCJSRUFEWV9GT1JfVlNfREVUUklUVVNfQ09MTEVDVCIsIm9uUmVhZHlGb3JHQyIsIkVYVElSUEFURSIsIm9uRGlzcG9zZSIsIlZTX1NQQVdOIiwiVlNfU1BBV05fQU5EX0FUVEFDSF9UT19QQVJFTlQiLCJvblJlbmRlckFuZEF0dGFjaFRvUGFyZW50IiwiVlNfU1BBV05fQU5EX0FUVEFDSF9UT19ET00iLCJvblJlbmRlckFuZEF0dGFjaFRvRG9tIiwiQVRUQUNIX0NISUxEX1RPX1NFTEYiLCJvbkF0dGFjaENoaWxkVG9TZWxmIiwiY3JlYXRlRG9tSXRlbSIsIm9uRGlzcG9zZUNvbXBsZXRlZCIsImFuaW1hdGVJblR3ZWVuIiwiYW5pbWF0ZU91dFR3ZWVuIiwic2V0QW5pbWF0ZUluIiwiYW5pbWF0ZUluIiwiZG9tSXRlbSIsImFuaW1hdGVJblRpbWUiLCJkaXNwb3NlTWV0aG9kIiwiZ2NEYXRhIiwiZmFkZU91dE9icyIsImJpbmRDYWxsYmFjayIsImFuaW1hdGVPdXRUaW1lIiwib25GYWRlb3V0Q29tcGxldGVkIiwiYW5pbWF0ZU91dCIsInJlbW92ZVN0cmVhbSIsImdldFNvdXJjZVN0cmVhbSIsImNvbWJpbmVEb21JdGVtcyIsImNvbnRhaW5lciIsIm5vZGUiLCJhZnRlciIsImF0dGFjaFR5cGUiLCJpbnNlcnRCZWZvcmUiLCJmaXJzdENoaWxkIiwiY2hpbGRSZW5kZXJEYXRhIiwicmVuZGVyRG9tSXRlbSIsImdldEVsIiwiSSIsImV4dGVuZGVkTWV0aG9kcyIsImF0dGFjaERhdGEiLCJkZWZhdWx0VG9GbiIsInNlbmREYXRhIiwiVmlld1N0cmVhbVBheWxvYWQiLCJzZW5kVG9EaXJlY3RvclN0cmVhbSIsImRpcmVjdG9yU3RyZWFtJCIsImlzTm9kZUVsZW1lbnQiLCJub2RlQ2hlY2siLCJnZXRFbE9yTGlzdCIsInZlcmJvc2VCb29sIiwibGlzdCIsImdldE5vZGVMaXN0QXJyYXkiLCJ0ZXN0U2VsZWN0b3JzIiwidHJpbSIsImlzVmFsaWRTZWxlY3RvciIsImlzVmFsaWRTZWxlY3RvckJvb2wiLCJpc1BhcmVudCIsInJldHVyblNlbGVjdG9ySWZWYWxpZCIsInNldElubGluZUNzcyIsIlZpZXdTdHJlYW1TZWxlY3RvciIsImdlbmVyYXRlU3B5bmVTZWxlY3RvcklkIiwiYWRkQ2xhc3MiLCJjbGFzc0xpc3QiLCJhZGQiLCJyZW1vdmVDbGFzcyIsInNldENsYXNzIiwicmVtb3ZlQ2xhc3NTdHJBcnIiLCJjbGFzc05hbWUiLCJjbGFzc1N0ckFyciIsInRvZ2dsZUNsYXNzIiwiY29udGFpbnMiLCJ0b2dnbGUiLCJodG1sRWxlbWVudCIsImFkZEFuaW1DbGFzcyIsInNldEFjdGl2ZUl0ZW0yIiwiZWxTZWwiLCJjdXJyZW50RWwiLCJzZXRBY3RpdmVJdGVtIiwibWF0Y2hpbmdFbCIsIlZpZXdTdHJlYW0iLCJ2c251bSIsIl9wb3N0UmVuZGVyQ2FsbGVkIiwic2VuZExpZmVjeWxlRXZlbnRzIiwiaGFzaElkIiwiaWQkIiwidmlld0NsYXNzIiwiZXh0ZW5kZWRTb3VyY2VzSGFzaE1ldGhvZHMiLCJhZGREZWZhdWx0RGlyZWN0aW9uIiwic2VuZExpZmVjeWNsZU1ldGhvZCIsInNlbmRMaWZlY3ljbGVNZXRob2RBY3RpdmUiLCJzZW5kTGlmZWN5Y2xlTWV0aG9kSW5hY3RpdmUiLCJhdHRyaWJ1dGVzQXJyIiwiZG9tQXR0cmlidXRlcyIsImxvYWRBbGxNZXRob2RzIiwiZWxJc0FscmVhZHlSZW5kZXJlZEJvb2wiLCJlbEFscmVhZHlFeGlzdHNGbiIsIlZpZXdDbGFzcyIsIl9yYXdTb3VyY2UkIiwic2VuZEV2ZW50c0Rvd25TdHJlYW0iLCJzZW5kRXZlbnRzRG93blN0cmVhbUZuIiwiaW5pdFZpZXdTdHJlYW0iLCJhZGRlZENoYW5uZWxzIiwiY2hlY2tJZkVsZW1lbnRBbHJlYWR5RXhpc3RzIiwic291cmNlJCIsImNoZWNrSWZBY3Rpb25zQXJlUmVnaXN0ZXJlZCIsImFjdGlvbnNBcnIiLCJjaGVja0Zvck1hdGNoIiwic3RyTWF0Y2giLCJmaW5kSW5kZXgiLCJnZXRBbGxBY3Rpb25zQXJyIiwiY2hhbm5lbFN5bnRheCIsImdldEFsbEFjdGlvbnMiLCJpc1ZhbGlkTmVzdGVkQXJyIiwiaXNUcnVlIiwiYWxsSXNUcnVlIiwiaXNWYWxpZEFyciIsIm1hcEV2ZW50c0FyckZuIiwidXBkYXRlUHJvcHNUb01hdGNoRWwiLCJnZXRUYWdOYW1lIiwidG9Mb3dlciIsInBvc3RSZW5kZXIiLCJjaGFubmVsRm4iLCJvbkNoYW5uZWxNZXRob2RDYWxsIiwiYWN0aW9uRmlsdGVyIiwiaGFzaFNvdXJjZU1ldGhvZHMiLCJzZXRTb3VyY2VIYXNoTWV0aG9kcyIsImRlbGV0ZWQiLCJmaWx0ZXJQYXlsb2FkIiwicnVuRnVuYyIsImhhc2hTb3VyY2VLZXlzIiwiRVhUSVJQQVRJTkciLCJjaGVja1BhcmVudERpc3Bvc2UiLCJWU19TUEFXTkVEIiwib25WU1JlbmRlcmVkIiwiVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fRE9NIiwiVlNfU1BBV05FRF9BTkRfQVRUQUNIRURfVE9fUEFSRU5UIiwib25SZWFkeVRvR0MiLCJWU19OVUxMSVRZIiwib25NYXBWaWV3U291cmNlIiwidGFrZVdoaWxlIiwibm90R0NTVEFURSIsImluaXRBdXRvTWVyZ2VTb3VyY2VTdHJlYW1zIiwidXBkYXRlU291cmNlU3Vic2NyaXB0aW9uIiwiZXFHQ1NUQVRFIiwibm90Q09NUExFVEVEIiwibm90R0NDT01QTEVURSIsInRlc3RWYWwiLCJhZGRQYXJlbnRTdHJlYW0iLCJwYXJlbnQkIiwicmVuZGVyQW5kQXR0YWNoVG9QYXJlbnQiLCJhZGRDaGlsZFN0cmVhbSIsImNoaWxkJCIsInRyYWNlciIsImZpbmFsaXplIiwib25DaGlsZENvbXBsZXRlZCIsIm9uQ2hpbGREaXNwb3NlZCIsImNoaWxkQ29tcGxldGVkRGF0YSIsIngiLCJmaW5hbERlc3QiLCJ5IiwiZmluZE5hbWUiLCJvblN1YnNjcmliZVRvU291cmNlc05leHQiLCJvblN1YnNjcmliZVRvU291cmNlc0Vycm9yIiwib25TdWJzY3JpYmVUb1NvdXJjZXNDb21wbGV0ZSIsImVsJCIsInViZXJTb3VyY2UkIiwiYXV0b1N1YnNjcmliZXIkIiwiZGVjcmVtZW50T25PYnNlcnZhYmxlQ2xvc2VkIiwib2JzQ291bnQiLCJhdXRvTWVyZ2VTdWJqZWN0JCIsIm1lcmdlTWFwIiwib2JzRGF0YSIsImJyYW5jaE9ic2VydmFibGUkIiwiYXV0b0Nsb3Nlc0Jvb2wiLCJyZWwiLCJzZW5kRXh0ZW5kZWRTdHJlYW1zIiwiaGFzaEFjdGlvblN0ciIsIm9wZW5TcGlnb3QiLCJyZW5kZXJWaWV3IiwicmVuZGVyVmlld0FuZEF0dGFjaFRvRG9tIiwib25CZWZvcmVEaXNwb3NlIiwibXMiLCJtZXRob2RGbiIsIm9uQ2hpbGREaXNwb3NlIiwib25QYXJlbnREaXNwb3NpbmciLCJpc0ludGVybmFsIiwic2V0QXR0YWNoRGF0YSIsImNoZWNrUXVlcnkiLCJnZXRQYXJlbnRFbHMiLCJnZXRFbGVtIiwic2V0QXR0YWNoUGFyZW50RGF0YSIsImxldmVsIiwiZXhjaGFuZ2VWaWV3c1dpdGhDaGlsZCIsImNoaWxkVmlldyIsImFwcGVuZFRvRG9tQWZ0ZXIiLCJwcmVwZW5kVG9Eb20iLCJhcHBlbmRWaWV3IiwiYXBwZW5kVmlld0FmdGVyIiwiYXBwZW5kVmlld1RvUGFyZW50RWwiLCJwcmVwZW5kVmlld1RvUGFyZW50RWwiLCJwcmVwZW5kVmlldyIsIl9wb3N0UmVuZGVyZWRDYWxsZWQiLCJiZWZvcmVBZnRlclJlbmRlciIsImFmdGVyUmVuZGVyIiwib25BbmltRnJhbWVBZnRlclJlbmRlcmVkIiwiYnJvYWRjYXN0RXZlbnRzIiwiaW5pdGlhbGl6ZUNoYW5uZWxzIiwidmlld3NTdHJlYW1Ccm9hZGNhc3RlciIsInB1bGxBY3Rpb25zRnJvbUxpc3QiLCJuZXN0ZWRBY3Rpb25zQXJyIiwiY2hlY2tGb3JFeGlzdGluZ01ldGhvZCIsIkZ1bmN0aW9uIiwiZGVsYXlGb3JQcm94eUNoYW5uZWxSZXNldHMiLCJzZXREYXRhVlNJRCIsImRvd25TdHJlYW0iLCJza2lwRmlyc3QiLCJhZGRDaGFubmVsIiwic2VuZERvd25TdHJlYW0iLCJkaXJlY3Rpb25BcnIiLCJpc0xvY2FsRXZlbnRDaGVjayIsImNpZENoZWNrIiwicGlwZUFyciIsInVuc2hpZnQiLCJza2lwIiwiY2hhbm5lbCQiLCJjaGVja0lmQ2hhbm5lbEV4aXN0cyIsImNoYW5uZWxFeGlzdHMiLCJkZWZhdWx0VG9BY3Rpb24iLCJnZXRBY3Rpb25GbiIsIkNIQU5ORUxfUk9VVEUiLCJvZiIsImlzRGlzcG9zZWQiLCJjcmVhdGVBY3Rpb25GaWx0ZXIiLCJzZWxlY3RvcnMiLCJpdGVtRWwiLCJ0aGlzRWwiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwibiIsImdldHRlciIsIl9fZXNNb2R1bGUiLCJkZWZpbml0aW9uIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciXSwic291cmNlUm9vdCI6IiJ9
|