@clockworkdog/cogs-client 2.2.0 → 2.4.0
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/README.md +24 -1
- package/dist/CogsConnection.d.ts +10 -2
- package/dist/CogsConnection.js +26 -5
- package/dist/DataStore.d.ts +41 -0
- package/dist/DataStore.js +70 -0
- package/dist/browser/index.js +121 -27
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/types/CogsClientMessage.d.ts +10 -1
- package/dist/types/CogsPluginManifest.d.ts +19 -0
- package/package.json +1 -1
package/dist/browser/index.js
CHANGED
|
@@ -480,7 +480,7 @@ function fadeAudioPlayerVolume(howl, volume, fade, soundId) {
|
|
|
480
480
|
howl.fade(howl.volume(soundId), volume, fade, soundId);
|
|
481
481
|
}
|
|
482
482
|
|
|
483
|
-
},{"howler":
|
|
483
|
+
},{"howler":17}],2:[function(require,module,exports){
|
|
484
484
|
"use strict";
|
|
485
485
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
486
486
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
@@ -491,6 +491,7 @@ const compare_versions_1 = require("compare-versions");
|
|
|
491
491
|
const ShowPhase_1 = __importDefault(require("./types/ShowPhase"));
|
|
492
492
|
const reconnecting_websocket_1 = __importDefault(require("reconnecting-websocket"));
|
|
493
493
|
const urls_1 = require("./helpers/urls");
|
|
494
|
+
const DataStore_1 = __importDefault(require("./DataStore"));
|
|
494
495
|
class CogsConnection {
|
|
495
496
|
get config() {
|
|
496
497
|
return { ...this.currentConfig };
|
|
@@ -517,7 +518,7 @@ class CogsConnection {
|
|
|
517
518
|
get selectedAudioOutput() {
|
|
518
519
|
return this._selectedAudioOutput;
|
|
519
520
|
}
|
|
520
|
-
constructor(manifest, { hostname = document.location.hostname, port = urls_1.COGS_SERVER_PORT } = {}, initialClientState
|
|
521
|
+
constructor(manifest, { hostname = document.location.hostname, port = urls_1.COGS_SERVER_PORT } = {}, initialClientState, initialDataStoreData) {
|
|
521
522
|
var _a;
|
|
522
523
|
this.manifest = manifest;
|
|
523
524
|
this.eventTarget = new EventTarget();
|
|
@@ -537,11 +538,8 @@ class CogsConnection {
|
|
|
537
538
|
*/
|
|
538
539
|
this.audioOutputs = undefined;
|
|
539
540
|
this._selectedAudioOutput = '';
|
|
540
|
-
/**
|
|
541
|
-
* URL parameters use for the websocket connection and asset URLs
|
|
542
|
-
*/
|
|
543
|
-
this.urlParams = null;
|
|
544
541
|
this.currentState = { ...initialClientState };
|
|
542
|
+
this.store = new DataStore_1.default(initialDataStoreData !== null && initialDataStoreData !== void 0 ? initialDataStoreData : {});
|
|
545
543
|
const { useReconnectingWebsocket, path, pathParams, supportsHttp2Assets } = websocketParametersFromUrl(document.location.href);
|
|
546
544
|
// Store the URL parameters for use in asset URLs
|
|
547
545
|
// and add screen dimensions which COGS can use to determine the best asset quality to serve
|
|
@@ -598,6 +596,20 @@ class CogsConnection {
|
|
|
598
596
|
case 'cogs_environment':
|
|
599
597
|
this.serverSupportsHttp2Assets = message.http2AssetsServer;
|
|
600
598
|
break;
|
|
599
|
+
case 'media_config_update':
|
|
600
|
+
for (const optionName of ['preferOptimizedAudio', 'preferOptimizedVideo', 'preferOptimizedImages']) {
|
|
601
|
+
const optionEnabled = message[optionName];
|
|
602
|
+
if (optionEnabled) {
|
|
603
|
+
this.urlParams.set(optionName, 'true');
|
|
604
|
+
}
|
|
605
|
+
else {
|
|
606
|
+
this.urlParams.delete(optionName);
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
break;
|
|
610
|
+
case 'data_store_items':
|
|
611
|
+
this.store.handleDataStoreItemsMessage(message);
|
|
612
|
+
break;
|
|
601
613
|
}
|
|
602
614
|
this.dispatchEvent(new CogsMessageEvent(message));
|
|
603
615
|
}
|
|
@@ -610,6 +622,10 @@ class CogsConnection {
|
|
|
610
622
|
console.error('Unable to parse incoming data from server', data, e);
|
|
611
623
|
}
|
|
612
624
|
};
|
|
625
|
+
// Tell COGS when any data store items change
|
|
626
|
+
this.store.addEventListener('items', (event) => {
|
|
627
|
+
this.sendDataStoreItems(event.items);
|
|
628
|
+
});
|
|
613
629
|
// Send a list of audio outputs to COGS and keep it up to date
|
|
614
630
|
{
|
|
615
631
|
const refreshAudioOutputs = async () => {
|
|
@@ -666,6 +682,11 @@ class CogsConnection {
|
|
|
666
682
|
this.websocket.send(JSON.stringify({ audioOutputs }));
|
|
667
683
|
}
|
|
668
684
|
}
|
|
685
|
+
sendDataStoreItems(partialItems) {
|
|
686
|
+
if (this.isConnected) {
|
|
687
|
+
this.websocket.send(JSON.stringify({ dataStoreItems: partialItems }));
|
|
688
|
+
}
|
|
689
|
+
}
|
|
669
690
|
/**
|
|
670
691
|
* Show or hide the plugin window.
|
|
671
692
|
* @param visible Whether to show or hide the window
|
|
@@ -800,7 +821,79 @@ class CogsIncomingEvent extends Event {
|
|
|
800
821
|
}
|
|
801
822
|
exports.CogsIncomingEvent = CogsIncomingEvent;
|
|
802
823
|
|
|
803
|
-
},{"./helpers/urls":
|
|
824
|
+
},{"./DataStore":3,"./helpers/urls":6,"./types/ShowPhase":11,"compare-versions":16,"reconnecting-websocket":20}],3:[function(require,module,exports){
|
|
825
|
+
"use strict";
|
|
826
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
827
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
828
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
829
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
830
|
+
};
|
|
831
|
+
var _DataStore_eventTarget;
|
|
832
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
833
|
+
exports.DataStoreItemsEvent = exports.DataStoreItemEvent = void 0;
|
|
834
|
+
/**
|
|
835
|
+
* A simple key-value store for storing data in COGS
|
|
836
|
+
*
|
|
837
|
+
* When reconnected the data will be restored.
|
|
838
|
+
*/
|
|
839
|
+
class DataStore {
|
|
840
|
+
constructor(defaultItems) {
|
|
841
|
+
_DataStore_eventTarget.set(this, new EventTarget());
|
|
842
|
+
this._items = { ...defaultItems };
|
|
843
|
+
}
|
|
844
|
+
handleDataStoreItemsMessage(message) {
|
|
845
|
+
this._items = { ...this._items, ...message.items };
|
|
846
|
+
Object.entries(message.items).forEach(([key, value]) => {
|
|
847
|
+
this.dispatchEvent(new DataStoreItemEvent(key, value));
|
|
848
|
+
});
|
|
849
|
+
this.dispatchEvent(new DataStoreItemsEvent(message.items));
|
|
850
|
+
}
|
|
851
|
+
get items() {
|
|
852
|
+
return this._items;
|
|
853
|
+
}
|
|
854
|
+
getItem(key) {
|
|
855
|
+
return this._items[key];
|
|
856
|
+
}
|
|
857
|
+
setItems(partialItems) {
|
|
858
|
+
this._items = { ...this._items, ...partialItems };
|
|
859
|
+
Object.entries(partialItems).forEach(([key, value]) => {
|
|
860
|
+
this.dispatchEvent(new DataStoreItemEvent(key, value));
|
|
861
|
+
});
|
|
862
|
+
this.dispatchEvent(new DataStoreItemsEvent(partialItems));
|
|
863
|
+
return this;
|
|
864
|
+
}
|
|
865
|
+
// Type-safe listeners
|
|
866
|
+
addEventListener(type, listener, options) {
|
|
867
|
+
__classPrivateFieldGet(this, _DataStore_eventTarget, "f").addEventListener(type, listener, options);
|
|
868
|
+
}
|
|
869
|
+
removeEventListener(type, listener, options) {
|
|
870
|
+
__classPrivateFieldGet(this, _DataStore_eventTarget, "f").removeEventListener(type, listener, options);
|
|
871
|
+
}
|
|
872
|
+
dispatchEvent(event) {
|
|
873
|
+
__classPrivateFieldGet(this, _DataStore_eventTarget, "f").dispatchEvent(event);
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
_DataStore_eventTarget = new WeakMap();
|
|
877
|
+
exports.default = DataStore;
|
|
878
|
+
class DataStoreItemEvent extends Event {
|
|
879
|
+
constructor(key, value) {
|
|
880
|
+
super('item');
|
|
881
|
+
this.key = key;
|
|
882
|
+
this.value = value;
|
|
883
|
+
this._cogsConnectionEventType = 'item';
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
exports.DataStoreItemEvent = DataStoreItemEvent;
|
|
887
|
+
class DataStoreItemsEvent extends Event {
|
|
888
|
+
constructor(items) {
|
|
889
|
+
super('items');
|
|
890
|
+
this.items = items;
|
|
891
|
+
this._cogsConnectionEventType = 'item';
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
exports.DataStoreItemsEvent = DataStoreItemsEvent;
|
|
895
|
+
|
|
896
|
+
},{}],4:[function(require,module,exports){
|
|
804
897
|
"use strict";
|
|
805
898
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
806
899
|
exports.LIVE_VIDEO_PLAYBACK_RATE = void 0;
|
|
@@ -901,7 +994,7 @@ class RtspStreamer {
|
|
|
901
994
|
}
|
|
902
995
|
exports.default = RtspStreamer;
|
|
903
996
|
|
|
904
|
-
},{"./helpers/urls":
|
|
997
|
+
},{"./helpers/urls":6,"@clockworkdog/media-stream-library-browser":13}],5:[function(require,module,exports){
|
|
905
998
|
"use strict";
|
|
906
999
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
907
1000
|
const VideoState_1 = require("./types/VideoState");
|
|
@@ -1295,7 +1388,7 @@ function setVideoElementVolume(videoElement, volume) {
|
|
|
1295
1388
|
videoElement.muted = volume === 0;
|
|
1296
1389
|
}
|
|
1297
1390
|
|
|
1298
|
-
},{"./types/VideoState":
|
|
1391
|
+
},{"./types/VideoState":12}],6:[function(require,module,exports){
|
|
1299
1392
|
"use strict";
|
|
1300
1393
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1301
1394
|
exports.preloadUrl = exports.assetUrl = exports.COGS_SERVER_PORT = exports.COGS_ASSETS_SERVER_PORT = void 0;
|
|
@@ -1319,7 +1412,7 @@ async function preloadUrl(url) {
|
|
|
1319
1412
|
}
|
|
1320
1413
|
exports.preloadUrl = preloadUrl;
|
|
1321
1414
|
|
|
1322
|
-
},{}],
|
|
1415
|
+
},{}],7:[function(require,module,exports){
|
|
1323
1416
|
"use strict";
|
|
1324
1417
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
1325
1418
|
if (k2 === undefined) k2 = k;
|
|
@@ -1371,16 +1464,17 @@ var urls_2 = require("./helpers/urls");
|
|
|
1371
1464
|
Object.defineProperty(exports, "preloadUrl", { enumerable: true, get: function () { return urls_2.preloadUrl; } });
|
|
1372
1465
|
__exportStar(require("./types/CogsPluginManifest"), exports);
|
|
1373
1466
|
exports.ManifestTypes = __importStar(require("./types/ManifestTypes"));
|
|
1467
|
+
__exportStar(require("./DataStore"), exports);
|
|
1374
1468
|
|
|
1375
|
-
},{"./AudioPlayer":1,"./CogsConnection":2,"./
|
|
1469
|
+
},{"./AudioPlayer":1,"./CogsConnection":2,"./DataStore":3,"./RtspStreamer":4,"./VideoPlayer":5,"./helpers/urls":6,"./types/AudioState":8,"./types/CogsPluginManifest":9,"./types/ManifestTypes":10,"./types/ShowPhase":11}],8:[function(require,module,exports){
|
|
1376
1470
|
"use strict";
|
|
1377
1471
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1378
1472
|
|
|
1379
|
-
},{}],
|
|
1380
|
-
arguments[4][
|
|
1381
|
-
},{"dup":
|
|
1382
|
-
arguments[4][
|
|
1383
|
-
},{"dup":
|
|
1473
|
+
},{}],9:[function(require,module,exports){
|
|
1474
|
+
arguments[4][8][0].apply(exports,arguments)
|
|
1475
|
+
},{"dup":8}],10:[function(require,module,exports){
|
|
1476
|
+
arguments[4][8][0].apply(exports,arguments)
|
|
1477
|
+
},{"dup":8}],11:[function(require,module,exports){
|
|
1384
1478
|
"use strict";
|
|
1385
1479
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1386
1480
|
var ShowPhase;
|
|
@@ -1392,7 +1486,7 @@ var ShowPhase;
|
|
|
1392
1486
|
})(ShowPhase || (ShowPhase = {}));
|
|
1393
1487
|
exports.default = ShowPhase;
|
|
1394
1488
|
|
|
1395
|
-
},{}],
|
|
1489
|
+
},{}],12:[function(require,module,exports){
|
|
1396
1490
|
"use strict";
|
|
1397
1491
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1398
1492
|
exports.ActiveVideoClipState = void 0;
|
|
@@ -1402,7 +1496,7 @@ var ActiveVideoClipState;
|
|
|
1402
1496
|
ActiveVideoClipState["Playing"] = "playing";
|
|
1403
1497
|
})(ActiveVideoClipState || (exports.ActiveVideoClipState = ActiveVideoClipState = {}));
|
|
1404
1498
|
|
|
1405
|
-
},{}],
|
|
1499
|
+
},{}],13:[function(require,module,exports){
|
|
1406
1500
|
(function (process,global,Buffer){(function (){
|
|
1407
1501
|
var fa=Object.create;var Ft=Object.defineProperty;var ca=Object.getOwnPropertyDescriptor;var la=Object.getOwnPropertyNames;var da=Object.getPrototypeOf,pa=Object.prototype.hasOwnProperty;var ha=(r,e)=>()=>(r&&(e=r(r=0)),e);var S=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),Pt=(r,e)=>{for(var t in e)Ft(r,t,{get:e[t],enumerable:!0})},si=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of la(e))!pa.call(r,i)&&i!==t&&Ft(r,i,{get:()=>e[i],enumerable:!(n=ca(e,i))||n.enumerable});return r};var C=(r,e,t)=>(t=r!=null?fa(da(r)):{},si(e||!r||!r.__esModule?Ft(t,"default",{value:r,enumerable:!0}):t,r)),ma=r=>si(Ft({},"__esModule",{value:!0}),r);var fi=S(kt=>{"use strict";c();kt.byteLength=ya;kt.toByteArray=xa;kt.fromByteArray=va;var ne=[],K=[],ga=typeof Uint8Array<"u"?Uint8Array:Array,Vr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(Fe=0,ai=Vr.length;Fe<ai;++Fe)ne[Fe]=Vr[Fe],K[Vr.charCodeAt(Fe)]=Fe;var Fe,ai;K["-".charCodeAt(0)]=62;K["_".charCodeAt(0)]=63;function ui(r){var e=r.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var t=r.indexOf("=");t===-1&&(t=e);var n=t===e?0:4-t%4;return[t,n]}function ya(r){var e=ui(r),t=e[0],n=e[1];return(t+n)*3/4-n}function ba(r,e,t){return(e+t)*3/4-t}function xa(r){var e,t=ui(r),n=t[0],i=t[1],o=new ga(ba(r,n,i)),s=0,a=i>0?n-4:n,u;for(u=0;u<a;u+=4)e=K[r.charCodeAt(u)]<<18|K[r.charCodeAt(u+1)]<<12|K[r.charCodeAt(u+2)]<<6|K[r.charCodeAt(u+3)],o[s++]=e>>16&255,o[s++]=e>>8&255,o[s++]=e&255;return i===2&&(e=K[r.charCodeAt(u)]<<2|K[r.charCodeAt(u+1)]>>4,o[s++]=e&255),i===1&&(e=K[r.charCodeAt(u)]<<10|K[r.charCodeAt(u+1)]<<4|K[r.charCodeAt(u+2)]>>2,o[s++]=e>>8&255,o[s++]=e&255),o}function _a(r){return ne[r>>18&63]+ne[r>>12&63]+ne[r>>6&63]+ne[r&63]}function wa(r,e,t){for(var n,i=[],o=e;o<t;o+=3)n=(r[o]<<16&16711680)+(r[o+1]<<8&65280)+(r[o+2]&255),i.push(_a(n));return i.join("")}function va(r){for(var e,t=r.length,n=t%3,i=[],o=16383,s=0,a=t-n;s<a;s+=o)i.push(wa(r,s,s+o>a?a:s+o));return n===1?(e=r[t-1],i.push(ne[e>>2]+ne[e<<4&63]+"==")):n===2&&(e=(r[t-2]<<8)+r[t-1],i.push(ne[e>>10]+ne[e>>4&63]+ne[e<<2&63]+"=")),i.join("")}});var ci=S(zr=>{c();zr.read=function(r,e,t,n,i){var o,s,a=i*8-n-1,u=(1<<a)-1,f=u>>1,l=-7,d=t?i-1:0,h=t?-1:1,m=r[e+d];for(d+=h,o=m&(1<<-l)-1,m>>=-l,l+=a;l>0;o=o*256+r[e+d],d+=h,l-=8);for(s=o&(1<<-l)-1,o>>=-l,l+=n;l>0;s=s*256+r[e+d],d+=h,l-=8);if(o===0)o=1-f;else{if(o===u)return s?NaN:(m?-1:1)*(1/0);s=s+Math.pow(2,n),o=o-f}return(m?-1:1)*s*Math.pow(2,o-n)};zr.write=function(r,e,t,n,i,o){var s,a,u,f=o*8-i-1,l=(1<<f)-1,d=l>>1,h=i===23?Math.pow(2,-24)-Math.pow(2,-77):0,m=n?0:o-1,b=n?1:-1,y=e<0||e===0&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(a=isNaN(e)?1:0,s=l):(s=Math.floor(Math.log(e)/Math.LN2),e*(u=Math.pow(2,-s))<1&&(s--,u*=2),s+d>=1?e+=h/u:e+=h*Math.pow(2,1-d),e*u>=2&&(s++,u/=2),s+d>=l?(a=0,s=l):s+d>=1?(a=(e*u-1)*Math.pow(2,i),s=s+d):(a=e*Math.pow(2,d-1)*Math.pow(2,i),s=0));i>=8;r[t+m]=a&255,m+=b,a/=256,i-=8);for(s=s<<i|a,f+=i;f>0;r[t+m]=s&255,m+=b,s/=256,f-=8);r[t+m-b]|=y*128}});var Xe=S(Ke=>{"use strict";c();var Yr=fi(),ze=ci(),li=typeof Symbol=="function"&&typeof Symbol.for=="function"?Symbol.for("nodejs.util.inspect.custom"):null;Ke.Buffer=p;Ke.SlowBuffer=Ba;Ke.INSPECT_MAX_BYTES=50;var Ot=2147483647;Ke.kMaxLength=Ot;p.TYPED_ARRAY_SUPPORT=Ea();!p.TYPED_ARRAY_SUPPORT&&typeof console<"u"&&typeof console.error=="function"&&console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.");function Ea(){try{let r=new Uint8Array(1),e={foo:function(){return 42}};return Object.setPrototypeOf(e,Uint8Array.prototype),Object.setPrototypeOf(r,e),r.foo()===42}catch{return!1}}Object.defineProperty(p.prototype,"parent",{enumerable:!0,get:function(){if(!!p.isBuffer(this))return this.buffer}});Object.defineProperty(p.prototype,"offset",{enumerable:!0,get:function(){if(!!p.isBuffer(this))return this.byteOffset}});function de(r){if(r>Ot)throw new RangeError('The value "'+r+'" is invalid for option "size"');let e=new Uint8Array(r);return Object.setPrototypeOf(e,p.prototype),e}function p(r,e,t){if(typeof r=="number"){if(typeof e=="string")throw new TypeError('The "string" argument must be of type string. Received type number');return Qr(r)}return mi(r,e,t)}p.poolSize=8192;function mi(r,e,t){if(typeof r=="string")return Ra(r,e);if(ArrayBuffer.isView(r))return Ta(r);if(r==null)throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof r);if(ie(r,ArrayBuffer)||r&&ie(r.buffer,ArrayBuffer)||typeof SharedArrayBuffer<"u"&&(ie(r,SharedArrayBuffer)||r&&ie(r.buffer,SharedArrayBuffer)))return Xr(r,e,t);if(typeof r=="number")throw new TypeError('The "value" argument must not be of type number. Received type number');let n=r.valueOf&&r.valueOf();if(n!=null&&n!==r)return p.from(n,e,t);let i=Ca(r);if(i)return i;if(typeof Symbol<"u"&&Symbol.toPrimitive!=null&&typeof r[Symbol.toPrimitive]=="function")return p.from(r[Symbol.toPrimitive]("string"),e,t);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof r)}p.from=function(r,e,t){return mi(r,e,t)};Object.setPrototypeOf(p.prototype,Uint8Array.prototype);Object.setPrototypeOf(p,Uint8Array);function gi(r){if(typeof r!="number")throw new TypeError('"size" argument must be of type number');if(r<0)throw new RangeError('The value "'+r+'" is invalid for option "size"')}function Sa(r,e,t){return gi(r),r<=0?de(r):e!==void 0?typeof t=="string"?de(r).fill(e,t):de(r).fill(e):de(r)}p.alloc=function(r,e,t){return Sa(r,e,t)};function Qr(r){return gi(r),de(r<0?0:Zr(r)|0)}p.allocUnsafe=function(r){return Qr(r)};p.allocUnsafeSlow=function(r){return Qr(r)};function Ra(r,e){if((typeof e!="string"||e==="")&&(e="utf8"),!p.isEncoding(e))throw new TypeError("Unknown encoding: "+e);let t=yi(r,e)|0,n=de(t),i=n.write(r,e);return i!==t&&(n=n.slice(0,i)),n}function Kr(r){let e=r.length<0?0:Zr(r.length)|0,t=de(e);for(let n=0;n<e;n+=1)t[n]=r[n]&255;return t}function Ta(r){if(ie(r,Uint8Array)){let e=new Uint8Array(r);return Xr(e.buffer,e.byteOffset,e.byteLength)}return Kr(r)}function Xr(r,e,t){if(e<0||r.byteLength<e)throw new RangeError('"offset" is outside of buffer bounds');if(r.byteLength<e+(t||0))throw new RangeError('"length" is outside of buffer bounds');let n;return e===void 0&&t===void 0?n=new Uint8Array(r):t===void 0?n=new Uint8Array(r,e):n=new Uint8Array(r,e,t),Object.setPrototypeOf(n,p.prototype),n}function Ca(r){if(p.isBuffer(r)){let e=Zr(r.length)|0,t=de(e);return t.length===0||r.copy(t,0,0,e),t}if(r.length!==void 0)return typeof r.length!="number"||tn(r.length)?de(0):Kr(r);if(r.type==="Buffer"&&Array.isArray(r.data))return Kr(r.data)}function Zr(r){if(r>=Ot)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+Ot.toString(16)+" bytes");return r|0}function Ba(r){return+r!=r&&(r=0),p.alloc(+r)}p.isBuffer=function(e){return e!=null&&e._isBuffer===!0&&e!==p.prototype};p.compare=function(e,t){if(ie(e,Uint8Array)&&(e=p.from(e,e.offset,e.byteLength)),ie(t,Uint8Array)&&(t=p.from(t,t.offset,t.byteLength)),!p.isBuffer(e)||!p.isBuffer(t))throw new TypeError('The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');if(e===t)return 0;let n=e.length,i=t.length;for(let o=0,s=Math.min(n,i);o<s;++o)if(e[o]!==t[o]){n=e[o],i=t[o];break}return n<i?-1:i<n?1:0};p.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}};p.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(e.length===0)return p.alloc(0);let n;if(t===void 0)for(t=0,n=0;n<e.length;++n)t+=e[n].length;let i=p.allocUnsafe(t),o=0;for(n=0;n<e.length;++n){let s=e[n];if(ie(s,Uint8Array))o+s.length>i.length?(p.isBuffer(s)||(s=p.from(s)),s.copy(i,o)):Uint8Array.prototype.set.call(i,s,o);else if(p.isBuffer(s))s.copy(i,o);else throw new TypeError('"list" argument must be an Array of Buffers');o+=s.length}return i};function yi(r,e){if(p.isBuffer(r))return r.length;if(ArrayBuffer.isView(r)||ie(r,ArrayBuffer))return r.byteLength;if(typeof r!="string")throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof r);let t=r.length,n=arguments.length>2&&arguments[2]===!0;if(!n&&t===0)return 0;let i=!1;for(;;)switch(e){case"ascii":case"latin1":case"binary":return t;case"utf8":case"utf-8":return Jr(r).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return t*2;case"hex":return t>>>1;case"base64":return Ti(r).length;default:if(i)return n?-1:Jr(r).length;e=(""+e).toLowerCase(),i=!0}}p.byteLength=yi;function Ma(r,e,t){let n=!1;if((e===void 0||e<0)&&(e=0),e>this.length||((t===void 0||t>this.length)&&(t=this.length),t<=0)||(t>>>=0,e>>>=0,t<=e))return"";for(r||(r="utf8");;)switch(r){case"hex":return Na(this,e,t);case"utf8":case"utf-8":return xi(this,e,t);case"ascii":return Ua(this,e,t);case"latin1":case"binary":return Da(this,e,t);case"base64":return ka(this,e,t);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Ha(this,e,t);default:if(n)throw new TypeError("Unknown encoding: "+r);r=(r+"").toLowerCase(),n=!0}}p.prototype._isBuffer=!0;function Pe(r,e,t){let n=r[e];r[e]=r[t],r[t]=n}p.prototype.swap16=function(){let e=this.length;if(e%2!==0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(let t=0;t<e;t+=2)Pe(this,t,t+1);return this};p.prototype.swap32=function(){let e=this.length;if(e%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(let t=0;t<e;t+=4)Pe(this,t,t+3),Pe(this,t+1,t+2);return this};p.prototype.swap64=function(){let e=this.length;if(e%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(let t=0;t<e;t+=8)Pe(this,t,t+7),Pe(this,t+1,t+6),Pe(this,t+2,t+5),Pe(this,t+3,t+4);return this};p.prototype.toString=function(){let e=this.length;return e===0?"":arguments.length===0?xi(this,0,e):Ma.apply(this,arguments)};p.prototype.toLocaleString=p.prototype.toString;p.prototype.equals=function(e){if(!p.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e?!0:p.compare(this,e)===0};p.prototype.inspect=function(){let e="",t=Ke.INSPECT_MAX_BYTES;return e=this.toString("hex",0,t).replace(/(.{2})/g,"$1 ").trim(),this.length>t&&(e+=" ... "),"<Buffer "+e+">"};li&&(p.prototype[li]=p.prototype.inspect);p.prototype.compare=function(e,t,n,i,o){if(ie(e,Uint8Array)&&(e=p.from(e,e.offset,e.byteLength)),!p.isBuffer(e))throw new TypeError('The "target" argument must be one of type Buffer or Uint8Array. Received type '+typeof e);if(t===void 0&&(t=0),n===void 0&&(n=e?e.length:0),i===void 0&&(i=0),o===void 0&&(o=this.length),t<0||n>e.length||i<0||o>this.length)throw new RangeError("out of range index");if(i>=o&&t>=n)return 0;if(i>=o)return-1;if(t>=n)return 1;if(t>>>=0,n>>>=0,i>>>=0,o>>>=0,this===e)return 0;let s=o-i,a=n-t,u=Math.min(s,a),f=this.slice(i,o),l=e.slice(t,n);for(let d=0;d<u;++d)if(f[d]!==l[d]){s=f[d],a=l[d];break}return s<a?-1:a<s?1:0};function bi(r,e,t,n,i){if(r.length===0)return-1;if(typeof t=="string"?(n=t,t=0):t>2147483647?t=2147483647:t<-2147483648&&(t=-2147483648),t=+t,tn(t)&&(t=i?0:r.length-1),t<0&&(t=r.length+t),t>=r.length){if(i)return-1;t=r.length-1}else if(t<0)if(i)t=0;else return-1;if(typeof e=="string"&&(e=p.from(e,n)),p.isBuffer(e))return e.length===0?-1:di(r,e,t,n,i);if(typeof e=="number")return e=e&255,typeof Uint8Array.prototype.indexOf=="function"?i?Uint8Array.prototype.indexOf.call(r,e,t):Uint8Array.prototype.lastIndexOf.call(r,e,t):di(r,[e],t,n,i);throw new TypeError("val must be string, number or Buffer")}function di(r,e,t,n,i){let o=1,s=r.length,a=e.length;if(n!==void 0&&(n=String(n).toLowerCase(),n==="ucs2"||n==="ucs-2"||n==="utf16le"||n==="utf-16le")){if(r.length<2||e.length<2)return-1;o=2,s/=2,a/=2,t/=2}function u(l,d){return o===1?l[d]:l.readUInt16BE(d*o)}let f;if(i){let l=-1;for(f=t;f<s;f++)if(u(r,f)===u(e,l===-1?0:f-l)){if(l===-1&&(l=f),f-l+1===a)return l*o}else l!==-1&&(f-=f-l),l=-1}else for(t+a>s&&(t=s-a),f=t;f>=0;f--){let l=!0;for(let d=0;d<a;d++)if(u(r,f+d)!==u(e,d)){l=!1;break}if(l)return f}return-1}p.prototype.includes=function(e,t,n){return this.indexOf(e,t,n)!==-1};p.prototype.indexOf=function(e,t,n){return bi(this,e,t,n,!0)};p.prototype.lastIndexOf=function(e,t,n){return bi(this,e,t,n,!1)};function La(r,e,t,n){t=Number(t)||0;let i=r.length-t;n?(n=Number(n),n>i&&(n=i)):n=i;let o=e.length;n>o/2&&(n=o/2);let s;for(s=0;s<n;++s){let a=parseInt(e.substr(s*2,2),16);if(tn(a))return s;r[t+s]=a}return s}function Ia(r,e,t,n){return Ut(Jr(e,r.length-t),r,t,n)}function Aa(r,e,t,n){return Ut($a(e),r,t,n)}function Fa(r,e,t,n){return Ut(Ti(e),r,t,n)}function Pa(r,e,t,n){return Ut(Ga(e,r.length-t),r,t,n)}p.prototype.write=function(e,t,n,i){if(t===void 0)i="utf8",n=this.length,t=0;else if(n===void 0&&typeof t=="string")i=t,n=this.length,t=0;else if(isFinite(t))t=t>>>0,isFinite(n)?(n=n>>>0,i===void 0&&(i="utf8")):(i=n,n=void 0);else throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");let o=this.length-t;if((n===void 0||n>o)&&(n=o),e.length>0&&(n<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");let s=!1;for(;;)switch(i){case"hex":return La(this,e,t,n);case"utf8":case"utf-8":return Ia(this,e,t,n);case"ascii":case"latin1":case"binary":return Aa(this,e,t,n);case"base64":return Fa(this,e,t,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Pa(this,e,t,n);default:if(s)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),s=!0}};p.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function ka(r,e,t){return e===0&&t===r.length?Yr.fromByteArray(r):Yr.fromByteArray(r.slice(e,t))}function xi(r,e,t){t=Math.min(r.length,t);let n=[],i=e;for(;i<t;){let o=r[i],s=null,a=o>239?4:o>223?3:o>191?2:1;if(i+a<=t){let u,f,l,d;switch(a){case 1:o<128&&(s=o);break;case 2:u=r[i+1],(u&192)===128&&(d=(o&31)<<6|u&63,d>127&&(s=d));break;case 3:u=r[i+1],f=r[i+2],(u&192)===128&&(f&192)===128&&(d=(o&15)<<12|(u&63)<<6|f&63,d>2047&&(d<55296||d>57343)&&(s=d));break;case 4:u=r[i+1],f=r[i+2],l=r[i+3],(u&192)===128&&(f&192)===128&&(l&192)===128&&(d=(o&15)<<18|(u&63)<<12|(f&63)<<6|l&63,d>65535&&d<1114112&&(s=d))}}s===null?(s=65533,a=1):s>65535&&(s-=65536,n.push(s>>>10&1023|55296),s=56320|s&1023),n.push(s),i+=a}return Oa(n)}var pi=4096;function Oa(r){let e=r.length;if(e<=pi)return String.fromCharCode.apply(String,r);let t="",n=0;for(;n<e;)t+=String.fromCharCode.apply(String,r.slice(n,n+=pi));return t}function Ua(r,e,t){let n="";t=Math.min(r.length,t);for(let i=e;i<t;++i)n+=String.fromCharCode(r[i]&127);return n}function Da(r,e,t){let n="";t=Math.min(r.length,t);for(let i=e;i<t;++i)n+=String.fromCharCode(r[i]);return n}function Na(r,e,t){let n=r.length;(!e||e<0)&&(e=0),(!t||t<0||t>n)&&(t=n);let i="";for(let o=e;o<t;++o)i+=Va[r[o]];return i}function Ha(r,e,t){let n=r.slice(e,t),i="";for(let o=0;o<n.length-1;o+=2)i+=String.fromCharCode(n[o]+n[o+1]*256);return i}p.prototype.slice=function(e,t){let n=this.length;e=~~e,t=t===void 0?n:~~t,e<0?(e+=n,e<0&&(e=0)):e>n&&(e=n),t<0?(t+=n,t<0&&(t=0)):t>n&&(t=n),t<e&&(t=e);let i=this.subarray(e,t);return Object.setPrototypeOf(i,p.prototype),i};function D(r,e,t){if(r%1!==0||r<0)throw new RangeError("offset is not uint");if(r+e>t)throw new RangeError("Trying to access beyond buffer length")}p.prototype.readUintLE=p.prototype.readUIntLE=function(e,t,n){e=e>>>0,t=t>>>0,n||D(e,t,this.length);let i=this[e],o=1,s=0;for(;++s<t&&(o*=256);)i+=this[e+s]*o;return i};p.prototype.readUintBE=p.prototype.readUIntBE=function(e,t,n){e=e>>>0,t=t>>>0,n||D(e,t,this.length);let i=this[e+--t],o=1;for(;t>0&&(o*=256);)i+=this[e+--t]*o;return i};p.prototype.readUint8=p.prototype.readUInt8=function(e,t){return e=e>>>0,t||D(e,1,this.length),this[e]};p.prototype.readUint16LE=p.prototype.readUInt16LE=function(e,t){return e=e>>>0,t||D(e,2,this.length),this[e]|this[e+1]<<8};p.prototype.readUint16BE=p.prototype.readUInt16BE=function(e,t){return e=e>>>0,t||D(e,2,this.length),this[e]<<8|this[e+1]};p.prototype.readUint32LE=p.prototype.readUInt32LE=function(e,t){return e=e>>>0,t||D(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+this[e+3]*16777216};p.prototype.readUint32BE=p.prototype.readUInt32BE=function(e,t){return e=e>>>0,t||D(e,4,this.length),this[e]*16777216+(this[e+1]<<16|this[e+2]<<8|this[e+3])};p.prototype.readBigUInt64LE=be(function(e){e=e>>>0,Ye(e,"offset");let t=this[e],n=this[e+7];(t===void 0||n===void 0)&&wt(e,this.length-8);let i=t+this[++e]*2**8+this[++e]*2**16+this[++e]*2**24,o=this[++e]+this[++e]*2**8+this[++e]*2**16+n*2**24;return BigInt(i)+(BigInt(o)<<BigInt(32))});p.prototype.readBigUInt64BE=be(function(e){e=e>>>0,Ye(e,"offset");let t=this[e],n=this[e+7];(t===void 0||n===void 0)&&wt(e,this.length-8);let i=t*2**24+this[++e]*2**16+this[++e]*2**8+this[++e],o=this[++e]*2**24+this[++e]*2**16+this[++e]*2**8+n;return(BigInt(i)<<BigInt(32))+BigInt(o)});p.prototype.readIntLE=function(e,t,n){e=e>>>0,t=t>>>0,n||D(e,t,this.length);let i=this[e],o=1,s=0;for(;++s<t&&(o*=256);)i+=this[e+s]*o;return o*=128,i>=o&&(i-=Math.pow(2,8*t)),i};p.prototype.readIntBE=function(e,t,n){e=e>>>0,t=t>>>0,n||D(e,t,this.length);let i=t,o=1,s=this[e+--i];for(;i>0&&(o*=256);)s+=this[e+--i]*o;return o*=128,s>=o&&(s-=Math.pow(2,8*t)),s};p.prototype.readInt8=function(e,t){return e=e>>>0,t||D(e,1,this.length),this[e]&128?(255-this[e]+1)*-1:this[e]};p.prototype.readInt16LE=function(e,t){e=e>>>0,t||D(e,2,this.length);let n=this[e]|this[e+1]<<8;return n&32768?n|4294901760:n};p.prototype.readInt16BE=function(e,t){e=e>>>0,t||D(e,2,this.length);let n=this[e+1]|this[e]<<8;return n&32768?n|4294901760:n};p.prototype.readInt32LE=function(e,t){return e=e>>>0,t||D(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24};p.prototype.readInt32BE=function(e,t){return e=e>>>0,t||D(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]};p.prototype.readBigInt64LE=be(function(e){e=e>>>0,Ye(e,"offset");let t=this[e],n=this[e+7];(t===void 0||n===void 0)&&wt(e,this.length-8);let i=this[e+4]+this[e+5]*2**8+this[e+6]*2**16+(n<<24);return(BigInt(i)<<BigInt(32))+BigInt(t+this[++e]*2**8+this[++e]*2**16+this[++e]*2**24)});p.prototype.readBigInt64BE=be(function(e){e=e>>>0,Ye(e,"offset");let t=this[e],n=this[e+7];(t===void 0||n===void 0)&&wt(e,this.length-8);let i=(t<<24)+this[++e]*2**16+this[++e]*2**8+this[++e];return(BigInt(i)<<BigInt(32))+BigInt(this[++e]*2**24+this[++e]*2**16+this[++e]*2**8+n)});p.prototype.readFloatLE=function(e,t){return e=e>>>0,t||D(e,4,this.length),ze.read(this,e,!0,23,4)};p.prototype.readFloatBE=function(e,t){return e=e>>>0,t||D(e,4,this.length),ze.read(this,e,!1,23,4)};p.prototype.readDoubleLE=function(e,t){return e=e>>>0,t||D(e,8,this.length),ze.read(this,e,!0,52,8)};p.prototype.readDoubleBE=function(e,t){return e=e>>>0,t||D(e,8,this.length),ze.read(this,e,!1,52,8)};function W(r,e,t,n,i,o){if(!p.isBuffer(r))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||e<o)throw new RangeError('"value" argument is out of bounds');if(t+n>r.length)throw new RangeError("Index out of range")}p.prototype.writeUintLE=p.prototype.writeUIntLE=function(e,t,n,i){if(e=+e,t=t>>>0,n=n>>>0,!i){let a=Math.pow(2,8*n)-1;W(this,e,t,n,a,0)}let o=1,s=0;for(this[t]=e&255;++s<n&&(o*=256);)this[t+s]=e/o&255;return t+n};p.prototype.writeUintBE=p.prototype.writeUIntBE=function(e,t,n,i){if(e=+e,t=t>>>0,n=n>>>0,!i){let a=Math.pow(2,8*n)-1;W(this,e,t,n,a,0)}let o=n-1,s=1;for(this[t+o]=e&255;--o>=0&&(s*=256);)this[t+o]=e/s&255;return t+n};p.prototype.writeUint8=p.prototype.writeUInt8=function(e,t,n){return e=+e,t=t>>>0,n||W(this,e,t,1,255,0),this[t]=e&255,t+1};p.prototype.writeUint16LE=p.prototype.writeUInt16LE=function(e,t,n){return e=+e,t=t>>>0,n||W(this,e,t,2,65535,0),this[t]=e&255,this[t+1]=e>>>8,t+2};p.prototype.writeUint16BE=p.prototype.writeUInt16BE=function(e,t,n){return e=+e,t=t>>>0,n||W(this,e,t,2,65535,0),this[t]=e>>>8,this[t+1]=e&255,t+2};p.prototype.writeUint32LE=p.prototype.writeUInt32LE=function(e,t,n){return e=+e,t=t>>>0,n||W(this,e,t,4,4294967295,0),this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=e&255,t+4};p.prototype.writeUint32BE=p.prototype.writeUInt32BE=function(e,t,n){return e=+e,t=t>>>0,n||W(this,e,t,4,4294967295,0),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=e&255,t+4};function _i(r,e,t,n,i){Ri(e,n,i,r,t,7);let o=Number(e&BigInt(4294967295));r[t++]=o,o=o>>8,r[t++]=o,o=o>>8,r[t++]=o,o=o>>8,r[t++]=o;let s=Number(e>>BigInt(32)&BigInt(4294967295));return r[t++]=s,s=s>>8,r[t++]=s,s=s>>8,r[t++]=s,s=s>>8,r[t++]=s,t}function wi(r,e,t,n,i){Ri(e,n,i,r,t,7);let o=Number(e&BigInt(4294967295));r[t+7]=o,o=o>>8,r[t+6]=o,o=o>>8,r[t+5]=o,o=o>>8,r[t+4]=o;let s=Number(e>>BigInt(32)&BigInt(4294967295));return r[t+3]=s,s=s>>8,r[t+2]=s,s=s>>8,r[t+1]=s,s=s>>8,r[t]=s,t+8}p.prototype.writeBigUInt64LE=be(function(e,t=0){return _i(this,e,t,BigInt(0),BigInt("0xffffffffffffffff"))});p.prototype.writeBigUInt64BE=be(function(e,t=0){return wi(this,e,t,BigInt(0),BigInt("0xffffffffffffffff"))});p.prototype.writeIntLE=function(e,t,n,i){if(e=+e,t=t>>>0,!i){let u=Math.pow(2,8*n-1);W(this,e,t,n,u-1,-u)}let o=0,s=1,a=0;for(this[t]=e&255;++o<n&&(s*=256);)e<0&&a===0&&this[t+o-1]!==0&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+n};p.prototype.writeIntBE=function(e,t,n,i){if(e=+e,t=t>>>0,!i){let u=Math.pow(2,8*n-1);W(this,e,t,n,u-1,-u)}let o=n-1,s=1,a=0;for(this[t+o]=e&255;--o>=0&&(s*=256);)e<0&&a===0&&this[t+o+1]!==0&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+n};p.prototype.writeInt8=function(e,t,n){return e=+e,t=t>>>0,n||W(this,e,t,1,127,-128),e<0&&(e=255+e+1),this[t]=e&255,t+1};p.prototype.writeInt16LE=function(e,t,n){return e=+e,t=t>>>0,n||W(this,e,t,2,32767,-32768),this[t]=e&255,this[t+1]=e>>>8,t+2};p.prototype.writeInt16BE=function(e,t,n){return e=+e,t=t>>>0,n||W(this,e,t,2,32767,-32768),this[t]=e>>>8,this[t+1]=e&255,t+2};p.prototype.writeInt32LE=function(e,t,n){return e=+e,t=t>>>0,n||W(this,e,t,4,2147483647,-2147483648),this[t]=e&255,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24,t+4};p.prototype.writeInt32BE=function(e,t,n){return e=+e,t=t>>>0,n||W(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=e&255,t+4};p.prototype.writeBigInt64LE=be(function(e,t=0){return _i(this,e,t,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});p.prototype.writeBigInt64BE=be(function(e,t=0){return wi(this,e,t,-BigInt("0x8000000000000000"),BigInt("0x7fffffffffffffff"))});function vi(r,e,t,n,i,o){if(t+n>r.length)throw new RangeError("Index out of range");if(t<0)throw new RangeError("Index out of range")}function Ei(r,e,t,n,i){return e=+e,t=t>>>0,i||vi(r,e,t,4,34028234663852886e22,-34028234663852886e22),ze.write(r,e,t,n,23,4),t+4}p.prototype.writeFloatLE=function(e,t,n){return Ei(this,e,t,!0,n)};p.prototype.writeFloatBE=function(e,t,n){return Ei(this,e,t,!1,n)};function Si(r,e,t,n,i){return e=+e,t=t>>>0,i||vi(r,e,t,8,17976931348623157e292,-17976931348623157e292),ze.write(r,e,t,n,52,8),t+8}p.prototype.writeDoubleLE=function(e,t,n){return Si(this,e,t,!0,n)};p.prototype.writeDoubleBE=function(e,t,n){return Si(this,e,t,!1,n)};p.prototype.copy=function(e,t,n,i){if(!p.isBuffer(e))throw new TypeError("argument should be a Buffer");if(n||(n=0),!i&&i!==0&&(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i<n&&(i=n),i===n||e.length===0||this.length===0)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(n<0||n>=this.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t<i-n&&(i=e.length-t+n);let o=i-n;return this===e&&typeof Uint8Array.prototype.copyWithin=="function"?this.copyWithin(t,n,i):Uint8Array.prototype.set.call(e,this.subarray(n,i),t),o};p.prototype.fill=function(e,t,n,i){if(typeof e=="string"){if(typeof t=="string"?(i=t,t=0,n=this.length):typeof n=="string"&&(i=n,n=this.length),i!==void 0&&typeof i!="string")throw new TypeError("encoding must be a string");if(typeof i=="string"&&!p.isEncoding(i))throw new TypeError("Unknown encoding: "+i);if(e.length===1){let s=e.charCodeAt(0);(i==="utf8"&&s<128||i==="latin1")&&(e=s)}}else typeof e=="number"?e=e&255:typeof e=="boolean"&&(e=Number(e));if(t<0||this.length<t||this.length<n)throw new RangeError("Out of range index");if(n<=t)return this;t=t>>>0,n=n===void 0?this.length:n>>>0,e||(e=0);let o;if(typeof e=="number")for(o=t;o<n;++o)this[o]=e;else{let s=p.isBuffer(e)?e:p.from(e,i),a=s.length;if(a===0)throw new TypeError('The value "'+e+'" is invalid for argument "value"');for(o=0;o<n-t;++o)this[o+t]=s[o%a]}return this};var Ve={};function en(r,e,t){Ve[r]=class extends t{constructor(){super(),Object.defineProperty(this,"message",{value:e.apply(this,arguments),writable:!0,configurable:!0}),this.name=`${this.name} [${r}]`,this.stack,delete this.name}get code(){return r}set code(i){Object.defineProperty(this,"code",{configurable:!0,enumerable:!0,value:i,writable:!0})}toString(){return`${this.name} [${r}]: ${this.message}`}}}en("ERR_BUFFER_OUT_OF_BOUNDS",function(r){return r?`${r} is outside of buffer bounds`:"Attempt to access memory outside buffer bounds"},RangeError);en("ERR_INVALID_ARG_TYPE",function(r,e){return`The "${r}" argument must be of type number. Received type ${typeof e}`},TypeError);en("ERR_OUT_OF_RANGE",function(r,e,t){let n=`The value of "${r}" is out of range.`,i=t;return Number.isInteger(t)&&Math.abs(t)>2**32?i=hi(String(t)):typeof t=="bigint"&&(i=String(t),(t>BigInt(2)**BigInt(32)||t<-(BigInt(2)**BigInt(32)))&&(i=hi(i)),i+="n"),n+=` It must be ${e}. Received ${i}`,n},RangeError);function hi(r){let e="",t=r.length,n=r[0]==="-"?1:0;for(;t>=n+4;t-=3)e=`_${r.slice(t-3,t)}${e}`;return`${r.slice(0,t)}${e}`}function qa(r,e,t){Ye(e,"offset"),(r[e]===void 0||r[e+t]===void 0)&&wt(e,r.length-(t+1))}function Ri(r,e,t,n,i,o){if(r>t||r<e){let s=typeof e=="bigint"?"n":"",a;throw o>3?e===0||e===BigInt(0)?a=`>= 0${s} and < 2${s} ** ${(o+1)*8}${s}`:a=`>= -(2${s} ** ${(o+1)*8-1}${s}) and < 2 ** ${(o+1)*8-1}${s}`:a=`>= ${e}${s} and <= ${t}${s}`,new Ve.ERR_OUT_OF_RANGE("value",a,r)}qa(n,i,o)}function Ye(r,e){if(typeof r!="number")throw new Ve.ERR_INVALID_ARG_TYPE(e,"number",r)}function wt(r,e,t){throw Math.floor(r)!==r?(Ye(r,t),new Ve.ERR_OUT_OF_RANGE(t||"offset","an integer",r)):e<0?new Ve.ERR_BUFFER_OUT_OF_BOUNDS:new Ve.ERR_OUT_OF_RANGE(t||"offset",`>= ${t?1:0} and <= ${e}`,r)}var ja=/[^+/0-9A-Za-z-_]/g;function Wa(r){if(r=r.split("=")[0],r=r.trim().replace(ja,""),r.length<2)return"";for(;r.length%4!==0;)r=r+"=";return r}function Jr(r,e){e=e||1/0;let t,n=r.length,i=null,o=[];for(let s=0;s<n;++s){if(t=r.charCodeAt(s),t>55295&&t<57344){if(!i){if(t>56319){(e-=3)>-1&&o.push(239,191,189);continue}else if(s+1===n){(e-=3)>-1&&o.push(239,191,189);continue}i=t;continue}if(t<56320){(e-=3)>-1&&o.push(239,191,189),i=t;continue}t=(i-55296<<10|t-56320)+65536}else i&&(e-=3)>-1&&o.push(239,191,189);if(i=null,t<128){if((e-=1)<0)break;o.push(t)}else if(t<2048){if((e-=2)<0)break;o.push(t>>6|192,t&63|128)}else if(t<65536){if((e-=3)<0)break;o.push(t>>12|224,t>>6&63|128,t&63|128)}else if(t<1114112){if((e-=4)<0)break;o.push(t>>18|240,t>>12&63|128,t>>6&63|128,t&63|128)}else throw new Error("Invalid code point")}return o}function $a(r){let e=[];for(let t=0;t<r.length;++t)e.push(r.charCodeAt(t)&255);return e}function Ga(r,e){let t,n,i,o=[];for(let s=0;s<r.length&&!((e-=2)<0);++s)t=r.charCodeAt(s),n=t>>8,i=t%256,o.push(i),o.push(n);return o}function Ti(r){return Yr.toByteArray(Wa(r))}function Ut(r,e,t,n){let i;for(i=0;i<n&&!(i+t>=e.length||i>=r.length);++i)e[i+t]=r[i];return i}function ie(r,e){return r instanceof e||r!=null&&r.constructor!=null&&r.constructor.name!=null&&r.constructor.name===e.name}function tn(r){return r!==r}var Va=function(){let r="0123456789abcdef",e=new Array(256);for(let t=0;t<16;++t){let n=t*16;for(let i=0;i<16;++i)e[n+i]=r[t]+r[i]}return e}();function be(r){return typeof BigInt>"u"?za:r}function za(){throw new Error("BigInt not supported")}});var Ii=S((cl,Li)=>{c();var P=Li.exports={},oe,se;function rn(){throw new Error("setTimeout has not been defined")}function nn(){throw new Error("clearTimeout has not been defined")}(function(){try{typeof setTimeout=="function"?oe=setTimeout:oe=rn}catch{oe=rn}try{typeof clearTimeout=="function"?se=clearTimeout:se=nn}catch{se=nn}})();function Ci(r){if(oe===setTimeout)return setTimeout(r,0);if((oe===rn||!oe)&&setTimeout)return oe=setTimeout,setTimeout(r,0);try{return oe(r,0)}catch{try{return oe.call(null,r,0)}catch{return oe.call(this,r,0)}}}function Ya(r){if(se===clearTimeout)return clearTimeout(r);if((se===nn||!se)&&clearTimeout)return se=clearTimeout,clearTimeout(r);try{return se(r)}catch{try{return se.call(null,r)}catch{return se.call(this,r)}}}var pe=[],Je=!1,ke,Dt=-1;function Ka(){!Je||!ke||(Je=!1,ke.length?pe=ke.concat(pe):Dt=-1,pe.length&&Bi())}function Bi(){if(!Je){var r=Ci(Ka);Je=!0;for(var e=pe.length;e;){for(ke=pe,pe=[];++Dt<e;)ke&&ke[Dt].run();Dt=-1,e=pe.length}ke=null,Je=!1,Ya(r)}}P.nextTick=function(r){var e=new Array(arguments.length-1);if(arguments.length>1)for(var t=1;t<arguments.length;t++)e[t-1]=arguments[t];pe.push(new Mi(r,e)),pe.length===1&&!Je&&Ci(Bi)};function Mi(r,e){this.fun=r,this.array=e}Mi.prototype.run=function(){this.fun.apply(null,this.array)};P.title="browser";P.browser=!0;P.env={};P.argv=[];P.version="";P.versions={};function he(){}P.on=he;P.addListener=he;P.once=he;P.off=he;P.removeListener=he;P.removeAllListeners=he;P.emit=he;P.prependListener=he;P.prependOnceListener=he;P.listeners=function(r){return[]};P.binding=function(r){throw new Error("process.binding is not supported")};P.cwd=function(){return"/"};P.chdir=function(r){throw new Error("process.chdir is not supported")};P.umask=function(){return 0}});var Ai,Xa,c=ha(()=>{Ai=C(Xe()),Xa=C(Ii());window.Buffer=Ai.Buffer;window.process=Xa});var ji=S((ll,on)=>{"use strict";c();var Qe=typeof Reflect=="object"?Reflect:null,Fi=Qe&&typeof Qe.apply=="function"?Qe.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)},Nt;Qe&&typeof Qe.ownKeys=="function"?Nt=Qe.ownKeys:Object.getOwnPropertySymbols?Nt=function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:Nt=function(e){return Object.getOwnPropertyNames(e)};function Ja(r){console&&console.warn&&console.warn(r)}var ki=Number.isNaN||function(e){return e!==e};function B(){B.init.call(this)}on.exports=B;on.exports.once=tu;B.EventEmitter=B;B.prototype._events=void 0;B.prototype._eventsCount=0;B.prototype._maxListeners=void 0;var Pi=10;function Ht(r){if(typeof r!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof r)}Object.defineProperty(B,"defaultMaxListeners",{enumerable:!0,get:function(){return Pi},set:function(r){if(typeof r!="number"||r<0||ki(r))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+r+".");Pi=r}});B.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};B.prototype.setMaxListeners=function(e){if(typeof e!="number"||e<0||ki(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this};function Oi(r){return r._maxListeners===void 0?B.defaultMaxListeners:r._maxListeners}B.prototype.getMaxListeners=function(){return Oi(this)};B.prototype.emit=function(e){for(var t=[],n=1;n<arguments.length;n++)t.push(arguments[n]);var i=e==="error",o=this._events;if(o!==void 0)i=i&&o.error===void 0;else if(!i)return!1;if(i){var s;if(t.length>0&&(s=t[0]),s instanceof Error)throw s;var a=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw a.context=s,a}var u=o[e];if(u===void 0)return!1;if(typeof u=="function")Fi(u,this,t);else for(var f=u.length,l=qi(u,f),n=0;n<f;++n)Fi(l[n],this,t);return!0};function Ui(r,e,t,n){var i,o,s;if(Ht(t),o=r._events,o===void 0?(o=r._events=Object.create(null),r._eventsCount=0):(o.newListener!==void 0&&(r.emit("newListener",e,t.listener?t.listener:t),o=r._events),s=o[e]),s===void 0)s=o[e]=t,++r._eventsCount;else if(typeof s=="function"?s=o[e]=n?[t,s]:[s,t]:n?s.unshift(t):s.push(t),i=Oi(r),i>0&&s.length>i&&!s.warned){s.warned=!0;var a=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(e)+" listeners added. Use emitter.setMaxListeners() to increase limit");a.name="MaxListenersExceededWarning",a.emitter=r,a.type=e,a.count=s.length,Ja(a)}return r}B.prototype.addListener=function(e,t){return Ui(this,e,t,!1)};B.prototype.on=B.prototype.addListener;B.prototype.prependListener=function(e,t){return Ui(this,e,t,!0)};function Qa(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function Di(r,e,t){var n={fired:!1,wrapFn:void 0,target:r,type:e,listener:t},i=Qa.bind(n);return i.listener=t,n.wrapFn=i,i}B.prototype.once=function(e,t){return Ht(t),this.on(e,Di(this,e,t)),this};B.prototype.prependOnceListener=function(e,t){return Ht(t),this.prependListener(e,Di(this,e,t)),this};B.prototype.removeListener=function(e,t){var n,i,o,s,a;if(Ht(t),i=this._events,i===void 0)return this;if(n=i[e],n===void 0)return this;if(n===t||n.listener===t)--this._eventsCount===0?this._events=Object.create(null):(delete i[e],i.removeListener&&this.emit("removeListener",e,n.listener||t));else if(typeof n!="function"){for(o=-1,s=n.length-1;s>=0;s--)if(n[s]===t||n[s].listener===t){a=n[s].listener,o=s;break}if(o<0)return this;o===0?n.shift():Za(n,o),n.length===1&&(i[e]=n[0]),i.removeListener!==void 0&&this.emit("removeListener",e,a||t)}return this};B.prototype.off=B.prototype.removeListener;B.prototype.removeAllListeners=function(e){var t,n,i;if(n=this._events,n===void 0)return this;if(n.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):n[e]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete n[e]),this;if(arguments.length===0){var o=Object.keys(n),s;for(i=0;i<o.length;++i)s=o[i],s!=="removeListener"&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(t=n[e],typeof t=="function")this.removeListener(e,t);else if(t!==void 0)for(i=t.length-1;i>=0;i--)this.removeListener(e,t[i]);return this};function Ni(r,e,t){var n=r._events;if(n===void 0)return[];var i=n[e];return i===void 0?[]:typeof i=="function"?t?[i.listener||i]:[i]:t?eu(i):qi(i,i.length)}B.prototype.listeners=function(e){return Ni(this,e,!0)};B.prototype.rawListeners=function(e){return Ni(this,e,!1)};B.listenerCount=function(r,e){return typeof r.listenerCount=="function"?r.listenerCount(e):Hi.call(r,e)};B.prototype.listenerCount=Hi;function Hi(r){var e=this._events;if(e!==void 0){var t=e[r];if(typeof t=="function")return 1;if(t!==void 0)return t.length}return 0}B.prototype.eventNames=function(){return this._eventsCount>0?Nt(this._events):[]};function qi(r,e){for(var t=new Array(e),n=0;n<e;++n)t[n]=r[n];return t}function Za(r,e){for(;e+1<r.length;e++)r[e]=r[e+1];r.pop()}function eu(r){for(var e=new Array(r.length),t=0;t<e.length;++t)e[t]=r[t].listener||r[t];return e}function tu(r,e){return new Promise(function(t,n){function i(){o!==void 0&&r.removeListener("error",o),t([].slice.call(arguments))}var o;e!=="error"&&(o=function(a){r.removeListener(e,i),n(a)},r.once("error",o)),r.once(e,i)})}});var Oe=S((dl,sn)=>{c();typeof Object.create=="function"?sn.exports=function(e,t){t&&(e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:sn.exports=function(e,t){if(t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}}});var un=S((pl,an)=>{"use strict";c();var Ze=typeof Reflect=="object"?Reflect:null,Wi=Ze&&typeof Ze.apply=="function"?Ze.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)},qt;Ze&&typeof Ze.ownKeys=="function"?qt=Ze.ownKeys:Object.getOwnPropertySymbols?qt=function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:qt=function(e){return Object.getOwnPropertyNames(e)};function ru(r){console&&console.warn&&console.warn(r)}var Gi=Number.isNaN||function(e){return e!==e};function M(){M.init.call(this)}an.exports=M;an.exports.once=su;M.EventEmitter=M;M.prototype._events=void 0;M.prototype._eventsCount=0;M.prototype._maxListeners=void 0;var $i=10;function jt(r){if(typeof r!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof r)}Object.defineProperty(M,"defaultMaxListeners",{enumerable:!0,get:function(){return $i},set:function(r){if(typeof r!="number"||r<0||Gi(r))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+r+".");$i=r}});M.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0};M.prototype.setMaxListeners=function(e){if(typeof e!="number"||e<0||Gi(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this};function Vi(r){return r._maxListeners===void 0?M.defaultMaxListeners:r._maxListeners}M.prototype.getMaxListeners=function(){return Vi(this)};M.prototype.emit=function(e){for(var t=[],n=1;n<arguments.length;n++)t.push(arguments[n]);var i=e==="error",o=this._events;if(o!==void 0)i=i&&o.error===void 0;else if(!i)return!1;if(i){var s;if(t.length>0&&(s=t[0]),s instanceof Error)throw s;var a=new Error("Unhandled error."+(s?" ("+s.message+")":""));throw a.context=s,a}var u=o[e];if(u===void 0)return!1;if(typeof u=="function")Wi(u,this,t);else for(var f=u.length,l=Ji(u,f),n=0;n<f;++n)Wi(l[n],this,t);return!0};function zi(r,e,t,n){var i,o,s;if(jt(t),o=r._events,o===void 0?(o=r._events=Object.create(null),r._eventsCount=0):(o.newListener!==void 0&&(r.emit("newListener",e,t.listener?t.listener:t),o=r._events),s=o[e]),s===void 0)s=o[e]=t,++r._eventsCount;else if(typeof s=="function"?s=o[e]=n?[t,s]:[s,t]:n?s.unshift(t):s.push(t),i=Vi(r),i>0&&s.length>i&&!s.warned){s.warned=!0;var a=new Error("Possible EventEmitter memory leak detected. "+s.length+" "+String(e)+" listeners added. Use emitter.setMaxListeners() to increase limit");a.name="MaxListenersExceededWarning",a.emitter=r,a.type=e,a.count=s.length,ru(a)}return r}M.prototype.addListener=function(e,t){return zi(this,e,t,!1)};M.prototype.on=M.prototype.addListener;M.prototype.prependListener=function(e,t){return zi(this,e,t,!0)};function nu(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function Yi(r,e,t){var n={fired:!1,wrapFn:void 0,target:r,type:e,listener:t},i=nu.bind(n);return i.listener=t,n.wrapFn=i,i}M.prototype.once=function(e,t){return jt(t),this.on(e,Yi(this,e,t)),this};M.prototype.prependOnceListener=function(e,t){return jt(t),this.prependListener(e,Yi(this,e,t)),this};M.prototype.removeListener=function(e,t){var n,i,o,s,a;if(jt(t),i=this._events,i===void 0)return this;if(n=i[e],n===void 0)return this;if(n===t||n.listener===t)--this._eventsCount===0?this._events=Object.create(null):(delete i[e],i.removeListener&&this.emit("removeListener",e,n.listener||t));else if(typeof n!="function"){for(o=-1,s=n.length-1;s>=0;s--)if(n[s]===t||n[s].listener===t){a=n[s].listener,o=s;break}if(o<0)return this;o===0?n.shift():iu(n,o),n.length===1&&(i[e]=n[0]),i.removeListener!==void 0&&this.emit("removeListener",e,a||t)}return this};M.prototype.off=M.prototype.removeListener;M.prototype.removeAllListeners=function(e){var t,n,i;if(n=this._events,n===void 0)return this;if(n.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):n[e]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete n[e]),this;if(arguments.length===0){var o=Object.keys(n),s;for(i=0;i<o.length;++i)s=o[i],s!=="removeListener"&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(t=n[e],typeof t=="function")this.removeListener(e,t);else if(t!==void 0)for(i=t.length-1;i>=0;i--)this.removeListener(e,t[i]);return this};function Ki(r,e,t){var n=r._events;if(n===void 0)return[];var i=n[e];return i===void 0?[]:typeof i=="function"?t?[i.listener||i]:[i]:t?ou(i):Ji(i,i.length)}M.prototype.listeners=function(e){return Ki(this,e,!0)};M.prototype.rawListeners=function(e){return Ki(this,e,!1)};M.listenerCount=function(r,e){return typeof r.listenerCount=="function"?r.listenerCount(e):Xi.call(r,e)};M.prototype.listenerCount=Xi;function Xi(r){var e=this._events;if(e!==void 0){var t=e[r];if(typeof t=="function")return 1;if(t!==void 0)return t.length}return 0}M.prototype.eventNames=function(){return this._eventsCount>0?qt(this._events):[]};function Ji(r,e){for(var t=new Array(e),n=0;n<e;++n)t[n]=r[n];return t}function iu(r,e){for(;e+1<r.length;e++)r[e]=r[e+1];r.pop()}function ou(r){for(var e=new Array(r.length),t=0;t<e.length;++t)e[t]=r[t].listener||r[t];return e}function su(r,e){return new Promise(function(t,n){function i(){o!==void 0&&r.removeListener("error",o),t([].slice.call(arguments))}var o;e!=="error"&&(o=function(a){r.removeListener(e,i),n(a)},r.once("error",o)),r.once(e,i)})}});var fn=S((hl,Qi)=>{c();Qi.exports=un().EventEmitter});var cn=S(()=>{c()});var ro=S((yl,to)=>{"use strict";c();function Zi(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(r);e&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(r,i).enumerable})),t.push.apply(t,n)}return t}function au(r){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?arguments[e]:{};e%2?Zi(Object(t),!0).forEach(function(n){uu(r,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(t)):Zi(Object(t)).forEach(function(n){Object.defineProperty(r,n,Object.getOwnPropertyDescriptor(t,n))})}return r}function uu(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}function fu(r,e){if(!(r instanceof e))throw new TypeError("Cannot call a class as a function")}function eo(r,e){for(var t=0;t<e.length;t++){var n=e[t];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(r,n.key,n)}}function cu(r,e,t){return e&&eo(r.prototype,e),t&&eo(r,t),r}var lu=Xe(),Wt=lu.Buffer,du=cn(),ln=du.inspect,pu=ln&&ln.custom||"inspect";function hu(r,e,t){Wt.prototype.copy.call(r,e,t)}to.exports=function(){function r(){fu(this,r),this.head=null,this.tail=null,this.length=0}return cu(r,[{key:"push",value:function(t){var n={data:t,next:null};this.length>0?this.tail.next=n:this.head=n,this.tail=n,++this.length}},{key:"unshift",value:function(t){var n={data:t,next:this.head};this.length===0&&(this.tail=n),this.head=n,++this.length}},{key:"shift",value:function(){if(this.length!==0){var t=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,t}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(t){if(this.length===0)return"";for(var n=this.head,i=""+n.data;n=n.next;)i+=t+n.data;return i}},{key:"concat",value:function(t){if(this.length===0)return Wt.alloc(0);for(var n=Wt.allocUnsafe(t>>>0),i=this.head,o=0;i;)hu(i.data,n,o),o+=i.data.length,i=i.next;return n}},{key:"consume",value:function(t,n){var i;return t<this.head.data.length?(i=this.head.data.slice(0,t),this.head.data=this.head.data.slice(t)):t===this.head.data.length?i=this.shift():i=n?this._getString(t):this._getBuffer(t),i}},{key:"first",value:function(){return this.head.data}},{key:"_getString",value:function(t){var n=this.head,i=1,o=n.data;for(t-=o.length;n=n.next;){var s=n.data,a=t>s.length?s.length:t;if(a===s.length?o+=s:o+=s.slice(0,t),t-=a,t===0){a===s.length?(++i,n.next?this.head=n.next:this.head=this.tail=null):(this.head=n,n.data=s.slice(a));break}++i}return this.length-=i,o}},{key:"_getBuffer",value:function(t){var n=Wt.allocUnsafe(t),i=this.head,o=1;for(i.data.copy(n),t-=i.data.length;i=i.next;){var s=i.data,a=t>s.length?s.length:t;if(s.copy(n,n.length-t,0,a),t-=a,t===0){a===s.length?(++o,i.next?this.head=i.next:this.head=this.tail=null):(this.head=i,i.data=s.slice(a));break}++o}return this.length-=o,n}},{key:pu,value:function(t,n){return ln(this,au({},n,{depth:0,customInspect:!1}))}}]),r}()});var pn=S((bl,io)=>{"use strict";c();function mu(r,e){var t=this,n=this._readableState&&this._readableState.destroyed,i=this._writableState&&this._writableState.destroyed;return n||i?(e?e(r):r&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(dn,this,r)):process.nextTick(dn,this,r)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(r||null,function(o){!e&&o?t._writableState?t._writableState.errorEmitted?process.nextTick($t,t):(t._writableState.errorEmitted=!0,process.nextTick(no,t,o)):process.nextTick(no,t,o):e?(process.nextTick($t,t),e(o)):process.nextTick($t,t)}),this)}function no(r,e){dn(r,e),$t(r)}function $t(r){r._writableState&&!r._writableState.emitClose||r._readableState&&!r._readableState.emitClose||r.emit("close")}function gu(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function dn(r,e){r.emit("error",e)}function yu(r,e){var t=r._readableState,n=r._writableState;t&&t.autoDestroy||n&&n.autoDestroy?r.destroy(e):r.emit("error",e)}io.exports={destroy:mu,undestroy:gu,errorOrDestroy:yu}});var Ue=S((xl,ao)=>{"use strict";c();function bu(r,e){r.prototype=Object.create(e.prototype),r.prototype.constructor=r,r.__proto__=e}var so={};function X(r,e,t){t||(t=Error);function n(o,s,a){return typeof e=="string"?e:e(o,s,a)}var i=function(o){bu(s,o);function s(a,u,f){return o.call(this,n(a,u,f))||this}return s}(t);i.prototype.name=t.name,i.prototype.code=r,so[r]=i}function oo(r,e){if(Array.isArray(r)){var t=r.length;return r=r.map(function(n){return String(n)}),t>2?"one of ".concat(e," ").concat(r.slice(0,t-1).join(", "),", or ")+r[t-1]:t===2?"one of ".concat(e," ").concat(r[0]," or ").concat(r[1]):"of ".concat(e," ").concat(r[0])}else return"of ".concat(e," ").concat(String(r))}function xu(r,e,t){return r.substr(!t||t<0?0:+t,e.length)===e}function _u(r,e,t){return(t===void 0||t>r.length)&&(t=r.length),r.substring(t-e.length,t)===e}function wu(r,e,t){return typeof t!="number"&&(t=0),t+e.length>r.length?!1:r.indexOf(e,t)!==-1}X("ERR_INVALID_OPT_VALUE",function(r,e){return'The value "'+e+'" is invalid for option "'+r+'"'},TypeError);X("ERR_INVALID_ARG_TYPE",function(r,e,t){var n;typeof e=="string"&&xu(e,"not ")?(n="must not be",e=e.replace(/^not /,"")):n="must be";var i;if(_u(r," argument"))i="The ".concat(r," ").concat(n," ").concat(oo(e,"type"));else{var o=wu(r,".")?"property":"argument";i='The "'.concat(r,'" ').concat(o," ").concat(n," ").concat(oo(e,"type"))}return i+=". Received type ".concat(typeof t),i},TypeError);X("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");X("ERR_METHOD_NOT_IMPLEMENTED",function(r){return"The "+r+" method is not implemented"});X("ERR_STREAM_PREMATURE_CLOSE","Premature close");X("ERR_STREAM_DESTROYED",function(r){return"Cannot call "+r+" after a stream was destroyed"});X("ERR_MULTIPLE_CALLBACK","Callback called multiple times");X("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");X("ERR_STREAM_WRITE_AFTER_END","write after end");X("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);X("ERR_UNKNOWN_ENCODING",function(r){return"Unknown encoding: "+r},TypeError);X("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");ao.exports.codes=so});var hn=S((_l,uo)=>{"use strict";c();var vu=Ue().codes.ERR_INVALID_OPT_VALUE;function Eu(r,e,t){return r.highWaterMark!=null?r.highWaterMark:e?r[t]:null}function Su(r,e,t,n){var i=Eu(e,n,t);if(i!=null){if(!(isFinite(i)&&Math.floor(i)===i)||i<0){var o=n?t:"highWaterMark";throw new vu(o,i)}return Math.floor(i)}return r.objectMode?16:16*1024}uo.exports={getHighWaterMark:Su}});var co=S((wl,fo)=>{c();fo.exports=Ru;function Ru(r,e){if(mn("noDeprecation"))return r;var t=!1;function n(){if(!t){if(mn("throwDeprecation"))throw new Error(e);mn("traceDeprecation")?console.trace(e):console.warn(e),t=!0}return r.apply(this,arguments)}return n}function mn(r){try{if(!global.localStorage)return!1}catch{return!1}var e=global.localStorage[r];return e==null?!1:String(e).toLowerCase()==="true"}});var bn=S((vl,yo)=>{"use strict";c();yo.exports=F;function po(r){var e=this;this.next=null,this.entry=null,this.finish=function(){Qu(e,r)}}var et;F.WritableState=Et;var Tu={deprecate:co()},ho=fn(),Vt=Xe().Buffer,Cu=global.Uint8Array||function(){};function Bu(r){return Vt.from(r)}function Mu(r){return Vt.isBuffer(r)||r instanceof Cu}var yn=pn(),Lu=hn(),Iu=Lu.getHighWaterMark,xe=Ue().codes,Au=xe.ERR_INVALID_ARG_TYPE,Fu=xe.ERR_METHOD_NOT_IMPLEMENTED,Pu=xe.ERR_MULTIPLE_CALLBACK,ku=xe.ERR_STREAM_CANNOT_PIPE,Ou=xe.ERR_STREAM_DESTROYED,Uu=xe.ERR_STREAM_NULL_VALUES,Du=xe.ERR_STREAM_WRITE_AFTER_END,Nu=xe.ERR_UNKNOWN_ENCODING,tt=yn.errorOrDestroy;Oe()(F,ho);function Hu(){}function Et(r,e,t){et=et||De(),r=r||{},typeof t!="boolean"&&(t=e instanceof et),this.objectMode=!!r.objectMode,t&&(this.objectMode=this.objectMode||!!r.writableObjectMode),this.highWaterMark=Iu(this,r,"writableHighWaterMark",t),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var n=r.decodeStrings===!1;this.decodeStrings=!n,this.defaultEncoding=r.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(i){zu(e,i)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=r.emitClose!==!1,this.autoDestroy=!!r.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new po(this)}Et.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t};(function(){try{Object.defineProperty(Et.prototype,"buffer",{get:Tu.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch{}})();var Gt;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(Gt=Function.prototype[Symbol.hasInstance],Object.defineProperty(F,Symbol.hasInstance,{value:function(e){return Gt.call(this,e)?!0:this!==F?!1:e&&e._writableState instanceof Et}})):Gt=function(e){return e instanceof this};function F(r){et=et||De();var e=this instanceof et;if(!e&&!Gt.call(F,this))return new F(r);this._writableState=new Et(r,this,e),this.writable=!0,r&&(typeof r.write=="function"&&(this._write=r.write),typeof r.writev=="function"&&(this._writev=r.writev),typeof r.destroy=="function"&&(this._destroy=r.destroy),typeof r.final=="function"&&(this._final=r.final)),ho.call(this)}F.prototype.pipe=function(){tt(this,new ku)};function qu(r,e){var t=new Du;tt(r,t),process.nextTick(e,t)}function ju(r,e,t,n){var i;return t===null?i=new Uu:typeof t!="string"&&!e.objectMode&&(i=new Au("chunk",["string","Buffer"],t)),i?(tt(r,i),process.nextTick(n,i),!1):!0}F.prototype.write=function(r,e,t){var n=this._writableState,i=!1,o=!n.objectMode&&Mu(r);return o&&!Vt.isBuffer(r)&&(r=Bu(r)),typeof e=="function"&&(t=e,e=null),o?e="buffer":e||(e=n.defaultEncoding),typeof t!="function"&&(t=Hu),n.ending?qu(this,t):(o||ju(this,n,r,t))&&(n.pendingcb++,i=$u(this,n,o,r,e,t)),i};F.prototype.cork=function(){this._writableState.corked++};F.prototype.uncork=function(){var r=this._writableState;r.corked&&(r.corked--,!r.writing&&!r.corked&&!r.bufferProcessing&&r.bufferedRequest&&mo(this,r))};F.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new Nu(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(F.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function Wu(r,e,t){return!r.objectMode&&r.decodeStrings!==!1&&typeof e=="string"&&(e=Vt.from(e,t)),e}Object.defineProperty(F.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function $u(r,e,t,n,i,o){if(!t){var s=Wu(e,n,i);n!==s&&(t=!0,i="buffer",n=s)}var a=e.objectMode?1:n.length;e.length+=a;var u=e.length<e.highWaterMark;if(u||(e.needDrain=!0),e.writing||e.corked){var f=e.lastBufferedRequest;e.lastBufferedRequest={chunk:n,encoding:i,isBuf:t,callback:o,next:null},f?f.next=e.lastBufferedRequest:e.bufferedRequest=e.lastBufferedRequest,e.bufferedRequestCount+=1}else gn(r,e,!1,a,n,i,o);return u}function gn(r,e,t,n,i,o,s){e.writelen=n,e.writecb=s,e.writing=!0,e.sync=!0,e.destroyed?e.onwrite(new Ou("write")):t?r._writev(i,e.onwrite):r._write(i,o,e.onwrite),e.sync=!1}function Gu(r,e,t,n,i){--e.pendingcb,t?(process.nextTick(i,n),process.nextTick(vt,r,e),r._writableState.errorEmitted=!0,tt(r,n)):(i(n),r._writableState.errorEmitted=!0,tt(r,n),vt(r,e))}function Vu(r){r.writing=!1,r.writecb=null,r.length-=r.writelen,r.writelen=0}function zu(r,e){var t=r._writableState,n=t.sync,i=t.writecb;if(typeof i!="function")throw new Pu;if(Vu(t),e)Gu(r,t,n,e,i);else{var o=go(t)||r.destroyed;!o&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&mo(r,t),n?process.nextTick(lo,r,t,o,i):lo(r,t,o,i)}}function lo(r,e,t,n){t||Yu(r,e),e.pendingcb--,n(),vt(r,e)}function Yu(r,e){e.length===0&&e.needDrain&&(e.needDrain=!1,r.emit("drain"))}function mo(r,e){e.bufferProcessing=!0;var t=e.bufferedRequest;if(r._writev&&t&&t.next){var n=e.bufferedRequestCount,i=new Array(n),o=e.corkedRequestsFree;o.entry=t;for(var s=0,a=!0;t;)i[s]=t,t.isBuf||(a=!1),t=t.next,s+=1;i.allBuffers=a,gn(r,e,!0,e.length,i,"",o.finish),e.pendingcb++,e.lastBufferedRequest=null,o.next?(e.corkedRequestsFree=o.next,o.next=null):e.corkedRequestsFree=new po(e),e.bufferedRequestCount=0}else{for(;t;){var u=t.chunk,f=t.encoding,l=t.callback,d=e.objectMode?1:u.length;if(gn(r,e,!1,d,u,f,l),t=t.next,e.bufferedRequestCount--,e.writing)break}t===null&&(e.lastBufferedRequest=null)}e.bufferedRequest=t,e.bufferProcessing=!1}F.prototype._write=function(r,e,t){t(new Fu("_write()"))};F.prototype._writev=null;F.prototype.end=function(r,e,t){var n=this._writableState;return typeof r=="function"?(t=r,r=null,e=null):typeof e=="function"&&(t=e,e=null),r!=null&&this.write(r,e),n.corked&&(n.corked=1,this.uncork()),n.ending||Ju(this,n,t),this};Object.defineProperty(F.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}});function go(r){return r.ending&&r.length===0&&r.bufferedRequest===null&&!r.finished&&!r.writing}function Ku(r,e){r._final(function(t){e.pendingcb--,t&&tt(r,t),e.prefinished=!0,r.emit("prefinish"),vt(r,e)})}function Xu(r,e){!e.prefinished&&!e.finalCalled&&(typeof r._final=="function"&&!e.destroyed?(e.pendingcb++,e.finalCalled=!0,process.nextTick(Ku,r,e)):(e.prefinished=!0,r.emit("prefinish")))}function vt(r,e){var t=go(e);if(t&&(Xu(r,e),e.pendingcb===0&&(e.finished=!0,r.emit("finish"),e.autoDestroy))){var n=r._readableState;(!n||n.autoDestroy&&n.endEmitted)&&r.destroy()}return t}function Ju(r,e,t){e.ending=!0,vt(r,e),t&&(e.finished?process.nextTick(t):r.once("finish",t)),e.ended=!0,r.writable=!1}function Qu(r,e,t){var n=r.entry;for(r.entry=null;n;){var i=n.callback;e.pendingcb--,i(t),n=n.next}e.corkedRequestsFree.next=r}Object.defineProperty(F.prototype,"destroyed",{enumerable:!1,get:function(){return this._writableState===void 0?!1:this._writableState.destroyed},set:function(e){!this._writableState||(this._writableState.destroyed=e)}});F.prototype.destroy=yn.destroy;F.prototype._undestroy=yn.undestroy;F.prototype._destroy=function(r,e){e(r)}});var De=S((El,xo)=>{"use strict";c();var Zu=Object.keys||function(r){var e=[];for(var t in r)e.push(t);return e};xo.exports=ae;var bo=wn(),_n=bn();Oe()(ae,bo);for(xn=Zu(_n.prototype),zt=0;zt<xn.length;zt++)Yt=xn[zt],ae.prototype[Yt]||(ae.prototype[Yt]=_n.prototype[Yt]);var xn,Yt,zt;function ae(r){if(!(this instanceof ae))return new ae(r);bo.call(this,r),_n.call(this,r),this.allowHalfOpen=!0,r&&(r.readable===!1&&(this.readable=!1),r.writable===!1&&(this.writable=!1),r.allowHalfOpen===!1&&(this.allowHalfOpen=!1,this.once("end",ef)))}Object.defineProperty(ae.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});Object.defineProperty(ae.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});Object.defineProperty(ae.prototype,"writableLength",{enumerable:!1,get:function(){return this._writableState.length}});function ef(){this._writableState.ended||process.nextTick(tf,this)}function tf(r){r.end()}Object.defineProperty(ae.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0||this._writableState===void 0?!1:this._readableState.destroyed&&this._writableState.destroyed},set:function(e){this._readableState===void 0||this._writableState===void 0||(this._readableState.destroyed=e,this._writableState.destroyed=e)}})});var vo=S((vn,wo)=>{c();var Kt=Xe(),ue=Kt.Buffer;function _o(r,e){for(var t in r)e[t]=r[t]}ue.from&&ue.alloc&&ue.allocUnsafe&&ue.allocUnsafeSlow?wo.exports=Kt:(_o(Kt,vn),vn.Buffer=Ne);function Ne(r,e,t){return ue(r,e,t)}Ne.prototype=Object.create(ue.prototype);_o(ue,Ne);Ne.from=function(r,e,t){if(typeof r=="number")throw new TypeError("Argument must not be a number");return ue(r,e,t)};Ne.alloc=function(r,e,t){if(typeof r!="number")throw new TypeError("Argument must be a number");var n=ue(r);return e!==void 0?typeof t=="string"?n.fill(e,t):n.fill(e):n.fill(0),n};Ne.allocUnsafe=function(r){if(typeof r!="number")throw new TypeError("Argument must be a number");return ue(r)};Ne.allocUnsafeSlow=function(r){if(typeof r!="number")throw new TypeError("Argument must be a number");return Kt.SlowBuffer(r)}});var Rn=S(So=>{"use strict";c();var Sn=vo().Buffer,Eo=Sn.isEncoding||function(r){switch(r=""+r,r&&r.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function rf(r){if(!r)return"utf8";for(var e;;)switch(r){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return r;default:if(e)return;r=(""+r).toLowerCase(),e=!0}}function nf(r){var e=rf(r);if(typeof e!="string"&&(Sn.isEncoding===Eo||!Eo(r)))throw new Error("Unknown encoding: "+r);return e||r}So.StringDecoder=St;function St(r){this.encoding=nf(r);var e;switch(this.encoding){case"utf16le":this.text=cf,this.end=lf,e=4;break;case"utf8":this.fillLast=af,e=4;break;case"base64":this.text=df,this.end=pf,e=3;break;default:this.write=hf,this.end=mf;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=Sn.allocUnsafe(e)}St.prototype.write=function(r){if(r.length===0)return"";var e,t;if(this.lastNeed){if(e=this.fillLast(r),e===void 0)return"";t=this.lastNeed,this.lastNeed=0}else t=0;return t<r.length?e?e+this.text(r,t):this.text(r,t):e||""};St.prototype.end=ff;St.prototype.text=uf;St.prototype.fillLast=function(r){if(this.lastNeed<=r.length)return r.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);r.copy(this.lastChar,this.lastTotal-this.lastNeed,0,r.length),this.lastNeed-=r.length};function En(r){return r<=127?0:r>>5===6?2:r>>4===14?3:r>>3===30?4:r>>6===2?-1:-2}function of(r,e,t){var n=e.length-1;if(n<t)return 0;var i=En(e[n]);return i>=0?(i>0&&(r.lastNeed=i-1),i):--n<t||i===-2?0:(i=En(e[n]),i>=0?(i>0&&(r.lastNeed=i-2),i):--n<t||i===-2?0:(i=En(e[n]),i>=0?(i>0&&(i===2?i=0:r.lastNeed=i-3),i):0))}function sf(r,e,t){if((e[0]&192)!==128)return r.lastNeed=0,"\uFFFD";if(r.lastNeed>1&&e.length>1){if((e[1]&192)!==128)return r.lastNeed=1,"\uFFFD";if(r.lastNeed>2&&e.length>2&&(e[2]&192)!==128)return r.lastNeed=2,"\uFFFD"}}function af(r){var e=this.lastTotal-this.lastNeed,t=sf(this,r,e);if(t!==void 0)return t;if(this.lastNeed<=r.length)return r.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);r.copy(this.lastChar,e,0,r.length),this.lastNeed-=r.length}function uf(r,e){var t=of(this,r,e);if(!this.lastNeed)return r.toString("utf8",e);this.lastTotal=t;var n=r.length-(t-this.lastNeed);return r.copy(this.lastChar,0,n),r.toString("utf8",e,n)}function ff(r){var e=r&&r.length?this.write(r):"";return this.lastNeed?e+"\uFFFD":e}function cf(r,e){if((r.length-e)%2===0){var t=r.toString("utf16le",e);if(t){var n=t.charCodeAt(t.length-1);if(n>=55296&&n<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=r[r.length-2],this.lastChar[1]=r[r.length-1],t.slice(0,-1)}return t}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=r[r.length-1],r.toString("utf16le",e,r.length-1)}function lf(r){var e=r&&r.length?this.write(r):"";if(this.lastNeed){var t=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,t)}return e}function df(r,e){var t=(r.length-e)%3;return t===0?r.toString("base64",e):(this.lastNeed=3-t,this.lastTotal=3,t===1?this.lastChar[0]=r[r.length-1]:(this.lastChar[0]=r[r.length-2],this.lastChar[1]=r[r.length-1]),r.toString("base64",e,r.length-t))}function pf(r){var e=r&&r.length?this.write(r):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function hf(r){return r.toString(this.encoding)}function mf(r){return r&&r.length?this.write(r):""}});var Xt=S((Rl,Co)=>{"use strict";c();var Ro=Ue().codes.ERR_STREAM_PREMATURE_CLOSE;function gf(r){var e=!1;return function(){if(!e){e=!0;for(var t=arguments.length,n=new Array(t),i=0;i<t;i++)n[i]=arguments[i];r.apply(this,n)}}}function yf(){}function bf(r){return r.setHeader&&typeof r.abort=="function"}function To(r,e,t){if(typeof e=="function")return To(r,null,e);e||(e={}),t=gf(t||yf);var n=e.readable||e.readable!==!1&&r.readable,i=e.writable||e.writable!==!1&&r.writable,o=function(){r.writable||a()},s=r._writableState&&r._writableState.finished,a=function(){i=!1,s=!0,n||t.call(r)},u=r._readableState&&r._readableState.endEmitted,f=function(){n=!1,u=!0,i||t.call(r)},l=function(b){t.call(r,b)},d=function(){var b;if(n&&!u)return(!r._readableState||!r._readableState.ended)&&(b=new Ro),t.call(r,b);if(i&&!s)return(!r._writableState||!r._writableState.ended)&&(b=new Ro),t.call(r,b)},h=function(){r.req.on("finish",a)};return bf(r)?(r.on("complete",a),r.on("abort",d),r.req?h():r.on("request",h)):i&&!r._writableState&&(r.on("end",o),r.on("close",o)),r.on("end",f),r.on("finish",a),e.error!==!1&&r.on("error",l),r.on("close",d),function(){r.removeListener("complete",a),r.removeListener("abort",d),r.removeListener("request",h),r.req&&r.req.removeListener("finish",a),r.removeListener("end",o),r.removeListener("close",o),r.removeListener("finish",a),r.removeListener("end",f),r.removeListener("error",l),r.removeListener("close",d)}}Co.exports=To});var Mo=S((Tl,Bo)=>{"use strict";c();var Jt;function _e(r,e,t){return e in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}var xf=Xt(),we=Symbol("lastResolve"),He=Symbol("lastReject"),Rt=Symbol("error"),Qt=Symbol("ended"),qe=Symbol("lastPromise"),Tn=Symbol("handlePromise"),je=Symbol("stream");function ve(r,e){return{value:r,done:e}}function _f(r){var e=r[we];if(e!==null){var t=r[je].read();t!==null&&(r[qe]=null,r[we]=null,r[He]=null,e(ve(t,!1)))}}function wf(r){process.nextTick(_f,r)}function vf(r,e){return function(t,n){r.then(function(){if(e[Qt]){t(ve(void 0,!0));return}e[Tn](t,n)},n)}}var Ef=Object.getPrototypeOf(function(){}),Sf=Object.setPrototypeOf((Jt={get stream(){return this[je]},next:function(){var e=this,t=this[Rt];if(t!==null)return Promise.reject(t);if(this[Qt])return Promise.resolve(ve(void 0,!0));if(this[je].destroyed)return new Promise(function(s,a){process.nextTick(function(){e[Rt]?a(e[Rt]):s(ve(void 0,!0))})});var n=this[qe],i;if(n)i=new Promise(vf(n,this));else{var o=this[je].read();if(o!==null)return Promise.resolve(ve(o,!1));i=new Promise(this[Tn])}return this[qe]=i,i}},_e(Jt,Symbol.asyncIterator,function(){return this}),_e(Jt,"return",function(){var e=this;return new Promise(function(t,n){e[je].destroy(null,function(i){if(i){n(i);return}t(ve(void 0,!0))})})}),Jt),Ef),Rf=function(e){var t,n=Object.create(Sf,(t={},_e(t,je,{value:e,writable:!0}),_e(t,we,{value:null,writable:!0}),_e(t,He,{value:null,writable:!0}),_e(t,Rt,{value:null,writable:!0}),_e(t,Qt,{value:e._readableState.endEmitted,writable:!0}),_e(t,Tn,{value:function(o,s){var a=n[je].read();a?(n[qe]=null,n[we]=null,n[He]=null,o(ve(a,!1))):(n[we]=o,n[He]=s)},writable:!0}),t));return n[qe]=null,xf(e,function(i){if(i&&i.code!=="ERR_STREAM_PREMATURE_CLOSE"){var o=n[He];o!==null&&(n[qe]=null,n[we]=null,n[He]=null,o(i)),n[Rt]=i;return}var s=n[we];s!==null&&(n[qe]=null,n[we]=null,n[He]=null,s(ve(void 0,!0))),n[Qt]=!0}),e.on("readable",wf.bind(null,n)),n};Bo.exports=Rf});var Io=S((Cl,Lo)=>{c();Lo.exports=function(){throw new Error("Readable.from is not available in the browser")}});var wn=S((Ml,qo)=>{"use strict";c();qo.exports=E;var rt;E.ReadableState=ko;var Bl=un().EventEmitter,Po=function(e,t){return e.listeners(t).length},Ct=fn(),Zt=Xe().Buffer,Tf=global.Uint8Array||function(){};function Cf(r){return Zt.from(r)}function Bf(r){return Zt.isBuffer(r)||r instanceof Tf}var Cn=cn(),x;Cn&&Cn.debuglog?x=Cn.debuglog("stream"):x=function(){};var Mf=ro(),Pn=pn(),Lf=hn(),If=Lf.getHighWaterMark,er=Ue().codes,Af=er.ERR_INVALID_ARG_TYPE,Ff=er.ERR_STREAM_PUSH_AFTER_EOF,Pf=er.ERR_METHOD_NOT_IMPLEMENTED,kf=er.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,nt,Bn,Mn;Oe()(E,Ct);var Tt=Pn.errorOrDestroy,Ln=["error","close","destroy","pause","resume"];function Of(r,e,t){if(typeof r.prependListener=="function")return r.prependListener(e,t);!r._events||!r._events[e]?r.on(e,t):Array.isArray(r._events[e])?r._events[e].unshift(t):r._events[e]=[t,r._events[e]]}function ko(r,e,t){rt=rt||De(),r=r||{},typeof t!="boolean"&&(t=e instanceof rt),this.objectMode=!!r.objectMode,t&&(this.objectMode=this.objectMode||!!r.readableObjectMode),this.highWaterMark=If(this,r,"readableHighWaterMark",t),this.buffer=new Mf,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=r.emitClose!==!1,this.autoDestroy=!!r.autoDestroy,this.destroyed=!1,this.defaultEncoding=r.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,r.encoding&&(nt||(nt=Rn().StringDecoder),this.decoder=new nt(r.encoding),this.encoding=r.encoding)}function E(r){if(rt=rt||De(),!(this instanceof E))return new E(r);var e=this instanceof rt;this._readableState=new ko(r,this,e),this.readable=!0,r&&(typeof r.read=="function"&&(this._read=r.read),typeof r.destroy=="function"&&(this._destroy=r.destroy)),Ct.call(this)}Object.defineProperty(E.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});E.prototype.destroy=Pn.destroy;E.prototype._undestroy=Pn.undestroy;E.prototype._destroy=function(r,e){e(r)};E.prototype.push=function(r,e){var t=this._readableState,n;return t.objectMode?n=!0:typeof r=="string"&&(e=e||t.defaultEncoding,e!==t.encoding&&(r=Zt.from(r,e),e=""),n=!0),Oo(this,r,e,!1,n)};E.prototype.unshift=function(r){return Oo(this,r,null,!0,!1)};function Oo(r,e,t,n,i){x("readableAddChunk",e);var o=r._readableState;if(e===null)o.reading=!1,Nf(r,o);else{var s;if(i||(s=Uf(o,e)),s)Tt(r,s);else if(o.objectMode||e&&e.length>0)if(typeof e!="string"&&!o.objectMode&&Object.getPrototypeOf(e)!==Zt.prototype&&(e=Cf(e)),n)o.endEmitted?Tt(r,new kf):In(r,o,e,!0);else if(o.ended)Tt(r,new Ff);else{if(o.destroyed)return!1;o.reading=!1,o.decoder&&!t?(e=o.decoder.write(e),o.objectMode||e.length!==0?In(r,o,e,!1):Fn(r,o)):In(r,o,e,!1)}else n||(o.reading=!1,Fn(r,o))}return!o.ended&&(o.length<o.highWaterMark||o.length===0)}function In(r,e,t,n){e.flowing&&e.length===0&&!e.sync?(e.awaitDrain=0,r.emit("data",t)):(e.length+=e.objectMode?1:t.length,n?e.buffer.unshift(t):e.buffer.push(t),e.needReadable&&tr(r)),Fn(r,e)}function Uf(r,e){var t;return!Bf(e)&&typeof e!="string"&&e!==void 0&&!r.objectMode&&(t=new Af("chunk",["string","Buffer","Uint8Array"],e)),t}E.prototype.isPaused=function(){return this._readableState.flowing===!1};E.prototype.setEncoding=function(r){nt||(nt=Rn().StringDecoder);var e=new nt(r);this._readableState.decoder=e,this._readableState.encoding=this._readableState.decoder.encoding;for(var t=this._readableState.buffer.head,n="";t!==null;)n+=e.write(t.data),t=t.next;return this._readableState.buffer.clear(),n!==""&&this._readableState.buffer.push(n),this._readableState.length=n.length,this};var Ao=1073741824;function Df(r){return r>=Ao?r=Ao:(r--,r|=r>>>1,r|=r>>>2,r|=r>>>4,r|=r>>>8,r|=r>>>16,r++),r}function Fo(r,e){return r<=0||e.length===0&&e.ended?0:e.objectMode?1:r!==r?e.flowing&&e.length?e.buffer.head.data.length:e.length:(r>e.highWaterMark&&(e.highWaterMark=Df(r)),r<=e.length?r:e.ended?e.length:(e.needReadable=!0,0))}E.prototype.read=function(r){x("read",r),r=parseInt(r,10);var e=this._readableState,t=r;if(r!==0&&(e.emittedReadable=!1),r===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return x("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?An(this):tr(this),null;if(r=Fo(r,e),r===0&&e.ended)return e.length===0&&An(this),null;var n=e.needReadable;x("need readable",n),(e.length===0||e.length-r<e.highWaterMark)&&(n=!0,x("length less than watermark",n)),e.ended||e.reading?(n=!1,x("reading or ended",n)):n&&(x("do read"),e.reading=!0,e.sync=!0,e.length===0&&(e.needReadable=!0),this._read(e.highWaterMark),e.sync=!1,e.reading||(r=Fo(t,e)));var i;return r>0?i=No(r,e):i=null,i===null?(e.needReadable=e.length<=e.highWaterMark,r=0):(e.length-=r,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),t!==r&&e.ended&&An(this)),i!==null&&this.emit("data",i),i};function Nf(r,e){if(x("onEofChunk"),!e.ended){if(e.decoder){var t=e.decoder.end();t&&t.length&&(e.buffer.push(t),e.length+=e.objectMode?1:t.length)}e.ended=!0,e.sync?tr(r):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,Uo(r)))}}function tr(r){var e=r._readableState;x("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(x("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(Uo,r))}function Uo(r){var e=r._readableState;x("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(r.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,kn(r)}function Fn(r,e){e.readingMore||(e.readingMore=!0,process.nextTick(Hf,r,e))}function Hf(r,e){for(;!e.reading&&!e.ended&&(e.length<e.highWaterMark||e.flowing&&e.length===0);){var t=e.length;if(x("maybeReadMore read 0"),r.read(0),t===e.length)break}e.readingMore=!1}E.prototype._read=function(r){Tt(this,new Pf("_read()"))};E.prototype.pipe=function(r,e){var t=this,n=this._readableState;switch(n.pipesCount){case 0:n.pipes=r;break;case 1:n.pipes=[n.pipes,r];break;default:n.pipes.push(r);break}n.pipesCount+=1,x("pipe count=%d opts=%j",n.pipesCount,e);var i=(!e||e.end!==!1)&&r!==process.stdout&&r!==process.stderr,o=i?a:y;n.endEmitted?process.nextTick(o):t.once("end",o),r.on("unpipe",s);function s(w,_){x("onunpipe"),w===t&&_&&_.hasUnpiped===!1&&(_.hasUnpiped=!0,l())}function a(){x("onend"),r.end()}var u=qf(t);r.on("drain",u);var f=!1;function l(){x("cleanup"),r.removeListener("close",m),r.removeListener("finish",b),r.removeListener("drain",u),r.removeListener("error",h),r.removeListener("unpipe",s),t.removeListener("end",a),t.removeListener("end",y),t.removeListener("data",d),f=!0,n.awaitDrain&&(!r._writableState||r._writableState.needDrain)&&u()}t.on("data",d);function d(w){x("ondata");var _=r.write(w);x("dest.write",_),_===!1&&((n.pipesCount===1&&n.pipes===r||n.pipesCount>1&&Ho(n.pipes,r)!==-1)&&!f&&(x("false write response, pause",n.awaitDrain),n.awaitDrain++),t.pause())}function h(w){x("onerror",w),y(),r.removeListener("error",h),Po(r,"error")===0&&Tt(r,w)}Of(r,"error",h);function m(){r.removeListener("finish",b),y()}r.once("close",m);function b(){x("onfinish"),r.removeListener("close",m),y()}r.once("finish",b);function y(){x("unpipe"),t.unpipe(r)}return r.emit("pipe",t),n.flowing||(x("pipe resume"),t.resume()),r};function qf(r){return function(){var t=r._readableState;x("pipeOnDrain",t.awaitDrain),t.awaitDrain&&t.awaitDrain--,t.awaitDrain===0&&Po(r,"data")&&(t.flowing=!0,kn(r))}}E.prototype.unpipe=function(r){var e=this._readableState,t={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return r&&r!==e.pipes?this:(r||(r=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,r&&r.emit("unpipe",this,t),this);if(!r){var n=e.pipes,i=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var o=0;o<i;o++)n[o].emit("unpipe",this,{hasUnpiped:!1});return this}var s=Ho(e.pipes,r);return s===-1?this:(e.pipes.splice(s,1),e.pipesCount-=1,e.pipesCount===1&&(e.pipes=e.pipes[0]),r.emit("unpipe",this,t),this)};E.prototype.on=function(r,e){var t=Ct.prototype.on.call(this,r,e),n=this._readableState;return r==="data"?(n.readableListening=this.listenerCount("readable")>0,n.flowing!==!1&&this.resume()):r==="readable"&&!n.endEmitted&&!n.readableListening&&(n.readableListening=n.needReadable=!0,n.flowing=!1,n.emittedReadable=!1,x("on readable",n.length,n.reading),n.length?tr(this):n.reading||process.nextTick(jf,this)),t};E.prototype.addListener=E.prototype.on;E.prototype.removeListener=function(r,e){var t=Ct.prototype.removeListener.call(this,r,e);return r==="readable"&&process.nextTick(Do,this),t};E.prototype.removeAllListeners=function(r){var e=Ct.prototype.removeAllListeners.apply(this,arguments);return(r==="readable"||r===void 0)&&process.nextTick(Do,this),e};function Do(r){var e=r._readableState;e.readableListening=r.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:r.listenerCount("data")>0&&r.resume()}function jf(r){x("readable nexttick read 0"),r.read(0)}E.prototype.resume=function(){var r=this._readableState;return r.flowing||(x("resume"),r.flowing=!r.readableListening,Wf(this,r)),r.paused=!1,this};function Wf(r,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick($f,r,e))}function $f(r,e){x("resume",e.reading),e.reading||r.read(0),e.resumeScheduled=!1,r.emit("resume"),kn(r),e.flowing&&!e.reading&&r.read(0)}E.prototype.pause=function(){return x("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(x("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function kn(r){var e=r._readableState;for(x("flow",e.flowing);e.flowing&&r.read()!==null;);}E.prototype.wrap=function(r){var e=this,t=this._readableState,n=!1;r.on("end",function(){if(x("wrapped end"),t.decoder&&!t.ended){var s=t.decoder.end();s&&s.length&&e.push(s)}e.push(null)}),r.on("data",function(s){if(x("wrapped data"),t.decoder&&(s=t.decoder.write(s)),!(t.objectMode&&s==null)&&!(!t.objectMode&&(!s||!s.length))){var a=e.push(s);a||(n=!0,r.pause())}});for(var i in r)this[i]===void 0&&typeof r[i]=="function"&&(this[i]=function(a){return function(){return r[a].apply(r,arguments)}}(i));for(var o=0;o<Ln.length;o++)r.on(Ln[o],this.emit.bind(this,Ln[o]));return this._read=function(s){x("wrapped _read",s),n&&(n=!1,r.resume())},this};typeof Symbol=="function"&&(E.prototype[Symbol.asyncIterator]=function(){return Bn===void 0&&(Bn=Mo()),Bn(this)});Object.defineProperty(E.prototype,"readableHighWaterMark",{enumerable:!1,get:function(){return this._readableState.highWaterMark}});Object.defineProperty(E.prototype,"readableBuffer",{enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}});Object.defineProperty(E.prototype,"readableFlowing",{enumerable:!1,get:function(){return this._readableState.flowing},set:function(e){this._readableState&&(this._readableState.flowing=e)}});E._fromList=No;Object.defineProperty(E.prototype,"readableLength",{enumerable:!1,get:function(){return this._readableState.length}});function No(r,e){if(e.length===0)return null;var t;return e.objectMode?t=e.buffer.shift():!r||r>=e.length?(e.decoder?t=e.buffer.join(""):e.buffer.length===1?t=e.buffer.first():t=e.buffer.concat(e.length),e.buffer.clear()):t=e.buffer.consume(r,e.decoder),t}function An(r){var e=r._readableState;x("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(Gf,e,r))}function Gf(r,e){if(x("endReadableNT",r.endEmitted,r.length),!r.endEmitted&&r.length===0&&(r.endEmitted=!0,e.readable=!1,e.emit("end"),r.autoDestroy)){var t=e._writableState;(!t||t.autoDestroy&&t.finished)&&e.destroy()}}typeof Symbol=="function"&&(E.from=function(r,e){return Mn===void 0&&(Mn=Io()),Mn(E,r,e)});function Ho(r,e){for(var t=0,n=r.length;t<n;t++)if(r[t]===e)return t;return-1}});var On=S((Ll,Wo)=>{"use strict";c();Wo.exports=me;var rr=Ue().codes,Vf=rr.ERR_METHOD_NOT_IMPLEMENTED,zf=rr.ERR_MULTIPLE_CALLBACK,Yf=rr.ERR_TRANSFORM_ALREADY_TRANSFORMING,Kf=rr.ERR_TRANSFORM_WITH_LENGTH_0,nr=De();Oe()(me,nr);function Xf(r,e){var t=this._transformState;t.transforming=!1;var n=t.writecb;if(n===null)return this.emit("error",new zf);t.writechunk=null,t.writecb=null,e!=null&&this.push(e),n(r);var i=this._readableState;i.reading=!1,(i.needReadable||i.length<i.highWaterMark)&&this._read(i.highWaterMark)}function me(r){if(!(this instanceof me))return new me(r);nr.call(this,r),this._transformState={afterTransform:Xf.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,r&&(typeof r.transform=="function"&&(this._transform=r.transform),typeof r.flush=="function"&&(this._flush=r.flush)),this.on("prefinish",Jf)}function Jf(){var r=this;typeof this._flush=="function"&&!this._readableState.destroyed?this._flush(function(e,t){jo(r,e,t)}):jo(this,null,null)}me.prototype.push=function(r,e){return this._transformState.needTransform=!1,nr.prototype.push.call(this,r,e)};me.prototype._transform=function(r,e,t){t(new Vf("_transform()"))};me.prototype._write=function(r,e,t){var n=this._transformState;if(n.writecb=t,n.writechunk=r,n.writeencoding=e,!n.transforming){var i=this._readableState;(n.needTransform||i.needReadable||i.length<i.highWaterMark)&&this._read(i.highWaterMark)}};me.prototype._read=function(r){var e=this._transformState;e.writechunk!==null&&!e.transforming?(e.transforming=!0,this._transform(e.writechunk,e.writeencoding,e.afterTransform)):e.needTransform=!0};me.prototype._destroy=function(r,e){nr.prototype._destroy.call(this,r,function(t){e(t)})};function jo(r,e,t){if(e)return r.emit("error",e);if(t!=null&&r.push(t),r._writableState.length)throw new Kf;if(r._transformState.transforming)throw new Yf;return r.push(null)}});var Vo=S((Il,Go)=>{"use strict";c();Go.exports=Bt;var $o=On();Oe()(Bt,$o);function Bt(r){if(!(this instanceof Bt))return new Bt(r);$o.call(this,r)}Bt.prototype._transform=function(r,e,t){t(null,r)}});var Jo=S((Al,Xo)=>{"use strict";c();var Un;function Qf(r){var e=!1;return function(){e||(e=!0,r.apply(void 0,arguments))}}var Ko=Ue().codes,Zf=Ko.ERR_MISSING_ARGS,ec=Ko.ERR_STREAM_DESTROYED;function zo(r){if(r)throw r}function tc(r){return r.setHeader&&typeof r.abort=="function"}function rc(r,e,t,n){n=Qf(n);var i=!1;r.on("close",function(){i=!0}),Un===void 0&&(Un=Xt()),Un(r,{readable:e,writable:t},function(s){if(s)return n(s);i=!0,n()});var o=!1;return function(s){if(!i&&!o){if(o=!0,tc(r))return r.abort();if(typeof r.destroy=="function")return r.destroy();n(s||new ec("pipe"))}}}function Yo(r){r()}function nc(r,e){return r.pipe(e)}function ic(r){return!r.length||typeof r[r.length-1]!="function"?zo:r.pop()}function oc(){for(var r=arguments.length,e=new Array(r),t=0;t<r;t++)e[t]=arguments[t];var n=ic(e);if(Array.isArray(e[0])&&(e=e[0]),e.length<2)throw new Zf("streams");var i,o=e.map(function(s,a){var u=a<e.length-1,f=a>0;return rc(s,u,f,function(l){i||(i=l),l&&o.forEach(Yo),!u&&(o.forEach(Yo),n(i))})});return e.reduce(nc)}Xo.exports=oc});var N=S((Fl,Qo)=>{c();Qo.exports=J;var Dn=ji().EventEmitter,sc=Oe();sc(J,Dn);J.Readable=wn();J.Writable=bn();J.Duplex=De();J.Transform=On();J.PassThrough=Vo();J.finished=Xt();J.pipeline=Jo();J.Stream=J;function J(){Dn.call(this)}J.prototype.pipe=function(r,e){var t=this;function n(l){r.writable&&r.write(l)===!1&&t.pause&&t.pause()}t.on("data",n);function i(){t.readable&&t.resume&&t.resume()}r.on("drain",i),!r._isStdio&&(!e||e.end!==!1)&&(t.on("end",s),t.on("close",a));var o=!1;function s(){o||(o=!0,r.end())}function a(){o||(o=!0,typeof r.destroy=="function"&&r.destroy())}function u(l){if(f(),Dn.listenerCount(this,"error")===0)throw l}t.on("error",u),r.on("error",u);function f(){t.removeListener("data",n),r.removeListener("drain",i),t.removeListener("end",s),t.removeListener("close",a),t.removeListener("error",u),r.removeListener("error",u),t.removeListener("end",f),t.removeListener("close",f),r.removeListener("close",f)}return t.on("end",f),t.on("close",f),r.on("close",f),r.emit("pipe",t),r}});var us=S((yd,as)=>{c();var at=1e3,ut=at*60,ft=ut*60,$e=ft*24,fc=$e*7,cc=$e*365.25;as.exports=function(r,e){e=e||{};var t=typeof r;if(t==="string"&&r.length>0)return lc(r);if(t==="number"&&isFinite(r))return e.long?pc(r):dc(r);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(r))};function lc(r){if(r=String(r),!(r.length>100)){var e=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(r);if(!!e){var t=parseFloat(e[1]),n=(e[2]||"ms").toLowerCase();switch(n){case"years":case"year":case"yrs":case"yr":case"y":return t*cc;case"weeks":case"week":case"w":return t*fc;case"days":case"day":case"d":return t*$e;case"hours":case"hour":case"hrs":case"hr":case"h":return t*ft;case"minutes":case"minute":case"mins":case"min":case"m":return t*ut;case"seconds":case"second":case"secs":case"sec":case"s":return t*at;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return t;default:return}}}}function dc(r){var e=Math.abs(r);return e>=$e?Math.round(r/$e)+"d":e>=ft?Math.round(r/ft)+"h":e>=ut?Math.round(r/ut)+"m":e>=at?Math.round(r/at)+"s":r+"ms"}function pc(r){var e=Math.abs(r);return e>=$e?fr(r,e,$e,"day"):e>=ft?fr(r,e,ft,"hour"):e>=ut?fr(r,e,ut,"minute"):e>=at?fr(r,e,at,"second"):r+" ms"}function fr(r,e,t,n){var i=e>=t*1.5;return Math.round(r/t)+" "+n+(i?"s":"")}});var cs=S((bd,fs)=>{c();function hc(r){t.debug=t,t.default=t,t.coerce=u,t.disable=o,t.enable=i,t.enabled=s,t.humanize=us(),t.destroy=f,Object.keys(r).forEach(l=>{t[l]=r[l]}),t.names=[],t.skips=[],t.formatters={};function e(l){let d=0;for(let h=0;h<l.length;h++)d=(d<<5)-d+l.charCodeAt(h),d|=0;return t.colors[Math.abs(d)%t.colors.length]}t.selectColor=e;function t(l){let d,h=null,m,b;function y(...w){if(!y.enabled)return;let _=y,v=Number(new Date),q=v-(d||v);_.diff=q,_.prev=d,_.curr=v,d=v,w[0]=t.coerce(w[0]),typeof w[0]!="string"&&w.unshift("%O");let A=0;w[0]=w[0].replace(/%([a-zA-Z%])/g,(Y,Ge)=>{if(Y==="%%")return"%";A++;let Ie=t.formatters[Ge];if(typeof Ie=="function"){let Ae=w[A];Y=Ie.call(_,Ae),w.splice(A,1),A--}return Y}),t.formatArgs.call(_,w),(_.log||t.log).apply(_,w)}return y.namespace=l,y.useColors=t.useColors(),y.color=t.selectColor(l),y.extend=n,y.destroy=t.destroy,Object.defineProperty(y,"enabled",{enumerable:!0,configurable:!1,get:()=>h!==null?h:(m!==t.namespaces&&(m=t.namespaces,b=t.enabled(l)),b),set:w=>{h=w}}),typeof t.init=="function"&&t.init(y),y}function n(l,d){let h=t(this.namespace+(typeof d>"u"?":":d)+l);return h.log=this.log,h}function i(l){t.save(l),t.namespaces=l,t.names=[],t.skips=[];let d,h=(typeof l=="string"?l:"").split(/[\s,]+/),m=h.length;for(d=0;d<m;d++)!h[d]||(l=h[d].replace(/\*/g,".*?"),l[0]==="-"?t.skips.push(new RegExp("^"+l.slice(1)+"$")):t.names.push(new RegExp("^"+l+"$")))}function o(){let l=[...t.names.map(a),...t.skips.map(a).map(d=>"-"+d)].join(",");return t.enable(""),l}function s(l){if(l[l.length-1]==="*")return!0;let d,h;for(d=0,h=t.skips.length;d<h;d++)if(t.skips[d].test(l))return!1;for(d=0,h=t.names.length;d<h;d++)if(t.names[d].test(l))return!0;return!1}function a(l){return l.toString().substring(2,l.toString().length-2).replace(/\.\*\?$/,"*")}function u(l){return l instanceof Error?l.stack||l.message:l}function f(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return t.enable(t.load()),t}fs.exports=hc});var le=S((z,cr)=>{c();z.formatArgs=gc;z.save=yc;z.load=bc;z.useColors=mc;z.storage=xc();z.destroy=(()=>{let r=!1;return()=>{r||(r=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();z.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function mc(){return typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs)?!0:typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)?!1:typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function gc(r){if(r[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+r[0]+(this.useColors?"%c ":" ")+"+"+cr.exports.humanize(this.diff),!this.useColors)return;let e="color: "+this.color;r.splice(1,0,e,"color: inherit");let t=0,n=0;r[0].replace(/%[a-zA-Z%]/g,i=>{i!=="%%"&&(t++,i==="%c"&&(n=t))}),r.splice(n,0,e)}z.log=console.debug||console.log||(()=>{});function yc(r){try{r?z.storage.setItem("debug",r):z.storage.removeItem("debug")}catch{}}function bc(){let r;try{r=z.storage.getItem("debug")}catch{}return!r&&typeof process<"u"&&"env"in process&&(r=process.env.DEBUG),r}function xc(){try{return localStorage}catch{}}cr.exports=cs()(z);var{formatters:_c}=cr.exports;_c.j=function(r){try{return JSON.stringify(r)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}});var na=S(ti=>{"use strict";c();Object.defineProperty(ti,"__esModule",{value:!0});var ra=function(){function r(){this._dataLength=0,this._bufferLength=0,this._state=new Int32Array(4),this._buffer=new ArrayBuffer(68),this._buffer8=new Uint8Array(this._buffer,0,68),this._buffer32=new Uint32Array(this._buffer,0,17),this.start()}return r.hashStr=function(e,t){return t===void 0&&(t=!1),this.onePassHasher.start().appendStr(e).end(t)},r.hashAsciiStr=function(e,t){return t===void 0&&(t=!1),this.onePassHasher.start().appendAsciiStr(e).end(t)},r._hex=function(e){var t=r.hexChars,n=r.hexOut,i,o,s,a;for(a=0;a<4;a+=1)for(o=a*8,i=e[a],s=0;s<8;s+=2)n[o+1+s]=t.charAt(i&15),i>>>=4,n[o+0+s]=t.charAt(i&15),i>>>=4;return n.join("")},r._md5cycle=function(e,t){var n=e[0],i=e[1],o=e[2],s=e[3];n+=(i&o|~i&s)+t[0]-680876936|0,n=(n<<7|n>>>25)+i|0,s+=(n&i|~n&o)+t[1]-389564586|0,s=(s<<12|s>>>20)+n|0,o+=(s&n|~s&i)+t[2]+606105819|0,o=(o<<17|o>>>15)+s|0,i+=(o&s|~o&n)+t[3]-1044525330|0,i=(i<<22|i>>>10)+o|0,n+=(i&o|~i&s)+t[4]-176418897|0,n=(n<<7|n>>>25)+i|0,s+=(n&i|~n&o)+t[5]+1200080426|0,s=(s<<12|s>>>20)+n|0,o+=(s&n|~s&i)+t[6]-1473231341|0,o=(o<<17|o>>>15)+s|0,i+=(o&s|~o&n)+t[7]-45705983|0,i=(i<<22|i>>>10)+o|0,n+=(i&o|~i&s)+t[8]+1770035416|0,n=(n<<7|n>>>25)+i|0,s+=(n&i|~n&o)+t[9]-1958414417|0,s=(s<<12|s>>>20)+n|0,o+=(s&n|~s&i)+t[10]-42063|0,o=(o<<17|o>>>15)+s|0,i+=(o&s|~o&n)+t[11]-1990404162|0,i=(i<<22|i>>>10)+o|0,n+=(i&o|~i&s)+t[12]+1804603682|0,n=(n<<7|n>>>25)+i|0,s+=(n&i|~n&o)+t[13]-40341101|0,s=(s<<12|s>>>20)+n|0,o+=(s&n|~s&i)+t[14]-1502002290|0,o=(o<<17|o>>>15)+s|0,i+=(o&s|~o&n)+t[15]+1236535329|0,i=(i<<22|i>>>10)+o|0,n+=(i&s|o&~s)+t[1]-165796510|0,n=(n<<5|n>>>27)+i|0,s+=(n&o|i&~o)+t[6]-1069501632|0,s=(s<<9|s>>>23)+n|0,o+=(s&i|n&~i)+t[11]+643717713|0,o=(o<<14|o>>>18)+s|0,i+=(o&n|s&~n)+t[0]-373897302|0,i=(i<<20|i>>>12)+o|0,n+=(i&s|o&~s)+t[5]-701558691|0,n=(n<<5|n>>>27)+i|0,s+=(n&o|i&~o)+t[10]+38016083|0,s=(s<<9|s>>>23)+n|0,o+=(s&i|n&~i)+t[15]-660478335|0,o=(o<<14|o>>>18)+s|0,i+=(o&n|s&~n)+t[4]-405537848|0,i=(i<<20|i>>>12)+o|0,n+=(i&s|o&~s)+t[9]+568446438|0,n=(n<<5|n>>>27)+i|0,s+=(n&o|i&~o)+t[14]-1019803690|0,s=(s<<9|s>>>23)+n|0,o+=(s&i|n&~i)+t[3]-187363961|0,o=(o<<14|o>>>18)+s|0,i+=(o&n|s&~n)+t[8]+1163531501|0,i=(i<<20|i>>>12)+o|0,n+=(i&s|o&~s)+t[13]-1444681467|0,n=(n<<5|n>>>27)+i|0,s+=(n&o|i&~o)+t[2]-51403784|0,s=(s<<9|s>>>23)+n|0,o+=(s&i|n&~i)+t[7]+1735328473|0,o=(o<<14|o>>>18)+s|0,i+=(o&n|s&~n)+t[12]-1926607734|0,i=(i<<20|i>>>12)+o|0,n+=(i^o^s)+t[5]-378558|0,n=(n<<4|n>>>28)+i|0,s+=(n^i^o)+t[8]-2022574463|0,s=(s<<11|s>>>21)+n|0,o+=(s^n^i)+t[11]+1839030562|0,o=(o<<16|o>>>16)+s|0,i+=(o^s^n)+t[14]-35309556|0,i=(i<<23|i>>>9)+o|0,n+=(i^o^s)+t[1]-1530992060|0,n=(n<<4|n>>>28)+i|0,s+=(n^i^o)+t[4]+1272893353|0,s=(s<<11|s>>>21)+n|0,o+=(s^n^i)+t[7]-155497632|0,o=(o<<16|o>>>16)+s|0,i+=(o^s^n)+t[10]-1094730640|0,i=(i<<23|i>>>9)+o|0,n+=(i^o^s)+t[13]+681279174|0,n=(n<<4|n>>>28)+i|0,s+=(n^i^o)+t[0]-358537222|0,s=(s<<11|s>>>21)+n|0,o+=(s^n^i)+t[3]-722521979|0,o=(o<<16|o>>>16)+s|0,i+=(o^s^n)+t[6]+76029189|0,i=(i<<23|i>>>9)+o|0,n+=(i^o^s)+t[9]-640364487|0,n=(n<<4|n>>>28)+i|0,s+=(n^i^o)+t[12]-421815835|0,s=(s<<11|s>>>21)+n|0,o+=(s^n^i)+t[15]+530742520|0,o=(o<<16|o>>>16)+s|0,i+=(o^s^n)+t[2]-995338651|0,i=(i<<23|i>>>9)+o|0,n+=(o^(i|~s))+t[0]-198630844|0,n=(n<<6|n>>>26)+i|0,s+=(i^(n|~o))+t[7]+1126891415|0,s=(s<<10|s>>>22)+n|0,o+=(n^(s|~i))+t[14]-1416354905|0,o=(o<<15|o>>>17)+s|0,i+=(s^(o|~n))+t[5]-57434055|0,i=(i<<21|i>>>11)+o|0,n+=(o^(i|~s))+t[12]+1700485571|0,n=(n<<6|n>>>26)+i|0,s+=(i^(n|~o))+t[3]-1894986606|0,s=(s<<10|s>>>22)+n|0,o+=(n^(s|~i))+t[10]-1051523|0,o=(o<<15|o>>>17)+s|0,i+=(s^(o|~n))+t[1]-2054922799|0,i=(i<<21|i>>>11)+o|0,n+=(o^(i|~s))+t[8]+1873313359|0,n=(n<<6|n>>>26)+i|0,s+=(i^(n|~o))+t[15]-30611744|0,s=(s<<10|s>>>22)+n|0,o+=(n^(s|~i))+t[6]-1560198380|0,o=(o<<15|o>>>17)+s|0,i+=(s^(o|~n))+t[13]+1309151649|0,i=(i<<21|i>>>11)+o|0,n+=(o^(i|~s))+t[4]-145523070|0,n=(n<<6|n>>>26)+i|0,s+=(i^(n|~o))+t[11]-1120210379|0,s=(s<<10|s>>>22)+n|0,o+=(n^(s|~i))+t[2]+718787259|0,o=(o<<15|o>>>17)+s|0,i+=(s^(o|~n))+t[9]-343485551|0,i=(i<<21|i>>>11)+o|0,e[0]=n+e[0]|0,e[1]=i+e[1]|0,e[2]=o+e[2]|0,e[3]=s+e[3]|0},r.prototype.start=function(){return this._dataLength=0,this._bufferLength=0,this._state.set(r.stateIdentity),this},r.prototype.appendStr=function(e){var t=this._buffer8,n=this._buffer32,i=this._bufferLength,o,s;for(s=0;s<e.length;s+=1){if(o=e.charCodeAt(s),o<128)t[i++]=o;else if(o<2048)t[i++]=(o>>>6)+192,t[i++]=o&63|128;else if(o<55296||o>56319)t[i++]=(o>>>12)+224,t[i++]=o>>>6&63|128,t[i++]=o&63|128;else{if(o=(o-55296)*1024+(e.charCodeAt(++s)-56320)+65536,o>1114111)throw new Error("Unicode standard supports code points up to U+10FFFF");t[i++]=(o>>>18)+240,t[i++]=o>>>12&63|128,t[i++]=o>>>6&63|128,t[i++]=o&63|128}i>=64&&(this._dataLength+=64,r._md5cycle(this._state,n),i-=64,n[0]=n[16])}return this._bufferLength=i,this},r.prototype.appendAsciiStr=function(e){for(var t=this._buffer8,n=this._buffer32,i=this._bufferLength,o,s=0;;){for(o=Math.min(e.length-s,64-i);o--;)t[i++]=e.charCodeAt(s++);if(i<64)break;this._dataLength+=64,r._md5cycle(this._state,n),i=0}return this._bufferLength=i,this},r.prototype.appendByteArray=function(e){for(var t=this._buffer8,n=this._buffer32,i=this._bufferLength,o,s=0;;){for(o=Math.min(e.length-s,64-i);o--;)t[i++]=e[s++];if(i<64)break;this._dataLength+=64,r._md5cycle(this._state,n),i=0}return this._bufferLength=i,this},r.prototype.getState=function(){var e=this._state;return{buffer:String.fromCharCode.apply(null,Array.from(this._buffer8)),buflen:this._bufferLength,length:this._dataLength,state:[e[0],e[1],e[2],e[3]]}},r.prototype.setState=function(e){var t=e.buffer,n=e.state,i=this._state,o;for(this._dataLength=e.length,this._bufferLength=e.buflen,i[0]=n[0],i[1]=n[1],i[2]=n[2],i[3]=n[3],o=0;o<t.length;o+=1)this._buffer8[o]=t.charCodeAt(o)},r.prototype.end=function(e){e===void 0&&(e=!1);var t=this._bufferLength,n=this._buffer8,i=this._buffer32,o=(t>>2)+1;this._dataLength+=t;var s=this._dataLength*8;if(n[t]=128,n[t+1]=n[t+2]=n[t+3]=0,i.set(r.buffer32Identity.subarray(o),o),t>55&&(r._md5cycle(this._state,i),i.set(r.buffer32Identity)),s<=4294967295)i[14]=s;else{var a=s.toString(16).match(/(.*?)(.{0,8})$/);if(a===null)return;var u=parseInt(a[2],16),f=parseInt(a[1],16)||0;i[14]=u,i[15]=f}return r._md5cycle(this._state,i),e?this._state:r._hex(this._state)},r.stateIdentity=new Int32Array([1732584193,-271733879,-1732584194,271733878]),r.buffer32Identity=new Int32Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]),r.hexChars="0123456789abcdef",r.hexOut=[],r.onePassHasher=new r,r}();ti.Md5=ra;if(ra.hashStr("hello")!=="5d41402abc4b2a76b9719d911017c592")throw new Error("Md5 self test failed.")});var il={};Pt(il,{AACDepay:()=>ot,BasicDepay:()=>sr,CanvasSink:()=>st,H264Depay:()=>ct,Html5CanvasPipeline:()=>Hr,Html5VideoMetadataPipeline:()=>qr,Html5VideoPipeline:()=>_t,HttpMsePipeline:()=>Gr,HttpSource:()=>dr,Inspector:()=>pr,JPEGDepay:()=>lt,MessageType:()=>I,MetadataPipeline:()=>jr,Mp4Capture:()=>mr,Mp4Muxer:()=>pt,MseSink:()=>Te,ONVIFDepay:()=>Ce,Pipeline:()=>Be,RTCPPacketType:()=>Kn,RTSPResponseError:()=>It,RTSP_METHOD:()=>Or,RtspMjpegPipeline:()=>xt,RtspMp4Pipeline:()=>bt,RtspParser:()=>mt,RtspPipeline:()=>ee,RtspSession:()=>yt,SDESItem:()=>Jn,SR:()=>Hs,Scheduler:()=>We,Sink:()=>Q,Source:()=>V,Tube:()=>R,WSSource:()=>G,WsSdpPipeline:()=>Wr,addRTSPRetry:()=>aa,bodyOffset:()=>Ar,cSrc:()=>ns,cSrcCount:()=>Se,components:()=>ei,connectionEnded:()=>Lr,contentBase:()=>Br,contentLocation:()=>Mr,createTransform:()=>ye,extHeader:()=>is,extHeaderLength:()=>Mt,extension:()=>or,extractHeaderValue:()=>re,extractURIs:()=>Js,getTime:()=>Pr,isRtcpApp:()=>$s,isRtcpBye:()=>wr,isRtcpRR:()=>js,isRtcpSDES:()=>Ws,isRtcpSR:()=>_r,marker:()=>ce,messageFromBuffer:()=>Sr,padding:()=>es,parse:()=>Qn,parseRtcp:()=>Xn,payload:()=>Z,payloadType:()=>O,pipelines:()=>ni,range:()=>Ir,rtcpMessageFromBuffer:()=>xr,sSrc:()=>rs,sequence:()=>Rr,sequenceNumber:()=>ts,sessionId:()=>Tr,sessionTimeout:()=>Cr,statusCode:()=>ht,timestamp:()=>H,utils:()=>ii,version:()=>Zo});module.exports=ma(il);c();var ei={};Pt(ei,{AACDepay:()=>ot,BasicDepay:()=>sr,CanvasSink:()=>st,H264Depay:()=>ct,HttpSource:()=>dr,Inspector:()=>pr,JPEGDepay:()=>lt,MessageType:()=>I,Mp4Capture:()=>mr,Mp4Muxer:()=>pt,MseSink:()=>Te,ONVIFDepay:()=>Ce,RTSPResponseError:()=>It,RTSP_METHOD:()=>Or,RtspParser:()=>mt,RtspSession:()=>yt,Sink:()=>Q,Source:()=>V,Tube:()=>R,WSSource:()=>G,createTransform:()=>ye});c();c();var ge=C(N());c();var Ee=C(N()),fe=class{static consumer(e=()=>{}){return new Ee.Writable({objectMode:!0,write(t,n,i){e(t),i()}})}static peeker(e){if(typeof e!="function")throw new Error("you must supply a function");return new Ee.Transform({objectMode:!0,transform(t,n,i){e(t),i(void 0,t)}})}static producer(e){let t=0;return new Ee.Readable({objectMode:!0,read(){e!==void 0&&(t<e.length?this.push(e[t++]):this.push(null))}})}static recorder(e,t){return new Ee.Transform({objectMode:!0,transform(n,i,o){let s=Date.now(),a=Object.assign({},n,{data:n.data.toString("base64")});t.write(JSON.stringify({type:e,timestamp:s,message:a},null,2)),t.write(`,
|
|
1408
1502
|
`),o(void 0,n)}})}static replayer(e){let t=0,n=e[0].timestamp;return new Ee.Readable({objectMode:!0,read(){let i=e[t++];if(i){let{type:o,timestamp:s,message:a}=i,u=s-n;if(n=s,a){let f=a.data?Buffer.from(a.data,"base64"):Buffer.alloc(0),l=Object.assign({},a,{data:f});this.push({type:o,delay:u,msg:l})}else this.push({type:o,delay:u,msg:null})}else this.push(null)}})}};var ir=class{},V=class extends ir{constructor(t=new ge.Readable({objectMode:!0}),n=new ge.Writable({objectMode:!0})){super();this.incoming=t,this.outgoing=n,this.next=null,this.prev=null}static fromMessages(t){return new V(fe.producer(t),fe.consumer())}connect(t){if(t===null)return this;if(this.next!==null||t.prev!==null)throw new Error("connection failed: component(s) already connected");if(!this.incoming.readable||!this.outgoing.writable)throw new Error("connection failed: this component not compatible");if(!t.incoming.writable||!t.outgoing.readable)throw new Error("connection failed: next component not compatible");try{this.incoming.pipe(t.incoming),t.outgoing.pipe(this.outgoing)}catch(o){throw new Error(`connection failed: ${o.message}`)}let n=o=>{this.incoming.emit("error",o)};t.incoming.on("error",n);let i=o=>{t.outgoing.emit("error",o)};return this.outgoing.on("error",i),this.next=t,t.prev=this,this._incomingErrorHandler=n,this._outgoingErrorHandler=i,t}disconnect(){let t=this.next;return t!==null&&(this.incoming.unpipe(t.incoming),t.outgoing.unpipe(this.outgoing),typeof this._incomingErrorHandler<"u"&&t.incoming.removeListener("error",this._incomingErrorHandler),typeof this._outgoingErrorHandler<"u"&&this.outgoing.removeListener("error",this._outgoingErrorHandler),this.next=null,t.prev=null,delete this._incomingErrorHandler,delete this._outgoingErrorHandler),this}},R=class extends V{constructor(t=new ge.PassThrough({objectMode:!0}),n=new ge.PassThrough({objectMode:!0})){super(t,n);this.incoming=t,this.outgoing=n}static fromHandlers(t,n){let i=t?fe.peeker(t):void 0,o=n?fe.peeker(n):void 0;return new R(i,o)}},Q=class extends ir{constructor(t=new ge.Writable({objectMode:!0}),n=new ge.Readable({objectMode:!0})){super();this.incoming=t,this.outgoing=n,this.next=null,this.prev=null}static fromHandler(t){let n=new Q(fe.consumer(t),fe.producer(void 0));return n.incoming.on("finish",()=>{n.outgoing.push(null)}),n}connect(){throw new Error("connection failed: attempting to connect after a sink")}disconnect(){return this}};c();c();c();var it=[128,64,32,16,8,4,2,1];var Zo=r=>r[0]>>>6,es=r=>!!(r[0]&it[2]),or=r=>!!(r[0]&it[3]),Se=r=>r[0]&15,ce=r=>!!(r[1]&it[0]),O=r=>r[1]&127,ts=r=>r.readUInt16BE(2),H=r=>r.readUInt32BE(4),rs=r=>r.readUInt32BE(8),ns=(r,e=0)=>Se(r)>e?r.readUInt32BE(12+e*4):0,Mt=r=>or(r)?r.readUInt16BE(12+Se(r)*4+2):0,is=r=>Mt(r)===0?Buffer.from([]):r.slice(12+Se(r)*4,12+Se(r)*4+4+Mt(r)*4),Z=r=>or(r)?r.slice(12+Se(r)*4+4+Mt(r)*4):r.slice(12+Se(r)*4);c();var I=(d=>(d[d.UNKNOWN=0]="UNKNOWN",d[d.RAW=1]="RAW",d[d.RTP=2]="RTP",d[d.RTCP=3]="RTCP",d[d.RTSP=4]="RTSP",d[d.SDP=5]="SDP",d[d.ELEMENTARY=6]="ELEMENTARY",d[d.H264=7]="H264",d[d.ISOM=8]="ISOM",d[d.XML=9]="XML",d[d.JPEG=10]="JPEG",d))(I||{});c();function os(r,e,t){let n=Z(r.data),i=0;if(e){let s=n.readUInt16BE(0);i=2+(s+s%8)/8}let o={type:6,data:n.slice(i),payloadType:O(r.data),timestamp:H(r.data),ntpTimestamp:r.ntpTimestamp};t(o)}c();var ss=C(N()),ye=r=>new ss.Transform({objectMode:!0,transform:r});var ot=class extends R{constructor(){let e,t,n=ye(function(i,o,s){if(i.type===5){let a;for(let u of i.sdp.media)u.type==="audio"&&u.fmtp&&u.fmtp.parameters&&u.fmtp.parameters.mode==="AAC-hbr"&&(a=u);if(a&&a.rtpmap!==void 0){e=Number(a.rtpmap.payloadType);let u=a.fmtp.parameters,f=Number(u.sizelength)||0,l=Number(u.indexlength)||0,d=Number(u.indexdeltalength)||0,h=Number(u.ctsdeltalength)||0,m=Number(u.dtsdeltalength)||0,b=Number(u.randomaccessindication)||0,y=Number(u.streamstateindication)||0,w=Number(u.auxiliarydatasizelength)||0;t=f+Math.max(l,d)+h+m+b+y+w>0}s(void 0,i)}else i.type===2&&O(i.data)===e?(os(i,t,this.push.bind(this)),s()):s(void 0,i)});super(n)}};c();var sr=class extends R{constructor(e){if(e===void 0)throw new Error("you must supply a payload type to BasicDepayComponent");let t=Buffer.alloc(0),n=ye(function(i,o,s){if(i.type===2&&O(i.data)===e){let a=Z(i.data);t=Buffer.concat([t,a]),ce(i.data)&&(t.length>0&&this.push({data:t,timestamp:H(i.data),ntpTimestamp:i.ntpTimestamp,payloadType:O(i.data),type:6}),t=Buffer.alloc(0)),s()}else s(void 0,i)});super(n)}};c();c();var ar=class{constructor(){this.elapsed=0,this.started=0,this.stopped=!0}start(){this.stopped&&(this.started=window.performance.now(),this.stopped=!1)}stop(){this.stopped||(this.elapsed=this.now(),this.stopped=!0)}reset(){this.elapsed=0,this.started=0,this.stopped=!0}now(){return this.stopped?this.elapsed:this.elapsed+(window.performance.now()-this.started)}play(){this.start()}pause(){this.stop()}get currentTime(){return this.now()/1e3}};c();var We=class{constructor(e,t,n=10){this._clock=e,this._handler=t,this._tolerance=n,this._nextRun=0,this._nextPlay=0,this._fifo=[],this._ntpPresentationTime=0,this._suspended=!1}reset(){clearTimeout(this._nextRun),clearTimeout(this._nextPlay),this._fifo=[],this._ntpPresentationTime=0,this._suspended=!1}init(e){this._ntpPresentationTime=e}suspend(){clearTimeout(this._nextPlay),this._suspended=!0}resume(){this._suspended=!1,this.run(void 0)}run(e){if(clearTimeout(this._nextRun),typeof this._ntpPresentationTime>"u"||(typeof e<"u"&&this._fifo.push(e),this._suspended)||this._fifo.length===0)return;let t=0,n;do{let i=this._fifo.shift();if(i===void 0)throw new Error("internal error: message should never be undefined");n=i;let o=n.ntpTimestamp;if(o===void 0)continue;t=o-this._ntpPresentationTime-this._clock.currentTime*1e3,Math.abs(t)<this._tolerance&&this._handler&&this._handler(n)}while(t<this._tolerance&&this._fifo.length>0);t<-this._tolerance?(clearTimeout(this._nextPlay),this._clock.pause(),this._nextPlay=window.setTimeout(()=>this._clock.play(),-t)):t>this._tolerance&&(this._fifo.unshift(n),this._nextRun=window.setTimeout(()=>this.run(void 0),t))}};var ur=C(N()),ac=r=>{r.bitrate=0,r.framerate=0,r.renderedFrames=0},uc=r=>{let e=0,t=0,n=0;return(i,{byteLength:o,duration:s})=>{if(e+=o,t+=s,n++,t>=r){let a=8*e,u=n,f=t/r;i.bitrate=a/f,i.framerate=u/f,e=0,t=0,n=0}}},st=class extends Q{constructor(t){if(t===void 0)throw new Error("canvas element argument missing");let n=0,i=0,o=0,s={bitrate:0,framerate:0,renderedFrames:0},a,u=null;window.createImageBitmap!==void 0&&(u=t.getContext("bitmaprenderer")),u===null&&(u=t.getContext("2d"));let f;if(u===null)f=()=>{};else if("transferFromImageBitmap"in u){let _=u;f=({blob:v})=>{s.renderedFrames++,window.createImageBitmap(v).then(q=>{_.transferFromImageBitmap(q)}).catch(()=>{})}}else{let _=u,v=new Image;v.onload=()=>{_.drawImage(v,0,0)},f=({blob:q})=>{s.renderedFrames++;let A=window.URL.createObjectURL(q);v.src=A}}let l=new ar,d=new We(l,f),h=0,m=()=>{this.onCanplay&&this.onCanplay()},b=_=>{this.onSync&&this.onSync(_)},y=new ur.Writable({objectMode:!0,write:(_,v,q)=>{if(_.type===5){l.reset(),d.reset(),n=0;let A=_.sdp.media.find(j=>j.type==="video"&&j.rtpmap!==void 0&&j.rtpmap.encodingName==="JPEG");A!==void 0&&A.rtpmap!==void 0&&(o=A.rtpmap.clockrate,ac(s),a=uc(o)),q()}else if(_.type===10){let{timestamp:A,ntpTimestamp:j}=_;if(!n){n=A,i=A;let{width:Ie,height:Ae}=_.framesize;t.width=Ie,t.height=Ae,d.init(0)}let Y=1e3*(A-n)/o,Ge=new window.Blob([_.data],{type:"image/jpeg"});!h&&j&&(h=j-Y,b(h)),d.run({ntpTimestamp:Y,blob:Ge}),A===n&&m(),a(s,{byteLength:_.data.length,duration:A-i}),i=A,q()}else q()}}),w=new ur.Readable({objectMode:!0,read:function(){}});w.on("error",()=>{console.warn("outgoing stream broke somewhere")});super(y,w);this._clock=l,this._scheduler=d,this._info=s,this.onCanplay=void 0,this.onSync=void 0}get currentTime(){return this._clock.currentTime}pause(){this._scheduler.suspend(),this._clock.pause()}play(){this._clock.play(),this._scheduler.resume()}get bitrate(){return this._info.bitrate}get framerate(){return this._info.framerate}};c();var ds=C(N());c();var ls=C(le());var wc=(0,ls.default)("msl:h264depay"),lr=class{constructor(){this._buffer=Buffer.alloc(0)}parse(e){let t=Z(e.data),n=t[0]&31;if(n===28){let i=t[0],o=t[1],s=!!(o>>7),a=o&31,u=i&224|a,f=o&64;if(s)return this._buffer=Buffer.concat([Buffer.from([0,0,0,0,u]),t.slice(2)]),null;if(f){let l=Buffer.concat([this._buffer,t.slice(2)]);l.writeUInt32BE(l.length-4,0);let d={data:l,type:7,timestamp:H(e.data),ntpTimestamp:e.ntpTimestamp,payloadType:O(e.data),nalType:a};return this._buffer=Buffer.alloc(0),d}else return this._buffer=Buffer.concat([this._buffer,t.slice(2)]),null}else if((n===1||n===5)&&this._buffer.length===0){let i=Buffer.concat([Buffer.from([0,0,0,0]),t]);i.writeUInt32BE(i.length-4,0);let o={data:i,type:7,timestamp:H(e.data),ntpTimestamp:e.ntpTimestamp,payloadType:O(e.data),nalType:n};return this._buffer=Buffer.alloc(0),o}else return wc(`H264depayComponent can only extract types 1,5 and 28, got ${n}`),this._buffer=Buffer.alloc(0),null}};var ct=class extends R{constructor(){let e,t=!1,n=[],i=new lr,o=new ds.Transform({objectMode:!0,transform:function(s,a,u){if(s.type===5){let f=s.sdp.media.find(l=>l.type==="video"&&l.rtpmap!==void 0&&l.rtpmap.encodingName==="H264");f!==void 0&&f.rtpmap!==void 0&&(e=f.rtpmap.payloadType),u(void 0,s)}else if(s.type===2&&O(s.data)===e){let f=ce(s.data),l=i.parse(s);if(l===null||!t&&l.nalType!==5){u();return}t=!0,n.push(l.data),f&&(this.push({...l,data:n.length===1?n[0]:Buffer.concat(n)}),n=[]),u()}else u(void 0,s)}});super(o)}};c();var ps=C(le());var hs=C(N());var Nn=(0,ps.default)("msl:http-source"),dr=class extends V{constructor(t){let{uri:n,options:i}=t,o=new hs.Readable({objectMode:!0,read:function(){}});o.on("error",s=>{console.warn("closing socket due to incoming error",s),this._reader&&this._reader.cancel()});super(o);o._read=()=>{this._pull()},this.uri=n,this.options=i,this._allDone=!1}play(){if(this.uri===void 0)throw new Error("cannot start playing when there is no URI");this._abortController=new AbortController,this.length=0,fetch(this.uri,{credentials:"include",signal:this._abortController.signal,...this.options}).then(t=>{if(t.body===null)throw new Error("empty response body");this.onHeaders&&this.onHeaders(t.headers),this._reader=t.body.getReader(),this._pull()}).catch(t=>{console.error("http-source: fetch failed: ",t)})}abort(){this._reader&&this._reader.cancel().catch(t=>{console.log("http-source: cancel reader failed: ",t)}),this._abortController&&this._abortController.abort()}_isClosed(){return this._allDone}_close(){this._reader=void 0,this._allDone=!0,this.incoming.push(null),this.onServerClose?.()}_pull(){this._reader!==void 0&&this._reader.read().then(({done:t,value:n})=>{if(t){this._isClosed()||(Nn("fetch completed, total downloaded: ",this.length," bytes"),this._close());return}if(n===void 0)throw new Error("expected value to be defined");if(this.length===void 0)throw new Error("expected length to be defined");this.length+=n.length;let i=Buffer.from(n);this.incoming.push({data:i,type:1})?this._pull():Nn("downstream back pressure: pausing read")}).catch(t=>{Nn("http-source: read failed: ",t),this._isClosed()||this._close()})}};c();var Hn=C(N()),ms=(r,e)=>{let t=Date.now(),n=i=>{let o=Date.now();console.log(`${r}: +${o-t}ms`,i),t=o};return e===void 0?n:i=>i.type===e&&n(i)},pr=class extends R{constructor(e){let t=ms("incoming",e),n=new Hn.Transform({objectMode:!0,transform:function(s,a,u){t(s),u(void 0,s)}}),i=ms("outgoing",e),o=new Hn.Transform({objectMode:!0,transform:function(s,a,u){i(s),u(void 0,s)}});super(n,o)}};c();c();c();function Ss(){return Buffer.from([255,216])}function Rs(r,e){let t=r&1?128:64,n=r&2?128:64;if(e.length!==t+n)throw new Error("invalid quantization table");let i=Buffer.from([255,219,0,t+3,0]),o=Buffer.from([255,219,0,n+3,1]);return Buffer.concat([i,e.slice(0,t),o,e.slice(t)])}function Ts(r,e,t){return Buffer.from([255,192,0,17,8,e>>8,e,r>>8,r,3,0,t===0?33:34,0,1,17,1,2,17,1])}var gs=[0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0],ys=[0,1,2,3,4,5,6,7,8,9,10,11],bs=[0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,125],xs=[1,2,3,0,4,17,5,18,33,49,65,6,19,81,97,7,34,113,20,50,129,145,161,8,35,66,177,193,21,82,209,240,36,51,98,114,130,9,10,22,23,24,25,26,37,38,39,40,41,42,52,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,225,226,227,228,229,230,231,232,233,234,241,242,243,244,245,246,247,248,249,250],_s=[0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0],ws=[0,1,2,3,4,5,6,7,8,9,10,11],vs=[0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,119],Es=[0,1,2,3,17,4,5,33,49,6,18,65,81,7,97,113,19,34,50,129,8,20,66,145,161,177,193,9,35,51,82,240,21,98,114,209,10,22,36,52,225,37,241,23,24,25,26,38,39,40,41,42,53,54,55,56,57,58,67,68,69,70,71,72,73,74,83,84,85,86,87,88,89,90,99,100,101,102,103,104,105,106,115,116,117,118,119,120,121,122,130,131,132,133,134,135,136,137,138,146,147,148,149,150,151,152,153,154,162,163,164,165,166,167,168,169,170,178,179,180,181,182,183,184,185,186,194,195,196,197,198,199,200,201,202,210,211,212,213,214,215,216,217,218,226,227,228,229,230,231,232,233,234,242,243,244,245,246,247,248,249,250];function Cs(){let r=[[255,196,0,3+gs.length+ys.length,0],gs,ys],e=[[255,196,0,3+bs.length+xs.length,1<<4|0],bs,xs],t=[[255,196,0,3+_s.length+ws.length,0<<4|1],_s,ws],n=[[255,196,0,3+vs.length+Es.length,1<<4|1],vs,Es];return Buffer.concat([...r.map(Buffer.from),...e.map(Buffer.from),...t.map(Buffer.from),...n.map(Buffer.from)])}function Bs(){return Buffer.from([255,218,0,12,3,0,0,1,17,2,17,0,63,0])}function Ms(r){return Buffer.from([255,221,0,4,r>>8,r&255])}c();c();function hr(r,e,t){return r>t?t:r<e?e:r}var Ec=[16,11,12,14,12,10,16,14,13,14,18,17,16,19,24,40,26,24,22,22,24,49,35,37,29,40,58,51,61,60,57,51,56,55,64,72,92,78,64,68,87,69,55,56,80,109,81,87,95,98,103,104,103,62,77,113,121,112,100,120,92,101,103,99],Sc=[17,18,18,24,21,24,47,26,26,47,99,66,56,66,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99];function Ls(r){let e=hr(r,1,99),t=Buffer.alloc(128),n=r<50?Math.floor(5e3/e):200-e*2;for(let i=0;i<64;i++){let o=Math.floor((Ec[i]*n+50)/100),s=Math.floor((Sc[i]*n+50)/100);t.writeUInt8(hr(o,1,255),i),t.writeUInt8(hr(s,1,255),i+64)}return t}function qn(r=0,e=0){let t=Ss(),n=Cs(),i=Bs();return function(s){let a,u=[];for(let _ of s){let v=Z(_),q=v.readUInt8(0),A=v.readUInt8(1)<<16|v.readUInt8(2)<<8|v.readUInt8(3),j=v.readUInt8(4),Y=v.readUInt8(5),Ge=v.readUInt8(6)*8||r,Ie=v.readUInt8(7)*8||e;v=v.slice(8);let Ae=0;if(j>=64&&j<=127&&(Ae=v.readUInt16BE(0),v=v.slice(4)),Y>=128&&A===0){let oi=v.readUInt8(1),At=v.readUInt16BE(2),ua=v.slice(4,4+At);a={typeSpecific:q,type:j,width:Ge,height:Ie,DRI:Ae,precision:oi,qTable:ua},v=v.slice(4+At)}else if(Y<128&&A===0){let At=Ls(Y);a={typeSpecific:q,type:j,width:Ge,height:Ie,DRI:Ae,precision:0,qTable:At}}u.push(v)}if(a===void 0)throw new Error("no quantization header present");let{precision:f,qTable:l,type:d,width:h,height:m}=a,b=Rs(f,l),y=a.DRI===0?Buffer.alloc(0):Ms(a.DRI),w=Ts(h,m,d);return{size:{width:h,height:m},data:Buffer.concat([t,b,y,w,n,i,...u])}}}var Is=C(N());var lt=class extends R{constructor(){let e,t=[],n,i=new Is.Transform({objectMode:!0,transform:function(o,s,a){if(o.type===5){let u=o.sdp.media.find(f=>f.type==="video"&&f.rtpmap!==void 0&&f.rtpmap.encodingName==="JPEG");if(u!==void 0&&u.rtpmap!==void 0){e=Number(u.rtpmap.payloadType);let f=u.framesize;if(f!==void 0){let[l,d]=f;n=qn(l,d)}else n=qn()}a(void 0,o)}else if(o.type===2&&O(o.data)===e){if(t.push(o.data),ce(o.data)&&t.length>0){let u=n(t);this.push({timestamp:H(o.data),ntpTimestamp:o.ntpTimestamp,payloadType:O(o.data),data:u.data,framesize:u.size,type:10}),t=[]}a()}else a(void 0,o)}});super(i)}};c();var jn=C(le());var As=C(N());var Rc=225e6,mr=class extends R{constructor(t=Rc){let n=new As.Transform({objectMode:!0,transform:(i,o,s)=>{this._active&&i.type===8&&i.tracks!==void 0&&(this._capture=!0),this._capture&&i.type===8&&(this._bufferOffset<this._buffer.byteLength-i.data.byteLength?(i.data.copy(this._buffer,this._bufferOffset),this._bufferOffset+=i.data.byteLength):this.stop()),s(void 0,i)}});n.on("finish",()=>{this.stop()});super(n);this._buffer=Buffer.allocUnsafe(0),this._bufferSize=t,this._bufferOffset=0,this._active=!1,this._capture=!1,this._captureCallback=()=>{}}start(t){this._active||((0,jn.default)("msl:capture:start")(t),this._captureCallback=t,this._buffer=Buffer.allocUnsafe(this._bufferSize),this._bufferOffset=0,this._active=!0)}stop(){if(this._active){(0,jn.default)("msl:capture:stop")(`captured bytes: ${this._bufferOffset}`);try{this._captureCallback(this._buffer.slice(0,this._bufferOffset))}catch(t){console.error(t)}this._buffer=Buffer.allocUnsafe(0),this._bufferOffset=0,this._active=!1,this._capture=!1}}};c();var Yn=C(le());c();var Wn=Math.pow(2,32),$=class{constructor(e){this.byteLength=e}},te=class extends ${constructor(t=0){super(t);this.copy=(t,n)=>{t.fill(0,n,n+this.byteLength)}}load(){}},Re=class extends ${constructor(t){super(t.length);this.copy=(t,n)=>{for(let i=0;i<this.byteLength;i+=1)t[n+i]=this.value.charCodeAt(i)};this.load=(t,n)=>{this.value=t.slice(n,n+this.byteLength).toString("ascii")};this.value=t}},k=class extends ${constructor(t=0){super(1);this.copy=(t,n)=>{t.writeUInt8(this.value,n)};this.load=(t,n)=>{this.value=t.readUInt8(n)};this.value=t}},Lt=class extends ${constructor(t){super(t.length);this.copy=(t,n)=>{for(let i=0;i<this.value.length;++i)t.writeUInt8(this.value[i],n+i)};this.load=(t,n)=>{for(let i=0;i<this.value.length;++i)this.value[i]=t.readUInt8(n+i)};this.value=t}},L=class extends ${constructor(t=0){super(2);this.copy=(t,n)=>{t.writeUInt16BE(this.value,n)};this.load=(t,n)=>{this.value=t.readUInt16BE(n)};this.value=t}},$n=class extends ${constructor(t=0){super(3);this.copy=(t,n)=>{t.writeUInt8(this.value>>16&255,n),t.writeUInt8(this.value>>8&255,n+1),t.writeUInt8(this.value&255,n+2)};this.load=(t,n)=>{this.value=t.readUInt8(n)<<16+t.readUInt8(n+1)<<8+t.readUInt8(n+2)};this.value=t}},Gn=class extends ${constructor(t){super(t.length*2);this.copy=(t,n)=>{for(let i=0;i<this.value.length;++i)t.writeUInt16BE(this.value[i],n+2*i)};this.load=(t,n)=>{for(let i=0;i<this.value.length;++i)this.value[i]=t.readUInt16BE(n+2*i)};this.value=t}},g=class extends ${constructor(t=0){super(4);this.copy=(t,n)=>{t.writeUInt32BE(this.value,n)};this.load=(t,n)=>{this.value=t.readUInt32BE(n)};this.value=t}},dt=class extends ${constructor(t){super(t.length*4);this.copy=(t,n)=>{for(let i=0;i<this.value.length;++i)t.writeUInt32BE(this.value[i],n+4*i)};this.load=(t,n)=>{for(let i=0;i<this.value.length;++i)this.value[i]=t.readUInt32BE(n+4*i)};this.value=t}},Vn=class extends ${constructor(t=0){super(8);this.copy=(t,n)=>{let i=this.value/Wn|0,o=this.value-i*Wn;t.writeUInt32BE(i,n),t.writeUInt32BE(o,n+4)};this.load=(t,n)=>{let i=t.readUInt32BE(n),o=t.readUInt32BE(n+4);this.value=i*Wn+o};this.value=t}},Fs=function(r=0){return class extends ${constructor(n){super(0);this.copy=(n,i)=>{let o=0;for(let s of this.value)s.copy(n,i+o),o+=s.byteLength};this.load=()=>{};this.value=n.reduce((i,o)=>i.concat(new L(o.length),new Lt(o)),[new k(r|n.length)]),this.byteLength=this.value.reduce((i,o)=>i+o.byteLength,0)}}},Ps={ftyp:{container:"file",mandatory:!0,quantity:"one",box:"Box",is_container:!0,body:[["major_brand",Re,"isom"],["minor_version",g,0],["compatible_brands",Re,"mp41"]]},moov:{container:"file",mandatory:!0,quantity:"one",box:"Box",is_container:!0},mdat:{container:"file",mandatory:!1,quantity:"any",box:"Box",is_container:!1,body:[]},mvhd:{container:"moov",mandatory:!0,quantity:"one",box:"FullBox",is_container:!1,body:[["creation_time",g,0],["modification_time",g,0],["timescale",g,1e3],["duration",g,4294967295],["rate",g,65536],["volume",L,256],["reserved",te,10],["matrix",dt,[65536,0,0,0,65536,0,0,0,1073741824]],["pre_defined",te,24],["next_track_ID",g,4294967295]]},trak:{container:"moov",mandatory:!0,quantity:"one+",box:"Box",is_container:!0},tkhd:{container:"trak",mandatory:!0,quantity:"one",box:"FullBox",is_container:!1,config:{flags:3},body:[["creation_time",g,0],["modification_time",g,0],["track_ID",g,1],["reserved",te,4],["duration",g,0],["reserved2",te,8],["layer",L,0],["alternate_group",L,0],["volume",L,256],["reserved3",te,2],["matrix",dt,[65536,0,0,0,65536,0,0,0,1073741824]],["width",g,0],["height",g,0]]},tref:{container:"trak",mandatory:!1,quantity:"one-",box:"Box",is_container:!1},mdia:{container:"trak",mandatory:!1,quantity:"one",box:"Box",is_container:!0},mdhd:{container:"mdia",mandatory:!1,quantity:"one",box:"FullBox",is_container:!1,body:[["creation_time",g,0],["modification_time",g,0],["timescale",g,1e3],["duration",g,4294967295],["language",L,0],["pre_defined",L,0]]},hdlr:{container:"mdia",mandatory:!0,quantity:"one",box:"FullBox",is_container:!1,body:[["predefined",g,0],["handler_type",Re,"vide"],["reserved",te,12],["name",Re,"VideoHandler\0"]]},minf:{container:"mdia",mandatory:!0,quantity:"one",box:"Box",is_container:!0},vmhd:{container:"minf",mandatory:!0,quantity:"one",box:"FullBox",is_container:!1,config:{flags:1},body:[["graphicsmode",L,0],["opcolor",Gn,[0,0,0]]]},smhd:{container:"minf",mandatory:!0,quantity:"one",box:"FullBox",is_container:!1,body:[["balance",L,0],["reserved",L]]},dinf:{container:"minf",mandatory:!0,quantity:"one",box:"Box",is_container:!0},dref:{container:"dinf",mandatory:!0,quantity:"one",box:"FullBox",is_container:!0,body:[["entry_count",g,0]]},"url ":{container:"dref",mandatory:!0,quantity:"one+",box:"FullBox",is_container:!1,config:{flags:1},body:[]},stbl:{container:"minf",mandatory:!0,quantity:"one",box:"Box",is_container:!0},stts:{container:"stbl",mandatory:!0,quantity:"one",box:"FullBox",is_container:!1,body:[["entry_count",g,0]]},stsd:{container:"stbl",mandatory:!0,quantity:"one",box:"FullBox",is_container:!0,body:[["entry_count",g,1]]},avc1:{container:"stsd",mandatory:!1,quantity:"one",box:"Box",is_container:!0,body:[["reserved",te,6],["data_reference_index",L,1],["pre_defined",L,0],["reserved2",te,2],["pre_defined2",dt,[0,0,0]],["width",L,1920],["height",L,1080],["horizresolution",g,4718592],["vertresolution",g,4718592],["reserved3",g,0],["frame_count",L,1],["compressorname",Lt,Buffer.alloc(32)],["depth",L,24],["pre_defined3",L,65535]]},avcC:{container:"avc1",mandatory:!1,quantity:"one",box:"Box",is_container:!1,body:[["configurationVersion",k,1],["AVCProfileIndication",k,77],["profile_compatibility",k,0],["AVCLevelIndication",k,41],["lengthSizeMinusOne",k,255],["sequenceParameterSets",Fs(224),[]],["pictureParameterSets",Fs(),[]]]},mp4a:{container:"stsd",mandatory:!1,quantity:"one",box:"Box",is_container:!0,body:[["reserved",te,6],["data_reference_index",L,1],["reserved2",dt,[0,0]],["channelcount",L,2],["samplesize",L,16],["pre_defined",L,0],["reserved3",L,0],["samplerate",g,0]]},esds:{container:"mp4a",mandatory:!1,quantity:"one",box:"FullBox",is_container:!1,body:[["ES_DescrTag",k,3],["ES_DescrLength",k,25],["ES_ID",L,1],["flagsAndStreamPriority",k,0],["DecoderConfigDescrTag",k,4],["DecoderConfigDescrLength",k,17],["objectProfileIndication",k,64],["streamTypeUpstreamReserved",k,21],["bufferSizeDB",Lt,[0,0,0]],["maxBitRate",g,0],["avgBitRate",g,0],["DecSpecificInfoShortTag",k,5],["DecSpecificInfoShortLength",k,2],["audioConfigBytes",L,0],["SLConfigDescrTag",k,6],["SLConfigDescrLength",k,1],["SLConfigDescrPredefined",k,2]]},stsz:{container:"stbl",mandatory:!0,quantity:"one",box:"FullBox",is_container:!1,body:[["sample_size",g,0],["sample_count",g,0]]},stsc:{container:"stbl",mandatory:!0,quantity:"one",box:"FullBox",is_container:!1,body:[["entry_count",g,0]]},stco:{container:"stbl",mandatory:!0,quantity:"one",box:"FullBox",is_container:!1,body:[["entry_count",g,0]]},stss:{container:"stbl",mandatory:!1,quantity:"one-",box:"FullBox",is_container:!1,body:[["entry_count",g,0]]},edts:{container:"trak",mandatory:!1,quantity:"one-",box:"Box",is_container:!0},elst:{container:"edts",mandatory:!1,quantity:"one-",box:"FullBox",is_container:!1,body:[["entry_count",g,1],["segment_duration",g,0],["media_time",g,4294967295],["media_rate_integer",L,1],["media_rate_fraction",L,0]]},mvex:{container:"moov",mandatory:!1,quantity:"one-",box:"Box",is_container:!0},mehd:{container:"mvex",mandatory:!1,quantity:"one-",box:"FullBox",is_container:!1,body:[["fragment_duration",g,0]]},trex:{container:"mvex",mandatory:!0,quantity:"one+",box:"FullBox",is_container:!1,body:[["track_ID",g,1],["default_sample_description_index",g,1],["default_sample_duration",g,0],["default_sample_size",g,0],["default_sample_flags",g,0]]},moof:{container:"file",mandatory:!1,quantity:"zero+",box:"Box",is_container:!1},mfhd:{container:"moof",mandatory:!0,quantity:"one",box:"FullBox",is_container:!1,body:[["sequence_number",g,0]]},traf:{container:"moof",mandatory:!1,quantity:"zero+",box:"Box",is_container:!0},tfhd:{container:"traf",mandatory:!0,quantity:"one",box:"FullBox",is_container:!1,config:{flags:32},body:[["track_ID",g,1],["default_sample_flags",g,0]]},tfdt:{container:"traf",mandatory:!1,quantity:"one-",box:"FullBox",is_container:!1,config:{version:1},body:[["baseMediaDecodeTime",Vn,0]]},trun:{container:"traf",mandatory:!1,quantity:"zero+",box:"FullBox",is_container:!1,config:{flags:773},body:[["sample_count",g,1],["data_offset",g,0],["first_sample_flags",g,0],["sample_duration",g,0],["sample_size",g,0]]},"....":{box:"Box",is_container:!1,body:[]},file:{box:"None",is_container:!0,mandatory:!0,quantity:"one"}},zn=class{static None(){return[]}static Box(e){return[["size",g,0],["type",Re,e]]}static FullBox(e){return[].concat(this.Box(e),[["version",k,0],["flags",$n,0]])}},T=class extends ${constructor(t,n){super(0);this.type=t;let i=Ps[this.type];if(i===void 0)throw new Error(`unknown box type: ${t}`);this.config=Object.assign({},i.config,n);let o=zn[i.box](this.type),s=i.body||[];this.struct=new Map;let a=0;for(let[u,f,l]of[].concat(o,s)){if(this.has(u))throw new Error("Trying to add existing key");let d=l;this.config[u]&&(d=this.config[u]);let h=new f(d);this.struct.set(u,{offset:a,element:h}),a+=h.byteLength}this.byteLength=a}element(t){let n=this.struct.get(t);if(n===void 0)throw new Error("invalid key");return n.element}set(t,n){this.element(t).value=n}get(t){return this.element(t).value}offset(t){let n=this.struct.get(t);if(n===void 0)throw new Error("invalid key");return n.offset}has(t){return this.struct.has(t)}add(t,n){if(this.has(t))throw new Error("Trying to add existing key");return this.struct.set(t,{offset:this.byteLength,element:n}),this.byteLength+=n.byteLength,this}buffer(){let t=Buffer.allocUnsafe(this.byteLength);return this.copy(t),t}copy(t,n=0){this.set("size",this.byteLength);for(let i of this.struct.values())i.element.copy(t,n+i.offset)}load(t,n=0){for(let i of this.struct.values())i.element.load!==void 0&&i.element.load(t,n+i.offset)}format(t=0){let n=[" ".repeat(t)+`[${this.type}] (${this.byteLength})`];for(let[i,o]of this.struct){let s=o.element;s.format!==void 0?n.push(s.format(t+2)):n.push(" ".repeat(t+2)+`${i} = ${s.value} (${s.byteLength})`)}return n.join(`
|
|
@@ -1433,7 +1527,7 @@ ${e.toLowerCase()}: `,n=r.toString().toLowerCase().indexOf(t);if(n>=0){let i=r.i
|
|
|
1433
1527
|
|
|
1434
1528
|
}).call(this)}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {},require("buffer").Buffer)
|
|
1435
1529
|
|
|
1436
|
-
},{"_process":
|
|
1530
|
+
},{"_process":19,"buffer":15}],14:[function(require,module,exports){
|
|
1437
1531
|
'use strict'
|
|
1438
1532
|
|
|
1439
1533
|
exports.byteLength = byteLength
|
|
@@ -1585,7 +1679,7 @@ function fromByteArray (uint8) {
|
|
|
1585
1679
|
return parts.join('')
|
|
1586
1680
|
}
|
|
1587
1681
|
|
|
1588
|
-
},{}],
|
|
1682
|
+
},{}],15:[function(require,module,exports){
|
|
1589
1683
|
(function (Buffer){(function (){
|
|
1590
1684
|
/*!
|
|
1591
1685
|
* The buffer module from node.js, for the browser.
|
|
@@ -3367,7 +3461,7 @@ function numberIsNaN (obj) {
|
|
|
3367
3461
|
|
|
3368
3462
|
}).call(this)}).call(this,require("buffer").Buffer)
|
|
3369
3463
|
|
|
3370
|
-
},{"base64-js":
|
|
3464
|
+
},{"base64-js":14,"buffer":15,"ieee754":18}],16:[function(require,module,exports){
|
|
3371
3465
|
(function (global, factory) {
|
|
3372
3466
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
|
3373
3467
|
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
|
@@ -3585,7 +3679,7 @@ function numberIsNaN (obj) {
|
|
|
3585
3679
|
}));
|
|
3586
3680
|
|
|
3587
3681
|
|
|
3588
|
-
},{}],
|
|
3682
|
+
},{}],17:[function(require,module,exports){
|
|
3589
3683
|
(function (global){(function (){
|
|
3590
3684
|
/*!
|
|
3591
3685
|
* howler.js v2.2.1
|
|
@@ -6815,7 +6909,7 @@ function numberIsNaN (obj) {
|
|
|
6815
6909
|
|
|
6816
6910
|
}).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
|
|
6817
6911
|
|
|
6818
|
-
},{}],
|
|
6912
|
+
},{}],18:[function(require,module,exports){
|
|
6819
6913
|
/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
|
6820
6914
|
exports.read = function (buffer, offset, isLE, mLen, nBytes) {
|
|
6821
6915
|
var e, m
|
|
@@ -6902,7 +6996,7 @@ exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
|
|
|
6902
6996
|
buffer[offset + i - d] |= s * 128
|
|
6903
6997
|
}
|
|
6904
6998
|
|
|
6905
|
-
},{}],
|
|
6999
|
+
},{}],19:[function(require,module,exports){
|
|
6906
7000
|
// shim for using process in browser
|
|
6907
7001
|
var process = module.exports = {};
|
|
6908
7002
|
|
|
@@ -7088,7 +7182,7 @@ process.chdir = function (dir) {
|
|
|
7088
7182
|
};
|
|
7089
7183
|
process.umask = function() { return 0; };
|
|
7090
7184
|
|
|
7091
|
-
},{}],
|
|
7185
|
+
},{}],20:[function(require,module,exports){
|
|
7092
7186
|
'use strict';
|
|
7093
7187
|
|
|
7094
7188
|
/*! *****************************************************************************
|
|
@@ -7679,7 +7773,7 @@ var ReconnectingWebSocket = /** @class */ (function () {
|
|
|
7679
7773
|
|
|
7680
7774
|
module.exports = ReconnectingWebSocket;
|
|
7681
7775
|
|
|
7682
|
-
},{}]},{},[
|
|
7776
|
+
},{}]},{},[7])(7)
|
|
7683
7777
|
});
|
|
7684
7778
|
|
|
7685
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJkaXN0L0F1ZGlvUGxheWVyLmpzIiwiZGlzdC9Db2dzQ29ubmVjdGlvbi5qcyIsImRpc3QvUnRzcFN0cmVhbWVyLmpzIiwiZGlzdC9WaWRlb1BsYXllci5qcyIsImRpc3QvaGVscGVycy91cmxzLmpzIiwiZGlzdC9pbmRleC5qcyIsImRpc3QvdHlwZXMvQXVkaW9TdGF0ZS5qcyIsImRpc3QvdHlwZXMvU2hvd1BoYXNlLmpzIiwiZGlzdC90eXBlcy9WaWRlb1N0YXRlLmpzIiwibm9kZV9tb2R1bGVzL0BjbG9ja3dvcmtkb2cvbWVkaWEtc3RyZWFtLWxpYnJhcnktYnJvd3Nlci9kaXN0L2luZGV4LmNqcy5qcyIsIm5vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvbXBhcmUtdmVyc2lvbnMvbGliL3VtZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9ob3dsZXIvZGlzdC9ob3dsZXIuanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcmVjb25uZWN0aW5nLXdlYnNvY2tldC9kaXN0L3JlY29ubmVjdGluZy13ZWJzb2NrZXQtY2pzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaGVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuREE7QUFDQTtBQUNBOzs7Ozs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2p2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3pwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgaG93bGVyXzEgPSByZXF1aXJlKFwiaG93bGVyXCIpO1xuY29uc3QgREVCVUcgPSBmYWxzZTtcbi8vIENoZWNrIGFuIGlPUy1vbmx5IHByb3BlcnR5IChTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05hdmlnYXRvciNub24tc3RhbmRhcmRfcHJvcGVydGllcylcbmNvbnN0IElTX0lPUyA9IHR5cGVvZiBuYXZpZ2F0b3Iuc3RhbmRhbG9uZSAhPT0gJ3VuZGVmaW5lZCc7XG5jbGFzcyBBdWRpb1BsYXllciB7XG4gICAgY29uc3RydWN0b3IoY29nc0Nvbm5lY3Rpb24pIHtcbiAgICAgICAgdGhpcy5jb2dzQ29ubmVjdGlvbiA9IGNvZ3NDb25uZWN0aW9uO1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgICAgIHRoaXMuZ2xvYmFsVm9sdW1lID0gMTtcbiAgICAgICAgdGhpcy5hdWRpb0NsaXBQbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuc2lua0lkID0gJyc7XG4gICAgICAgIC8vIFNlbmQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGVhY2ggY2xpcCB0byBDT0dTXG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYXVkaW9DbGlwU3RhdGUnLCAoeyBkZXRhaWwgfSkgPT4ge1xuICAgICAgICAgICAgY29nc0Nvbm5lY3Rpb24uc2VuZE1lZGlhQ2xpcFN0YXRlKGRldGFpbCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIGF1ZGlvIGNvbnRyb2wgbWVzc2FnZXNcbiAgICAgICAgY29nc0Nvbm5lY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IG1lc3NhZ2UgfSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdtZWRpYV9jb25maWdfdXBkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2xvYmFsVm9sdW1lICE9PSBtZXNzYWdlLmdsb2JhbFZvbHVtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRHbG9iYWxWb2x1bWUobWVzc2FnZS5nbG9iYWxWb2x1bWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmF1ZGlvT3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpbmtJZCA9IGNvZ3NDb25uZWN0aW9uLmdldEF1ZGlvU2lua0lkKG1lc3NhZ2UuYXVkaW9PdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdWRpb1Npbmsoc2lua0lkICE9PSBudWxsICYmIHNpbmtJZCAhPT0gdm9pZCAwID8gc2lua0lkIDogJycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ29uZmlnKG1lc3NhZ2UuZmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdhdWRpb19wbGF5JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5QXVkaW9DbGlwKG1lc3NhZ2UuZmlsZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxheUlkOiBtZXNzYWdlLnBsYXlJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZTogbWVzc2FnZS52b2x1bWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb29wOiBCb29sZWFuKG1lc3NhZ2UubG9vcCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmYWRlOiBtZXNzYWdlLmZhZGUsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdhdWRpb19wYXVzZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF1c2VBdWRpb0NsaXAobWVzc2FnZS5maWxlLCB7IGZhZGU6IG1lc3NhZ2UuZmFkZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYXVkaW9fc3RvcCc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcEF1ZGlvQ2xpcChtZXNzYWdlLmZpbGUsIHsgZmFkZTogbWVzc2FnZS5mYWRlIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wQWxsQXVkaW9DbGlwcyh7IGZhZGU6IG1lc3NhZ2UuZmFkZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdhdWRpb19zZXRfY2xpcF92b2x1bWUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF1ZGlvQ2xpcFZvbHVtZShtZXNzYWdlLmZpbGUsIHsgdm9sdW1lOiBtZXNzYWdlLnZvbHVtZSwgZmFkZTogbWVzc2FnZS5mYWRlIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIE9uIGNvbm5lY3Rpb24sIHNlbmQgdGhlIGN1cnJlbnQgcGxheWluZyBzdGF0ZSBvZiBhbGwgY2xpcHNcbiAgICAgICAgLy8gKFVzdWFsbHkgZW1wdHkgdW5sZXNzIHdlYnNvY2tldCBpcyByZWNvbm5lY3RpbmcpXG4gICAgICAgIGNvbnN0IHNlbmRJbml0aWFsQ2xpcFN0YXRlcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gT2JqZWN0LmVudHJpZXModGhpcy5hdWRpb0NsaXBQbGF5ZXJzKS5tYXAoKFtmaWxlLCBwbGF5ZXJdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlQ2xpcHMgPSBPYmplY3QudmFsdWVzKHBsYXllci5hY3RpdmVDbGlwcyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gYWN0aXZlQ2xpcHMuc29tZSgoeyBzdGF0ZSB9KSA9PiBzdGF0ZS50eXBlID09PSAncGxheWluZycgfHxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudHlwZSA9PT0gJ3BhdXNpbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnR5cGUgPT09ICdzdG9wcGluZycgfHxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudHlwZSA9PT0gJ3BsYXlfcmVxdWVzdGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS50eXBlID09PSAncGF1c2VfcmVxdWVzdGVkJyB8fFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS50eXBlID09PSAnc3RvcF9yZXF1ZXN0ZWQnKVxuICAgICAgICAgICAgICAgICAgICA/ICdwbGF5aW5nJ1xuICAgICAgICAgICAgICAgICAgICA6IGFjdGl2ZUNsaXBzLnNvbWUoKHsgc3RhdGUgfSkgPT4gc3RhdGUudHlwZSA9PT0gJ3BhdXNlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdwYXVzZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdzdG9wcGVkJztcbiAgICAgICAgICAgICAgICByZXR1cm4gW2ZpbGUsIHN0YXR1c107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvZ3NDb25uZWN0aW9uLnNlbmRJbml0aWFsTWVkaWFDbGlwU3RhdGVzKHsgbWVkaWFUeXBlOiAnYXVkaW8nLCBmaWxlcyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29nc0Nvbm5lY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHNlbmRJbml0aWFsQ2xpcFN0YXRlcyk7XG4gICAgICAgIHNlbmRJbml0aWFsQ2xpcFN0YXRlcygpO1xuICAgIH1cbiAgICBzZXRHbG9iYWxWb2x1bWUodm9sdW1lKSB7XG4gICAgICAgIHRoaXMuZ2xvYmFsVm9sdW1lID0gdm9sdW1lO1xuICAgICAgICBob3dsZXJfMS5Ib3dsZXIudm9sdW1lKHZvbHVtZSk7XG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgcGxheUF1ZGlvQ2xpcChwYXRoLCB7IHBsYXlJZCwgdm9sdW1lLCBmYWRlLCBsb29wIH0pIHtcbiAgICAgICAgbG9nKCdQbGF5aW5nIGNsaXAnLCB7IHBhdGggfSk7XG4gICAgICAgIGlmICghKHBhdGggaW4gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzKSkge1xuICAgICAgICAgICAgbG9nKCdDcmVhdGluZyBlcGhlbWVyYWwgY2xpcCcsIHsgcGF0aCB9KTtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXSA9IHRoaXMuY3JlYXRlQ2xpcChwYXRoLCB7IHByZWxvYWQ6IGZhbHNlLCBlcGhlbWVyYWw6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIC8vIFBhdXNlZCBjbGlwcyBuZWVkIHRvIGJlIHBsYXllZCBhZ2FpblxuICAgICAgICAgICAgY29uc3QgcGF1c2VkU291bmRJZHMgPSBPYmplY3QuZW50cmllcyhjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKFssIHsgc3RhdGUgfV0pID0+IHN0YXRlLnR5cGUgPT09ICdwYXVzZWQnKVxuICAgICAgICAgICAgICAgIC5tYXAoKFtpZF0pID0+IHBhcnNlSW50KGlkKSk7XG4gICAgICAgICAgICBjb25zdCBwYXVzaW5nU291bmRJZHMgPSBPYmplY3QuZW50cmllcyhjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKFssIHsgc3RhdGUgfV0pID0+IHN0YXRlLnR5cGUgPT09ICdwYXVzaW5nJylcbiAgICAgICAgICAgICAgICAubWFwKChbaWRdKSA9PiBwYXJzZUludChpZCkpO1xuICAgICAgICAgICAgcGF1c2VkU291bmRJZHMuZm9yRWFjaCgoc291bmRJZCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvZygnUmVzdW1pbmcgcGF1c2VkIGNsaXAnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5wbGF5KHNvdW5kSWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBDbGlwcyB3aXRoIHBhdXNlIHJlcXVlc3RlZCBubyBsb25nZXIgbmVlZCB0byBwYXVzZSwgdGhleSBjYW4gY29udGludWUgcGxheWluZyBub3dcbiAgICAgICAgICAgIGNvbnN0IHBhdXNlUmVxdWVzdGVkU291bmRJZHMgPSBPYmplY3QuZW50cmllcyhjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKFssIHsgc3RhdGUgfV0pID0+IHN0YXRlLnR5cGUgPT09ICdwYXVzZV9yZXF1ZXN0ZWQnKVxuICAgICAgICAgICAgICAgIC5tYXAoKFtpZF0pID0+IHBhcnNlSW50KGlkKSk7XG4gICAgICAgICAgICAvLyBJZiBubyBjdXJyZW50bHkgcGF1c2VkL3BhdXNpbmcvcGF1c2VfcmVxdWVzdGVkIGNsaXBzLCBwbGF5IGEgbmV3IGNsaXBcbiAgICAgICAgICAgIGNvbnN0IG5ld1NvdW5kSWRzID0gcGF1c2VkU291bmRJZHMubGVuZ3RoID4gMCB8fCBwYXVzaW5nU291bmRJZHMubGVuZ3RoID4gMCB8fCBwYXVzZVJlcXVlc3RlZFNvdW5kSWRzLmxlbmd0aCA+IDAgPyBbXSA6IFtjbGlwUGxheWVyLnBsYXllci5wbGF5KCldO1xuICAgICAgICAgICAgLy8gUGF1c2luZyBjbGlwcyBhcmUgdGVjaG5pY2FsbHkgY3VycmVudGx5IHBsYXlpbmcgYXMgZmFyIGFzIEhvd2xlciBpcyBjb25jZXJuZWRcbiAgICAgICAgICAgIHBhdXNpbmdTb3VuZElkcy5mb3JFYWNoKChzb3VuZElkKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nKCdTdG9wcGluZyBmYWRlIGFuZCByZXN1bWluZyBwYXVzaW5nIGNsaXAnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBTdG9wIHRoZSBmYWRlIGNhbGxiYWNrXG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub2ZmKCdmYWRlJywgdW5kZWZpbmVkLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBTZXQgbG9vcCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLmxvb3AobG9vcCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHN0YXRlIHRvICdwbGF5aW5nJ1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aXZlQXVkaW9DbGlwKHBhdGgsIHNvdW5kSWQsIChjbGlwKSA9PiAoeyAuLi5jbGlwLCBzdGF0ZTogeyB0eXBlOiAncGxheWluZycgfSB9KSk7XG4gICAgICAgICAgICAgICAgLy8gU2V0IHZvbHVtZSwgb3Igc3RhcnQgYSBuZXcgZmFkZVxuICAgICAgICAgICAgICAgIGlmIChpc0ZhZGVWYWxpZChmYWRlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBmYWRlIHdoZW4gY2xpcCBzdGFydHNcbiAgICAgICAgICAgICAgICAgICAgZmFkZUF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCB2b2x1bWUsIGZhZGUgKiAxMDAwLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCB2b2x1bWUsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gcGF1c2VkIGFuZCBwYXVzZV9yZXF1ZXN0ZWQgY2xpcHMgdHJlYXRlZCB0aGUgc2FtZSwgdGhleSBzaG91bGQgaGF2ZSB0aGVpciBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAvLyB1cGRhdGVkIHdpdGggdGhlIGxhdGVzdCBwbGF5IGFjdGlvbidzIHByb3BlcnRpZXNcbiAgICAgICAgICAgIFsuLi5wYXVzZWRTb3VuZElkcywgLi4ucGF1c2VSZXF1ZXN0ZWRTb3VuZElkcywgLi4ubmV3U291bmRJZHNdLmZvckVhY2goKHNvdW5kSWQpID0+IHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5sb29wKGxvb3AsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIC8vIENsZWFudXAgYW55IG9sZCBjYWxsYmFja3MgZmlyc3RcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vZmYoJ3BsYXknLCB1bmRlZmluZWQsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9mZigncGF1c2UnLCB1bmRlZmluZWQsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9mZignZmFkZScsIHVuZGVmaW5lZCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub2ZmKCdlbmQnLCB1bmRlZmluZWQsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9mZignc3RvcCcsIHVuZGVmaW5lZCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgLy8gTm9uLXByZWxvYWRlZCBjbGlwcyBkb24ndCB5ZXQgaGF2ZSBhbiBIVE1MIGF1ZGlvIG5vZGVcbiAgICAgICAgICAgICAgICAvLyBzbyB3ZSBuZWVkIHRvIHNldCB0aGUgYXVkaW8gb3V0cHV0IHdoZW4gaXQncyBwbGF5aW5nXG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub25jZSgncGxheScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0UGxheWVyU2lua0lkKGNsaXBQbGF5ZXIucGxheWVyLCB0aGlzLnNpbmtJZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub25jZSgnc3RvcCcsICgpID0+IHRoaXMuaGFuZGxlU3RvcHBlZENsaXAocGF0aCwgcGxheUlkLCBzb3VuZElkKSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgLy8gTG9vcGluZyBjbGlwcyBmaXJlIHRoZSAnZW5kJyBjYWxsYmFjayBvbiBldmVyeSBsb29wXG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICBpZiAoISgoX2EgPSBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzW3NvdW5kSWRdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubG9vcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RvcHBlZENsaXAocGF0aCwgcGxheUlkLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUNsaXAgPSB7XG4gICAgICAgICAgICAgICAgICAgIHBsYXlJZCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHsgdHlwZTogJ3BsYXlfcmVxdWVzdGVkJyB9LFxuICAgICAgICAgICAgICAgICAgICBsb29wLFxuICAgICAgICAgICAgICAgICAgICB2b2x1bWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsb2coJ0NMSVAgLT4gcGxheV9yZXF1ZXN0ZWQnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBPbmNlIGNsaXAgc3RhcnRzLCBjaGVjayBpZiBpdCBzaG91bGQgYWN0dWFsbHkgYmUgcGF1c2VkIG9yIHN0b3BwZWRcbiAgICAgICAgICAgICAgICAvLyBJZiBub3QsIHRoZW4gdXBkYXRlIHN0YXRlIHRvICdwbGF5aW5nJ1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9uY2UoJ3BsYXknLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xpcFN0YXRlID0gKF9hID0gY2xpcFBsYXllci5hY3RpdmVDbGlwc1tzb3VuZElkXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0YXRlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGNsaXBTdGF0ZSA9PT0gbnVsbCB8fCBjbGlwU3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsaXBTdGF0ZS50eXBlKSA9PT0gJ3BhdXNlX3JlcXVlc3RlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ2xpcCBzdGFydGVkIHBsYXlpbmcgYnV0IHNob3VsZCBiZSBwYXVzZWQnLCB7IHBhdGgsIHNvdW5kSWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdXNlQXVkaW9DbGlwKHBhdGgsIHsgZmFkZTogY2xpcFN0YXRlLmZhZGUgfSwgc291bmRJZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGNsaXBTdGF0ZSA9PT0gbnVsbCB8fCBjbGlwU3RhdGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNsaXBTdGF0ZS50eXBlKSA9PT0gJ3N0b3BfcmVxdWVzdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDbGlwIHN0YXJ0ZWQgcGxheWluZyBidXQgc2hvdWxkIGJlIHN0b3BwZWQnLCB7IHBhdGgsIHNvdW5kSWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BBdWRpb0NsaXAocGF0aCwgeyBmYWRlOiBjbGlwU3RhdGUuZmFkZSB9LCBzb3VuZElkLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ0xJUCAtPiBwbGF5aW5nJywgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUF1ZGlvQ2xpcChwYXRoLCBzb3VuZElkLCAoY2xpcCkgPT4gKHsgLi4uY2xpcCwgc3RhdGU6IHsgdHlwZTogJ3BsYXlpbmcnIH0gfSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgLy8gVG8gZmFkZSBvciB0byBubyBmYWRlP1xuICAgICAgICAgICAgICAgIGlmIChpc0ZhZGVWYWxpZChmYWRlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBmYWRlIHdoZW4gY2xpcCBzdGFydHNcbiAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIudm9sdW1lKDAsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5tdXRlKGZhbHNlLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub25jZSgncGxheScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhZGVBdWRpb1BsYXllclZvbHVtZShjbGlwUGxheWVyLnBsYXllciwgdm9sdW1lLCBmYWRlICogMTAwMCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0QXVkaW9QbGF5ZXJWb2x1bWUoY2xpcFBsYXllci5wbGF5ZXIsIHZvbHVtZSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIFRyYWNrIG5ldy91cGRhdGVkIGFjdGl2ZSBjbGlwXG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5hY3RpdmVDbGlwcyA9IHsgLi4uY2xpcFBsYXllci5hY3RpdmVDbGlwcywgW3NvdW5kSWRdOiBhY3RpdmVDbGlwIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBwYXRoLCAncGxheWluZycpO1xuICAgIH1cbiAgICBwYXVzZUF1ZGlvQ2xpcChwYXRoLCB7IGZhZGUgfSwgb25seVNvdW5kSWQsIGFsbG93SWZQYXVzZVJlcXVlc3RlZCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAvLyBObyBhY3RpdmUgY2xpcHMgdG8gcGF1c2VcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKChfYiA9IChfYSA9IHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFjdGl2ZUNsaXBzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB7fSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoY2xpcFBsYXllci5hY3RpdmVDbGlwcykubWFwKChbc291bmRJZFN0ciwgY2xpcF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VuZElkID0gcGFyc2VJbnQoc291bmRJZFN0cik7XG4gICAgICAgICAgICAgICAgLy8gSWYgb25seVNvdW5kSWQgc3BlY2lmaWVkLCBvbmx5IHVwZGF0ZSB0aGF0IGNsaXBcbiAgICAgICAgICAgICAgICBpZiAob25seVNvdW5kSWQgPT09IHVuZGVmaW5lZCB8fCBvbmx5U291bmRJZCA9PT0gc291bmRJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGFsbG93SWZQYXVzZVJlcXVlc3RlZCAmJiBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzZV9yZXF1ZXN0ZWQnKSB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdwbGF5aW5nJyB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzaW5nJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmFkZVZhbGlkKGZhZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFkZSB0aGVuIHBhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub25jZSgnZmFkZScsIChzb3VuZElkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnBhdXNlKHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NMSVAgLT4gcGF1c2VkIChhZnRlciBmYWRlKScsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUF1ZGlvQ2xpcChwYXRoLCBzb3VuZElkLCAoY2xpcCkgPT4gKHsgLi4uY2xpcCwgc3RhdGU6IHsgdHlwZTogJ3BhdXNlZCcgfSB9KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKGNsaXAucGxheUlkLCBwYXRoLCAncGF1c2VkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFkZUF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCAwLCBmYWRlICogMTAwMCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDTElQIC0+IHBhdXNpbmcnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlID0geyB0eXBlOiAncGF1c2luZycgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIG5vd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnBhdXNlKHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ0xJUCAtPiBwYXVzZWQnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlID0geyB0eXBlOiAncGF1c2VkJyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKGNsaXAucGxheUlkLCBwYXRoLCAncGF1c2VkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xpcCBoYXNuJ3Qgc3RhcnRlZCBwbGF5aW5nIHlldCwgb3IgaGFzIGFscmVhZHkgaGFkIHBhdXNlX3JlcXVlc3RlZCAoYnV0IGZhZGUgbWF5IGhhdmUgY2hhbmdlZCBzbyB1cGRhdGUgaGVyZSlcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2xpcC5zdGF0ZS50eXBlID09PSAncGxheV9yZXF1ZXN0ZWQnIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BhdXNlX3JlcXVlc3RlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ0xJUCAtPiBwYXVzZV9yZXF1ZXN0ZWQnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUgPSB7IHR5cGU6ICdwYXVzZV9yZXF1ZXN0ZWQnLCBmYWRlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtzb3VuZElkU3RyLCBjbGlwXTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RvcEF1ZGlvQ2xpcChwYXRoLCB7IGZhZGUgfSwgb25seVNvdW5kSWQsIGFsbG93SWZTdG9wUmVxdWVzdGVkKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jO1xuICAgICAgICBsb2coJ1N0b3AgYXVkaW8gY2xpcCcsIHsgYWN0aXZlQ2xpcHM6IChfYSA9IHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFjdGl2ZUNsaXBzIH0pO1xuICAgICAgICAvLyBObyBhY3RpdmUgY2xpcHMgdG8gc3RvcFxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoKF9jID0gKF9iID0gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzW3BhdGhdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuYWN0aXZlQ2xpcHMpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHt9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUF1ZGlvQ2xpcFBsYXllcihwYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgY2xpcFBsYXllci5hY3RpdmVDbGlwcyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKS5tYXAoKFtzb3VuZElkU3RyLCBjbGlwXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdW5kSWQgPSBwYXJzZUludChzb3VuZElkU3RyKTtcbiAgICAgICAgICAgICAgICAvLyBJZiBvbmx5U291bmRJZCBzcGVjaWZpZWQsIG9ubHkgdXBkYXRlIHRoYXQgY2xpcFxuICAgICAgICAgICAgICAgIGlmIChvbmx5U291bmRJZCA9PT0gdW5kZWZpbmVkIHx8IG9ubHlTb3VuZElkID09PSBzb3VuZElkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoYWxsb3dJZlN0b3BSZXF1ZXN0ZWQgJiYgY2xpcC5zdGF0ZS50eXBlID09PSAnc3RvcF9yZXF1ZXN0ZWQnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZS50eXBlID09PSAncGxheWluZycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BhdXNpbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzZWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlLnR5cGUgPT09ICdzdG9wcGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0ZhZGVWYWxpZChmYWRlKSAmJiBjbGlwLnN0YXRlLnR5cGUgIT09ICdwYXVzZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYW51cCBhbnkgb2xkIGZhZGUgY2FsbGJhY2tzIGZpcnN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIGNhc3Qgb25jZSBodHRwczovL2dpdGh1Yi5jb20vRGVmaW5pdGVseVR5cGVkL0RlZmluaXRlbHlUeXBlZC9wdWxsLzU5NDExIGlzIG1lcmdlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9mZignZmFkZScsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhZGVBdWRpb1BsYXllclZvbHVtZShjbGlwUGxheWVyLnBsYXllciwgMCwgZmFkZSAqIDEwMDAsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBjYWxsYmFjayBhZnRlciBzdGFydGluZyBuZXcgZmFkZSwgb3RoZXJ3aXNlIGl0IHdpbGwgZmlyZSBzdHJhaWdodCBhd2F5IGFzIHRoZSBwcmV2aW91cyBmYWRlIGlzIGNhbmNlbGxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9uY2UoJ2ZhZGUnLCAoc291bmRJZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5sb29wKGZhbHNlLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIuc3RvcChzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NMSVAgLT4gc3RvcHBpbmcnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlID0geyB0eXBlOiAnc3RvcHBpbmcnIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ1N0b3AgY2xpcCcsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLmxvb3AoZmFsc2UsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnN0b3Aoc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xpcCBoYXNuJ3Qgc3RhcnRlZCBwbGF5aW5nIHlldCwgb3IgaGFzIGFscmVhZHkgaGFkIHN0b3BfcmVxdWVzdGVkIChidXQgZmFkZSBtYXkgaGF2ZSBjaGFuZ2VkIHNvIHVwZGF0ZSBoZXJlKVxuICAgICAgICAgICAgICAgICAgICAvLyBvciBoYXMgcGF1c2VfcmVxdWVzdGVkLCBidXQgc3RvcCB0YWtlcyBwcmVjZWRlbmNlXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BsYXlfcmVxdWVzdGVkJyB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzZV9yZXF1ZXN0ZWQnIHx8IGNsaXAuc3RhdGUudHlwZSA9PT0gJ3N0b3BfcmVxdWVzdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKFwiVHJ5aW5nIHRvIHN0b3AgY2xpcCB3aGljaCBoYXNuJ3Qgc3RhcnRlZCBwbGF5aW5nIHlldFwiLCB7IHBhdGgsIHNvdW5kSWQgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NMSVAgLT4gc3RvcF9yZXF1ZXN0ZWQnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUgPSB7IHR5cGU6ICdzdG9wX3JlcXVlc3RlZCcsIGZhZGUgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gW3NvdW5kSWRTdHIsIGNsaXBdO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdG9wQWxsQXVkaW9DbGlwcyhvcHRpb25zKSB7XG4gICAgICAgIGxvZygnU3RvcHBpbmcgYWxsIGNsaXBzJyk7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuYXVkaW9DbGlwUGxheWVycykuZm9yRWFjaCgocGF0aCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdG9wQXVkaW9DbGlwKHBhdGgsIG9wdGlvbnMpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0QXVkaW9DbGlwVm9sdW1lKHBhdGgsIHsgdm9sdW1lLCBmYWRlIH0pIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKCEodm9sdW1lID49IDAgJiYgdm9sdW1lIDw9IDEpKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgdm9sdW1lJywgdm9sdW1lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBhY3RpdmUgY2xpcHMgdG8gc2V0IHZvbHVtZSBmb3JcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKChfYiA9IChfYSA9IHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFjdGl2ZUNsaXBzKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB7fSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoY2xpcFBsYXllci5hY3RpdmVDbGlwcykubWFwKChbc291bmRJZFN0ciwgY2xpcF0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmVkIGZvciBwYXVzaW5nL3N0b3BwaW5nIGluc3RhbmNlc1xuICAgICAgICAgICAgICAgIGlmIChjbGlwLnN0YXRlLnR5cGUgIT09ICdwYXVzaW5nJyAmJiBjbGlwLnN0YXRlLnR5cGUgIT09ICdzdG9wcGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291bmRJZCA9IHBhcnNlSW50KHNvdW5kSWRTdHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNGYWRlVmFsaWQoZmFkZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZhZGVBdWRpb1BsYXllclZvbHVtZShjbGlwUGxheWVyLnBsYXllciwgdm9sdW1lLCBmYWRlICogMTAwMCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBdWRpb1BsYXllclZvbHVtZShjbGlwUGxheWVyLnBsYXllciwgdm9sdW1lLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3NvdW5kSWRTdHIsIHsgLi4uY2xpcCwgdm9sdW1lIH1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtzb3VuZElkU3RyLCBjbGlwXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhhbmRsZVN0b3BwZWRDbGlwKHBhdGgsIHBsYXlJZCwgc291bmRJZCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUF1ZGlvQ2xpcFBsYXllcihwYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHNbc291bmRJZF07XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHBsYXlJZCwgcGF0aCwgJ3N0b3BwZWQnKTtcbiAgICB9XG4gICAgdXBkYXRlQWN0aXZlQXVkaW9DbGlwKHBhdGgsIHNvdW5kSWQsIHVwZGF0ZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUF1ZGlvQ2xpcFBsYXllcihwYXRoLCAoY2xpcFBsYXllcikgPT4gc291bmRJZCBpbiBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzXG4gICAgICAgICAgICA/IHsgLi4uY2xpcFBsYXllciwgYWN0aXZlQ2xpcHM6IHsgLi4uY2xpcFBsYXllci5hY3RpdmVDbGlwcywgW3NvdW5kSWRdOiB1cGRhdGUoY2xpcFBsYXllci5hY3RpdmVDbGlwc1tzb3VuZElkXSkgfSB9XG4gICAgICAgICAgICA6IGNsaXBQbGF5ZXIpO1xuICAgIH1cbiAgICB1cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgdXBkYXRlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHBhdGggaW4gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzKSB7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvQ2xpcFBsYXllcnMgPSB7IC4uLnRoaXMuYXVkaW9DbGlwUGxheWVycywgW3BhdGhdOiB1cGRhdGUodGhpcy5hdWRpb0NsaXBQbGF5ZXJzW3BhdGhdKSB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIE9uY2UgbGFzdCBpbnN0YW5jZSBvZiBhbiBlcGhlbWVyYWwgY2xpcCBpcyByZW1vdmVkLCBjbGVhbnVwIGFuZCByZW1vdmUgdGhlIHBsYXllclxuICAgICAgICBjb25zdCBjbGlwUGxheWVyID0gdGhpcy5hdWRpb0NsaXBQbGF5ZXJzW3BhdGhdO1xuICAgICAgICBpZiAoY2xpcFBsYXllciAmJiBPYmplY3Qua2V5cygoX2EgPSBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB7fSkubGVuZ3RoID09PSAwICYmIGNsaXBQbGF5ZXIuY29uZmlnLmVwaGVtZXJhbCkge1xuICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIudW5sb2FkKCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5hdWRpb0NsaXBQbGF5ZXJzW3BhdGhdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgc2V0QXVkaW9TaW5rKHNpbmtJZCkge1xuICAgICAgICBsb2coYFNldHRpbmcgc2luayBJRCBmb3IgYWxsIGNsaXBzOmAsIHNpbmtJZCk7XG4gICAgICAgIGZvciAoY29uc3QgY2xpcFBsYXllciBvZiBPYmplY3QudmFsdWVzKHRoaXMuYXVkaW9DbGlwUGxheWVycykpIHtcbiAgICAgICAgICAgIHNldFBsYXllclNpbmtJZChjbGlwUGxheWVyLnBsYXllciwgc2lua0lkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNpbmtJZCA9IHNpbmtJZDtcbiAgICB9XG4gICAgdXBkYXRlQ29uZmlnKG5ld0ZpbGVzKSB7XG4gICAgICAgIGNvbnN0IG5ld0F1ZGlvRmlsZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMobmV3RmlsZXMpLmZpbHRlcigoZmlsZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IGZpbGVbMV0udHlwZTtcbiAgICAgICAgICAgIC8vIENPR1MgNC42IGRpZCBub3Qgc2VuZCBhIGB0eXBlYCBidXQgb25seSByZXBvcnRlZCBhdWRpbyBmaWxlc1xuICAgICAgICAgICAgLy8gc28gd2UgYXNzdW1lIGF1ZGlvIGlmIG5vIGB0eXBlYCBpcyBnaXZlblxuICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT09ICdhdWRpbycgfHwgIXR5cGU7XG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNDbGlwUGxheWVycyA9IHRoaXMuYXVkaW9DbGlwUGxheWVycztcbiAgICAgICAgdGhpcy5hdWRpb0NsaXBQbGF5ZXJzID0gKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNsaXBQbGF5ZXJzID0geyAuLi5wcmV2aW91c0NsaXBQbGF5ZXJzIH07XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkQ2xpcHMgPSBPYmplY3Qua2V5cyhwcmV2aW91c0NsaXBQbGF5ZXJzKS5maWx0ZXIoKHByZXZpb3VzRmlsZSkgPT4gIShwcmV2aW91c0ZpbGUgaW4gbmV3QXVkaW9GaWxlcykgJiYgIXByZXZpb3VzQ2xpcFBsYXllcnNbcHJldmlvdXNGaWxlXS5jb25maWcuZXBoZW1lcmFsKTtcbiAgICAgICAgICAgIHJlbW92ZWRDbGlwcy5mb3JFYWNoKChmaWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxheWVyID0gcHJldmlvdXNDbGlwUGxheWVyc1tmaWxlXS5wbGF5ZXI7XG4gICAgICAgICAgICAgICAgcGxheWVyLnVubG9hZCgpO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjbGlwUGxheWVyc1tmaWxlXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgYWRkZWRDbGlwcyA9IE9iamVjdC5lbnRyaWVzKG5ld0F1ZGlvRmlsZXMpLmZpbHRlcigoW25ld2ZpbGVdKSA9PiAhcHJldmlvdXNDbGlwUGxheWVyc1tuZXdmaWxlXSk7XG4gICAgICAgICAgICBhZGRlZENsaXBzLmZvckVhY2goKFtwYXRoLCBjb25maWddKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllcnNbcGF0aF0gPSB0aGlzLmNyZWF0ZUNsaXAocGF0aCwgeyAuLi5jb25maWcsIGVwaGVtZXJhbDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRDbGlwcyA9IE9iamVjdC5rZXlzKHByZXZpb3VzQ2xpcFBsYXllcnMpLmZpbHRlcigocHJldmlvdXNGaWxlKSA9PiBwcmV2aW91c0ZpbGUgaW4gbmV3QXVkaW9GaWxlcyk7XG4gICAgICAgICAgICB1cGRhdGVkQ2xpcHMuZm9yRWFjaCgocGF0aCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXJzW3BhdGhdID0gdGhpcy51cGRhdGVkQ2xpcChwYXRoLCBjbGlwUGxheWVyc1twYXRoXSwgeyAuLi5uZXdBdWRpb0ZpbGVzW3BhdGhdLCBlcGhlbWVyYWw6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcnM7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgbm90aWZ5U3RhdGVMaXN0ZW5lcnMoKSB7XG4gICAgICAgIGNvbnN0IGNsaXBzID0gT2JqZWN0LmVudHJpZXModGhpcy5hdWRpb0NsaXBQbGF5ZXJzKS5yZWR1Y2UoKGNsaXBzLCBbcGF0aCwgY2xpcFBsYXllcl0pID0+IHtcbiAgICAgICAgICAgIGNsaXBzW3BhdGhdID0ge1xuICAgICAgICAgICAgICAgIGNvbmZpZzogeyBwcmVsb2FkOiBjbGlwUGxheWVyLmNvbmZpZy5wcmVsb2FkLCBlcGhlbWVyYWw6IGNsaXBQbGF5ZXIuY29uZmlnLmVwaGVtZXJhbCB9LFxuICAgICAgICAgICAgICAgIGFjdGl2ZUNsaXBzOiBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwcztcbiAgICAgICAgfSwge30pO1xuICAgICAgICBjb25zdCBpc1BsYXlpbmcgPSBPYmplY3QudmFsdWVzKHRoaXMuYXVkaW9DbGlwUGxheWVycykuc29tZSgoeyBhY3RpdmVDbGlwcyB9KSA9PiBPYmplY3QudmFsdWVzKGFjdGl2ZUNsaXBzKS5zb21lKChjbGlwKSA9PiBjbGlwLnN0YXRlLnR5cGUgPT09ICdwbGF5aW5nJyB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzaW5nJyB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdzdG9wcGluZycpKTtcbiAgICAgICAgY29uc3QgYXVkaW9TdGF0ZSA9IHtcbiAgICAgICAgICAgIGdsb2JhbFZvbHVtZTogdGhpcy5nbG9iYWxWb2x1bWUsXG4gICAgICAgICAgICBpc1BsYXlpbmcsXG4gICAgICAgICAgICBjbGlwcyxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdzdGF0ZScsIGF1ZGlvU3RhdGUpO1xuICAgIH1cbiAgICBub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBmaWxlLCBzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdhdWRpb0NsaXBTdGF0ZScsIHsgbWVkaWFUeXBlOiAnYXVkaW8nLCBwbGF5SWQsIGZpbGUsIHN0YXR1cyB9KTtcbiAgICB9XG4gICAgLy8gVHlwZS1zYWZlIHdyYXBwZXIgYXJvdW5kIEV2ZW50VGFyZ2V0XG4gICAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGRpc3BhdGNoRXZlbnQodHlwZSwgZGV0YWlsKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQodHlwZSwgeyBkZXRhaWwgfSkpO1xuICAgIH1cbiAgICBjcmVhdGVQbGF5ZXIocGF0aCwgY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IG5ldyBob3dsZXJfMS5Ib3dsKHtcbiAgICAgICAgICAgIHNyYzogdGhpcy5jb2dzQ29ubmVjdGlvbi5nZXRBc3NldFVybChwYXRoKSxcbiAgICAgICAgICAgIGF1dG9wbGF5OiBmYWxzZSxcbiAgICAgICAgICAgIGxvb3A6IGZhbHNlLFxuICAgICAgICAgICAgdm9sdW1lOiAxLFxuICAgICAgICAgICAgaHRtbDU6IHRydWUsXG4gICAgICAgICAgICBwcmVsb2FkOiBjb25maWcucHJlbG9hZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHNldFBsYXllclNpbmtJZChwbGF5ZXIsIHRoaXMuc2lua0lkKTtcbiAgICAgICAgcmV0dXJuIHBsYXllcjtcbiAgICB9XG4gICAgY3JlYXRlQ2xpcChmaWxlLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHBsYXllcjogdGhpcy5jcmVhdGVQbGF5ZXIoZmlsZSwgY29uZmlnKSxcbiAgICAgICAgICAgIGFjdGl2ZUNsaXBzOiB7fSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgdXBkYXRlZENsaXAoY2xpcFBhdGgsIHByZXZpb3VzQ2xpcCwgbmV3Q29uZmlnKSB7XG4gICAgICAgIGNvbnN0IGNsaXAgPSB7IC4uLnByZXZpb3VzQ2xpcCwgY29uZmlnOiBuZXdDb25maWcgfTtcbiAgICAgICAgaWYgKHByZXZpb3VzQ2xpcC5jb25maWcucHJlbG9hZCAhPT0gbmV3Q29uZmlnLnByZWxvYWQpIHtcbiAgICAgICAgICAgIGNsaXAucGxheWVyLnVubG9hZCgpO1xuICAgICAgICAgICAgY2xpcC5wbGF5ZXIgPSB0aGlzLmNyZWF0ZVBsYXllcihjbGlwUGF0aCwgbmV3Q29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xpcDtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBBdWRpb1BsYXllcjtcbmZ1bmN0aW9uIGxvZyguLi5kYXRhKSB7XG4gICAgaWYgKERFQlVHKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKC4uLmRhdGEpO1xuICAgIH1cbn1cbi8qKlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoaXMgaXMgdGhpcyBhIHZhbGlkIGZhZGUgZHVyYXRpb24uIEFsd2F5cyByZXR1cm5zIGBmYWxzZWAgb24gaU9TXG4gKi9cbmZ1bmN0aW9uIGlzRmFkZVZhbGlkKGZhZGUpIHtcbiAgICByZXR1cm4gIUlTX0lPUyAmJiB0eXBlb2YgZmFkZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKGZhZGUpICYmIGZhZGUgPiAwO1xufVxuZnVuY3Rpb24gc2V0UGxheWVyU2lua0lkKHBsYXllciwgc2lua0lkKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChzaW5rSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChwbGF5ZXIuX2h0bWw1KSB7XG4gICAgICAgIChfYSA9IHBsYXllci5fc291bmRzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9yRWFjaCgoc291bmQpID0+IHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICAoX2IgPSAoX2EgPSBzb3VuZC5fbm9kZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnNldFNpbmtJZCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIHNpbmtJZCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gVE9ETzogaGFuZGxlIHdlYiBhdWRpb1xuICAgICAgICBjb25zb2xlLndhcm4oJ0Nhbm5vdCBzZXQgc2luayBJRDogd2ViIGF1ZGlvIG5vdCBzdXBwb3J0ZWQnLCBwbGF5ZXIpO1xuICAgIH1cbn1cbi8qKlxuICogU2V0IGF1ZGlvIHZvbHVtZVxuICpcbiAqIFRoaXMgZG9lc24ndCB3b3JrIG9uIGlPUyAodm9sdW1lIGlzIHJlYWQtb25seSkgc28gYXQgbGVhc3QgbXV0ZSBpdCBpZiB0aGUgdm9sdW1lIGlzIHplcm9cbiAqL1xuZnVuY3Rpb24gc2V0QXVkaW9QbGF5ZXJWb2x1bWUoaG93bCwgdm9sdW1lLCBzb3VuZElkKSB7XG4gICAgaG93bC52b2x1bWUodm9sdW1lLCBzb3VuZElkKTtcbiAgICBob3dsLm11dGUodm9sdW1lID09PSAwLCBzb3VuZElkKTtcbn1cbi8qKlxuICogRmFkZSB0byBhdWRpbyB2b2x1bWVcbiAqXG4gKiBOb3RlOiBUaGlzIGRvZXNuJ3Qgd29yayBvbiBpT1MgKHZvbHVtZSBpcyByZWFkLW9ubHkpXG4gKi9cbmZ1bmN0aW9uIGZhZGVBdWRpb1BsYXllclZvbHVtZShob3dsLCB2b2x1bWUsIGZhZGUsIHNvdW5kSWQpIHtcbiAgICBob3dsLmZhZGUoaG93bC52b2x1bWUoc291bmRJZCksIHZvbHVtZSwgZmFkZSwgc291bmRJZCk7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ29nc0luY29taW5nRXZlbnQgPSBleHBvcnRzLkNvZ3NTdGF0ZUNoYW5nZWRFdmVudCA9IGV4cG9ydHMuQ29nc0NvbmZpZ0NoYW5nZWRFdmVudCA9IGV4cG9ydHMuQ29nc01lc3NhZ2VFdmVudCA9IGV4cG9ydHMuQ29nc0Nvbm5lY3Rpb25DbG9zZUV2ZW50ID0gZXhwb3J0cy5Db2dzQ29ubmVjdGlvbk9wZW5FdmVudCA9IHZvaWQgMDtcbmNvbnN0IGNvbXBhcmVfdmVyc2lvbnNfMSA9IHJlcXVpcmUoXCJjb21wYXJlLXZlcnNpb25zXCIpO1xuY29uc3QgU2hvd1BoYXNlXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vdHlwZXMvU2hvd1BoYXNlXCIpKTtcbmNvbnN0IHJlY29ubmVjdGluZ193ZWJzb2NrZXRfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwicmVjb25uZWN0aW5nLXdlYnNvY2tldFwiKSk7XG5jb25zdCB1cmxzXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3VybHNcIik7XG5jbGFzcyBDb2dzQ29ubmVjdGlvbiB7XG4gICAgZ2V0IGNvbmZpZygpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4udGhpcy5jdXJyZW50Q29uZmlnIH07XG4gICAgfVxuICAgIGdldCBzdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4udGhpcy5jdXJyZW50U3RhdGUgfTtcbiAgICB9XG4gICAgZ2V0IHNob3dQaGFzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Nob3dQaGFzZTtcbiAgICB9XG4gICAgZ2V0IHRpbWVyU3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90aW1lclN0YXRlID8geyAuLi50aGlzLl90aW1lclN0YXRlIH0gOiBudWxsO1xuICAgIH1cbiAgICBnZXQgc3VwcG9ydHNIdHRwMkFzc2V0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50U3VwcG9ydHNIdHRwMkFzc2V0cyAmJiB0aGlzLnNlcnZlclN1cHBvcnRzSHR0cDJBc3NldHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybiBhc3NldCBVUkxzIHVzaW5nIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgc3VwcG9ydCBmb3IgSFRUUC8yXG4gICAgICovXG4gICAgZ2V0QXNzZXRVcmwocGF0aCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICByZXR1cm4gYCR7KDAsIHVybHNfMS5hc3NldFVybCkocGF0aCwgdGhpcy5zdXBwb3J0c0h0dHAyQXNzZXRzKX0/JHsoX2IgPSAoX2EgPSB0aGlzLnVybFBhcmFtcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnRvU3RyaW5nKCkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnfWA7XG4gICAgfVxuICAgIGdldCBzZWxlY3RlZEF1ZGlvT3V0cHV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRBdWRpb091dHB1dDtcbiAgICB9XG4gICAgY29uc3RydWN0b3IobWFuaWZlc3QsIHsgaG9zdG5hbWUgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSwgcG9ydCA9IHVybHNfMS5DT0dTX1NFUlZFUl9QT1JUIH0gPSB7fSwgaW5pdGlhbENsaWVudFN0YXRlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5tYW5pZmVzdCA9IG1hbmlmZXN0O1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgICAgIHRoaXMuY3VycmVudENvbmZpZyA9IHt9OyAvLyBSZWNlaXZlZCBvbiBvcGVuIGNvbm5lY3Rpb25cbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSB7fTsgLy8gUmVjZWl2ZWQgb24gb3BlbiBjb25uZWN0aW9uIC0gVE9ETzogc2V0IGluaXRpYWwgc3RhdGUgZnJvbSBtYW5pZmVzdD9cbiAgICAgICAgdGhpcy5fc2hvd1BoYXNlID0gU2hvd1BoYXNlXzEuZGVmYXVsdC5TZXR1cDtcbiAgICAgICAgdGhpcy5fdGltZXJTdGF0ZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcmFjayB0aGUgc3VwcG9ydCBmb3IgSFRUUC8yIGFzc2V0cyBvbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZVxuICAgICAgICAgKiBDbGllbnQgc2lkZSBpcyBkaWN0YXRlZCBieSB0aGUgZW52aXJvbm1lbnQgd2UncmUgY29ubmVjdGluZyBmcm9tIChhbmQgdGhlIG1lZGlhIGNvZ3MtYXYtYm94IHZlcnNpb24pXG4gICAgICAgICAqIFNlcnZlciBzaWRlIGlzIGRpY3RhdGVkIGJ5IHRoZSBDT0dTIHZlcnNpb24gd2hpY2ggYWRkZWQgdGhlIEhUVFAvMiBhc3NldHMgc2VydmVyIGl0c2VsZlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbGllbnRTdXBwb3J0c0h0dHAyQXNzZXRzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VydmVyU3VwcG9ydHNIdHRwMkFzc2V0cyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2FjaGVkIGF1ZGlvIG91dHB1dHMgdXNlIHRvIGxvb2sgdXAgdGhlIGRldmljZS9zaW5rIElEIHdoZW4gYSBkaWZmZXJlbnQgZGV2aWNlIGxhYmVsIGlzIHJlcXVlc3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdWRpb091dHB1dHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQXVkaW9PdXRwdXQgPSAnJztcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVSTCBwYXJhbWV0ZXJzIHVzZSBmb3IgdGhlIHdlYnNvY2tldCBjb25uZWN0aW9uIGFuZCBhc3NldCBVUkxzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVybFBhcmFtcyA9IG51bGw7XG4gICAgICAgIHRoaXMuY3VycmVudFN0YXRlID0geyAuLi5pbml0aWFsQ2xpZW50U3RhdGUgfTtcbiAgICAgICAgY29uc3QgeyB1c2VSZWNvbm5lY3RpbmdXZWJzb2NrZXQsIHBhdGgsIHBhdGhQYXJhbXMsIHN1cHBvcnRzSHR0cDJBc3NldHMgfSA9IHdlYnNvY2tldFBhcmFtZXRlcnNGcm9tVXJsKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICAvLyBTdG9yZSB0aGUgVVJMIHBhcmFtZXRlcnMgZm9yIHVzZSBpbiBhc3NldCBVUkxzXG4gICAgICAgIC8vIGFuZCBhZGQgc2NyZWVuIGRpbWVuc2lvbnMgd2hpY2ggQ09HUyBjYW4gdXNlIHRvIGRldGVybWluZSB0aGUgYmVzdCBhc3NldCBxdWFsaXR5IHRvIHNlcnZlXG4gICAgICAgIC8vXG4gICAgICAgIC8vIE5vdGUgdGhhdCBjb250ZW50IGFsd2F5cyBydW5zIGZ1bGxzY3JlZW4gYW5kXG4gICAgICAgIC8vIHdlIGFzc3VtZSB0aGUgc2NyZWVuIHJlc29sdXRpb24gd2lsbCBub3QgY2hhbmdlIHdoaWxlIHRoZSBjb250ZW50IGlzIHJ1bm5pbmcuXG4gICAgICAgIHRoaXMudXJsUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXRoUGFyYW1zKTtcbiAgICAgICAgdGhpcy51cmxQYXJhbXMuc2V0KCdzY3JlZW5XaWR0aCcsIHdpbmRvdy5zY3JlZW4ud2lkdGgudG9TdHJpbmcoKSk7XG4gICAgICAgIHRoaXMudXJsUGFyYW1zLnNldCgnc2NyZWVuSGVpZ2h0Jywgd2luZG93LnNjcmVlbi5oZWlnaHQudG9TdHJpbmcoKSk7XG4gICAgICAgIHRoaXMudXJsUGFyYW1zLnNldCgnc2NyZWVuUGl4ZWxSYXRpbycsIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLnRvU3RyaW5nKCkpO1xuICAgICAgICBjb25zdCBzb2NrZXRVcmwgPSBgd3M6Ly8ke2hvc3RuYW1lfToke3BvcnR9JHtwYXRofT8ke3RoaXMudXJsUGFyYW1zfWA7XG4gICAgICAgIHRoaXMud2Vic29ja2V0ID0gdXNlUmVjb25uZWN0aW5nV2Vic29ja2V0ID8gbmV3IHJlY29ubmVjdGluZ193ZWJzb2NrZXRfMS5kZWZhdWx0KHNvY2tldFVybCkgOiBuZXcgV2ViU29ja2V0KHNvY2tldFVybCk7XG4gICAgICAgIHRoaXMuY2xpZW50U3VwcG9ydHNIdHRwMkFzc2V0cyA9ICEhc3VwcG9ydHNIdHRwMkFzc2V0cztcbiAgICAgICAgdGhpcy53ZWJzb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnID0ge307IC8vIFJlY2VpdmVkIG9uIG9wZW4gY29ubmVjdGlvblxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSB7fTsgLy8gUmVjZWl2ZWQgb24gb3BlbiBjb25uZWN0aW9uXG4gICAgICAgICAgICAvLyBSZXNldCB0aGlzIGZsYWcgYXMgd2UgbWlnaHQgaGF2ZSBqdXN0IGNvbm5lY3RlZCB0byBhbiBvbGQgQ09HUyB2ZXJzaW9uIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBIVFRQLzJcbiAgICAgICAgICAgIC8vIFRoZSBmbGFnIHdpbGwgYmUgc2V0IHdoZW4gQ09HUyBzZW5kcyBhIFwiY29nc19lbnZpcm9ubWVudFwiIG1lc3NhZ2VcbiAgICAgICAgICAgIHRoaXMuc2VydmVyU3VwcG9ydHNIdHRwMkFzc2V0cyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDb2dzQ29ubmVjdGlvbk9wZW5FdmVudCgpKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUodGhpcy5jdXJyZW50U3RhdGUpOyAvLyBUT0RPOiBSZW1vdmUgdGhpcyBiZWNhdXNlIHlvdSBzaG91bGQgc2V0IGl0IG1hbnVhbGx5Li4uPz9cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy53ZWJzb2NrZXQub25jbG9zZSA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ29nc0Nvbm5lY3Rpb25DbG9zZUV2ZW50KCkpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLndlYnNvY2tldC5vbm1lc3NhZ2UgPSAoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkLmNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Q29uZmlnID0gcGFyc2VkLmNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ29nc0NvbmZpZ0NoYW5nZWRFdmVudCh0aGlzLmN1cnJlbnRDb25maWcpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJzZWQudXBkYXRlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSB7IC4uLnRoaXMuY3VycmVudFN0YXRlLCAuLi5wYXJzZWQudXBkYXRlcyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDb2dzU3RhdGVDaGFuZ2VkRXZlbnQocGFyc2VkLnVwZGF0ZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJzZWQuZXZlbnQgJiYgcGFyc2VkLmV2ZW50LmtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDb2dzSW5jb21pbmdFdmVudChwYXJzZWQuZXZlbnQua2V5LCBwYXJzZWQuZXZlbnQudmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgcGFyc2VkLm1lc3NhZ2UgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gcGFyc2VkLm1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2UudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FkanVzdGFibGVfdGltZXJfdXBkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltZXJTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uTWlsbGlzOiBtZXNzYWdlLmR1cmF0aW9uTWlsbGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlja2luZzogbWVzc2FnZS50aWNraW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdzaG93X3BoYXNlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hvd1BoYXNlID0gbWVzc2FnZS5waGFzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29nc19lbnZpcm9ubWVudCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyU3VwcG9ydHNIdHRwMkFzc2V0cyA9IG1lc3NhZ2UuaHR0cDJBc3NldHNTZXJ2ZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDb2dzTWVzc2FnZUV2ZW50KG1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0Vycm9yIGhhbmRsaW5nIGRhdGEnLCBkYXRhLCBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBpbmNvbWluZyBkYXRhIGZyb20gc2VydmVyJywgZGF0YSwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIFNlbmQgYSBsaXN0IG9mIGF1ZGlvIG91dHB1dHMgdG8gQ09HUyBhbmQga2VlcCBpdCB1cCB0byBkYXRlXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHJlZnJlc2hBdWRpb091dHB1dHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gYG5hdmlnYXRvci5tZWRpYURldmljZXNgIGlzIHVuZGVmaW5lZCBvbiBDT0dTIEFWIDw9IDQuNSBiZWNhdXNlIG9mIHNlY3VyZSBvcmlnaW4gcGVybWlzc2lvbnNcbiAgICAgICAgICAgICAgICBpZiAobmF2aWdhdG9yLm1lZGlhRGV2aWNlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb091dHB1dHMgPSAoYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCkpLmZpbHRlcigoeyBraW5kIH0pID0+IGtpbmQgPT09ICdhdWRpb291dHB1dCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmRBdWRpb091dHB1dHMoYXVkaW9PdXRwdXRzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdWRpb091dHB1dHMgPSBhdWRpb091dHB1dHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHJlZnJlc2hBdWRpb091dHB1dHMpO1xuICAgICAgICAgICAgKF9hID0gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFkZEV2ZW50TGlzdGVuZXIoJ2RldmljZWNoYW5nZScsIHJlZnJlc2hBdWRpb091dHB1dHMpO1xuICAgICAgICAgICAgcmVmcmVzaEF1ZGlvT3V0cHV0cygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Vic29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOO1xuICAgIH1cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy53ZWJzb2NrZXQuY2xvc2UoKTtcbiAgICB9XG4gICAgc2VuZEV2ZW50KGV2ZW50TmFtZSwgLi4uW2V2ZW50VmFsdWVdKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBldmVudDoge1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGV2ZW50VmFsdWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRTdGF0ZSh2YWx1ZXMpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSB7IC4uLnRoaXMuY3VycmVudFN0YXRlLCAuLi52YWx1ZXMgfTtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyB1cGRhdGVzOiB2YWx1ZXMgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldEF1ZGlvU2lua0lkKGF1ZGlvT3V0cHV0KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiBhdWRpb091dHB1dCA/IChfYiA9IChfYSA9IHRoaXMuYXVkaW9PdXRwdXRzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZmluZCgoeyBsYWJlbCB9KSA9PiBsYWJlbCA9PT0gYXVkaW9PdXRwdXQpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZGV2aWNlSWQgOiAnJztcbiAgICB9XG4gICAgc2VuZEluaXRpYWxNZWRpYUNsaXBTdGF0ZXMoYWxsTWVkaWFDbGlwU3RhdGVzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgICB0aGlzLndlYnNvY2tldC5zZW5kKEpTT04uc3RyaW5naWZ5KHsgYWxsTWVkaWFDbGlwU3RhdGVzIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZW5kTWVkaWFDbGlwU3RhdGUobWVkaWFDbGlwU3RhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyBtZWRpYUNsaXBTdGF0ZSB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2VuZEF1ZGlvT3V0cHV0cyhhdWRpb091dHB1dHMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyBhdWRpb091dHB1dHMgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3cgb3IgaGlkZSB0aGUgcGx1Z2luIHdpbmRvdy5cbiAgICAgKiBAcGFyYW0gdmlzaWJsZSBXaGV0aGVyIHRvIHNob3cgb3IgaGlkZSB0aGUgd2luZG93XG4gICAgICogVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBwbHVnaW5zLCBub3QgZm9yIE1lZGlhIE1hc3RlciBjb250ZW50LlxuICAgICAqL1xuICAgIHNldFBsdWdpbldpbmRvd1Zpc2libGUodmlzaWJsZSkge1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IHdpbmRvdzogeyB2aXNpYmxlIH0gfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFR5cGUtc2FmZSB3cmFwcGVyIGFyb3VuZCBFdmVudFRhcmdldFxuICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gQ29nc0Nvbm5lY3Rpb247XG5mdW5jdGlvbiB3ZWJzb2NrZXRQYXJhbWV0ZXJzRnJvbVVybCh1cmwpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oO1xuICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICBjb25zdCBwYXRoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJzZWRVcmwuc2VhcmNoUGFyYW1zKTtcbiAgICBjb25zdCBsb2NhbENsaWVudElkID0gcGF0aFBhcmFtcy5nZXQoJ2xvY2FsX2lkJyk7XG4gICAgY29uc3QgaXNTaW11bGF0b3IgPSBwYXRoUGFyYW1zLmdldCgnc2ltdWxhdG9yJykgPT09ICd0cnVlJztcbiAgICBjb25zdCBkaXNwbGF5ID0gKF9hID0gcGF0aFBhcmFtcy5nZXQoJ2Rpc3BsYXknKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgY29uc3QgcGx1Z2luSWQgPSBwYXJzZWRVcmwucGF0aG5hbWUuc3RhcnRzV2l0aCgnL3BsdWdpbi8nKSA/IGRlY29kZVVSSUNvbXBvbmVudChwYXJzZWRVcmwucGF0aG5hbWUuc3BsaXQoJy8nKVsyXSkgOiB1bmRlZmluZWQ7XG4gICAgLy8gQWxsb3cgZXhwbGljaXRseSBkaXNhYmxpbmcgSFRUUC8yIGFzc2V0cy4gVGhpcyBpcyB1c2VmdWwgaW4gc2l0dWF0aW9ucyB3aGVyZSB3ZSBrbm93IHRoZSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBjYW5ub3QgYmVcbiAgICAvLyBzdXBwb3J0ZWQgc3VjaCBhcyB0aGUgbmF0aXZlIG1vYmlsZSBhcHBcbiAgICBjb25zdCBkaXNhYmxlSHR0cDJBc3NldHMgPSAoKF9iID0gcGF0aFBhcmFtcy5nZXQoJ2h0dHAyQXNzZXRzJykpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnKSA9PT0gJ2ZhbHNlJztcbiAgICBpZiAobG9jYWxDbGllbnRJZCkge1xuICAgICAgICBjb25zdCB0eXBlID0gKF9jID0gcGF0aFBhcmFtcy5nZXQoJ3QnKSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogJyc7XG4gICAgICAgIHBhdGhQYXJhbXMuZGVsZXRlKCdsb2NhbF9pZCcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogYC9sb2NhbC8ke2VuY29kZVVSSUNvbXBvbmVudChsb2NhbENsaWVudElkKX1gLFxuICAgICAgICAgICAgcGF0aFBhcmFtczogbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHQ6IHR5cGUgfSksXG4gICAgICAgICAgICB1c2VSZWNvbm5lY3RpbmdXZWJzb2NrZXQ6IHRydWUsXG4gICAgICAgICAgICBzdXBwb3J0c0h0dHAyQXNzZXRzOiAhZGlzYWJsZUh0dHAyQXNzZXRzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1NpbXVsYXRvcikge1xuICAgICAgICBjb25zdCBzdXBwb3J0c0h0dHAyQXNzZXRzID0gKChfZCA9IHBhdGhQYXJhbXMuZ2V0KCdodHRwMkFzc2V0cycpKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnJykgPT09ICd0cnVlJztcbiAgICAgICAgcGF0aFBhcmFtcy5kZWxldGUoJ2h0dHAyQXNzZXRzJyk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAoX2UgPSBwYXRoUGFyYW1zLmdldCgnbmFtZScpKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAnJztcbiAgICAgICAgcGF0aFBhcmFtcy5kZWxldGUoJ3NpbXVsYXRvcicpO1xuICAgICAgICBwYXRoUGFyYW1zLmRlbGV0ZSgnbmFtZScpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogYC9zaW11bGF0b3IvJHtlbmNvZGVVUklDb21wb25lbnQobmFtZSl9YCxcbiAgICAgICAgICAgIHBhdGhQYXJhbXMsXG4gICAgICAgICAgICB1c2VSZWNvbm5lY3RpbmdXZWJzb2NrZXQ6IHRydWUsXG4gICAgICAgICAgICBzdXBwb3J0c0h0dHAyQXNzZXRzOiAhZGlzYWJsZUh0dHAyQXNzZXRzICYmIHN1cHBvcnRzSHR0cDJBc3NldHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGRpc3BsYXkpIHtcbiAgICAgICAgY29uc3QgZGlzcGxheUlkSW5kZXggPSAoX2YgPSBwYXRoUGFyYW1zLmdldCgnZGlzcGxheUlkSW5kZXgnKSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogJyc7XG4gICAgICAgIHBhdGhQYXJhbXMuZGVsZXRlKCdkaXNwbGF5Jyk7XG4gICAgICAgIHBhdGhQYXJhbXMuZGVsZXRlKCdkaXNwbGF5SWRJbmRleCcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogYC9kaXNwbGF5LyR7ZW5jb2RlVVJJQ29tcG9uZW50KGRpc3BsYXkpfS8ke2VuY29kZVVSSUNvbXBvbmVudChkaXNwbGF5SWRJbmRleCl9YCxcbiAgICAgICAgICAgIHN1cHBvcnRzSHR0cDJBc3NldHM6ICFkaXNhYmxlSHR0cDJBc3NldHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHBsdWdpbklkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYXRoOiBgL3BsdWdpbi8ke2VuY29kZVVSSUNvbXBvbmVudChwbHVnaW5JZCl9YCxcbiAgICAgICAgICAgIHVzZVJlY29ubmVjdGluZ1dlYnNvY2tldDogdHJ1ZSxcbiAgICAgICAgICAgIHN1cHBvcnRzSHR0cDJBc3NldHM6ICFkaXNhYmxlSHR0cDJBc3NldHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBzZXJpYWwgPSAoX2cgPSBwYXRoUGFyYW1zLmdldCgnc2VyaWFsJykpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6ICcnO1xuICAgICAgICBwYXRoUGFyYW1zLmRlbGV0ZSgnc2VyaWFsJyk7XG4gICAgICAgIC8vIENoZWNrIGlmIGNvZ3MtYm94LWF2IGlzIGEgdmVyc2lvbiB3aGljaCBhZGRlZCBzdXBwb3J0IGZvciBpZ25vcmluZyBIVFRQLzIgc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzXG4gICAgICAgIGNvbnN0IGZpcm13YXJlVmVyc2lvbiA9ICgoX2ggPSBwYXRoUGFyYW1zLmdldCgnZicpKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAnJykucmVwbGFjZSgvXnYvLCAnJyk7XG4gICAgICAgIGNvbnN0IGlzQ29nc0JveEF2RGV2QnVpbGQgPSBmaXJtd2FyZVZlcnNpb24gPT09ICcwLjAuMCc7IC8vIFdlIGFzc3VtZSBkZXYgZmlybXdhcmUgYnVpbGRzIGhhdmUgSFRUUC8yIGFzc2V0cyBzdXBwb3J0IC0gQWRkZWQgaW4gMjAyNC0wM1xuICAgICAgICBjb25zdCBzdXBwb3J0c0h0dHAyQXNzZXRzID0gaXNDb2dzQm94QXZEZXZCdWlsZCB8fCAoKDAsIGNvbXBhcmVfdmVyc2lvbnNfMS52YWxpZGF0ZSkoZmlybXdhcmVWZXJzaW9uKSAmJiAoMCwgY29tcGFyZV92ZXJzaW9uc18xLnNhdGlzZmllcykoZmlybXdhcmVWZXJzaW9uLCAnPj00LjkuMCcpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhdGg6IGAvY2xpZW50LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcmlhbCl9YCxcbiAgICAgICAgICAgIHBhdGhQYXJhbXMsXG4gICAgICAgICAgICBzdXBwb3J0c0h0dHAyQXNzZXRzOiAhZGlzYWJsZUh0dHAyQXNzZXRzICYmIHN1cHBvcnRzSHR0cDJBc3NldHMsXG4gICAgICAgIH07XG4gICAgfVxufVxuY2xhc3MgQ29nc0Nvbm5lY3Rpb25PcGVuRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdvcGVuJyk7XG4gICAgICAgIHRoaXMuX2NvZ3NDb25uZWN0aW9uRXZlbnRUeXBlID0gJ29wZW4nO1xuICAgIH1cbn1cbmV4cG9ydHMuQ29nc0Nvbm5lY3Rpb25PcGVuRXZlbnQgPSBDb2dzQ29ubmVjdGlvbk9wZW5FdmVudDtcbmNsYXNzIENvZ3NDb25uZWN0aW9uQ2xvc2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ2Nsb3NlJyk7XG4gICAgICAgIHRoaXMuX2NvZ3NDb25uZWN0aW9uRXZlbnRUeXBlID0gJ2Nsb3NlJztcbiAgICB9XG59XG5leHBvcnRzLkNvZ3NDb25uZWN0aW9uQ2xvc2VFdmVudCA9IENvZ3NDb25uZWN0aW9uQ2xvc2VFdmVudDtcbmNsYXNzIENvZ3NNZXNzYWdlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcignbWVzc2FnZScpO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB0aGlzLl9jb2dzQ29ubmVjdGlvbkV2ZW50VHlwZSA9ICdtZXNzYWdlJztcbiAgICB9XG59XG5leHBvcnRzLkNvZ3NNZXNzYWdlRXZlbnQgPSBDb2dzTWVzc2FnZUV2ZW50O1xuY2xhc3MgQ29nc0NvbmZpZ0NoYW5nZWRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgc3VwZXIoJ2NvbmZpZycpO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5fY29nc0Nvbm5lY3Rpb25FdmVudFR5cGUgPSAnY29uZmlnJztcbiAgICB9XG59XG5leHBvcnRzLkNvZ3NDb25maWdDaGFuZ2VkRXZlbnQgPSBDb2dzQ29uZmlnQ2hhbmdlZEV2ZW50O1xuY2xhc3MgQ29nc1N0YXRlQ2hhbmdlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKHN0YXRlKSB7XG4gICAgICAgIHN1cGVyKCdzdGF0ZScpO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMuX2NvZ3NDb25uZWN0aW9uRXZlbnRUeXBlID0gJ3N0YXRlJztcbiAgICB9XG59XG5leHBvcnRzLkNvZ3NTdGF0ZUNoYW5nZWRFdmVudCA9IENvZ3NTdGF0ZUNoYW5nZWRFdmVudDtcbmNsYXNzIENvZ3NJbmNvbWluZ0V2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCdldmVudCcpO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX2NvZ3NDb25uZWN0aW9uRXZlbnRUeXBlID0gJ2V2ZW50JztcbiAgICB9XG59XG5leHBvcnRzLkNvZ3NJbmNvbWluZ0V2ZW50ID0gQ29nc0luY29taW5nRXZlbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTElWRV9WSURFT19QTEFZQkFDS19SQVRFID0gdm9pZCAwO1xuY29uc3QgbWVkaWFfc3RyZWFtX2xpYnJhcnlfYnJvd3Nlcl8xID0gcmVxdWlyZShcIkBjbG9ja3dvcmtkb2cvbWVkaWEtc3RyZWFtLWxpYnJhcnktYnJvd3NlclwiKTtcbmNvbnN0IHVybHNfMSA9IHJlcXVpcmUoXCIuL2hlbHBlcnMvdXJsc1wiKTtcbmNvbnN0IERFRkFVTFRfVklERU9fUExBWUJBQ0tfUkFURSA9IDE7XG4vLyBVc2UgYSBmYXN0ZXItdGhhbi1yZWFsdGltZSBwbGF5YmFjayByYXRlIGJ5IGRlZmF1bHRcbi8vIHNvIHRoYXQgaXQga2VlcHMgdXAgd2l0aCBhIHJlYWx0aW1lIHN0cmVhbSBpbiBjYXNlIG9mIHZpZGVvIGJ1ZmZlcmluZ1xuZXhwb3J0cy5MSVZFX1ZJREVPX1BMQVlCQUNLX1JBVEUgPSAxLjE7XG4vKipcbiAqIE1hbmFnZXMgYSB3ZWJzb2NrZXQgY29ubmVjdGlvbiB0byB0aGUgQ09HUyBUQ1AgcmVsYXkgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2VuZCBSVFNQIHZpZGVvXG4gKiBmZWVkcyB0byB0aGUgd2ViLlxuICovXG5jbGFzcyBSdHNwU3RyZWFtZXIge1xuICAgIGNvbnN0cnVjdG9yKHsgaG9zdG5hbWUgPSBkb2N1bWVudC5sb2NhdGlvbi5ob3N0bmFtZSwgcG9ydCA9IHVybHNfMS5DT0dTX1NFUlZFUl9QT1JULCBwYXRoID0gJy90Y3AtcHJveHknLCB9ID0ge30pIHtcbiAgICAgICAgdGhpcy5fd2Vic29ja2V0VXJpID0gYHdzOi8vJHtob3N0bmFtZX06JHtwb3J0fSR7cGF0aH1gO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdGFydCBhbiBSVFNQIHZpZGVvIHN0cmVhbSBvbiB3aXRoIHRoZSBnaXZlbiBVUkkgb24gdGhlIGdpdmVuIHZpZGVvIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggYSBmdW5jdGlvbiB0byBjbG9zZSB0aGUgcGlwZWxpbmVcbiAgICAgKi9cbiAgICBwbGF5KHBhcmFtcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IHsgdXJpLCB2aWRlb0VsZW1lbnQgfSA9IHBhcmFtcztcbiAgICAgICAgdmlkZW9FbGVtZW50LnBsYXlzSW5saW5lID0gdHJ1ZTsgLy8gUmVxdWlyZWQgZm9yIGlPU1xuICAgICAgICBsZXQgcGlwZWxpbmU7XG4gICAgICAgIGNvbnN0IHN0YXJ0UGlwZWxpbmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBwaXBlbGluZSA9PT0gbnVsbCB8fCBwaXBlbGluZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGlwZWxpbmUuY2xvc2UoKTtcbiAgICAgICAgICAgIHBpcGVsaW5lID0gbmV3IG1lZGlhX3N0cmVhbV9saWJyYXJ5X2Jyb3dzZXJfMS5IdG1sNVZpZGVvUGlwZWxpbmUoe1xuICAgICAgICAgICAgICAgIHdzOiB7IHVyaTogdGhpcy5fd2Vic29ja2V0VXJpIH0sXG4gICAgICAgICAgICAgICAgcnRzcDogeyB1cmk6IHVyaSB9LFxuICAgICAgICAgICAgICAgIG1lZGlhRWxlbWVudDogdmlkZW9FbGVtZW50LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBSZXN0YXJ0IHN0cmVhbSBvbiBSVENQIEJZRSAoc3RyZWFtIGVuZGVkKVxuICAgICAgICAgICAgcGlwZWxpbmUucnRzcC5vblJ0Y3AgPSAocnRjcCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICgoMCwgbWVkaWFfc3RyZWFtX2xpYnJhcnlfYnJvd3Nlcl8xLmlzUnRjcEJ5ZSkocnRjcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1ZpZGVvIHN0cmVhbSBlbmRlZC4gUmVzdGFydGluZy4nKTtcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoc3RhcnRQaXBlbGluZSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIFN0YXJ0IHBsYXliYWNrIHdoZW4gcmVhZHlcbiAgICAgICAgICAgIHBpcGVsaW5lLnJlYWR5LnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHBpcGVsaW5lLnJ0c3AucGxheSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHN0YXJ0UGlwZWxpbmUoKTtcbiAgICAgICAgaWYgKHBhcmFtcy5wbGF5YmFja1JhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBsYXliYWNrUmF0ZSA9IChfYSA9IHBhcmFtcy5wbGF5YmFja1JhdGUpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IERFRkFVTFRfVklERU9fUExBWUJBQ0tfUkFURTtcbiAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7XG4gICAgICAgICAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGxheScsICgpID0+IHtcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlbW92ZVJlc3RhcnRMaXN0ZW5lcnMgPSBudWxsO1xuICAgICAgICBpZiAocGFyYW1zLnJlc3RhcnRJZlN0b3BwZWQpIHtcbiAgICAgICAgICAgIGxldCBwbGF5aW5nID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgaW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlVGltZVVwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBwbGF5aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVQbGF5ID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHBsYXlpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgaGFuZGxlVGltZVVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGxheWluZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdWaWRlbyBzdG9wcGVkIHBsYXlpbmcuIFJlc3RhcnRpbmcuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChzdGFydFBpcGVsaW5lLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVBhdXNlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0aW1ldXBkYXRlJywgaGFuZGxlVGltZVVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGludGVydmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZpZGVvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwbGF5JywgaGFuZGxlUGxheSk7XG4gICAgICAgICAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBoYW5kbGVQYXVzZSk7XG4gICAgICAgICAgICByZW1vdmVSZXN0YXJ0TGlzdGVuZXJzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhbmRsZVBhdXNlKCk7XG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BsYXknLCBoYW5kbGVQbGF5KTtcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncGF1c2UnLCBoYW5kbGVQYXVzZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjbG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHBpcGVsaW5lID09PSBudWxsIHx8IHBpcGVsaW5lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwaXBlbGluZS5jbG9zZSgpO1xuICAgICAgICAgICAgICAgIHJlbW92ZVJlc3RhcnRMaXN0ZW5lcnMgPT09IG51bGwgfHwgcmVtb3ZlUmVzdGFydExpc3RlbmVycyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVtb3ZlUmVzdGFydExpc3RlbmVycygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG59XG5leHBvcnRzLmRlZmF1bHQgPSBSdHNwU3RyZWFtZXI7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IFZpZGVvU3RhdGVfMSA9IHJlcXVpcmUoXCIuL3R5cGVzL1ZpZGVvU3RhdGVcIik7XG5jb25zdCBERUZBVUxUX1BBUkVOVF9FTEVNRU5UID0gZG9jdW1lbnQuYm9keTtcbmNsYXNzIFZpZGVvUGxheWVyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb2dzQ29ubmVjdGlvbiwgcGFyZW50RWxlbWVudCA9IERFRkFVTFRfUEFSRU5UX0VMRU1FTlQpIHtcbiAgICAgICAgdGhpcy5jb2dzQ29ubmVjdGlvbiA9IGNvZ3NDb25uZWN0aW9uO1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgICAgIHRoaXMuZ2xvYmFsVm9sdW1lID0gMTtcbiAgICAgICAgdGhpcy52aWRlb0NsaXBQbGF5ZXJzID0ge307XG4gICAgICAgIHRoaXMuc2lua0lkID0gJyc7XG4gICAgICAgIHRoaXMucGFyZW50RWxlbWVudCA9IHBhcmVudEVsZW1lbnQ7XG4gICAgICAgIC8vIFNlbmQgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGVhY2ggY2xpcCB0byBDT0dTXG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigndmlkZW9DbGlwU3RhdGUnLCAoeyBkZXRhaWwgfSkgPT4ge1xuICAgICAgICAgICAgY29nc0Nvbm5lY3Rpb24uc2VuZE1lZGlhQ2xpcFN0YXRlKGRldGFpbCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIHZpZGVvIGNvbnRyb2wgbWVzc2FnZXNcbiAgICAgICAgY29nc0Nvbm5lY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IG1lc3NhZ2UgfSkgPT4ge1xuICAgICAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdtZWRpYV9jb25maWdfdXBkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRHbG9iYWxWb2x1bWUobWVzc2FnZS5nbG9iYWxWb2x1bWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hdWRpb091dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaW5rSWQgPSBjb2dzQ29ubmVjdGlvbi5nZXRBdWRpb1NpbmtJZChtZXNzYWdlLmF1ZGlvT3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXVkaW9TaW5rKHNpbmtJZCAhPT0gbnVsbCAmJiBzaW5rSWQgIT09IHZvaWQgMCA/IHNpbmtJZCA6ICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbmZpZyhtZXNzYWdlLmZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndmlkZW9fcGxheSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheVZpZGVvQ2xpcChtZXNzYWdlLmZpbGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlJZDogbWVzc2FnZS5wbGF5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWU6IG1lc3NhZ2Uudm9sdW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcDogQm9vbGVhbihtZXNzYWdlLmxvb3ApLFxuICAgICAgICAgICAgICAgICAgICAgICAgZml0OiBtZXNzYWdlLmZpdCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvX3BhdXNlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXVzZVZpZGVvQ2xpcCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2aWRlb19zdG9wJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wVmlkZW9DbGlwKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvX3NldF92b2x1bWUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZpZGVvQ2xpcFZvbHVtZSh7IHZvbHVtZTogbWVzc2FnZS52b2x1bWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvX3NldF9maXQnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZpZGVvQ2xpcEZpdCh7IGZpdDogbWVzc2FnZS5maXQgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gT24gY29ubmVjdGlvbiwgc2VuZCB0aGUgY3VycmVudCBwbGF5aW5nIHN0YXRlIG9mIGFsbCBjbGlwc1xuICAgICAgICAvLyAoVXN1YWxseSBlbXB0eSB1bmxlc3Mgd2Vic29ja2V0IGlzIHJlY29ubmVjdGluZylcbiAgICAgICAgY29uc3Qgc2VuZEluaXRpYWxDbGlwU3RhdGVzID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmlsZXMgPSBPYmplY3QuZW50cmllcyh0aGlzLnZpZGVvQ2xpcFBsYXllcnMpLm1hcCgoW2ZpbGUsIHBsYXllcl0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0dXMgPSAhcGxheWVyLnZpZGVvRWxlbWVudC5wYXVzZWRcbiAgICAgICAgICAgICAgICAgICAgPyAncGxheWluZydcbiAgICAgICAgICAgICAgICAgICAgOiBwbGF5ZXIudmlkZW9FbGVtZW50LmN1cnJlbnRUaW1lID09PSAwIHx8IHBsYXllci52aWRlb0VsZW1lbnQuY3VycmVudFRpbWUgPT09IHBsYXllci52aWRlb0VsZW1lbnQuZHVyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgID8gJ3BhdXNlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ3N0b3BwZWQnO1xuICAgICAgICAgICAgICAgIHJldHVybiBbZmlsZSwgc3RhdHVzXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29nc0Nvbm5lY3Rpb24uc2VuZEluaXRpYWxNZWRpYUNsaXBTdGF0ZXMoeyBtZWRpYVR5cGU6ICd2aWRlbycsIGZpbGVzIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb2dzQ29ubmVjdGlvbi5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgc2VuZEluaXRpYWxDbGlwU3RhdGVzKTtcbiAgICAgICAgc2VuZEluaXRpYWxDbGlwU3RhdGVzKCk7XG4gICAgfVxuICAgIHNldFBhcmVudEVsZW1lbnQocGFyZW50RWxlbWVudCkge1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMudmlkZW9DbGlwUGxheWVycykuZm9yRWFjaCgoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChjbGlwUGxheWVyLnZpZGVvRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXNldFBhcmVudEVsZW1lbnQoKSB7XG4gICAgICAgIHRoaXMuc2V0UGFyZW50RWxlbWVudChERUZBVUxUX1BBUkVOVF9FTEVNRU5UKTtcbiAgICB9XG4gICAgc2V0R2xvYmFsVm9sdW1lKGdsb2JhbFZvbHVtZSkge1xuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMudmlkZW9DbGlwUGxheWVycykuZm9yRWFjaCgoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgc2V0VmlkZW9FbGVtZW50Vm9sdW1lKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LCBjbGlwUGxheWVyLnZvbHVtZSAqIGdsb2JhbFZvbHVtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmdsb2JhbFZvbHVtZSA9IGdsb2JhbFZvbHVtZTtcbiAgICAgICAgdGhpcy5ub3RpZnlTdGF0ZUxpc3RlbmVycygpO1xuICAgIH1cbiAgICBwbGF5VmlkZW9DbGlwKHBhdGgsIHsgcGxheUlkLCB2b2x1bWUsIGxvb3AsIGZpdCB9KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0pIHtcbiAgICAgICAgICAgIHRoaXMudmlkZW9DbGlwUGxheWVyc1twYXRoXSA9IHRoaXMuY3JlYXRlQ2xpcFBsYXllcihwYXRoLCB7IHByZWxvYWQ6ICdub25lJywgZXBoZW1lcmFsOiB0cnVlLCBmaXQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhbHJlYWR5IGEgcGVuZGluZyBjbGlwLCB3aGljaCBoYXMgbm93IGJlZW4gc3VwZXJzZWRlZCBhbmQgYWJvcnQgdGhlIHBsYXkgb3BlcmF0aW9uXG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZGVvQ2xpcFBsYXllcih0aGlzLnBlbmRpbmdDbGlwLnBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQubG9hZCgpOyAvLyBSZXNldHMgdGhlIG1lZGlhIGVsZW1lbnRcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5ldyBwZW5kaW5nIGNsaXAgaXMgdmlkZW8gYmVpbmcgcmVxdWVzdGVkXG4gICAgICAgIGlmICgoKF9hID0gdGhpcy5hY3RpdmVDbGlwKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGF0aCkgIT09IHBhdGgpIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAgPSB7IHBhdGgsIHBsYXlJZCwgYWN0aW9uT25jZVBsYXlpbmc6ICdwbGF5JyB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldHVwIGFuZCBwbGF5IHRoZSBwZW5kaW5nIGNsaXAncyBwbGF5ZXJcbiAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIudm9sdW1lID0gdm9sdW1lO1xuICAgICAgICAgICAgc2V0VmlkZW9FbGVtZW50Vm9sdW1lKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LCB2b2x1bWUgKiB0aGlzLmdsb2JhbFZvbHVtZSk7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5sb29wID0gbG9vcDtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LnN0eWxlLm9iamVjdEZpdCA9IGZpdDtcbiAgICAgICAgICAgIGlmIChjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5jdXJyZW50VGltZSA9PT0gY2xpcFBsYXllci52aWRlb0VsZW1lbnQuZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5wbGF5KCk7XG4gICAgICAgICAgICAvLyBEaXNwbGF5IHJpZ2h0IGF3YXkgaWYgdGhlcmUncyBjdXJyZW50bHkgbm8gYWN0aXZlIGNsaXBcbiAgICAgICAgICAgIGlmICghdGhpcy5hY3RpdmVDbGlwKSB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBhdXNlVmlkZW9DbGlwKCkge1xuICAgICAgICAvLyBQZW5kaW5nIGNsaXAgc2hvdWxkIGJlIHBhdXNlZCB3aGVuIGl0IGxvYWRzIGFuZCBiZWNvbWVzIGFjdGl2ZVxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCkge1xuICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcC5hY3Rpb25PbmNlUGxheWluZyA9ICdwYXVzZSc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGF1c2UgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2xpcFxuICAgICAgICBpZiAodGhpcy5hY3RpdmVDbGlwKSB7XG4gICAgICAgICAgICBjb25zdCB7IHBsYXlJZCwgcGF0aCB9ID0gdGhpcy5hY3RpdmVDbGlwO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgKF9hID0gY2xpcFBsYXllci52aWRlb0VsZW1lbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXVzZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhwbGF5SWQsIHBhdGgsICdwYXVzZWQnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdG9wVmlkZW9DbGlwKCkge1xuICAgICAgICAvLyBQZW5kaW5nIGNsaXAgc2hvdWxkIGJlIHN0b3BwZWQgd2hlbiBpdCBsb2FkcyBhbmQgYmVjb21lcyBhY3RpdmVcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0NsaXApIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAuYWN0aW9uT25jZVBsYXlpbmcgPSAnc3RvcCc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RvcCB0aGUgY3VycmVudGx5IGFjdGl2ZSBjbGlwXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZUNsaXApIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlU3RvcHBlZENsaXAodGhpcy5hY3RpdmVDbGlwLnBhdGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFZpZGVvQ2xpcFZvbHVtZSh7IHZvbHVtZSB9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcGVuZGluZyBjbGlwLCB0aGlzIGlzIGxhdGVzdCB0byBoYXZlIGJlZW4gcGxheWVkIHNvIHVwZGF0ZSBpdHMgdm9sdW1lXG4gICAgICAgIGNvbnN0IGNsaXBUb1VwZGF0ZSA9IChfYiA9IChfYSA9IHRoaXMucGVuZGluZ0NsaXApICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuYWN0aXZlQ2xpcCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIWNsaXBUb1VwZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHZvbHVtZSA+PSAwICYmIHZvbHVtZSA8PSAxKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIHZvbHVtZScsIHZvbHVtZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIoY2xpcFRvVXBkYXRlLnBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2xpcFBsYXllci52aWRlb0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnZvbHVtZSA9IHZvbHVtZTtcbiAgICAgICAgICAgICAgICBzZXRWaWRlb0VsZW1lbnRWb2x1bWUoY2xpcFBsYXllci52aWRlb0VsZW1lbnQsIHZvbHVtZSAqIHRoaXMuZ2xvYmFsVm9sdW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0VmlkZW9DbGlwRml0KHsgZml0IH0pIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwZW5kaW5nIGNsaXAsIHRoaXMgaXMgbGF0ZXN0IHRvIGhhdmUgYmVlbiBwbGF5ZWQgc28gdXBkYXRlIGl0cyBmaXRcbiAgICAgICAgY29uc3QgY2xpcFRvVXBkYXRlID0gKF9iID0gKF9hID0gdGhpcy5wZW5kaW5nQ2xpcCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogdGhpcy5hY3RpdmVDbGlwKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmICghY2xpcFRvVXBkYXRlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIoY2xpcFRvVXBkYXRlLnBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2xpcFBsYXllci52aWRlb0VsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5zdHlsZS5vYmplY3RGaXQgPSBmaXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGhhbmRsZVN0b3BwZWRDbGlwKHBhdGgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMuYWN0aXZlQ2xpcCB8fCB0aGlzLmFjdGl2ZUNsaXAucGF0aCAhPT0gcGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBsYXlJZCA9IHRoaXMuYWN0aXZlQ2xpcC5wbGF5SWQ7XG4gICAgICAgIC8vIE9uY2UgYW4gZXBoZW1lcmFsIGNsaXAgc3RvcHMsIGNsZWFudXAgYW5kIHJlbW92ZSB0aGUgcGxheWVyXG4gICAgICAgIGlmICgoX2EgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbdGhpcy5hY3RpdmVDbGlwLnBhdGhdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29uZmlnLmVwaGVtZXJhbCkge1xuICAgICAgICAgICAgdGhpcy51bmxvYWRDbGlwKHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWN0aXZlQ2xpcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LnBhdXNlKCk7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5jdXJyZW50VGltZSA9IDA7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhwbGF5SWQsIHBhdGgsICdzdG9wcGVkJyk7XG4gICAgfVxuICAgIHVwZGF0ZVZpZGVvQ2xpcFBsYXllcihwYXRoLCB1cGRhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMudmlkZW9DbGlwUGxheWVyc1twYXRoXSkge1xuICAgICAgICAgICAgY29uc3QgbmV3UGxheWVyID0gdXBkYXRlKHRoaXMudmlkZW9DbGlwUGxheWVyc1twYXRoXSk7XG4gICAgICAgICAgICBpZiAobmV3UGxheWVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3BhdGhdID0gbmV3UGxheWVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudmlkZW9DbGlwUGxheWVyc1twYXRoXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRBdWRpb1Npbmsoc2lua0lkKSB7XG4gICAgICAgIGZvciAoY29uc3QgY2xpcFBsYXllciBvZiBPYmplY3QudmFsdWVzKHRoaXMudmlkZW9DbGlwUGxheWVycykpIHtcbiAgICAgICAgICAgIHNldFBsYXllclNpbmtJZChjbGlwUGxheWVyLCBzaW5rSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2lua0lkID0gc2lua0lkO1xuICAgIH1cbiAgICB1cGRhdGVDb25maWcobmV3UGF0aHMpIHtcbiAgICAgICAgY29uc3QgbmV3VmlkZW9QYXRocyA9IE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhuZXdQYXRocykuZmlsdGVyKChbLCB7IHR5cGUgfV0pID0+IHR5cGUgPT09ICd2aWRlbycgfHwgIXR5cGUpKTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNDbGlwUGxheWVycyA9IHRoaXMudmlkZW9DbGlwUGxheWVycztcbiAgICAgICAgdGhpcy52aWRlb0NsaXBQbGF5ZXJzID0gKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNsaXBQbGF5ZXJzID0geyAuLi5wcmV2aW91c0NsaXBQbGF5ZXJzIH07XG4gICAgICAgICAgICBjb25zdCByZW1vdmVkQ2xpcHMgPSBPYmplY3Qua2V5cyhwcmV2aW91c0NsaXBQbGF5ZXJzKS5maWx0ZXIoKHByZXZpb3VzUGF0aCkgPT4gIShwcmV2aW91c1BhdGggaW4gbmV3VmlkZW9QYXRocykpO1xuICAgICAgICAgICAgcmVtb3ZlZENsaXBzLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICAgICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgICAgIGlmICgoKF9hID0gdGhpcy5hY3RpdmVDbGlwKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGF0aCkgPT09IHBhdGggJiYgKChfYiA9IHByZXZpb3VzQ2xpcFBsYXllcnNbcGF0aF0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jb25maWcuZXBoZW1lcmFsKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIocGF0aCwgKHBsYXllcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLmNvbmZpZyA9IHsgLi4ucGxheWVyLmNvbmZpZywgZXBoZW1lcmFsOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVyO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudW5sb2FkQ2xpcChwYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNsaXBQbGF5ZXJzW3BhdGhdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgYWRkZWRDbGlwcyA9IE9iamVjdC5lbnRyaWVzKG5ld1ZpZGVvUGF0aHMpLmZpbHRlcigoW25ld0ZpbGVdKSA9PiAhcHJldmlvdXNDbGlwUGxheWVyc1tuZXdGaWxlXSk7XG4gICAgICAgICAgICBhZGRlZENsaXBzLmZvckVhY2goKFtwYXRoLCBjb25maWddKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllcnNbcGF0aF0gPSB0aGlzLmNyZWF0ZUNsaXBQbGF5ZXIocGF0aCwgeyAuLi5jb25maWcsIHByZWxvYWQ6IHByZWxvYWRTdHJpbmcoY29uZmlnLnByZWxvYWQpLCBlcGhlbWVyYWw6IGZhbHNlLCBmaXQ6ICdjb250YWluJyB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZENsaXBzID0gT2JqZWN0LmVudHJpZXMocHJldmlvdXNDbGlwUGxheWVycykuZmlsdGVyKChbcHJldmlvdXNQYXRoXSkgPT4gcHJldmlvdXNQYXRoIGluIG5ld1ZpZGVvUGF0aHMpO1xuICAgICAgICAgICAgdXBkYXRlZENsaXBzLmZvckVhY2goKFtwYXRoLCBwcmV2aW91c0NsaXBQbGF5ZXJdKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzQ2xpcFBsYXllci5jb25maWcucHJlbG9hZCAhPT0gbmV3VmlkZW9QYXRoc1twYXRoXS5wcmVsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIChwbGF5ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci5jb25maWcgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucGxheWVyLmNvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkOiBwcmVsb2FkU3RyaW5nKG5ld1ZpZGVvUGF0aHNbcGF0aF0ucHJlbG9hZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBoZW1lcmFsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIudmlkZW9FbGVtZW50LnByZWxvYWQgPSBwbGF5ZXIuY29uZmlnLnByZWxvYWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVyO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVycztcbiAgICAgICAgfSkoKTtcbiAgICAgICAgdGhpcy5ub3RpZnlTdGF0ZUxpc3RlbmVycygpO1xuICAgIH1cbiAgICBub3RpZnlTdGF0ZUxpc3RlbmVycygpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nO1xuICAgICAgICBjb25zdCBWaWRlb1N0YXRlID0ge1xuICAgICAgICAgICAgZ2xvYmFsVm9sdW1lOiB0aGlzLmdsb2JhbFZvbHVtZSxcbiAgICAgICAgICAgIGlzUGxheWluZzogdGhpcy5hY3RpdmVDbGlwID8gISgoX2EgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbdGhpcy5hY3RpdmVDbGlwLnBhdGhdLnZpZGVvRWxlbWVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhdXNlZCkgOiBmYWxzZSxcbiAgICAgICAgICAgIGNsaXBzOiB7IC4uLnRoaXMudmlkZW9DbGlwUGxheWVycyB9LFxuICAgICAgICAgICAgYWN0aXZlQ2xpcDogdGhpcy5hY3RpdmVDbGlwXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IHRoaXMuYWN0aXZlQ2xpcC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogISgoX2IgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbdGhpcy5hY3RpdmVDbGlwLnBhdGhdLnZpZGVvRWxlbWVudCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnBhdXNlZCkgPyBWaWRlb1N0YXRlXzEuQWN0aXZlVmlkZW9DbGlwU3RhdGUuUGxheWluZyA6IFZpZGVvU3RhdGVfMS5BY3RpdmVWaWRlb0NsaXBTdGF0ZS5QYXVzZWQsXG4gICAgICAgICAgICAgICAgICAgIGxvb3A6IChfZCA9IChfYyA9IHRoaXMudmlkZW9DbGlwUGxheWVyc1t0aGlzLmFjdGl2ZUNsaXAucGF0aF0udmlkZW9FbGVtZW50KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MubG9vcCkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHZvbHVtZTogKChfZSA9IHRoaXMudmlkZW9DbGlwUGxheWVyc1t0aGlzLmFjdGl2ZUNsaXAucGF0aF0udmlkZW9FbGVtZW50KSA9PT0gbnVsbCB8fCBfZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2UubXV0ZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogKF9nID0gKF9mID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3RoaXMuYWN0aXZlQ2xpcC5wYXRoXS52aWRlb0VsZW1lbnQpID09PSBudWxsIHx8IF9mID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZi52b2x1bWUpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IDAsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3N0YXRlJywgVmlkZW9TdGF0ZSk7XG4gICAgfVxuICAgIG5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhwbGF5SWQsIGZpbGUsIHN0YXR1cykge1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3ZpZGVvQ2xpcFN0YXRlJywgeyBwbGF5SWQsIG1lZGlhVHlwZTogJ3ZpZGVvJywgZmlsZSwgc3RhdHVzIH0pO1xuICAgIH1cbiAgICAvLyBUeXBlLXNhZmUgd3JhcHBlciBhcm91bmQgRXZlbnRUYXJnZXRcbiAgICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgZGlzcGF0Y2hFdmVudCh0eXBlLCBkZXRhaWwpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCh0eXBlLCB7IGRldGFpbCB9KSk7XG4gICAgfVxuICAgIGNyZWF0ZVZpZGVvRWxlbWVudChwYXRoLCBjb25maWcsIHsgdm9sdW1lIH0pIHtcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgICAgICAgdmlkZW9FbGVtZW50LnBsYXlzSW5saW5lID0gdHJ1ZTsgLy8gUmVxdWlyZWQgZm9yIGlPU1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3JjID0gdGhpcy5jb2dzQ29ubmVjdGlvbi5nZXRBc3NldFVybChwYXRoKTtcbiAgICAgICAgdmlkZW9FbGVtZW50LmF1dG9wbGF5ID0gZmFsc2U7XG4gICAgICAgIHZpZGVvRWxlbWVudC5sb29wID0gZmFsc2U7XG4gICAgICAgIHNldFZpZGVvRWxlbWVudFZvbHVtZSh2aWRlb0VsZW1lbnQsIHZvbHVtZSAqIHRoaXMuZ2xvYmFsVm9sdW1lKTtcbiAgICAgICAgdmlkZW9FbGVtZW50LnByZWxvYWQgPSBjb25maWcucHJlbG9hZDtcbiAgICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlpbmcnLCAoKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGNsaXAgaXMgc3RpbGwgdGhlIHBlbmRpbmcgb25lIHdoZW4gaXQgYWN0dWFsbHkgc3RhcnQgcGxheWluZywgdGhlbiBlbnN1cmUgaXQgaXMgaW4gdGhlIGNvcnJlY3Qgc3RhdGVcbiAgICAgICAgICAgIGlmICgoKF9hID0gdGhpcy5wZW5kaW5nQ2xpcCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhdGgpID09PSBwYXRoKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLnBlbmRpbmdDbGlwLmFjdGlvbk9uY2VQbGF5aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3BsYXknOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZSBwbGF5aW5nLCBzaG93IHRoZSB2aWRlbyBlbGVtZW50LCBhbmQgbm90aWZ5IGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnModGhpcy5wZW5kaW5nQ2xpcC5wbGF5SWQsIHBhdGgsICdwbGF5aW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdwYXVzZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHBsYXliYWNrLCBzaG93IHRoZSB2aWRlbyBlbGVtZW50LCBhbmQgbm90aWZ5IGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyh0aGlzLnBlbmRpbmdDbGlwLnBsYXlJZCwgcGF0aCwgJ3BhdXNlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RvcCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdXNlIHBsYXliYWNrLCBsZWF2ZSB0aGUgdmlkZW8gZWxlbWVudCBoaWRkZW4sIGFuZCBub3RpZnkgbGlzdGVuZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHRoaXMucGVuZGluZ0NsaXAucGxheUlkLCBwYXRoLCAnc3RvcHBlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgcHJldmlvdXNseSBhY3RpdmUgY2xpcCwgdGhlbiBzdG9wIGl0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlQ2xpcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN0b3BwZWRDbGlwKHRoaXMuYWN0aXZlQ2xpcC5wYXRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDbGlwID0gdGhpcy5wZW5kaW5nQ2xpcDtcbiAgICAgICAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoKChfYiA9IHRoaXMuYWN0aXZlQ2xpcCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnBhdGgpID09PSBwYXRoKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgd2Ugd2VyZSB0aGUgYWN0aXZlIGNsaXAgdGhlbiBqdXN0IG5vdGlmeSBsaXN0ZW5lcnMgdGhhdCB3ZSBhcmUgbm93IHBsYXlpbmdcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyh0aGlzLmFjdGl2ZUNsaXAucGxheUlkLCBwYXRoLCAncGxheWluZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGl0IHNob3VsZG4ndCBiZSBwbGF5aW5nLCBsaWtlIGJlY2F1c2UgYW5vdGhlciBjbGlwIGJlY2FtZSBwZW5kaW5nIGJlZm9yZSB3ZSBsb2FkZWQsXG4gICAgICAgICAgICAgICAgLy8gc28gd2UgcGF1c2UgYW5kIGRvbid0IHNob3cgb3Igbm90aWZ5IGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgLy8gSWdub3JlIGlmIHRoZXJlJ3MgYSBwZW5kaW5nIGNsaXAsIGFzIG9uY2UgdGhhdCBzdGFydHMgcGxheWluZyB0aGUgYWN0aXZlIGNsaXAgd2lsbCBiZSBzdG9wcGVkXG4gICAgICAgICAgICAvLyBBbHNvIGlnbm9yZSBpZiB0aGUgdmlkZW8gaXMgc2V0IHRvIGxvb3BcbiAgICAgICAgICAgIGlmICghdGhpcy5wZW5kaW5nQ2xpcCAmJiAhdmlkZW9FbGVtZW50Lmxvb3ApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN0b3BwZWRDbGlwKHBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLnRvcCA9ICcwJztcbiAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICAgICAgdmlkZW9FbGVtZW50LnN0eWxlLm9iamVjdEZpdCA9IGNvbmZpZy5maXQ7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodmlkZW9FbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIHZpZGVvRWxlbWVudDtcbiAgICB9XG4gICAgY3JlYXRlQ2xpcFBsYXllcihwYXRoLCBjb25maWcpIHtcbiAgICAgICAgY29uc3Qgdm9sdW1lID0gMTtcbiAgICAgICAgY29uc3QgcGxheWVyID0ge1xuICAgICAgICAgICAgY29uZmlnLFxuICAgICAgICAgICAgdmlkZW9FbGVtZW50OiB0aGlzLmNyZWF0ZVZpZGVvRWxlbWVudChwYXRoLCBjb25maWcsIHsgdm9sdW1lIH0pLFxuICAgICAgICAgICAgdm9sdW1lLFxuICAgICAgICB9O1xuICAgICAgICBzZXRQbGF5ZXJTaW5rSWQocGxheWVyLCB0aGlzLnNpbmtJZCk7XG4gICAgICAgIHJldHVybiBwbGF5ZXI7XG4gICAgfVxuICAgIHVubG9hZENsaXAocGF0aCkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBpZiAoKChfYSA9IHRoaXMuYWN0aXZlQ2xpcCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhdGgpID09PSBwYXRoKSB7XG4gICAgICAgICAgICBjb25zdCBwbGF5SWQgPSB0aGlzLmFjdGl2ZUNsaXAucGxheUlkO1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVDbGlwID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBwYXRoLCAnc3RvcHBlZCcpO1xuICAgICAgICB9XG4gICAgICAgIChfYiA9IHRoaXMudmlkZW9DbGlwUGxheWVyc1twYXRoXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIocGF0aCwgKCkgPT4gbnVsbCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gVmlkZW9QbGF5ZXI7XG5mdW5jdGlvbiBwcmVsb2FkU3RyaW5nKHByZWxvYWQpIHtcbiAgICByZXR1cm4gdHlwZW9mIHByZWxvYWQgPT09ICdzdHJpbmcnID8gcHJlbG9hZCA6IHByZWxvYWQgPyAnYXV0bycgOiAnbm9uZSc7XG59XG5mdW5jdGlvbiBzZXRQbGF5ZXJTaW5rSWQocGxheWVyLCBzaW5rSWQpIHtcbiAgICBpZiAoc2lua0lkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBsYXllci52aWRlb0VsZW1lbnQuc2V0U2lua0lkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHBsYXllci52aWRlb0VsZW1lbnQuc2V0U2lua0lkKHNpbmtJZCk7XG4gICAgfVxufVxuLyoqXG4gKiBTZXQgdmlkZW8gdm9sdW1lXG4gKlxuICogVGhpcyBkb2Vzbid0IHdvcmsgb24gaU9TICh2b2x1bWUgaXMgcmVhZC1vbmx5KSBzbyBhdCBsZWFzdCBtdXRlIGl0IGlmIHRoZSB2b2x1bWUgaXMgemVyb1xuICovXG5mdW5jdGlvbiBzZXRWaWRlb0VsZW1lbnRWb2x1bWUodmlkZW9FbGVtZW50LCB2b2x1bWUpIHtcbiAgICB2aWRlb0VsZW1lbnQudm9sdW1lID0gdm9sdW1lO1xuICAgIHZpZGVvRWxlbWVudC5tdXRlZCA9IHZvbHVtZSA9PT0gMDtcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5wcmVsb2FkVXJsID0gZXhwb3J0cy5hc3NldFVybCA9IGV4cG9ydHMuQ09HU19TRVJWRVJfUE9SVCA9IGV4cG9ydHMuQ09HU19BU1NFVFNfU0VSVkVSX1BPUlQgPSB2b2lkIDA7XG5leHBvcnRzLkNPR1NfQVNTRVRTX1NFUlZFUl9QT1JUID0gMTIwOTQ7XG5leHBvcnRzLkNPR1NfU0VSVkVSX1BPUlQgPSAxMjA5NTtcbmZ1bmN0aW9uIGFzc2V0VXJsKGZpbGUsIHVzZUh0dHAyQXNzZXRzU2VydmVyKSB7XG4gICAgY29uc3QgbG9jYXRpb24gPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdy5sb2NhdGlvbiA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwYXRoID0gYC9hc3NldHMvJHtlbmNvZGVVUklDb21wb25lbnQoZmlsZSl9YDtcbiAgICBpZiAodXNlSHR0cDJBc3NldHNTZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuIGBodHRwczovLyR7bG9jYXRpb24gPT09IG51bGwgfHwgbG9jYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2F0aW9uLmhvc3RuYW1lfToke2V4cG9ydHMuQ09HU19BU1NFVFNfU0VSVkVSX1BPUlR9JHtwYXRofWA7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gYCR7bG9jYXRpb24gPT09IG51bGwgfHwgbG9jYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2F0aW9uLnByb3RvY29sfS8vJHtsb2NhdGlvbiA9PT0gbnVsbCB8fCBsb2NhdGlvbiA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYXRpb24uaG9zdG5hbWV9OiR7ZXhwb3J0cy5DT0dTX1NFUlZFUl9QT1JUfSR7cGF0aH1gO1xuICAgIH1cbn1cbmV4cG9ydHMuYXNzZXRVcmwgPSBhc3NldFVybDtcbmFzeW5jIGZ1bmN0aW9uIHByZWxvYWRVcmwodXJsKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpO1xuICAgIC8vIFdlIHVzZWQgYXJyYXlCdWZmZXIoKWAgaW5zdGVhZCBvZiBgYmxvYigpYCBiZWNhdXNlIHRoZSBsYXR0ZXIgc2VlbXMgdG8gZmFpbCBvbiBQaXMgd2hlbiBwcmVsb2FkaW5nIHNvbWUgZmlsZXNcbiAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbYXdhaXQgcmVzcG9uc2UuYXJyYXlCdWZmZXIoKV0pKTtcbn1cbmV4cG9ydHMucHJlbG9hZFVybCA9IHByZWxvYWRVcmw7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuTWFuaWZlc3RUeXBlcyA9IGV4cG9ydHMucHJlbG9hZFVybCA9IGV4cG9ydHMuYXNzZXRVcmwgPSBleHBvcnRzLkNvZ3NWaWRlb1BsYXllciA9IGV4cG9ydHMuTElWRV9WSURFT19QTEFZQkFDS19SQVRFID0gZXhwb3J0cy5Db2dzUnRzcFN0cmVhbWVyID0gZXhwb3J0cy5Db2dzQXVkaW9QbGF5ZXIgPSBleHBvcnRzLlNob3dQaGFzZSA9IGV4cG9ydHMuQ29nc0Nvbm5lY3Rpb24gPSB2b2lkIDA7XG52YXIgQ29nc0Nvbm5lY3Rpb25fMSA9IHJlcXVpcmUoXCIuL0NvZ3NDb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29nc0Nvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9faW1wb3J0RGVmYXVsdChDb2dzQ29ubmVjdGlvbl8xKS5kZWZhdWx0OyB9IH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL0NvZ3NDb25uZWN0aW9uXCIpLCBleHBvcnRzKTtcbnZhciBTaG93UGhhc2VfMSA9IHJlcXVpcmUoXCIuL3R5cGVzL1Nob3dQaGFzZVwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNob3dQaGFzZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gX19pbXBvcnREZWZhdWx0KFNob3dQaGFzZV8xKS5kZWZhdWx0OyB9IH0pO1xudmFyIEF1ZGlvUGxheWVyXzEgPSByZXF1aXJlKFwiLi9BdWRpb1BsYXllclwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvZ3NBdWRpb1BsYXllclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gX19pbXBvcnREZWZhdWx0KEF1ZGlvUGxheWVyXzEpLmRlZmF1bHQ7IH0gfSk7XG52YXIgUnRzcFN0cmVhbWVyXzEgPSByZXF1aXJlKFwiLi9SdHNwU3RyZWFtZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb2dzUnRzcFN0cmVhbWVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2ltcG9ydERlZmF1bHQoUnRzcFN0cmVhbWVyXzEpLmRlZmF1bHQ7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMSVZFX1ZJREVPX1BMQVlCQUNLX1JBVEVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFJ0c3BTdHJlYW1lcl8xLkxJVkVfVklERU9fUExBWUJBQ0tfUkFURTsgfSB9KTtcbnZhciBWaWRlb1BsYXllcl8xID0gcmVxdWlyZShcIi4vVmlkZW9QbGF5ZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb2dzVmlkZW9QbGF5ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9faW1wb3J0RGVmYXVsdChWaWRlb1BsYXllcl8xKS5kZWZhdWx0OyB9IH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3R5cGVzL0F1ZGlvU3RhdGVcIiksIGV4cG9ydHMpO1xudmFyIHVybHNfMSA9IHJlcXVpcmUoXCIuL2hlbHBlcnMvdXJsc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImFzc2V0VXJsXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB1cmxzXzEuYXNzZXRVcmw7IH0gfSk7XG52YXIgdXJsc18yID0gcmVxdWlyZShcIi4vaGVscGVycy91cmxzXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicHJlbG9hZFVybFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdXJsc18yLnByZWxvYWRVcmw7IH0gfSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vdHlwZXMvQ29nc1BsdWdpbk1hbmlmZXN0XCIpLCBleHBvcnRzKTtcbmV4cG9ydHMuTWFuaWZlc3RUeXBlcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi90eXBlcy9NYW5pZmVzdFR5cGVzXCIpKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgU2hvd1BoYXNlO1xuKGZ1bmN0aW9uIChTaG93UGhhc2UpIHtcbiAgICBTaG93UGhhc2VbXCJTZXR1cFwiXSA9IFwic2V0dXBcIjtcbiAgICBTaG93UGhhc2VbXCJQcmVzaG93XCJdID0gXCJwcmUtc2hvd1wiO1xuICAgIFNob3dQaGFzZVtcIkluUHJvZ3Jlc3NcIl0gPSBcImluIHByb2dyZXNzXCI7XG4gICAgU2hvd1BoYXNlW1wiRmluaXNoZWRcIl0gPSBcImZpbmlzaGVkXCI7XG59KShTaG93UGhhc2UgfHwgKFNob3dQaGFzZSA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBTaG93UGhhc2U7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQWN0aXZlVmlkZW9DbGlwU3RhdGUgPSB2b2lkIDA7XG52YXIgQWN0aXZlVmlkZW9DbGlwU3RhdGU7XG4oZnVuY3Rpb24gKEFjdGl2ZVZpZGVvQ2xpcFN0YXRlKSB7XG4gICAgQWN0aXZlVmlkZW9DbGlwU3RhdGVbXCJQYXVzZWRcIl0gPSBcInBhdXNlZFwiO1xuICAgIEFjdGl2ZVZpZGVvQ2xpcFN0YXRlW1wiUGxheWluZ1wiXSA9IFwicGxheWluZ1wiO1xufSkoQWN0aXZlVmlkZW9DbGlwU3RhdGUgfHwgKGV4cG9ydHMuQWN0aXZlVmlkZW9DbGlwU3RhdGUgPSBBY3RpdmVWaWRlb0NsaXBTdGF0ZSA9IHt9KSk7XG4iLCJ2YXIgZmE9T2JqZWN0LmNyZWF0ZTt2YXIgRnQ9T2JqZWN0LmRlZmluZVByb3BlcnR5O3ZhciBjYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO3ZhciBsYT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczt2YXIgZGE9T2JqZWN0LmdldFByb3RvdHlwZU9mLHBhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGhhPShyLGUpPT4oKT0+KHImJihlPXIocj0wKSksZSk7dmFyIFM9KHIsZSk9PigpPT4oZXx8cigoZT17ZXhwb3J0czp7fX0pLmV4cG9ydHMsZSksZS5leHBvcnRzKSxQdD0ocixlKT0+e2Zvcih2YXIgdCBpbiBlKUZ0KHIsdCx7Z2V0OmVbdF0sZW51bWVyYWJsZTohMH0pfSxzaT0ocixlLHQsbik9PntpZihlJiZ0eXBlb2YgZT09XCJvYmplY3RcInx8dHlwZW9mIGU9PVwiZnVuY3Rpb25cIilmb3IobGV0IGkgb2YgbGEoZSkpIXBhLmNhbGwocixpKSYmaSE9PXQmJkZ0KHIsaSx7Z2V0OigpPT5lW2ldLGVudW1lcmFibGU6IShuPWNhKGUsaSkpfHxuLmVudW1lcmFibGV9KTtyZXR1cm4gcn07dmFyIEM9KHIsZSx0KT0+KHQ9ciE9bnVsbD9mYShkYShyKSk6e30sc2koZXx8IXJ8fCFyLl9fZXNNb2R1bGU/RnQodCxcImRlZmF1bHRcIix7dmFsdWU6cixlbnVtZXJhYmxlOiEwfSk6dCxyKSksbWE9cj0+c2koRnQoe30sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSkscik7dmFyIGZpPVMoa3Q9PntcInVzZSBzdHJpY3RcIjtjKCk7a3QuYnl0ZUxlbmd0aD15YTtrdC50b0J5dGVBcnJheT14YTtrdC5mcm9tQnl0ZUFycmF5PXZhO3ZhciBuZT1bXSxLPVtdLGdhPXR5cGVvZiBVaW50OEFycmF5PFwidVwiP1VpbnQ4QXJyYXk6QXJyYXksVnI9XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7Zm9yKEZlPTAsYWk9VnIubGVuZ3RoO0ZlPGFpOysrRmUpbmVbRmVdPVZyW0ZlXSxLW1ZyLmNoYXJDb2RlQXQoRmUpXT1GZTt2YXIgRmUsYWk7S1tcIi1cIi5jaGFyQ29kZUF0KDApXT02MjtLW1wiX1wiLmNoYXJDb2RlQXQoMCldPTYzO2Z1bmN0aW9uIHVpKHIpe3ZhciBlPXIubGVuZ3RoO2lmKGUlND4wKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDRcIik7dmFyIHQ9ci5pbmRleE9mKFwiPVwiKTt0PT09LTEmJih0PWUpO3ZhciBuPXQ9PT1lPzA6NC10JTQ7cmV0dXJuW3Qsbl19ZnVuY3Rpb24geWEocil7dmFyIGU9dWkociksdD1lWzBdLG49ZVsxXTtyZXR1cm4odCtuKSozLzQtbn1mdW5jdGlvbiBiYShyLGUsdCl7cmV0dXJuKGUrdCkqMy80LXR9ZnVuY3Rpb24geGEocil7dmFyIGUsdD11aShyKSxuPXRbMF0saT10WzFdLG89bmV3IGdhKGJhKHIsbixpKSkscz0wLGE9aT4wP24tNDpuLHU7Zm9yKHU9MDt1PGE7dSs9NCllPUtbci5jaGFyQ29kZUF0KHUpXTw8MTh8S1tyLmNoYXJDb2RlQXQodSsxKV08PDEyfEtbci5jaGFyQ29kZUF0KHUrMildPDw2fEtbci5jaGFyQ29kZUF0KHUrMyldLG9bcysrXT1lPj4xNiYyNTUsb1tzKytdPWU+PjgmMjU1LG9bcysrXT1lJjI1NTtyZXR1cm4gaT09PTImJihlPUtbci5jaGFyQ29kZUF0KHUpXTw8MnxLW3IuY2hhckNvZGVBdCh1KzEpXT4+NCxvW3MrK109ZSYyNTUpLGk9PT0xJiYoZT1LW3IuY2hhckNvZGVBdCh1KV08PDEwfEtbci5jaGFyQ29kZUF0KHUrMSldPDw0fEtbci5jaGFyQ29kZUF0KHUrMildPj4yLG9bcysrXT1lPj44JjI1NSxvW3MrK109ZSYyNTUpLG99ZnVuY3Rpb24gX2Eocil7cmV0dXJuIG5lW3I+PjE4JjYzXStuZVtyPj4xMiY2M10rbmVbcj4+NiY2M10rbmVbciY2M119ZnVuY3Rpb24gd2EocixlLHQpe2Zvcih2YXIgbixpPVtdLG89ZTtvPHQ7bys9MyluPShyW29dPDwxNiYxNjcxMTY4MCkrKHJbbysxXTw8OCY2NTI4MCkrKHJbbysyXSYyNTUpLGkucHVzaChfYShuKSk7cmV0dXJuIGkuam9pbihcIlwiKX1mdW5jdGlvbiB2YShyKXtmb3IodmFyIGUsdD1yLmxlbmd0aCxuPXQlMyxpPVtdLG89MTYzODMscz0wLGE9dC1uO3M8YTtzKz1vKWkucHVzaCh3YShyLHMscytvPmE/YTpzK28pKTtyZXR1cm4gbj09PTE/KGU9clt0LTFdLGkucHVzaChuZVtlPj4yXStuZVtlPDw0JjYzXStcIj09XCIpKTpuPT09MiYmKGU9KHJbdC0yXTw8OCkrclt0LTFdLGkucHVzaChuZVtlPj4xMF0rbmVbZT4+NCY2M10rbmVbZTw8MiY2M10rXCI9XCIpKSxpLmpvaW4oXCJcIil9fSk7dmFyIGNpPVMoenI9PntjKCk7enIucmVhZD1mdW5jdGlvbihyLGUsdCxuLGkpe3ZhciBvLHMsYT1pKjgtbi0xLHU9KDE8PGEpLTEsZj11Pj4xLGw9LTcsZD10P2ktMTowLGg9dD8tMToxLG09cltlK2RdO2ZvcihkKz1oLG89bSYoMTw8LWwpLTEsbT4+PS1sLGwrPWE7bD4wO289byoyNTYrcltlK2RdLGQrPWgsbC09OCk7Zm9yKHM9byYoMTw8LWwpLTEsbz4+PS1sLGwrPW47bD4wO3M9cyoyNTYrcltlK2RdLGQrPWgsbC09OCk7aWYobz09PTApbz0xLWY7ZWxzZXtpZihvPT09dSlyZXR1cm4gcz9OYU46KG0/LTE6MSkqKDEvMCk7cz1zK01hdGgucG93KDIsbiksbz1vLWZ9cmV0dXJuKG0/LTE6MSkqcypNYXRoLnBvdygyLG8tbil9O3pyLndyaXRlPWZ1bmN0aW9uKHIsZSx0LG4saSxvKXt2YXIgcyxhLHUsZj1vKjgtaS0xLGw9KDE8PGYpLTEsZD1sPj4xLGg9aT09PTIzP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxtPW4/MDpvLTEsYj1uPzE6LTEseT1lPDB8fGU9PT0wJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KGE9aXNOYU4oZSk/MTowLHM9bCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSoodT1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSx1Kj0yKSxzK2Q+PTE/ZSs9aC91OmUrPWgqTWF0aC5wb3coMiwxLWQpLGUqdT49MiYmKHMrKyx1Lz0yKSxzK2Q+PWw/KGE9MCxzPWwpOnMrZD49MT8oYT0oZSp1LTEpKk1hdGgucG93KDIsaSkscz1zK2QpOihhPWUqTWF0aC5wb3coMixkLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODtyW3QrbV09YSYyNTUsbSs9YixhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLGYrPWk7Zj4wO3JbdCttXT1zJjI1NSxtKz1iLHMvPTI1NixmLT04KTtyW3QrbS1iXXw9eSoxMjh9fSk7dmFyIFhlPVMoS2U9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFlyPWZpKCksemU9Y2koKSxsaT10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJnR5cGVvZiBTeW1ib2wuZm9yPT1cImZ1bmN0aW9uXCI/U3ltYm9sLmZvcihcIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tXCIpOm51bGw7S2UuQnVmZmVyPXA7S2UuU2xvd0J1ZmZlcj1CYTtLZS5JTlNQRUNUX01BWF9CWVRFUz01MDt2YXIgT3Q9MjE0NzQ4MzY0NztLZS5rTWF4TGVuZ3RoPU90O3AuVFlQRURfQVJSQVlfU1VQUE9SVD1FYSgpOyFwLlRZUEVEX0FSUkFZX1NVUFBPUlQmJnR5cGVvZiBjb25zb2xlPFwidVwiJiZ0eXBlb2YgY29uc29sZS5lcnJvcj09XCJmdW5jdGlvblwiJiZjb25zb2xlLmVycm9yKFwiVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5IGBidWZmZXJgIHY1LnguIFVzZSBgYnVmZmVyYCB2NC54IGlmIHlvdSByZXF1aXJlIG9sZCBicm93c2VyIHN1cHBvcnQuXCIpO2Z1bmN0aW9uIEVhKCl7dHJ5e2xldCByPW5ldyBVaW50OEFycmF5KDEpLGU9e2ZvbzpmdW5jdGlvbigpe3JldHVybiA0Mn19O3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YoZSxVaW50OEFycmF5LnByb3RvdHlwZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHIsZSksci5mb28oKT09PTQyfWNhdGNoe3JldHVybiExfX1PYmplY3QuZGVmaW5lUHJvcGVydHkocC5wcm90b3R5cGUsXCJwYXJlbnRcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZighIXAuaXNCdWZmZXIodGhpcykpcmV0dXJuIHRoaXMuYnVmZmVyfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShwLnByb3RvdHlwZSxcIm9mZnNldFwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKCEhcC5pc0J1ZmZlcih0aGlzKSlyZXR1cm4gdGhpcy5ieXRlT2Zmc2V0fX0pO2Z1bmN0aW9uIGRlKHIpe2lmKHI+T3QpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicrcisnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJyk7bGV0IGU9bmV3IFVpbnQ4QXJyYXkocik7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihlLHAucHJvdG90eXBlKSxlfWZ1bmN0aW9uIHAocixlLHQpe2lmKHR5cGVvZiByPT1cIm51bWJlclwiKXtpZih0eXBlb2YgZT09XCJzdHJpbmdcIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLiBSZWNlaXZlZCB0eXBlIG51bWJlcicpO3JldHVybiBRcihyKX1yZXR1cm4gbWkocixlLHQpfXAucG9vbFNpemU9ODE5MjtmdW5jdGlvbiBtaShyLGUsdCl7aWYodHlwZW9mIHI9PVwic3RyaW5nXCIpcmV0dXJuIFJhKHIsZSk7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KHIpKXJldHVybiBUYShyKTtpZihyPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSBcIit0eXBlb2Ygcik7aWYoaWUocixBcnJheUJ1ZmZlcil8fHImJmllKHIuYnVmZmVyLEFycmF5QnVmZmVyKXx8dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPFwidVwiJiYoaWUocixTaGFyZWRBcnJheUJ1ZmZlcil8fHImJmllKHIuYnVmZmVyLFNoYXJlZEFycmF5QnVmZmVyKSkpcmV0dXJuIFhyKHIsZSx0KTtpZih0eXBlb2Ygcj09XCJudW1iZXJcIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlIG51bWJlcicpO2xldCBuPXIudmFsdWVPZiYmci52YWx1ZU9mKCk7aWYobiE9bnVsbCYmbiE9PXIpcmV0dXJuIHAuZnJvbShuLGUsdCk7bGV0IGk9Q2Eocik7aWYoaSlyZXR1cm4gaTtpZih0eXBlb2YgU3ltYm9sPFwidVwiJiZTeW1ib2wudG9QcmltaXRpdmUhPW51bGwmJnR5cGVvZiByW1N5bWJvbC50b1ByaW1pdGl2ZV09PVwiZnVuY3Rpb25cIilyZXR1cm4gcC5mcm9tKHJbU3ltYm9sLnRvUHJpbWl0aXZlXShcInN0cmluZ1wiKSxlLHQpO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSBcIit0eXBlb2Ygcil9cC5mcm9tPWZ1bmN0aW9uKHIsZSx0KXtyZXR1cm4gbWkocixlLHQpfTtPYmplY3Quc2V0UHJvdG90eXBlT2YocC5wcm90b3R5cGUsVWludDhBcnJheS5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZihwLFVpbnQ4QXJyYXkpO2Z1bmN0aW9uIGdpKHIpe2lmKHR5cGVvZiByIT1cIm51bWJlclwiKXRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicrcisnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJyl9ZnVuY3Rpb24gU2EocixlLHQpe3JldHVybiBnaShyKSxyPD0wP2RlKHIpOmUhPT12b2lkIDA/dHlwZW9mIHQ9PVwic3RyaW5nXCI/ZGUocikuZmlsbChlLHQpOmRlKHIpLmZpbGwoZSk6ZGUocil9cC5hbGxvYz1mdW5jdGlvbihyLGUsdCl7cmV0dXJuIFNhKHIsZSx0KX07ZnVuY3Rpb24gUXIocil7cmV0dXJuIGdpKHIpLGRlKHI8MD8wOlpyKHIpfDApfXAuYWxsb2NVbnNhZmU9ZnVuY3Rpb24ocil7cmV0dXJuIFFyKHIpfTtwLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihyKXtyZXR1cm4gUXIocil9O2Z1bmN0aW9uIFJhKHIsZSl7aWYoKHR5cGVvZiBlIT1cInN0cmluZ1wifHxlPT09XCJcIikmJihlPVwidXRmOFwiKSwhcC5pc0VuY29kaW5nKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIitlKTtsZXQgdD15aShyLGUpfDAsbj1kZSh0KSxpPW4ud3JpdGUocixlKTtyZXR1cm4gaSE9PXQmJihuPW4uc2xpY2UoMCxpKSksbn1mdW5jdGlvbiBLcihyKXtsZXQgZT1yLmxlbmd0aDwwPzA6WnIoci5sZW5ndGgpfDAsdD1kZShlKTtmb3IobGV0IG49MDtuPGU7bis9MSl0W25dPXJbbl0mMjU1O3JldHVybiB0fWZ1bmN0aW9uIFRhKHIpe2lmKGllKHIsVWludDhBcnJheSkpe2xldCBlPW5ldyBVaW50OEFycmF5KHIpO3JldHVybiBYcihlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKX1yZXR1cm4gS3Iocil9ZnVuY3Rpb24gWHIocixlLHQpe2lmKGU8MHx8ci5ieXRlTGVuZ3RoPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJyk7aWYoci5ieXRlTGVuZ3RoPGUrKHR8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCdcImxlbmd0aFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpO2xldCBuO3JldHVybiBlPT09dm9pZCAwJiZ0PT09dm9pZCAwP249bmV3IFVpbnQ4QXJyYXkocik6dD09PXZvaWQgMD9uPW5ldyBVaW50OEFycmF5KHIsZSk6bj1uZXcgVWludDhBcnJheShyLGUsdCksT2JqZWN0LnNldFByb3RvdHlwZU9mKG4scC5wcm90b3R5cGUpLG59ZnVuY3Rpb24gQ2Eocil7aWYocC5pc0J1ZmZlcihyKSl7bGV0IGU9WnIoci5sZW5ndGgpfDAsdD1kZShlKTtyZXR1cm4gdC5sZW5ndGg9PT0wfHxyLmNvcHkodCwwLDAsZSksdH1pZihyLmxlbmd0aCE9PXZvaWQgMClyZXR1cm4gdHlwZW9mIHIubGVuZ3RoIT1cIm51bWJlclwifHx0bihyLmxlbmd0aCk/ZGUoMCk6S3Iocik7aWYoci50eXBlPT09XCJCdWZmZXJcIiYmQXJyYXkuaXNBcnJheShyLmRhdGEpKXJldHVybiBLcihyLmRhdGEpfWZ1bmN0aW9uIFpyKHIpe2lmKHI+PU90KXRocm93IG5ldyBSYW5nZUVycm9yKFwiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweFwiK090LnRvU3RyaW5nKDE2KStcIiBieXRlc1wiKTtyZXR1cm4gcnwwfWZ1bmN0aW9uIEJhKHIpe3JldHVybityIT1yJiYocj0wKSxwLmFsbG9jKCtyKX1wLmlzQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiBlIT1udWxsJiZlLl9pc0J1ZmZlcj09PSEwJiZlIT09cC5wcm90b3R5cGV9O3AuY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKGllKGUsVWludDhBcnJheSkmJihlPXAuZnJvbShlLGUub2Zmc2V0LGUuYnl0ZUxlbmd0aCkpLGllKHQsVWludDhBcnJheSkmJih0PXAuZnJvbSh0LHQub2Zmc2V0LHQuYnl0ZUxlbmd0aCkpLCFwLmlzQnVmZmVyKGUpfHwhcC5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJidWYxXCIsIFwiYnVmMlwiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5Jyk7aWYoZT09PXQpcmV0dXJuIDA7bGV0IG49ZS5sZW5ndGgsaT10Lmxlbmd0aDtmb3IobGV0IG89MCxzPU1hdGgubWluKG4saSk7bzxzOysrbylpZihlW29dIT09dFtvXSl7bj1lW29dLGk9dFtvXTticmVha31yZXR1cm4gbjxpPy0xOmk8bj8xOjB9O3AuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2VcImhleFwiOmNhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOmNhc2VcImFzY2lpXCI6Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6Y2FzZVwiYmFzZTY0XCI6Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19O3AuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBwLmFsbG9jKDApO2xldCBuO2lmKHQ9PT12b2lkIDApZm9yKHQ9MCxuPTA7bjxlLmxlbmd0aDsrK24pdCs9ZVtuXS5sZW5ndGg7bGV0IGk9cC5hbGxvY1Vuc2FmZSh0KSxvPTA7Zm9yKG49MDtuPGUubGVuZ3RoOysrbil7bGV0IHM9ZVtuXTtpZihpZShzLFVpbnQ4QXJyYXkpKW8rcy5sZW5ndGg+aS5sZW5ndGg/KHAuaXNCdWZmZXIocyl8fChzPXAuZnJvbShzKSkscy5jb3B5KGksbykpOlVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGkscyxvKTtlbHNlIGlmKHAuaXNCdWZmZXIocykpcy5jb3B5KGksbyk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvKz1zLmxlbmd0aH1yZXR1cm4gaX07ZnVuY3Rpb24geWkocixlKXtpZihwLmlzQnVmZmVyKHIpKXJldHVybiByLmxlbmd0aDtpZihBcnJheUJ1ZmZlci5pc1ZpZXcocil8fGllKHIsQXJyYXlCdWZmZXIpKXJldHVybiByLmJ5dGVMZW5ndGg7aWYodHlwZW9mIHIhPVwic3RyaW5nXCIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgb3IgQXJyYXlCdWZmZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2Ygcik7bGV0IHQ9ci5sZW5ndGgsbj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXT09PSEwO2lmKCFuJiZ0PT09MClyZXR1cm4gMDtsZXQgaT0hMTtmb3IoOzspc3dpdGNoKGUpe2Nhc2VcImFzY2lpXCI6Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuIHQ7Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6cmV0dXJuIEpyKHIpLmxlbmd0aDtjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpyZXR1cm4gdCoyO2Nhc2VcImhleFwiOnJldHVybiB0Pj4+MTtjYXNlXCJiYXNlNjRcIjpyZXR1cm4gVGkocikubGVuZ3RoO2RlZmF1bHQ6aWYoaSlyZXR1cm4gbj8tMTpKcihyKS5sZW5ndGg7ZT0oXCJcIitlKS50b0xvd2VyQ2FzZSgpLGk9ITB9fXAuYnl0ZUxlbmd0aD15aTtmdW5jdGlvbiBNYShyLGUsdCl7bGV0IG49ITE7aWYoKGU9PT12b2lkIDB8fGU8MCkmJihlPTApLGU+dGhpcy5sZW5ndGh8fCgodD09PXZvaWQgMHx8dD50aGlzLmxlbmd0aCkmJih0PXRoaXMubGVuZ3RoKSx0PD0wKXx8KHQ+Pj49MCxlPj4+PTAsdDw9ZSkpcmV0dXJuXCJcIjtmb3Iocnx8KHI9XCJ1dGY4XCIpOzspc3dpdGNoKHIpe2Nhc2VcImhleFwiOnJldHVybiBOYSh0aGlzLGUsdCk7Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6cmV0dXJuIHhpKHRoaXMsZSx0KTtjYXNlXCJhc2NpaVwiOnJldHVybiBVYSh0aGlzLGUsdCk7Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuIERhKHRoaXMsZSx0KTtjYXNlXCJiYXNlNjRcIjpyZXR1cm4ga2EodGhpcyxlLHQpO2Nhc2VcInVjczJcIjpjYXNlXCJ1Y3MtMlwiOmNhc2VcInV0ZjE2bGVcIjpjYXNlXCJ1dGYtMTZsZVwiOnJldHVybiBIYSh0aGlzLGUsdCk7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIityKTtyPShyK1wiXCIpLnRvTG93ZXJDYXNlKCksbj0hMH19cC5wcm90b3R5cGUuX2lzQnVmZmVyPSEwO2Z1bmN0aW9uIFBlKHIsZSx0KXtsZXQgbj1yW2VdO3JbZV09clt0XSxyW3RdPW59cC5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7bGV0IGU9dGhpcy5sZW5ndGg7aWYoZSUyIT09MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzXCIpO2ZvcihsZXQgdD0wO3Q8ZTt0Kz0yKVBlKHRoaXMsdCx0KzEpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXtsZXQgZT10aGlzLmxlbmd0aDtpZihlJTQhPT0wKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHNcIik7Zm9yKGxldCB0PTA7dDxlO3QrPTQpUGUodGhpcyx0LHQrMyksUGUodGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7bGV0IGU9dGhpcy5sZW5ndGg7aWYoZSU4IT09MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzXCIpO2ZvcihsZXQgdD0wO3Q8ZTt0Kz04KVBlKHRoaXMsdCx0KzcpLFBlKHRoaXMsdCsxLHQrNiksUGUodGhpcyx0KzIsdCs1KSxQZSh0aGlzLHQrMyx0KzQpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2xldCBlPXRoaXMubGVuZ3RoO3JldHVybiBlPT09MD9cIlwiOmFyZ3VtZW50cy5sZW5ndGg9PT0wP3hpKHRoaXMsMCxlKTpNYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3AucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nPXAucHJvdG90eXBlLnRvU3RyaW5nO3AucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighcC5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlclwiKTtyZXR1cm4gdGhpcz09PWU/ITA6cC5jb21wYXJlKHRoaXMsZSk9PT0wfTtwLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7bGV0IGU9XCJcIix0PUtlLklOU1BFQ1RfTUFYX0JZVEVTO3JldHVybiBlPXRoaXMudG9TdHJpbmcoXCJoZXhcIiwwLHQpLnJlcGxhY2UoLyguezJ9KS9nLFwiJDEgXCIpLnRyaW0oKSx0aGlzLmxlbmd0aD50JiYoZSs9XCIgLi4uIFwiKSxcIjxCdWZmZXIgXCIrZStcIj5cIn07bGkmJihwLnByb3RvdHlwZVtsaV09cC5wcm90b3R5cGUuaW5zcGVjdCk7cC5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbihlLHQsbixpLG8pe2lmKGllKGUsVWludDhBcnJheSkmJihlPXAuZnJvbShlLGUub2Zmc2V0LGUuYnl0ZUxlbmd0aCkpLCFwLmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInRhcmdldFwiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgZSk7aWYodD09PXZvaWQgMCYmKHQ9MCksbj09PXZvaWQgMCYmKG49ZT9lLmxlbmd0aDowKSxpPT09dm9pZCAwJiYoaT0wKSxvPT09dm9pZCAwJiYobz10aGlzLmxlbmd0aCksdDwwfHxuPmUubGVuZ3RofHxpPDB8fG8+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvdXQgb2YgcmFuZ2UgaW5kZXhcIik7aWYoaT49byYmdD49bilyZXR1cm4gMDtpZihpPj1vKXJldHVybi0xO2lmKHQ+PW4pcmV0dXJuIDE7aWYodD4+Pj0wLG4+Pj49MCxpPj4+PTAsbz4+Pj0wLHRoaXM9PT1lKXJldHVybiAwO2xldCBzPW8taSxhPW4tdCx1PU1hdGgubWluKHMsYSksZj10aGlzLnNsaWNlKGksbyksbD1lLnNsaWNlKHQsbik7Zm9yKGxldCBkPTA7ZDx1OysrZClpZihmW2RdIT09bFtkXSl7cz1mW2RdLGE9bFtkXTticmVha31yZXR1cm4gczxhPy0xOmE8cz8xOjB9O2Z1bmN0aW9uIGJpKHIsZSx0LG4saSl7aWYoci5sZW5ndGg9PT0wKXJldHVybi0xO2lmKHR5cGVvZiB0PT1cInN0cmluZ1wiPyhuPXQsdD0wKTp0PjIxNDc0ODM2NDc/dD0yMTQ3NDgzNjQ3OnQ8LTIxNDc0ODM2NDgmJih0PS0yMTQ3NDgzNjQ4KSx0PSt0LHRuKHQpJiYodD1pPzA6ci5sZW5ndGgtMSksdDwwJiYodD1yLmxlbmd0aCt0KSx0Pj1yLmxlbmd0aCl7aWYoaSlyZXR1cm4tMTt0PXIubGVuZ3RoLTF9ZWxzZSBpZih0PDApaWYoaSl0PTA7ZWxzZSByZXR1cm4tMTtpZih0eXBlb2YgZT09XCJzdHJpbmdcIiYmKGU9cC5mcm9tKGUsbikpLHAuaXNCdWZmZXIoZSkpcmV0dXJuIGUubGVuZ3RoPT09MD8tMTpkaShyLGUsdCxuLGkpO2lmKHR5cGVvZiBlPT1cIm51bWJlclwiKXJldHVybiBlPWUmMjU1LHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mPT1cImZ1bmN0aW9uXCI/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwocixlLHQpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwocixlLHQpOmRpKHIsW2VdLHQsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyXCIpfWZ1bmN0aW9uIGRpKHIsZSx0LG4saSl7bGV0IG89MSxzPXIubGVuZ3RoLGE9ZS5sZW5ndGg7aWYobiE9PXZvaWQgMCYmKG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCksbj09PVwidWNzMlwifHxuPT09XCJ1Y3MtMlwifHxuPT09XCJ1dGYxNmxlXCJ8fG49PT1cInV0Zi0xNmxlXCIpKXtpZihyLmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO289MixzLz0yLGEvPTIsdC89Mn1mdW5jdGlvbiB1KGwsZCl7cmV0dXJuIG89PT0xP2xbZF06bC5yZWFkVUludDE2QkUoZCpvKX1sZXQgZjtpZihpKXtsZXQgbD0tMTtmb3IoZj10O2Y8cztmKyspaWYodShyLGYpPT09dShlLGw9PT0tMT8wOmYtbCkpe2lmKGw9PT0tMSYmKGw9ZiksZi1sKzE9PT1hKXJldHVybiBsKm99ZWxzZSBsIT09LTEmJihmLT1mLWwpLGw9LTF9ZWxzZSBmb3IodCthPnMmJih0PXMtYSksZj10O2Y+PTA7Zi0tKXtsZXQgbD0hMDtmb3IobGV0IGQ9MDtkPGE7ZCsrKWlmKHUocixmK2QpIT09dShlLGQpKXtsPSExO2JyZWFrfWlmKGwpcmV0dXJuIGZ9cmV0dXJuLTF9cC5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmluZGV4T2YoZSx0LG4pIT09LTF9O3AucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBiaSh0aGlzLGUsdCxuLCEwKX07cC5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBiaSh0aGlzLGUsdCxuLCExKX07ZnVuY3Rpb24gTGEocixlLHQsbil7dD1OdW1iZXIodCl8fDA7bGV0IGk9ci5sZW5ndGgtdDtuPyhuPU51bWJlcihuKSxuPmkmJihuPWkpKTpuPWk7bGV0IG89ZS5sZW5ndGg7bj5vLzImJihuPW8vMik7bGV0IHM7Zm9yKHM9MDtzPG47KytzKXtsZXQgYT1wYXJzZUludChlLnN1YnN0cihzKjIsMiksMTYpO2lmKHRuKGEpKXJldHVybiBzO3JbdCtzXT1hfXJldHVybiBzfWZ1bmN0aW9uIElhKHIsZSx0LG4pe3JldHVybiBVdChKcihlLHIubGVuZ3RoLXQpLHIsdCxuKX1mdW5jdGlvbiBBYShyLGUsdCxuKXtyZXR1cm4gVXQoJGEoZSkscix0LG4pfWZ1bmN0aW9uIEZhKHIsZSx0LG4pe3JldHVybiBVdChUaShlKSxyLHQsbil9ZnVuY3Rpb24gUGEocixlLHQsbil7cmV0dXJuIFV0KEdhKGUsci5sZW5ndGgtdCkscix0LG4pfXAucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxuLGkpe2lmKHQ9PT12b2lkIDApaT1cInV0ZjhcIixuPXRoaXMubGVuZ3RoLHQ9MDtlbHNlIGlmKG49PT12b2lkIDAmJnR5cGVvZiB0PT1cInN0cmluZ1wiKWk9dCxuPXRoaXMubGVuZ3RoLHQ9MDtlbHNlIGlmKGlzRmluaXRlKHQpKXQ9dD4+PjAsaXNGaW5pdGUobik/KG49bj4+PjAsaT09PXZvaWQgMCYmKGk9XCJ1dGY4XCIpKTooaT1uLG49dm9pZCAwKTtlbHNlIHRocm93IG5ldyBFcnJvcihcIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkXCIpO2xldCBvPXRoaXMubGVuZ3RoLXQ7aWYoKG49PT12b2lkIDB8fG4+bykmJihuPW8pLGUubGVuZ3RoPjAmJihuPDB8fHQ8MCl8fHQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kc1wiKTtpfHwoaT1cInV0ZjhcIik7bGV0IHM9ITE7Zm9yKDs7KXN3aXRjaChpKXtjYXNlXCJoZXhcIjpyZXR1cm4gTGEodGhpcyxlLHQsbik7Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6cmV0dXJuIElhKHRoaXMsZSx0LG4pO2Nhc2VcImFzY2lpXCI6Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuIEFhKHRoaXMsZSx0LG4pO2Nhc2VcImJhc2U2NFwiOnJldHVybiBGYSh0aGlzLGUsdCxuKTtjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpyZXR1cm4gUGEodGhpcyxlLHQsbik7ZGVmYXVsdDppZihzKXRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIitpKTtpPShcIlwiK2kpLnRvTG93ZXJDYXNlKCkscz0hMH19O3AucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOlwiQnVmZmVyXCIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTtmdW5jdGlvbiBrYShyLGUsdCl7cmV0dXJuIGU9PT0wJiZ0PT09ci5sZW5ndGg/WXIuZnJvbUJ5dGVBcnJheShyKTpZci5mcm9tQnl0ZUFycmF5KHIuc2xpY2UoZSx0KSl9ZnVuY3Rpb24geGkocixlLHQpe3Q9TWF0aC5taW4oci5sZW5ndGgsdCk7bGV0IG49W10saT1lO2Zvcig7aTx0Oyl7bGV0IG89cltpXSxzPW51bGwsYT1vPjIzOT80Om8+MjIzPzM6bz4xOTE/MjoxO2lmKGkrYTw9dCl7bGV0IHUsZixsLGQ7c3dpdGNoKGEpe2Nhc2UgMTpvPDEyOCYmKHM9byk7YnJlYWs7Y2FzZSAyOnU9cltpKzFdLCh1JjE5Mik9PT0xMjgmJihkPShvJjMxKTw8Nnx1JjYzLGQ+MTI3JiYocz1kKSk7YnJlYWs7Y2FzZSAzOnU9cltpKzFdLGY9cltpKzJdLCh1JjE5Mik9PT0xMjgmJihmJjE5Mik9PT0xMjgmJihkPShvJjE1KTw8MTJ8KHUmNjMpPDw2fGYmNjMsZD4yMDQ3JiYoZDw1NTI5Nnx8ZD41NzM0MykmJihzPWQpKTticmVhaztjYXNlIDQ6dT1yW2krMV0sZj1yW2krMl0sbD1yW2krM10sKHUmMTkyKT09PTEyOCYmKGYmMTkyKT09PTEyOCYmKGwmMTkyKT09PTEyOCYmKGQ9KG8mMTUpPDwxOHwodSY2Myk8PDEyfChmJjYzKTw8NnxsJjYzLGQ+NjU1MzUmJmQ8MTExNDExMiYmKHM9ZCkpfX1zPT09bnVsbD8ocz02NTUzMyxhPTEpOnM+NjU1MzUmJihzLT02NTUzNixuLnB1c2gocz4+PjEwJjEwMjN8NTUyOTYpLHM9NTYzMjB8cyYxMDIzKSxuLnB1c2gocyksaSs9YX1yZXR1cm4gT2Eobil9dmFyIHBpPTQwOTY7ZnVuY3Rpb24gT2Eocil7bGV0IGU9ci5sZW5ndGg7aWYoZTw9cGkpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHIpO2xldCB0PVwiXCIsbj0wO2Zvcig7bjxlOyl0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxyLnNsaWNlKG4sbis9cGkpKTtyZXR1cm4gdH1mdW5jdGlvbiBVYShyLGUsdCl7bGV0IG49XCJcIjt0PU1hdGgubWluKHIubGVuZ3RoLHQpO2ZvcihsZXQgaT1lO2k8dDsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZShyW2ldJjEyNyk7cmV0dXJuIG59ZnVuY3Rpb24gRGEocixlLHQpe2xldCBuPVwiXCI7dD1NYXRoLm1pbihyLmxlbmd0aCx0KTtmb3IobGV0IGk9ZTtpPHQ7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUocltpXSk7cmV0dXJuIG59ZnVuY3Rpb24gTmEocixlLHQpe2xldCBuPXIubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCF0fHx0PDB8fHQ+bikmJih0PW4pO2xldCBpPVwiXCI7Zm9yKGxldCBvPWU7bzx0OysrbylpKz1WYVtyW29dXTtyZXR1cm4gaX1mdW5jdGlvbiBIYShyLGUsdCl7bGV0IG49ci5zbGljZShlLHQpLGk9XCJcIjtmb3IobGV0IG89MDtvPG4ubGVuZ3RoLTE7bys9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5bb10rbltvKzFdKjI1Nik7cmV0dXJuIGl9cC5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24oZSx0KXtsZXQgbj10aGlzLmxlbmd0aDtlPX5+ZSx0PXQ9PT12b2lkIDA/bjp+fnQsZTwwPyhlKz1uLGU8MCYmKGU9MCkpOmU+biYmKGU9biksdDwwPyh0Kz1uLHQ8MCYmKHQ9MCkpOnQ+biYmKHQ9biksdDxlJiYodD1lKTtsZXQgaT10aGlzLnN1YmFycmF5KGUsdCk7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihpLHAucHJvdG90eXBlKSxpfTtmdW5jdGlvbiBEKHIsZSx0KXtpZihyJTEhPT0wfHxyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvZmZzZXQgaXMgbm90IHVpbnRcIik7aWYocitlPnQpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoXCIpfXAucHJvdG90eXBlLnJlYWRVaW50TEU9cC5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbihlLHQsbil7ZT1lPj4+MCx0PXQ+Pj4wLG58fEQoZSx0LHRoaXMubGVuZ3RoKTtsZXQgaT10aGlzW2VdLG89MSxzPTA7Zm9yKDsrK3M8dCYmKG8qPTI1Nik7KWkrPXRoaXNbZStzXSpvO3JldHVybiBpfTtwLnByb3RvdHlwZS5yZWFkVWludEJFPXAucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2U9ZT4+PjAsdD10Pj4+MCxufHxEKGUsdCx0aGlzLmxlbmd0aCk7bGV0IGk9dGhpc1tlKy0tdF0sbz0xO2Zvcig7dD4wJiYobyo9MjU2KTspaSs9dGhpc1tlKy0tdF0qbztyZXR1cm4gaX07cC5wcm90b3R5cGUucmVhZFVpbnQ4PXAucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSwxLHRoaXMubGVuZ3RoKSx0aGlzW2VdfTtwLnByb3RvdHlwZS5yZWFkVWludDE2TEU9cC5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fTtwLnByb3RvdHlwZS5yZWFkVWludDE2QkU9cC5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDh8dGhpc1tlKzFdfTtwLnByb3RvdHlwZS5yZWFkVWludDMyTEU9cC5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDQsdGhpcy5sZW5ndGgpLCh0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2KSt0aGlzW2UrM10qMTY3NzcyMTZ9O3AucHJvdG90eXBlLnJlYWRVaW50MzJCRT1wLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXSoxNjc3NzIxNisodGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdKX07cC5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NExFPWJlKGZ1bmN0aW9uKGUpe2U9ZT4+PjAsWWUoZSxcIm9mZnNldFwiKTtsZXQgdD10aGlzW2VdLG49dGhpc1tlKzddOyh0PT09dm9pZCAwfHxuPT09dm9pZCAwKSYmd3QoZSx0aGlzLmxlbmd0aC04KTtsZXQgaT10K3RoaXNbKytlXSoyKio4K3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqMjQsbz10aGlzWysrZV0rdGhpc1srK2VdKjIqKjgrdGhpc1srK2VdKjIqKjE2K24qMioqMjQ7cmV0dXJuIEJpZ0ludChpKSsoQmlnSW50KG8pPDxCaWdJbnQoMzIpKX0pO3AucHJvdG90eXBlLnJlYWRCaWdVSW50NjRCRT1iZShmdW5jdGlvbihlKXtlPWU+Pj4wLFllKGUsXCJvZmZzZXRcIik7bGV0IHQ9dGhpc1tlXSxuPXRoaXNbZSs3XTsodD09PXZvaWQgMHx8bj09PXZvaWQgMCkmJnd0KGUsdGhpcy5sZW5ndGgtOCk7bGV0IGk9dCoyKioyNCt0aGlzWysrZV0qMioqMTYrdGhpc1srK2VdKjIqKjgrdGhpc1srK2VdLG89dGhpc1srK2VdKjIqKjI0K3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqOCtuO3JldHVybihCaWdJbnQoaSk8PEJpZ0ludCgzMikpK0JpZ0ludChvKX0pO3AucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbihlLHQsbil7ZT1lPj4+MCx0PXQ+Pj4wLG58fEQoZSx0LHRoaXMubGVuZ3RoKTtsZXQgaT10aGlzW2VdLG89MSxzPTA7Zm9yKDsrK3M8dCYmKG8qPTI1Nik7KWkrPXRoaXNbZStzXSpvO3JldHVybiBvKj0xMjgsaT49byYmKGktPU1hdGgucG93KDIsOCp0KSksaX07cC5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKGUsdCxuKXtlPWU+Pj4wLHQ9dD4+PjAsbnx8RChlLHQsdGhpcy5sZW5ndGgpO2xldCBpPXQsbz0xLHM9dGhpc1tlKy0taV07Zm9yKDtpPjAmJihvKj0yNTYpOylzKz10aGlzW2UrLS1pXSpvO3JldHVybiBvKj0xMjgscz49byYmKHMtPU1hdGgucG93KDIsOCp0KSksc307cC5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXSYxMjg/KDI1NS10aGlzW2VdKzEpKi0xOnRoaXNbZV19O3AucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7ZT1lPj4+MCx0fHxEKGUsMix0aGlzLmxlbmd0aCk7bGV0IG49dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIG4mMzI3Njg/bnw0Mjk0OTAxNzYwOm59O3AucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7ZT1lPj4+MCx0fHxEKGUsMix0aGlzLmxlbmd0aCk7bGV0IG49dGhpc1tlKzFdfHRoaXNbZV08PDg7cmV0dXJuIG4mMzI3Njg/bnw0Mjk0OTAxNzYwOm59O3AucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH07cC5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfTtwLnByb3RvdHlwZS5yZWFkQmlnSW50NjRMRT1iZShmdW5jdGlvbihlKXtlPWU+Pj4wLFllKGUsXCJvZmZzZXRcIik7bGV0IHQ9dGhpc1tlXSxuPXRoaXNbZSs3XTsodD09PXZvaWQgMHx8bj09PXZvaWQgMCkmJnd0KGUsdGhpcy5sZW5ndGgtOCk7bGV0IGk9dGhpc1tlKzRdK3RoaXNbZSs1XSoyKio4K3RoaXNbZSs2XSoyKioxNisobjw8MjQpO3JldHVybihCaWdJbnQoaSk8PEJpZ0ludCgzMikpK0JpZ0ludCh0K3RoaXNbKytlXSoyKio4K3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqMjQpfSk7cC5wcm90b3R5cGUucmVhZEJpZ0ludDY0QkU9YmUoZnVuY3Rpb24oZSl7ZT1lPj4+MCxZZShlLFwib2Zmc2V0XCIpO2xldCB0PXRoaXNbZV0sbj10aGlzW2UrN107KHQ9PT12b2lkIDB8fG49PT12b2lkIDApJiZ3dChlLHRoaXMubGVuZ3RoLTgpO2xldCBpPSh0PDwyNCkrdGhpc1srK2VdKjIqKjE2K3RoaXNbKytlXSoyKio4K3RoaXNbKytlXTtyZXR1cm4oQmlnSW50KGkpPDxCaWdJbnQoMzIpKStCaWdJbnQodGhpc1srK2VdKjIqKjI0K3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqOCtuKX0pO3AucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDQsdGhpcy5sZW5ndGgpLHplLnJlYWQodGhpcyxlLCEwLDIzLDQpfTtwLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSw0LHRoaXMubGVuZ3RoKSx6ZS5yZWFkKHRoaXMsZSwhMSwyMyw0KX07cC5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDgsdGhpcy5sZW5ndGgpLHplLnJlYWQodGhpcyxlLCEwLDUyLDgpfTtwLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsOCx0aGlzLmxlbmd0aCksemUucmVhZCh0aGlzLGUsITEsNTIsOCl9O2Z1bmN0aW9uIFcocixlLHQsbixpLG8pe2lmKCFwLmlzQnVmZmVyKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+aXx8ZTxvKXRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKHQrbj5yLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKX1wLnByb3RvdHlwZS53cml0ZVVpbnRMRT1wLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHQsbixpKXtpZihlPStlLHQ9dD4+PjAsbj1uPj4+MCwhaSl7bGV0IGE9TWF0aC5wb3coMiw4Km4pLTE7Vyh0aGlzLGUsdCxuLGEsMCl9bGV0IG89MSxzPTA7Zm9yKHRoaXNbdF09ZSYyNTU7KytzPG4mJihvKj0yNTYpOyl0aGlzW3Qrc109ZS9vJjI1NTtyZXR1cm4gdCtufTtwLnByb3RvdHlwZS53cml0ZVVpbnRCRT1wLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbihlLHQsbixpKXtpZihlPStlLHQ9dD4+PjAsbj1uPj4+MCwhaSl7bGV0IGE9TWF0aC5wb3coMiw4Km4pLTE7Vyh0aGlzLGUsdCxuLGEsMCl9bGV0IG89bi0xLHM9MTtmb3IodGhpc1t0K29dPWUmMjU1Oy0tbz49MCYmKHMqPTI1Nik7KXRoaXNbdCtvXT1lL3MmMjU1O3JldHVybiB0K259O3AucHJvdG90eXBlLndyaXRlVWludDg9cC5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDEsMjU1LDApLHRoaXNbdF09ZSYyNTUsdCsxfTtwLnByb3RvdHlwZS53cml0ZVVpbnQxNkxFPXAucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCwyLDY1NTM1LDApLHRoaXNbdF09ZSYyNTUsdGhpc1t0KzFdPWU+Pj44LHQrMn07cC5wcm90b3R5cGUud3JpdGVVaW50MTZCRT1wLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMiw2NTUzNSwwKSx0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT1lJjI1NSx0KzJ9O3AucHJvdG90eXBlLndyaXRlVWludDMyTEU9cC5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSx0aGlzW3QrM109ZT4+PjI0LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdF09ZSYyNTUsdCs0fTtwLnByb3RvdHlwZS53cml0ZVVpbnQzMkJFPXAucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCw0LDQyOTQ5NjcyOTUsMCksdGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPWUmMjU1LHQrNH07ZnVuY3Rpb24gX2kocixlLHQsbixpKXtSaShlLG4saSxyLHQsNyk7bGV0IG89TnVtYmVyKGUmQmlnSW50KDQyOTQ5NjcyOTUpKTtyW3QrK109byxvPW8+Pjgsclt0KytdPW8sbz1vPj44LHJbdCsrXT1vLG89bz4+OCxyW3QrK109bztsZXQgcz1OdW1iZXIoZT4+QmlnSW50KDMyKSZCaWdJbnQoNDI5NDk2NzI5NSkpO3JldHVybiByW3QrK109cyxzPXM+Pjgsclt0KytdPXMscz1zPj44LHJbdCsrXT1zLHM9cz4+OCxyW3QrK109cyx0fWZ1bmN0aW9uIHdpKHIsZSx0LG4saSl7UmkoZSxuLGkscix0LDcpO2xldCBvPU51bWJlcihlJkJpZ0ludCg0Mjk0OTY3Mjk1KSk7clt0KzddPW8sbz1vPj44LHJbdCs2XT1vLG89bz4+OCxyW3QrNV09byxvPW8+Pjgsclt0KzRdPW87bGV0IHM9TnVtYmVyKGU+PkJpZ0ludCgzMikmQmlnSW50KDQyOTQ5NjcyOTUpKTtyZXR1cm4gclt0KzNdPXMscz1zPj44LHJbdCsyXT1zLHM9cz4+OCxyW3QrMV09cyxzPXM+Pjgsclt0XT1zLHQrOH1wLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NExFPWJlKGZ1bmN0aW9uKGUsdD0wKXtyZXR1cm4gX2kodGhpcyxlLHQsQmlnSW50KDApLEJpZ0ludChcIjB4ZmZmZmZmZmZmZmZmZmZmZlwiKSl9KTtwLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NEJFPWJlKGZ1bmN0aW9uKGUsdD0wKXtyZXR1cm4gd2kodGhpcyxlLHQsQmlnSW50KDApLEJpZ0ludChcIjB4ZmZmZmZmZmZmZmZmZmZmZlwiKSl9KTtwLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKGUsdCxuLGkpe2lmKGU9K2UsdD10Pj4+MCwhaSl7bGV0IHU9TWF0aC5wb3coMiw4Km4tMSk7Vyh0aGlzLGUsdCxuLHUtMSwtdSl9bGV0IG89MCxzPTEsYT0wO2Zvcih0aGlzW3RdPWUmMjU1OysrbzxuJiYocyo9MjU2KTspZTwwJiZhPT09MCYmdGhpc1t0K28tMV0hPT0wJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrbn07cC5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbihlLHQsbixpKXtpZihlPStlLHQ9dD4+PjAsIWkpe2xldCB1PU1hdGgucG93KDIsOCpuLTEpO1codGhpcyxlLHQsbix1LTEsLXUpfWxldCBvPW4tMSxzPTEsYT0wO2Zvcih0aGlzW3Qrb109ZSYyNTU7LS1vPj0wJiYocyo9MjU2KTspZTwwJiZhPT09MCYmdGhpc1t0K28rMV0hPT0wJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrbn07cC5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMSwxMjcsLTEyOCksZTwwJiYoZT0yNTUrZSsxKSx0aGlzW3RdPWUmMjU1LHQrMX07cC5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLHRoaXNbdF09ZSYyNTUsdGhpc1t0KzFdPWU+Pj44LHQrMn07cC5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPWUmMjU1LHQrMn07cC5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0aGlzW3RdPWUmMjU1LHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQsdCs0fTtwLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGU8MCYmKGU9NDI5NDk2NzI5NStlKzEpLHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT1lJjI1NSx0KzR9O3AucHJvdG90eXBlLndyaXRlQmlnSW50NjRMRT1iZShmdW5jdGlvbihlLHQ9MCl7cmV0dXJuIF9pKHRoaXMsZSx0LC1CaWdJbnQoXCIweDgwMDAwMDAwMDAwMDAwMDBcIiksQmlnSW50KFwiMHg3ZmZmZmZmZmZmZmZmZmZmXCIpKX0pO3AucHJvdG90eXBlLndyaXRlQmlnSW50NjRCRT1iZShmdW5jdGlvbihlLHQ9MCl7cmV0dXJuIHdpKHRoaXMsZSx0LC1CaWdJbnQoXCIweDgwMDAwMDAwMDAwMDAwMDBcIiksQmlnSW50KFwiMHg3ZmZmZmZmZmZmZmZmZmZmXCIpKX0pO2Z1bmN0aW9uIHZpKHIsZSx0LG4saSxvKXtpZih0K24+ci5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIik7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpfWZ1bmN0aW9uIEVpKHIsZSx0LG4saSl7cmV0dXJuIGU9K2UsdD10Pj4+MCxpfHx2aShyLGUsdCw0LDM0MDI4MjM0NjYzODUyODg2ZTIyLC0zNDAyODIzNDY2Mzg1Mjg4NmUyMiksemUud3JpdGUocixlLHQsbiwyMyw0KSx0KzR9cC5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRWkodGhpcyxlLHQsITAsbil9O3AucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEVpKHRoaXMsZSx0LCExLG4pfTtmdW5jdGlvbiBTaShyLGUsdCxuLGkpe3JldHVybiBlPStlLHQ9dD4+PjAsaXx8dmkocixlLHQsOCwxNzk3NjkzMTM0ODYyMzE1N2UyOTIsLTE3OTc2OTMxMzQ4NjIzMTU3ZTI5MiksemUud3JpdGUocixlLHQsbiw1Miw4KSx0Kzh9cC5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIFNpKHRoaXMsZSx0LCEwLG4pfTtwLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gU2kodGhpcyxlLHQsITEsbil9O3AucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oZSx0LG4saSl7aWYoIXAuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlclwiKTtpZihufHwobj0wKSwhaSYmaSE9PTAmJihpPXRoaXMubGVuZ3RoKSx0Pj1lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLHR8fCh0PTApLGk+MCYmaTxuJiYoaT1uKSxpPT09bnx8ZS5sZW5ndGg9PT0wfHx0aGlzLmxlbmd0aD09PTApcmV0dXJuIDA7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKFwidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kc1wiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpO2lmKGk8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzXCIpO2k+dGhpcy5sZW5ndGgmJihpPXRoaXMubGVuZ3RoKSxlLmxlbmd0aC10PGktbiYmKGk9ZS5sZW5ndGgtdCtuKTtsZXQgbz1pLW47cmV0dXJuIHRoaXM9PT1lJiZ0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbj09XCJmdW5jdGlvblwiP3RoaXMuY29weVdpdGhpbih0LG4saSk6VWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoZSx0aGlzLnN1YmFycmF5KG4saSksdCksb307cC5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbihlLHQsbixpKXtpZih0eXBlb2YgZT09XCJzdHJpbmdcIil7aWYodHlwZW9mIHQ9PVwic3RyaW5nXCI/KGk9dCx0PTAsbj10aGlzLmxlbmd0aCk6dHlwZW9mIG49PVwic3RyaW5nXCImJihpPW4sbj10aGlzLmxlbmd0aCksaSE9PXZvaWQgMCYmdHlwZW9mIGkhPVwic3RyaW5nXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihcImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmdcIik7aWYodHlwZW9mIGk9PVwic3RyaW5nXCImJiFwLmlzRW5jb2RpbmcoaSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVua25vd24gZW5jb2Rpbmc6IFwiK2kpO2lmKGUubGVuZ3RoPT09MSl7bGV0IHM9ZS5jaGFyQ29kZUF0KDApOyhpPT09XCJ1dGY4XCImJnM8MTI4fHxpPT09XCJsYXRpbjFcIikmJihlPXMpfX1lbHNlIHR5cGVvZiBlPT1cIm51bWJlclwiP2U9ZSYyNTU6dHlwZW9mIGU9PVwiYm9vbGVhblwiJiYoZT1OdW1iZXIoZSkpO2lmKHQ8MHx8dGhpcy5sZW5ndGg8dHx8dGhpcy5sZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk91dCBvZiByYW5nZSBpbmRleFwiKTtpZihuPD10KXJldHVybiB0aGlzO3Q9dD4+PjAsbj1uPT09dm9pZCAwP3RoaXMubGVuZ3RoOm4+Pj4wLGV8fChlPTApO2xldCBvO2lmKHR5cGVvZiBlPT1cIm51bWJlclwiKWZvcihvPXQ7bzxuOysrbyl0aGlzW29dPWU7ZWxzZXtsZXQgcz1wLmlzQnVmZmVyKGUpP2U6cC5mcm9tKGUsaSksYT1zLmxlbmd0aDtpZihhPT09MCl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgXCInK2UrJ1wiIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50IFwidmFsdWVcIicpO2ZvcihvPTA7bzxuLXQ7KytvKXRoaXNbbyt0XT1zW28lYV19cmV0dXJuIHRoaXN9O3ZhciBWZT17fTtmdW5jdGlvbiBlbihyLGUsdCl7VmVbcl09Y2xhc3MgZXh0ZW5kcyB0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIm1lc3NhZ2VcIix7dmFsdWU6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdGhpcy5uYW1lPWAke3RoaXMubmFtZX0gWyR7cn1dYCx0aGlzLnN0YWNrLGRlbGV0ZSB0aGlzLm5hbWV9Z2V0IGNvZGUoKXtyZXR1cm4gcn1zZXQgY29kZShpKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImNvZGVcIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6aSx3cml0YWJsZTohMH0pfXRvU3RyaW5nKCl7cmV0dXJuYCR7dGhpcy5uYW1lfSBbJHtyfV06ICR7dGhpcy5tZXNzYWdlfWB9fX1lbihcIkVSUl9CVUZGRVJfT1VUX09GX0JPVU5EU1wiLGZ1bmN0aW9uKHIpe3JldHVybiByP2Ake3J9IGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kc2A6XCJBdHRlbXB0IHRvIGFjY2VzcyBtZW1vcnkgb3V0c2lkZSBidWZmZXIgYm91bmRzXCJ9LFJhbmdlRXJyb3IpO2VuKFwiRVJSX0lOVkFMSURfQVJHX1RZUEVcIixmdW5jdGlvbihyLGUpe3JldHVybmBUaGUgXCIke3J9XCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAke3R5cGVvZiBlfWB9LFR5cGVFcnJvcik7ZW4oXCJFUlJfT1VUX09GX1JBTkdFXCIsZnVuY3Rpb24ocixlLHQpe2xldCBuPWBUaGUgdmFsdWUgb2YgXCIke3J9XCIgaXMgb3V0IG9mIHJhbmdlLmAsaT10O3JldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHQpJiZNYXRoLmFicyh0KT4yKiozMj9pPWhpKFN0cmluZyh0KSk6dHlwZW9mIHQ9PVwiYmlnaW50XCImJihpPVN0cmluZyh0KSwodD5CaWdJbnQoMikqKkJpZ0ludCgzMil8fHQ8LShCaWdJbnQoMikqKkJpZ0ludCgzMikpKSYmKGk9aGkoaSkpLGkrPVwiblwiKSxuKz1gIEl0IG11c3QgYmUgJHtlfS4gUmVjZWl2ZWQgJHtpfWAsbn0sUmFuZ2VFcnJvcik7ZnVuY3Rpb24gaGkocil7bGV0IGU9XCJcIix0PXIubGVuZ3RoLG49clswXT09PVwiLVwiPzE6MDtmb3IoO3Q+PW4rNDt0LT0zKWU9YF8ke3Iuc2xpY2UodC0zLHQpfSR7ZX1gO3JldHVybmAke3Iuc2xpY2UoMCx0KX0ke2V9YH1mdW5jdGlvbiBxYShyLGUsdCl7WWUoZSxcIm9mZnNldFwiKSwocltlXT09PXZvaWQgMHx8cltlK3RdPT09dm9pZCAwKSYmd3QoZSxyLmxlbmd0aC0odCsxKSl9ZnVuY3Rpb24gUmkocixlLHQsbixpLG8pe2lmKHI+dHx8cjxlKXtsZXQgcz10eXBlb2YgZT09XCJiaWdpbnRcIj9cIm5cIjpcIlwiLGE7dGhyb3cgbz4zP2U9PT0wfHxlPT09QmlnSW50KDApP2E9YD49IDAke3N9IGFuZCA8IDIke3N9ICoqICR7KG8rMSkqOH0ke3N9YDphPWA+PSAtKDIke3N9ICoqICR7KG8rMSkqOC0xfSR7c30pIGFuZCA8IDIgKiogJHsobysxKSo4LTF9JHtzfWA6YT1gPj0gJHtlfSR7c30gYW5kIDw9ICR7dH0ke3N9YCxuZXcgVmUuRVJSX09VVF9PRl9SQU5HRShcInZhbHVlXCIsYSxyKX1xYShuLGksbyl9ZnVuY3Rpb24gWWUocixlKXtpZih0eXBlb2YgciE9XCJudW1iZXJcIil0aHJvdyBuZXcgVmUuRVJSX0lOVkFMSURfQVJHX1RZUEUoZSxcIm51bWJlclwiLHIpfWZ1bmN0aW9uIHd0KHIsZSx0KXt0aHJvdyBNYXRoLmZsb29yKHIpIT09cj8oWWUocix0KSxuZXcgVmUuRVJSX09VVF9PRl9SQU5HRSh0fHxcIm9mZnNldFwiLFwiYW4gaW50ZWdlclwiLHIpKTplPDA/bmV3IFZlLkVSUl9CVUZGRVJfT1VUX09GX0JPVU5EUzpuZXcgVmUuRVJSX09VVF9PRl9SQU5HRSh0fHxcIm9mZnNldFwiLGA+PSAke3Q/MTowfSBhbmQgPD0gJHtlfWAscil9dmFyIGphPS9bXisvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gV2Eocil7aWYocj1yLnNwbGl0KFwiPVwiKVswXSxyPXIudHJpbSgpLnJlcGxhY2UoamEsXCJcIiksci5sZW5ndGg8MilyZXR1cm5cIlwiO2Zvcig7ci5sZW5ndGglNCE9PTA7KXI9citcIj1cIjtyZXR1cm4gcn1mdW5jdGlvbiBKcihyLGUpe2U9ZXx8MS8wO2xldCB0LG49ci5sZW5ndGgsaT1udWxsLG89W107Zm9yKGxldCBzPTA7czxuOysrcyl7aWYodD1yLmNoYXJDb2RlQXQocyksdD41NTI5NSYmdDw1NzM0NCl7aWYoIWkpe2lmKHQ+NTYzMTkpeyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1lbHNlIGlmKHMrMT09PW4peyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPXQ7Y29udGludWV9aWYodDw1NjMyMCl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9dDtjb250aW51ZX10PShpLTU1Mjk2PDwxMHx0LTU2MzIwKSs2NTUzNn1lbHNlIGkmJihlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwsdDwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO28ucHVzaCh0KX1lbHNlIGlmKHQ8MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7by5wdXNoKHQ+PjZ8MTkyLHQmNjN8MTI4KX1lbHNlIGlmKHQ8NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO28ucHVzaCh0Pj4xMnwyMjQsdD4+NiY2M3wxMjgsdCY2M3wxMjgpfWVsc2UgaWYodDwxMTE0MTEyKXtpZigoZS09NCk8MClicmVhaztvLnB1c2godD4+MTh8MjQwLHQ+PjEyJjYzfDEyOCx0Pj42JjYzfDEyOCx0JjYzfDEyOCl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvZGUgcG9pbnRcIil9cmV0dXJuIG99ZnVuY3Rpb24gJGEocil7bGV0IGU9W107Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDsrK3QpZS5wdXNoKHIuY2hhckNvZGVBdCh0KSYyNTUpO3JldHVybiBlfWZ1bmN0aW9uIEdhKHIsZSl7bGV0IHQsbixpLG89W107Zm9yKGxldCBzPTA7czxyLmxlbmd0aCYmISgoZS09Mik8MCk7KytzKXQ9ci5jaGFyQ29kZUF0KHMpLG49dD4+OCxpPXQlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99ZnVuY3Rpb24gVGkocil7cmV0dXJuIFlyLnRvQnl0ZUFycmF5KFdhKHIpKX1mdW5jdGlvbiBVdChyLGUsdCxuKXtsZXQgaTtmb3IoaT0wO2k8biYmIShpK3Q+PWUubGVuZ3RofHxpPj1yLmxlbmd0aCk7KytpKWVbaSt0XT1yW2ldO3JldHVybiBpfWZ1bmN0aW9uIGllKHIsZSl7cmV0dXJuIHIgaW5zdGFuY2VvZiBlfHxyIT1udWxsJiZyLmNvbnN0cnVjdG9yIT1udWxsJiZyLmNvbnN0cnVjdG9yLm5hbWUhPW51bGwmJnIuY29uc3RydWN0b3IubmFtZT09PWUubmFtZX1mdW5jdGlvbiB0bihyKXtyZXR1cm4gciE9PXJ9dmFyIFZhPWZ1bmN0aW9uKCl7bGV0IHI9XCIwMTIzNDU2Nzg5YWJjZGVmXCIsZT1uZXcgQXJyYXkoMjU2KTtmb3IobGV0IHQ9MDt0PDE2OysrdCl7bGV0IG49dCoxNjtmb3IobGV0IGk9MDtpPDE2OysraSllW24raV09clt0XStyW2ldfXJldHVybiBlfSgpO2Z1bmN0aW9uIGJlKHIpe3JldHVybiB0eXBlb2YgQmlnSW50PlwidVwiP3phOnJ9ZnVuY3Rpb24gemEoKXt0aHJvdyBuZXcgRXJyb3IoXCJCaWdJbnQgbm90IHN1cHBvcnRlZFwiKX19KTt2YXIgSWk9UygoY2wsTGkpPT57YygpO3ZhciBQPUxpLmV4cG9ydHM9e30sb2Usc2U7ZnVuY3Rpb24gcm4oKXt0aHJvdyBuZXcgRXJyb3IoXCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpfWZ1bmN0aW9uIG5uKCl7dGhyb3cgbmV3IEVycm9yKFwiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpfShmdW5jdGlvbigpe3RyeXt0eXBlb2Ygc2V0VGltZW91dD09XCJmdW5jdGlvblwiP29lPXNldFRpbWVvdXQ6b2U9cm59Y2F0Y2h7b2U9cm59dHJ5e3R5cGVvZiBjbGVhclRpbWVvdXQ9PVwiZnVuY3Rpb25cIj9zZT1jbGVhclRpbWVvdXQ6c2U9bm59Y2F0Y2h7c2U9bm59fSkoKTtmdW5jdGlvbiBDaShyKXtpZihvZT09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQociwwKTtpZigob2U9PT1ybnx8IW9lKSYmc2V0VGltZW91dClyZXR1cm4gb2U9c2V0VGltZW91dCxzZXRUaW1lb3V0KHIsMCk7dHJ5e3JldHVybiBvZShyLDApfWNhdGNoe3RyeXtyZXR1cm4gb2UuY2FsbChudWxsLHIsMCl9Y2F0Y2h7cmV0dXJuIG9lLmNhbGwodGhpcyxyLDApfX19ZnVuY3Rpb24gWWEocil7aWYoc2U9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChyKTtpZigoc2U9PT1ubnx8IXNlKSYmY2xlYXJUaW1lb3V0KXJldHVybiBzZT1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KHIpO3RyeXtyZXR1cm4gc2Uocil9Y2F0Y2h7dHJ5e3JldHVybiBzZS5jYWxsKG51bGwscil9Y2F0Y2h7cmV0dXJuIHNlLmNhbGwodGhpcyxyKX19fXZhciBwZT1bXSxKZT0hMSxrZSxEdD0tMTtmdW5jdGlvbiBLYSgpeyFKZXx8IWtlfHwoSmU9ITEsa2UubGVuZ3RoP3BlPWtlLmNvbmNhdChwZSk6RHQ9LTEscGUubGVuZ3RoJiZCaSgpKX1mdW5jdGlvbiBCaSgpe2lmKCFKZSl7dmFyIHI9Q2koS2EpO0plPSEwO2Zvcih2YXIgZT1wZS5sZW5ndGg7ZTspe2ZvcihrZT1wZSxwZT1bXTsrK0R0PGU7KWtlJiZrZVtEdF0ucnVuKCk7RHQ9LTEsZT1wZS5sZW5ndGh9a2U9bnVsbCxKZT0hMSxZYShyKX19UC5uZXh0VGljaz1mdW5jdGlvbihyKXt2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyllW3QtMV09YXJndW1lbnRzW3RdO3BlLnB1c2gobmV3IE1pKHIsZSkpLHBlLmxlbmd0aD09PTEmJiFKZSYmQ2koQmkpfTtmdW5jdGlvbiBNaShyLGUpe3RoaXMuZnVuPXIsdGhpcy5hcnJheT1lfU1pLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtQLnRpdGxlPVwiYnJvd3NlclwiO1AuYnJvd3Nlcj0hMDtQLmVudj17fTtQLmFyZ3Y9W107UC52ZXJzaW9uPVwiXCI7UC52ZXJzaW9ucz17fTtmdW5jdGlvbiBoZSgpe31QLm9uPWhlO1AuYWRkTGlzdGVuZXI9aGU7UC5vbmNlPWhlO1Aub2ZmPWhlO1AucmVtb3ZlTGlzdGVuZXI9aGU7UC5yZW1vdmVBbGxMaXN0ZW5lcnM9aGU7UC5lbWl0PWhlO1AucHJlcGVuZExpc3RlbmVyPWhlO1AucHJlcGVuZE9uY2VMaXN0ZW5lcj1oZTtQLmxpc3RlbmVycz1mdW5jdGlvbihyKXtyZXR1cm5bXX07UC5iaW5kaW5nPWZ1bmN0aW9uKHIpe3Rocm93IG5ldyBFcnJvcihcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXCIpfTtQLmN3ZD1mdW5jdGlvbigpe3JldHVyblwiL1wifTtQLmNoZGlyPWZ1bmN0aW9uKHIpe3Rocm93IG5ldyBFcnJvcihcInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZFwiKX07UC51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0pO3ZhciBBaSxYYSxjPWhhKCgpPT57QWk9QyhYZSgpKSxYYT1DKElpKCkpO3dpbmRvdy5CdWZmZXI9QWkuQnVmZmVyO3dpbmRvdy5wcm9jZXNzPVhhfSk7dmFyIGppPVMoKGxsLG9uKT0+e1widXNlIHN0cmljdFwiO2MoKTt2YXIgUWU9dHlwZW9mIFJlZmxlY3Q9PVwib2JqZWN0XCI/UmVmbGVjdDpudWxsLEZpPVFlJiZ0eXBlb2YgUWUuYXBwbHk9PVwiZnVuY3Rpb25cIj9RZS5hcHBseTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGUsdCxuKX0sTnQ7UWUmJnR5cGVvZiBRZS5vd25LZXlzPT1cImZ1bmN0aW9uXCI/TnQ9UWUub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP050PWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKSl9Ok50PWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKX07ZnVuY3Rpb24gSmEocil7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4ocil9dmFyIGtpPU51bWJlci5pc05hTnx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT1lfTtmdW5jdGlvbiBCKCl7Qi5pbml0LmNhbGwodGhpcyl9b24uZXhwb3J0cz1CO29uLmV4cG9ydHMub25jZT10dTtCLkV2ZW50RW1pdHRlcj1CO0IucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwO0IucHJvdG90eXBlLl9ldmVudHNDb3VudD0wO0IucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBQaT0xMDtmdW5jdGlvbiBIdChyKXtpZih0eXBlb2YgciE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShCLFwiZGVmYXVsdE1heExpc3RlbmVyc1wiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBQaX0sc2V0OmZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT1cIm51bWJlclwifHxyPDB8fGtpKHIpKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytyK1wiLlwiKTtQaT1yfX0pO0IuaW5pdD1mdW5jdGlvbigpeyh0aGlzLl9ldmVudHM9PT12b2lkIDB8fHRoaXMuX2V2ZW50cz09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSYmKHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH07Qi5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT1cIm51bWJlclwifHxlPDB8fGtpKGUpKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytlK1wiLlwiKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPWUsdGhpc307ZnVuY3Rpb24gT2kocil7cmV0dXJuIHIuX21heExpc3RlbmVycz09PXZvaWQgMD9CLmRlZmF1bHRNYXhMaXN0ZW5lcnM6ci5fbWF4TGlzdGVuZXJzfUIucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBPaSh0aGlzKX07Qi5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdC5wdXNoKGFyZ3VtZW50c1tuXSk7dmFyIGk9ZT09PVwiZXJyb3JcIixvPXRoaXMuX2V2ZW50cztpZihvIT09dm9pZCAwKWk9aSYmby5lcnJvcj09PXZvaWQgMDtlbHNlIGlmKCFpKXJldHVybiExO2lmKGkpe3ZhciBzO2lmKHQubGVuZ3RoPjAmJihzPXRbMF0pLHMgaW5zdGFuY2VvZiBFcnJvcil0aHJvdyBzO3ZhciBhPW5ldyBFcnJvcihcIlVuaGFuZGxlZCBlcnJvci5cIisocz9cIiAoXCIrcy5tZXNzYWdlK1wiKVwiOlwiXCIpKTt0aHJvdyBhLmNvbnRleHQ9cyxhfXZhciB1PW9bZV07aWYodT09PXZvaWQgMClyZXR1cm4hMTtpZih0eXBlb2YgdT09XCJmdW5jdGlvblwiKUZpKHUsdGhpcyx0KTtlbHNlIGZvcih2YXIgZj11Lmxlbmd0aCxsPXFpKHUsZiksbj0wO248ZjsrK24pRmkobFtuXSx0aGlzLHQpO3JldHVybiEwfTtmdW5jdGlvbiBVaShyLGUsdCxuKXt2YXIgaSxvLHM7aWYoSHQodCksbz1yLl9ldmVudHMsbz09PXZvaWQgMD8obz1yLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxyLl9ldmVudHNDb3VudD0wKTooby5uZXdMaXN0ZW5lciE9PXZvaWQgMCYmKHIuZW1pdChcIm5ld0xpc3RlbmVyXCIsZSx0Lmxpc3RlbmVyP3QubGlzdGVuZXI6dCksbz1yLl9ldmVudHMpLHM9b1tlXSkscz09PXZvaWQgMClzPW9bZV09dCwrK3IuX2V2ZW50c0NvdW50O2Vsc2UgaWYodHlwZW9mIHM9PVwiZnVuY3Rpb25cIj9zPW9bZV09bj9bdCxzXTpbcyx0XTpuP3MudW5zaGlmdCh0KTpzLnB1c2godCksaT1PaShyKSxpPjAmJnMubGVuZ3RoPmkmJiFzLndhcm5lZCl7cy53YXJuZWQ9ITA7dmFyIGE9bmV3IEVycm9yKFwiUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiBcIitzLmxlbmd0aCtcIiBcIitTdHJpbmcoZSkrXCIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdFwiKTthLm5hbWU9XCJNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmdcIixhLmVtaXR0ZXI9cixhLnR5cGU9ZSxhLmNvdW50PXMubGVuZ3RoLEphKGEpfXJldHVybiByfUIucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFVpKHRoaXMsZSx0LCExKX07Qi5wcm90b3R5cGUub249Qi5wcm90b3R5cGUuYWRkTGlzdGVuZXI7Qi5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFVpKHRoaXMsZSx0LCEwKX07ZnVuY3Rpb24gUWEoKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIERpKHIsZSx0KXt2YXIgbj17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQ6cix0eXBlOmUsbGlzdGVuZXI6dH0saT1RYS5iaW5kKG4pO3JldHVybiBpLmxpc3RlbmVyPXQsbi53cmFwRm49aSxpfUIucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSHQodCksdGhpcy5vbihlLERpKHRoaXMsZSx0KSksdGhpc307Qi5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiBIdCh0KSx0aGlzLnByZXBlbmRMaXN0ZW5lcihlLERpKHRoaXMsZSx0KSksdGhpc307Qi5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbixpLG8scyxhO2lmKEh0KHQpLGk9dGhpcy5fZXZlbnRzLGk9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj1pW2VdLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj09PXR8fG4ubGlzdGVuZXI9PT10KS0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOihkZWxldGUgaVtlXSxpLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoXCJyZW1vdmVMaXN0ZW5lclwiLGUsbi5saXN0ZW5lcnx8dCkpO2Vsc2UgaWYodHlwZW9mIG4hPVwiZnVuY3Rpb25cIil7Zm9yKG89LTEscz1uLmxlbmd0aC0xO3M+PTA7cy0tKWlmKG5bc109PT10fHxuW3NdLmxpc3RlbmVyPT09dCl7YT1uW3NdLmxpc3RlbmVyLG89czticmVha31pZihvPDApcmV0dXJuIHRoaXM7bz09PTA/bi5zaGlmdCgpOlphKG4sbyksbi5sZW5ndGg9PT0xJiYoaVtlXT1uWzBdKSxpLnJlbW92ZUxpc3RlbmVyIT09dm9pZCAwJiZ0aGlzLmVtaXQoXCJyZW1vdmVMaXN0ZW5lclwiLGUsYXx8dCl9cmV0dXJuIHRoaXN9O0IucHJvdG90eXBlLm9mZj1CLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtCLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7dmFyIHQsbixpO2lmKG49dGhpcy5fZXZlbnRzLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobi5yZW1vdmVMaXN0ZW5lcj09PXZvaWQgMClyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApOm5bZV0hPT12b2lkIDAmJigtLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgbltlXSksdGhpcztpZihhcmd1bWVudHMubGVuZ3RoPT09MCl7dmFyIG89T2JqZWN0LmtleXMobikscztmb3IoaT0wO2k8by5sZW5ndGg7KytpKXM9b1tpXSxzIT09XCJyZW1vdmVMaXN0ZW5lclwiJiZ0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhzKTtyZXR1cm4gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJyZW1vdmVMaXN0ZW5lclwiKSx0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYodD1uW2VdLHR5cGVvZiB0PT1cImZ1bmN0aW9uXCIpdGhpcy5yZW1vdmVMaXN0ZW5lcihlLHQpO2Vsc2UgaWYodCE9PXZvaWQgMClmb3IoaT10Lmxlbmd0aC0xO2k+PTA7aS0tKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSx0W2ldKTtyZXR1cm4gdGhpc307ZnVuY3Rpb24gTmkocixlLHQpe3ZhciBuPXIuX2V2ZW50cztpZihuPT09dm9pZCAwKXJldHVybltdO3ZhciBpPW5bZV07cmV0dXJuIGk9PT12b2lkIDA/W106dHlwZW9mIGk9PVwiZnVuY3Rpb25cIj90P1tpLmxpc3RlbmVyfHxpXTpbaV06dD9ldShpKTpxaShpLGkubGVuZ3RoKX1CLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIE5pKHRoaXMsZSwhMCl9O0IucHJvdG90eXBlLnJhd0xpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm4gTmkodGhpcyxlLCExKX07Qi5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHIsZSl7cmV0dXJuIHR5cGVvZiByLmxpc3RlbmVyQ291bnQ9PVwiZnVuY3Rpb25cIj9yLmxpc3RlbmVyQ291bnQoZSk6SGkuY2FsbChyLGUpfTtCLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PUhpO2Z1bmN0aW9uIEhpKHIpe3ZhciBlPXRoaXMuX2V2ZW50cztpZihlIT09dm9pZCAwKXt2YXIgdD1lW3JdO2lmKHR5cGVvZiB0PT1cImZ1bmN0aW9uXCIpcmV0dXJuIDE7aWYodCE9PXZvaWQgMClyZXR1cm4gdC5sZW5ndGh9cmV0dXJuIDB9Qi5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP050KHRoaXMuX2V2ZW50cyk6W119O2Z1bmN0aW9uIHFpKHIsZSl7Zm9yKHZhciB0PW5ldyBBcnJheShlKSxuPTA7bjxlOysrbil0W25dPXJbbl07cmV0dXJuIHR9ZnVuY3Rpb24gWmEocixlKXtmb3IoO2UrMTxyLmxlbmd0aDtlKyspcltlXT1yW2UrMV07ci5wb3AoKX1mdW5jdGlvbiBldShyKXtmb3IodmFyIGU9bmV3IEFycmF5KHIubGVuZ3RoKSx0PTA7dDxlLmxlbmd0aDsrK3QpZVt0XT1yW3RdLmxpc3RlbmVyfHxyW3RdO3JldHVybiBlfWZ1bmN0aW9uIHR1KHIsZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gaSgpe28hPT12b2lkIDAmJnIucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLG8pLHQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKX12YXIgbztlIT09XCJlcnJvclwiJiYobz1mdW5jdGlvbihhKXtyLnJlbW92ZUxpc3RlbmVyKGUsaSksbihhKX0sci5vbmNlKFwiZXJyb3JcIixvKSksci5vbmNlKGUsaSl9KX19KTt2YXIgT2U9UygoZGwsc24pPT57YygpO3R5cGVvZiBPYmplY3QuY3JlYXRlPT1cImZ1bmN0aW9uXCI/c24uZXhwb3J0cz1mdW5jdGlvbihlLHQpe3QmJihlLnN1cGVyXz10LGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pKX06c24uZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKHQpe2Uuc3VwZXJfPXQ7dmFyIG49ZnVuY3Rpb24oKXt9O24ucHJvdG90eXBlPXQucHJvdG90eXBlLGUucHJvdG90eXBlPW5ldyBuLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWV9fX0pO3ZhciB1bj1TKChwbCxhbik9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFplPXR5cGVvZiBSZWZsZWN0PT1cIm9iamVjdFwiP1JlZmxlY3Q6bnVsbCxXaT1aZSYmdHlwZW9mIFplLmFwcGx5PT1cImZ1bmN0aW9uXCI/WmUuYXBwbHk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChlLHQsbil9LHF0O1plJiZ0eXBlb2YgWmUub3duS2V5cz09XCJmdW5jdGlvblwiP3F0PVplLm93bktleXM6T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9xdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSkpfTpxdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSl9O2Z1bmN0aW9uIHJ1KHIpe2NvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKHIpfXZhciBHaT1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uKGUpe3JldHVybiBlIT09ZX07ZnVuY3Rpb24gTSgpe00uaW5pdC5jYWxsKHRoaXMpfWFuLmV4cG9ydHM9TTthbi5leHBvcnRzLm9uY2U9c3U7TS5FdmVudEVtaXR0ZXI9TTtNLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMDtNLnByb3RvdHlwZS5fZXZlbnRzQ291bnQ9MDtNLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMDt2YXIgJGk9MTA7ZnVuY3Rpb24ganQocil7aWYodHlwZW9mIHIhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnK3R5cGVvZiByKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoTSxcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gJGl9LHNldDpmdW5jdGlvbihyKXtpZih0eXBlb2YgciE9XCJudW1iZXJcInx8cjwwfHxHaShyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcrcitcIi5cIik7JGk9cn19KTtNLmluaXQ9ZnVuY3Rpb24oKXsodGhpcy5fZXZlbnRzPT09dm9pZCAwfHx0aGlzLl9ldmVudHM9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykmJih0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9O00ucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9XCJudW1iZXJcInx8ZTwwfHxHaShlKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcrZStcIi5cIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz1lLHRoaXN9O2Z1bmN0aW9uIFZpKHIpe3JldHVybiByLl9tYXhMaXN0ZW5lcnM9PT12b2lkIDA/TS5kZWZhdWx0TWF4TGlzdGVuZXJzOnIuX21heExpc3RlbmVyc31NLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gVmkodGhpcyl9O00ucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQucHVzaChhcmd1bWVudHNbbl0pO3ZhciBpPWU9PT1cImVycm9yXCIsbz10aGlzLl9ldmVudHM7aWYobyE9PXZvaWQgMClpPWkmJm8uZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighaSlyZXR1cm4hMTtpZihpKXt2YXIgcztpZih0Lmxlbmd0aD4wJiYocz10WzBdKSxzIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgczt2YXIgYT1uZXcgRXJyb3IoXCJVbmhhbmRsZWQgZXJyb3IuXCIrKHM/XCIgKFwiK3MubWVzc2FnZStcIilcIjpcIlwiKSk7dGhyb3cgYS5jb250ZXh0PXMsYX12YXIgdT1vW2VdO2lmKHU9PT12b2lkIDApcmV0dXJuITE7aWYodHlwZW9mIHU9PVwiZnVuY3Rpb25cIilXaSh1LHRoaXMsdCk7ZWxzZSBmb3IodmFyIGY9dS5sZW5ndGgsbD1KaSh1LGYpLG49MDtuPGY7KytuKVdpKGxbbl0sdGhpcyx0KTtyZXR1cm4hMH07ZnVuY3Rpb24gemkocixlLHQsbil7dmFyIGksbyxzO2lmKGp0KHQpLG89ci5fZXZlbnRzLG89PT12b2lkIDA/KG89ci5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksci5fZXZlbnRzQ291bnQ9MCk6KG8ubmV3TGlzdGVuZXIhPT12b2lkIDAmJihyLmVtaXQoXCJuZXdMaXN0ZW5lclwiLGUsdC5saXN0ZW5lcj90Lmxpc3RlbmVyOnQpLG89ci5fZXZlbnRzKSxzPW9bZV0pLHM9PT12b2lkIDApcz1vW2VdPXQsKytyLl9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBzPT1cImZ1bmN0aW9uXCI/cz1vW2VdPW4/W3Qsc106W3MsdF06bj9zLnVuc2hpZnQodCk6cy5wdXNoKHQpLGk9VmkociksaT4wJiZzLmxlbmd0aD5pJiYhcy53YXJuZWQpe3Mud2FybmVkPSEwO3ZhciBhPW5ldyBFcnJvcihcIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gXCIrcy5sZW5ndGgrXCIgXCIrU3RyaW5nKGUpK1wiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXRcIik7YS5uYW1lPVwiTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nXCIsYS5lbWl0dGVyPXIsYS50eXBlPWUsYS5jb3VudD1zLmxlbmd0aCxydShhKX1yZXR1cm4gcn1NLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiB6aSh0aGlzLGUsdCwhMSl9O00ucHJvdG90eXBlLm9uPU0ucHJvdG90eXBlLmFkZExpc3RlbmVyO00ucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiB6aSh0aGlzLGUsdCwhMCl9O2Z1bmN0aW9uIG51KCl7aWYoIXRoaXMuZmlyZWQpcmV0dXJuIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSx0aGlzLndyYXBGbiksdGhpcy5maXJlZD0hMCxhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpOnRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsYXJndW1lbnRzKX1mdW5jdGlvbiBZaShyLGUsdCl7dmFyIG49e2ZpcmVkOiExLHdyYXBGbjp2b2lkIDAsdGFyZ2V0OnIsdHlwZTplLGxpc3RlbmVyOnR9LGk9bnUuYmluZChuKTtyZXR1cm4gaS5saXN0ZW5lcj10LG4ud3JhcEZuPWksaX1NLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGp0KHQpLHRoaXMub24oZSxZaSh0aGlzLGUsdCkpLHRoaXN9O00ucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ganQodCksdGhpcy5wcmVwZW5kTGlzdGVuZXIoZSxZaSh0aGlzLGUsdCkpLHRoaXN9O00ucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLHMsYTtpZihqdCh0KSxpPXRoaXMuX2V2ZW50cyxpPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG49aVtlXSxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG49PT10fHxuLmxpc3RlbmVyPT09dCktLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTooZGVsZXRlIGlbZV0saS5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KFwicmVtb3ZlTGlzdGVuZXJcIixlLG4ubGlzdGVuZXJ8fHQpKTtlbHNlIGlmKHR5cGVvZiBuIT1cImZ1bmN0aW9uXCIpe2ZvcihvPS0xLHM9bi5sZW5ndGgtMTtzPj0wO3MtLSlpZihuW3NdPT09dHx8bltzXS5saXN0ZW5lcj09PXQpe2E9bltzXS5saXN0ZW5lcixvPXM7YnJlYWt9aWYobzwwKXJldHVybiB0aGlzO289PT0wP24uc2hpZnQoKTppdShuLG8pLG4ubGVuZ3RoPT09MSYmKGlbZV09blswXSksaS5yZW1vdmVMaXN0ZW5lciE9PXZvaWQgMCYmdGhpcy5lbWl0KFwicmVtb3ZlTGlzdGVuZXJcIixlLGF8fHQpfXJldHVybiB0aGlzfTtNLnByb3RvdHlwZS5vZmY9TS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7TS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3ZhciB0LG4saTtpZihuPXRoaXMuX2V2ZW50cyxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG4ucmVtb3ZlTGlzdGVuZXI9PT12b2lkIDApcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wPyh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKTpuW2VdIT09dm9pZCAwJiYoLS10aGlzLl9ldmVudHNDb3VudD09PTA/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6ZGVsZXRlIG5bZV0pLHRoaXM7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe3ZhciBvPU9iamVjdC5rZXlzKG4pLHM7Zm9yKGk9MDtpPG8ubGVuZ3RoOysraSlzPW9baV0scyE9PVwicmVtb3ZlTGlzdGVuZXJcIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMocyk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKFwicmVtb3ZlTGlzdGVuZXJcIiksdGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fZXZlbnRzQ291bnQ9MCx0aGlzfWlmKHQ9bltlXSx0eXBlb2YgdD09XCJmdW5jdGlvblwiKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSx0KTtlbHNlIGlmKHQhPT12b2lkIDApZm9yKGk9dC5sZW5ndGgtMTtpPj0wO2ktLSl0aGlzLnJlbW92ZUxpc3RlbmVyKGUsdFtpXSk7cmV0dXJuIHRoaXN9O2Z1bmN0aW9uIEtpKHIsZSx0KXt2YXIgbj1yLl9ldmVudHM7aWYobj09PXZvaWQgMClyZXR1cm5bXTt2YXIgaT1uW2VdO3JldHVybiBpPT09dm9pZCAwP1tdOnR5cGVvZiBpPT1cImZ1bmN0aW9uXCI/dD9baS5saXN0ZW5lcnx8aV06W2ldOnQ/b3UoaSk6SmkoaSxpLmxlbmd0aCl9TS5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybiBLaSh0aGlzLGUsITApfTtNLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIEtpKHRoaXMsZSwhMSl9O00ubGlzdGVuZXJDb3VudD1mdW5jdGlvbihyLGUpe3JldHVybiB0eXBlb2Ygci5saXN0ZW5lckNvdW50PT1cImZ1bmN0aW9uXCI/ci5saXN0ZW5lckNvdW50KGUpOlhpLmNhbGwocixlKX07TS5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1YaTtmdW5jdGlvbiBYaShyKXt2YXIgZT10aGlzLl9ldmVudHM7aWYoZSE9PXZvaWQgMCl7dmFyIHQ9ZVtyXTtpZih0eXBlb2YgdD09XCJmdW5jdGlvblwiKXJldHVybiAxO2lmKHQhPT12b2lkIDApcmV0dXJuIHQubGVuZ3RofXJldHVybiAwfU0ucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9xdCh0aGlzLl9ldmVudHMpOltdfTtmdW5jdGlvbiBKaShyLGUpe2Zvcih2YXIgdD1uZXcgQXJyYXkoZSksbj0wO248ZTsrK24pdFtuXT1yW25dO3JldHVybiB0fWZ1bmN0aW9uIGl1KHIsZSl7Zm9yKDtlKzE8ci5sZW5ndGg7ZSsrKXJbZV09cltlKzFdO3IucG9wKCl9ZnVuY3Rpb24gb3Uocil7Zm9yKHZhciBlPW5ldyBBcnJheShyLmxlbmd0aCksdD0wO3Q8ZS5sZW5ndGg7Kyt0KWVbdF09clt0XS5saXN0ZW5lcnx8clt0XTtyZXR1cm4gZX1mdW5jdGlvbiBzdShyLGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGkoKXtvIT09dm9pZCAwJiZyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIixvKSx0KFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9dmFyIG87ZSE9PVwiZXJyb3JcIiYmKG89ZnVuY3Rpb24oYSl7ci5yZW1vdmVMaXN0ZW5lcihlLGkpLG4oYSl9LHIub25jZShcImVycm9yXCIsbykpLHIub25jZShlLGkpfSl9fSk7dmFyIGZuPVMoKGhsLFFpKT0+e2MoKTtRaS5leHBvcnRzPXVuKCkuRXZlbnRFbWl0dGVyfSk7dmFyIGNuPVMoKCk9PntjKCl9KTt2YXIgcm89UygoeWwsdG8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO2Z1bmN0aW9uIFppKHIsZSl7dmFyIHQ9T2JqZWN0LmtleXMocik7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyKTtlJiYobj1uLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGkpLmVudW1lcmFibGV9KSksdC5wdXNoLmFwcGx5KHQsbil9cmV0dXJuIHR9ZnVuY3Rpb24gYXUocil7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIHQ9YXJndW1lbnRzW2VdIT1udWxsP2FyZ3VtZW50c1tlXTp7fTtlJTI/WmkoT2JqZWN0KHQpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3V1KHIsbix0W25dKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHIsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpOlppKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbihuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkocixuLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKSl9KX1yZXR1cm4gcn1mdW5jdGlvbiB1dShyLGUsdCl7cmV0dXJuIGUgaW4gcj9PYmplY3QuZGVmaW5lUHJvcGVydHkocixlLHt2YWx1ZTp0LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6cltlXT10LHJ9ZnVuY3Rpb24gZnUocixlKXtpZighKHIgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIGVvKHIsZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLG4ua2V5LG4pfX1mdW5jdGlvbiBjdShyLGUsdCl7cmV0dXJuIGUmJmVvKHIucHJvdG90eXBlLGUpLHQmJmVvKHIsdCkscn12YXIgbHU9WGUoKSxXdD1sdS5CdWZmZXIsZHU9Y24oKSxsbj1kdS5pbnNwZWN0LHB1PWxuJiZsbi5jdXN0b218fFwiaW5zcGVjdFwiO2Z1bmN0aW9uIGh1KHIsZSx0KXtXdC5wcm90b3R5cGUuY29weS5jYWxsKHIsZSx0KX10by5leHBvcnRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcigpe2Z1KHRoaXMsciksdGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH1yZXR1cm4gY3Uocixbe2tleTpcInB1c2hcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgbj17ZGF0YTp0LG5leHQ6bnVsbH07dGhpcy5sZW5ndGg+MD90aGlzLnRhaWwubmV4dD1uOnRoaXMuaGVhZD1uLHRoaXMudGFpbD1uLCsrdGhpcy5sZW5ndGh9fSx7a2V5OlwidW5zaGlmdFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBuPXtkYXRhOnQsbmV4dDp0aGlzLmhlYWR9O3RoaXMubGVuZ3RoPT09MCYmKHRoaXMudGFpbD1uKSx0aGlzLmhlYWQ9biwrK3RoaXMubGVuZ3RofX0se2tleTpcInNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmxlbmd0aCE9PTApe3ZhciB0PXRoaXMuaGVhZC5kYXRhO3JldHVybiB0aGlzLmxlbmd0aD09PTE/dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsOnRoaXMuaGVhZD10aGlzLmhlYWQubmV4dCwtLXRoaXMubGVuZ3RoLHR9fX0se2tleTpcImNsZWFyXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH19LHtrZXk6XCJqb2luXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5sZW5ndGg9PT0wKXJldHVyblwiXCI7Zm9yKHZhciBuPXRoaXMuaGVhZCxpPVwiXCIrbi5kYXRhO249bi5uZXh0OylpKz10K24uZGF0YTtyZXR1cm4gaX19LHtrZXk6XCJjb25jYXRcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0aGlzLmxlbmd0aD09PTApcmV0dXJuIFd0LmFsbG9jKDApO2Zvcih2YXIgbj1XdC5hbGxvY1Vuc2FmZSh0Pj4+MCksaT10aGlzLmhlYWQsbz0wO2k7KWh1KGkuZGF0YSxuLG8pLG8rPWkuZGF0YS5sZW5ndGgsaT1pLm5leHQ7cmV0dXJuIG59fSx7a2V5OlwiY29uc3VtZVwiLHZhbHVlOmZ1bmN0aW9uKHQsbil7dmFyIGk7cmV0dXJuIHQ8dGhpcy5oZWFkLmRhdGEubGVuZ3RoPyhpPXRoaXMuaGVhZC5kYXRhLnNsaWNlKDAsdCksdGhpcy5oZWFkLmRhdGE9dGhpcy5oZWFkLmRhdGEuc2xpY2UodCkpOnQ9PT10aGlzLmhlYWQuZGF0YS5sZW5ndGg/aT10aGlzLnNoaWZ0KCk6aT1uP3RoaXMuX2dldFN0cmluZyh0KTp0aGlzLl9nZXRCdWZmZXIodCksaX19LHtrZXk6XCJmaXJzdFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVhZC5kYXRhfX0se2tleTpcIl9nZXRTdHJpbmdcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLmhlYWQsaT0xLG89bi5kYXRhO2Zvcih0LT1vLmxlbmd0aDtuPW4ubmV4dDspe3ZhciBzPW4uZGF0YSxhPXQ+cy5sZW5ndGg/cy5sZW5ndGg6dDtpZihhPT09cy5sZW5ndGg/bys9czpvKz1zLnNsaWNlKDAsdCksdC09YSx0PT09MCl7YT09PXMubGVuZ3RoPygrK2ksbi5uZXh0P3RoaXMuaGVhZD1uLm5leHQ6dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsKToodGhpcy5oZWFkPW4sbi5kYXRhPXMuc2xpY2UoYSkpO2JyZWFrfSsraX1yZXR1cm4gdGhpcy5sZW5ndGgtPWksb319LHtrZXk6XCJfZ2V0QnVmZmVyXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIG49V3QuYWxsb2NVbnNhZmUodCksaT10aGlzLmhlYWQsbz0xO2ZvcihpLmRhdGEuY29weShuKSx0LT1pLmRhdGEubGVuZ3RoO2k9aS5uZXh0Oyl7dmFyIHM9aS5kYXRhLGE9dD5zLmxlbmd0aD9zLmxlbmd0aDp0O2lmKHMuY29weShuLG4ubGVuZ3RoLXQsMCxhKSx0LT1hLHQ9PT0wKXthPT09cy5sZW5ndGg/KCsrbyxpLm5leHQ/dGhpcy5oZWFkPWkubmV4dDp0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwpOih0aGlzLmhlYWQ9aSxpLmRhdGE9cy5zbGljZShhKSk7YnJlYWt9KytvfXJldHVybiB0aGlzLmxlbmd0aC09byxufX0se2tleTpwdSx2YWx1ZTpmdW5jdGlvbih0LG4pe3JldHVybiBsbih0aGlzLGF1KHt9LG4se2RlcHRoOjAsY3VzdG9tSW5zcGVjdDohMX0pKX19XSkscn0oKX0pO3ZhciBwbj1TKChibCxpbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7ZnVuY3Rpb24gbXUocixlKXt2YXIgdD10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQsaT10aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtyZXR1cm4gbnx8aT8oZT9lKHIpOnImJih0aGlzLl93cml0YWJsZVN0YXRlP3RoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkfHwodGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAscHJvY2Vzcy5uZXh0VGljayhkbix0aGlzLHIpKTpwcm9jZXNzLm5leHRUaWNrKGRuLHRoaXMscikpLHRoaXMpOih0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMCksdGhpcy5fZGVzdHJveShyfHxudWxsLGZ1bmN0aW9uKG8peyFlJiZvP3QuX3dyaXRhYmxlU3RhdGU/dC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ/cHJvY2Vzcy5uZXh0VGljaygkdCx0KToodC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAscHJvY2Vzcy5uZXh0VGljayhubyx0LG8pKTpwcm9jZXNzLm5leHRUaWNrKG5vLHQsbyk6ZT8ocHJvY2Vzcy5uZXh0VGljaygkdCx0KSxlKG8pKTpwcm9jZXNzLm5leHRUaWNrKCR0LHQpfSksdGhpcyl9ZnVuY3Rpb24gbm8ocixlKXtkbihyLGUpLCR0KHIpfWZ1bmN0aW9uICR0KHIpe3IuX3dyaXRhYmxlU3RhdGUmJiFyLl93cml0YWJsZVN0YXRlLmVtaXRDbG9zZXx8ci5fcmVhZGFibGVTdGF0ZSYmIXIuX3JlYWRhYmxlU3RhdGUuZW1pdENsb3NlfHxyLmVtaXQoXCJjbG9zZVwiKX1mdW5jdGlvbiBndSgpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmc9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQ9ITEpLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluYWxDYWxsZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5wcmVmaW5pc2hlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSExKX1mdW5jdGlvbiBkbihyLGUpe3IuZW1pdChcImVycm9yXCIsZSl9ZnVuY3Rpb24geXUocixlKXt2YXIgdD1yLl9yZWFkYWJsZVN0YXRlLG49ci5fd3JpdGFibGVTdGF0ZTt0JiZ0LmF1dG9EZXN0cm95fHxuJiZuLmF1dG9EZXN0cm95P3IuZGVzdHJveShlKTpyLmVtaXQoXCJlcnJvclwiLGUpfWlvLmV4cG9ydHM9e2Rlc3Ryb3k6bXUsdW5kZXN0cm95Omd1LGVycm9yT3JEZXN0cm95Onl1fX0pO3ZhciBVZT1TKCh4bCxhbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7ZnVuY3Rpb24gYnUocixlKXtyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1yLHIuX19wcm90b19fPWV9dmFyIHNvPXt9O2Z1bmN0aW9uIFgocixlLHQpe3R8fCh0PUVycm9yKTtmdW5jdGlvbiBuKG8scyxhKXtyZXR1cm4gdHlwZW9mIGU9PVwic3RyaW5nXCI/ZTplKG8scyxhKX12YXIgaT1mdW5jdGlvbihvKXtidShzLG8pO2Z1bmN0aW9uIHMoYSx1LGYpe3JldHVybiBvLmNhbGwodGhpcyxuKGEsdSxmKSl8fHRoaXN9cmV0dXJuIHN9KHQpO2kucHJvdG90eXBlLm5hbWU9dC5uYW1lLGkucHJvdG90eXBlLmNvZGU9cixzb1tyXT1pfWZ1bmN0aW9uIG9vKHIsZSl7aWYoQXJyYXkuaXNBcnJheShyKSl7dmFyIHQ9ci5sZW5ndGg7cmV0dXJuIHI9ci5tYXAoZnVuY3Rpb24obil7cmV0dXJuIFN0cmluZyhuKX0pLHQ+Mj9cIm9uZSBvZiBcIi5jb25jYXQoZSxcIiBcIikuY29uY2F0KHIuc2xpY2UoMCx0LTEpLmpvaW4oXCIsIFwiKSxcIiwgb3IgXCIpK3JbdC0xXTp0PT09Mj9cIm9uZSBvZiBcIi5jb25jYXQoZSxcIiBcIikuY29uY2F0KHJbMF0sXCIgb3IgXCIpLmNvbmNhdChyWzFdKTpcIm9mIFwiLmNvbmNhdChlLFwiIFwiKS5jb25jYXQoclswXSl9ZWxzZSByZXR1cm5cIm9mIFwiLmNvbmNhdChlLFwiIFwiKS5jb25jYXQoU3RyaW5nKHIpKX1mdW5jdGlvbiB4dShyLGUsdCl7cmV0dXJuIHIuc3Vic3RyKCF0fHx0PDA/MDordCxlLmxlbmd0aCk9PT1lfWZ1bmN0aW9uIF91KHIsZSx0KXtyZXR1cm4odD09PXZvaWQgMHx8dD5yLmxlbmd0aCkmJih0PXIubGVuZ3RoKSxyLnN1YnN0cmluZyh0LWUubGVuZ3RoLHQpPT09ZX1mdW5jdGlvbiB3dShyLGUsdCl7cmV0dXJuIHR5cGVvZiB0IT1cIm51bWJlclwiJiYodD0wKSx0K2UubGVuZ3RoPnIubGVuZ3RoPyExOnIuaW5kZXhPZihlLHQpIT09LTF9WChcIkVSUl9JTlZBTElEX09QVF9WQUxVRVwiLGZ1bmN0aW9uKHIsZSl7cmV0dXJuJ1RoZSB2YWx1ZSBcIicrZSsnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwiJytyKydcIid9LFR5cGVFcnJvcik7WChcIkVSUl9JTlZBTElEX0FSR19UWVBFXCIsZnVuY3Rpb24ocixlLHQpe3ZhciBuO3R5cGVvZiBlPT1cInN0cmluZ1wiJiZ4dShlLFwibm90IFwiKT8obj1cIm11c3Qgbm90IGJlXCIsZT1lLnJlcGxhY2UoL15ub3QgLyxcIlwiKSk6bj1cIm11c3QgYmVcIjt2YXIgaTtpZihfdShyLFwiIGFyZ3VtZW50XCIpKWk9XCJUaGUgXCIuY29uY2F0KHIsXCIgXCIpLmNvbmNhdChuLFwiIFwiKS5jb25jYXQob28oZSxcInR5cGVcIikpO2Vsc2V7dmFyIG89d3UocixcIi5cIik/XCJwcm9wZXJ0eVwiOlwiYXJndW1lbnRcIjtpPSdUaGUgXCInLmNvbmNhdChyLCdcIiAnKS5jb25jYXQobyxcIiBcIikuY29uY2F0KG4sXCIgXCIpLmNvbmNhdChvbyhlLFwidHlwZVwiKSl9cmV0dXJuIGkrPVwiLiBSZWNlaXZlZCB0eXBlIFwiLmNvbmNhdCh0eXBlb2YgdCksaX0sVHlwZUVycm9yKTtYKFwiRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRlwiLFwic3RyZWFtLnB1c2goKSBhZnRlciBFT0ZcIik7WChcIkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEXCIsZnVuY3Rpb24ocil7cmV0dXJuXCJUaGUgXCIrcitcIiBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkXCJ9KTtYKFwiRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0VcIixcIlByZW1hdHVyZSBjbG9zZVwiKTtYKFwiRVJSX1NUUkVBTV9ERVNUUk9ZRURcIixmdW5jdGlvbihyKXtyZXR1cm5cIkNhbm5vdCBjYWxsIFwiK3IrXCIgYWZ0ZXIgYSBzdHJlYW0gd2FzIGRlc3Ryb3llZFwifSk7WChcIkVSUl9NVUxUSVBMRV9DQUxMQkFDS1wiLFwiQ2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzXCIpO1goXCJFUlJfU1RSRUFNX0NBTk5PVF9QSVBFXCIsXCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlXCIpO1goXCJFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORFwiLFwid3JpdGUgYWZ0ZXIgZW5kXCIpO1goXCJFUlJfU1RSRUFNX05VTExfVkFMVUVTXCIsXCJNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbVwiLFR5cGVFcnJvcik7WChcIkVSUl9VTktOT1dOX0VOQ09ESU5HXCIsZnVuY3Rpb24ocil7cmV0dXJuXCJVbmtub3duIGVuY29kaW5nOiBcIityfSxUeXBlRXJyb3IpO1goXCJFUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UXCIsXCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudFwiKTthby5leHBvcnRzLmNvZGVzPXNvfSk7dmFyIGhuPVMoKF9sLHVvKT0+e1widXNlIHN0cmljdFwiO2MoKTt2YXIgdnU9VWUoKS5jb2Rlcy5FUlJfSU5WQUxJRF9PUFRfVkFMVUU7ZnVuY3Rpb24gRXUocixlLHQpe3JldHVybiByLmhpZ2hXYXRlck1hcmshPW51bGw/ci5oaWdoV2F0ZXJNYXJrOmU/clt0XTpudWxsfWZ1bmN0aW9uIFN1KHIsZSx0LG4pe3ZhciBpPUV1KGUsbix0KTtpZihpIT1udWxsKXtpZighKGlzRmluaXRlKGkpJiZNYXRoLmZsb29yKGkpPT09aSl8fGk8MCl7dmFyIG89bj90OlwiaGlnaFdhdGVyTWFya1wiO3Rocm93IG5ldyB2dShvLGkpfXJldHVybiBNYXRoLmZsb29yKGkpfXJldHVybiByLm9iamVjdE1vZGU/MTY6MTYqMTAyNH11by5leHBvcnRzPXtnZXRIaWdoV2F0ZXJNYXJrOlN1fX0pO3ZhciBjbz1TKCh3bCxmbyk9PntjKCk7Zm8uZXhwb3J0cz1SdTtmdW5jdGlvbiBSdShyLGUpe2lmKG1uKFwibm9EZXByZWNhdGlvblwiKSlyZXR1cm4gcjt2YXIgdD0hMTtmdW5jdGlvbiBuKCl7aWYoIXQpe2lmKG1uKFwidGhyb3dEZXByZWNhdGlvblwiKSl0aHJvdyBuZXcgRXJyb3IoZSk7bW4oXCJ0cmFjZURlcHJlY2F0aW9uXCIpP2NvbnNvbGUudHJhY2UoZSk6Y29uc29sZS53YXJuKGUpLHQ9ITB9cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBufWZ1bmN0aW9uIG1uKHIpe3RyeXtpZighZ2xvYmFsLmxvY2FsU3RvcmFnZSlyZXR1cm4hMX1jYXRjaHtyZXR1cm4hMX12YXIgZT1nbG9iYWwubG9jYWxTdG9yYWdlW3JdO3JldHVybiBlPT1udWxsPyExOlN0cmluZyhlKS50b0xvd2VyQ2FzZSgpPT09XCJ0cnVlXCJ9fSk7dmFyIGJuPVMoKHZsLHlvKT0+e1widXNlIHN0cmljdFwiO2MoKTt5by5leHBvcnRzPUY7ZnVuY3Rpb24gcG8ocil7dmFyIGU9dGhpczt0aGlzLm5leHQ9bnVsbCx0aGlzLmVudHJ5PW51bGwsdGhpcy5maW5pc2g9ZnVuY3Rpb24oKXtRdShlLHIpfX12YXIgZXQ7Ri5Xcml0YWJsZVN0YXRlPUV0O3ZhciBUdT17ZGVwcmVjYXRlOmNvKCl9LGhvPWZuKCksVnQ9WGUoKS5CdWZmZXIsQ3U9Z2xvYmFsLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBCdShyKXtyZXR1cm4gVnQuZnJvbShyKX1mdW5jdGlvbiBNdShyKXtyZXR1cm4gVnQuaXNCdWZmZXIocil8fHIgaW5zdGFuY2VvZiBDdX12YXIgeW49cG4oKSxMdT1obigpLEl1PUx1LmdldEhpZ2hXYXRlck1hcmsseGU9VWUoKS5jb2RlcyxBdT14ZS5FUlJfSU5WQUxJRF9BUkdfVFlQRSxGdT14ZS5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxQdT14ZS5FUlJfTVVMVElQTEVfQ0FMTEJBQ0ssa3U9eGUuRVJSX1NUUkVBTV9DQU5OT1RfUElQRSxPdT14ZS5FUlJfU1RSRUFNX0RFU1RST1lFRCxVdT14ZS5FUlJfU1RSRUFNX05VTExfVkFMVUVTLER1PXhlLkVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5ELE51PXhlLkVSUl9VTktOT1dOX0VOQ09ESU5HLHR0PXluLmVycm9yT3JEZXN0cm95O09lKCkoRixobyk7ZnVuY3Rpb24gSHUoKXt9ZnVuY3Rpb24gRXQocixlLHQpe2V0PWV0fHxEZSgpLHI9cnx8e30sdHlwZW9mIHQhPVwiYm9vbGVhblwiJiYodD1lIGluc3RhbmNlb2YgZXQpLHRoaXMub2JqZWN0TW9kZT0hIXIub2JqZWN0TW9kZSx0JiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISFyLndyaXRhYmxlT2JqZWN0TW9kZSksdGhpcy5oaWdoV2F0ZXJNYXJrPUl1KHRoaXMscixcIndyaXRhYmxlSGlnaFdhdGVyTWFya1wiLHQpLHRoaXMuZmluYWxDYWxsZWQ9ITEsdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExLHRoaXMuZGVzdHJveWVkPSExO3ZhciBuPXIuZGVjb2RlU3RyaW5ncz09PSExO3RoaXMuZGVjb2RlU3RyaW5ncz0hbix0aGlzLmRlZmF1bHRFbmNvZGluZz1yLmRlZmF1bHRFbmNvZGluZ3x8XCJ1dGY4XCIsdGhpcy5sZW5ndGg9MCx0aGlzLndyaXRpbmc9ITEsdGhpcy5jb3JrZWQ9MCx0aGlzLnN5bmM9ITAsdGhpcy5idWZmZXJQcm9jZXNzaW5nPSExLHRoaXMub253cml0ZT1mdW5jdGlvbihpKXt6dShlLGkpfSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlbGVuPTAsdGhpcy5idWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLnBlbmRpbmdjYj0wLHRoaXMucHJlZmluaXNoZWQ9ITEsdGhpcy5lcnJvckVtaXR0ZWQ9ITEsdGhpcy5lbWl0Q2xvc2U9ci5lbWl0Q2xvc2UhPT0hMSx0aGlzLmF1dG9EZXN0cm95PSEhci5hdXRvRGVzdHJveSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IHBvKHRoaXMpfUV0LnByb3RvdHlwZS5nZXRCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5idWZmZXJlZFJlcXVlc3QsdD1bXTtlOyl0LnB1c2goZSksZT1lLm5leHQ7cmV0dXJuIHR9OyhmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoRXQucHJvdG90eXBlLFwiYnVmZmVyXCIse2dldDpUdS5kZXByZWNhdGUoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCdWZmZXIoKX0sXCJfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciBpbnN0ZWFkLlwiLFwiREVQMDAwM1wiKX0pfWNhdGNoe319KSgpO3ZhciBHdDt0eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJlN5bWJvbC5oYXNJbnN0YW5jZSYmdHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdPT1cImZ1bmN0aW9uXCI/KEd0PUZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGLFN5bWJvbC5oYXNJbnN0YW5jZSx7dmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEd0LmNhbGwodGhpcyxlKT8hMDp0aGlzIT09Rj8hMTplJiZlLl93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgRXR9fSkpOkd0PWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdGhpc307ZnVuY3Rpb24gRihyKXtldD1ldHx8RGUoKTt2YXIgZT10aGlzIGluc3RhbmNlb2YgZXQ7aWYoIWUmJiFHdC5jYWxsKEYsdGhpcykpcmV0dXJuIG5ldyBGKHIpO3RoaXMuX3dyaXRhYmxlU3RhdGU9bmV3IEV0KHIsdGhpcyxlKSx0aGlzLndyaXRhYmxlPSEwLHImJih0eXBlb2Ygci53cml0ZT09XCJmdW5jdGlvblwiJiYodGhpcy5fd3JpdGU9ci53cml0ZSksdHlwZW9mIHIud3JpdGV2PT1cImZ1bmN0aW9uXCImJih0aGlzLl93cml0ZXY9ci53cml0ZXYpLHR5cGVvZiByLmRlc3Ryb3k9PVwiZnVuY3Rpb25cIiYmKHRoaXMuX2Rlc3Ryb3k9ci5kZXN0cm95KSx0eXBlb2Ygci5maW5hbD09XCJmdW5jdGlvblwiJiYodGhpcy5fZmluYWw9ci5maW5hbCkpLGhvLmNhbGwodGhpcyl9Ri5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe3R0KHRoaXMsbmV3IGt1KX07ZnVuY3Rpb24gcXUocixlKXt2YXIgdD1uZXcgRHU7dHQocix0KSxwcm9jZXNzLm5leHRUaWNrKGUsdCl9ZnVuY3Rpb24ganUocixlLHQsbil7dmFyIGk7cmV0dXJuIHQ9PT1udWxsP2k9bmV3IFV1OnR5cGVvZiB0IT1cInN0cmluZ1wiJiYhZS5vYmplY3RNb2RlJiYoaT1uZXcgQXUoXCJjaHVua1wiLFtcInN0cmluZ1wiLFwiQnVmZmVyXCJdLHQpKSxpPyh0dChyLGkpLHByb2Nlc3MubmV4dFRpY2sobixpKSwhMSk6ITB9Ri5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24ocixlLHQpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGUsaT0hMSxvPSFuLm9iamVjdE1vZGUmJk11KHIpO3JldHVybiBvJiYhVnQuaXNCdWZmZXIocikmJihyPUJ1KHIpKSx0eXBlb2YgZT09XCJmdW5jdGlvblwiJiYodD1lLGU9bnVsbCksbz9lPVwiYnVmZmVyXCI6ZXx8KGU9bi5kZWZhdWx0RW5jb2RpbmcpLHR5cGVvZiB0IT1cImZ1bmN0aW9uXCImJih0PUh1KSxuLmVuZGluZz9xdSh0aGlzLHQpOihvfHxqdSh0aGlzLG4scix0KSkmJihuLnBlbmRpbmdjYisrLGk9JHUodGhpcyxuLG8scixlLHQpKSxpfTtGLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK307Ri5wcm90b3R5cGUudW5jb3JrPWZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5fd3JpdGFibGVTdGF0ZTtyLmNvcmtlZCYmKHIuY29ya2VkLS0sIXIud3JpdGluZyYmIXIuY29ya2VkJiYhci5idWZmZXJQcm9jZXNzaW5nJiZyLmJ1ZmZlcmVkUmVxdWVzdCYmbW8odGhpcyxyKSl9O0YucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09XCJzdHJpbmdcIiYmKGU9ZS50b0xvd2VyQ2FzZSgpKSwhKFtcImhleFwiLFwidXRmOFwiLFwidXRmLThcIixcImFzY2lpXCIsXCJiaW5hcnlcIixcImJhc2U2NFwiLFwidWNzMlwiLFwidWNzLTJcIixcInV0ZjE2bGVcIixcInV0Zi0xNmxlXCIsXCJyYXdcIl0uaW5kZXhPZigoZStcIlwiKS50b0xvd2VyQ2FzZSgpKT4tMSkpdGhyb3cgbmV3IE51KGUpO3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZz1lLHRoaXN9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShGLnByb3RvdHlwZSxcIndyaXRhYmxlQnVmZmVyXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCl9fSk7ZnVuY3Rpb24gV3UocixlLHQpe3JldHVybiFyLm9iamVjdE1vZGUmJnIuZGVjb2RlU3RyaW5ncyE9PSExJiZ0eXBlb2YgZT09XCJzdHJpbmdcIiYmKGU9VnQuZnJvbShlLHQpKSxlfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShGLnByb3RvdHlwZSxcIndyaXRhYmxlSGlnaFdhdGVyTWFya1wiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSk7ZnVuY3Rpb24gJHUocixlLHQsbixpLG8pe2lmKCF0KXt2YXIgcz1XdShlLG4saSk7biE9PXMmJih0PSEwLGk9XCJidWZmZXJcIixuPXMpfXZhciBhPWUub2JqZWN0TW9kZT8xOm4ubGVuZ3RoO2UubGVuZ3RoKz1hO3ZhciB1PWUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyaztpZih1fHwoZS5uZWVkRHJhaW49ITApLGUud3JpdGluZ3x8ZS5jb3JrZWQpe3ZhciBmPWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9e2NodW5rOm4sZW5jb2Rpbmc6aSxpc0J1Zjp0LGNhbGxiYWNrOm8sbmV4dDpudWxsfSxmP2YubmV4dD1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q6ZS5idWZmZXJlZFJlcXVlc3Q9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBnbihyLGUsITEsYSxuLGksbyk7cmV0dXJuIHV9ZnVuY3Rpb24gZ24ocixlLHQsbixpLG8scyl7ZS53cml0ZWxlbj1uLGUud3JpdGVjYj1zLGUud3JpdGluZz0hMCxlLnN5bmM9ITAsZS5kZXN0cm95ZWQ/ZS5vbndyaXRlKG5ldyBPdShcIndyaXRlXCIpKTp0P3IuX3dyaXRldihpLGUub253cml0ZSk6ci5fd3JpdGUoaSxvLGUub253cml0ZSksZS5zeW5jPSExfWZ1bmN0aW9uIEd1KHIsZSx0LG4saSl7LS1lLnBlbmRpbmdjYix0Pyhwcm9jZXNzLm5leHRUaWNrKGksbikscHJvY2Vzcy5uZXh0VGljayh2dCxyLGUpLHIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHR0KHIsbikpOihpKG4pLHIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHR0KHIsbiksdnQocixlKSl9ZnVuY3Rpb24gVnUocil7ci53cml0aW5nPSExLHIud3JpdGVjYj1udWxsLHIubGVuZ3RoLT1yLndyaXRlbGVuLHIud3JpdGVsZW49MH1mdW5jdGlvbiB6dShyLGUpe3ZhciB0PXIuX3dyaXRhYmxlU3RhdGUsbj10LnN5bmMsaT10LndyaXRlY2I7aWYodHlwZW9mIGkhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgUHU7aWYoVnUodCksZSlHdShyLHQsbixlLGkpO2Vsc2V7dmFyIG89Z28odCl8fHIuZGVzdHJveWVkOyFvJiYhdC5jb3JrZWQmJiF0LmJ1ZmZlclByb2Nlc3NpbmcmJnQuYnVmZmVyZWRSZXF1ZXN0JiZtbyhyLHQpLG4/cHJvY2Vzcy5uZXh0VGljayhsbyxyLHQsbyxpKTpsbyhyLHQsbyxpKX19ZnVuY3Rpb24gbG8ocixlLHQsbil7dHx8WXUocixlKSxlLnBlbmRpbmdjYi0tLG4oKSx2dChyLGUpfWZ1bmN0aW9uIFl1KHIsZSl7ZS5sZW5ndGg9PT0wJiZlLm5lZWREcmFpbiYmKGUubmVlZERyYWluPSExLHIuZW1pdChcImRyYWluXCIpKX1mdW5jdGlvbiBtbyhyLGUpe2UuYnVmZmVyUHJvY2Vzc2luZz0hMDt2YXIgdD1lLmJ1ZmZlcmVkUmVxdWVzdDtpZihyLl93cml0ZXYmJnQmJnQubmV4dCl7dmFyIG49ZS5idWZmZXJlZFJlcXVlc3RDb3VudCxpPW5ldyBBcnJheShuKSxvPWUuY29ya2VkUmVxdWVzdHNGcmVlO28uZW50cnk9dDtmb3IodmFyIHM9MCxhPSEwO3Q7KWlbc109dCx0LmlzQnVmfHwoYT0hMSksdD10Lm5leHQscys9MTtpLmFsbEJ1ZmZlcnM9YSxnbihyLGUsITAsZS5sZW5ndGgsaSxcIlwiLG8uZmluaXNoKSxlLnBlbmRpbmdjYisrLGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLG8ubmV4dD8oZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9by5uZXh0LG8ubmV4dD1udWxsKTplLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgcG8oZSksZS5idWZmZXJlZFJlcXVlc3RDb3VudD0wfWVsc2V7Zm9yKDt0Oyl7dmFyIHU9dC5jaHVuayxmPXQuZW5jb2RpbmcsbD10LmNhbGxiYWNrLGQ9ZS5vYmplY3RNb2RlPzE6dS5sZW5ndGg7aWYoZ24ocixlLCExLGQsdSxmLGwpLHQ9dC5uZXh0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLSxlLndyaXRpbmcpYnJlYWt9dD09PW51bGwmJihlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCl9ZS5idWZmZXJlZFJlcXVlc3Q9dCxlLmJ1ZmZlclByb2Nlc3Npbmc9ITF9Ri5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHIsZSx0KXt0KG5ldyBGdShcIl93cml0ZSgpXCIpKX07Ri5wcm90b3R5cGUuX3dyaXRldj1udWxsO0YucHJvdG90eXBlLmVuZD1mdW5jdGlvbihyLGUsdCl7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZTtyZXR1cm4gdHlwZW9mIHI9PVwiZnVuY3Rpb25cIj8odD1yLHI9bnVsbCxlPW51bGwpOnR5cGVvZiBlPT1cImZ1bmN0aW9uXCImJih0PWUsZT1udWxsKSxyIT1udWxsJiZ0aGlzLndyaXRlKHIsZSksbi5jb3JrZWQmJihuLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLG4uZW5kaW5nfHxKdSh0aGlzLG4sdCksdGhpc307T2JqZWN0LmRlZmluZVByb3BlcnR5KEYucHJvdG90eXBlLFwid3JpdGFibGVMZW5ndGhcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGh9fSk7ZnVuY3Rpb24gZ28ocil7cmV0dXJuIHIuZW5kaW5nJiZyLmxlbmd0aD09PTAmJnIuYnVmZmVyZWRSZXF1ZXN0PT09bnVsbCYmIXIuZmluaXNoZWQmJiFyLndyaXRpbmd9ZnVuY3Rpb24gS3UocixlKXtyLl9maW5hbChmdW5jdGlvbih0KXtlLnBlbmRpbmdjYi0tLHQmJnR0KHIsdCksZS5wcmVmaW5pc2hlZD0hMCxyLmVtaXQoXCJwcmVmaW5pc2hcIiksdnQocixlKX0pfWZ1bmN0aW9uIFh1KHIsZSl7IWUucHJlZmluaXNoZWQmJiFlLmZpbmFsQ2FsbGVkJiYodHlwZW9mIHIuX2ZpbmFsPT1cImZ1bmN0aW9uXCImJiFlLmRlc3Ryb3llZD8oZS5wZW5kaW5nY2IrKyxlLmZpbmFsQ2FsbGVkPSEwLHByb2Nlc3MubmV4dFRpY2soS3UscixlKSk6KGUucHJlZmluaXNoZWQ9ITAsci5lbWl0KFwicHJlZmluaXNoXCIpKSl9ZnVuY3Rpb24gdnQocixlKXt2YXIgdD1nbyhlKTtpZih0JiYoWHUocixlKSxlLnBlbmRpbmdjYj09PTAmJihlLmZpbmlzaGVkPSEwLHIuZW1pdChcImZpbmlzaFwiKSxlLmF1dG9EZXN0cm95KSkpe3ZhciBuPXIuX3JlYWRhYmxlU3RhdGU7KCFufHxuLmF1dG9EZXN0cm95JiZuLmVuZEVtaXR0ZWQpJiZyLmRlc3Ryb3koKX1yZXR1cm4gdH1mdW5jdGlvbiBKdShyLGUsdCl7ZS5lbmRpbmc9ITAsdnQocixlKSx0JiYoZS5maW5pc2hlZD9wcm9jZXNzLm5leHRUaWNrKHQpOnIub25jZShcImZpbmlzaFwiLHQpKSxlLmVuZGVkPSEwLHIud3JpdGFibGU9ITF9ZnVuY3Rpb24gUXUocixlLHQpe3ZhciBuPXIuZW50cnk7Zm9yKHIuZW50cnk9bnVsbDtuOyl7dmFyIGk9bi5jYWxsYmFjaztlLnBlbmRpbmdjYi0tLGkodCksbj1uLm5leHR9ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1yfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShGLnByb3RvdHlwZSxcImRlc3Ryb3llZFwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlPT09dm9pZCAwPyExOnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24oZSl7IXRoaXMuX3dyaXRhYmxlU3RhdGV8fCh0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD1lKX19KTtGLnByb3RvdHlwZS5kZXN0cm95PXluLmRlc3Ryb3k7Ri5wcm90b3R5cGUuX3VuZGVzdHJveT15bi51bmRlc3Ryb3k7Ri5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24ocixlKXtlKHIpfX0pO3ZhciBEZT1TKChFbCx4byk9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFp1PU9iamVjdC5rZXlzfHxmdW5jdGlvbihyKXt2YXIgZT1bXTtmb3IodmFyIHQgaW4gcillLnB1c2godCk7cmV0dXJuIGV9O3hvLmV4cG9ydHM9YWU7dmFyIGJvPXduKCksX249Ym4oKTtPZSgpKGFlLGJvKTtmb3IoeG49WnUoX24ucHJvdG90eXBlKSx6dD0wO3p0PHhuLmxlbmd0aDt6dCsrKVl0PXhuW3p0XSxhZS5wcm90b3R5cGVbWXRdfHwoYWUucHJvdG90eXBlW1l0XT1fbi5wcm90b3R5cGVbWXRdKTt2YXIgeG4sWXQsenQ7ZnVuY3Rpb24gYWUocil7aWYoISh0aGlzIGluc3RhbmNlb2YgYWUpKXJldHVybiBuZXcgYWUocik7Ym8uY2FsbCh0aGlzLHIpLF9uLmNhbGwodGhpcyxyKSx0aGlzLmFsbG93SGFsZk9wZW49ITAsciYmKHIucmVhZGFibGU9PT0hMSYmKHRoaXMucmVhZGFibGU9ITEpLHIud3JpdGFibGU9PT0hMSYmKHRoaXMud3JpdGFibGU9ITEpLHIuYWxsb3dIYWxmT3Blbj09PSExJiYodGhpcy5hbGxvd0hhbGZPcGVuPSExLHRoaXMub25jZShcImVuZFwiLGVmKSkpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhZS5wcm90b3R5cGUsXCJ3cml0YWJsZUhpZ2hXYXRlck1hcmtcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhZS5wcm90b3R5cGUsXCJ3cml0YWJsZUJ1ZmZlclwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmdldEJ1ZmZlcigpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhZS5wcm90b3R5cGUsXCJ3cml0YWJsZUxlbmd0aFwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmxlbmd0aH19KTtmdW5jdGlvbiBlZigpe3RoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fHByb2Nlc3MubmV4dFRpY2sodGYsdGhpcyl9ZnVuY3Rpb24gdGYocil7ci5lbmQoKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoYWUucHJvdG90eXBlLFwiZGVzdHJveWVkXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGU9PT12b2lkIDB8fHRoaXMuX3dyaXRhYmxlU3RhdGU9PT12b2lkIDA/ITE6dGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fcmVhZGFibGVTdGF0ZT09PXZvaWQgMHx8dGhpcy5fd3JpdGFibGVTdGF0ZT09PXZvaWQgMHx8KHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPWUsdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ZSl9fSl9KTt2YXIgdm89Uygodm4sd28pPT57YygpO3ZhciBLdD1YZSgpLHVlPUt0LkJ1ZmZlcjtmdW5jdGlvbiBfbyhyLGUpe2Zvcih2YXIgdCBpbiByKWVbdF09clt0XX11ZS5mcm9tJiZ1ZS5hbGxvYyYmdWUuYWxsb2NVbnNhZmUmJnVlLmFsbG9jVW5zYWZlU2xvdz93by5leHBvcnRzPUt0OihfbyhLdCx2biksdm4uQnVmZmVyPU5lKTtmdW5jdGlvbiBOZShyLGUsdCl7cmV0dXJuIHVlKHIsZSx0KX1OZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh1ZS5wcm90b3R5cGUpO19vKHVlLE5lKTtOZS5mcm9tPWZ1bmN0aW9uKHIsZSx0KXtpZih0eXBlb2Ygcj09XCJudW1iZXJcIil0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXJcIik7cmV0dXJuIHVlKHIsZSx0KX07TmUuYWxsb2M9ZnVuY3Rpb24ocixlLHQpe2lmKHR5cGVvZiByIT1cIm51bWJlclwiKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyXCIpO3ZhciBuPXVlKHIpO3JldHVybiBlIT09dm9pZCAwP3R5cGVvZiB0PT1cInN0cmluZ1wiP24uZmlsbChlLHQpOm4uZmlsbChlKTpuLmZpbGwoMCksbn07TmUuYWxsb2NVbnNhZmU9ZnVuY3Rpb24ocil7aWYodHlwZW9mIHIhPVwibnVtYmVyXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXJcIik7cmV0dXJuIHVlKHIpfTtOZS5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24ocil7aWYodHlwZW9mIHIhPVwibnVtYmVyXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXJcIik7cmV0dXJuIEt0LlNsb3dCdWZmZXIocil9fSk7dmFyIFJuPVMoU289PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFNuPXZvKCkuQnVmZmVyLEVvPVNuLmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKHIpe3N3aXRjaChyPVwiXCIrcixyJiZyLnRvTG93ZXJDYXNlKCkpe2Nhc2VcImhleFwiOmNhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOmNhc2VcImFzY2lpXCI6Y2FzZVwiYmluYXJ5XCI6Y2FzZVwiYmFzZTY0XCI6Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6Y2FzZVwicmF3XCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19O2Z1bmN0aW9uIHJmKHIpe2lmKCFyKXJldHVyblwidXRmOFwiO2Zvcih2YXIgZTs7KXN3aXRjaChyKXtjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpyZXR1cm5cInV0ZjhcIjtjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpyZXR1cm5cInV0ZjE2bGVcIjtjYXNlXCJsYXRpbjFcIjpjYXNlXCJiaW5hcnlcIjpyZXR1cm5cImxhdGluMVwiO2Nhc2VcImJhc2U2NFwiOmNhc2VcImFzY2lpXCI6Y2FzZVwiaGV4XCI6cmV0dXJuIHI7ZGVmYXVsdDppZihlKXJldHVybjtyPShcIlwiK3IpLnRvTG93ZXJDYXNlKCksZT0hMH19ZnVuY3Rpb24gbmYocil7dmFyIGU9cmYocik7aWYodHlwZW9mIGUhPVwic3RyaW5nXCImJihTbi5pc0VuY29kaW5nPT09RW98fCFFbyhyKSkpdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIrcik7cmV0dXJuIGV8fHJ9U28uU3RyaW5nRGVjb2Rlcj1TdDtmdW5jdGlvbiBTdChyKXt0aGlzLmVuY29kaW5nPW5mKHIpO3ZhciBlO3N3aXRjaCh0aGlzLmVuY29kaW5nKXtjYXNlXCJ1dGYxNmxlXCI6dGhpcy50ZXh0PWNmLHRoaXMuZW5kPWxmLGU9NDticmVhaztjYXNlXCJ1dGY4XCI6dGhpcy5maWxsTGFzdD1hZixlPTQ7YnJlYWs7Y2FzZVwiYmFzZTY0XCI6dGhpcy50ZXh0PWRmLHRoaXMuZW5kPXBmLGU9MzticmVhaztkZWZhdWx0OnRoaXMud3JpdGU9aGYsdGhpcy5lbmQ9bWY7cmV0dXJufXRoaXMubGFzdE5lZWQ9MCx0aGlzLmxhc3RUb3RhbD0wLHRoaXMubGFzdENoYXI9U24uYWxsb2NVbnNhZmUoZSl9U3QucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHIpe2lmKHIubGVuZ3RoPT09MClyZXR1cm5cIlwiO3ZhciBlLHQ7aWYodGhpcy5sYXN0TmVlZCl7aWYoZT10aGlzLmZpbGxMYXN0KHIpLGU9PT12b2lkIDApcmV0dXJuXCJcIjt0PXRoaXMubGFzdE5lZWQsdGhpcy5sYXN0TmVlZD0wfWVsc2UgdD0wO3JldHVybiB0PHIubGVuZ3RoP2U/ZSt0aGlzLnRleHQocix0KTp0aGlzLnRleHQocix0KTplfHxcIlwifTtTdC5wcm90b3R5cGUuZW5kPWZmO1N0LnByb3RvdHlwZS50ZXh0PXVmO1N0LnByb3RvdHlwZS5maWxsTGFzdD1mdW5jdGlvbihyKXtpZih0aGlzLmxhc3ROZWVkPD1yLmxlbmd0aClyZXR1cm4gci5jb3B5KHRoaXMubGFzdENoYXIsdGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCwwLHRoaXMubGFzdE5lZWQpLHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywwLHRoaXMubGFzdFRvdGFsKTtyLmNvcHkodGhpcy5sYXN0Q2hhcix0aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLDAsci5sZW5ndGgpLHRoaXMubGFzdE5lZWQtPXIubGVuZ3RofTtmdW5jdGlvbiBFbihyKXtyZXR1cm4gcjw9MTI3PzA6cj4+NT09PTY/MjpyPj40PT09MTQ/MzpyPj4zPT09MzA/NDpyPj42PT09Mj8tMTotMn1mdW5jdGlvbiBvZihyLGUsdCl7dmFyIG49ZS5sZW5ndGgtMTtpZihuPHQpcmV0dXJuIDA7dmFyIGk9RW4oZVtuXSk7cmV0dXJuIGk+PTA/KGk+MCYmKHIubGFzdE5lZWQ9aS0xKSxpKTotLW48dHx8aT09PS0yPzA6KGk9RW4oZVtuXSksaT49MD8oaT4wJiYoci5sYXN0TmVlZD1pLTIpLGkpOi0tbjx0fHxpPT09LTI/MDooaT1FbihlW25dKSxpPj0wPyhpPjAmJihpPT09Mj9pPTA6ci5sYXN0TmVlZD1pLTMpLGkpOjApKX1mdW5jdGlvbiBzZihyLGUsdCl7aWYoKGVbMF0mMTkyKSE9PTEyOClyZXR1cm4gci5sYXN0TmVlZD0wLFwiXFx1RkZGRFwiO2lmKHIubGFzdE5lZWQ+MSYmZS5sZW5ndGg+MSl7aWYoKGVbMV0mMTkyKSE9PTEyOClyZXR1cm4gci5sYXN0TmVlZD0xLFwiXFx1RkZGRFwiO2lmKHIubGFzdE5lZWQ+MiYmZS5sZW5ndGg+MiYmKGVbMl0mMTkyKSE9PTEyOClyZXR1cm4gci5sYXN0TmVlZD0yLFwiXFx1RkZGRFwifX1mdW5jdGlvbiBhZihyKXt2YXIgZT10aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLHQ9c2YodGhpcyxyLGUpO2lmKHQhPT12b2lkIDApcmV0dXJuIHQ7aWYodGhpcy5sYXN0TmVlZDw9ci5sZW5ndGgpcmV0dXJuIHIuY29weSh0aGlzLmxhc3RDaGFyLGUsMCx0aGlzLmxhc3ROZWVkKSx0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCx0aGlzLmxhc3RUb3RhbCk7ci5jb3B5KHRoaXMubGFzdENoYXIsZSwwLHIubGVuZ3RoKSx0aGlzLmxhc3ROZWVkLT1yLmxlbmd0aH1mdW5jdGlvbiB1ZihyLGUpe3ZhciB0PW9mKHRoaXMscixlKTtpZighdGhpcy5sYXN0TmVlZClyZXR1cm4gci50b1N0cmluZyhcInV0ZjhcIixlKTt0aGlzLmxhc3RUb3RhbD10O3ZhciBuPXIubGVuZ3RoLSh0LXRoaXMubGFzdE5lZWQpO3JldHVybiByLmNvcHkodGhpcy5sYXN0Q2hhciwwLG4pLHIudG9TdHJpbmcoXCJ1dGY4XCIsZSxuKX1mdW5jdGlvbiBmZihyKXt2YXIgZT1yJiZyLmxlbmd0aD90aGlzLndyaXRlKHIpOlwiXCI7cmV0dXJuIHRoaXMubGFzdE5lZWQ/ZStcIlxcdUZGRkRcIjplfWZ1bmN0aW9uIGNmKHIsZSl7aWYoKHIubGVuZ3RoLWUpJTI9PT0wKXt2YXIgdD1yLnRvU3RyaW5nKFwidXRmMTZsZVwiLGUpO2lmKHQpe3ZhciBuPXQuY2hhckNvZGVBdCh0Lmxlbmd0aC0xKTtpZihuPj01NTI5NiYmbjw9NTYzMTkpcmV0dXJuIHRoaXMubGFzdE5lZWQ9Mix0aGlzLmxhc3RUb3RhbD00LHRoaXMubGFzdENoYXJbMF09cltyLmxlbmd0aC0yXSx0aGlzLmxhc3RDaGFyWzFdPXJbci5sZW5ndGgtMV0sdC5zbGljZSgwLC0xKX1yZXR1cm4gdH1yZXR1cm4gdGhpcy5sYXN0TmVlZD0xLHRoaXMubGFzdFRvdGFsPTIsdGhpcy5sYXN0Q2hhclswXT1yW3IubGVuZ3RoLTFdLHIudG9TdHJpbmcoXCJ1dGYxNmxlXCIsZSxyLmxlbmd0aC0xKX1mdW5jdGlvbiBsZihyKXt2YXIgZT1yJiZyLmxlbmd0aD90aGlzLndyaXRlKHIpOlwiXCI7aWYodGhpcy5sYXN0TmVlZCl7dmFyIHQ9dGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZDtyZXR1cm4gZSt0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKFwidXRmMTZsZVwiLDAsdCl9cmV0dXJuIGV9ZnVuY3Rpb24gZGYocixlKXt2YXIgdD0oci5sZW5ndGgtZSklMztyZXR1cm4gdD09PTA/ci50b1N0cmluZyhcImJhc2U2NFwiLGUpOih0aGlzLmxhc3ROZWVkPTMtdCx0aGlzLmxhc3RUb3RhbD0zLHQ9PT0xP3RoaXMubGFzdENoYXJbMF09cltyLmxlbmd0aC0xXToodGhpcy5sYXN0Q2hhclswXT1yW3IubGVuZ3RoLTJdLHRoaXMubGFzdENoYXJbMV09cltyLmxlbmd0aC0xXSksci50b1N0cmluZyhcImJhc2U2NFwiLGUsci5sZW5ndGgtdCkpfWZ1bmN0aW9uIHBmKHIpe3ZhciBlPXImJnIubGVuZ3RoP3RoaXMud3JpdGUocik6XCJcIjtyZXR1cm4gdGhpcy5sYXN0TmVlZD9lK3RoaXMubGFzdENoYXIudG9TdHJpbmcoXCJiYXNlNjRcIiwwLDMtdGhpcy5sYXN0TmVlZCk6ZX1mdW5jdGlvbiBoZihyKXtyZXR1cm4gci50b1N0cmluZyh0aGlzLmVuY29kaW5nKX1mdW5jdGlvbiBtZihyKXtyZXR1cm4gciYmci5sZW5ndGg/dGhpcy53cml0ZShyKTpcIlwifX0pO3ZhciBYdD1TKChSbCxDbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFJvPVVlKCkuY29kZXMuRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0U7ZnVuY3Rpb24gZ2Yocil7dmFyIGU9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIWUpe2U9ITA7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodCksaT0wO2k8dDtpKyspbltpXT1hcmd1bWVudHNbaV07ci5hcHBseSh0aGlzLG4pfX19ZnVuY3Rpb24geWYoKXt9ZnVuY3Rpb24gYmYocil7cmV0dXJuIHIuc2V0SGVhZGVyJiZ0eXBlb2Ygci5hYm9ydD09XCJmdW5jdGlvblwifWZ1bmN0aW9uIFRvKHIsZSx0KXtpZih0eXBlb2YgZT09XCJmdW5jdGlvblwiKXJldHVybiBUbyhyLG51bGwsZSk7ZXx8KGU9e30pLHQ9Z2YodHx8eWYpO3ZhciBuPWUucmVhZGFibGV8fGUucmVhZGFibGUhPT0hMSYmci5yZWFkYWJsZSxpPWUud3JpdGFibGV8fGUud3JpdGFibGUhPT0hMSYmci53cml0YWJsZSxvPWZ1bmN0aW9uKCl7ci53cml0YWJsZXx8YSgpfSxzPXIuX3dyaXRhYmxlU3RhdGUmJnIuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQsYT1mdW5jdGlvbigpe2k9ITEscz0hMCxufHx0LmNhbGwocil9LHU9ci5fcmVhZGFibGVTdGF0ZSYmci5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkLGY9ZnVuY3Rpb24oKXtuPSExLHU9ITAsaXx8dC5jYWxsKHIpfSxsPWZ1bmN0aW9uKGIpe3QuY2FsbChyLGIpfSxkPWZ1bmN0aW9uKCl7dmFyIGI7aWYobiYmIXUpcmV0dXJuKCFyLl9yZWFkYWJsZVN0YXRlfHwhci5fcmVhZGFibGVTdGF0ZS5lbmRlZCkmJihiPW5ldyBSbyksdC5jYWxsKHIsYik7aWYoaSYmIXMpcmV0dXJuKCFyLl93cml0YWJsZVN0YXRlfHwhci5fd3JpdGFibGVTdGF0ZS5lbmRlZCkmJihiPW5ldyBSbyksdC5jYWxsKHIsYil9LGg9ZnVuY3Rpb24oKXtyLnJlcS5vbihcImZpbmlzaFwiLGEpfTtyZXR1cm4gYmYocik/KHIub24oXCJjb21wbGV0ZVwiLGEpLHIub24oXCJhYm9ydFwiLGQpLHIucmVxP2goKTpyLm9uKFwicmVxdWVzdFwiLGgpKTppJiYhci5fd3JpdGFibGVTdGF0ZSYmKHIub24oXCJlbmRcIixvKSxyLm9uKFwiY2xvc2VcIixvKSksci5vbihcImVuZFwiLGYpLHIub24oXCJmaW5pc2hcIixhKSxlLmVycm9yIT09ITEmJnIub24oXCJlcnJvclwiLGwpLHIub24oXCJjbG9zZVwiLGQpLGZ1bmN0aW9uKCl7ci5yZW1vdmVMaXN0ZW5lcihcImNvbXBsZXRlXCIsYSksci5yZW1vdmVMaXN0ZW5lcihcImFib3J0XCIsZCksci5yZW1vdmVMaXN0ZW5lcihcInJlcXVlc3RcIixoKSxyLnJlcSYmci5yZXEucmVtb3ZlTGlzdGVuZXIoXCJmaW5pc2hcIixhKSxyLnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIsbyksci5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsbyksci5yZW1vdmVMaXN0ZW5lcihcImZpbmlzaFwiLGEpLHIucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIixmKSxyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIixsKSxyLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixkKX19Q28uZXhwb3J0cz1Ub30pO3ZhciBNbz1TKChUbCxCbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIEp0O2Z1bmN0aW9uIF9lKHIsZSx0KXtyZXR1cm4gZSBpbiByP09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLGUse3ZhbHVlOnQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpyW2VdPXQscn12YXIgeGY9WHQoKSx3ZT1TeW1ib2woXCJsYXN0UmVzb2x2ZVwiKSxIZT1TeW1ib2woXCJsYXN0UmVqZWN0XCIpLFJ0PVN5bWJvbChcImVycm9yXCIpLFF0PVN5bWJvbChcImVuZGVkXCIpLHFlPVN5bWJvbChcImxhc3RQcm9taXNlXCIpLFRuPVN5bWJvbChcImhhbmRsZVByb21pc2VcIiksamU9U3ltYm9sKFwic3RyZWFtXCIpO2Z1bmN0aW9uIHZlKHIsZSl7cmV0dXJue3ZhbHVlOnIsZG9uZTplfX1mdW5jdGlvbiBfZihyKXt2YXIgZT1yW3dlXTtpZihlIT09bnVsbCl7dmFyIHQ9cltqZV0ucmVhZCgpO3QhPT1udWxsJiYocltxZV09bnVsbCxyW3dlXT1udWxsLHJbSGVdPW51bGwsZSh2ZSh0LCExKSkpfX1mdW5jdGlvbiB3ZihyKXtwcm9jZXNzLm5leHRUaWNrKF9mLHIpfWZ1bmN0aW9uIHZmKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7ci50aGVuKGZ1bmN0aW9uKCl7aWYoZVtRdF0pe3QodmUodm9pZCAwLCEwKSk7cmV0dXJufWVbVG5dKHQsbil9LG4pfX12YXIgRWY9T2JqZWN0LmdldFByb3RvdHlwZU9mKGZ1bmN0aW9uKCl7fSksU2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mKChKdD17Z2V0IHN0cmVhbSgpe3JldHVybiB0aGlzW2plXX0sbmV4dDpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzW1J0XTtpZih0IT09bnVsbClyZXR1cm4gUHJvbWlzZS5yZWplY3QodCk7aWYodGhpc1tRdF0pcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2ZSh2b2lkIDAsITApKTtpZih0aGlzW2plXS5kZXN0cm95ZWQpcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHMsYSl7cHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpe2VbUnRdP2EoZVtSdF0pOnModmUodm9pZCAwLCEwKSl9KX0pO3ZhciBuPXRoaXNbcWVdLGk7aWYobilpPW5ldyBQcm9taXNlKHZmKG4sdGhpcykpO2Vsc2V7dmFyIG89dGhpc1tqZV0ucmVhZCgpO2lmKG8hPT1udWxsKXJldHVybiBQcm9taXNlLnJlc29sdmUodmUobywhMSkpO2k9bmV3IFByb21pc2UodGhpc1tUbl0pfXJldHVybiB0aGlzW3FlXT1pLGl9fSxfZShKdCxTeW1ib2wuYXN5bmNJdGVyYXRvcixmdW5jdGlvbigpe3JldHVybiB0aGlzfSksX2UoSnQsXCJyZXR1cm5cIixmdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7ZVtqZV0uZGVzdHJveShudWxsLGZ1bmN0aW9uKGkpe2lmKGkpe24oaSk7cmV0dXJufXQodmUodm9pZCAwLCEwKSl9KX0pfSksSnQpLEVmKSxSZj1mdW5jdGlvbihlKXt2YXIgdCxuPU9iamVjdC5jcmVhdGUoU2YsKHQ9e30sX2UodCxqZSx7dmFsdWU6ZSx3cml0YWJsZTohMH0pLF9lKHQsd2Use3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KSxfZSh0LEhlLHt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksX2UodCxSdCx7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLF9lKHQsUXQse3ZhbHVlOmUuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCx3cml0YWJsZTohMH0pLF9lKHQsVG4se3ZhbHVlOmZ1bmN0aW9uKG8scyl7dmFyIGE9bltqZV0ucmVhZCgpO2E/KG5bcWVdPW51bGwsblt3ZV09bnVsbCxuW0hlXT1udWxsLG8odmUoYSwhMSkpKTooblt3ZV09byxuW0hlXT1zKX0sd3JpdGFibGU6ITB9KSx0KSk7cmV0dXJuIG5bcWVdPW51bGwseGYoZSxmdW5jdGlvbihpKXtpZihpJiZpLmNvZGUhPT1cIkVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFXCIpe3ZhciBvPW5bSGVdO28hPT1udWxsJiYobltxZV09bnVsbCxuW3dlXT1udWxsLG5bSGVdPW51bGwsbyhpKSksbltSdF09aTtyZXR1cm59dmFyIHM9blt3ZV07cyE9PW51bGwmJihuW3FlXT1udWxsLG5bd2VdPW51bGwsbltIZV09bnVsbCxzKHZlKHZvaWQgMCwhMCkpKSxuW1F0XT0hMH0pLGUub24oXCJyZWFkYWJsZVwiLHdmLmJpbmQobnVsbCxuKSksbn07Qm8uZXhwb3J0cz1SZn0pO3ZhciBJbz1TKChDbCxMbyk9PntjKCk7TG8uZXhwb3J0cz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIlJlYWRhYmxlLmZyb20gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnJvd3NlclwiKX19KTt2YXIgd249UygoTWwscW8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3FvLmV4cG9ydHM9RTt2YXIgcnQ7RS5SZWFkYWJsZVN0YXRlPWtvO3ZhciBCbD11bigpLkV2ZW50RW1pdHRlcixQbz1mdW5jdGlvbihlLHQpe3JldHVybiBlLmxpc3RlbmVycyh0KS5sZW5ndGh9LEN0PWZuKCksWnQ9WGUoKS5CdWZmZXIsVGY9Z2xvYmFsLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBDZihyKXtyZXR1cm4gWnQuZnJvbShyKX1mdW5jdGlvbiBCZihyKXtyZXR1cm4gWnQuaXNCdWZmZXIocil8fHIgaW5zdGFuY2VvZiBUZn12YXIgQ249Y24oKSx4O0NuJiZDbi5kZWJ1Z2xvZz94PUNuLmRlYnVnbG9nKFwic3RyZWFtXCIpOng9ZnVuY3Rpb24oKXt9O3ZhciBNZj1ybygpLFBuPXBuKCksTGY9aG4oKSxJZj1MZi5nZXRIaWdoV2F0ZXJNYXJrLGVyPVVlKCkuY29kZXMsQWY9ZXIuRVJSX0lOVkFMSURfQVJHX1RZUEUsRmY9ZXIuRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRixQZj1lci5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxrZj1lci5FUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5ULG50LEJuLE1uO09lKCkoRSxDdCk7dmFyIFR0PVBuLmVycm9yT3JEZXN0cm95LExuPVtcImVycm9yXCIsXCJjbG9zZVwiLFwiZGVzdHJveVwiLFwicGF1c2VcIixcInJlc3VtZVwiXTtmdW5jdGlvbiBPZihyLGUsdCl7aWYodHlwZW9mIHIucHJlcGVuZExpc3RlbmVyPT1cImZ1bmN0aW9uXCIpcmV0dXJuIHIucHJlcGVuZExpc3RlbmVyKGUsdCk7IXIuX2V2ZW50c3x8IXIuX2V2ZW50c1tlXT9yLm9uKGUsdCk6QXJyYXkuaXNBcnJheShyLl9ldmVudHNbZV0pP3IuX2V2ZW50c1tlXS51bnNoaWZ0KHQpOnIuX2V2ZW50c1tlXT1bdCxyLl9ldmVudHNbZV1dfWZ1bmN0aW9uIGtvKHIsZSx0KXtydD1ydHx8RGUoKSxyPXJ8fHt9LHR5cGVvZiB0IT1cImJvb2xlYW5cIiYmKHQ9ZSBpbnN0YW5jZW9mIHJ0KSx0aGlzLm9iamVjdE1vZGU9ISFyLm9iamVjdE1vZGUsdCYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhci5yZWFkYWJsZU9iamVjdE1vZGUpLHRoaXMuaGlnaFdhdGVyTWFyaz1JZih0aGlzLHIsXCJyZWFkYWJsZUhpZ2hXYXRlck1hcmtcIix0KSx0aGlzLmJ1ZmZlcj1uZXcgTWYsdGhpcy5sZW5ndGg9MCx0aGlzLnBpcGVzPW51bGwsdGhpcy5waXBlc0NvdW50PTAsdGhpcy5mbG93aW5nPW51bGwsdGhpcy5lbmRlZD0hMSx0aGlzLmVuZEVtaXR0ZWQ9ITEsdGhpcy5yZWFkaW5nPSExLHRoaXMuc3luYz0hMCx0aGlzLm5lZWRSZWFkYWJsZT0hMSx0aGlzLmVtaXR0ZWRSZWFkYWJsZT0hMSx0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPSExLHRoaXMucmVzdW1lU2NoZWR1bGVkPSExLHRoaXMucGF1c2VkPSEwLHRoaXMuZW1pdENsb3NlPXIuZW1pdENsb3NlIT09ITEsdGhpcy5hdXRvRGVzdHJveT0hIXIuYXV0b0Rlc3Ryb3ksdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9ci5kZWZhdWx0RW5jb2Rpbmd8fFwidXRmOFwiLHRoaXMuYXdhaXREcmFpbj0wLHRoaXMucmVhZGluZ01vcmU9ITEsdGhpcy5kZWNvZGVyPW51bGwsdGhpcy5lbmNvZGluZz1udWxsLHIuZW5jb2RpbmcmJihudHx8KG50PVJuKCkuU3RyaW5nRGVjb2RlciksdGhpcy5kZWNvZGVyPW5ldyBudChyLmVuY29kaW5nKSx0aGlzLmVuY29kaW5nPXIuZW5jb2RpbmcpfWZ1bmN0aW9uIEUocil7aWYocnQ9cnR8fERlKCksISh0aGlzIGluc3RhbmNlb2YgRSkpcmV0dXJuIG5ldyBFKHIpO3ZhciBlPXRoaXMgaW5zdGFuY2VvZiBydDt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBrbyhyLHRoaXMsZSksdGhpcy5yZWFkYWJsZT0hMCxyJiYodHlwZW9mIHIucmVhZD09XCJmdW5jdGlvblwiJiYodGhpcy5fcmVhZD1yLnJlYWQpLHR5cGVvZiByLmRlc3Ryb3k9PVwiZnVuY3Rpb25cIiYmKHRoaXMuX2Rlc3Ryb3k9ci5kZXN0cm95KSksQ3QuY2FsbCh0aGlzKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoRS5wcm90b3R5cGUsXCJkZXN0cm95ZWRcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZT09PXZvaWQgMD8hMTp0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uKGUpeyF0aGlzLl9yZWFkYWJsZVN0YXRlfHwodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ZSl9fSk7RS5wcm90b3R5cGUuZGVzdHJveT1Qbi5kZXN0cm95O0UucHJvdG90eXBlLl91bmRlc3Ryb3k9UG4udW5kZXN0cm95O0UucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHIsZSl7ZShyKX07RS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihyLGUpe3ZhciB0PXRoaXMuX3JlYWRhYmxlU3RhdGUsbjtyZXR1cm4gdC5vYmplY3RNb2RlP249ITA6dHlwZW9mIHI9PVwic3RyaW5nXCImJihlPWV8fHQuZGVmYXVsdEVuY29kaW5nLGUhPT10LmVuY29kaW5nJiYocj1adC5mcm9tKHIsZSksZT1cIlwiKSxuPSEwKSxPbyh0aGlzLHIsZSwhMSxuKX07RS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbihyKXtyZXR1cm4gT28odGhpcyxyLG51bGwsITAsITEpfTtmdW5jdGlvbiBPbyhyLGUsdCxuLGkpe3goXCJyZWFkYWJsZUFkZENodW5rXCIsZSk7dmFyIG89ci5fcmVhZGFibGVTdGF0ZTtpZihlPT09bnVsbClvLnJlYWRpbmc9ITEsTmYocixvKTtlbHNle3ZhciBzO2lmKGl8fChzPVVmKG8sZSkpLHMpVHQocixzKTtlbHNlIGlmKG8ub2JqZWN0TW9kZXx8ZSYmZS5sZW5ndGg+MClpZih0eXBlb2YgZSE9XCJzdHJpbmdcIiYmIW8ub2JqZWN0TW9kZSYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpIT09WnQucHJvdG90eXBlJiYoZT1DZihlKSksbilvLmVuZEVtaXR0ZWQ/VHQocixuZXcga2YpOkluKHIsbyxlLCEwKTtlbHNlIGlmKG8uZW5kZWQpVHQocixuZXcgRmYpO2Vsc2V7aWYoby5kZXN0cm95ZWQpcmV0dXJuITE7by5yZWFkaW5nPSExLG8uZGVjb2RlciYmIXQ/KGU9by5kZWNvZGVyLndyaXRlKGUpLG8ub2JqZWN0TW9kZXx8ZS5sZW5ndGghPT0wP0luKHIsbyxlLCExKTpGbihyLG8pKTpJbihyLG8sZSwhMSl9ZWxzZSBufHwoby5yZWFkaW5nPSExLEZuKHIsbykpfXJldHVybiFvLmVuZGVkJiYoby5sZW5ndGg8by5oaWdoV2F0ZXJNYXJrfHxvLmxlbmd0aD09PTApfWZ1bmN0aW9uIEluKHIsZSx0LG4pe2UuZmxvd2luZyYmZS5sZW5ndGg9PT0wJiYhZS5zeW5jPyhlLmF3YWl0RHJhaW49MCxyLmVtaXQoXCJkYXRhXCIsdCkpOihlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6dC5sZW5ndGgsbj9lLmJ1ZmZlci51bnNoaWZ0KHQpOmUuYnVmZmVyLnB1c2godCksZS5uZWVkUmVhZGFibGUmJnRyKHIpKSxGbihyLGUpfWZ1bmN0aW9uIFVmKHIsZSl7dmFyIHQ7cmV0dXJuIUJmKGUpJiZ0eXBlb2YgZSE9XCJzdHJpbmdcIiYmZSE9PXZvaWQgMCYmIXIub2JqZWN0TW9kZSYmKHQ9bmV3IEFmKFwiY2h1bmtcIixbXCJzdHJpbmdcIixcIkJ1ZmZlclwiLFwiVWludDhBcnJheVwiXSxlKSksdH1FLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9PT0hMX07RS5wcm90b3R5cGUuc2V0RW5jb2Rpbmc9ZnVuY3Rpb24ocil7bnR8fChudD1SbigpLlN0cmluZ0RlY29kZXIpO3ZhciBlPW5ldyBudChyKTt0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9ZSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlci5lbmNvZGluZztmb3IodmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuaGVhZCxuPVwiXCI7dCE9PW51bGw7KW4rPWUud3JpdGUodC5kYXRhKSx0PXQubmV4dDtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuY2xlYXIoKSxuIT09XCJcIiYmdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIucHVzaChuKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmxlbmd0aD1uLmxlbmd0aCx0aGlzfTt2YXIgQW89MTA3Mzc0MTgyNDtmdW5jdGlvbiBEZihyKXtyZXR1cm4gcj49QW8/cj1Bbzooci0tLHJ8PXI+Pj4xLHJ8PXI+Pj4yLHJ8PXI+Pj40LHJ8PXI+Pj44LHJ8PXI+Pj4xNixyKyspLHJ9ZnVuY3Rpb24gRm8ocixlKXtyZXR1cm4gcjw9MHx8ZS5sZW5ndGg9PT0wJiZlLmVuZGVkPzA6ZS5vYmplY3RNb2RlPzE6ciE9PXI/ZS5mbG93aW5nJiZlLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoOmUubGVuZ3RoOihyPmUuaGlnaFdhdGVyTWFyayYmKGUuaGlnaFdhdGVyTWFyaz1EZihyKSkscjw9ZS5sZW5ndGg/cjplLmVuZGVkP2UubGVuZ3RoOihlLm5lZWRSZWFkYWJsZT0hMCwwKSl9RS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbihyKXt4KFwicmVhZFwiLHIpLHI9cGFyc2VJbnQociwxMCk7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSx0PXI7aWYociE9PTAmJihlLmVtaXR0ZWRSZWFkYWJsZT0hMSkscj09PTAmJmUubmVlZFJlYWRhYmxlJiYoKGUuaGlnaFdhdGVyTWFyayE9PTA/ZS5sZW5ndGg+PWUuaGlnaFdhdGVyTWFyazplLmxlbmd0aD4wKXx8ZS5lbmRlZCkpcmV0dXJuIHgoXCJyZWFkOiBlbWl0UmVhZGFibGVcIixlLmxlbmd0aCxlLmVuZGVkKSxlLmxlbmd0aD09PTAmJmUuZW5kZWQ/QW4odGhpcyk6dHIodGhpcyksbnVsbDtpZihyPUZvKHIsZSkscj09PTAmJmUuZW5kZWQpcmV0dXJuIGUubGVuZ3RoPT09MCYmQW4odGhpcyksbnVsbDt2YXIgbj1lLm5lZWRSZWFkYWJsZTt4KFwibmVlZCByZWFkYWJsZVwiLG4pLChlLmxlbmd0aD09PTB8fGUubGVuZ3RoLXI8ZS5oaWdoV2F0ZXJNYXJrKSYmKG49ITAseChcImxlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrXCIsbikpLGUuZW5kZWR8fGUucmVhZGluZz8obj0hMSx4KFwicmVhZGluZyBvciBlbmRlZFwiLG4pKTpuJiYoeChcImRvIHJlYWRcIiksZS5yZWFkaW5nPSEwLGUuc3luYz0hMCxlLmxlbmd0aD09PTAmJihlLm5lZWRSZWFkYWJsZT0hMCksdGhpcy5fcmVhZChlLmhpZ2hXYXRlck1hcmspLGUuc3luYz0hMSxlLnJlYWRpbmd8fChyPUZvKHQsZSkpKTt2YXIgaTtyZXR1cm4gcj4wP2k9Tm8ocixlKTppPW51bGwsaT09PW51bGw/KGUubmVlZFJlYWRhYmxlPWUubGVuZ3RoPD1lLmhpZ2hXYXRlck1hcmsscj0wKTooZS5sZW5ndGgtPXIsZS5hd2FpdERyYWluPTApLGUubGVuZ3RoPT09MCYmKGUuZW5kZWR8fChlLm5lZWRSZWFkYWJsZT0hMCksdCE9PXImJmUuZW5kZWQmJkFuKHRoaXMpKSxpIT09bnVsbCYmdGhpcy5lbWl0KFwiZGF0YVwiLGkpLGl9O2Z1bmN0aW9uIE5mKHIsZSl7aWYoeChcIm9uRW9mQ2h1bmtcIiksIWUuZW5kZWQpe2lmKGUuZGVjb2Rlcil7dmFyIHQ9ZS5kZWNvZGVyLmVuZCgpO3QmJnQubGVuZ3RoJiYoZS5idWZmZXIucHVzaCh0KSxlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6dC5sZW5ndGgpfWUuZW5kZWQ9ITAsZS5zeW5jP3RyKHIpOihlLm5lZWRSZWFkYWJsZT0hMSxlLmVtaXR0ZWRSZWFkYWJsZXx8KGUuZW1pdHRlZFJlYWRhYmxlPSEwLFVvKHIpKSl9fWZ1bmN0aW9uIHRyKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7eChcImVtaXRSZWFkYWJsZVwiLGUubmVlZFJlYWRhYmxlLGUuZW1pdHRlZFJlYWRhYmxlKSxlLm5lZWRSZWFkYWJsZT0hMSxlLmVtaXR0ZWRSZWFkYWJsZXx8KHgoXCJlbWl0UmVhZGFibGVcIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLHByb2Nlc3MubmV4dFRpY2soVW8scikpfWZ1bmN0aW9uIFVvKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7eChcImVtaXRSZWFkYWJsZV9cIixlLmRlc3Ryb3llZCxlLmxlbmd0aCxlLmVuZGVkKSwhZS5kZXN0cm95ZWQmJihlLmxlbmd0aHx8ZS5lbmRlZCkmJihyLmVtaXQoXCJyZWFkYWJsZVwiKSxlLmVtaXR0ZWRSZWFkYWJsZT0hMSksZS5uZWVkUmVhZGFibGU9IWUuZmxvd2luZyYmIWUuZW5kZWQmJmUubGVuZ3RoPD1lLmhpZ2hXYXRlck1hcmssa24ocil9ZnVuY3Rpb24gRm4ocixlKXtlLnJlYWRpbmdNb3JlfHwoZS5yZWFkaW5nTW9yZT0hMCxwcm9jZXNzLm5leHRUaWNrKEhmLHIsZSkpfWZ1bmN0aW9uIEhmKHIsZSl7Zm9yKDshZS5yZWFkaW5nJiYhZS5lbmRlZCYmKGUubGVuZ3RoPGUuaGlnaFdhdGVyTWFya3x8ZS5mbG93aW5nJiZlLmxlbmd0aD09PTApOyl7dmFyIHQ9ZS5sZW5ndGg7aWYoeChcIm1heWJlUmVhZE1vcmUgcmVhZCAwXCIpLHIucmVhZCgwKSx0PT09ZS5sZW5ndGgpYnJlYWt9ZS5yZWFkaW5nTW9yZT0hMX1FLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbihyKXtUdCh0aGlzLG5ldyBQZihcIl9yZWFkKClcIikpfTtFLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHIsZSl7dmFyIHQ9dGhpcyxuPXRoaXMuX3JlYWRhYmxlU3RhdGU7c3dpdGNoKG4ucGlwZXNDb3VudCl7Y2FzZSAwOm4ucGlwZXM9cjticmVhaztjYXNlIDE6bi5waXBlcz1bbi5waXBlcyxyXTticmVhaztkZWZhdWx0Om4ucGlwZXMucHVzaChyKTticmVha31uLnBpcGVzQ291bnQrPTEseChcInBpcGUgY291bnQ9JWQgb3B0cz0lalwiLG4ucGlwZXNDb3VudCxlKTt2YXIgaT0oIWV8fGUuZW5kIT09ITEpJiZyIT09cHJvY2Vzcy5zdGRvdXQmJnIhPT1wcm9jZXNzLnN0ZGVycixvPWk/YTp5O24uZW5kRW1pdHRlZD9wcm9jZXNzLm5leHRUaWNrKG8pOnQub25jZShcImVuZFwiLG8pLHIub24oXCJ1bnBpcGVcIixzKTtmdW5jdGlvbiBzKHcsXyl7eChcIm9udW5waXBlXCIpLHc9PT10JiZfJiZfLmhhc1VucGlwZWQ9PT0hMSYmKF8uaGFzVW5waXBlZD0hMCxsKCkpfWZ1bmN0aW9uIGEoKXt4KFwib25lbmRcIiksci5lbmQoKX12YXIgdT1xZih0KTtyLm9uKFwiZHJhaW5cIix1KTt2YXIgZj0hMTtmdW5jdGlvbiBsKCl7eChcImNsZWFudXBcIiksci5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsbSksci5yZW1vdmVMaXN0ZW5lcihcImZpbmlzaFwiLGIpLHIucmVtb3ZlTGlzdGVuZXIoXCJkcmFpblwiLHUpLHIucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLGgpLHIucmVtb3ZlTGlzdGVuZXIoXCJ1bnBpcGVcIixzKSx0LnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIsYSksdC5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLHkpLHQucmVtb3ZlTGlzdGVuZXIoXCJkYXRhXCIsZCksZj0hMCxuLmF3YWl0RHJhaW4mJighci5fd3JpdGFibGVTdGF0ZXx8ci5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pJiZ1KCl9dC5vbihcImRhdGFcIixkKTtmdW5jdGlvbiBkKHcpe3goXCJvbmRhdGFcIik7dmFyIF89ci53cml0ZSh3KTt4KFwiZGVzdC53cml0ZVwiLF8pLF89PT0hMSYmKChuLnBpcGVzQ291bnQ9PT0xJiZuLnBpcGVzPT09cnx8bi5waXBlc0NvdW50PjEmJkhvKG4ucGlwZXMscikhPT0tMSkmJiFmJiYoeChcImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZVwiLG4uYXdhaXREcmFpbiksbi5hd2FpdERyYWluKyspLHQucGF1c2UoKSl9ZnVuY3Rpb24gaCh3KXt4KFwib25lcnJvclwiLHcpLHkoKSxyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIixoKSxQbyhyLFwiZXJyb3JcIik9PT0wJiZUdChyLHcpfU9mKHIsXCJlcnJvclwiLGgpO2Z1bmN0aW9uIG0oKXtyLnJlbW92ZUxpc3RlbmVyKFwiZmluaXNoXCIsYikseSgpfXIub25jZShcImNsb3NlXCIsbSk7ZnVuY3Rpb24gYigpe3goXCJvbmZpbmlzaFwiKSxyLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixtKSx5KCl9ci5vbmNlKFwiZmluaXNoXCIsYik7ZnVuY3Rpb24geSgpe3goXCJ1bnBpcGVcIiksdC51bnBpcGUocil9cmV0dXJuIHIuZW1pdChcInBpcGVcIix0KSxuLmZsb3dpbmd8fCh4KFwicGlwZSByZXN1bWVcIiksdC5yZXN1bWUoKSkscn07ZnVuY3Rpb24gcWYocil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9ci5fcmVhZGFibGVTdGF0ZTt4KFwicGlwZU9uRHJhaW5cIix0LmF3YWl0RHJhaW4pLHQuYXdhaXREcmFpbiYmdC5hd2FpdERyYWluLS0sdC5hd2FpdERyYWluPT09MCYmUG8ocixcImRhdGFcIikmJih0LmZsb3dpbmc9ITAsa24ocikpfX1FLnByb3RvdHlwZS51bnBpcGU9ZnVuY3Rpb24ocil7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSx0PXtoYXNVbnBpcGVkOiExfTtpZihlLnBpcGVzQ291bnQ9PT0wKXJldHVybiB0aGlzO2lmKGUucGlwZXNDb3VudD09PTEpcmV0dXJuIHImJnIhPT1lLnBpcGVzP3RoaXM6KHJ8fChyPWUucGlwZXMpLGUucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITEsciYmci5lbWl0KFwidW5waXBlXCIsdGhpcyx0KSx0aGlzKTtpZighcil7dmFyIG49ZS5waXBlcyxpPWUucGlwZXNDb3VudDtlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExO2Zvcih2YXIgbz0wO288aTtvKyspbltvXS5lbWl0KFwidW5waXBlXCIsdGhpcyx7aGFzVW5waXBlZDohMX0pO3JldHVybiB0aGlzfXZhciBzPUhvKGUucGlwZXMscik7cmV0dXJuIHM9PT0tMT90aGlzOihlLnBpcGVzLnNwbGljZShzLDEpLGUucGlwZXNDb3VudC09MSxlLnBpcGVzQ291bnQ9PT0xJiYoZS5waXBlcz1lLnBpcGVzWzBdKSxyLmVtaXQoXCJ1bnBpcGVcIix0aGlzLHQpLHRoaXMpfTtFLnByb3RvdHlwZS5vbj1mdW5jdGlvbihyLGUpe3ZhciB0PUN0LnByb3RvdHlwZS5vbi5jYWxsKHRoaXMscixlKSxuPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHI9PT1cImRhdGFcIj8obi5yZWFkYWJsZUxpc3RlbmluZz10aGlzLmxpc3RlbmVyQ291bnQoXCJyZWFkYWJsZVwiKT4wLG4uZmxvd2luZyE9PSExJiZ0aGlzLnJlc3VtZSgpKTpyPT09XCJyZWFkYWJsZVwiJiYhbi5lbmRFbWl0dGVkJiYhbi5yZWFkYWJsZUxpc3RlbmluZyYmKG4ucmVhZGFibGVMaXN0ZW5pbmc9bi5uZWVkUmVhZGFibGU9ITAsbi5mbG93aW5nPSExLG4uZW1pdHRlZFJlYWRhYmxlPSExLHgoXCJvbiByZWFkYWJsZVwiLG4ubGVuZ3RoLG4ucmVhZGluZyksbi5sZW5ndGg/dHIodGhpcyk6bi5yZWFkaW5nfHxwcm9jZXNzLm5leHRUaWNrKGpmLHRoaXMpKSx0fTtFLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1FLnByb3RvdHlwZS5vbjtFLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihyLGUpe3ZhciB0PUN0LnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMscixlKTtyZXR1cm4gcj09PVwicmVhZGFibGVcIiYmcHJvY2Vzcy5uZXh0VGljayhEbyx0aGlzKSx0fTtFLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7dmFyIGU9Q3QucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuKHI9PT1cInJlYWRhYmxlXCJ8fHI9PT12b2lkIDApJiZwcm9jZXNzLm5leHRUaWNrKERvLHRoaXMpLGV9O2Z1bmN0aW9uIERvKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7ZS5yZWFkYWJsZUxpc3RlbmluZz1yLmxpc3RlbmVyQ291bnQoXCJyZWFkYWJsZVwiKT4wLGUucmVzdW1lU2NoZWR1bGVkJiYhZS5wYXVzZWQ/ZS5mbG93aW5nPSEwOnIubGlzdGVuZXJDb3VudChcImRhdGFcIik+MCYmci5yZXN1bWUoKX1mdW5jdGlvbiBqZihyKXt4KFwicmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwXCIpLHIucmVhZCgwKX1FLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXt2YXIgcj10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiByLmZsb3dpbmd8fCh4KFwicmVzdW1lXCIpLHIuZmxvd2luZz0hci5yZWFkYWJsZUxpc3RlbmluZyxXZih0aGlzLHIpKSxyLnBhdXNlZD0hMSx0aGlzfTtmdW5jdGlvbiBXZihyLGUpe2UucmVzdW1lU2NoZWR1bGVkfHwoZS5yZXN1bWVTY2hlZHVsZWQ9ITAscHJvY2Vzcy5uZXh0VGljaygkZixyLGUpKX1mdW5jdGlvbiAkZihyLGUpe3goXCJyZXN1bWVcIixlLnJlYWRpbmcpLGUucmVhZGluZ3x8ci5yZWFkKDApLGUucmVzdW1lU2NoZWR1bGVkPSExLHIuZW1pdChcInJlc3VtZVwiKSxrbihyKSxlLmZsb3dpbmcmJiFlLnJlYWRpbmcmJnIucmVhZCgwKX1FLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiB4KFwiY2FsbCBwYXVzZSBmbG93aW5nPSVqXCIsdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmchPT0hMSYmKHgoXCJwYXVzZVwiKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9ITEsdGhpcy5lbWl0KFwicGF1c2VcIikpLHRoaXMuX3JlYWRhYmxlU3RhdGUucGF1c2VkPSEwLHRoaXN9O2Z1bmN0aW9uIGtuKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7Zm9yKHgoXCJmbG93XCIsZS5mbG93aW5nKTtlLmZsb3dpbmcmJnIucmVhZCgpIT09bnVsbDspO31FLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHIpe3ZhciBlPXRoaXMsdD10aGlzLl9yZWFkYWJsZVN0YXRlLG49ITE7ci5vbihcImVuZFwiLGZ1bmN0aW9uKCl7aWYoeChcIndyYXBwZWQgZW5kXCIpLHQuZGVjb2RlciYmIXQuZW5kZWQpe3ZhciBzPXQuZGVjb2Rlci5lbmQoKTtzJiZzLmxlbmd0aCYmZS5wdXNoKHMpfWUucHVzaChudWxsKX0pLHIub24oXCJkYXRhXCIsZnVuY3Rpb24ocyl7aWYoeChcIndyYXBwZWQgZGF0YVwiKSx0LmRlY29kZXImJihzPXQuZGVjb2Rlci53cml0ZShzKSksISh0Lm9iamVjdE1vZGUmJnM9PW51bGwpJiYhKCF0Lm9iamVjdE1vZGUmJighc3x8IXMubGVuZ3RoKSkpe3ZhciBhPWUucHVzaChzKTthfHwobj0hMCxyLnBhdXNlKCkpfX0pO2Zvcih2YXIgaSBpbiByKXRoaXNbaV09PT12b2lkIDAmJnR5cGVvZiByW2ldPT1cImZ1bmN0aW9uXCImJih0aGlzW2ldPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiByW2FdLmFwcGx5KHIsYXJndW1lbnRzKX19KGkpKTtmb3IodmFyIG89MDtvPExuLmxlbmd0aDtvKyspci5vbihMbltvXSx0aGlzLmVtaXQuYmluZCh0aGlzLExuW29dKSk7cmV0dXJuIHRoaXMuX3JlYWQ9ZnVuY3Rpb24ocyl7eChcIndyYXBwZWQgX3JlYWRcIixzKSxuJiYobj0hMSxyLnJlc3VtZSgpKX0sdGhpc307dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiYoRS5wcm90b3R5cGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIEJuPT09dm9pZCAwJiYoQm49TW8oKSksQm4odGhpcyl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5wcm90b3R5cGUsXCJyZWFkYWJsZUhpZ2hXYXRlck1hcmtcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShFLnByb3RvdHlwZSxcInJlYWRhYmxlQnVmZmVyXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShFLnByb3RvdHlwZSxcInJlYWRhYmxlRmxvd2luZ1wiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LHNldDpmdW5jdGlvbihlKXt0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPWUpfX0pO0UuX2Zyb21MaXN0PU5vO09iamVjdC5kZWZpbmVQcm9wZXJ0eShFLnByb3RvdHlwZSxcInJlYWRhYmxlTGVuZ3RoXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RofX0pO2Z1bmN0aW9uIE5vKHIsZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBudWxsO3ZhciB0O3JldHVybiBlLm9iamVjdE1vZGU/dD1lLmJ1ZmZlci5zaGlmdCgpOiFyfHxyPj1lLmxlbmd0aD8oZS5kZWNvZGVyP3Q9ZS5idWZmZXIuam9pbihcIlwiKTplLmJ1ZmZlci5sZW5ndGg9PT0xP3Q9ZS5idWZmZXIuZmlyc3QoKTp0PWUuYnVmZmVyLmNvbmNhdChlLmxlbmd0aCksZS5idWZmZXIuY2xlYXIoKSk6dD1lLmJ1ZmZlci5jb25zdW1lKHIsZS5kZWNvZGVyKSx0fWZ1bmN0aW9uIEFuKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7eChcImVuZFJlYWRhYmxlXCIsZS5lbmRFbWl0dGVkKSxlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLHByb2Nlc3MubmV4dFRpY2soR2YsZSxyKSl9ZnVuY3Rpb24gR2YocixlKXtpZih4KFwiZW5kUmVhZGFibGVOVFwiLHIuZW5kRW1pdHRlZCxyLmxlbmd0aCksIXIuZW5kRW1pdHRlZCYmci5sZW5ndGg9PT0wJiYoci5lbmRFbWl0dGVkPSEwLGUucmVhZGFibGU9ITEsZS5lbWl0KFwiZW5kXCIpLHIuYXV0b0Rlc3Ryb3kpKXt2YXIgdD1lLl93cml0YWJsZVN0YXRlOyghdHx8dC5hdXRvRGVzdHJveSYmdC5maW5pc2hlZCkmJmUuZGVzdHJveSgpfX10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJihFLmZyb209ZnVuY3Rpb24ocixlKXtyZXR1cm4gTW49PT12b2lkIDAmJihNbj1JbygpKSxNbihFLHIsZSl9KTtmdW5jdGlvbiBIbyhyLGUpe2Zvcih2YXIgdD0wLG49ci5sZW5ndGg7dDxuO3QrKylpZihyW3RdPT09ZSlyZXR1cm4gdDtyZXR1cm4tMX19KTt2YXIgT249UygoTGwsV28pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO1dvLmV4cG9ydHM9bWU7dmFyIHJyPVVlKCkuY29kZXMsVmY9cnIuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsemY9cnIuRVJSX01VTFRJUExFX0NBTExCQUNLLFlmPXJyLkVSUl9UUkFOU0ZPUk1fQUxSRUFEWV9UUkFOU0ZPUk1JTkcsS2Y9cnIuRVJSX1RSQU5TRk9STV9XSVRIX0xFTkdUSF8wLG5yPURlKCk7T2UoKShtZSxucik7ZnVuY3Rpb24gWGYocixlKXt2YXIgdD10aGlzLl90cmFuc2Zvcm1TdGF0ZTt0LnRyYW5zZm9ybWluZz0hMTt2YXIgbj10LndyaXRlY2I7aWYobj09PW51bGwpcmV0dXJuIHRoaXMuZW1pdChcImVycm9yXCIsbmV3IHpmKTt0LndyaXRlY2h1bms9bnVsbCx0LndyaXRlY2I9bnVsbCxlIT1udWxsJiZ0aGlzLnB1c2goZSksbihyKTt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlO2kucmVhZGluZz0hMSwoaS5uZWVkUmVhZGFibGV8fGkubGVuZ3RoPGkuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoaS5oaWdoV2F0ZXJNYXJrKX1mdW5jdGlvbiBtZShyKXtpZighKHRoaXMgaW5zdGFuY2VvZiBtZSkpcmV0dXJuIG5ldyBtZShyKTtuci5jYWxsKHRoaXMsciksdGhpcy5fdHJhbnNmb3JtU3RhdGU9e2FmdGVyVHJhbnNmb3JtOlhmLmJpbmQodGhpcyksbmVlZFRyYW5zZm9ybTohMSx0cmFuc2Zvcm1pbmc6ITEsd3JpdGVjYjpudWxsLHdyaXRlY2h1bms6bnVsbCx3cml0ZWVuY29kaW5nOm51bGx9LHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlPSEwLHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYz0hMSxyJiYodHlwZW9mIHIudHJhbnNmb3JtPT1cImZ1bmN0aW9uXCImJih0aGlzLl90cmFuc2Zvcm09ci50cmFuc2Zvcm0pLHR5cGVvZiByLmZsdXNoPT1cImZ1bmN0aW9uXCImJih0aGlzLl9mbHVzaD1yLmZsdXNoKSksdGhpcy5vbihcInByZWZpbmlzaFwiLEpmKX1mdW5jdGlvbiBKZigpe3ZhciByPXRoaXM7dHlwZW9mIHRoaXMuX2ZsdXNoPT1cImZ1bmN0aW9uXCImJiF0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD90aGlzLl9mbHVzaChmdW5jdGlvbihlLHQpe2pvKHIsZSx0KX0pOmpvKHRoaXMsbnVsbCxudWxsKX1tZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihyLGUpe3JldHVybiB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtPSExLG5yLnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcyxyLGUpfTttZS5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbihyLGUsdCl7dChuZXcgVmYoXCJfdHJhbnNmb3JtKClcIikpfTttZS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHIsZSx0KXt2YXIgbj10aGlzLl90cmFuc2Zvcm1TdGF0ZTtpZihuLndyaXRlY2I9dCxuLndyaXRlY2h1bms9cixuLndyaXRlZW5jb2Rpbmc9ZSwhbi50cmFuc2Zvcm1pbmcpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7KG4ubmVlZFRyYW5zZm9ybXx8aS5uZWVkUmVhZGFibGV8fGkubGVuZ3RoPGkuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoaS5oaWdoV2F0ZXJNYXJrKX19O21lLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbihyKXt2YXIgZT10aGlzLl90cmFuc2Zvcm1TdGF0ZTtlLndyaXRlY2h1bmshPT1udWxsJiYhZS50cmFuc2Zvcm1pbmc/KGUudHJhbnNmb3JtaW5nPSEwLHRoaXMuX3RyYW5zZm9ybShlLndyaXRlY2h1bmssZS53cml0ZWVuY29kaW5nLGUuYWZ0ZXJUcmFuc2Zvcm0pKTplLm5lZWRUcmFuc2Zvcm09ITB9O21lLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbihyLGUpe25yLnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMscixmdW5jdGlvbih0KXtlKHQpfSl9O2Z1bmN0aW9uIGpvKHIsZSx0KXtpZihlKXJldHVybiByLmVtaXQoXCJlcnJvclwiLGUpO2lmKHQhPW51bGwmJnIucHVzaCh0KSxyLl93cml0YWJsZVN0YXRlLmxlbmd0aCl0aHJvdyBuZXcgS2Y7aWYoci5fdHJhbnNmb3JtU3RhdGUudHJhbnNmb3JtaW5nKXRocm93IG5ldyBZZjtyZXR1cm4gci5wdXNoKG51bGwpfX0pO3ZhciBWbz1TKChJbCxHbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7R28uZXhwb3J0cz1CdDt2YXIgJG89T24oKTtPZSgpKEJ0LCRvKTtmdW5jdGlvbiBCdChyKXtpZighKHRoaXMgaW5zdGFuY2VvZiBCdCkpcmV0dXJuIG5ldyBCdChyKTskby5jYWxsKHRoaXMscil9QnQucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24ocixlLHQpe3QobnVsbCxyKX19KTt2YXIgSm89UygoQWwsWG8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBVbjtmdW5jdGlvbiBRZihyKXt2YXIgZT0hMTtyZXR1cm4gZnVuY3Rpb24oKXtlfHwoZT0hMCxyLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpKX19dmFyIEtvPVVlKCkuY29kZXMsWmY9S28uRVJSX01JU1NJTkdfQVJHUyxlYz1Lby5FUlJfU1RSRUFNX0RFU1RST1lFRDtmdW5jdGlvbiB6byhyKXtpZihyKXRocm93IHJ9ZnVuY3Rpb24gdGMocil7cmV0dXJuIHIuc2V0SGVhZGVyJiZ0eXBlb2Ygci5hYm9ydD09XCJmdW5jdGlvblwifWZ1bmN0aW9uIHJjKHIsZSx0LG4pe249UWYobik7dmFyIGk9ITE7ci5vbihcImNsb3NlXCIsZnVuY3Rpb24oKXtpPSEwfSksVW49PT12b2lkIDAmJihVbj1YdCgpKSxVbihyLHtyZWFkYWJsZTplLHdyaXRhYmxlOnR9LGZ1bmN0aW9uKHMpe2lmKHMpcmV0dXJuIG4ocyk7aT0hMCxuKCl9KTt2YXIgbz0hMTtyZXR1cm4gZnVuY3Rpb24ocyl7aWYoIWkmJiFvKXtpZihvPSEwLHRjKHIpKXJldHVybiByLmFib3J0KCk7aWYodHlwZW9mIHIuZGVzdHJveT09XCJmdW5jdGlvblwiKXJldHVybiByLmRlc3Ryb3koKTtuKHN8fG5ldyBlYyhcInBpcGVcIikpfX19ZnVuY3Rpb24gWW8ocil7cigpfWZ1bmN0aW9uIG5jKHIsZSl7cmV0dXJuIHIucGlwZShlKX1mdW5jdGlvbiBpYyhyKXtyZXR1cm4hci5sZW5ndGh8fHR5cGVvZiByW3IubGVuZ3RoLTFdIT1cImZ1bmN0aW9uXCI/em86ci5wb3AoKX1mdW5jdGlvbiBvYygpe2Zvcih2YXIgcj1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHIpLHQ9MDt0PHI7dCsrKWVbdF09YXJndW1lbnRzW3RdO3ZhciBuPWljKGUpO2lmKEFycmF5LmlzQXJyYXkoZVswXSkmJihlPWVbMF0pLGUubGVuZ3RoPDIpdGhyb3cgbmV3IFpmKFwic3RyZWFtc1wiKTt2YXIgaSxvPWUubWFwKGZ1bmN0aW9uKHMsYSl7dmFyIHU9YTxlLmxlbmd0aC0xLGY9YT4wO3JldHVybiByYyhzLHUsZixmdW5jdGlvbihsKXtpfHwoaT1sKSxsJiZvLmZvckVhY2goWW8pLCF1JiYoby5mb3JFYWNoKFlvKSxuKGkpKX0pfSk7cmV0dXJuIGUucmVkdWNlKG5jKX1Yby5leHBvcnRzPW9jfSk7dmFyIE49UygoRmwsUW8pPT57YygpO1FvLmV4cG9ydHM9Sjt2YXIgRG49amkoKS5FdmVudEVtaXR0ZXIsc2M9T2UoKTtzYyhKLERuKTtKLlJlYWRhYmxlPXduKCk7Si5Xcml0YWJsZT1ibigpO0ouRHVwbGV4PURlKCk7Si5UcmFuc2Zvcm09T24oKTtKLlBhc3NUaHJvdWdoPVZvKCk7Si5maW5pc2hlZD1YdCgpO0oucGlwZWxpbmU9Sm8oKTtKLlN0cmVhbT1KO2Z1bmN0aW9uIEooKXtEbi5jYWxsKHRoaXMpfUoucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24ocixlKXt2YXIgdD10aGlzO2Z1bmN0aW9uIG4obCl7ci53cml0YWJsZSYmci53cml0ZShsKT09PSExJiZ0LnBhdXNlJiZ0LnBhdXNlKCl9dC5vbihcImRhdGFcIixuKTtmdW5jdGlvbiBpKCl7dC5yZWFkYWJsZSYmdC5yZXN1bWUmJnQucmVzdW1lKCl9ci5vbihcImRyYWluXCIsaSksIXIuX2lzU3RkaW8mJighZXx8ZS5lbmQhPT0hMSkmJih0Lm9uKFwiZW5kXCIscyksdC5vbihcImNsb3NlXCIsYSkpO3ZhciBvPSExO2Z1bmN0aW9uIHMoKXtvfHwobz0hMCxyLmVuZCgpKX1mdW5jdGlvbiBhKCl7b3x8KG89ITAsdHlwZW9mIHIuZGVzdHJveT09XCJmdW5jdGlvblwiJiZyLmRlc3Ryb3koKSl9ZnVuY3Rpb24gdShsKXtpZihmKCksRG4ubGlzdGVuZXJDb3VudCh0aGlzLFwiZXJyb3JcIik9PT0wKXRocm93IGx9dC5vbihcImVycm9yXCIsdSksci5vbihcImVycm9yXCIsdSk7ZnVuY3Rpb24gZigpe3QucmVtb3ZlTGlzdGVuZXIoXCJkYXRhXCIsbiksci5yZW1vdmVMaXN0ZW5lcihcImRyYWluXCIsaSksdC5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLHMpLHQucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLGEpLHQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLHUpLHIucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLHUpLHQucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIixmKSx0LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixmKSxyLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixmKX1yZXR1cm4gdC5vbihcImVuZFwiLGYpLHQub24oXCJjbG9zZVwiLGYpLHIub24oXCJjbG9zZVwiLGYpLHIuZW1pdChcInBpcGVcIix0KSxyfX0pO3ZhciB1cz1TKCh5ZCxhcyk9PntjKCk7dmFyIGF0PTFlMyx1dD1hdCo2MCxmdD11dCo2MCwkZT1mdCoyNCxmYz0kZSo3LGNjPSRlKjM2NS4yNTthcy5leHBvcnRzPWZ1bmN0aW9uKHIsZSl7ZT1lfHx7fTt2YXIgdD10eXBlb2YgcjtpZih0PT09XCJzdHJpbmdcIiYmci5sZW5ndGg+MClyZXR1cm4gbGMocik7aWYodD09PVwibnVtYmVyXCImJmlzRmluaXRlKHIpKXJldHVybiBlLmxvbmc/cGMocik6ZGMocik7dGhyb3cgbmV3IEVycm9yKFwidmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD1cIitKU09OLnN0cmluZ2lmeShyKSl9O2Z1bmN0aW9uIGxjKHIpe2lmKHI9U3RyaW5nKHIpLCEoci5sZW5ndGg+MTAwKSl7dmFyIGU9L14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKHIpO2lmKCEhZSl7dmFyIHQ9cGFyc2VGbG9hdChlWzFdKSxuPShlWzJdfHxcIm1zXCIpLnRvTG93ZXJDYXNlKCk7c3dpdGNoKG4pe2Nhc2VcInllYXJzXCI6Y2FzZVwieWVhclwiOmNhc2VcInlyc1wiOmNhc2VcInlyXCI6Y2FzZVwieVwiOnJldHVybiB0KmNjO2Nhc2VcIndlZWtzXCI6Y2FzZVwid2Vla1wiOmNhc2VcIndcIjpyZXR1cm4gdCpmYztjYXNlXCJkYXlzXCI6Y2FzZVwiZGF5XCI6Y2FzZVwiZFwiOnJldHVybiB0KiRlO2Nhc2VcImhvdXJzXCI6Y2FzZVwiaG91clwiOmNhc2VcImhyc1wiOmNhc2VcImhyXCI6Y2FzZVwiaFwiOnJldHVybiB0KmZ0O2Nhc2VcIm1pbnV0ZXNcIjpjYXNlXCJtaW51dGVcIjpjYXNlXCJtaW5zXCI6Y2FzZVwibWluXCI6Y2FzZVwibVwiOnJldHVybiB0KnV0O2Nhc2VcInNlY29uZHNcIjpjYXNlXCJzZWNvbmRcIjpjYXNlXCJzZWNzXCI6Y2FzZVwic2VjXCI6Y2FzZVwic1wiOnJldHVybiB0KmF0O2Nhc2VcIm1pbGxpc2Vjb25kc1wiOmNhc2VcIm1pbGxpc2Vjb25kXCI6Y2FzZVwibXNlY3NcIjpjYXNlXCJtc2VjXCI6Y2FzZVwibXNcIjpyZXR1cm4gdDtkZWZhdWx0OnJldHVybn19fX1mdW5jdGlvbiBkYyhyKXt2YXIgZT1NYXRoLmFicyhyKTtyZXR1cm4gZT49JGU/TWF0aC5yb3VuZChyLyRlKStcImRcIjplPj1mdD9NYXRoLnJvdW5kKHIvZnQpK1wiaFwiOmU+PXV0P01hdGgucm91bmQoci91dCkrXCJtXCI6ZT49YXQ/TWF0aC5yb3VuZChyL2F0KStcInNcIjpyK1wibXNcIn1mdW5jdGlvbiBwYyhyKXt2YXIgZT1NYXRoLmFicyhyKTtyZXR1cm4gZT49JGU/ZnIocixlLCRlLFwiZGF5XCIpOmU+PWZ0P2ZyKHIsZSxmdCxcImhvdXJcIik6ZT49dXQ/ZnIocixlLHV0LFwibWludXRlXCIpOmU+PWF0P2ZyKHIsZSxhdCxcInNlY29uZFwiKTpyK1wiIG1zXCJ9ZnVuY3Rpb24gZnIocixlLHQsbil7dmFyIGk9ZT49dCoxLjU7cmV0dXJuIE1hdGgucm91bmQoci90KStcIiBcIituKyhpP1wic1wiOlwiXCIpfX0pO3ZhciBjcz1TKChiZCxmcyk9PntjKCk7ZnVuY3Rpb24gaGMocil7dC5kZWJ1Zz10LHQuZGVmYXVsdD10LHQuY29lcmNlPXUsdC5kaXNhYmxlPW8sdC5lbmFibGU9aSx0LmVuYWJsZWQ9cyx0Lmh1bWFuaXplPXVzKCksdC5kZXN0cm95PWYsT2JqZWN0LmtleXMocikuZm9yRWFjaChsPT57dFtsXT1yW2xdfSksdC5uYW1lcz1bXSx0LnNraXBzPVtdLHQuZm9ybWF0dGVycz17fTtmdW5jdGlvbiBlKGwpe2xldCBkPTA7Zm9yKGxldCBoPTA7aDxsLmxlbmd0aDtoKyspZD0oZDw8NSktZCtsLmNoYXJDb2RlQXQoaCksZHw9MDtyZXR1cm4gdC5jb2xvcnNbTWF0aC5hYnMoZCkldC5jb2xvcnMubGVuZ3RoXX10LnNlbGVjdENvbG9yPWU7ZnVuY3Rpb24gdChsKXtsZXQgZCxoPW51bGwsbSxiO2Z1bmN0aW9uIHkoLi4udyl7aWYoIXkuZW5hYmxlZClyZXR1cm47bGV0IF89eSx2PU51bWJlcihuZXcgRGF0ZSkscT12LShkfHx2KTtfLmRpZmY9cSxfLnByZXY9ZCxfLmN1cnI9dixkPXYsd1swXT10LmNvZXJjZSh3WzBdKSx0eXBlb2Ygd1swXSE9XCJzdHJpbmdcIiYmdy51bnNoaWZ0KFwiJU9cIik7bGV0IEE9MDt3WzBdPXdbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csKFksR2UpPT57aWYoWT09PVwiJSVcIilyZXR1cm5cIiVcIjtBKys7bGV0IEllPXQuZm9ybWF0dGVyc1tHZV07aWYodHlwZW9mIEllPT1cImZ1bmN0aW9uXCIpe2xldCBBZT13W0FdO1k9SWUuY2FsbChfLEFlKSx3LnNwbGljZShBLDEpLEEtLX1yZXR1cm4gWX0pLHQuZm9ybWF0QXJncy5jYWxsKF8sdyksKF8ubG9nfHx0LmxvZykuYXBwbHkoXyx3KX1yZXR1cm4geS5uYW1lc3BhY2U9bCx5LnVzZUNvbG9ycz10LnVzZUNvbG9ycygpLHkuY29sb3I9dC5zZWxlY3RDb2xvcihsKSx5LmV4dGVuZD1uLHkuZGVzdHJveT10LmRlc3Ryb3ksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksXCJlbmFibGVkXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExLGdldDooKT0+aCE9PW51bGw/aDoobSE9PXQubmFtZXNwYWNlcyYmKG09dC5uYW1lc3BhY2VzLGI9dC5lbmFibGVkKGwpKSxiKSxzZXQ6dz0+e2g9d319KSx0eXBlb2YgdC5pbml0PT1cImZ1bmN0aW9uXCImJnQuaW5pdCh5KSx5fWZ1bmN0aW9uIG4obCxkKXtsZXQgaD10KHRoaXMubmFtZXNwYWNlKyh0eXBlb2YgZD5cInVcIj9cIjpcIjpkKStsKTtyZXR1cm4gaC5sb2c9dGhpcy5sb2csaH1mdW5jdGlvbiBpKGwpe3Quc2F2ZShsKSx0Lm5hbWVzcGFjZXM9bCx0Lm5hbWVzPVtdLHQuc2tpcHM9W107bGV0IGQsaD0odHlwZW9mIGw9PVwic3RyaW5nXCI/bDpcIlwiKS5zcGxpdCgvW1xccyxdKy8pLG09aC5sZW5ndGg7Zm9yKGQ9MDtkPG07ZCsrKSFoW2RdfHwobD1oW2RdLnJlcGxhY2UoL1xcKi9nLFwiLio/XCIpLGxbMF09PT1cIi1cIj90LnNraXBzLnB1c2gobmV3IFJlZ0V4cChcIl5cIitsLnNsaWNlKDEpK1wiJFwiKSk6dC5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoXCJeXCIrbCtcIiRcIikpKX1mdW5jdGlvbiBvKCl7bGV0IGw9Wy4uLnQubmFtZXMubWFwKGEpLC4uLnQuc2tpcHMubWFwKGEpLm1hcChkPT5cIi1cIitkKV0uam9pbihcIixcIik7cmV0dXJuIHQuZW5hYmxlKFwiXCIpLGx9ZnVuY3Rpb24gcyhsKXtpZihsW2wubGVuZ3RoLTFdPT09XCIqXCIpcmV0dXJuITA7bGV0IGQsaDtmb3IoZD0wLGg9dC5za2lwcy5sZW5ndGg7ZDxoO2QrKylpZih0LnNraXBzW2RdLnRlc3QobCkpcmV0dXJuITE7Zm9yKGQ9MCxoPXQubmFtZXMubGVuZ3RoO2Q8aDtkKyspaWYodC5uYW1lc1tkXS50ZXN0KGwpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGEobCl7cmV0dXJuIGwudG9TdHJpbmcoKS5zdWJzdHJpbmcoMixsLnRvU3RyaW5nKCkubGVuZ3RoLTIpLnJlcGxhY2UoL1xcLlxcKlxcPyQvLFwiKlwiKX1mdW5jdGlvbiB1KGwpe3JldHVybiBsIGluc3RhbmNlb2YgRXJyb3I/bC5zdGFja3x8bC5tZXNzYWdlOmx9ZnVuY3Rpb24gZigpe2NvbnNvbGUud2FybihcIkluc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC5cIil9cmV0dXJuIHQuZW5hYmxlKHQubG9hZCgpKSx0fWZzLmV4cG9ydHM9aGN9KTt2YXIgbGU9Uygoeixjcik9PntjKCk7ei5mb3JtYXRBcmdzPWdjO3ouc2F2ZT15Yzt6LmxvYWQ9YmM7ei51c2VDb2xvcnM9bWM7ei5zdG9yYWdlPXhjKCk7ei5kZXN0cm95PSgoKT0+e2xldCByPSExO3JldHVybigpPT57cnx8KHI9ITAsY29uc29sZS53YXJuKFwiSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLlwiKSl9fSkoKTt6LmNvbG9ycz1bXCIjMDAwMENDXCIsXCIjMDAwMEZGXCIsXCIjMDAzM0NDXCIsXCIjMDAzM0ZGXCIsXCIjMDA2NkNDXCIsXCIjMDA2NkZGXCIsXCIjMDA5OUNDXCIsXCIjMDA5OUZGXCIsXCIjMDBDQzAwXCIsXCIjMDBDQzMzXCIsXCIjMDBDQzY2XCIsXCIjMDBDQzk5XCIsXCIjMDBDQ0NDXCIsXCIjMDBDQ0ZGXCIsXCIjMzMwMENDXCIsXCIjMzMwMEZGXCIsXCIjMzMzM0NDXCIsXCIjMzMzM0ZGXCIsXCIjMzM2NkNDXCIsXCIjMzM2NkZGXCIsXCIjMzM5OUNDXCIsXCIjMzM5OUZGXCIsXCIjMzNDQzAwXCIsXCIjMzNDQzMzXCIsXCIjMzNDQzY2XCIsXCIjMzNDQzk5XCIsXCIjMzNDQ0NDXCIsXCIjMzNDQ0ZGXCIsXCIjNjYwMENDXCIsXCIjNjYwMEZGXCIsXCIjNjYzM0NDXCIsXCIjNjYzM0ZGXCIsXCIjNjZDQzAwXCIsXCIjNjZDQzMzXCIsXCIjOTkwMENDXCIsXCIjOTkwMEZGXCIsXCIjOTkzM0NDXCIsXCIjOTkzM0ZGXCIsXCIjOTlDQzAwXCIsXCIjOTlDQzMzXCIsXCIjQ0MwMDAwXCIsXCIjQ0MwMDMzXCIsXCIjQ0MwMDY2XCIsXCIjQ0MwMDk5XCIsXCIjQ0MwMENDXCIsXCIjQ0MwMEZGXCIsXCIjQ0MzMzAwXCIsXCIjQ0MzMzMzXCIsXCIjQ0MzMzY2XCIsXCIjQ0MzMzk5XCIsXCIjQ0MzM0NDXCIsXCIjQ0MzM0ZGXCIsXCIjQ0M2NjAwXCIsXCIjQ0M2NjMzXCIsXCIjQ0M5OTAwXCIsXCIjQ0M5OTMzXCIsXCIjQ0NDQzAwXCIsXCIjQ0NDQzMzXCIsXCIjRkYwMDAwXCIsXCIjRkYwMDMzXCIsXCIjRkYwMDY2XCIsXCIjRkYwMDk5XCIsXCIjRkYwMENDXCIsXCIjRkYwMEZGXCIsXCIjRkYzMzAwXCIsXCIjRkYzMzMzXCIsXCIjRkYzMzY2XCIsXCIjRkYzMzk5XCIsXCIjRkYzM0NDXCIsXCIjRkYzM0ZGXCIsXCIjRkY2NjAwXCIsXCIjRkY2NjMzXCIsXCIjRkY5OTAwXCIsXCIjRkY5OTMzXCIsXCIjRkZDQzAwXCIsXCIjRkZDQzMzXCJdO2Z1bmN0aW9uIG1jKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c8XCJ1XCImJndpbmRvdy5wcm9jZXNzJiYod2luZG93LnByb2Nlc3MudHlwZT09PVwicmVuZGVyZXJcInx8d2luZG93LnByb2Nlc3MuX19ud2pzKT8hMDp0eXBlb2YgbmF2aWdhdG9yPFwidVwiJiZuYXZpZ2F0b3IudXNlckFnZW50JiZuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLyk/ITE6dHlwZW9mIGRvY3VtZW50PFwidVwiJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2V8fHR5cGVvZiB3aW5kb3c8XCJ1XCImJndpbmRvdy5jb25zb2xlJiYod2luZG93LmNvbnNvbGUuZmlyZWJ1Z3x8d2luZG93LmNvbnNvbGUuZXhjZXB0aW9uJiZ3aW5kb3cuY29uc29sZS50YWJsZSl8fHR5cGVvZiBuYXZpZ2F0b3I8XCJ1XCImJm5hdmlnYXRvci51c2VyQWdlbnQmJm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pJiZwYXJzZUludChSZWdFeHAuJDEsMTApPj0zMXx8dHlwZW9mIG5hdmlnYXRvcjxcInVcIiYmbmF2aWdhdG9yLnVzZXJBZ2VudCYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pfWZ1bmN0aW9uIGdjKHIpe2lmKHJbMF09KHRoaXMudXNlQ29sb3JzP1wiJWNcIjpcIlwiKSt0aGlzLm5hbWVzcGFjZSsodGhpcy51c2VDb2xvcnM/XCIgJWNcIjpcIiBcIikrclswXSsodGhpcy51c2VDb2xvcnM/XCIlYyBcIjpcIiBcIikrXCIrXCIrY3IuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpLCF0aGlzLnVzZUNvbG9ycylyZXR1cm47bGV0IGU9XCJjb2xvcjogXCIrdGhpcy5jb2xvcjtyLnNwbGljZSgxLDAsZSxcImNvbG9yOiBpbmhlcml0XCIpO2xldCB0PTAsbj0wO3JbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLGk9PntpIT09XCIlJVwiJiYodCsrLGk9PT1cIiVjXCImJihuPXQpKX0pLHIuc3BsaWNlKG4sMCxlKX16LmxvZz1jb25zb2xlLmRlYnVnfHxjb25zb2xlLmxvZ3x8KCgpPT57fSk7ZnVuY3Rpb24geWMocil7dHJ5e3I/ei5zdG9yYWdlLnNldEl0ZW0oXCJkZWJ1Z1wiLHIpOnouc3RvcmFnZS5yZW1vdmVJdGVtKFwiZGVidWdcIil9Y2F0Y2h7fX1mdW5jdGlvbiBiYygpe2xldCByO3RyeXtyPXouc3RvcmFnZS5nZXRJdGVtKFwiZGVidWdcIil9Y2F0Y2h7fXJldHVybiFyJiZ0eXBlb2YgcHJvY2VzczxcInVcIiYmXCJlbnZcImluIHByb2Nlc3MmJihyPXByb2Nlc3MuZW52LkRFQlVHKSxyfWZ1bmN0aW9uIHhjKCl7dHJ5e3JldHVybiBsb2NhbFN0b3JhZ2V9Y2F0Y2h7fX1jci5leHBvcnRzPWNzKCkoeik7dmFye2Zvcm1hdHRlcnM6X2N9PWNyLmV4cG9ydHM7X2Muaj1mdW5jdGlvbihyKXt0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHIpfWNhdGNoKGUpe3JldHVyblwiW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06IFwiK2UubWVzc2FnZX19fSk7dmFyIG5hPVModGk9PntcInVzZSBzdHJpY3RcIjtjKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRpLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciByYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoKXt0aGlzLl9kYXRhTGVuZ3RoPTAsdGhpcy5fYnVmZmVyTGVuZ3RoPTAsdGhpcy5fc3RhdGU9bmV3IEludDMyQXJyYXkoNCksdGhpcy5fYnVmZmVyPW5ldyBBcnJheUJ1ZmZlcig2OCksdGhpcy5fYnVmZmVyOD1uZXcgVWludDhBcnJheSh0aGlzLl9idWZmZXIsMCw2OCksdGhpcy5fYnVmZmVyMzI9bmV3IFVpbnQzMkFycmF5KHRoaXMuX2J1ZmZlciwwLDE3KSx0aGlzLnN0YXJ0KCl9cmV0dXJuIHIuaGFzaFN0cj1mdW5jdGlvbihlLHQpe3JldHVybiB0PT09dm9pZCAwJiYodD0hMSksdGhpcy5vbmVQYXNzSGFzaGVyLnN0YXJ0KCkuYXBwZW5kU3RyKGUpLmVuZCh0KX0sci5oYXNoQXNjaWlTdHI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD09PXZvaWQgMCYmKHQ9ITEpLHRoaXMub25lUGFzc0hhc2hlci5zdGFydCgpLmFwcGVuZEFzY2lpU3RyKGUpLmVuZCh0KX0sci5faGV4PWZ1bmN0aW9uKGUpe3ZhciB0PXIuaGV4Q2hhcnMsbj1yLmhleE91dCxpLG8scyxhO2ZvcihhPTA7YTw0O2ErPTEpZm9yKG89YSo4LGk9ZVthXSxzPTA7czw4O3MrPTIpbltvKzErc109dC5jaGFyQXQoaSYxNSksaT4+Pj00LG5bbyswK3NdPXQuY2hhckF0KGkmMTUpLGk+Pj49NDtyZXR1cm4gbi5qb2luKFwiXCIpfSxyLl9tZDVjeWNsZT1mdW5jdGlvbihlLHQpe3ZhciBuPWVbMF0saT1lWzFdLG89ZVsyXSxzPWVbM107bis9KGkmb3x+aSZzKSt0WzBdLTY4MDg3NjkzNnwwLG49KG48PDd8bj4+PjI1KStpfDAscys9KG4maXx+biZvKSt0WzFdLTM4OTU2NDU4NnwwLHM9KHM8PDEyfHM+Pj4yMCkrbnwwLG8rPShzJm58fnMmaSkrdFsyXSs2MDYxMDU4MTl8MCxvPShvPDwxN3xvPj4+MTUpK3N8MCxpKz0obyZzfH5vJm4pK3RbM10tMTA0NDUyNTMzMHwwLGk9KGk8PDIyfGk+Pj4xMCkrb3wwLG4rPShpJm98fmkmcykrdFs0XS0xNzY0MTg4OTd8MCxuPShuPDw3fG4+Pj4yNSkraXwwLHMrPShuJml8fm4mbykrdFs1XSsxMjAwMDgwNDI2fDAscz0oczw8MTJ8cz4+PjIwKStufDAsbys9KHMmbnx+cyZpKSt0WzZdLTE0NzMyMzEzNDF8MCxvPShvPDwxN3xvPj4+MTUpK3N8MCxpKz0obyZzfH5vJm4pK3RbN10tNDU3MDU5ODN8MCxpPShpPDwyMnxpPj4+MTApK298MCxuKz0oaSZvfH5pJnMpK3RbOF0rMTc3MDAzNTQxNnwwLG49KG48PDd8bj4+PjI1KStpfDAscys9KG4maXx+biZvKSt0WzldLTE5NTg0MTQ0MTd8MCxzPShzPDwxMnxzPj4+MjApK258MCxvKz0ocyZufH5zJmkpK3RbMTBdLTQyMDYzfDAsbz0obzw8MTd8bz4+PjE1KStzfDAsaSs9KG8mc3x+byZuKSt0WzExXS0xOTkwNDA0MTYyfDAsaT0oaTw8MjJ8aT4+PjEwKStvfDAsbis9KGkmb3x+aSZzKSt0WzEyXSsxODA0NjAzNjgyfDAsbj0objw8N3xuPj4+MjUpK2l8MCxzKz0obiZpfH5uJm8pK3RbMTNdLTQwMzQxMTAxfDAscz0oczw8MTJ8cz4+PjIwKStufDAsbys9KHMmbnx+cyZpKSt0WzE0XS0xNTAyMDAyMjkwfDAsbz0obzw8MTd8bz4+PjE1KStzfDAsaSs9KG8mc3x+byZuKSt0WzE1XSsxMjM2NTM1MzI5fDAsaT0oaTw8MjJ8aT4+PjEwKStvfDAsbis9KGkmc3xvJn5zKSt0WzFdLTE2NTc5NjUxMHwwLG49KG48PDV8bj4+PjI3KStpfDAscys9KG4mb3xpJn5vKSt0WzZdLTEwNjk1MDE2MzJ8MCxzPShzPDw5fHM+Pj4yMykrbnwwLG8rPShzJml8biZ+aSkrdFsxMV0rNjQzNzE3NzEzfDAsbz0obzw8MTR8bz4+PjE4KStzfDAsaSs9KG8mbnxzJn5uKSt0WzBdLTM3Mzg5NzMwMnwwLGk9KGk8PDIwfGk+Pj4xMikrb3wwLG4rPShpJnN8byZ+cykrdFs1XS03MDE1NTg2OTF8MCxuPShuPDw1fG4+Pj4yNykraXwwLHMrPShuJm98aSZ+bykrdFsxMF0rMzgwMTYwODN8MCxzPShzPDw5fHM+Pj4yMykrbnwwLG8rPShzJml8biZ+aSkrdFsxNV0tNjYwNDc4MzM1fDAsbz0obzw8MTR8bz4+PjE4KStzfDAsaSs9KG8mbnxzJn5uKSt0WzRdLTQwNTUzNzg0OHwwLGk9KGk8PDIwfGk+Pj4xMikrb3wwLG4rPShpJnN8byZ+cykrdFs5XSs1Njg0NDY0Mzh8MCxuPShuPDw1fG4+Pj4yNykraXwwLHMrPShuJm98aSZ+bykrdFsxNF0tMTAxOTgwMzY5MHwwLHM9KHM8PDl8cz4+PjIzKStufDAsbys9KHMmaXxuJn5pKSt0WzNdLTE4NzM2Mzk2MXwwLG89KG88PDE0fG8+Pj4xOCkrc3wwLGkrPShvJm58cyZ+bikrdFs4XSsxMTYzNTMxNTAxfDAsaT0oaTw8MjB8aT4+PjEyKStvfDAsbis9KGkmc3xvJn5zKSt0WzEzXS0xNDQ0NjgxNDY3fDAsbj0objw8NXxuPj4+MjcpK2l8MCxzKz0obiZvfGkmfm8pK3RbMl0tNTE0MDM3ODR8MCxzPShzPDw5fHM+Pj4yMykrbnwwLG8rPShzJml8biZ+aSkrdFs3XSsxNzM1MzI4NDczfDAsbz0obzw8MTR8bz4+PjE4KStzfDAsaSs9KG8mbnxzJn5uKSt0WzEyXS0xOTI2NjA3NzM0fDAsaT0oaTw8MjB8aT4+PjEyKStvfDAsbis9KGleb15zKSt0WzVdLTM3ODU1OHwwLG49KG48PDR8bj4+PjI4KStpfDAscys9KG5eaV5vKSt0WzhdLTIwMjI1NzQ0NjN8MCxzPShzPDwxMXxzPj4+MjEpK258MCxvKz0oc15uXmkpK3RbMTFdKzE4MzkwMzA1NjJ8MCxvPShvPDwxNnxvPj4+MTYpK3N8MCxpKz0ob15zXm4pK3RbMTRdLTM1MzA5NTU2fDAsaT0oaTw8MjN8aT4+PjkpK298MCxuKz0oaV5vXnMpK3RbMV0tMTUzMDk5MjA2MHwwLG49KG48PDR8bj4+PjI4KStpfDAscys9KG5eaV5vKSt0WzRdKzEyNzI4OTMzNTN8MCxzPShzPDwxMXxzPj4+MjEpK258MCxvKz0oc15uXmkpK3RbN10tMTU1NDk3NjMyfDAsbz0obzw8MTZ8bz4+PjE2KStzfDAsaSs9KG9ec15uKSt0WzEwXS0xMDk0NzMwNjQwfDAsaT0oaTw8MjN8aT4+PjkpK298MCxuKz0oaV5vXnMpK3RbMTNdKzY4MTI3OTE3NHwwLG49KG48PDR8bj4+PjI4KStpfDAscys9KG5eaV5vKSt0WzBdLTM1ODUzNzIyMnwwLHM9KHM8PDExfHM+Pj4yMSkrbnwwLG8rPShzXm5eaSkrdFszXS03MjI1MjE5Nzl8MCxvPShvPDwxNnxvPj4+MTYpK3N8MCxpKz0ob15zXm4pK3RbNl0rNzYwMjkxODl8MCxpPShpPDwyM3xpPj4+OSkrb3wwLG4rPShpXm9ecykrdFs5XS02NDAzNjQ0ODd8MCxuPShuPDw0fG4+Pj4yOCkraXwwLHMrPShuXmlebykrdFsxMl0tNDIxODE1ODM1fDAscz0oczw8MTF8cz4+PjIxKStufDAsbys9KHNebl5pKSt0WzE1XSs1MzA3NDI1MjB8MCxvPShvPDwxNnxvPj4+MTYpK3N8MCxpKz0ob15zXm4pK3RbMl0tOTk1MzM4NjUxfDAsaT0oaTw8MjN8aT4+PjkpK298MCxuKz0ob14oaXx+cykpK3RbMF0tMTk4NjMwODQ0fDAsbj0objw8NnxuPj4+MjYpK2l8MCxzKz0oaV4obnx+bykpK3RbN10rMTEyNjg5MTQxNXwwLHM9KHM8PDEwfHM+Pj4yMikrbnwwLG8rPShuXihzfH5pKSkrdFsxNF0tMTQxNjM1NDkwNXwwLG89KG88PDE1fG8+Pj4xNykrc3wwLGkrPShzXihvfH5uKSkrdFs1XS01NzQzNDA1NXwwLGk9KGk8PDIxfGk+Pj4xMSkrb3wwLG4rPShvXihpfH5zKSkrdFsxMl0rMTcwMDQ4NTU3MXwwLG49KG48PDZ8bj4+PjI2KStpfDAscys9KGleKG58fm8pKSt0WzNdLTE4OTQ5ODY2MDZ8MCxzPShzPDwxMHxzPj4+MjIpK258MCxvKz0obl4oc3x+aSkpK3RbMTBdLTEwNTE1MjN8MCxvPShvPDwxNXxvPj4+MTcpK3N8MCxpKz0oc14ob3x+bikpK3RbMV0tMjA1NDkyMjc5OXwwLGk9KGk8PDIxfGk+Pj4xMSkrb3wwLG4rPShvXihpfH5zKSkrdFs4XSsxODczMzEzMzU5fDAsbj0objw8NnxuPj4+MjYpK2l8MCxzKz0oaV4obnx+bykpK3RbMTVdLTMwNjExNzQ0fDAscz0oczw8MTB8cz4+PjIyKStufDAsbys9KG5eKHN8fmkpKSt0WzZdLTE1NjAxOTgzODB8MCxvPShvPDwxNXxvPj4+MTcpK3N8MCxpKz0oc14ob3x+bikpK3RbMTNdKzEzMDkxNTE2NDl8MCxpPShpPDwyMXxpPj4+MTEpK298MCxuKz0ob14oaXx+cykpK3RbNF0tMTQ1NTIzMDcwfDAsbj0objw8NnxuPj4+MjYpK2l8MCxzKz0oaV4obnx+bykpK3RbMTFdLTExMjAyMTAzNzl8MCxzPShzPDwxMHxzPj4+MjIpK258MCxvKz0obl4oc3x+aSkpK3RbMl0rNzE4Nzg3MjU5fDAsbz0obzw8MTV8bz4+PjE3KStzfDAsaSs9KHNeKG98fm4pKSt0WzldLTM0MzQ4NTU1MXwwLGk9KGk8PDIxfGk+Pj4xMSkrb3wwLGVbMF09bitlWzBdfDAsZVsxXT1pK2VbMV18MCxlWzJdPW8rZVsyXXwwLGVbM109cytlWzNdfDB9LHIucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGFMZW5ndGg9MCx0aGlzLl9idWZmZXJMZW5ndGg9MCx0aGlzLl9zdGF0ZS5zZXQoci5zdGF0ZUlkZW50aXR5KSx0aGlzfSxyLnByb3RvdHlwZS5hcHBlbmRTdHI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fYnVmZmVyOCxuPXRoaXMuX2J1ZmZlcjMyLGk9dGhpcy5fYnVmZmVyTGVuZ3RoLG8scztmb3Iocz0wO3M8ZS5sZW5ndGg7cys9MSl7aWYobz1lLmNoYXJDb2RlQXQocyksbzwxMjgpdFtpKytdPW87ZWxzZSBpZihvPDIwNDgpdFtpKytdPShvPj4+NikrMTkyLHRbaSsrXT1vJjYzfDEyODtlbHNlIGlmKG88NTUyOTZ8fG8+NTYzMTkpdFtpKytdPShvPj4+MTIpKzIyNCx0W2krK109bz4+PjYmNjN8MTI4LHRbaSsrXT1vJjYzfDEyODtlbHNle2lmKG89KG8tNTUyOTYpKjEwMjQrKGUuY2hhckNvZGVBdCgrK3MpLTU2MzIwKSs2NTUzNixvPjExMTQxMTEpdGhyb3cgbmV3IEVycm9yKFwiVW5pY29kZSBzdGFuZGFyZCBzdXBwb3J0cyBjb2RlIHBvaW50cyB1cCB0byBVKzEwRkZGRlwiKTt0W2krK109KG8+Pj4xOCkrMjQwLHRbaSsrXT1vPj4+MTImNjN8MTI4LHRbaSsrXT1vPj4+NiY2M3wxMjgsdFtpKytdPW8mNjN8MTI4fWk+PTY0JiYodGhpcy5fZGF0YUxlbmd0aCs9NjQsci5fbWQ1Y3ljbGUodGhpcy5fc3RhdGUsbiksaS09NjQsblswXT1uWzE2XSl9cmV0dXJuIHRoaXMuX2J1ZmZlckxlbmd0aD1pLHRoaXN9LHIucHJvdG90eXBlLmFwcGVuZEFzY2lpU3RyPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLl9idWZmZXI4LG49dGhpcy5fYnVmZmVyMzIsaT10aGlzLl9idWZmZXJMZW5ndGgsbyxzPTA7Oyl7Zm9yKG89TWF0aC5taW4oZS5sZW5ndGgtcyw2NC1pKTtvLS07KXRbaSsrXT1lLmNoYXJDb2RlQXQocysrKTtpZihpPDY0KWJyZWFrO3RoaXMuX2RhdGFMZW5ndGgrPTY0LHIuX21kNWN5Y2xlKHRoaXMuX3N0YXRlLG4pLGk9MH1yZXR1cm4gdGhpcy5fYnVmZmVyTGVuZ3RoPWksdGhpc30sci5wcm90b3R5cGUuYXBwZW5kQnl0ZUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLl9idWZmZXI4LG49dGhpcy5fYnVmZmVyMzIsaT10aGlzLl9idWZmZXJMZW5ndGgsbyxzPTA7Oyl7Zm9yKG89TWF0aC5taW4oZS5sZW5ndGgtcyw2NC1pKTtvLS07KXRbaSsrXT1lW3MrK107aWYoaTw2NClicmVhazt0aGlzLl9kYXRhTGVuZ3RoKz02NCxyLl9tZDVjeWNsZSh0aGlzLl9zdGF0ZSxuKSxpPTB9cmV0dXJuIHRoaXMuX2J1ZmZlckxlbmd0aD1pLHRoaXN9LHIucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fc3RhdGU7cmV0dXJue2J1ZmZlcjpTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsQXJyYXkuZnJvbSh0aGlzLl9idWZmZXI4KSksYnVmbGVuOnRoaXMuX2J1ZmZlckxlbmd0aCxsZW5ndGg6dGhpcy5fZGF0YUxlbmd0aCxzdGF0ZTpbZVswXSxlWzFdLGVbMl0sZVszXV19fSxyLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlKXt2YXIgdD1lLmJ1ZmZlcixuPWUuc3RhdGUsaT10aGlzLl9zdGF0ZSxvO2Zvcih0aGlzLl9kYXRhTGVuZ3RoPWUubGVuZ3RoLHRoaXMuX2J1ZmZlckxlbmd0aD1lLmJ1ZmxlbixpWzBdPW5bMF0saVsxXT1uWzFdLGlbMl09blsyXSxpWzNdPW5bM10sbz0wO288dC5sZW5ndGg7bys9MSl0aGlzLl9idWZmZXI4W29dPXQuY2hhckNvZGVBdChvKX0sci5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKGUpe2U9PT12b2lkIDAmJihlPSExKTt2YXIgdD10aGlzLl9idWZmZXJMZW5ndGgsbj10aGlzLl9idWZmZXI4LGk9dGhpcy5fYnVmZmVyMzIsbz0odD4+MikrMTt0aGlzLl9kYXRhTGVuZ3RoKz10O3ZhciBzPXRoaXMuX2RhdGFMZW5ndGgqODtpZihuW3RdPTEyOCxuW3QrMV09blt0KzJdPW5bdCszXT0wLGkuc2V0KHIuYnVmZmVyMzJJZGVudGl0eS5zdWJhcnJheShvKSxvKSx0PjU1JiYoci5fbWQ1Y3ljbGUodGhpcy5fc3RhdGUsaSksaS5zZXQoci5idWZmZXIzMklkZW50aXR5KSksczw9NDI5NDk2NzI5NSlpWzE0XT1zO2Vsc2V7dmFyIGE9cy50b1N0cmluZygxNikubWF0Y2goLyguKj8pKC57MCw4fSkkLyk7aWYoYT09PW51bGwpcmV0dXJuO3ZhciB1PXBhcnNlSW50KGFbMl0sMTYpLGY9cGFyc2VJbnQoYVsxXSwxNil8fDA7aVsxNF09dSxpWzE1XT1mfXJldHVybiByLl9tZDVjeWNsZSh0aGlzLl9zdGF0ZSxpKSxlP3RoaXMuX3N0YXRlOnIuX2hleCh0aGlzLl9zdGF0ZSl9LHIuc3RhdGVJZGVudGl0eT1uZXcgSW50MzJBcnJheShbMTczMjU4NDE5MywtMjcxNzMzODc5LC0xNzMyNTg0MTk0LDI3MTczMzg3OF0pLHIuYnVmZmVyMzJJZGVudGl0eT1uZXcgSW50MzJBcnJheShbMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0pLHIuaGV4Q2hhcnM9XCIwMTIzNDU2Nzg5YWJjZGVmXCIsci5oZXhPdXQ9W10sci5vbmVQYXNzSGFzaGVyPW5ldyByLHJ9KCk7dGkuTWQ1PXJhO2lmKHJhLmhhc2hTdHIoXCJoZWxsb1wiKSE9PVwiNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTJcIil0aHJvdyBuZXcgRXJyb3IoXCJNZDUgc2VsZiB0ZXN0IGZhaWxlZC5cIil9KTt2YXIgaWw9e307UHQoaWwse0FBQ0RlcGF5OigpPT5vdCxCYXNpY0RlcGF5OigpPT5zcixDYW52YXNTaW5rOigpPT5zdCxIMjY0RGVwYXk6KCk9PmN0LEh0bWw1Q2FudmFzUGlwZWxpbmU6KCk9PkhyLEh0bWw1VmlkZW9NZXRhZGF0YVBpcGVsaW5lOigpPT5xcixIdG1sNVZpZGVvUGlwZWxpbmU6KCk9Pl90LEh0dHBNc2VQaXBlbGluZTooKT0+R3IsSHR0cFNvdXJjZTooKT0+ZHIsSW5zcGVjdG9yOigpPT5wcixKUEVHRGVwYXk6KCk9Pmx0LE1lc3NhZ2VUeXBlOigpPT5JLE1ldGFkYXRhUGlwZWxpbmU6KCk9PmpyLE1wNENhcHR1cmU6KCk9Pm1yLE1wNE11eGVyOigpPT5wdCxNc2VTaW5rOigpPT5UZSxPTlZJRkRlcGF5OigpPT5DZSxQaXBlbGluZTooKT0+QmUsUlRDUFBhY2tldFR5cGU6KCk9PktuLFJUU1BSZXNwb25zZUVycm9yOigpPT5JdCxSVFNQX01FVEhPRDooKT0+T3IsUnRzcE1qcGVnUGlwZWxpbmU6KCk9Pnh0LFJ0c3BNcDRQaXBlbGluZTooKT0+YnQsUnRzcFBhcnNlcjooKT0+bXQsUnRzcFBpcGVsaW5lOigpPT5lZSxSdHNwU2Vzc2lvbjooKT0+eXQsU0RFU0l0ZW06KCk9PkpuLFNSOigpPT5IcyxTY2hlZHVsZXI6KCk9PldlLFNpbms6KCk9PlEsU291cmNlOigpPT5WLFR1YmU6KCk9PlIsV1NTb3VyY2U6KCk9PkcsV3NTZHBQaXBlbGluZTooKT0+V3IsYWRkUlRTUFJldHJ5OigpPT5hYSxib2R5T2Zmc2V0OigpPT5BcixjU3JjOigpPT5ucyxjU3JjQ291bnQ6KCk9PlNlLGNvbXBvbmVudHM6KCk9PmVpLGNvbm5lY3Rpb25FbmRlZDooKT0+THIsY29udGVudEJhc2U6KCk9PkJyLGNvbnRlbnRMb2NhdGlvbjooKT0+TXIsY3JlYXRlVHJhbnNmb3JtOigpPT55ZSxleHRIZWFkZXI6KCk9PmlzLGV4dEhlYWRlckxlbmd0aDooKT0+TXQsZXh0ZW5zaW9uOigpPT5vcixleHRyYWN0SGVhZGVyVmFsdWU6KCk9PnJlLGV4dHJhY3RVUklzOigpPT5KcyxnZXRUaW1lOigpPT5Qcixpc1J0Y3BBcHA6KCk9PiRzLGlzUnRjcEJ5ZTooKT0+d3IsaXNSdGNwUlI6KCk9PmpzLGlzUnRjcFNERVM6KCk9PldzLGlzUnRjcFNSOigpPT5fcixtYXJrZXI6KCk9PmNlLG1lc3NhZ2VGcm9tQnVmZmVyOigpPT5TcixwYWRkaW5nOigpPT5lcyxwYXJzZTooKT0+UW4scGFyc2VSdGNwOigpPT5YbixwYXlsb2FkOigpPT5aLHBheWxvYWRUeXBlOigpPT5PLHBpcGVsaW5lczooKT0+bmkscmFuZ2U6KCk9PklyLHJ0Y3BNZXNzYWdlRnJvbUJ1ZmZlcjooKT0+eHIsc1NyYzooKT0+cnMsc2VxdWVuY2U6KCk9PlJyLHNlcXVlbmNlTnVtYmVyOigpPT50cyxzZXNzaW9uSWQ6KCk9PlRyLHNlc3Npb25UaW1lb3V0OigpPT5DcixzdGF0dXNDb2RlOigpPT5odCx0aW1lc3RhbXA6KCk9PkgsdXRpbHM6KCk9PmlpLHZlcnNpb246KCk9PlpvfSk7bW9kdWxlLmV4cG9ydHM9bWEoaWwpO2MoKTt2YXIgZWk9e307UHQoZWkse0FBQ0RlcGF5OigpPT5vdCxCYXNpY0RlcGF5OigpPT5zcixDYW52YXNTaW5rOigpPT5zdCxIMjY0RGVwYXk6KCk9PmN0LEh0dHBTb3VyY2U6KCk9PmRyLEluc3BlY3RvcjooKT0+cHIsSlBFR0RlcGF5OigpPT5sdCxNZXNzYWdlVHlwZTooKT0+SSxNcDRDYXB0dXJlOigpPT5tcixNcDRNdXhlcjooKT0+cHQsTXNlU2luazooKT0+VGUsT05WSUZEZXBheTooKT0+Q2UsUlRTUFJlc3BvbnNlRXJyb3I6KCk9Pkl0LFJUU1BfTUVUSE9EOigpPT5PcixSdHNwUGFyc2VyOigpPT5tdCxSdHNwU2Vzc2lvbjooKT0+eXQsU2luazooKT0+USxTb3VyY2U6KCk9PlYsVHViZTooKT0+UixXU1NvdXJjZTooKT0+RyxjcmVhdGVUcmFuc2Zvcm06KCk9PnllfSk7YygpO2MoKTt2YXIgZ2U9QyhOKCkpO2MoKTt2YXIgRWU9QyhOKCkpLGZlPWNsYXNze3N0YXRpYyBjb25zdW1lcihlPSgpPT57fSl7cmV0dXJuIG5ldyBFZS5Xcml0YWJsZSh7b2JqZWN0TW9kZTohMCx3cml0ZSh0LG4saSl7ZSh0KSxpKCl9fSl9c3RhdGljIHBlZWtlcihlKXtpZih0eXBlb2YgZSE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBFcnJvcihcInlvdSBtdXN0IHN1cHBseSBhIGZ1bmN0aW9uXCIpO3JldHVybiBuZXcgRWUuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybSh0LG4saSl7ZSh0KSxpKHZvaWQgMCx0KX19KX1zdGF0aWMgcHJvZHVjZXIoZSl7bGV0IHQ9MDtyZXR1cm4gbmV3IEVlLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwLHJlYWQoKXtlIT09dm9pZCAwJiYodDxlLmxlbmd0aD90aGlzLnB1c2goZVt0KytdKTp0aGlzLnB1c2gobnVsbCkpfX0pfXN0YXRpYyByZWNvcmRlcihlLHQpe3JldHVybiBuZXcgRWUuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybShuLGksbyl7bGV0IHM9RGF0ZS5ub3coKSxhPU9iamVjdC5hc3NpZ24oe30sbix7ZGF0YTpuLmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9KTt0LndyaXRlKEpTT04uc3RyaW5naWZ5KHt0eXBlOmUsdGltZXN0YW1wOnMsbWVzc2FnZTphfSxudWxsLDIpKSx0LndyaXRlKGAsXG5gKSxvKHZvaWQgMCxuKX19KX1zdGF0aWMgcmVwbGF5ZXIoZSl7bGV0IHQ9MCxuPWVbMF0udGltZXN0YW1wO3JldHVybiBuZXcgRWUuUmVhZGFibGUoe29iamVjdE1vZGU6ITAscmVhZCgpe2xldCBpPWVbdCsrXTtpZihpKXtsZXR7dHlwZTpvLHRpbWVzdGFtcDpzLG1lc3NhZ2U6YX09aSx1PXMtbjtpZihuPXMsYSl7bGV0IGY9YS5kYXRhP0J1ZmZlci5mcm9tKGEuZGF0YSxcImJhc2U2NFwiKTpCdWZmZXIuYWxsb2MoMCksbD1PYmplY3QuYXNzaWduKHt9LGEse2RhdGE6Zn0pO3RoaXMucHVzaCh7dHlwZTpvLGRlbGF5OnUsbXNnOmx9KX1lbHNlIHRoaXMucHVzaCh7dHlwZTpvLGRlbGF5OnUsbXNnOm51bGx9KX1lbHNlIHRoaXMucHVzaChudWxsKX19KX19O3ZhciBpcj1jbGFzc3t9LFY9Y2xhc3MgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcih0PW5ldyBnZS5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMH0pLG49bmV3IGdlLldyaXRhYmxlKHtvYmplY3RNb2RlOiEwfSkpe3N1cGVyKCk7dGhpcy5pbmNvbWluZz10LHRoaXMub3V0Z29pbmc9bix0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXY9bnVsbH1zdGF0aWMgZnJvbU1lc3NhZ2VzKHQpe3JldHVybiBuZXcgVihmZS5wcm9kdWNlcih0KSxmZS5jb25zdW1lcigpKX1jb25uZWN0KHQpe2lmKHQ9PT1udWxsKXJldHVybiB0aGlzO2lmKHRoaXMubmV4dCE9PW51bGx8fHQucHJldiE9PW51bGwpdGhyb3cgbmV3IEVycm9yKFwiY29ubmVjdGlvbiBmYWlsZWQ6IGNvbXBvbmVudChzKSBhbHJlYWR5IGNvbm5lY3RlZFwiKTtpZighdGhpcy5pbmNvbWluZy5yZWFkYWJsZXx8IXRoaXMub3V0Z29pbmcud3JpdGFibGUpdGhyb3cgbmV3IEVycm9yKFwiY29ubmVjdGlvbiBmYWlsZWQ6IHRoaXMgY29tcG9uZW50IG5vdCBjb21wYXRpYmxlXCIpO2lmKCF0LmluY29taW5nLndyaXRhYmxlfHwhdC5vdXRnb2luZy5yZWFkYWJsZSl0aHJvdyBuZXcgRXJyb3IoXCJjb25uZWN0aW9uIGZhaWxlZDogbmV4dCBjb21wb25lbnQgbm90IGNvbXBhdGlibGVcIik7dHJ5e3RoaXMuaW5jb21pbmcucGlwZSh0LmluY29taW5nKSx0Lm91dGdvaW5nLnBpcGUodGhpcy5vdXRnb2luZyl9Y2F0Y2gobyl7dGhyb3cgbmV3IEVycm9yKGBjb25uZWN0aW9uIGZhaWxlZDogJHtvLm1lc3NhZ2V9YCl9bGV0IG49bz0+e3RoaXMuaW5jb21pbmcuZW1pdChcImVycm9yXCIsbyl9O3QuaW5jb21pbmcub24oXCJlcnJvclwiLG4pO2xldCBpPW89Pnt0Lm91dGdvaW5nLmVtaXQoXCJlcnJvclwiLG8pfTtyZXR1cm4gdGhpcy5vdXRnb2luZy5vbihcImVycm9yXCIsaSksdGhpcy5uZXh0PXQsdC5wcmV2PXRoaXMsdGhpcy5faW5jb21pbmdFcnJvckhhbmRsZXI9bix0aGlzLl9vdXRnb2luZ0Vycm9ySGFuZGxlcj1pLHR9ZGlzY29ubmVjdCgpe2xldCB0PXRoaXMubmV4dDtyZXR1cm4gdCE9PW51bGwmJih0aGlzLmluY29taW5nLnVucGlwZSh0LmluY29taW5nKSx0Lm91dGdvaW5nLnVucGlwZSh0aGlzLm91dGdvaW5nKSx0eXBlb2YgdGhpcy5faW5jb21pbmdFcnJvckhhbmRsZXI8XCJ1XCImJnQuaW5jb21pbmcucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLHRoaXMuX2luY29taW5nRXJyb3JIYW5kbGVyKSx0eXBlb2YgdGhpcy5fb3V0Z29pbmdFcnJvckhhbmRsZXI8XCJ1XCImJnRoaXMub3V0Z29pbmcucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLHRoaXMuX291dGdvaW5nRXJyb3JIYW5kbGVyKSx0aGlzLm5leHQ9bnVsbCx0LnByZXY9bnVsbCxkZWxldGUgdGhpcy5faW5jb21pbmdFcnJvckhhbmRsZXIsZGVsZXRlIHRoaXMuX291dGdvaW5nRXJyb3JIYW5kbGVyKSx0aGlzfX0sUj1jbGFzcyBleHRlbmRzIFZ7Y29uc3RydWN0b3IodD1uZXcgZ2UuUGFzc1Rocm91Z2goe29iamVjdE1vZGU6ITB9KSxuPW5ldyBnZS5QYXNzVGhyb3VnaCh7b2JqZWN0TW9kZTohMH0pKXtzdXBlcih0LG4pO3RoaXMuaW5jb21pbmc9dCx0aGlzLm91dGdvaW5nPW59c3RhdGljIGZyb21IYW5kbGVycyh0LG4pe2xldCBpPXQ/ZmUucGVla2VyKHQpOnZvaWQgMCxvPW4/ZmUucGVla2VyKG4pOnZvaWQgMDtyZXR1cm4gbmV3IFIoaSxvKX19LFE9Y2xhc3MgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcih0PW5ldyBnZS5Xcml0YWJsZSh7b2JqZWN0TW9kZTohMH0pLG49bmV3IGdlLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwfSkpe3N1cGVyKCk7dGhpcy5pbmNvbWluZz10LHRoaXMub3V0Z29pbmc9bix0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXY9bnVsbH1zdGF0aWMgZnJvbUhhbmRsZXIodCl7bGV0IG49bmV3IFEoZmUuY29uc3VtZXIodCksZmUucHJvZHVjZXIodm9pZCAwKSk7cmV0dXJuIG4uaW5jb21pbmcub24oXCJmaW5pc2hcIiwoKT0+e24ub3V0Z29pbmcucHVzaChudWxsKX0pLG59Y29ubmVjdCgpe3Rocm93IG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZmFpbGVkOiBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgYWZ0ZXIgYSBzaW5rXCIpfWRpc2Nvbm5lY3QoKXtyZXR1cm4gdGhpc319O2MoKTtjKCk7YygpO3ZhciBpdD1bMTI4LDY0LDMyLDE2LDgsNCwyLDFdO3ZhciBabz1yPT5yWzBdPj4+Nixlcz1yPT4hIShyWzBdJml0WzJdKSxvcj1yPT4hIShyWzBdJml0WzNdKSxTZT1yPT5yWzBdJjE1LGNlPXI9PiEhKHJbMV0maXRbMF0pLE89cj0+clsxXSYxMjcsdHM9cj0+ci5yZWFkVUludDE2QkUoMiksSD1yPT5yLnJlYWRVSW50MzJCRSg0KSxycz1yPT5yLnJlYWRVSW50MzJCRSg4KSxucz0ocixlPTApPT5TZShyKT5lP3IucmVhZFVJbnQzMkJFKDEyK2UqNCk6MCxNdD1yPT5vcihyKT9yLnJlYWRVSW50MTZCRSgxMitTZShyKSo0KzIpOjAsaXM9cj0+TXQocik9PT0wP0J1ZmZlci5mcm9tKFtdKTpyLnNsaWNlKDEyK1NlKHIpKjQsMTIrU2UocikqNCs0K010KHIpKjQpLFo9cj0+b3Iocik/ci5zbGljZSgxMitTZShyKSo0KzQrTXQocikqNCk6ci5zbGljZSgxMitTZShyKSo0KTtjKCk7dmFyIEk9KGQ9PihkW2QuVU5LTk9XTj0wXT1cIlVOS05PV05cIixkW2QuUkFXPTFdPVwiUkFXXCIsZFtkLlJUUD0yXT1cIlJUUFwiLGRbZC5SVENQPTNdPVwiUlRDUFwiLGRbZC5SVFNQPTRdPVwiUlRTUFwiLGRbZC5TRFA9NV09XCJTRFBcIixkW2QuRUxFTUVOVEFSWT02XT1cIkVMRU1FTlRBUllcIixkW2QuSDI2ND03XT1cIkgyNjRcIixkW2QuSVNPTT04XT1cIklTT01cIixkW2QuWE1MPTldPVwiWE1MXCIsZFtkLkpQRUc9MTBdPVwiSlBFR1wiLGQpKShJfHx7fSk7YygpO2Z1bmN0aW9uIG9zKHIsZSx0KXtsZXQgbj1aKHIuZGF0YSksaT0wO2lmKGUpe2xldCBzPW4ucmVhZFVJbnQxNkJFKDApO2k9MisocytzJTgpLzh9bGV0IG89e3R5cGU6NixkYXRhOm4uc2xpY2UoaSkscGF5bG9hZFR5cGU6TyhyLmRhdGEpLHRpbWVzdGFtcDpIKHIuZGF0YSksbnRwVGltZXN0YW1wOnIubnRwVGltZXN0YW1wfTt0KG8pfWMoKTt2YXIgc3M9QyhOKCkpLHllPXI9Pm5ldyBzcy5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOnJ9KTt2YXIgb3Q9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCl7bGV0IGUsdCxuPXllKGZ1bmN0aW9uKGksbyxzKXtpZihpLnR5cGU9PT01KXtsZXQgYTtmb3IobGV0IHUgb2YgaS5zZHAubWVkaWEpdS50eXBlPT09XCJhdWRpb1wiJiZ1LmZtdHAmJnUuZm10cC5wYXJhbWV0ZXJzJiZ1LmZtdHAucGFyYW1ldGVycy5tb2RlPT09XCJBQUMtaGJyXCImJihhPXUpO2lmKGEmJmEucnRwbWFwIT09dm9pZCAwKXtlPU51bWJlcihhLnJ0cG1hcC5wYXlsb2FkVHlwZSk7bGV0IHU9YS5mbXRwLnBhcmFtZXRlcnMsZj1OdW1iZXIodS5zaXplbGVuZ3RoKXx8MCxsPU51bWJlcih1LmluZGV4bGVuZ3RoKXx8MCxkPU51bWJlcih1LmluZGV4ZGVsdGFsZW5ndGgpfHwwLGg9TnVtYmVyKHUuY3RzZGVsdGFsZW5ndGgpfHwwLG09TnVtYmVyKHUuZHRzZGVsdGFsZW5ndGgpfHwwLGI9TnVtYmVyKHUucmFuZG9tYWNjZXNzaW5kaWNhdGlvbil8fDAseT1OdW1iZXIodS5zdHJlYW1zdGF0ZWluZGljYXRpb24pfHwwLHc9TnVtYmVyKHUuYXV4aWxpYXJ5ZGF0YXNpemVsZW5ndGgpfHwwO3Q9ZitNYXRoLm1heChsLGQpK2grbStiK3krdz4wfXModm9pZCAwLGkpfWVsc2UgaS50eXBlPT09MiYmTyhpLmRhdGEpPT09ZT8ob3MoaSx0LHRoaXMucHVzaC5iaW5kKHRoaXMpKSxzKCkpOnModm9pZCAwLGkpfSk7c3VwZXIobil9fTtjKCk7dmFyIHNyPWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3RvcihlKXtpZihlPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInlvdSBtdXN0IHN1cHBseSBhIHBheWxvYWQgdHlwZSB0byBCYXNpY0RlcGF5Q29tcG9uZW50XCIpO2xldCB0PUJ1ZmZlci5hbGxvYygwKSxuPXllKGZ1bmN0aW9uKGksbyxzKXtpZihpLnR5cGU9PT0yJiZPKGkuZGF0YSk9PT1lKXtsZXQgYT1aKGkuZGF0YSk7dD1CdWZmZXIuY29uY2F0KFt0LGFdKSxjZShpLmRhdGEpJiYodC5sZW5ndGg+MCYmdGhpcy5wdXNoKHtkYXRhOnQsdGltZXN0YW1wOkgoaS5kYXRhKSxudHBUaW1lc3RhbXA6aS5udHBUaW1lc3RhbXAscGF5bG9hZFR5cGU6TyhpLmRhdGEpLHR5cGU6Nn0pLHQ9QnVmZmVyLmFsbG9jKDApKSxzKCl9ZWxzZSBzKHZvaWQgMCxpKX0pO3N1cGVyKG4pfX07YygpO2MoKTt2YXIgYXI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmVsYXBzZWQ9MCx0aGlzLnN0YXJ0ZWQ9MCx0aGlzLnN0b3BwZWQ9ITB9c3RhcnQoKXt0aGlzLnN0b3BwZWQmJih0aGlzLnN0YXJ0ZWQ9d2luZG93LnBlcmZvcm1hbmNlLm5vdygpLHRoaXMuc3RvcHBlZD0hMSl9c3RvcCgpe3RoaXMuc3RvcHBlZHx8KHRoaXMuZWxhcHNlZD10aGlzLm5vdygpLHRoaXMuc3RvcHBlZD0hMCl9cmVzZXQoKXt0aGlzLmVsYXBzZWQ9MCx0aGlzLnN0YXJ0ZWQ9MCx0aGlzLnN0b3BwZWQ9ITB9bm93KCl7cmV0dXJuIHRoaXMuc3RvcHBlZD90aGlzLmVsYXBzZWQ6dGhpcy5lbGFwc2VkKyh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCktdGhpcy5zdGFydGVkKX1wbGF5KCl7dGhpcy5zdGFydCgpfXBhdXNlKCl7dGhpcy5zdG9wKCl9Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMubm93KCkvMWUzfX07YygpO3ZhciBXZT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbj0xMCl7dGhpcy5fY2xvY2s9ZSx0aGlzLl9oYW5kbGVyPXQsdGhpcy5fdG9sZXJhbmNlPW4sdGhpcy5fbmV4dFJ1bj0wLHRoaXMuX25leHRQbGF5PTAsdGhpcy5fZmlmbz1bXSx0aGlzLl9udHBQcmVzZW50YXRpb25UaW1lPTAsdGhpcy5fc3VzcGVuZGVkPSExfXJlc2V0KCl7Y2xlYXJUaW1lb3V0KHRoaXMuX25leHRSdW4pLGNsZWFyVGltZW91dCh0aGlzLl9uZXh0UGxheSksdGhpcy5fZmlmbz1bXSx0aGlzLl9udHBQcmVzZW50YXRpb25UaW1lPTAsdGhpcy5fc3VzcGVuZGVkPSExfWluaXQoZSl7dGhpcy5fbnRwUHJlc2VudGF0aW9uVGltZT1lfXN1c3BlbmQoKXtjbGVhclRpbWVvdXQodGhpcy5fbmV4dFBsYXkpLHRoaXMuX3N1c3BlbmRlZD0hMH1yZXN1bWUoKXt0aGlzLl9zdXNwZW5kZWQ9ITEsdGhpcy5ydW4odm9pZCAwKX1ydW4oZSl7aWYoY2xlYXJUaW1lb3V0KHRoaXMuX25leHRSdW4pLHR5cGVvZiB0aGlzLl9udHBQcmVzZW50YXRpb25UaW1lPlwidVwifHwodHlwZW9mIGU8XCJ1XCImJnRoaXMuX2ZpZm8ucHVzaChlKSx0aGlzLl9zdXNwZW5kZWQpfHx0aGlzLl9maWZvLmxlbmd0aD09PTApcmV0dXJuO2xldCB0PTAsbjtkb3tsZXQgaT10aGlzLl9maWZvLnNoaWZ0KCk7aWYoaT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJpbnRlcm5hbCBlcnJvcjogbWVzc2FnZSBzaG91bGQgbmV2ZXIgYmUgdW5kZWZpbmVkXCIpO249aTtsZXQgbz1uLm50cFRpbWVzdGFtcDtpZihvPT09dm9pZCAwKWNvbnRpbnVlO3Q9by10aGlzLl9udHBQcmVzZW50YXRpb25UaW1lLXRoaXMuX2Nsb2NrLmN1cnJlbnRUaW1lKjFlMyxNYXRoLmFicyh0KTx0aGlzLl90b2xlcmFuY2UmJnRoaXMuX2hhbmRsZXImJnRoaXMuX2hhbmRsZXIobil9d2hpbGUodDx0aGlzLl90b2xlcmFuY2UmJnRoaXMuX2ZpZm8ubGVuZ3RoPjApO3Q8LXRoaXMuX3RvbGVyYW5jZT8oY2xlYXJUaW1lb3V0KHRoaXMuX25leHRQbGF5KSx0aGlzLl9jbG9jay5wYXVzZSgpLHRoaXMuX25leHRQbGF5PXdpbmRvdy5zZXRUaW1lb3V0KCgpPT50aGlzLl9jbG9jay5wbGF5KCksLXQpKTp0PnRoaXMuX3RvbGVyYW5jZSYmKHRoaXMuX2ZpZm8udW5zaGlmdChuKSx0aGlzLl9uZXh0UnVuPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT50aGlzLnJ1bih2b2lkIDApLHQpKX19O3ZhciB1cj1DKE4oKSksYWM9cj0+e3IuYml0cmF0ZT0wLHIuZnJhbWVyYXRlPTAsci5yZW5kZXJlZEZyYW1lcz0wfSx1Yz1yPT57bGV0IGU9MCx0PTAsbj0wO3JldHVybihpLHtieXRlTGVuZ3RoOm8sZHVyYXRpb246c30pPT57aWYoZSs9byx0Kz1zLG4rKyx0Pj1yKXtsZXQgYT04KmUsdT1uLGY9dC9yO2kuYml0cmF0ZT1hL2YsaS5mcmFtZXJhdGU9dS9mLGU9MCx0PTAsbj0wfX19LHN0PWNsYXNzIGV4dGVuZHMgUXtjb25zdHJ1Y3Rvcih0KXtpZih0PT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImNhbnZhcyBlbGVtZW50IGFyZ3VtZW50IG1pc3NpbmdcIik7bGV0IG49MCxpPTAsbz0wLHM9e2JpdHJhdGU6MCxmcmFtZXJhdGU6MCxyZW5kZXJlZEZyYW1lczowfSxhLHU9bnVsbDt3aW5kb3cuY3JlYXRlSW1hZ2VCaXRtYXAhPT12b2lkIDAmJih1PXQuZ2V0Q29udGV4dChcImJpdG1hcHJlbmRlcmVyXCIpKSx1PT09bnVsbCYmKHU9dC5nZXRDb250ZXh0KFwiMmRcIikpO2xldCBmO2lmKHU9PT1udWxsKWY9KCk9Pnt9O2Vsc2UgaWYoXCJ0cmFuc2ZlckZyb21JbWFnZUJpdG1hcFwiaW4gdSl7bGV0IF89dTtmPSh7YmxvYjp2fSk9PntzLnJlbmRlcmVkRnJhbWVzKyssd2luZG93LmNyZWF0ZUltYWdlQml0bWFwKHYpLnRoZW4ocT0+e18udHJhbnNmZXJGcm9tSW1hZ2VCaXRtYXAocSl9KS5jYXRjaCgoKT0+e30pfX1lbHNle2xldCBfPXUsdj1uZXcgSW1hZ2U7di5vbmxvYWQ9KCk9PntfLmRyYXdJbWFnZSh2LDAsMCl9LGY9KHtibG9iOnF9KT0+e3MucmVuZGVyZWRGcmFtZXMrKztsZXQgQT13aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChxKTt2LnNyYz1BfX1sZXQgbD1uZXcgYXIsZD1uZXcgV2UobCxmKSxoPTAsbT0oKT0+e3RoaXMub25DYW5wbGF5JiZ0aGlzLm9uQ2FucGxheSgpfSxiPV89Pnt0aGlzLm9uU3luYyYmdGhpcy5vblN5bmMoXyl9LHk9bmV3IHVyLldyaXRhYmxlKHtvYmplY3RNb2RlOiEwLHdyaXRlOihfLHYscSk9PntpZihfLnR5cGU9PT01KXtsLnJlc2V0KCksZC5yZXNldCgpLG49MDtsZXQgQT1fLnNkcC5tZWRpYS5maW5kKGo9PmoudHlwZT09PVwidmlkZW9cIiYmai5ydHBtYXAhPT12b2lkIDAmJmoucnRwbWFwLmVuY29kaW5nTmFtZT09PVwiSlBFR1wiKTtBIT09dm9pZCAwJiZBLnJ0cG1hcCE9PXZvaWQgMCYmKG89QS5ydHBtYXAuY2xvY2tyYXRlLGFjKHMpLGE9dWMobykpLHEoKX1lbHNlIGlmKF8udHlwZT09PTEwKXtsZXR7dGltZXN0YW1wOkEsbnRwVGltZXN0YW1wOmp9PV87aWYoIW4pe249QSxpPUE7bGV0e3dpZHRoOkllLGhlaWdodDpBZX09Xy5mcmFtZXNpemU7dC53aWR0aD1JZSx0LmhlaWdodD1BZSxkLmluaXQoMCl9bGV0IFk9MWUzKihBLW4pL28sR2U9bmV3IHdpbmRvdy5CbG9iKFtfLmRhdGFdLHt0eXBlOlwiaW1hZ2UvanBlZ1wifSk7IWgmJmomJihoPWotWSxiKGgpKSxkLnJ1bih7bnRwVGltZXN0YW1wOlksYmxvYjpHZX0pLEE9PT1uJiZtKCksYShzLHtieXRlTGVuZ3RoOl8uZGF0YS5sZW5ndGgsZHVyYXRpb246QS1pfSksaT1BLHEoKX1lbHNlIHEoKX19KSx3PW5ldyB1ci5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkOmZ1bmN0aW9uKCl7fX0pO3cub24oXCJlcnJvclwiLCgpPT57Y29uc29sZS53YXJuKFwib3V0Z29pbmcgc3RyZWFtIGJyb2tlIHNvbWV3aGVyZVwiKX0pO3N1cGVyKHksdyk7dGhpcy5fY2xvY2s9bCx0aGlzLl9zY2hlZHVsZXI9ZCx0aGlzLl9pbmZvPXMsdGhpcy5vbkNhbnBsYXk9dm9pZCAwLHRoaXMub25TeW5jPXZvaWQgMH1nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5fY2xvY2suY3VycmVudFRpbWV9cGF1c2UoKXt0aGlzLl9zY2hlZHVsZXIuc3VzcGVuZCgpLHRoaXMuX2Nsb2NrLnBhdXNlKCl9cGxheSgpe3RoaXMuX2Nsb2NrLnBsYXkoKSx0aGlzLl9zY2hlZHVsZXIucmVzdW1lKCl9Z2V0IGJpdHJhdGUoKXtyZXR1cm4gdGhpcy5faW5mby5iaXRyYXRlfWdldCBmcmFtZXJhdGUoKXtyZXR1cm4gdGhpcy5faW5mby5mcmFtZXJhdGV9fTtjKCk7dmFyIGRzPUMoTigpKTtjKCk7dmFyIGxzPUMobGUoKSk7dmFyIHdjPSgwLGxzLmRlZmF1bHQpKFwibXNsOmgyNjRkZXBheVwiKSxscj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2MoMCl9cGFyc2UoZSl7bGV0IHQ9WihlLmRhdGEpLG49dFswXSYzMTtpZihuPT09Mjgpe2xldCBpPXRbMF0sbz10WzFdLHM9ISEobz4+NyksYT1vJjMxLHU9aSYyMjR8YSxmPW8mNjQ7aWYocylyZXR1cm4gdGhpcy5fYnVmZmVyPUJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFswLDAsMCwwLHVdKSx0LnNsaWNlKDIpXSksbnVsbDtpZihmKXtsZXQgbD1CdWZmZXIuY29uY2F0KFt0aGlzLl9idWZmZXIsdC5zbGljZSgyKV0pO2wud3JpdGVVSW50MzJCRShsLmxlbmd0aC00LDApO2xldCBkPXtkYXRhOmwsdHlwZTo3LHRpbWVzdGFtcDpIKGUuZGF0YSksbnRwVGltZXN0YW1wOmUubnRwVGltZXN0YW1wLHBheWxvYWRUeXBlOk8oZS5kYXRhKSxuYWxUeXBlOmF9O3JldHVybiB0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jKDApLGR9ZWxzZSByZXR1cm4gdGhpcy5fYnVmZmVyPUJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZmZlcix0LnNsaWNlKDIpXSksbnVsbH1lbHNlIGlmKChuPT09MXx8bj09PTUpJiZ0aGlzLl9idWZmZXIubGVuZ3RoPT09MCl7bGV0IGk9QnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oWzAsMCwwLDBdKSx0XSk7aS53cml0ZVVJbnQzMkJFKGkubGVuZ3RoLTQsMCk7bGV0IG89e2RhdGE6aSx0eXBlOjcsdGltZXN0YW1wOkgoZS5kYXRhKSxudHBUaW1lc3RhbXA6ZS5udHBUaW1lc3RhbXAscGF5bG9hZFR5cGU6TyhlLmRhdGEpLG5hbFR5cGU6bn07cmV0dXJuIHRoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2MoMCksb31lbHNlIHJldHVybiB3YyhgSDI2NGRlcGF5Q29tcG9uZW50IGNhbiBvbmx5IGV4dHJhY3QgdHlwZXMgMSw1IGFuZCAyOCwgZ290ICR7bn1gKSx0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jKDApLG51bGx9fTt2YXIgY3Q9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCl7bGV0IGUsdD0hMSxuPVtdLGk9bmV3IGxyLG89bmV3IGRzLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24ocyxhLHUpe2lmKHMudHlwZT09PTUpe2xldCBmPXMuc2RwLm1lZGlhLmZpbmQobD0+bC50eXBlPT09XCJ2aWRlb1wiJiZsLnJ0cG1hcCE9PXZvaWQgMCYmbC5ydHBtYXAuZW5jb2RpbmdOYW1lPT09XCJIMjY0XCIpO2YhPT12b2lkIDAmJmYucnRwbWFwIT09dm9pZCAwJiYoZT1mLnJ0cG1hcC5wYXlsb2FkVHlwZSksdSh2b2lkIDAscyl9ZWxzZSBpZihzLnR5cGU9PT0yJiZPKHMuZGF0YSk9PT1lKXtsZXQgZj1jZShzLmRhdGEpLGw9aS5wYXJzZShzKTtpZihsPT09bnVsbHx8IXQmJmwubmFsVHlwZSE9PTUpe3UoKTtyZXR1cm59dD0hMCxuLnB1c2gobC5kYXRhKSxmJiYodGhpcy5wdXNoKHsuLi5sLGRhdGE6bi5sZW5ndGg9PT0xP25bMF06QnVmZmVyLmNvbmNhdChuKX0pLG49W10pLHUoKX1lbHNlIHUodm9pZCAwLHMpfX0pO3N1cGVyKG8pfX07YygpO3ZhciBwcz1DKGxlKCkpO3ZhciBocz1DKE4oKSk7dmFyIE5uPSgwLHBzLmRlZmF1bHQpKFwibXNsOmh0dHAtc291cmNlXCIpLGRyPWNsYXNzIGV4dGVuZHMgVntjb25zdHJ1Y3Rvcih0KXtsZXR7dXJpOm4sb3B0aW9uczppfT10LG89bmV3IGhzLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwLHJlYWQ6ZnVuY3Rpb24oKXt9fSk7by5vbihcImVycm9yXCIscz0+e2NvbnNvbGUud2FybihcImNsb3Npbmcgc29ja2V0IGR1ZSB0byBpbmNvbWluZyBlcnJvclwiLHMpLHRoaXMuX3JlYWRlciYmdGhpcy5fcmVhZGVyLmNhbmNlbCgpfSk7c3VwZXIobyk7by5fcmVhZD0oKT0+e3RoaXMuX3B1bGwoKX0sdGhpcy51cmk9bix0aGlzLm9wdGlvbnM9aSx0aGlzLl9hbGxEb25lPSExfXBsYXkoKXtpZih0aGlzLnVyaT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJjYW5ub3Qgc3RhcnQgcGxheWluZyB3aGVuIHRoZXJlIGlzIG5vIFVSSVwiKTt0aGlzLl9hYm9ydENvbnRyb2xsZXI9bmV3IEFib3J0Q29udHJvbGxlcix0aGlzLmxlbmd0aD0wLGZldGNoKHRoaXMudXJpLHtjcmVkZW50aWFsczpcImluY2x1ZGVcIixzaWduYWw6dGhpcy5fYWJvcnRDb250cm9sbGVyLnNpZ25hbCwuLi50aGlzLm9wdGlvbnN9KS50aGVuKHQ9PntpZih0LmJvZHk9PT1udWxsKXRocm93IG5ldyBFcnJvcihcImVtcHR5IHJlc3BvbnNlIGJvZHlcIik7dGhpcy5vbkhlYWRlcnMmJnRoaXMub25IZWFkZXJzKHQuaGVhZGVycyksdGhpcy5fcmVhZGVyPXQuYm9keS5nZXRSZWFkZXIoKSx0aGlzLl9wdWxsKCl9KS5jYXRjaCh0PT57Y29uc29sZS5lcnJvcihcImh0dHAtc291cmNlOiBmZXRjaCBmYWlsZWQ6IFwiLHQpfSl9YWJvcnQoKXt0aGlzLl9yZWFkZXImJnRoaXMuX3JlYWRlci5jYW5jZWwoKS5jYXRjaCh0PT57Y29uc29sZS5sb2coXCJodHRwLXNvdXJjZTogY2FuY2VsIHJlYWRlciBmYWlsZWQ6IFwiLHQpfSksdGhpcy5fYWJvcnRDb250cm9sbGVyJiZ0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKX1faXNDbG9zZWQoKXtyZXR1cm4gdGhpcy5fYWxsRG9uZX1fY2xvc2UoKXt0aGlzLl9yZWFkZXI9dm9pZCAwLHRoaXMuX2FsbERvbmU9ITAsdGhpcy5pbmNvbWluZy5wdXNoKG51bGwpLHRoaXMub25TZXJ2ZXJDbG9zZT8uKCl9X3B1bGwoKXt0aGlzLl9yZWFkZXIhPT12b2lkIDAmJnRoaXMuX3JlYWRlci5yZWFkKCkudGhlbigoe2RvbmU6dCx2YWx1ZTpufSk9PntpZih0KXt0aGlzLl9pc0Nsb3NlZCgpfHwoTm4oXCJmZXRjaCBjb21wbGV0ZWQsIHRvdGFsIGRvd25sb2FkZWQ6IFwiLHRoaXMubGVuZ3RoLFwiIGJ5dGVzXCIpLHRoaXMuX2Nsb3NlKCkpO3JldHVybn1pZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIHZhbHVlIHRvIGJlIGRlZmluZWRcIik7aWYodGhpcy5sZW5ndGg9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiZXhwZWN0ZWQgbGVuZ3RoIHRvIGJlIGRlZmluZWRcIik7dGhpcy5sZW5ndGgrPW4ubGVuZ3RoO2xldCBpPUJ1ZmZlci5mcm9tKG4pO3RoaXMuaW5jb21pbmcucHVzaCh7ZGF0YTppLHR5cGU6MX0pP3RoaXMuX3B1bGwoKTpObihcImRvd25zdHJlYW0gYmFjayBwcmVzc3VyZTogcGF1c2luZyByZWFkXCIpfSkuY2F0Y2godD0+e05uKFwiaHR0cC1zb3VyY2U6IHJlYWQgZmFpbGVkOiBcIix0KSx0aGlzLl9pc0Nsb3NlZCgpfHx0aGlzLl9jbG9zZSgpfSl9fTtjKCk7dmFyIEhuPUMoTigpKSxtcz0ocixlKT0+e2xldCB0PURhdGUubm93KCksbj1pPT57bGV0IG89RGF0ZS5ub3coKTtjb25zb2xlLmxvZyhgJHtyfTogKyR7by10fW1zYCxpKSx0PW99O3JldHVybiBlPT09dm9pZCAwP246aT0+aS50eXBlPT09ZSYmbihpKX0scHI9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKGUpe2xldCB0PW1zKFwiaW5jb21pbmdcIixlKSxuPW5ldyBIbi5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKHMsYSx1KXt0KHMpLHUodm9pZCAwLHMpfX0pLGk9bXMoXCJvdXRnb2luZ1wiLGUpLG89bmV3IEhuLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24ocyxhLHUpe2kocyksdSh2b2lkIDAscyl9fSk7c3VwZXIobixvKX19O2MoKTtjKCk7YygpO2Z1bmN0aW9uIFNzKCl7cmV0dXJuIEJ1ZmZlci5mcm9tKFsyNTUsMjE2XSl9ZnVuY3Rpb24gUnMocixlKXtsZXQgdD1yJjE/MTI4OjY0LG49ciYyPzEyODo2NDtpZihlLmxlbmd0aCE9PXQrbil0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHF1YW50aXphdGlvbiB0YWJsZVwiKTtsZXQgaT1CdWZmZXIuZnJvbShbMjU1LDIxOSwwLHQrMywwXSksbz1CdWZmZXIuZnJvbShbMjU1LDIxOSwwLG4rMywxXSk7cmV0dXJuIEJ1ZmZlci5jb25jYXQoW2ksZS5zbGljZSgwLHQpLG8sZS5zbGljZSh0KV0pfWZ1bmN0aW9uIFRzKHIsZSx0KXtyZXR1cm4gQnVmZmVyLmZyb20oWzI1NSwxOTIsMCwxNyw4LGU+PjgsZSxyPj44LHIsMywwLHQ9PT0wPzMzOjM0LDAsMSwxNywxLDIsMTcsMV0pfXZhciBncz1bMCwxLDUsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMF0seXM9WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTFdLGJzPVswLDIsMSwzLDMsMiw0LDMsNSw1LDQsNCwwLDAsMSwxMjVdLHhzPVsxLDIsMywwLDQsMTcsNSwxOCwzMyw0OSw2NSw2LDE5LDgxLDk3LDcsMzQsMTEzLDIwLDUwLDEyOSwxNDUsMTYxLDgsMzUsNjYsMTc3LDE5MywyMSw4MiwyMDksMjQwLDM2LDUxLDk4LDExNCwxMzAsOSwxMCwyMiwyMywyNCwyNSwyNiwzNywzOCwzOSw0MCw0MSw0Miw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTBdLF9zPVswLDMsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwXSx3cz1bMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMV0sdnM9WzAsMiwxLDIsNCw0LDMsNCw3LDUsNCw0LDAsMSwyLDExOV0sRXM9WzAsMSwyLDMsMTcsNCw1LDMzLDQ5LDYsMTgsNjUsODEsNyw5NywxMTMsMTksMzQsNTAsMTI5LDgsMjAsNjYsMTQ1LDE2MSwxNzcsMTkzLDksMzUsNTEsODIsMjQwLDIxLDk4LDExNCwyMDksMTAsMjIsMzYsNTIsMjI1LDM3LDI0MSwyMywyNCwyNSwyNiwzOCwzOSw0MCw0MSw0Miw1Myw1NCw1NSw1Niw1Nyw1OCw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MF07ZnVuY3Rpb24gQ3MoKXtsZXQgcj1bWzI1NSwxOTYsMCwzK2dzLmxlbmd0aCt5cy5sZW5ndGgsMF0sZ3MseXNdLGU9W1syNTUsMTk2LDAsMyticy5sZW5ndGgreHMubGVuZ3RoLDE8PDR8MF0sYnMseHNdLHQ9W1syNTUsMTk2LDAsMytfcy5sZW5ndGgrd3MubGVuZ3RoLDA8PDR8MV0sX3Msd3NdLG49W1syNTUsMTk2LDAsMyt2cy5sZW5ndGgrRXMubGVuZ3RoLDE8PDR8MV0sdnMsRXNdO3JldHVybiBCdWZmZXIuY29uY2F0KFsuLi5yLm1hcChCdWZmZXIuZnJvbSksLi4uZS5tYXAoQnVmZmVyLmZyb20pLC4uLnQubWFwKEJ1ZmZlci5mcm9tKSwuLi5uLm1hcChCdWZmZXIuZnJvbSldKX1mdW5jdGlvbiBCcygpe3JldHVybiBCdWZmZXIuZnJvbShbMjU1LDIxOCwwLDEyLDMsMCwwLDEsMTcsMiwxNywwLDYzLDBdKX1mdW5jdGlvbiBNcyhyKXtyZXR1cm4gQnVmZmVyLmZyb20oWzI1NSwyMjEsMCw0LHI+PjgsciYyNTVdKX1jKCk7YygpO2Z1bmN0aW9uIGhyKHIsZSx0KXtyZXR1cm4gcj50P3Q6cjxlP2U6cn12YXIgRWM9WzE2LDExLDEyLDE0LDEyLDEwLDE2LDE0LDEzLDE0LDE4LDE3LDE2LDE5LDI0LDQwLDI2LDI0LDIyLDIyLDI0LDQ5LDM1LDM3LDI5LDQwLDU4LDUxLDYxLDYwLDU3LDUxLDU2LDU1LDY0LDcyLDkyLDc4LDY0LDY4LDg3LDY5LDU1LDU2LDgwLDEwOSw4MSw4Nyw5NSw5OCwxMDMsMTA0LDEwMyw2Miw3NywxMTMsMTIxLDExMiwxMDAsMTIwLDkyLDEwMSwxMDMsOTldLFNjPVsxNywxOCwxOCwyNCwyMSwyNCw0NywyNiwyNiw0Nyw5OSw2Niw1Niw2Niw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OV07ZnVuY3Rpb24gTHMocil7bGV0IGU9aHIociwxLDk5KSx0PUJ1ZmZlci5hbGxvYygxMjgpLG49cjw1MD9NYXRoLmZsb29yKDVlMy9lKToyMDAtZSoyO2ZvcihsZXQgaT0wO2k8NjQ7aSsrKXtsZXQgbz1NYXRoLmZsb29yKChFY1tpXSpuKzUwKS8xMDApLHM9TWF0aC5mbG9vcigoU2NbaV0qbis1MCkvMTAwKTt0LndyaXRlVUludDgoaHIobywxLDI1NSksaSksdC53cml0ZVVJbnQ4KGhyKHMsMSwyNTUpLGkrNjQpfXJldHVybiB0fWZ1bmN0aW9uIHFuKHI9MCxlPTApe2xldCB0PVNzKCksbj1DcygpLGk9QnMoKTtyZXR1cm4gZnVuY3Rpb24ocyl7bGV0IGEsdT1bXTtmb3IobGV0IF8gb2Ygcyl7bGV0IHY9WihfKSxxPXYucmVhZFVJbnQ4KDApLEE9di5yZWFkVUludDgoMSk8PDE2fHYucmVhZFVJbnQ4KDIpPDw4fHYucmVhZFVJbnQ4KDMpLGo9di5yZWFkVUludDgoNCksWT12LnJlYWRVSW50OCg1KSxHZT12LnJlYWRVSW50OCg2KSo4fHxyLEllPXYucmVhZFVJbnQ4KDcpKjh8fGU7dj12LnNsaWNlKDgpO2xldCBBZT0wO2lmKGo+PTY0JiZqPD0xMjcmJihBZT12LnJlYWRVSW50MTZCRSgwKSx2PXYuc2xpY2UoNCkpLFk+PTEyOCYmQT09PTApe2xldCBvaT12LnJlYWRVSW50OCgxKSxBdD12LnJlYWRVSW50MTZCRSgyKSx1YT12LnNsaWNlKDQsNCtBdCk7YT17dHlwZVNwZWNpZmljOnEsdHlwZTpqLHdpZHRoOkdlLGhlaWdodDpJZSxEUkk6QWUscHJlY2lzaW9uOm9pLHFUYWJsZTp1YX0sdj12LnNsaWNlKDQrQXQpfWVsc2UgaWYoWTwxMjgmJkE9PT0wKXtsZXQgQXQ9THMoWSk7YT17dHlwZVNwZWNpZmljOnEsdHlwZTpqLHdpZHRoOkdlLGhlaWdodDpJZSxEUkk6QWUscHJlY2lzaW9uOjAscVRhYmxlOkF0fX11LnB1c2godil9aWYoYT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJubyBxdWFudGl6YXRpb24gaGVhZGVyIHByZXNlbnRcIik7bGV0e3ByZWNpc2lvbjpmLHFUYWJsZTpsLHR5cGU6ZCx3aWR0aDpoLGhlaWdodDptfT1hLGI9UnMoZixsKSx5PWEuRFJJPT09MD9CdWZmZXIuYWxsb2MoMCk6TXMoYS5EUkkpLHc9VHMoaCxtLGQpO3JldHVybntzaXplOnt3aWR0aDpoLGhlaWdodDptfSxkYXRhOkJ1ZmZlci5jb25jYXQoW3QsYix5LHcsbixpLC4uLnVdKX19fXZhciBJcz1DKE4oKSk7dmFyIGx0PWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCBlLHQ9W10sbixpPW5ldyBJcy5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKG8scyxhKXtpZihvLnR5cGU9PT01KXtsZXQgdT1vLnNkcC5tZWRpYS5maW5kKGY9PmYudHlwZT09PVwidmlkZW9cIiYmZi5ydHBtYXAhPT12b2lkIDAmJmYucnRwbWFwLmVuY29kaW5nTmFtZT09PVwiSlBFR1wiKTtpZih1IT09dm9pZCAwJiZ1LnJ0cG1hcCE9PXZvaWQgMCl7ZT1OdW1iZXIodS5ydHBtYXAucGF5bG9hZFR5cGUpO2xldCBmPXUuZnJhbWVzaXplO2lmKGYhPT12b2lkIDApe2xldFtsLGRdPWY7bj1xbihsLGQpfWVsc2Ugbj1xbigpfWEodm9pZCAwLG8pfWVsc2UgaWYoby50eXBlPT09MiYmTyhvLmRhdGEpPT09ZSl7aWYodC5wdXNoKG8uZGF0YSksY2Uoby5kYXRhKSYmdC5sZW5ndGg+MCl7bGV0IHU9bih0KTt0aGlzLnB1c2goe3RpbWVzdGFtcDpIKG8uZGF0YSksbnRwVGltZXN0YW1wOm8ubnRwVGltZXN0YW1wLHBheWxvYWRUeXBlOk8oby5kYXRhKSxkYXRhOnUuZGF0YSxmcmFtZXNpemU6dS5zaXplLHR5cGU6MTB9KSx0PVtdfWEoKX1lbHNlIGEodm9pZCAwLG8pfX0pO3N1cGVyKGkpfX07YygpO3ZhciBqbj1DKGxlKCkpO3ZhciBBcz1DKE4oKSk7dmFyIFJjPTIyNWU2LG1yPWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcih0PVJjKXtsZXQgbj1uZXcgQXMuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTooaSxvLHMpPT57dGhpcy5fYWN0aXZlJiZpLnR5cGU9PT04JiZpLnRyYWNrcyE9PXZvaWQgMCYmKHRoaXMuX2NhcHR1cmU9ITApLHRoaXMuX2NhcHR1cmUmJmkudHlwZT09PTgmJih0aGlzLl9idWZmZXJPZmZzZXQ8dGhpcy5fYnVmZmVyLmJ5dGVMZW5ndGgtaS5kYXRhLmJ5dGVMZW5ndGg/KGkuZGF0YS5jb3B5KHRoaXMuX2J1ZmZlcix0aGlzLl9idWZmZXJPZmZzZXQpLHRoaXMuX2J1ZmZlck9mZnNldCs9aS5kYXRhLmJ5dGVMZW5ndGgpOnRoaXMuc3RvcCgpKSxzKHZvaWQgMCxpKX19KTtuLm9uKFwiZmluaXNoXCIsKCk9Pnt0aGlzLnN0b3AoKX0pO3N1cGVyKG4pO3RoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2NVbnNhZmUoMCksdGhpcy5fYnVmZmVyU2l6ZT10LHRoaXMuX2J1ZmZlck9mZnNldD0wLHRoaXMuX2FjdGl2ZT0hMSx0aGlzLl9jYXB0dXJlPSExLHRoaXMuX2NhcHR1cmVDYWxsYmFjaz0oKT0+e319c3RhcnQodCl7dGhpcy5fYWN0aXZlfHwoKDAsam4uZGVmYXVsdCkoXCJtc2w6Y2FwdHVyZTpzdGFydFwiKSh0KSx0aGlzLl9jYXB0dXJlQ2FsbGJhY2s9dCx0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jVW5zYWZlKHRoaXMuX2J1ZmZlclNpemUpLHRoaXMuX2J1ZmZlck9mZnNldD0wLHRoaXMuX2FjdGl2ZT0hMCl9c3RvcCgpe2lmKHRoaXMuX2FjdGl2ZSl7KDAsam4uZGVmYXVsdCkoXCJtc2w6Y2FwdHVyZTpzdG9wXCIpKGBjYXB0dXJlZCBieXRlczogJHt0aGlzLl9idWZmZXJPZmZzZXR9YCk7dHJ5e3RoaXMuX2NhcHR1cmVDYWxsYmFjayh0aGlzLl9idWZmZXIuc2xpY2UoMCx0aGlzLl9idWZmZXJPZmZzZXQpKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKHQpfXRoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2NVbnNhZmUoMCksdGhpcy5fYnVmZmVyT2Zmc2V0PTAsdGhpcy5fYWN0aXZlPSExLHRoaXMuX2NhcHR1cmU9ITF9fX07YygpO3ZhciBZbj1DKGxlKCkpO2MoKTt2YXIgV249TWF0aC5wb3coMiwzMiksJD1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLmJ5dGVMZW5ndGg9ZX19LHRlPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0PTApe3N1cGVyKHQpO3RoaXMuY29weT0odCxuKT0+e3QuZmlsbCgwLG4sbit0aGlzLmJ5dGVMZW5ndGgpfX1sb2FkKCl7fX0sUmU9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQubGVuZ3RoKTt0aGlzLmNvcHk9KHQsbik9Pntmb3IobGV0IGk9MDtpPHRoaXMuYnl0ZUxlbmd0aDtpKz0xKXRbbitpXT10aGlzLnZhbHVlLmNoYXJDb2RlQXQoaSl9O3RoaXMubG9hZD0odCxuKT0+e3RoaXMudmFsdWU9dC5zbGljZShuLG4rdGhpcy5ieXRlTGVuZ3RoKS50b1N0cmluZyhcImFzY2lpXCIpfTt0aGlzLnZhbHVlPXR9fSxrPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0PTApe3N1cGVyKDEpO3RoaXMuY29weT0odCxuKT0+e3Qud3JpdGVVSW50OCh0aGlzLnZhbHVlLG4pfTt0aGlzLmxvYWQ9KHQsbik9Pnt0aGlzLnZhbHVlPXQucmVhZFVJbnQ4KG4pfTt0aGlzLnZhbHVlPXR9fSxMdD1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodCl7c3VwZXIodC5sZW5ndGgpO3RoaXMuY29weT0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7KytpKXQud3JpdGVVSW50OCh0aGlzLnZhbHVlW2ldLG4raSl9O3RoaXMubG9hZD0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7KytpKXRoaXMudmFsdWVbaV09dC5yZWFkVUludDgobitpKX07dGhpcy52YWx1ZT10fX0sTD1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodD0wKXtzdXBlcigyKTt0aGlzLmNvcHk9KHQsbik9Pnt0LndyaXRlVUludDE2QkUodGhpcy52YWx1ZSxuKX07dGhpcy5sb2FkPSh0LG4pPT57dGhpcy52YWx1ZT10LnJlYWRVSW50MTZCRShuKX07dGhpcy52YWx1ZT10fX0sJG49Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQ9MCl7c3VwZXIoMyk7dGhpcy5jb3B5PSh0LG4pPT57dC53cml0ZVVJbnQ4KHRoaXMudmFsdWU+PjE2JjI1NSxuKSx0LndyaXRlVUludDgodGhpcy52YWx1ZT4+OCYyNTUsbisxKSx0LndyaXRlVUludDgodGhpcy52YWx1ZSYyNTUsbisyKX07dGhpcy5sb2FkPSh0LG4pPT57dGhpcy52YWx1ZT10LnJlYWRVSW50OChuKTw8MTYrdC5yZWFkVUludDgobisxKTw8OCt0LnJlYWRVSW50OChuKzIpfTt0aGlzLnZhbHVlPXR9fSxHbj1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodCl7c3VwZXIodC5sZW5ndGgqMik7dGhpcy5jb3B5PSh0LG4pPT57Zm9yKGxldCBpPTA7aTx0aGlzLnZhbHVlLmxlbmd0aDsrK2kpdC53cml0ZVVJbnQxNkJFKHRoaXMudmFsdWVbaV0sbisyKmkpfTt0aGlzLmxvYWQ9KHQsbik9Pntmb3IobGV0IGk9MDtpPHRoaXMudmFsdWUubGVuZ3RoOysraSl0aGlzLnZhbHVlW2ldPXQucmVhZFVJbnQxNkJFKG4rMippKX07dGhpcy52YWx1ZT10fX0sZz1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodD0wKXtzdXBlcig0KTt0aGlzLmNvcHk9KHQsbik9Pnt0LndyaXRlVUludDMyQkUodGhpcy52YWx1ZSxuKX07dGhpcy5sb2FkPSh0LG4pPT57dGhpcy52YWx1ZT10LnJlYWRVSW50MzJCRShuKX07dGhpcy52YWx1ZT10fX0sZHQ9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQubGVuZ3RoKjQpO3RoaXMuY29weT0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7KytpKXQud3JpdGVVSW50MzJCRSh0aGlzLnZhbHVlW2ldLG4rNCppKX07dGhpcy5sb2FkPSh0LG4pPT57Zm9yKGxldCBpPTA7aTx0aGlzLnZhbHVlLmxlbmd0aDsrK2kpdGhpcy52YWx1ZVtpXT10LnJlYWRVSW50MzJCRShuKzQqaSl9O3RoaXMudmFsdWU9dH19LFZuPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0PTApe3N1cGVyKDgpO3RoaXMuY29weT0odCxuKT0+e2xldCBpPXRoaXMudmFsdWUvV258MCxvPXRoaXMudmFsdWUtaSpXbjt0LndyaXRlVUludDMyQkUoaSxuKSx0LndyaXRlVUludDMyQkUobyxuKzQpfTt0aGlzLmxvYWQ9KHQsbik9PntsZXQgaT10LnJlYWRVSW50MzJCRShuKSxvPXQucmVhZFVJbnQzMkJFKG4rNCk7dGhpcy52YWx1ZT1pKlduK299O3RoaXMudmFsdWU9dH19LEZzPWZ1bmN0aW9uKHI9MCl7cmV0dXJuIGNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3RvcihuKXtzdXBlcigwKTt0aGlzLmNvcHk9KG4saSk9PntsZXQgbz0wO2ZvcihsZXQgcyBvZiB0aGlzLnZhbHVlKXMuY29weShuLGkrbyksbys9cy5ieXRlTGVuZ3RofTt0aGlzLmxvYWQ9KCk9Pnt9O3RoaXMudmFsdWU9bi5yZWR1Y2UoKGksbyk9PmkuY29uY2F0KG5ldyBMKG8ubGVuZ3RoKSxuZXcgTHQobykpLFtuZXcgayhyfG4ubGVuZ3RoKV0pLHRoaXMuYnl0ZUxlbmd0aD10aGlzLnZhbHVlLnJlZHVjZSgoaSxvKT0+aStvLmJ5dGVMZW5ndGgsMCl9fX0sUHM9e2Z0eXA6e2NvbnRhaW5lcjpcImZpbGVcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITAsYm9keTpbW1wibWFqb3JfYnJhbmRcIixSZSxcImlzb21cIl0sW1wibWlub3JfdmVyc2lvblwiLGcsMF0sW1wiY29tcGF0aWJsZV9icmFuZHNcIixSZSxcIm1wNDFcIl1dfSxtb292Ontjb250YWluZXI6XCJmaWxlXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSxtZGF0Ontjb250YWluZXI6XCJmaWxlXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5OlwiYW55XCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W119LG12aGQ6e2NvbnRhaW5lcjpcIm1vb3ZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImNyZWF0aW9uX3RpbWVcIixnLDBdLFtcIm1vZGlmaWNhdGlvbl90aW1lXCIsZywwXSxbXCJ0aW1lc2NhbGVcIixnLDFlM10sW1wiZHVyYXRpb25cIixnLDQyOTQ5NjcyOTVdLFtcInJhdGVcIixnLDY1NTM2XSxbXCJ2b2x1bWVcIixMLDI1Nl0sW1wicmVzZXJ2ZWRcIix0ZSwxMF0sW1wibWF0cml4XCIsZHQsWzY1NTM2LDAsMCwwLDY1NTM2LDAsMCwwLDEwNzM3NDE4MjRdXSxbXCJwcmVfZGVmaW5lZFwiLHRlLDI0XSxbXCJuZXh0X3RyYWNrX0lEXCIsZyw0Mjk0OTY3Mjk1XV19LHRyYWs6e2NvbnRhaW5lcjpcIm1vb3ZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmUrXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSx0a2hkOntjb250YWluZXI6XCJ0cmFrXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxjb25maWc6e2ZsYWdzOjN9LGJvZHk6W1tcImNyZWF0aW9uX3RpbWVcIixnLDBdLFtcIm1vZGlmaWNhdGlvbl90aW1lXCIsZywwXSxbXCJ0cmFja19JRFwiLGcsMV0sW1wicmVzZXJ2ZWRcIix0ZSw0XSxbXCJkdXJhdGlvblwiLGcsMF0sW1wicmVzZXJ2ZWQyXCIsdGUsOF0sW1wibGF5ZXJcIixMLDBdLFtcImFsdGVybmF0ZV9ncm91cFwiLEwsMF0sW1widm9sdW1lXCIsTCwyNTZdLFtcInJlc2VydmVkM1wiLHRlLDJdLFtcIm1hdHJpeFwiLGR0LFs2NTUzNiwwLDAsMCw2NTUzNiwwLDAsMCwxMDczNzQxODI0XV0sW1wid2lkdGhcIixnLDBdLFtcImhlaWdodFwiLGcsMF1dfSx0cmVmOntjb250YWluZXI6XCJ0cmFrXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMX0sbWRpYTp7Y29udGFpbmVyOlwidHJha1wiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sbWRoZDp7Y29udGFpbmVyOlwibWRpYVwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiY3JlYXRpb25fdGltZVwiLGcsMF0sW1wibW9kaWZpY2F0aW9uX3RpbWVcIixnLDBdLFtcInRpbWVzY2FsZVwiLGcsMWUzXSxbXCJkdXJhdGlvblwiLGcsNDI5NDk2NzI5NV0sW1wibGFuZ3VhZ2VcIixMLDBdLFtcInByZV9kZWZpbmVkXCIsTCwwXV19LGhkbHI6e2NvbnRhaW5lcjpcIm1kaWFcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcInByZWRlZmluZWRcIixnLDBdLFtcImhhbmRsZXJfdHlwZVwiLFJlLFwidmlkZVwiXSxbXCJyZXNlcnZlZFwiLHRlLDEyXSxbXCJuYW1lXCIsUmUsXCJWaWRlb0hhbmRsZXJcXDBcIl1dfSxtaW5mOntjb250YWluZXI6XCJtZGlhXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSx2bWhkOntjb250YWluZXI6XCJtaW5mXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxjb25maWc6e2ZsYWdzOjF9LGJvZHk6W1tcImdyYXBoaWNzbW9kZVwiLEwsMF0sW1wib3Bjb2xvclwiLEduLFswLDAsMF1dXX0sc21oZDp7Y29udGFpbmVyOlwibWluZlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiYmFsYW5jZVwiLEwsMF0sW1wicmVzZXJ2ZWRcIixMXV19LGRpbmY6e2NvbnRhaW5lcjpcIm1pbmZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LGRyZWY6e2NvbnRhaW5lcjpcImRpbmZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiEwLGJvZHk6W1tcImVudHJ5X2NvdW50XCIsZywwXV19LFwidXJsIFwiOntjb250YWluZXI6XCJkcmVmXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lK1wiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsY29uZmlnOntmbGFnczoxfSxib2R5OltdfSxzdGJsOntjb250YWluZXI6XCJtaW5mXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSxzdHRzOntjb250YWluZXI6XCJzdGJsXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJlbnRyeV9jb3VudFwiLGcsMF1dfSxzdHNkOntjb250YWluZXI6XCJzdGJsXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMCxib2R5OltbXCJlbnRyeV9jb3VudFwiLGcsMV1dfSxhdmMxOntjb250YWluZXI6XCJzdHNkXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwLGJvZHk6W1tcInJlc2VydmVkXCIsdGUsNl0sW1wiZGF0YV9yZWZlcmVuY2VfaW5kZXhcIixMLDFdLFtcInByZV9kZWZpbmVkXCIsTCwwXSxbXCJyZXNlcnZlZDJcIix0ZSwyXSxbXCJwcmVfZGVmaW5lZDJcIixkdCxbMCwwLDBdXSxbXCJ3aWR0aFwiLEwsMTkyMF0sW1wiaGVpZ2h0XCIsTCwxMDgwXSxbXCJob3JpenJlc29sdXRpb25cIixnLDQ3MTg1OTJdLFtcInZlcnRyZXNvbHV0aW9uXCIsZyw0NzE4NTkyXSxbXCJyZXNlcnZlZDNcIixnLDBdLFtcImZyYW1lX2NvdW50XCIsTCwxXSxbXCJjb21wcmVzc29ybmFtZVwiLEx0LEJ1ZmZlci5hbGxvYygzMildLFtcImRlcHRoXCIsTCwyNF0sW1wicHJlX2RlZmluZWQzXCIsTCw2NTUzNV1dfSxhdmNDOntjb250YWluZXI6XCJhdmMxXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImNvbmZpZ3VyYXRpb25WZXJzaW9uXCIsaywxXSxbXCJBVkNQcm9maWxlSW5kaWNhdGlvblwiLGssNzddLFtcInByb2ZpbGVfY29tcGF0aWJpbGl0eVwiLGssMF0sW1wiQVZDTGV2ZWxJbmRpY2F0aW9uXCIsayw0MV0sW1wibGVuZ3RoU2l6ZU1pbnVzT25lXCIsaywyNTVdLFtcInNlcXVlbmNlUGFyYW1ldGVyU2V0c1wiLEZzKDIyNCksW11dLFtcInBpY3R1cmVQYXJhbWV0ZXJTZXRzXCIsRnMoKSxbXV1dfSxtcDRhOntjb250YWluZXI6XCJzdHNkXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwLGJvZHk6W1tcInJlc2VydmVkXCIsdGUsNl0sW1wiZGF0YV9yZWZlcmVuY2VfaW5kZXhcIixMLDFdLFtcInJlc2VydmVkMlwiLGR0LFswLDBdXSxbXCJjaGFubmVsY291bnRcIixMLDJdLFtcInNhbXBsZXNpemVcIixMLDE2XSxbXCJwcmVfZGVmaW5lZFwiLEwsMF0sW1wicmVzZXJ2ZWQzXCIsTCwwXSxbXCJzYW1wbGVyYXRlXCIsZywwXV19LGVzZHM6e2NvbnRhaW5lcjpcIm1wNGFcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcIkVTX0Rlc2NyVGFnXCIsaywzXSxbXCJFU19EZXNjckxlbmd0aFwiLGssMjVdLFtcIkVTX0lEXCIsTCwxXSxbXCJmbGFnc0FuZFN0cmVhbVByaW9yaXR5XCIsaywwXSxbXCJEZWNvZGVyQ29uZmlnRGVzY3JUYWdcIixrLDRdLFtcIkRlY29kZXJDb25maWdEZXNjckxlbmd0aFwiLGssMTddLFtcIm9iamVjdFByb2ZpbGVJbmRpY2F0aW9uXCIsayw2NF0sW1wic3RyZWFtVHlwZVVwc3RyZWFtUmVzZXJ2ZWRcIixrLDIxXSxbXCJidWZmZXJTaXplREJcIixMdCxbMCwwLDBdXSxbXCJtYXhCaXRSYXRlXCIsZywwXSxbXCJhdmdCaXRSYXRlXCIsZywwXSxbXCJEZWNTcGVjaWZpY0luZm9TaG9ydFRhZ1wiLGssNV0sW1wiRGVjU3BlY2lmaWNJbmZvU2hvcnRMZW5ndGhcIixrLDJdLFtcImF1ZGlvQ29uZmlnQnl0ZXNcIixMLDBdLFtcIlNMQ29uZmlnRGVzY3JUYWdcIixrLDZdLFtcIlNMQ29uZmlnRGVzY3JMZW5ndGhcIixrLDFdLFtcIlNMQ29uZmlnRGVzY3JQcmVkZWZpbmVkXCIsaywyXV19LHN0c3o6e2NvbnRhaW5lcjpcInN0YmxcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcInNhbXBsZV9zaXplXCIsZywwXSxbXCJzYW1wbGVfY291bnRcIixnLDBdXX0sc3RzYzp7Y29udGFpbmVyOlwic3RibFwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDBdXX0sc3Rjbzp7Y29udGFpbmVyOlwic3RibFwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDBdXX0sc3Rzczp7Y29udGFpbmVyOlwic3RibFwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImVudHJ5X2NvdW50XCIsZywwXV19LGVkdHM6e2NvbnRhaW5lcjpcInRyYWtcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmUtXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSxlbHN0Ontjb250YWluZXI6XCJlZHRzXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDFdLFtcInNlZ21lbnRfZHVyYXRpb25cIixnLDBdLFtcIm1lZGlhX3RpbWVcIixnLDQyOTQ5NjcyOTVdLFtcIm1lZGlhX3JhdGVfaW50ZWdlclwiLEwsMV0sW1wibWVkaWFfcmF0ZV9mcmFjdGlvblwiLEwsMF1dfSxtdmV4Ontjb250YWluZXI6XCJtb292XCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sbWVoZDp7Y29udGFpbmVyOlwibXZleFwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImZyYWdtZW50X2R1cmF0aW9uXCIsZywwXV19LHRyZXg6e2NvbnRhaW5lcjpcIm12ZXhcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmUrXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJ0cmFja19JRFwiLGcsMV0sW1wiZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXhcIixnLDFdLFtcImRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uXCIsZywwXSxbXCJkZWZhdWx0X3NhbXBsZV9zaXplXCIsZywwXSxbXCJkZWZhdWx0X3NhbXBsZV9mbGFnc1wiLGcsMF1dfSxtb29mOntjb250YWluZXI6XCJmaWxlXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5OlwiemVybytcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITF9LG1maGQ6e2NvbnRhaW5lcjpcIm1vb2ZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcInNlcXVlbmNlX251bWJlclwiLGcsMF1dfSx0cmFmOntjb250YWluZXI6XCJtb29mXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5OlwiemVybytcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LHRmaGQ6e2NvbnRhaW5lcjpcInRyYWZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGNvbmZpZzp7ZmxhZ3M6MzJ9LGJvZHk6W1tcInRyYWNrX0lEXCIsZywxXSxbXCJkZWZhdWx0X3NhbXBsZV9mbGFnc1wiLGcsMF1dfSx0ZmR0Ontjb250YWluZXI6XCJ0cmFmXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsY29uZmlnOnt2ZXJzaW9uOjF9LGJvZHk6W1tcImJhc2VNZWRpYURlY29kZVRpbWVcIixWbiwwXV19LHRydW46e2NvbnRhaW5lcjpcInRyYWZcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJ6ZXJvK1wiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsY29uZmlnOntmbGFnczo3NzN9LGJvZHk6W1tcInNhbXBsZV9jb3VudFwiLGcsMV0sW1wiZGF0YV9vZmZzZXRcIixnLDBdLFtcImZpcnN0X3NhbXBsZV9mbGFnc1wiLGcsMF0sW1wic2FtcGxlX2R1cmF0aW9uXCIsZywwXSxbXCJzYW1wbGVfc2l6ZVwiLGcsMF1dfSxcIi4uLi5cIjp7Ym94OlwiQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W119LGZpbGU6e2JveDpcIk5vbmVcIixpc19jb250YWluZXI6ITAsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCJ9fSx6bj1jbGFzc3tzdGF0aWMgTm9uZSgpe3JldHVybltdfXN0YXRpYyBCb3goZSl7cmV0dXJuW1tcInNpemVcIixnLDBdLFtcInR5cGVcIixSZSxlXV19c3RhdGljIEZ1bGxCb3goZSl7cmV0dXJuW10uY29uY2F0KHRoaXMuQm94KGUpLFtbXCJ2ZXJzaW9uXCIsaywwXSxbXCJmbGFnc1wiLCRuLDBdXSl9fSxUPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKDApO3RoaXMudHlwZT10O2xldCBpPVBzW3RoaXMudHlwZV07aWYoaT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gYm94IHR5cGU6ICR7dH1gKTt0aGlzLmNvbmZpZz1PYmplY3QuYXNzaWduKHt9LGkuY29uZmlnLG4pO2xldCBvPXpuW2kuYm94XSh0aGlzLnR5cGUpLHM9aS5ib2R5fHxbXTt0aGlzLnN0cnVjdD1uZXcgTWFwO2xldCBhPTA7Zm9yKGxldFt1LGYsbF1vZltdLmNvbmNhdChvLHMpKXtpZih0aGlzLmhhcyh1KSl0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gYWRkIGV4aXN0aW5nIGtleVwiKTtsZXQgZD1sO3RoaXMuY29uZmlnW3VdJiYoZD10aGlzLmNvbmZpZ1t1XSk7bGV0IGg9bmV3IGYoZCk7dGhpcy5zdHJ1Y3Quc2V0KHUse29mZnNldDphLGVsZW1lbnQ6aH0pLGErPWguYnl0ZUxlbmd0aH10aGlzLmJ5dGVMZW5ndGg9YX1lbGVtZW50KHQpe2xldCBuPXRoaXMuc3RydWN0LmdldCh0KTtpZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImludmFsaWQga2V5XCIpO3JldHVybiBuLmVsZW1lbnR9c2V0KHQsbil7dGhpcy5lbGVtZW50KHQpLnZhbHVlPW59Z2V0KHQpe3JldHVybiB0aGlzLmVsZW1lbnQodCkudmFsdWV9b2Zmc2V0KHQpe2xldCBuPXRoaXMuc3RydWN0LmdldCh0KTtpZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImludmFsaWQga2V5XCIpO3JldHVybiBuLm9mZnNldH1oYXModCl7cmV0dXJuIHRoaXMuc3RydWN0Lmhhcyh0KX1hZGQodCxuKXtpZih0aGlzLmhhcyh0KSl0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gYWRkIGV4aXN0aW5nIGtleVwiKTtyZXR1cm4gdGhpcy5zdHJ1Y3Quc2V0KHQse29mZnNldDp0aGlzLmJ5dGVMZW5ndGgsZWxlbWVudDpufSksdGhpcy5ieXRlTGVuZ3RoKz1uLmJ5dGVMZW5ndGgsdGhpc31idWZmZXIoKXtsZXQgdD1CdWZmZXIuYWxsb2NVbnNhZmUodGhpcy5ieXRlTGVuZ3RoKTtyZXR1cm4gdGhpcy5jb3B5KHQpLHR9Y29weSh0LG49MCl7dGhpcy5zZXQoXCJzaXplXCIsdGhpcy5ieXRlTGVuZ3RoKTtmb3IobGV0IGkgb2YgdGhpcy5zdHJ1Y3QudmFsdWVzKCkpaS5lbGVtZW50LmNvcHkodCxuK2kub2Zmc2V0KX1sb2FkKHQsbj0wKXtmb3IobGV0IGkgb2YgdGhpcy5zdHJ1Y3QudmFsdWVzKCkpaS5lbGVtZW50LmxvYWQhPT12b2lkIDAmJmkuZWxlbWVudC5sb2FkKHQsbitpLm9mZnNldCl9Zm9ybWF0KHQ9MCl7bGV0IG49W1wiIFwiLnJlcGVhdCh0KStgWyR7dGhpcy50eXBlfV0gKCR7dGhpcy5ieXRlTGVuZ3RofSlgXTtmb3IobGV0W2ksb11vZiB0aGlzLnN0cnVjdCl7bGV0IHM9by5lbGVtZW50O3MuZm9ybWF0IT09dm9pZCAwP24ucHVzaChzLmZvcm1hdCh0KzIpKTpuLnB1c2goXCIgXCIucmVwZWF0KHQrMikrYCR7aX0gPSAke3MudmFsdWV9ICgke3MuYnl0ZUxlbmd0aH0pYCl9cmV0dXJuIG4uam9pbihgXG5gKX1wcmludCh0KXtjb25zb2xlLndhcm4odGhpcy5mb3JtYXQodCkpfX0sVT1jbGFzcyBleHRlbmRzIFR7Y29uc3RydWN0b3IodCxuLC4uLmkpe3N1cGVyKHQsbik7dGhpcy5ib3hTaXplPTAsdGhpcy5hcHBlbmQoLi4uaSl9YXBwZW5kKC4uLnQpe2ZvcihsZXQgbiBvZiB0KXRoaXMuYWRkKGBib3hfJHt0aGlzLmJveFNpemUrK31gLG4pO3JldHVybiB0aGlzfXBhcnNlKHQpe2xldCBuPVtdO2Zvcig7dC5ieXRlTGVuZ3RoPjA7KXtsZXQgaT1uZXcgUmUoXCIuLi4uXCIpO2kubG9hZCh0LDQpO2xldCBvPWkudmFsdWUscz1Qc1tvXSxhO2lmKHMhPT12b2lkIDApe2lmKHMuaXNfY29udGFpbmVyKXthPW5ldyBVKG8pLGEubG9hZCh0KTtsZXQgdT1hLnBhcnNlKHQuc2xpY2UoYS5ieXRlTGVuZ3RoLGEuZ2V0KFwic2l6ZVwiKSkpO24ucHVzaCguLi51KX1lbHNlIGlmKGE9bmV3IFQobyksYS5sb2FkKHQpLG89PT1cImF2Y0NcIil7bGV0IHU9YS5lbGVtZW50KFwiQVZDUHJvZmlsZUluZGljYXRpb25cIikudmFsdWUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsMCksZj1hLmVsZW1lbnQoXCJwcm9maWxlX2NvbXBhdGliaWxpdHlcIikudmFsdWUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsMCksbD1hLmVsZW1lbnQoXCJBVkNMZXZlbEluZGljYXRpb25cIikudmFsdWUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsMCk7bi5wdXNoKHt0eXBlOlwidmlkZW9cIixtaW1lOmBhdmMxLiR7dX0ke2Z9JHtsfWB9KX1lbHNlIGlmKG89PT1cImVzZHNcIil7bGV0IGY9YS5lbGVtZW50KFwiYXVkaW9Db25maWdCeXRlc1wiKS52YWx1ZT4+PjExJjMxO24ucHVzaCh7dHlwZTpcImF1ZGlvXCIsbWltZTpgbXA0YS40MC4ke2Z9YH0pfX1lbHNlIGE9bmV3IFQoXCIuLi4uXCIpLGEubG9hZCh0KSxhLnR5cGU9YS5nZXQoXCJ0eXBlXCIpO3RoaXMuYXBwZW5kKGEpLHQ9dC5zbGljZShhLmdldChcInNpemVcIikpfXJldHVybiBufX07YygpO2MoKTt2YXIgVGM9ezE6XCJBQUMgTWFpblwiLDI6XCJBQUMgTENcIn0sQ2M9ezA6XCI5NiBrSHpcIiwxOlwiODguMiBrSHpcIiwyOlwiNjQga0h6XCIsMzpcIjQ4IGtIelwiLDQ6XCI0NC4xIGtIelwiLDU6XCIzMiBrSHpcIiw2OlwiMjQga0h6XCIsNzpcIjIyLjA1IGtIelwiLDg6XCIxNiBrSHpcIiw5OlwiMTIga0h6XCIsMTA6XCIxMS4wMjUga0h6XCIsMTE6XCI4IGtIelwiLDEyOlwiNy4zNSBrSHpcIn0sQmM9ezE6XCJNb25vXCIsMjpcIlN0ZXJlb1wifSxNYz1yPT57bGV0IGU9cj4+PjExJjMxLHQ9cj4+PjcmMTUsbj1yPj4+MyYxNSxpPVRjW2VdfHxgQUFDICgke2V9KWAsbz1DY1t0XXx8XCJ1bmtub3duXCIscz1CY1tuXXx8bi50b1N0cmluZygpO3JldHVybntjb2Rpbmc6aSxzYW1wbGluZ1JhdGU6byxjaGFubmVsczpzfX0sa3M9KHIsZSx0KT0+e2xldCBuPU51bWJlcihyLmZtdHAucGFyYW1ldGVycy5iaXRyYXRlKXx8MzJlNCxpPXBhcnNlSW50KHIuZm10cC5wYXJhbWV0ZXJzLmNvbmZpZy5zdWJzdHIoMCw0KSwxNiksbz1pPj4+MTEmMzE7cmV0dXJue3RraGQ6e3RyYWNrX0lEOnQsY3JlYXRpb25fdGltZTplLG1vZGlmaWNhdGlvbl90aW1lOmUsd2lkdGg6MCxoZWlnaHQ6MCx2b2x1bWU6MX0sbWRoZDp7dGltZXNjYWxlOk51bWJlcihyLnJ0cG1hcC5jbG9ja3JhdGUpLGNyZWF0aW9uX3RpbWU6ZSxtb2RpZmljYXRpb25fdGltZTplLGR1cmF0aW9uOjB9LGhkbHI6e2hhbmRsZXJfdHlwZTpcInNvdW5cIixuYW1lOlwiU291bmRIYW5kbGVyXFwwXCJ9LG1lZGlhSGVhZGVyQm94Om5ldyBUKFwic21oZFwiKSxzYW1wbGVFbnRyeUJveDpuZXcgVShcIm1wNGFcIix7c2FtcGxlcmF0ZTpyLnJ0cG1hcC5jbG9ja3JhdGU8PDE2Pj4+MH0sbmV3IFQoXCJlc2RzXCIse2F1ZGlvQ29uZmlnQnl0ZXM6aSxtYXhCaXRSYXRlOm4sYXZnQml0UmF0ZTpufSkpLGRlZmF1bHRGcmFtZUR1cmF0aW9uOjEwMjQsbWltZTpgbXA0YS40MC4ke299YCxjb2RlYzpNYyhpKX19O2MoKTtjKCk7ZnVuY3Rpb24gTGMocil7cmV0dXJuIHI+NjQmJnI8OTE/ci02NTpyPjk2JiZyPDEyMz9yLTcxOnI+NDcmJnI8NTg/cis0OnI9PT00Mz82MjpyPT09NDc/NjM6MH1mdW5jdGlvbiBPcyhyLGUpe2xldCB0PXIucmVwbGFjZSgvW15BLVphLXowLTkrL10vZyxcIlwiKSxuPXQubGVuZ3RoLGk9ZT9NYXRoLmNlaWwoKG4qMysxPj4yKS9lKSplOm4qMysxPj4yLG89bmV3IFVpbnQ4QXJyYXkoaSkscyxhLHU9MCxmPTA7Zm9yKGxldCBsPTA7bDxuO2wrKylpZihhPWwmMyx1fD1MYyh0LmNoYXJDb2RlQXQobCkpPDwxOC02KmEsYT09PTN8fG4tbD09PTEpe2ZvcihzPTA7czwzJiZmPGk7cysrLGYrKylvW2ZdPXU+Pj4oMTY+Pj5zJjI0KSYyNTU7dT0wfXJldHVybiBvfWMoKTtjKCk7dmFyIGdyPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX2J1ZmZlcj1lLHRoaXMuX2RhdGFWaWV3PW5ldyBEYXRhVmlldyh0aGlzLl9idWZmZXIpLHRoaXMuX29mZnNldD0wLHRoaXMuX2JpdHBvcz0wLHRoaXMuX2J5dGU9MH1yZWFkVWludDgoZSl7cmV0dXJuIHRoaXMuX2RhdGFWaWV3LmdldFVpbnQ4KGUpfXJlYWRVaW50MTYoZSl7cmV0dXJuIHRoaXMuX2RhdGFWaWV3LmdldFVpbnQxNihlKX1yZWFkVWludDMyKGUpe3JldHVybiB0aGlzLl9kYXRhVmlldy5nZXRVaW50MzIoZSl9cmVhZE5leHQoKXtsZXQgZT10aGlzLnJlYWRVaW50OCh0aGlzLl9vZmZzZXQpO3JldHVybiB0aGlzLl9vZmZzZXQrPTEsZX1yZWFkQml0cyhlKXtpZihlPjMyfHxlPT09MCl0aHJvdyBuZXcgRXJyb3IoXCJsZW5ndGggaGFzIHRvIGJlIGJldHdlZW4gMCAtIDMxIGJpdHNcIik7bGV0IHQ9MDtmb3IobGV0IG49MTtuPD1lOysrbil0aGlzLl9iaXRwb3M9PT0wJiYodGhpcy5fYnl0ZT10aGlzLnJlYWROZXh0KCkpLHQ9dDw8MXx0aGlzLl9ieXRlPj44LSsrdGhpcy5fYml0cG9zJjEsdGhpcy5fYml0cG9zJT04O3JldHVybiB0fXJlYWRVbnNpZ25lZEV4cEdvbG9tYigpe2xldCBlPTA7Zm9yKDt0aGlzLnJlYWRCaXRzKDEpIT09MTspZSsrO2lmKGU9PT0wKXJldHVybiAwO2lmKGU+PTMxKXRocm93IG5ldyBFcnJvcihcInJlYWQgdW5zaWduZWQgZXhwb25lbnRpYWwgR29sb21iOiBpbnRlcm5hbCBlcnJvclwiKTtsZXQgdD10aGlzLnJlYWRCaXRzKGUpO3JldHVybiB0fD0xPDxlLHQtMX1yZWFkU2lnbmVkRXhwR29sb21iKCl7bGV0IGU9dGhpcy5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtyZXR1cm4gZSYxP2U9ZSsxPj4xOmU9LShlPj4xKSxlfXNpemUoKXtyZXR1cm4gdGhpcy5fYnVmZmVyLmJ5dGVMZW5ndGh9Z2V0VWludDhBcnJheSgpe3JldHVybiBuZXcgVWludDhBcnJheSh0aGlzLl9idWZmZXIpfWdldEFycmF5QnVmZmVyKCl7cmV0dXJuIHRoaXMuX2J1ZmZlcn19O3ZhciB5cj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLnJlYWRlcj1uZXcgZ3IoZSl9cGFyc2UoKXt0aGlzLnJlYWRlci5yZWFkTmV4dCgpO2xldCBlPXRoaXMucmVhZGVyLnJlYWROZXh0KCk7dGhpcy5yZWFkZXIucmVhZE5leHQoKTtsZXQgdD10aGlzLnJlYWRlci5yZWFkTmV4dCgpO2lmKHRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpLFsxMDAsMTEwLDEyMiwyNDQsNDQsODMsODYsMTE4XS5pbmNsdWRlcyhlKSl7bGV0IGI9dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk7aWYoYj09PTMmJnRoaXMucmVhZGVyLnJlYWRCaXRzKDEpLHRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpLHRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpLHRoaXMucmVhZGVyLnJlYWRCaXRzKDEpLHRoaXMucmVhZGVyLnJlYWRCaXRzKDEpKWZvcihsZXQgdz0wO3c8KGIhPT0zPzg6MTIpO3crKyl0aGlzLnJlYWRlci5yZWFkQml0cygxKX10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtsZXQgbj10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtpZihuPT09MCl0aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtlbHNlIGlmKG49PT0xKXtsZXQgYj0wO3RoaXMucmVhZGVyLnJlYWRCaXRzKDEpLHRoaXMucmVhZGVyLnJlYWRTaWduZWRFeHBHb2xvbWIoKSx0aGlzLnJlYWRlci5yZWFkU2lnbmVkRXhwR29sb21iKCksYj10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtmb3IobGV0IHk9MDt5PGI7eSsrKXRoaXMucmVhZGVyLnJlYWRTaWduZWRFeHBHb2xvbWIoKX10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKSx0aGlzLnJlYWRlci5yZWFkQml0cygxKTtsZXQgaT10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKSxvPXRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpLHM9dGhpcy5yZWFkZXIucmVhZEJpdHMoMSk7dGhpcy5yZWFkZXIucmVhZEJpdHMoMSk7bGV0IGE9dGhpcy5yZWFkZXIucmVhZEJpdHMoMSksdT1hP3RoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpOjAsZj1hP3RoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpOjAsbD1hP3RoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpOjAsZD1hP3RoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpOjAsaD0oaSsxKSoxNi11KjItZioyLG09KDItcykqKG8rMSkqMTYtbCoyLWQqMjtyZXR1cm57cHJvZmlsZTplLGxldmVsOnQvMTAsd2lkdGg6aCxoZWlnaHQ6bX19fTt2YXIgSWM9ezY2OlwiQmFzZWxpbmVcIiw3NzpcIk1haW5cIiwxMDA6XCJIaWdoXCJ9LEFjPXI9PntsZXQgZT1wYXJzZUludChyLnN1YnN0cigwLDIpLDE2KSx0PXBhcnNlSW50KHIuc3Vic3RyKDQsMiksMTYpLG49SWNbZV18fGUudG9TdHJpbmcoKSxpPSh0LzEwKS50b0ZpeGVkKDEpO3JldHVybntjb2Rpbmc6XCJILjI2NFwiLHByb2ZpbGU6bixsZXZlbDppfX0sVXM9KHIsZSx0KT0+e2xldCBuPXIuZm10cC5wYXJhbWV0ZXJzW1wicHJvZmlsZS1sZXZlbC1pZFwiXSxpPXIuZm10cC5wYXJhbWV0ZXJzW1wic3Byb3AtcGFyYW1ldGVyLXNldHNcIl0uc3BsaXQoXCIsXCIpLm1hcChPcyksbz1pLnNsaWNlKDAsMSkscz1pLnNsaWNlKDEpLGE9bmV3IHlyKG9bMF0uYnVmZmVyKS5wYXJzZSgpLHU9MzYwMDtyZXR1cm57bWVkaWFIZWFkZXJCb3g6bmV3IFQoXCJ2bWhkXCIpLHNhbXBsZUVudHJ5Qm94Om5ldyBVKFwiYXZjMVwiLHt3aWR0aDphLndpZHRoLGhlaWdodDphLmhlaWdodH0sbmV3IFQoXCJhdmNDXCIse0FWQ1Byb2ZpbGVJbmRpY2F0aW9uOm9bMF1bMV0scHJvZmlsZV9jb21wYXRpYmlsaXR5Om9bMF1bMl0sQVZDTGV2ZWxJbmRpY2F0aW9uOm9bMF1bM10sc2VxdWVuY2VQYXJhbWV0ZXJTZXRzOm8scGljdHVyZVBhcmFtZXRlclNldHM6c30pKSx0a2hkOnt0cmFja19JRDp0LGNyZWF0aW9uX3RpbWU6ZSxtb2RpZmljYXRpb25fdGltZTplLHdpZHRoOmEud2lkdGg8PDE2LGhlaWdodDphLmhlaWdodDw8MTYsdm9sdW1lOjB9LGhkbHI6e30sbWRoZDp7dGltZXNjYWxlOnIucnRwbWFwLmNsb2NrcmF0ZSxjcmVhdGlvbl90aW1lOmUsbW9kaWZpY2F0aW9uX3RpbWU6ZSxkdXJhdGlvbjowfSxkZWZhdWx0RnJhbWVEdXJhdGlvbjpyLmZyYW1lcmF0ZSE9PXZvaWQgMCYmci5mcmFtZXJhdGU+MCYmTnVtYmVyKHIucnRwbWFwLmNsb2NrcmF0ZSkvTnVtYmVyKHIuZnJhbWVyYXRlKXx8dSxtaW1lOmBhdmMxLiR7bn1gLGNvZGVjOkFjKG4pfX07dmFyIERzPXtcIk1QRUc0LUdFTkVSSUNcIjprcyxIMjY0OlVzfSxGYz0oKT0+KHtsYXN0VGltZXN0YW1wOjAsYmFzZU1lZGlhRGVjb2RlVGltZTowLGRlZmF1bHRGcmFtZUR1cmF0aW9uOjAsY2xvY2tyYXRlOjAsYml0cmF0ZTowLGZyYW1lcmF0ZTowLGN1bXVsYXRpdmVCeXRlTGVuZ3RoOjAsY3VtdWxhdGl2ZUR1cmF0aW9uOjAsY3VtdWxhdGl2ZUZyYW1lczowfSksUGM9KHIse2J5dGVMZW5ndGg6ZSxkdXJhdGlvbjp0fSk9PntpZihyLmN1bXVsYXRpdmVCeXRlTGVuZ3RoKz1lLHIuY3VtdWxhdGl2ZUR1cmF0aW9uKz10LHIuY3VtdWxhdGl2ZUZyYW1lcysrLHIuY3VtdWxhdGl2ZUR1cmF0aW9uPj1yLmNsb2NrcmF0ZSl7bGV0IG49OCpyLmN1bXVsYXRpdmVCeXRlTGVuZ3RoLGk9ci5jdW11bGF0aXZlRnJhbWVzLG89ci5jdW11bGF0aXZlRHVyYXRpb24vci5jbG9ja3JhdGU7ci5iaXRyYXRlPW4vbyxyLmZyYW1lcmF0ZT1pL28sci5jdW11bGF0aXZlQnl0ZUxlbmd0aD0wLHIuY3VtdWxhdGl2ZUR1cmF0aW9uPTAsci5jdW11bGF0aXZlRnJhbWVzPTB9fSxicj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMudHJhY2tJZE1hcD17fSx0aGlzLnNlcXVlbmNlTnVtYmVyPTAsdGhpcy5udHBQcmVzZW50YXRpb25UaW1lPTAsdGhpcy50cmFja0RhdGE9W119dHJhayhlKXtsZXQgdD1uZXcgVShcInRyYWtcIiksbj1uZXcgVShcIm1kaWFcIiksaT1uZXcgVShcIm1pbmZcIiksbz1uZXcgVShcImRpbmZcIikscz1uZXcgVShcImRyZWZcIiksYT1uZXcgVShcInN0YmxcIik7cmV0dXJuIHMuc2V0KFwiZW50cnlfY291bnRcIiwxKSx0LmFwcGVuZChuZXcgVChcInRraGRcIixlLnRraGQpLG4uYXBwZW5kKG5ldyBUKFwibWRoZFwiLGUubWRoZCksbmV3IFQoXCJoZGxyXCIsZS5oZGxyKSxpLmFwcGVuZChlLm1lZGlhSGVhZGVyQm94LG8uYXBwZW5kKHMuYXBwZW5kKG5ldyBUKFwidXJsIFwiKSkpLGEuYXBwZW5kKG5ldyBVKFwic3RzZFwiLHZvaWQgMCxlLnNhbXBsZUVudHJ5Qm94KSxuZXcgVChcInN0dHNcIiksbmV3IFQoXCJzdHNjXCIpLG5ldyBUKFwic3Rjb1wiKSxuZXcgVChcInN0c3pcIiksbmV3IFQoXCJzdHNzXCIpKSkpKSx0fW1vb3YoZSx0KXtsZXQgbj1uZXcgVShcIm1vb3ZcIik7bi5hcHBlbmQobmV3IFQoXCJtdmhkXCIse2NyZWF0aW9uX3RpbWU6dCxtb2RpZmljYXRpb25fdGltZTp0LGR1cmF0aW9uOjB9KSk7bGV0IGk9bmV3IFUoXCJtdmV4XCIpO3RoaXMudHJhY2tJZE1hcD17fSx0aGlzLnNlcXVlbmNlTnVtYmVyPTAsdGhpcy5udHBQcmVzZW50YXRpb25UaW1lPTA7bGV0IG89MDtyZXR1cm4gdGhpcy50cmFja0RhdGE9W10sZS5tZWRpYS5mb3JFYWNoKHM9PntpZihzLnJ0cG1hcD09PXZvaWQgMClyZXR1cm47bGV0IGE9cy5ydHBtYXAucGF5bG9hZFR5cGUsdT1zLnJ0cG1hcC5lbmNvZGluZ05hbWU7aWYoRHNbdV0hPT12b2lkIDApe3RoaXMudHJhY2tJZE1hcFthXT0rK28scy50eXBlLnRvTG93ZXJDYXNlKCk9PT1cInZpZGVvXCImJih0aGlzLnZpZGVvVHJhY2tJZD1vKTtsZXQgZj1Ec1t1XShzLHQsbyk7cy5taW1lPWYubWltZSxzLmNvZGVjPWYuY29kZWM7bGV0IGw9RmMoKTtsLmNsb2NrcmF0ZT1zLnJ0cG1hcC5jbG9ja3JhdGUsbC5kZWZhdWx0RnJhbWVEdXJhdGlvbj1mLmRlZmF1bHRGcmFtZUR1cmF0aW9uLHRoaXMudHJhY2tEYXRhLnB1c2gobCk7bGV0IGQ9dGhpcy50cmFrKGYpO24uYXBwZW5kKGQpLGkuYXBwZW5kKG5ldyBUKFwidHJleFwiLHt0cmFja19JRDpvfSkpfX0pLG4uYXBwZW5kKGkpLG59bW9vZihlKXtsZXR7dHJhY2tJZDp0LHRpbWVzdGFtcDpuLGJ5dGVMZW5ndGg6aX09ZSxvPXQtMSxzPXRoaXMudHJhY2tEYXRhW29dLGE9cy5sYXN0VGltZXN0YW1wIT09MD9uLXMubGFzdFRpbWVzdGFtcHwwOnMuZGVmYXVsdEZyYW1lRHVyYXRpb24sdT1hPjA/YTpzLmRlZmF1bHRGcmFtZUR1cmF0aW9uO3MubGFzdFRpbWVzdGFtcD1hPjA/bjpzLmxhc3RUaW1lc3RhbXArdTtsZXQgZj1uZXcgVShcIm1vb2ZcIiksbD1uZXcgVShcInRyYWZcIiksZD1uZXcgVChcInRydW5cIix7c2FtcGxlX2R1cmF0aW9uOnUsc2FtcGxlX3NpemU6aSxmaXJzdF9zYW1wbGVfZmxhZ3M6NjR9KTtyZXR1cm4gZi5hcHBlbmQobmV3IFQoXCJtZmhkXCIse3NlcXVlbmNlX251bWJlcjp0aGlzLnNlcXVlbmNlTnVtYmVyKyt9KSxsLmFwcGVuZChuZXcgVChcInRmaGRcIix7dHJhY2tfSUQ6dH0pLG5ldyBUKFwidGZkdFwiLHtiYXNlTWVkaWFEZWNvZGVUaW1lOnMuYmFzZU1lZGlhRGVjb2RlVGltZX0pLGQpKSxzLmJhc2VNZWRpYURlY29kZVRpbWUrPXUsZC5zZXQoXCJkYXRhX29mZnNldFwiLGYuYnl0ZUxlbmd0aCs4KSxQYyhzLHtieXRlTGVuZ3RoOmksZHVyYXRpb246dX0pLGZ9bWRhdChlKXtsZXQgdD1uZXcgVChcIm1kYXRcIik7cmV0dXJuIHQuYWRkKFwiZGF0YVwiLGUpLHR9c2V0UHJlc2VudGF0aW9uVGltZShlLHQpe2lmKCF0aGlzLm50cFByZXNlbnRhdGlvblRpbWUmJnQmJmU9PT10aGlzLnZpZGVvVHJhY2tJZCl7bGV0IG49ZS0xLGk9dGhpcy50cmFja0RhdGFbbl07dGhpcy5udHBQcmVzZW50YXRpb25UaW1lPXQtMWUzKihpLmJhc2VNZWRpYURlY29kZVRpbWUvaS5jbG9ja3JhdGUpfX19O3ZhciBOcz1DKE4oKSk7dmFyIHB0PWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCB0PW5ldyBicixuPW89Pnt0aGlzLm9uU3luYyYmdGhpcy5vblN5bmMobyl9LGk9bmV3IE5zLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24obyxzLGEpe2lmKG8udHlwZT09PTUpe2xldCB1PU1hdGguZmxvb3IobmV3IERhdGUoKS5nZXRUaW1lKCkvMWUzKzIwODI4NTJlMyksZj1uZXcgVChcImZ0eXBcIiksbD10Lm1vb3Yoby5zZHAsdSksZD1CdWZmZXIuYWxsb2NVbnNhZmUoZi5ieXRlTGVuZ3RoK2wuYnl0ZUxlbmd0aCk7Zi5jb3B5KGQsMCksbC5jb3B5KGQsZi5ieXRlTGVuZ3RoKSwoMCxZbi5kZWZhdWx0KShcIm1zbDptcDQ6aXNvbVwiKShgZnR5cDogJHtmLmZvcm1hdCgpfWApLCgwLFluLmRlZmF1bHQpKFwibXNsOm1wNDppc29tXCIpKGBtb292OiAke2wuZm9ybWF0KCl9YCk7bGV0IGg9by5zZHAubWVkaWEubWFwKG09Pih7dHlwZTptLnR5cGUsZW5jb2Rpbmc6bS5ydHBtYXAmJm0ucnRwbWFwLmVuY29kaW5nTmFtZSxtaW1lOm0ubWltZSxjb2RlYzptLmNvZGVjfSkpO3RoaXMucHVzaCh7dHlwZTo4LGRhdGE6ZCx0cmFja3M6aCxmdHlwOmYsbW9vdjpsfSl9ZWxzZSBpZihvLnR5cGU9PT02fHxvLnR5cGU9PT03KXtsZXR7cGF5bG9hZFR5cGU6dSx0aW1lc3RhbXA6ZixudHBUaW1lc3RhbXA6bH09byxkPXQudHJhY2tJZE1hcFt1XTtpZihkKXt0Lm50cFByZXNlbnRhdGlvblRpbWV8fCh0LnNldFByZXNlbnRhdGlvblRpbWUoZCxsKSx0Lm50cFByZXNlbnRhdGlvblRpbWUmJm4odC5udHBQcmVzZW50YXRpb25UaW1lKSk7bGV0IGgsbT1vLnR5cGU9PT03P28ubmFsVHlwZT09PTU6dm9pZCAwO3QubnRwUHJlc2VudGF0aW9uVGltZSYmbSYmby5udHBUaW1lc3RhbXAhPT12b2lkIDAmJihoPShvLm50cFRpbWVzdGFtcC10Lm50cFByZXNlbnRhdGlvblRpbWUpLzFlMyk7bGV0IGI9by5kYXRhLmJ5dGVMZW5ndGgseT10Lm1vb2Yoe3RyYWNrSWQ6ZCx0aW1lc3RhbXA6ZixieXRlTGVuZ3RoOmJ9KSx3PXQubWRhdChvLmRhdGEpLF89QnVmZmVyLmFsbG9jVW5zYWZlKHkuYnl0ZUxlbmd0aCt3LmJ5dGVMZW5ndGgpO3kuY29weShfLDApLHcuY29weShfLHkuYnl0ZUxlbmd0aCksdGhpcy5wdXNoKHt0eXBlOjgsZGF0YTpfLG1vb2Y6eSxtZGF0OncsbnRwVGltZXN0YW1wOmwsY2hlY2twb2ludFRpbWU6aH0pfX1lbHNlIHRoaXMucHVzaChvKTthKCl9fSk7c3VwZXIoaSk7dGhpcy5ib3hCdWlsZGVyPXR9Z2V0IGJpdHJhdGUoKXtyZXR1cm4gdGhpcy5ib3hCdWlsZGVyLnRyYWNrRGF0YSYmdGhpcy5ib3hCdWlsZGVyLnRyYWNrRGF0YS5tYXAodD0+dC5iaXRyYXRlKX1nZXQgZnJhbWVyYXRlKCl7cmV0dXJuIHRoaXMuYm94QnVpbGRlci50cmFja0RhdGEmJnRoaXMuYm94QnVpbGRlci50cmFja0RhdGEubWFwKHQ9PnQuZnJhbWVyYXRlKX1nZXQgbnRwUHJlc2VudGF0aW9uVGltZSgpe3JldHVybiB0aGlzLmJveEJ1aWxkZXIubnRwUHJlc2VudGF0aW9uVGltZX19O2MoKTt2YXIgVnM9QyhsZSgpKTt2YXIgdnI9QyhOKCkpO2MoKTt2YXIgS249KG89PihvW28uU1I9MjAwXT1cIlNSXCIsb1tvLlJSPTIwMV09XCJSUlwiLG9bby5TREVTPTIwMl09XCJTREVTXCIsb1tvLkJZRT0yMDNdPVwiQllFXCIsb1tvLkFQUD0yMDRdPVwiQVBQXCIsbykpKEtufHx7fSksa2M9cj0+KHt2ZXJzaW9uOnJbMF0+Pj42LHBhZGRpbmc6ISEoclswXSZpdFsyXSksY291bnQ6clswXSYzMSxwYWNrZXRUeXBlOnIucmVhZFVJbnQ4KDEpLGxlbmd0aDpyLnJlYWRVSW50MTZCRSgyKX0pLFhuPXI9PntsZXQgZT1rYyhyKTtzd2l0Y2goZS5wYWNrZXRUeXBlKXtjYXNlIDIwMDpyZXR1cm4gT2MocixlKTtjYXNlIDIwMTpyZXR1cm4gVWMocixlKTtjYXNlIDIwMjpyZXR1cm4gRGMocixlKTtjYXNlIDIwMzpyZXR1cm4gTmMocixlKTtjYXNlIDIwNDpyZXR1cm4gSGMocixlKTtkZWZhdWx0OnJldHVybiBlfX0seHI9KHIsZSk9Pih7dHlwZTozLGRhdGE6ZSxjaGFubmVsOnIscnRjcDpYbihlKX0pLEhzPXtwYWNrZXRUeXBlOjIwMH0scXM9KHIsZSx0KT0+e2xldCBuPVtdO2ZvcihsZXQgaT0wO2k8cjtpKyspe2xldCBvPXQraSoyNDtuLnB1c2goe3N5bmNTb3VyY2U6ZS5yZWFkVUludDMyQkUobyswKSxmcmFjdGlvbkxvc3Q6ZS5yZWFkVUludDgobys0KSxjdW11bGF0aXZlTnVtYmVyT2ZQYWNrZXRzTG9zdDplLnJlYWRVSW50QkUobys1LDMpLGV4dGVuZGVkSGlnaGVzdFNlcXVlbmNlTnVtYmVyUmVjZWl2ZWQ6ZS5yZWFkVUludDMyQkUobys4KSxpbnRlcmFycml2YWxKaXR0ZXI6ZS5yZWFkVUludDMyQkUobysxMiksbGFzdFNSVGltZXN0YW1wOmUucmVhZFVJbnQzMkJFKG8rMTYpLGRlbGF5U2luY2VMYXN0U1I6ZS5yZWFkVUludDMyQkUobysyMCl9KX1yZXR1cm4gbn0sT2M9KHIsZSk9Pih7Li4uZSxzeW5jU291cmNlOnIucmVhZFVJbnQzMkJFKDQpLG50cE1vc3Q6ci5yZWFkVUludDMyQkUoOCksbnRwTGVhc3Q6ci5yZWFkVUludDMyQkUoMTIpLHJ0cFRpbWVzdGFtcDpyLnJlYWRVSW50MzJCRSgxNiksc2VuZGVyc1BhY2tldENvdW50OnIucmVhZFVJbnQzMkJFKDIwKSxzZW5kZXJzT2N0ZXRDb3VudDpyLnJlYWRVSW50MzJCRSgyNCkscmVwb3J0czpxcyhlLmNvdW50LHIsMjgpfSksX3I9cj0+ci5wYWNrZXRUeXBlPT09MjAwLFVjPShyLGUpPT4oey4uLmUsc3luY1NvdXJjZTpyLnJlYWRVSW50MzJCRSg0KSxyZXBvcnRzOnFzKGUuY291bnQsciw4KX0pLGpzPXI9PnIucGFja2V0VHlwZT09PTIwMSxKbj0odT0+KHVbdS5DTkFNRT0xXT1cIkNOQU1FXCIsdVt1Lk5BTUU9Ml09XCJOQU1FXCIsdVt1LkVNQUlMPTNdPVwiRU1BSUxcIix1W3UuUEhPTkU9NF09XCJQSE9ORVwiLHVbdS5MT0M9NV09XCJMT0NcIix1W3UuVE9PTD02XT1cIlRPT0xcIix1W3UuTk9URT03XT1cIk5PVEVcIix1W3UuUFJJVj04XT1cIlBSSVZcIix1KSkoSm58fHt9KSxEYz0ocixlKT0+e2xldCB0PVtdLG49NDtmb3IobGV0IGk9MDtpPGUuY291bnQ7aSsrKXtsZXQgbz17c291cmNlOnIucmVhZFVJbnQzMkJFKG4pLGl0ZW1zOltdfTtmb3Iobis9NDs7KXtsZXQgcz1yLnJlYWRVSW50OChuKyspO2lmKHM9PT0wKXtuJTQhPT0wJiYobis9NC1uJTQpO2JyZWFrfWxldCBhPXIucmVhZFVJbnQ4KG4rKyk7aWYocz09PTgpe2xldCB1PXIucmVhZFVJbnQ4KG4pLGY9ci50b1N0cmluZyhcInV0ZjhcIixuKzEsbisxK3UpLGw9ci50b1N0cmluZyhcInV0ZjhcIixuKzErdSxuK2EpO28uaXRlbXMucHVzaChbOCxmLGxdKX1lbHNle2xldCB1PXIudG9TdHJpbmcoXCJ1dGY4XCIsbixuK2EpO28uaXRlbXMucHVzaChbcyx1XSl9bis9YX10LnB1c2gobyl9cmV0dXJuey4uLmUsc3luY1NvdXJjZTpyLnJlYWRVSW50MzJCRSg0KSxzb3VyY2VEZXNjcmlwdGlvbnM6dH19LFdzPXI9PnIucGFja2V0VHlwZT09PTIwMixOYz0ocixlKT0+e2xldCB0PVtdO2ZvcihsZXQgaT0wO2k8ZS5jb3VudDtpKyspdC5wdXNoKHIucmVhZFVJbnQzMkJFKDQrNCppKSk7bGV0IG47aWYoZS5sZW5ndGg+ZS5jb3VudCl7bGV0IGk9NCs0KmUuY291bnQsbz1yLnJlYWRVSW50OChpKTtuPXIudG9TdHJpbmcoXCJ1dGYtOFwiLGkrMSxpKzErbyl9cmV0dXJuey4uLmUsc291cmNlczp0LHJlYXNvbjpufX0sd3I9cj0+ci5wYWNrZXRUeXBlPT09MjAzLEhjPShyLGUpPT4oey4uLmUsc3VidHlwZTplLmNvdW50LHNvdXJjZTpyLnJlYWRVSW50MzJCRSg0KSxuYW1lOnIudG9TdHJpbmcoXCJhc2NpaVwiLDgsMTIpLGRhdGE6ci5zbGljZSgxMil9KSwkcz1yPT5yLnBhY2tldFR5cGU9PT0yMDQ7dmFyIHFjPTEwMCxHcz0oMCxWcy5kZWZhdWx0KShcIm1zbDptc2VcIiksVGU9Y2xhc3MgZXh0ZW5kcyBRe2NvbnN0cnVjdG9yKHQpe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwidmlkZW8gZWxlbWVudCBhcmd1bWVudCBtaXNzaW5nXCIpO2xldCBuLGksbz1uZXcgdnIuV3JpdGFibGUoe29iamVjdE1vZGU6ITAsd3JpdGU6KGEsdSxmKT0+e2lmKGEudHlwZT09PTgpaWYodGhpcy5fZG9uZT1mLGEudHJhY2tzIT09dm9pZCAwfHxhLm1pbWUhPT12b2lkIDApe2xldCBsPWEudHJhY2tzPz9bXSxkPWwubWFwKHk9PnkubWltZSkuZmlsdGVyKHk9PnkpLGg9ZC5sZW5ndGghPT0wP2Quam9pbihcIiwgXCIpOlwiYXZjMS42NDAwMjksIG1wNGEuNDAuMlwiLG09YS5taW1lPz9gdmlkZW8vbXA0OyBjb2RlY3M9XCIke2h9XCJgO2lmKCFNZWRpYVNvdXJjZS5pc1R5cGVTdXBwb3J0ZWQobSkpe28uZW1pdChcImVycm9yXCIsYHVuc3VwcG9ydGVkIG1lZGlhIHR5cGU6ICR7bX1gKTtyZXR1cm59dGhpcy5fbGFzdENoZWNrcG9pbnRUaW1lPTAsbj1uZXcgTWVkaWFTb3VyY2UsdC5zcmM9d2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobik7bGV0IGI9KCk9PntpZihuPT09dm9pZCAwKXtvLmVtaXQoXCJlcnJvclwiLFwibm8gTWVkaWFTb3VyY2UgaW5zdGFuY2VcIik7cmV0dXJufXdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHQuc3JjKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzb3VyY2VvcGVuXCIsYiksdGhpcy5vblNvdXJjZU9wZW4mJnRoaXMub25Tb3VyY2VPcGVuKG4sbCksaT10aGlzLmFkZFNvdXJjZUJ1ZmZlcih0LG4sbSksaS5vbmVycm9yPXk9Pntjb25zb2xlLmVycm9yKFwiZXJyb3Igb24gU291cmNlQnVmZmVyOiBcIix5KSxvLmVtaXQoXCJlcnJvclwiKX07dHJ5e2kuYXBwZW5kQnVmZmVyKGEuZGF0YSl9Y2F0Y2goeSl7R3MoXCJmYWlsZWQgdG8gYXBwZW5kIHRvIFNvdXJjZUJ1ZmZlcjogXCIseSxhKX19O24uYWRkRXZlbnRMaXN0ZW5lcihcInNvdXJjZW9wZW5cIixiKX1lbHNle3RoaXMuX2xhc3RDaGVja3BvaW50VGltZT1hLmNoZWNrcG9pbnRUaW1lIT09dm9pZCAwP2EuY2hlY2twb2ludFRpbWU6dGhpcy5fbGFzdENoZWNrcG9pbnRUaW1lO3RyeXtpPy5hcHBlbmRCdWZmZXIoYS5kYXRhKX1jYXRjaChsKXtHcyhcImZhaWxlZCB0byBhcHBlbmQgdG8gU291cmNlQnVmZmVyOiBcIixsLGEpfX1lbHNlIGEudHlwZT09PTMmJndyKGEucnRjcCkmJm4/LnJlYWR5U3RhdGU9PT1cIm9wZW5cIiYmbi5lbmRPZlN0cmVhbSgpLGYoKX19KTtvLm9uKFwiZmluaXNoXCIsKCk9Pntjb25zb2xlLndhcm4oXCJpbmNvbWluZyBzdHJlYW0gZmluaXNoZWQ6IGVuZCBzdHJlYW1cIiksbiYmbi5yZWFkeVN0YXRlPT09XCJvcGVuXCImJm4uZW5kT2ZTdHJlYW0oKX0pLG8ub24oXCJlcnJvclwiLGE9Pntjb25zb2xlLmVycm9yKFwiZXJyb3Igb24gaW5jb21pbmcgc3RyZWFtOiBcIixhKSxpJiZpLnVwZGF0aW5nP2kuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWVuZFwiLCgpPT57bj8ucmVhZHlTdGF0ZT09PVwib3BlblwiJiZuLmVuZE9mU3RyZWFtKCl9KTpuPy5yZWFkeVN0YXRlPT09XCJvcGVuXCImJm4uZW5kT2ZTdHJlYW0oKX0pO2xldCBzPW5ldyB2ci5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkOmZ1bmN0aW9uKCl7fX0pO3Mub24oXCJlcnJvclwiLCgpPT57Y29uc29sZS53YXJuKFwib3V0Z29pbmcgc3RyZWFtIGJyb2tlIHNvbWV3aGVyZVwiKX0pO3N1cGVyKG8scyk7dGhpcy5fdmlkZW9FbD10LHRoaXMuX2xhc3RDaGVja3BvaW50VGltZT0wfWFkZFNvdXJjZUJ1ZmZlcih0LG4saSl7bGV0IG89bi5hZGRTb3VyY2VCdWZmZXIoaSkscz0wLGE9KCk9PntpZigrK3Mscz5xYyYmby5idWZmZXJlZC5sZW5ndGgpe3M9MDtsZXQgdT1vLmJ1ZmZlcmVkLmxlbmd0aC0xLGY9by5idWZmZXJlZC5zdGFydCh1KSxsPU1hdGgubWluKHQuY3VycmVudFRpbWUsdGhpcy5fbGFzdENoZWNrcG9pbnRUaW1lKS0xMDt0cnl7aWYobD5mKXtvLnJlbW92ZShmLGwpO3JldHVybn19Y2F0Y2goZCl7Y29uc29sZS53YXJuKGQpfX10aGlzLl9kb25lJiZ0aGlzLl9kb25lKCl9O3JldHVybiBvLmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVlbmRcIixhKSxvfWdldCBjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLl92aWRlb0VsLmN1cnJlbnRUaW1lfWFzeW5jIHBsYXkoKXtyZXR1cm4gYXdhaXQgdGhpcy5fdmlkZW9FbC5wbGF5KCl9cGF1c2UoKXtyZXR1cm4gdGhpcy5fdmlkZW9FbC5wYXVzZSgpfX07YygpO3ZhciB6cz1DKE4oKSk7dmFyIENlPWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCBlLHQ9W10sbj1uZXcgenMuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpmdW5jdGlvbihpLG8scyl7aWYoaS50eXBlPT09NSl7bGV0IGE7Zm9yKGxldCB1IG9mIGkuc2RwLm1lZGlhKXUudHlwZT09PVwiYXBwbGljYXRpb25cIiYmdS5ydHBtYXAmJnUucnRwbWFwLmVuY29kaW5nTmFtZT09PVwiVk5ELk9OVklGLk1FVEFEQVRBXCImJihhPXUpO2EmJmEucnRwbWFwJiYoZT1OdW1iZXIoYS5ydHBtYXAucGF5bG9hZFR5cGUpKSxzKHZvaWQgMCxpKX1lbHNlIGlmKGkudHlwZT09PTImJk8oaS5kYXRhKT09PWUpe2lmKHQucHVzaChaKGkuZGF0YSkpLGNlKGkuZGF0YSkmJnQubGVuZ3RoPjApe2xldCBhPXt0aW1lc3RhbXA6SChpLmRhdGEpLG50cFRpbWVzdGFtcDppLm50cFRpbWVzdGFtcCxwYXlsb2FkVHlwZTpPKGkuZGF0YSksZGF0YTpCdWZmZXIuY29uY2F0KHQpLHR5cGU6OX07cyh2b2lkIDAsYSksdD1bXTtyZXR1cm59cygpfWVsc2Ugcyh2b2lkIDAsaSl9fSk7c3VwZXIobil9fTtjKCk7dmFyIFpuPUMoTigpKTtjKCk7dmFyIFlzPUMobGUoKSksamM9XCJSVFNQLzEuMFwiLEtzPXI9PntpZighci5tZXRob2R8fCFyLnVyaSl0aHJvdyBuZXcgRXJyb3IoXCJtZXNzYWdlIG5lZWRzIHRvIGNvbnRhaW4gYSBtZXRob2QgYW5kIGEgdXJpXCIpO2xldCBlPXIucHJvdG9jb2x8fGpjLHQ9ci5oZWFkZXJzfHx7fSxuPVtgJHtyLm1ldGhvZH0gJHtyLnVyaX0gJHtlfWAsT2JqZWN0LmVudHJpZXModCkubWFwKChbaSxvXSk9PmkrXCI6IFwiK28pLmpvaW4oYFxcclxuYCksYFxcclxuYF0uam9pbihgXFxyXG5gKTtyZXR1cm4oMCxZcy5kZWZhdWx0KShcIm1zbDpydHNwOm91dGdvaW5nXCIpKG4pLEJ1ZmZlci5mcm9tKG4pfTtjKCk7YygpO3ZhciBXYz0ocixlLHQ9MCk9PntsZXQgbj1gXG4ke2V9YDt0PXIuaW5kZXhPZihuLHQpO2xldCBpPTAsbz1bXTtmb3IoO3Q+PTA7KWk9ci5pbmRleE9mKGBcbmAsdCtuLmxlbmd0aCksby5wdXNoKHIudG9TdHJpbmcoXCJhc2NpaVwiLHQrbi5sZW5ndGgsaSkudHJpbSgpKSx0PXIuaW5kZXhPZihuLGkpO3JldHVybiBvfSwkYz1yPT5yLm1hdGNoKC9ebT0vKSxFcj0ocixlKT0+e2xldCB0PWUuaW5kZXhPZihyKTtyZXR1cm4gdDwwP1tlLnNsaWNlKDApXTpbZS5zbGljZSgwLHQpLGUuc2xpY2UodCsxKV19LFhzPXtmbXRwOnI9PntsZXRbZSx0XT1FcihcIiBcIixyKTtzd2l0Y2goZSl7ZGVmYXVsdDpsZXQgbj10P3QudHJpbSgpLnNwbGl0KFwiO1wiKTpbXSxpPXt9O3JldHVybiBuLmZvckVhY2gobz0+e2xldFtzLGFdPUVyKFwiPVwiLG8pLHU9cy50cmltKCkudG9Mb3dlckNhc2UoKTt1IT09XCJcIiYmKGlbdV09YS50cmltKCkpfSkse2Zvcm1hdDplLHBhcmFtZXRlcnM6aX19fSxmcmFtZXJhdGU6TnVtYmVyLHJ0cG1hcDpyPT57bGV0W2UsdF09RXIoXCIgXCIsciksW24saSxvXT10LnRvVXBwZXJDYXNlKCkuc3BsaXQoXCIvXCIpO3JldHVybiBvPT09dm9pZCAwP3twYXlsb2FkVHlwZTpOdW1iZXIoZSksZW5jb2RpbmdOYW1lOm4sY2xvY2tyYXRlOk51bWJlcihpKX06e3BheWxvYWRUeXBlOk51bWJlcihlKSxlbmNvZGluZ05hbWU6bixjbG9ja3JhdGU6TnVtYmVyKGkpLGVuY29kaW5nUGFyYW1ldGVyczpvfX0sdHJhbnNmb3JtOnI9PnIuc3BsaXQoXCI7XCIpLm1hcChlPT5lLnNwbGl0KFwiLFwiKS5tYXAoTnVtYmVyKSksXCJ4LXNlbnNvci10cmFuc2Zvcm1cIjpyPT5yLnNwbGl0KFwiO1wiKS5tYXAoZT0+ZS5zcGxpdChcIixcIikubWFwKE51bWJlcikpLGZyYW1lc2l6ZTpyPT5yLnNwbGl0KFwiIFwiKVsxXS5zcGxpdChcIi1cIikubWFwKE51bWJlcil9LEdjPXI9PntsZXRbZSx0XT1FcihcIjpcIixyKTtyZXR1cm4gdD09PXZvaWQgMD97W2VdOiEwfTpYc1tlXSE9PXZvaWQgMD97W2VdOlhzW2VdKHQpfTp7W2VdOnR9fSxWYz1yPT57bGV0IGU9ci5zbGljZSgwLDEpLHQ9ci5zbGljZSgyKTtzd2l0Y2goZSl7Y2FzZVwidlwiOnJldHVybnt2ZXJzaW9uOnR9O2Nhc2VcIm9cIjpsZXRbbixpLG8scyxhLHVdPXQuc3BsaXQoXCIgXCIpO3JldHVybntvcmlnaW46e2FkZHJUeXBlOmEsbmV0VHlwZTpzLHNlc3Npb25JZDppLHNlc3Npb25WZXJzaW9uOm8sdW5pY2FzdEFkZHJlc3M6dSx1c2VybmFtZTpufX07Y2FzZVwic1wiOnJldHVybntzZXNzaW9uTmFtZTp0fTtjYXNlXCJpXCI6cmV0dXJue3Nlc3Npb25JbmZvcm1hdGlvbjp0fTtjYXNlXCJ1XCI6cmV0dXJue3VyaTp0fTtjYXNlXCJlXCI6cmV0dXJue2VtYWlsOnR9O2Nhc2VcInBcIjpyZXR1cm57cGhvbmU6dH07Y2FzZVwiY1wiOmxldFtmLGwsZF09dC5zcGxpdChcIiBcIik7cmV0dXJue2Nvbm5lY3Rpb25EYXRhOnthZGRyVHlwZTpsLGNvbm5lY3Rpb25BZGRyZXNzOmQsbmV0VHlwZTpmfX07Y2FzZVwiYlwiOmxldFtoLG1dPXQuc3BsaXQoXCI6XCIpO3JldHVybntid3R5cGU6aCxiYW5kd2lkdGg6bX07Y2FzZVwidFwiOmxldFtiLHldPXQuc3BsaXQoXCIgXCIpLm1hcChOdW1iZXIpO3JldHVybnt0aW1lOntzdGFydFRpbWU6YixzdG9wVGltZTp5fX07Y2FzZVwiclwiOmxldFt3LF8sLi4udl09dC5zcGxpdChcIiBcIikubWFwKE51bWJlcik7cmV0dXJue3JlcGVhdFRpbWVzOntyZXBlYXRJbnRlcnZhbDp3LGFjdGl2ZUR1cmF0aW9uOl8sb2Zmc2V0czp2fX07Y2FzZVwielwiOnJldHVybjtjYXNlXCJrXCI6cmV0dXJuO2Nhc2VcImFcIjpyZXR1cm4gR2ModCk7Y2FzZVwibVwiOmxldFtxLEEsaixZXT10LnNwbGl0KFwiIFwiKTtyZXR1cm57dHlwZTpxLHBvcnQ6TnVtYmVyKEEpLHByb3RvY29sOmosZm10Ok51bWJlcihZKX07ZGVmYXVsdDp9fSxKcz1yPT57bGV0IGU9ci5pbmRleE9mKGBcbm09YCk7cmV0dXJuIFdjKHIsXCJhPWNvbnRyb2w6XCIsZSl9LFFuPXI9PntsZXQgZT1yLnRvU3RyaW5nKFwiYXNjaWlcIikuc3BsaXQoYFxuYCkubWFwKG89Pm8udHJpbSgpKSx0PXtzZXNzaW9uOnt9LG1lZGlhOltdfSxuPTAsaT10LnNlc3Npb247Zm9yKGxldCBvIG9mIGUpJGMobykmJih0Lm1lZGlhW25dPXt9LGk9dC5tZWRpYVtuXSwrK24pLGk9T2JqZWN0LmFzc2lnbihpLFZjKG8pKTtyZXR1cm4gdH0sU3I9cj0+KHt0eXBlOjUsZGF0YTpyLHNkcDpRbihyKX0pO2MoKTt2YXIgcmU9KHIsZSk9PntsZXQgdD1gXG4ke2UudG9Mb3dlckNhc2UoKX06IGAsbj1yLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHQpO2lmKG4+PTApe2xldCBpPXIuaW5kZXhPZihgXG5gLG4rdC5sZW5ndGgpO3JldHVybiByLnRvU3RyaW5nKFwiYXNjaWlcIixuK3QubGVuZ3RoLGkpLnRyaW0oKX1yZXR1cm4gbnVsbH0sUnI9cj0+e2xldCBlPXJlKHIsXCJDU2VxXCIpO3JldHVybiBlIT09bnVsbD9OdW1iZXIoZSk6bnVsbH0sVHI9cj0+e2xldCBlPXJlKHIsXCJTZXNzaW9uXCIpO3JldHVybiBlP2Uuc3BsaXQoXCI7XCIpWzBdOm51bGx9LENyPXI9PntsZXQgZT1yZShyLFwiU2Vzc2lvblwiKTtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtsZXQgdD02MCxuPVwidGltZW91dD1cIixpPWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKG4pO2lmKGkhPT0tMSl7bGV0IG89ZS5zdWJzdHJpbmcoaStuLmxlbmd0aCk7bz1vLnNwbGl0KFwiO1wiKVswXTtsZXQgcz1wYXJzZUludChvKTtyZXR1cm4gaXNOYU4ocyk/dDpzfXJldHVybiB0fSxodD1yPT5OdW1iZXIoci50b1N0cmluZyhcImFzY2lpXCIsOSwxMikpLEJyPXI9PnJlKHIsXCJDb250ZW50LUJhc2VcIiksTXI9cj0+cmUocixcIkNvbnRlbnQtTG9jYXRpb25cIiksTHI9cj0+e2xldCBlPXJlKHIsXCJDb25uZWN0aW9uXCIpO3JldHVybiBlIT09bnVsbCYmZS50b0xvd2VyQ2FzZSgpPT09XCJjbG9zZVwifSxJcj1yPT57bGV0IGU9cmUocixcIlJhbmdlXCIpO2lmKGUhPT1udWxsKXJldHVybiBlLnNwbGl0KFwiPVwiKVsxXS5zcGxpdChcIi1cIil9LEFyPXI9PntsZXQgZT1bYFxuXG5gLFwiXFxyXFxyXCIsYFxcclxuXFxyXG5gXS5tYXAodD0+e2xldCBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbiE9PS0xP24rdC5sZW5ndGg6bn0pLmZpbHRlcih0PT50IT09LTEpO3JldHVybiBlLmxlbmd0aD4wP2UucmVkdWNlKCh0LG4pPT5NYXRoLm1pbih0LG4pKTotMX07dmFyIFpzPTQsUXM9MzYsemM9cj0+e2xldCBlPUJ1ZmZlci5hbGxvYyhacyksdD0wLG49MDtmb3IoO248ZS5sZW5ndGg7KXtsZXQgdT1yW3QrK10sZj1NYXRoLm1pbih1Lmxlbmd0aCxlLmxlbmd0aC1uKTt1LmNvcHkoZSxuLDAsZiksbis9Zn1sZXQgaT1lWzFdLG89ZS5sZW5ndGgscz1lLnJlYWRVSW50MTZCRSgyKSxhPW8rcztyZXR1cm57Y2hhbm5lbDppLGJlZ2luOm8sZW5kOmF9fSxGcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2NodW5rcz1bXTt0aGlzLl9sZW5ndGg9MDt0aGlzLl9zdGF0ZT0wO3RoaXMuX2luaXQoKX1faW5pdCgpe3RoaXMuX2NodW5rcz1bXSx0aGlzLl9sZW5ndGg9MCx0aGlzLl9zdGF0ZT0wfV9wdXNoKGUpe3RoaXMuX2NodW5rcy5wdXNoKGUpLHRoaXMuX2xlbmd0aCs9ZS5sZW5ndGh9X3BhcnNlUnRzcCgpe2xldCBlPVtdLHQ9QnVmZmVyLmNvbmNhdCh0aGlzLl9jaHVua3MpLG49QXIodCk7aWYobj09PS0xKXJldHVybiBlO2xldCBpPW4sbz1yZSh0LFwiQ29udGVudC1MZW5ndGhcIik7aWYobyYmcGFyc2VJbnQobyk+dC5sZW5ndGgtaSlyZXR1cm4gZTtpZih0aGlzLl9pbml0KCksaT09PXQubGVuZ3RofHx0W2ldPT09UXMpe2xldCBzPXQuc2xpY2UoMCxpKTtlLnB1c2goe3R5cGU6NCxkYXRhOnN9KTtsZXQgYT10LnNsaWNlKGkpO3RoaXMuX3B1c2goYSl9ZWxzZXtsZXQgcz10LGE9dC5zbGljZShpKTtlLnB1c2goe3R5cGU6NCxkYXRhOnN9KSxlLnB1c2goU3IoYSkpfXJldHVybiBlfV9wYXJzZUludGVybGVhdmVkKCl7bGV0IGU9W107aWYodGhpcy5fbGVuZ3RoPFpzfHwodGhpcy5fcGFja2V0fHwodGhpcy5fcGFja2V0PXpjKHRoaXMuX2NodW5rcykpLHRoaXMuX2xlbmd0aDx0aGlzLl9wYWNrZXQuZW5kKSlyZXR1cm4gZTtsZXQgdD1CdWZmZXIuY29uY2F0KHRoaXMuX2NodW5rcyksbj10LnNsaWNlKHRoaXMuX3BhY2tldC5iZWdpbix0aGlzLl9wYWNrZXQuZW5kKSxpPXQuc2xpY2UodGhpcy5fcGFja2V0LmVuZCksbz10aGlzLl9wYWNrZXQuY2hhbm5lbDtpZihkZWxldGUgdGhpcy5fcGFja2V0LHRoaXMuX2luaXQoKSx0aGlzLl9wdXNoKGkpLG8lMj09PTApZS5wdXNoKHt0eXBlOjIsZGF0YTpuLGNoYW5uZWw6b30pO2Vsc2V7bGV0IHM9bjtkb3tsZXQgYT1zLnJlYWRVSW50MTZCRSgyKSo0KzQ7ZS5wdXNoKHhyKG8scy5zbGljZSgwLGEpKSkscz1zLnNsaWNlKGEpfXdoaWxlKHMubGVuZ3RoPjApfXJldHVybiBlfV9zZXRTdGF0ZSgpe2Zvcig7dGhpcy5fY2h1bmtzLmxlbmd0aD4wJiZ0aGlzLl9jaHVua3NbMF0ubGVuZ3RoPT09MDspdGhpcy5fY2h1bmtzLnNoaWZ0KCk7bGV0IGU9dGhpcy5fY2h1bmtzWzBdO2lmKHRoaXMuX2NodW5rcy5sZW5ndGg9PT0wKXRoaXMuX3N0YXRlPTA7ZWxzZSBpZihlWzBdPT09UXMpdGhpcy5fc3RhdGU9MTtlbHNlIGlmKGUudG9TdHJpbmcoXCJhc2NpaVwiLDAsNCk9PT1cIlJUU1BcIil0aGlzLl9zdGF0ZT0yO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNodW5rIG9mIGxlbmd0aCAke2UubGVuZ3RofWApfXBhcnNlKGUpe3RoaXMuX3B1c2goZSksdGhpcy5fc3RhdGU9PT0wJiZ0aGlzLl9zZXRTdGF0ZSgpO2xldCB0PVtdLG49ITE7Zm9yKDshbjspe2xldCBpPVtdO3N3aXRjaCh0aGlzLl9zdGF0ZSl7Y2FzZSAwOmJyZWFrO2Nhc2UgMTppPXRoaXMuX3BhcnNlSW50ZXJsZWF2ZWQoKTticmVhaztjYXNlIDI6aT10aGlzLl9wYXJzZVJ0c3AoKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcImludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlXCIpfWkubGVuZ3RoPjA/dD10LmNvbmNhdChpKTpuPSEwLHRoaXMuX3NldFN0YXRlKCl9cmV0dXJuIHR9fTt2YXIgbXQ9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCl7bGV0IGU9bmV3IEZyLHQ9bmV3IFpuLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24oaSxvLHMpe2lmKGkudHlwZT09PTEpdHJ5e2UucGFyc2UoaS5kYXRhKS5mb3JFYWNoKGE9PnQucHVzaChhKSkscygpfWNhdGNoKGEpe3MoYSl9ZWxzZSBzKHZvaWQgMCxpKX19KSxuPW5ldyBabi5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKGksbyxzKXtpZihpLnR5cGU9PT00KXtsZXQgYT1LcyhpKTtzKHZvaWQgMCx7dHlwZToxLGRhdGE6YX0pfWVsc2Ugcyh2b2lkIDAsaSl9fSk7c3VwZXIodCxuKX19O2MoKTt2YXIga3I9QyhsZSgpKTtjKCk7dmFyIGd0PShyLGUpPT57bGV0IHQ7aWYoZSE9PXZvaWQgMCl7aWYodHlwZW9mIGUhPVwib2JqZWN0XCIpdGhyb3cgbmV3IEVycm9yKFwibWVyZ2UgZXhwZWN0cyBvdmVycmlkZSB0byBiZSBhbiBvYmplY3QhXCIpO3Q9T2JqZWN0LmtleXMoZSkucmVkdWNlKChuLGkpPT4oZVtpXSE9PXZvaWQgMCYmKG5baV09ZVtpXSksbikse30pfXJldHVybiBPYmplY3QuYXNzaWduKHt9LHIsdCl9O3ZhciBlYT1DKE4oKSk7YygpO3ZhciBZYz1EYXRlLlVUQygxOTAwLDAsMSk7ZnVuY3Rpb24gUHIocixlKXtsZXQgdD0ocitlLzQyOTQ5NjcyOTYpKjFlMztyZXR1cm4gWWMrdH1mdW5jdGlvbiBLYyhyKXtyZXR1cm4vXlteOl0rOlxcL1xcLy8udGVzdChyKX12YXIgT3I9KHM9PihzLk9QVElPTlM9XCJPUFRJT05TXCIscy5ERVNDUklCRT1cIkRFU0NSSUJFXCIscy5TRVRVUD1cIlNFVFVQXCIscy5QTEFZPVwiUExBWVwiLHMuUEFVU0U9XCJQQVVTRVwiLHMuVEVBUkRPV049XCJURUFSRE9XTlwiLHMpKShPcnx8e30pLFhjPTUsSmM9KHI9dHlwZW9mIHdpbmRvdz5cInVcIj9cIlwiOndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSxlPVtdKT0+KHt1cmk6ZS5sZW5ndGg+MD9gcnRzcDovLyR7cn0vYXhpcy1tZWRpYS9tZWRpYS5hbXA/JHtlLmpvaW4oXCImXCIpfWA6YHJ0c3A6Ly8ke3J9L2F4aXMtbWVkaWEvbWVkaWEuYW1wYH0pLEl0PWNsYXNzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuKXtzdXBlcih0KTt0aGlzLm5hbWU9XCJSVFNQUmVzcG9uc2VFcnJvclwiLHRoaXMuY29kZT1ufX0seXQ9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKHQ9e30pe2xldHt1cmk6bixoZWFkZXJzOmksZGVmYXVsdEhlYWRlcnM6b309Z3QoSmModC5ob3N0bmFtZSx0LnBhcmFtZXRlcnMpLHQpLHM9bmV3IGVhLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06KGEsdSxmKT0+e2EudHlwZT09PTQ/KHRoaXMuX29uUnRzcChhKSxmKCkpOmEudHlwZT09PTM/KHRoaXMuX29uUnRjcChhKSx0aGlzLm9uUnRjcCYmdGhpcy5vblJ0Y3AoYS5ydGNwKSxmKHZvaWQgMCxhKSk6YS50eXBlPT09Mj8odGhpcy5fb25SdHAoYSksZih2b2lkIDAsYSkpOihhLnR5cGU9PT01JiYodGhpcy5fb25TZHAoYSksdGhpcy5vblNkcCYmdGhpcy5vblNkcChhLnNkcCkpLGYodm9pZCAwLGEpKX19KTtzLm9uKFwiZW5kXCIsKCk9Pnt0aGlzLl9vdXRnb2luZ0Nsb3NlZD0hMH0pO3N1cGVyKHMpO3RoaXMuX291dGdvaW5nQ2xvc2VkPSExLHRoaXMuX3Jlc2V0KCksdGhpcy51cGRhdGUobixpLG8pLHRoaXMuX3Nlc3Npb25Db250cm9sVVJMPXRoaXMuX2NvbnRyb2xVUkwoKX11cGRhdGUodCxuPXt9LGk9e30pe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3Qgc3VwcGx5IGFuIHVyaSB3aGVuIGNyZWF0aW5nIGEgUnRzcFNlc3Npb25Db21wb25lbnRcIik7dGhpcy51cmk9dCx0aGlzLmRlZmF1bHRIZWFkZXJzPWksdGhpcy5oZWFkZXJzPU9iamVjdC5hc3NpZ24oe1tcIk9QVElPTlNcIl06e30sW1wiUExBWVwiXTp7fSxbXCJTRVRVUFwiXTp7QmxvY2tzaXplOlwiNjQwMDBcIn0sW1wiREVTQ1JJQkVcIl06e0FjY2VwdDpcImFwcGxpY2F0aW9uL3NkcFwifSxbXCJQQVVTRVwiXTp7fX0sbil9X3Jlc2V0KCl7dGhpcy5fc2VxdWVuY2U9MSx0aGlzLnJldHJ5PSgpPT5jb25zb2xlLmVycm9yKFwiTm8gcmVxdWVzdCBzZW50LCBjYW4ndCByZXRyeVwiKSx0aGlzLl9jYWxsU3RhY2s9W10sdGhpcy5fY2FsbEhpc3Rvcnk9W10sdGhpcy5fc3RhdGU9XCJpZGxlXCIsdGhpcy5fd2FpdGluZz0hMSx0aGlzLl9jb250ZW50QmFzZT1udWxsLHRoaXMuX3Nlc3Npb25JZD1udWxsLHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsIT09bnVsbCYmY2xlYXJJbnRlcnZhbCh0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbCksdGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWw9bnVsbCx0aGlzLnQwPXZvaWQgMCx0aGlzLm4wPXZvaWQgMCx0aGlzLmNsb2NrcmF0ZXM9dm9pZCAwfV9jb250cm9sVVJMKHQpe2lmKHQhPT12b2lkIDAmJktjKHQpKXJldHVybiB0O2xldCBuPXRoaXMuX2NvbnRlbnRCYXNlPz90aGlzLl9jb250ZW50TG9jYXRpb24/P3RoaXMudXJpO2lmKG49PW51bGwpdGhyb3cgbmV3IEVycm9yKFwicmVsYXRpdmUgb3IgbWlzc2luZyBjb250cm9sIGF0dHJpYnV0ZSBidXQgbm8gYmFzZSBVUkwgYXZhaWxhYmxlXCIpO3JldHVybiB0PT09dm9pZCAwfHx0PT09XCIqXCI/bjpuZXcgVVJMKHQsbikuaHJlZn1fb25SdHNwKHQpe3RoaXMuX3dhaXRpbmc9ITE7bGV0IG49aHQodC5kYXRhKSxpPUxyKHQuZGF0YSksbz1Scih0LmRhdGEpO2lmKG89PT1udWxsKXRocm93IG5ldyBFcnJvcihcInJ0c3A6IGV4cGVjdGVkIHNlcXVlbmNlIG51bWJlclwiKTtpZih0aGlzLl9jYWxsSGlzdG9yeT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTtsZXQgcz10aGlzLl9jYWxsSGlzdG9yeVtvLTFdO2lmKCgwLGtyLmRlZmF1bHQpKFwibXNsOnJ0c3A6aW5jb21pbmdcIikoYCR7dC5kYXRhfWApLCF0aGlzLl9zZXNzaW9uSWQmJiFpKXt0aGlzLl9zZXNzaW9uSWQ9VHIodC5kYXRhKTtsZXQgYT1Dcih0LmRhdGEpO2EhPT1udWxsJiYodGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWwhPT1udWxsJiZjbGVhckludGVydmFsKHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsKSx0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbD1zZXRJbnRlcnZhbCgoKT0+e3RoaXMuX2VucXVldWUoe21ldGhvZDpcIk9QVElPTlNcIn0pLHRoaXMuX2RlcXVldWUoKX0sTWF0aC5tYXgoWGMsYS01KSoxZTMpKX10aGlzLl9jb250ZW50QmFzZXx8KHRoaXMuX2NvbnRlbnRCYXNlPUJyKHQuZGF0YSkpLHRoaXMuX2NvbnRlbnRMb2NhdGlvbnx8KHRoaXMuX2NvbnRlbnRMb2NhdGlvbj1Ncih0LmRhdGEpKSxuPj00MDAmJnRoaXMub25FcnJvciYmdGhpcy5vbkVycm9yKG5ldyBJdCh0LmRhdGEudG9TdHJpbmcoXCJhc2NpaVwiKSxuKSkscz09PVwiUExBWVwiJiZ0aGlzLm9uUGxheSYmdGhpcy5vblBsYXkoSXIodC5kYXRhKSksaSYmKCgwLGtyLmRlZmF1bHQpKFwibXNsOnJ0c3A6aW5jb21pbmdcIikoYFJUU1AgU2Vzc2lvbiAke3RoaXMuX3Nlc3Npb25JZH0gZW5kZWQgd2l0aCBzdGF0dXNDb2RlOiAke259YCksdGhpcy5fc2Vzc2lvbklkPW51bGwpLHRoaXMuX2RlcXVldWUoKX1fb25SdGNwKHQpe2lmKHRoaXMudDA9PT12b2lkIDB8fHRoaXMubjA9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7aWYoX3IodC5ydGNwKSl7bGV0IG49dC5jaGFubmVsLTE7dGhpcy50MFtuXT10LnJ0Y3AucnRwVGltZXN0YW1wLHRoaXMubjBbbl09UHIodC5ydGNwLm50cE1vc3QsdC5ydGNwLm50cExlYXN0KX19X29uUnRwKHQpe2lmKHRoaXMudDA9PT12b2lkIDB8fHRoaXMubjA9PT12b2lkIDB8fHRoaXMuY2xvY2tyYXRlcz09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTtsZXQgbj10LmNoYW5uZWwsaT10aGlzLnQwW25dLG89dGhpcy5uMFtuXTtpZih0eXBlb2YgaTxcInVcIiYmdHlwZW9mIG88XCJ1XCIpe2xldCBzPXRoaXMuY2xvY2tyYXRlc1tuXSx1PUgodC5kYXRhKS1pfDA7dC5udHBUaW1lc3RhbXA9dS9zKjFlMytvfX1fb25TZHAodCl7dGhpcy5uMD17fSx0aGlzLnQwPXt9LHRoaXMuY2xvY2tyYXRlcz17fSx0aGlzLl9zZXNzaW9uQ29udHJvbFVSTD10aGlzLl9jb250cm9sVVJMKHQuc2RwLnNlc3Npb24uY29udHJvbCksdC5zZHAubWVkaWEuZm9yRWFjaCgobixpKT0+e2lmKG4ucnRwbWFwPT09dm9pZCAwKXJldHVybjtsZXR7Y2xvY2tyYXRlOm99PW4ucnRwbWFwLHM9aSoyLGE9cysxLHU9bi5jb250cm9sPT09dm9pZCAwP3RoaXMuX3Nlc3Npb25Db250cm9sVVJMOnRoaXMuX2NvbnRyb2xVUkwobi5jb250cm9sKTt0aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJTRVRVUFwiLGhlYWRlcnM6e1RyYW5zcG9ydDpcIlJUUC9BVlAvVENQO3VuaWNhc3Q7aW50ZXJsZWF2ZWQ9XCIrcytcIi1cIithfSx1cmk6dX0pLHRoaXMuY2xvY2tyYXRlcyE9PXZvaWQgMCYmKHRoaXMuY2xvY2tyYXRlc1tzXT1vKX0pLHRoaXMuX3N0YXRlPT09XCJwbGF5aW5nXCImJnRoaXMuX2VucXVldWUoe21ldGhvZDpcIlBMQVlcIixoZWFkZXJzOntSYW5nZTpgbnB0PSR7dGhpcy5zdGFydFRpbWV8fDB9LWB9LHVyaTp0aGlzLl9zZXNzaW9uQ29udHJvbFVSTH0pLHRoaXMuX2RlcXVldWUoKX1wbGF5KHQ9MCl7aWYodGhpcy5fc3RhdGU9PT1cImlkbGVcIil0aGlzLnN0YXJ0VGltZT1OdW1iZXIodCl8fDAsdGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiT1BUSU9OU1wifSksdGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiREVTQ1JJQkVcIn0pO2Vsc2UgaWYodGhpcy5fc3RhdGU9PT1cInBhdXNlZFwiKXtpZih0aGlzLl9zZXNzaW9uSWQ9PT1udWxsfHx0aGlzLl9zZXNzaW9uSWQ9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7dGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiUExBWVwiLGhlYWRlcnM6e1Nlc3Npb246dGhpcy5fc2Vzc2lvbklkfSx1cmk6dGhpcy5fc2Vzc2lvbkNvbnRyb2xVUkx9KX10aGlzLl9zdGF0ZT1cInBsYXlpbmdcIix0aGlzLl9kZXF1ZXVlKCl9cGF1c2UoKXt0aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJQQVVTRVwifSksdGhpcy5fc3RhdGU9XCJwYXVzZWRcIix0aGlzLl9kZXF1ZXVlKCl9c3RvcCgpe3RoaXMuX3Nlc3Npb25JZD90aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJURUFSRE9XTlwifSk6dGhpcy5fY2FsbFN0YWNrPVtdLHRoaXMuX3N0YXRlPVwiaWRsZVwiLHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsIT09bnVsbCYmKGNsZWFySW50ZXJ2YWwodGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWwpLHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsPW51bGwpLHRoaXMuX2RlcXVldWUoKX1zZW5kKHQpe2xldHttZXRob2Q6bixoZWFkZXJzOmksdXJpOm99PXQ7aWYobj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIG1ldGhvZCB3aGVuIHNlbmQgcmVxdWVzdFwiKTtpZih0aGlzLl93YWl0aW5nPSEwLHRoaXMucmV0cnk9dGhpcy5zZW5kLmJpbmQodGhpcyx0KSx0aGlzLl9zZXF1ZW5jZT09PXZvaWQgMHx8dGhpcy5oZWFkZXJzPT09dm9pZCAwfHx0aGlzLl9jYWxsSGlzdG9yeT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTtsZXQgcz1PYmplY3QuYXNzaWduKHt0eXBlOjQsdXJpOm98fHRoaXMuX3Nlc3Npb25Db250cm9sVVJMLGRhdGE6QnVmZmVyLmFsbG9jKDApfSx7bWV0aG9kOm4saGVhZGVyczppfSx7aGVhZGVyczpPYmplY3QuYXNzaWduKHtDU2VxOnRoaXMuX3NlcXVlbmNlKyt9LHRoaXMuZGVmYXVsdEhlYWRlcnMsdGhpcy5oZWFkZXJzW25dLGkpfSk7dGhpcy5fc2Vzc2lvbklkJiYocy5oZWFkZXJzLlNlc3Npb249dGhpcy5fc2Vzc2lvbklkKSx0aGlzLl9jYWxsSGlzdG9yeS5wdXNoKG4pLHRoaXMuX291dGdvaW5nQ2xvc2VkPygwLGtyLmRlZmF1bHQpKFwibXNsOnJ0c3A6b3V0Z29pbmdcIikoYFVuYWJsZSB0byBzZW5kICR7bn0sIGNvbm5lY3Rpb24gY2xvc2VkYCk6dGhpcy5vdXRnb2luZy5wdXNoKHMpfV9lbnF1ZXVlKHQpe2lmKHRoaXMuX2NhbGxTdGFjaz09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTt0aGlzLl9jYWxsU3RhY2sucHVzaCh0KX1fZGVxdWV1ZSgpe2lmKHRoaXMuX2NhbGxTdGFjaz09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTtpZighdGhpcy5fd2FpdGluZyYmdGhpcy5fY2FsbFN0YWNrLmxlbmd0aD4wKXtsZXQgdD10aGlzLl9jYWxsU3RhY2suc2hpZnQoKTt0IT09dm9pZCAwJiZ0aGlzLnNlbmQodCl9fX07YygpO3ZhciBVcj1DKGxlKCkpO3ZhciBEcj1DKE4oKSk7YygpO3ZhciBRYz0xMDAwNyxaYz0ocj13aW5kb3cubG9jYXRpb24uaG9zdCxlPXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCk9Pih7dXJpOmAke2U9PT1cImh0dHBzOlwiP1wid3NzOlwiOlwid3M6XCJ9Ly8ke3J9L3J0c3Atb3Zlci13ZWJzb2NrZXRgLHRva2VuVXJpOmAke2V9Ly8ke3J9L2F4aXMtY2dpL3J0c3B3c3Nlc3Npb24uY2dpYCxwcm90b2NvbDpcImJpbmFyeVwiLHRpbWVvdXQ6UWN9KSx0YT1hc3luYyhyPXt9KT0+e2xldHt1cmk6ZSx0b2tlblVyaTp0LHByb3RvY29sOm4sdGltZW91dDppfT1ndChaYyhyLmhvc3Qsci5zY2hlbWUpLHIpO2lmKGU9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwid3M6IGludGVybmFsIGVycm9yXCIpO3JldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgobyxzKT0+e3RyeXtsZXQgYT1uZXcgV2ViU29ja2V0KGUsbiksdT1zZXRUaW1lb3V0KCgpPT57Y2xlYXJUaW1lb3V0KHUpLGEucmVhZHlTdGF0ZT09PVdlYlNvY2tldC5DT05ORUNUSU5HJiYoYS5vbmVycm9yPW51bGwscyhuZXcgRXJyb3IoXCJ3ZWJzb2NrZXQgY29ubmVjdGlvbiB0aW1lZCBvdXRcIikpKX0saSk7YS5iaW5hcnlUeXBlPVwiYXJyYXlidWZmZXJcIixhLm9uZXJyb3I9Zj0+e2NsZWFyVGltZW91dCh1KTtmdW5jdGlvbiBsKCl7aWYodGhpcy5zdGF0dXM+PTQwMCl7Y29uc29sZS53YXJuKFwiZmFpbGVkIHRvIGxvYWQgdG9rZW5cIix0aGlzLnN0YXR1cyx0aGlzLnJlc3BvbnNlVGV4dCkscyhmKTtyZXR1cm59bGV0IGg9dGhpcy5yZXNwb25zZVRleHQudHJpbSgpLG09YCR7ZX0/cnRzcHdzc2Vzc2lvbj0ke2h9YCxiPW5ldyBXZWJTb2NrZXQobSxuKTtiLmJpbmFyeVR5cGU9XCJhcnJheWJ1ZmZlclwiLGIub25lcnJvcj15PT57cyh5KX0sYi5vbm9wZW49KCk9Pm8oYil9bGV0IGQ9bmV3IFhNTEh0dHBSZXF1ZXN0O2QuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIixsKSxkLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLGg9Pntjb25zb2xlLndhcm4oXCJmYWlsZWQgdG8gZ2V0IHRva2VuXCIpLHMoaCl9KSxkLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCgpPT5zKGYpKSxkLm9wZW4oXCJHRVRcIixgJHt0fT8ke0RhdGUubm93KCl9YCk7dHJ5e2Quc2VuZCgpfWNhdGNoe3MoZil9fSxhLm9ub3Blbj0oKT0+e2NsZWFyVGltZW91dCh1KSxvKGEpfX1jYXRjaChhKXtzKGEpfX0pfTt2YXIgZWw9MTAwMSxHPWNsYXNzIGV4dGVuZHMgVntjb25zdHJ1Y3Rvcih0KXtpZih0PT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInNvY2tldCBhcmd1bWVudCBtaXNzaW5nXCIpO2xldCBuPW5ldyBEci5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkOmZ1bmN0aW9uKCl7fX0pO3Qub25tZXNzYWdlPW89PntsZXQgcz1CdWZmZXIuZnJvbShvLmRhdGEpO24ucHVzaCh7ZGF0YTpzLHR5cGU6MX0pfHx0LnJlYWR5U3RhdGU9PT1XZWJTb2NrZXQuT1BFTiYmKCgwLFVyLmRlZmF1bHQpKFwibXNsOndlYnNvY2tldDppbmNvbWluZ1wiKShcImRvd25zdHJlYW0gZnJvemVuXCIpLHQuY2xvc2UoKSl9LG4ub24oXCJlcnJvclwiLG89Pntjb25zb2xlLndhcm4oXCJjbG9zaW5nIHNvY2tldCBkdWUgdG8gaW5jb21pbmcgZXJyb3JcIixvKSx0LmNsb3NlKCl9KTtsZXQgaT1uZXcgRHIuV3JpdGFibGUoe29iamVjdE1vZGU6ITAsd3JpdGU6ZnVuY3Rpb24obyxzLGEpe3RyeXt0LnNlbmQoby5kYXRhKX1jYXRjaHtjb25zb2xlLndhcm4oXCJtZXNzYWdlIGxvc3QgZHVyaW5nIHNlbmQ6XCIsbyl9YSgpfX0pO2kub24oXCJlcnJvclwiLG89Pntjb25zb2xlLndhcm4oXCJlcnJvciBkdXJpbmcgd2Vic29ja2V0IHNlbmQsIGlnbm9yaW5nOlwiLG8pfSksaS5vbihcImZpbmlzaFwiLCgpPT57KDAsVXIuZGVmYXVsdCkoXCJtc2w6d2Vic29ja2V0Om91dGdvaW5nXCIpKFwiZmluaXNoXCIpLHQucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5DTE9TRUQmJnQuY2xvc2UoKX0pLHQub25jbG9zZT1vPT57KDAsVXIuZGVmYXVsdCkoXCJtc2w6d2Vic29ja2V0OmNsb3NlXCIpKGAke28uY29kZX1gKSxvLmNvZGU9PT1lbCYmdGhpcy5vblNlcnZlckNsb3NlJiZ0aGlzLm9uU2VydmVyQ2xvc2UoKSxuLnB1c2gobnVsbCksaS5lbmQoKX07c3VwZXIobixpKX1zdGF0aWMgYXN5bmMgb3Blbih0KXtyZXR1cm4gYXdhaXQgdGEodCkudGhlbihuPT5uZXcgRyhuKSl9fTt2YXIgbmk9e307UHQobmkse0h0bWw1Q2FudmFzUGlwZWxpbmU6KCk9PkhyLEh0bWw1VmlkZW9NZXRhZGF0YVBpcGVsaW5lOigpPT5xcixIdG1sNVZpZGVvUGlwZWxpbmU6KCk9Pl90LEh0dHBNc2VQaXBlbGluZTooKT0+R3IsTWV0YWRhdGFQaXBlbGluZTooKT0+anIsUGlwZWxpbmU6KCk9PkJlLFJ0c3BNanBlZ1BpcGVsaW5lOigpPT54dCxSdHNwTXA0UGlwZWxpbmU6KCk9PmJ0LFJ0c3BQaXBlbGluZTooKT0+ZWUsV3NTZHBQaXBlbGluZTooKT0+V3J9KTtjKCk7YygpO3ZhciBCZT1jbGFzc3tjb25zdHJ1Y3RvciguLi5lKXtsZXRbdCwuLi5uXT1lO3RoaXMuX3NldD1uZXcgU2V0KGUpLHRoaXMuZmlyc3RDb21wb25lbnQ9dCx0aGlzLmxhc3RDb21wb25lbnQ9bi5yZWR1Y2UoKGksbyk9PmkuY29ubmVjdChvKSx0KX1pbml0KC4uLmUpe2xldFt0LC4uLm5dPWU7dGhpcy5fc2V0PW5ldyBTZXQoZSksdGhpcy5maXJzdENvbXBvbmVudD10LHRoaXMubGFzdENvbXBvbmVudD1uLnJlZHVjZSgoaSxvKT0+aS5jb25uZWN0KG8pLHQpfWluc2VydEFmdGVyKGUsdCl7aWYoIXRoaXMuX3NldC5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKFwiaW5zZXJ0aW9uIHBvaW50IG5vdCBwYXJ0IG9mIHBpcGVsaW5lXCIpO2lmKHRoaXMuX3NldC5oYXModCkpdGhyb3cgbmV3IEVycm9yKFwibmV3IGNvbXBvbmVudCBhbHJlYWR5IGluIHRoZSBwaXBlbGluZVwiKTtsZXQgbj1lLm5leHQ7cmV0dXJuIG49PT1udWxsPyhlLmNvbm5lY3QodCksdGhpcy5sYXN0Q29tcG9uZW50PXQpOihlLmRpc2Nvbm5lY3QoKSxlLmNvbm5lY3QodCkuY29ubmVjdChuKSksdGhpcy5fc2V0LmFkZCh0KSx0aGlzfWluc2VydEJlZm9yZShlLHQpe2lmKCF0aGlzLl9zZXQuaGFzKGUpKXRocm93IG5ldyBFcnJvcihcImluc2VydGlvbiBwb2ludCBub3QgcGFydCBvZiBwaXBlbGluZVwiKTtpZih0aGlzLl9zZXQuaGFzKHQpKXRocm93IG5ldyBFcnJvcihcIm5ldyBjb21wb25lbnQgYWxyZWFkeSBpbiB0aGUgcGlwZWxpbmVcIik7bGV0IG49ZS5wcmV2O3JldHVybiBuPT09bnVsbD8odC5jb25uZWN0KGUpLHRoaXMuZmlyc3RDb21wb25lbnQ9dCk6KG4uZGlzY29ubmVjdCgpLG4uY29ubmVjdCh0KS5jb25uZWN0KGUpKSx0aGlzLl9zZXQuYWRkKHQpLHRoaXN9cmVtb3ZlKGUpe2lmKCF0aGlzLl9zZXQuaGFzKGUpKXRocm93IG5ldyBFcnJvcihcImNvbXBvbmVudCBub3QgcGFydCBvZiBwaXBlbGluZVwiKTtsZXQgdD1lLnByZXYsbj1lLm5leHQ7aWYodD09PW51bGwmJm49PT1udWxsKXRocm93IG5ldyBFcnJvcihcImNhbm5vdCByZW1vdmUgbGFzdCBjb21wb25lbnRcIik7cmV0dXJuIHQ9PT1udWxsJiZuIT09bnVsbD8oZS5kaXNjb25uZWN0KCksdGhpcy5maXJzdENvbXBvbmVudD1uKTp0IT09bnVsbCYmbj09PW51bGw/KHQuZGlzY29ubmVjdCgpLHRoaXMubGFzdENvbXBvbmVudD10KTp0IT09bnVsbCYmbiE9PW51bGwmJih0LmRpc2Nvbm5lY3QoKSxlLmRpc2Nvbm5lY3QoKSx0LmNvbm5lY3QobikpLHRoaXMuX3NldC5kZWxldGUoZSksdGhpc31hcHBlbmQoLi4uZSl7cmV0dXJuIGUuZm9yRWFjaCh0PT57dGhpcy5pbnNlcnRBZnRlcih0aGlzLmxhc3RDb21wb25lbnQsdCl9KSx0aGlzfXByZXBlbmQoLi4uZSl7cmV0dXJuIGUuZm9yRWFjaCh0PT57dGhpcy5pbnNlcnRCZWZvcmUodGhpcy5maXJzdENvbXBvbmVudCx0KX0pLHRoaXN9fTtjKCk7dmFyIGVlPWNsYXNzIGV4dGVuZHMgQmV7Y29uc3RydWN0b3IodCl7bGV0IG49bmV3IG10LGk9bmV3IHl0KHQpO2kub25TZHA9bz0+e3RoaXMub25TZHAmJnRoaXMub25TZHAobyl9LGkub25QbGF5PW89Pnt0aGlzLm9uUGxheSYmdGhpcy5vblBsYXkobyl9O3N1cGVyKG4saSk7dGhpcy5ydHNwPWl9fTtjKCk7dmFyIGJ0PWNsYXNzIGV4dGVuZHMgZWV7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7bGV0IG49bmV3IGN0LGk9bmV3IG90LG89bmV3IHB0O28ub25TeW5jPXM9Pnt0aGlzLm9uU3luYyYmdGhpcy5vblN5bmMocyl9LHRoaXMuYXBwZW5kKG4saSxvKSx0aGlzLl9tcDRNdXhlcj1vfWdldCBiaXRyYXRlKCl7cmV0dXJuIHRoaXMuX21wNE11eGVyLmJpdHJhdGV9Z2V0IGZyYW1lcmF0ZSgpe3JldHVybiB0aGlzLl9tcDRNdXhlci5mcmFtZXJhdGV9fTtjKCk7dmFyIHh0PWNsYXNzIGV4dGVuZHMgZWV7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7bGV0IHQ9bmV3IGx0O3RoaXMuYXBwZW5kKHQpfX07YygpO2MoKTtjKCk7dmFyIE1lPUMobmEoKSksTnI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMubmM9KCk9PigrK3RoaXMuY291bnQsdGhpcy5jb3VudC50b1N0cmluZygxNikucGFkU3RhcnQoOCxcIjBcIikpO3RoaXMuY25vbmNlPSgpPT5uZXcgQXJyYXkoNCkuZmlsbCgwKS5tYXAoKCk9Pk1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoyNTYpKS5tYXAoZT0+ZS50b1N0cmluZygxNikpLmpvaW4oXCJcIik7dGhpcy5oYTE9ZT0+e2xldCB0PXRoaXMuaGExQmFzZTtyZXR1cm4gdGhpcy5hbGdvcml0aG09PT1cIm1kNS1zZXNzXCImJih0PW5ldyBNZS5NZDUoKS5hcHBlbmRTdHIoYCR7dH06JHt0aGlzLm5vbmNlfToke2V9YCkuZW5kKCkudG9TdHJpbmcoKSksdH07dGhpcy5oYTI9KGUsdCxuPVwiXCIpPT57bGV0IGk9bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihgJHtlfToke3R9YCkuZW5kKCkudG9TdHJpbmcoKTtpZih0aGlzLmFsZ29yaXRobT09PVwibWQ1LXNlc3NcIil7bGV0IG89bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihuKS5lbmQoKS50b1N0cmluZygpO2k9bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihgJHtlfToke3R9OiR7b31gKS5lbmQoKS50b1N0cmluZygpfXJldHVybiBpfTt0aGlzLmF1dGhvcml6YXRpb249KGU9XCJHRVRcIix0PVwiXCIsbik9PntsZXQgaT10aGlzLm5jKCksbz10aGlzLmNub25jZSgpLHM9dGhpcy5oYTEobyksYT10aGlzLmhhMihlLHQsbiksdT10aGlzLnFvcD09PXZvaWQgMD9uZXcgTWUuTWQ1KCkuYXBwZW5kU3RyKGAke3N9OiR7dGhpcy5ub25jZX06JHthfWApLmVuZCgpLnRvU3RyaW5nKCk6bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihgJHtzfToke3RoaXMubm9uY2V9OiR7aX06JHtvfToke3RoaXMucW9wfToke2F9YCkuZW5kKCkudG9TdHJpbmcoKSxmPVtdO3JldHVybiBmLnB1c2goYHVzZXJuYW1lPVwiJHt0aGlzLnVzZXJuYW1lfVwiYCksZi5wdXNoKGByZWFsbT1cIiR7dGhpcy5yZWFsbX1cImApLGYucHVzaChgbm9uY2U9XCIke3RoaXMubm9uY2V9XCJgKSxmLnB1c2goYHVyaT1cIiR7dH1cImApLHRoaXMucW9wIT09dm9pZCAwJiYoZi5wdXNoKGBxb3A9JHt0aGlzLnFvcH1gKSxmLnB1c2goYG5jPSR7aX1gKSxmLnB1c2goYGNub25jZT1cIiR7b31cImApKSxmLnB1c2goYHJlc3BvbnNlPVwiJHt1fVwiYCksdGhpcy5vcGFxdWUhPT12b2lkIDAmJmYucHVzaChgb3BhcXVlPVwiJHt0aGlzLm9wYXF1ZX1cImApLGBEaWdlc3QgJHtmLmpvaW4oXCIsIFwiKX1gfTtsZXQgaT1lLmdldChcInJlYWxtXCIpO2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwibm8gcmVhbG0gaW4gZGlnZXN0IGNoYWxsZW5nZVwiKTt0aGlzLnJlYWxtPWksdGhpcy5oYTFCYXNlPW5ldyBNZS5NZDUoKS5hcHBlbmRTdHIoYCR7dH06JHtpfToke259YCkuZW5kKCkudG9TdHJpbmcoKTtsZXQgbz1lLmdldChcIm5vbmNlXCIpO2lmKG89PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwibm8gbm9uY2UgaW4gZGlnZXN0IGNoYWxsZW5nZVwiKTt0aGlzLm5vbmNlPW8sdGhpcy5vcGFxdWU9ZS5nZXQoXCJvcGFxdWVcIik7bGV0IHM9ZS5nZXQoXCJhbGdvcml0aG1cIik7cyE9PXZvaWQgMD9zPT09XCJtZDVcIj90aGlzLmFsZ29yaXRobT1cIm1kNVwiOnM9PT1cIm1kNS1zZXNzXCImJih0aGlzLmFsZ29yaXRobT1cIm1kNS1zZXNzXCIpOnRoaXMuYWxnb3JpdGhtPVwibWQ1XCI7bGV0IGE9ZS5nZXQoXCJxb3BcIik7aWYoYSE9PXZvaWQgMCl7bGV0IHU9YS5zcGxpdChcIixcIikubWFwKGY9PmYudHJpbSgpKTt1LnNvbWUoZj0+Zj09PVwiYXV0aFwiKT90aGlzLnFvcD1cImF1dGhcIjp1LnNvbWUoZj0+Zj09PVwiYXV0aC1pbnRcIikmJih0aGlzLnFvcD1cImF1dGgtaW50XCIpfXRoaXMuY291bnQ9MCx0aGlzLnVzZXJuYW1lPXR9fTtjKCk7dmFyIGlhPXI9PntsZXRbLGUsLi4udF09ci5zcGxpdChcIiBcIiksbj1bXSxpPS9cXHMqKFtePV0rKT1cIihbXlwiXSopXCIsPy9nbSxvO2RvIGlmKG89aS5leGVjKHQuam9pbihcIiBcIikpLG8hPT1udWxsKXtsZXRbLGEsdV09bztuLnB1c2goW2EsdV0pfXdoaWxlKG8hPT1udWxsKTtsZXQgcz1uZXcgTWFwKG4pO3JldHVybnt0eXBlOmUudG9Mb3dlckNhc2UoKSxwYXJhbXM6c319O3ZhciB0bD00MDEscmw9e3VzZXJuYW1lOlwicm9vdFwiLHBhc3N3b3JkOlwicGFzc1wifSxMZT1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoZT17fSl7bGV0e3VzZXJuYW1lOnQscGFzc3dvcmQ6bn09Z3QocmwsZSk7aWYodD09PXZvaWQgMHx8bj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJuZWVkIHVzZXJuYW1lIGFuZCBwYXNzd29yZFwiKTtsZXQgaSxvLHM9eWUoZnVuY3Rpb24odSxmLGwpe3UudHlwZT09PTQmJihpPXUsbyYmdS5oZWFkZXJzJiYodS5oZWFkZXJzLkF1dGhvcml6YXRpb249bykpLGwodm9pZCAwLHUpfSksYT15ZShmdW5jdGlvbih1LGYsbCl7aWYodS50eXBlPT09NCYmaHQodS5kYXRhKT09PXRsKXtsZXQgaD11LmRhdGEudG9TdHJpbmcoKS5zcGxpdChgXG5gKS5maW5kKGI9Pi9XV1ctQXV0aC9pLnRlc3QoYikpO2lmKGg9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IGZpbmQgV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXJcIik7bGV0IG09aWEoaCk7aWYobS50eXBlPT09XCJiYXNpY1wiKW89XCJCYXNpYyBcIitCdWZmZXIuZnJvbSh0K1wiOlwiK24pLnRvU3RyaW5nKFwiYmFzZTY0XCIpO2Vsc2UgaWYobS50eXBlPT09XCJkaWdlc3RcIilvPW5ldyBOcihtLnBhcmFtcyx0LG4pLmF1dGhvcml6YXRpb24oaS5tZXRob2QsaS51cmkpO2Vsc2UgcmV0dXJuO3Mud3JpdGUoaSwoKT0+bCgpKX1lbHNlIGwodm9pZCAwLHUpfSk7c3VwZXIoYSxzKX19O3ZhciBIcj1jbGFzcyBleHRlbmRzIHh0e2NvbnN0cnVjdG9yKHQpe2xldHt3czpuLHJ0c3A6aSxtZWRpYUVsZW1lbnQ6byxhdXRoOnN9PXQ7c3VwZXIoaSk7aWYocyl7bGV0IGY9bmV3IExlKHMpO3RoaXMuaW5zZXJ0QmVmb3JlKHRoaXMucnRzcCxmKX1sZXQgYT1uZXcgc3Qobyk7YS5vbkNhbnBsYXk9KCk9PnthLnBsYXkoKSx0aGlzLm9uQ2FucGxheSYmdGhpcy5vbkNhbnBsYXkoKX0sYS5vblN5bmM9Zj0+e3RoaXMub25TeW5jJiZ0aGlzLm9uU3luYyhmKX0sdGhpcy5hcHBlbmQoYSksdGhpcy5fc2luaz1hO2xldCB1PUcub3BlbihuKTt0aGlzLnJlYWR5PXUudGhlbihmPT57Zi5vblNlcnZlckNsb3NlPSgpPT57dGhpcy5vblNlcnZlckNsb3NlJiZ0aGlzLm9uU2VydmVyQ2xvc2UoKX0sdGhpcy5wcmVwZW5kKGYpLHRoaXMuX3NyYz1mfSl9Y2xvc2UoKXt0aGlzLl9zcmMmJnRoaXMuX3NyYy5vdXRnb2luZy5lbmQoKX1nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5fc2luay5jdXJyZW50VGltZX1wbGF5KCl7cmV0dXJuIHRoaXMuX3NpbmsucGxheSgpfXBhdXNlKCl7cmV0dXJuIHRoaXMuX3NpbmsucGF1c2UoKX1nZXQgYml0cmF0ZSgpe3JldHVybiB0aGlzLl9zaW5rLmJpdHJhdGV9Z2V0IGZyYW1lcmF0ZSgpe3JldHVybiB0aGlzLl9zaW5rLmZyYW1lcmF0ZX19O2MoKTt2YXIgX3Q9Y2xhc3MgZXh0ZW5kcyBidHtjb25zdHJ1Y3Rvcih0KXtsZXR7d3M6bixydHNwOmksbWVkaWFFbGVtZW50Om8sYXV0aDpzfT10O3N1cGVyKGkpO2lmKHMpe2xldCBmPW5ldyBMZShzKTt0aGlzLmluc2VydEJlZm9yZSh0aGlzLnJ0c3AsZil9bGV0IGE9bmV3IFRlKG8pO2Eub25Tb3VyY2VPcGVuPShmLGwpPT57dGhpcy50cmFja3M9bCx0aGlzLm9uU291cmNlT3BlbiYmdGhpcy5vblNvdXJjZU9wZW4oZixsKX0sdGhpcy5hcHBlbmQoYSksdGhpcy5fc2luaz1hO2xldCB1PUcub3BlbihuKTt0aGlzLnJlYWR5PXUudGhlbihmPT57Zi5vblNlcnZlckNsb3NlPSgpPT57dGhpcy5vblNlcnZlckNsb3NlJiZ0aGlzLm9uU2VydmVyQ2xvc2UoKX0sdGhpcy5wcmVwZW5kKGYpLHRoaXMuX3NyYz1mfSl9Y2xvc2UoKXt0aGlzLl9zcmMmJnRoaXMuX3NyYy5vdXRnb2luZy5lbmQoKX1nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5fc2luay5jdXJyZW50VGltZX1hc3luYyBwbGF5KCl7cmV0dXJuIGF3YWl0IHRoaXMuX3NpbmsucGxheSgpfXBhdXNlKCl7cmV0dXJuIHRoaXMuX3NpbmsucGF1c2UoKX19O2MoKTt2YXIgcXI9Y2xhc3MgZXh0ZW5kcyBfdHtjb25zdHJ1Y3RvcihlKXtsZXR7bWV0YWRhdGFIYW5kbGVyOnR9PWU7c3VwZXIoZSk7bGV0IG49bmV3IENlO3RoaXMuaW5zZXJ0QWZ0ZXIodGhpcy5ydHNwLG4pO2xldCBpPVIuZnJvbUhhbmRsZXJzKG89PntvLnR5cGU9PT05JiZ0KG8pfSx2b2lkIDApO3RoaXMuaW5zZXJ0QWZ0ZXIobixpKX19O2MoKTt2YXIgbmw9e3BhcmFtZXRlcnM6W1wiYXVkaW89MFwiLFwidmlkZW89MFwiLFwiZXZlbnQ9b25cIixcInB0ej1hbGxcIl19LGpyPWNsYXNzIGV4dGVuZHMgZWV7Y29uc3RydWN0b3IodCl7bGV0e3dzOm4scnRzcDppLG1ldGFkYXRhSGFuZGxlcjpvfT10O3N1cGVyKE9iamVjdC5hc3NpZ24oe30sbmwsaSkpO2xldCBzPW5ldyBDZTt0aGlzLmFwcGVuZChzKTtsZXQgYT1RLmZyb21IYW5kbGVyKGY9PntmLnR5cGU9PT05JiZvKGYpfSk7dGhpcy5hcHBlbmQoYSk7bGV0IHU9Ry5vcGVuKG4pO3RoaXMucmVhZHk9dS50aGVuKGY9PntmLm9uU2VydmVyQ2xvc2U9KCk9Pnt0aGlzLm9uU2VydmVyQ2xvc2UmJnRoaXMub25TZXJ2ZXJDbG9zZSgpfSx0aGlzLnByZXBlbmQoZiksdGhpcy5fc3JjPWZ9KX1jbG9zZSgpe3RoaXMuX3NyYyYmdGhpcy5fc3JjLm91dGdvaW5nLmVuZCgpfX07YygpO3ZhciBXcj1jbGFzcyBleHRlbmRzIGVle2NvbnN0cnVjdG9yKHQpe2xldHt3czpuLHJ0c3A6aSxhdXRoOm99PXQ7c3VwZXIoaSk7aWYobyl7bGV0IGE9bmV3IExlKG8pO3RoaXMuaW5zZXJ0QmVmb3JlKHRoaXMucnRzcCxhKX1sZXQgcz1HLm9wZW4obik7dGhpcy5yZWFkeT1zLnRoZW4oYT0+e2Eub25TZXJ2ZXJDbG9zZT0oKT0+e3RoaXMub25TZXJ2ZXJDbG9zZSYmdGhpcy5vblNlcnZlckNsb3NlKCl9LHRoaXMucHJlcGVuZChhKSx0aGlzLl9zcmM9YX0pfWNsb3NlKCl7dGhpcy5fc3JjJiZ0aGlzLl9zcmMub3V0Z29pbmcuZW5kKCl9Z2V0IHNkcCgpe3JldHVybiB0aGlzLnJlYWR5LnRoZW4oYXN5bmMoKT0+e2xldCB0PW5ldyBQcm9taXNlKG49Pnt0aGlzLnJ0c3Aub25TZHA9bn0pO3JldHVybiB0aGlzLnJ0c3Auc2VuZCh7bWV0aG9kOlwiREVTQ1JJQkVcIn0pLHRoaXMucnRzcC5zZW5kKHttZXRob2Q6XCJURUFSRE9XTlwifSksYXdhaXQgdH0pfX07YygpO2MoKTt2YXIgb2E9QyhsZSgpKTt2YXIgc2E9QyhOKCkpO3ZhciByaT0oMCxvYS5kZWZhdWx0KShcIm1zbDpodHRwLW1wNFwiKSwkcj1jbGFzcyBleHRlbmRzIFZ7Y29uc3RydWN0b3IodCl7bGV0e3VyaTpuLG9wdGlvbnM6aX09dCxvPW5ldyBzYS5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkOmZ1bmN0aW9uKCl7fX0pO28ub24oXCJlcnJvclwiLHM9Pntjb25zb2xlLndhcm4oXCJjbG9zaW5nIHNvY2tldCBkdWUgdG8gaW5jb21pbmcgZXJyb3JcIixzKSx0aGlzLl9yZWFkZXImJnRoaXMuX3JlYWRlci5jYW5jZWwoKX0pO3N1cGVyKG8pO28uX3JlYWQ9KCk9Pnt0aGlzLl9wdWxsKCl9LHRoaXMudXJpPW4sdGhpcy5vcHRpb25zPWksdGhpcy5fYWxsRG9uZT0hMX1wbGF5KCl7aWYodGhpcy51cmk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IHN0YXJ0IHBsYXlpbmcgd2hlbiB0aGVyZSBpcyBubyBVUklcIik7dGhpcy5fYWJvcnRDb250cm9sbGVyPW5ldyBBYm9ydENvbnRyb2xsZXIsdGhpcy5sZW5ndGg9MCxmZXRjaCh0aGlzLnVyaSx7Y3JlZGVudGlhbHM6XCJpbmNsdWRlXCIsc2lnbmFsOnRoaXMuX2Fib3J0Q29udHJvbGxlci5zaWduYWwsLi4udGhpcy5vcHRpb25zfSkudGhlbih0PT57aWYodC5ib2R5PT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoXCJlbXB0eSByZXNwb25zZSBib2R5XCIpO2xldCBuPXQuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIik7dGhpcy5pbmNvbWluZy5wdXNoKHtkYXRhOkJ1ZmZlci5hbGxvYygwKSx0eXBlOjgsbWltZTpufSksdGhpcy5vbkhlYWRlcnMmJnRoaXMub25IZWFkZXJzKHQuaGVhZGVycyksdGhpcy5fcmVhZGVyPXQuYm9keS5nZXRSZWFkZXIoKSx0aGlzLl9wdWxsKCl9KS5jYXRjaCh0PT57Y29uc29sZS5lcnJvcihcImh0dHAtc291cmNlOiBmZXRjaCBmYWlsZWQ6IFwiLHQpfSl9YWJvcnQoKXt0aGlzLl9yZWFkZXImJnRoaXMuX3JlYWRlci5jYW5jZWwoKS5jYXRjaCh0PT57Y29uc29sZS5sb2coXCJodHRwLXNvdXJjZTogY2FuY2VsIHJlYWRlciBmYWlsZWQ6IFwiLHQpfSksdGhpcy5fYWJvcnRDb250cm9sbGVyJiZ0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKX1faXNDbG9zZWQoKXtyZXR1cm4gdGhpcy5fYWxsRG9uZX1fY2xvc2UoKXt0aGlzLl9yZWFkZXI9dm9pZCAwLHRoaXMuX2FsbERvbmU9ITAsdGhpcy5pbmNvbWluZy5wdXNoKG51bGwpLHRoaXMub25TZXJ2ZXJDbG9zZT8uKCl9X3B1bGwoKXt0aGlzLl9yZWFkZXIhPT12b2lkIDAmJnRoaXMuX3JlYWRlci5yZWFkKCkudGhlbigoe2RvbmU6dCx2YWx1ZTpufSk9PntpZih0KXt0aGlzLl9pc0Nsb3NlZCgpfHwocmkoXCJmZXRjaCBjb21wbGV0ZWQsIHRvdGFsIGRvd25sb2FkZWQ6IFwiLHRoaXMubGVuZ3RoLFwiIGJ5dGVzXCIpLHRoaXMuX2Nsb3NlKCkpO3JldHVybn1pZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIHZhbHVlIHRvIGJlIGRlZmluZWRcIik7aWYodGhpcy5sZW5ndGg9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiZXhwZWN0ZWQgbGVuZ3RoIHRvIGJlIGRlZmluZWRcIik7dGhpcy5sZW5ndGgrPW4ubGVuZ3RoO2xldCBpPUJ1ZmZlci5mcm9tKG4pO3RoaXMuaW5jb21pbmcucHVzaCh7ZGF0YTppLHR5cGU6OH0pP3RoaXMuX3B1bGwoKTpyaShcImRvd25zdHJlYW0gYmFjayBwcmVzc3VyZTogcGF1c2luZyByZWFkXCIpfSkuY2F0Y2godD0+e3JpKFwiaHR0cC1zb3VyY2U6IHJlYWQgZmFpbGVkOiBcIix0KSx0aGlzLl9pc0Nsb3NlZCgpfHx0aGlzLl9jbG9zZSgpfSl9fTt2YXIgR3I9Y2xhc3MgZXh0ZW5kcyBCZXtjb25zdHJ1Y3Rvcih0KXtsZXR7aHR0cDpuLG1lZGlhRWxlbWVudDppfT10LG89bmV3ICRyKG4pLHM9bmV3IFRlKGkpO28ub25IZWFkZXJzPWE9Pnt0aGlzLm9uSGVhZGVycyYmdGhpcy5vbkhlYWRlcnMoYSl9LG8ub25TZXJ2ZXJDbG9zZT0oKT0+dGhpcy5vblNlcnZlckNsb3NlPy4oKTtzdXBlcihvLHMpO3RoaXMuX3NyYz1vLHRoaXMuX3Npbms9cyx0aGlzLmh0dHA9b31jbG9zZSgpe3RoaXMuX3NyYyYmdGhpcy5fc3JjLmFib3J0KCl9Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX3NpbmsuY3VycmVudFRpbWV9YXN5bmMgcGxheSgpe3JldHVybiBhd2FpdCB0aGlzLl9zaW5rLnBsYXkoKX1wYXVzZSgpe3JldHVybiB0aGlzLl9zaW5rLnBhdXNlKCl9fTt2YXIgaWk9e307UHQoaWkse1JUQ1BQYWNrZXRUeXBlOigpPT5LbixTREVTSXRlbTooKT0+Sm4sU1I6KCk9PkhzLFNjaGVkdWxlcjooKT0+V2UsYWRkUlRTUFJldHJ5OigpPT5hYSxib2R5T2Zmc2V0OigpPT5BcixjU3JjOigpPT5ucyxjU3JjQ291bnQ6KCk9PlNlLGNvbm5lY3Rpb25FbmRlZDooKT0+THIsY29udGVudEJhc2U6KCk9PkJyLGNvbnRlbnRMb2NhdGlvbjooKT0+TXIsZXh0SGVhZGVyOigpPT5pcyxleHRIZWFkZXJMZW5ndGg6KCk9Pk10LGV4dGVuc2lvbjooKT0+b3IsZXh0cmFjdEhlYWRlclZhbHVlOigpPT5yZSxleHRyYWN0VVJJczooKT0+SnMsZ2V0VGltZTooKT0+UHIsaXNSdGNwQXBwOigpPT4kcyxpc1J0Y3BCeWU6KCk9PndyLGlzUnRjcFJSOigpPT5qcyxpc1J0Y3BTREVTOigpPT5Xcyxpc1J0Y3BTUjooKT0+X3IsbWFya2VyOigpPT5jZSxtZXNzYWdlRnJvbUJ1ZmZlcjooKT0+U3IscGFkZGluZzooKT0+ZXMscGFyc2U6KCk9PlFuLHBhcnNlUnRjcDooKT0+WG4scGF5bG9hZDooKT0+WixwYXlsb2FkVHlwZTooKT0+TyxyYW5nZTooKT0+SXIscnRjcE1lc3NhZ2VGcm9tQnVmZmVyOigpPT54cixzU3JjOigpPT5ycyxzZXF1ZW5jZTooKT0+UnIsc2VxdWVuY2VOdW1iZXI6KCk9PnRzLHNlc3Npb25JZDooKT0+VHIsc2Vzc2lvblRpbWVvdXQ6KCk9PkNyLHN0YXR1c0NvZGU6KCk9Pmh0LHRpbWVzdGFtcDooKT0+SCx2ZXJzaW9uOigpPT5ab30pO2MoKTtjKCk7YygpO3ZhciBhYT0ocix7bWF4UmV0cmllczplLGVycm9yczp0fT17bWF4UmV0cmllczoyMCxlcnJvcnM6WzUwM119KT0+e2xldCBuPTAsaT1yLm9uRXJyb3I7ci5vbkVycm9yPW89PntpZihpPy4obyksISF0LmluY2x1ZGVzKG8uY29kZSkpe2lmKChuKz0xKT5lKXtjb25zb2xlLmxvZyhcInJldHJ5LCB0b28gbWFueVwiLG4sZSk7cmV0dXJufXNldFRpbWVvdXQoKCk9PnIucmV0cnk/LigpLG4qMTAwKX19fTtcbi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbi8qISBzYWZlLWJ1ZmZlci4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguY2pzLmpzLm1hcFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxuLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gZ2V0TGVucyAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKVxuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlblxuXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuXG4gICAgPyAwXG4gICAgOiA0IC0gKHZhbGlkTGVuICUgNClcblxuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dXG59XG5cbi8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoIChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG5cbiAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSlcblxuICB2YXIgY3VyQnl0ZSA9IDBcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwXG4gICAgPyB2YWxpZExlbiAtIDRcbiAgICA6IHZhbGlkTGVuXG5cbiAgdmFyIGlcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8XG4gICAgICByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMikge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDEpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPVxuICAgICAgKCh1aW50OFtpXSA8PCAxNikgJiAweEZGMDAwMCkgK1xuICAgICAgKCh1aW50OFtpICsgMV0gPDwgOCkgJiAweEZGMDApICtcbiAgICAgICh1aW50OFtpICsgMl0gJiAweEZGKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXSArXG4gICAgICAnPT0nXG4gICAgKVxuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDEwXSArXG4gICAgICBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl0gK1xuICAgICAgJz0nXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxudmFyIEtfTUFYX0xFTkdUSCA9IDB4N2ZmZmZmZmZcbmV4cG9ydHMua01heExlbmd0aCA9IEtfTUFYX0xFTkdUSFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBQcmludCB3YXJuaW5nIGFuZCByZWNvbW1lbmQgdXNpbmcgYGJ1ZmZlcmAgdjQueCB3aGljaCBoYXMgYW4gT2JqZWN0XG4gKiAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBXZSByZXBvcnQgdGhhdCB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBpZiB0aGUgYXJlIG5vdCBzdWJjbGFzc2FibGVcbiAqIHVzaW5nIF9fcHJvdG9fXy4gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWBcbiAqIChTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOCkuIElFIDEwIGxhY2tzIHN1cHBvcnRcbiAqIGZvciBfX3Byb3RvX18gYW5kIGhhcyBhIGJ1Z2d5IHR5cGVkIGFycmF5IGltcGxlbWVudGF0aW9uLlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICBjb25zb2xlLmVycm9yKFxuICAgICdUaGlzIGJyb3dzZXIgbGFja3MgdHlwZWQgYXJyYXkgKFVpbnQ4QXJyYXkpIHN1cHBvcnQgd2hpY2ggaXMgcmVxdWlyZWQgYnkgJyArXG4gICAgJ2BidWZmZXJgIHY1LnguIFVzZSBgYnVmZmVyYCB2NC54IGlmIHlvdSByZXF1aXJlIG9sZCBicm93c2VyIHN1cHBvcnQuJ1xuICApXG59XG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgLy8gQ2FuIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkP1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5fX3Byb3RvX18gPSB7IF9fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfSB9XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDJcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCAncGFyZW50Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0aGlzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmJ1ZmZlclxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ29mZnNldCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5ieXRlT2Zmc2V0XG4gIH1cbn0pXG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAobGVuZ3RoKSB7XG4gIGlmIChsZW5ndGggPiBLX01BWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIGxlbmd0aCArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICB9XG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gIGJ1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBidWZcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZShhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20oYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgIT0gbnVsbCAmJlxuICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgIHZhbHVlOiBudWxsLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSlcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbmZ1bmN0aW9uIGZyb20gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUxpa2UodmFsdWUpXG4gIH1cblxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcbiAgICAgICdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICtcbiAgICAgICdvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB2YWx1ZSlcbiAgICApXG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZSh2YWx1ZSwgQXJyYXlCdWZmZXIpIHx8XG4gICAgICAodmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIEFycmF5QnVmZmVyKSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgKVxuICB9XG5cbiAgdmFyIHZhbHVlT2YgPSB2YWx1ZS52YWx1ZU9mICYmIHZhbHVlLnZhbHVlT2YoKVxuICBpZiAodmFsdWVPZiAhPSBudWxsICYmIHZhbHVlT2YgIT09IHZhbHVlKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlT2YsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIHZhciBiID0gZnJvbU9iamVjdCh2YWx1ZSlcbiAgaWYgKGIpIHJldHVybiBiXG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1ByaW1pdGl2ZSAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShcbiAgICAgIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0oJ3N0cmluZycpLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGhcbiAgICApXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICtcbiAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gIClcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBOb3RlOiBDaGFuZ2UgcHJvdG90eXBlICphZnRlciogQnVmZmVyLmZyb20gaXMgZGVmaW5lZCB0byB3b3JrYXJvdW5kIENocm9tZSBidWc6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzE0OFxuQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIHNpemUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlIChzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gYnVmLndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICBidWYgPSBidWYuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlIChhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgYnVmW2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJvZmZzZXRcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcImxlbmd0aFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICB2YXIgYnVmXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBidWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbilcblxuICAgIGlmIChidWYubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYnVmXG4gICAgfVxuXG4gICAgb2JqLmNvcHkoYnVmLCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIGJ1ZlxuICB9XG5cbiAgaWYgKG9iai5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgbnVtYmVySXNOYU4ob2JqLmxlbmd0aCkpIHtcbiAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIoMClcbiAgICB9XG4gICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqKVxuICB9XG5cbiAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iai5kYXRhKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBLX01BWF9MRU5HVEhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIEtfTUFYX0xFTkdUSC50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuIGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlciA9PT0gdHJ1ZSAmJlxuICAgIGIgIT09IEJ1ZmZlci5wcm90b3R5cGUgLy8gc28gQnVmZmVyLmlzQnVmZmVyKEJ1ZmZlci5wcm90b3R5cGUpIHdpbGwgYmUgZmFsc2Vcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmIChpc0luc3RhbmNlKGEsIFVpbnQ4QXJyYXkpKSBhID0gQnVmZmVyLmZyb20oYSwgYS5vZmZzZXQsIGEuYnl0ZUxlbmd0aClcbiAgaWYgKGlzSW5zdGFuY2UoYiwgVWludDhBcnJheSkpIGIgPSBCdWZmZXIuZnJvbShiLCBiLm9mZnNldCwgYi5ieXRlTGVuZ3RoKVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJidWYxXCIsIFwiYnVmMlwiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5J1xuICAgIClcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmIChpc0luc3RhbmNlKGJ1ZiwgVWludDhBcnJheSkpIHtcbiAgICAgIGJ1ZiA9IEJ1ZmZlci5mcm9tKGJ1ZilcbiAgICB9XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgaXNJbnN0YW5jZShzdHJpbmcsIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgb3IgQXJyYXlCdWZmZXIuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzdHJpbmdcbiAgICApXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbXVzdE1hdGNoID0gKGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSA9PT0gdHJ1ZSlcbiAgaWYgKCFtdXN0TWF0Y2ggJiYgbGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB7XG4gICAgICAgICAgcmV0dXJuIG11c3RNYXRjaCA/IC0xIDogdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgfVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCAoYW5kIHRoZSBgaXMtYnVmZmVyYCBucG0gcGFja2FnZSlcbi8vIHRvIGRldGVjdCBhIEJ1ZmZlciBpbnN0YW5jZS4gSXQncyBub3QgcG9zc2libGUgdG8gdXNlIGBpbnN0YW5jZW9mIEJ1ZmZlcmBcbi8vIHJlbGlhYmx5IGluIGEgYnJvd3NlcmlmeSBjb250ZXh0IGJlY2F1c2UgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgZGlmZmVyZW50XG4vLyBjb3BpZXMgb2YgdGhlICdidWZmZXInIHBhY2thZ2UgaW4gdXNlLiBUaGlzIG1ldGhvZCB3b3JrcyBldmVuIGZvciBCdWZmZXJcbi8vIGluc3RhbmNlcyB0aGF0IHdlcmUgY3JlYXRlZCBmcm9tIGFub3RoZXIgY29weSBvZiB0aGUgYGJ1ZmZlcmAgcGFja2FnZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzE1NFxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZyA9IEJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmdcblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5yZXBsYWNlKC8oLnsyfSkvZywgJyQxICcpLnRyaW0oKVxuICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmIChpc0luc3RhbmNlKHRhcmdldCwgVWludDhBcnJheSkpIHtcbiAgICB0YXJnZXQgPSBCdWZmZXIuZnJvbSh0YXJnZXQsIHRhcmdldC5vZmZzZXQsIHRhcmdldC5ieXRlTGVuZ3RoKVxuICB9XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInRhcmdldFwiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdGFyZ2V0KVxuICAgIClcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKG51bWJlcklzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKG51bWJlcklzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgKGJ5dGVzW2kgKyAxXSAqIDI1NikpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlcicpXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVXNlIGJ1aWx0LWluIHdoZW4gYXZhaWxhYmxlLCBtaXNzaW5nIGZyb20gSUUxMVxuICAgIHRoaXMuY29weVdpdGhpbih0YXJnZXRTdGFydCwgc3RhcnQsIGVuZClcbiAgfSBlbHNlIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKChlbmNvZGluZyA9PT0gJ3V0ZjgnICYmIGNvZGUgPCAxMjgpIHx8XG4gICAgICAgICAgZW5jb2RpbmcgPT09ICdsYXRpbjEnKSB7XG4gICAgICAgIC8vIEZhc3QgcGF0aDogSWYgYHZhbGAgZml0cyBpbnRvIGEgc2luZ2xlIGJ5dGUsIHVzZSB0aGF0IG51bWVyaWMgdmFsdWUuXG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBpZiAobGVuID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgXCInICsgdmFsICtcbiAgICAgICAgJ1wiIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50IFwidmFsdWVcIicpXG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teKy8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgdGFrZXMgZXF1YWwgc2lnbnMgYXMgZW5kIG9mIHRoZSBCYXNlNjQgZW5jb2RpbmdcbiAgc3RyID0gc3RyLnNwbGl0KCc9JylbMF1cbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0ci50cmltKCkucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG4vLyBBcnJheUJ1ZmZlciBvciBVaW50OEFycmF5IG9iamVjdHMgZnJvbSBvdGhlciBjb250ZXh0cyAoaS5lLiBpZnJhbWVzKSBkbyBub3QgcGFzc1xuLy8gdGhlIGBpbnN0YW5jZW9mYCBjaGVjayBidXQgdGhleSBzaG91bGQgYmUgdHJlYXRlZCBhcyBvZiB0aGF0IHR5cGUuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNjZcbmZ1bmN0aW9uIGlzSW5zdGFuY2UgKG9iaiwgdHlwZSkge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgdHlwZSB8fFxuICAgIChvYmogIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IgIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPSBudWxsICYmXG4gICAgICBvYmouY29uc3RydWN0b3IubmFtZSA9PT0gdHlwZS5uYW1lKVxufVxuZnVuY3Rpb24gbnVtYmVySXNOYU4gKG9iaikge1xuICAvLyBGb3IgSUUxMSBzdXBwb3J0XG4gIHJldHVybiBvYmogIT09IG9iaiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcbiAgICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBmYWN0b3J5KGdsb2JhbC5jb21wYXJlVmVyc2lvbnMgPSB7fSkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIGNvbnN0IHNlbXZlciA9IC9eW3Zefjw+PV0qPyhcXGQrKSg/OlxcLihbeCpdfFxcZCspKD86XFwuKFt4Kl18XFxkKykoPzpcXC4oW3gqXXxcXGQrKSk/KD86LShbXFxkYS16XFwtXSsoPzpcXC5bXFxkYS16XFwtXSspKikpPyg/OlxcK1tcXGRhLXpcXC1dKyg/OlxcLltcXGRhLXpcXC1dKykqKT8pPyk/JC9pO1xuICAgIGNvbnN0IHZhbGlkYXRlQW5kUGFyc2UgPSAodmVyc2lvbikgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IGV4cGVjdGVkIHN0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdmVyc2lvbi5tYXRjaChzZW12ZXIpO1xuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXJndW1lbnQgbm90IHZhbGlkIHNlbXZlciAoJyR7dmVyc2lvbn0nIHJlY2VpdmVkKWApO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoLnNoaWZ0KCk7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9O1xuICAgIGNvbnN0IGlzV2lsZGNhcmQgPSAocykgPT4gcyA9PT0gJyonIHx8IHMgPT09ICd4JyB8fCBzID09PSAnWCc7XG4gICAgY29uc3QgdHJ5UGFyc2UgPSAodikgPT4ge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQodiwgMTApO1xuICAgICAgICByZXR1cm4gaXNOYU4obikgPyB2IDogbjtcbiAgICB9O1xuICAgIGNvbnN0IGZvcmNlVHlwZSA9IChhLCBiKSA9PiB0eXBlb2YgYSAhPT0gdHlwZW9mIGIgPyBbU3RyaW5nKGEpLCBTdHJpbmcoYildIDogW2EsIGJdO1xuICAgIGNvbnN0IGNvbXBhcmVTdHJpbmdzID0gKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGlzV2lsZGNhcmQoYSkgfHwgaXNXaWxkY2FyZChiKSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICBjb25zdCBbYXAsIGJwXSA9IGZvcmNlVHlwZSh0cnlQYXJzZShhKSwgdHJ5UGFyc2UoYikpO1xuICAgICAgICBpZiAoYXAgPiBicClcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICBpZiAoYXAgPCBicClcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfTtcbiAgICBjb25zdCBjb21wYXJlU2VnbWVudHMgPSAoYSwgYikgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWF4KGEubGVuZ3RoLCBiLmxlbmd0aCk7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgciA9IGNvbXBhcmVTdHJpbmdzKGFbaV0gfHwgJzAnLCBiW2ldIHx8ICcwJyk7XG4gICAgICAgICAgICBpZiAociAhPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZSBbc2VtdmVyXShodHRwczovL3NlbXZlci5vcmcvKSB2ZXJzaW9uIHN0cmluZ3MgdG8gZmluZCBncmVhdGVyLCBlcXVhbCBvciBsZXNzZXIuXG4gICAgICogVGhpcyBsaWJyYXJ5IHN1cHBvcnRzIHRoZSBmdWxsIHNlbXZlciBzcGVjaWZpY2F0aW9uLCBpbmNsdWRpbmcgY29tcGFyaW5nIHZlcnNpb25zIHdpdGggZGlmZmVyZW50IG51bWJlciBvZiBkaWdpdHMgbGlrZSBgMS4wLjBgLCBgMS4wYCwgYDFgLCBhbmQgcHJlLXJlbGVhc2UgdmVyc2lvbnMgbGlrZSBgMS4wLjAtYWxwaGFgLlxuICAgICAqIEBwYXJhbSB2MSAtIEZpcnN0IHZlcnNpb24gdG8gY29tcGFyZVxuICAgICAqIEBwYXJhbSB2MiAtIFNlY29uZCB2ZXJzaW9uIHRvIGNvbXBhcmVcbiAgICAgKiBAcmV0dXJucyBOdW1lcmljIHZhbHVlIGNvbXBhdGlibGUgd2l0aCB0aGUgW0FycmF5LnNvcnQoZm4pIGludGVyZmFjZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29ydCNQYXJhbWV0ZXJzKS5cbiAgICAgKi9cbiAgICBjb25zdCBjb21wYXJlVmVyc2lvbnMgPSAodjEsIHYyKSA9PiB7XG4gICAgICAgIC8vIHZhbGlkYXRlIGlucHV0IGFuZCBzcGxpdCBpbnRvIHNlZ21lbnRzXG4gICAgICAgIGNvbnN0IG4xID0gdmFsaWRhdGVBbmRQYXJzZSh2MSk7XG4gICAgICAgIGNvbnN0IG4yID0gdmFsaWRhdGVBbmRQYXJzZSh2Mik7XG4gICAgICAgIC8vIHBvcCBvZmYgdGhlIHBhdGNoXG4gICAgICAgIGNvbnN0IHAxID0gbjEucG9wKCk7XG4gICAgICAgIGNvbnN0IHAyID0gbjIucG9wKCk7XG4gICAgICAgIC8vIHZhbGlkYXRlIG51bWJlcnNcbiAgICAgICAgY29uc3QgciA9IGNvbXBhcmVTZWdtZW50cyhuMSwgbjIpO1xuICAgICAgICBpZiAociAhPT0gMClcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAvLyB2YWxpZGF0ZSBwcmUtcmVsZWFzZVxuICAgICAgICBpZiAocDEgJiYgcDIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wYXJlU2VnbWVudHMocDEuc3BsaXQoJy4nKSwgcDIuc3BsaXQoJy4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocDEgfHwgcDIpIHtcbiAgICAgICAgICAgIHJldHVybiBwMSA/IC0xIDogMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZSBbc2VtdmVyXShodHRwczovL3NlbXZlci5vcmcvKSB2ZXJzaW9uIHN0cmluZ3MgdXNpbmcgdGhlIHNwZWNpZmllZCBvcGVyYXRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2MSBGaXJzdCB2ZXJzaW9uIHRvIGNvbXBhcmVcbiAgICAgKiBAcGFyYW0gdjIgU2Vjb25kIHZlcnNpb24gdG8gY29tcGFyZVxuICAgICAqIEBwYXJhbSBvcGVyYXRvciBBbGxvd2VkIGFyaXRobWV0aWMgb3BlcmF0b3IgdG8gdXNlXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBjb21wYXJpc29uIGJldHdlZW4gdGhlIGZpcnN0VmVyc2lvbiBhbmQgdGhlIHNlY29uZFZlcnNpb24gc2F0aXNmaWVzIHRoZSBvcGVyYXRvciwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIGNvbXBhcmUoJzEwLjEuOCcsICcxMC4wLjQnLCAnPicpOyAvLyByZXR1cm4gdHJ1ZVxuICAgICAqIGNvbXBhcmUoJzEwLjAuMScsICcxMC4wLjEnLCAnPScpOyAvLyByZXR1cm4gdHJ1ZVxuICAgICAqIGNvbXBhcmUoJzEwLjEuMScsICcxMC4yLjInLCAnPCcpOyAvLyByZXR1cm4gdHJ1ZVxuICAgICAqIGNvbXBhcmUoJzEwLjEuMScsICcxMC4yLjInLCAnPD0nKTsgLy8gcmV0dXJuIHRydWVcbiAgICAgKiBjb21wYXJlKCcxMC4xLjEnLCAnMTAuMi4yJywgJz49Jyk7IC8vIHJldHVybiBmYWxzZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbnN0IGNvbXBhcmUgPSAodjEsIHYyLCBvcGVyYXRvcikgPT4ge1xuICAgICAgICAvLyB2YWxpZGF0ZSBpbnB1dCBvcGVyYXRvclxuICAgICAgICBhc3NlcnRWYWxpZE9wZXJhdG9yKG9wZXJhdG9yKTtcbiAgICAgICAgLy8gc2luY2UgcmVzdWx0IG9mIGNvbXBhcmVWZXJzaW9ucyBjYW4gb25seSBiZSAtMSBvciAwIG9yIDFcbiAgICAgICAgLy8gYSBzaW1wbGUgbWFwIGNhbiBiZSB1c2VkIHRvIHJlcGxhY2Ugc3dpdGNoXG4gICAgICAgIGNvbnN0IHJlcyA9IGNvbXBhcmVWZXJzaW9ucyh2MSwgdjIpO1xuICAgICAgICByZXR1cm4gb3BlcmF0b3JSZXNNYXBbb3BlcmF0b3JdLmluY2x1ZGVzKHJlcyk7XG4gICAgfTtcbiAgICBjb25zdCBvcGVyYXRvclJlc01hcCA9IHtcbiAgICAgICAgJz4nOiBbMV0sXG4gICAgICAgICc+PSc6IFswLCAxXSxcbiAgICAgICAgJz0nOiBbMF0sXG4gICAgICAgICc8PSc6IFstMSwgMF0sXG4gICAgICAgICc8JzogWy0xXSxcbiAgICAgICAgJyE9JzogWy0xLCAxXSxcbiAgICB9O1xuICAgIGNvbnN0IGFsbG93ZWRPcGVyYXRvcnMgPSBPYmplY3Qua2V5cyhvcGVyYXRvclJlc01hcCk7XG4gICAgY29uc3QgYXNzZXJ0VmFsaWRPcGVyYXRvciA9IChvcCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG9wICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBvcGVyYXRvciB0eXBlLCBleHBlY3RlZCBzdHJpbmcgYnV0IGdvdCAke3R5cGVvZiBvcH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxsb3dlZE9wZXJhdG9ycy5pbmRleE9mKG9wKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcGVyYXRvciwgZXhwZWN0ZWQgb25lIG9mICR7YWxsb3dlZE9wZXJhdG9ycy5qb2luKCd8Jyl9YCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTWF0Y2ggW25wbSBzZW12ZXJdKGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3Y2L3VzaW5nLW5wbS9zZW12ZXIpIHZlcnNpb24gcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBWZXJzaW9uIG51bWJlciB0byBtYXRjaFxuICAgICAqIEBwYXJhbSByYW5nZSBSYW5nZSBwYXR0ZXJuIGZvciB2ZXJzaW9uXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2ZXJzaW9uIG51bWJlciBpcyB3aXRoaW4gdGhlIHJhbmdlLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogc2F0aXNmaWVzKCcxLjEuMCcsICdeMS4wLjAnKTsgLy8gcmV0dXJuIHRydWVcbiAgICAgKiBzYXRpc2ZpZXMoJzEuMS4wJywgJ34xLjAuMCcpOyAvLyByZXR1cm4gZmFsc2VcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb25zdCBzYXRpc2ZpZXMgPSAodmVyc2lvbiwgcmFuZ2UpID0+IHtcbiAgICAgICAgLy8gY2xlYW4gaW5wdXRcbiAgICAgICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKC8oWz48PV0rKVxccysvZywgJyQxJyk7XG4gICAgICAgIC8vIGhhbmRsZSBtdWx0aXBsZSBjb21wYXJhdG9yc1xuICAgICAgICBpZiAocmFuZ2UuaW5jbHVkZXMoJ3x8JykpIHtcbiAgICAgICAgICAgIHJldHVybiByYW5nZS5zcGxpdCgnfHwnKS5zb21lKChyKSA9PiBzYXRpc2ZpZXModmVyc2lvbiwgcikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJhbmdlLmluY2x1ZGVzKCcgLSAnKSkge1xuICAgICAgICAgICAgY29uc3QgW2EsIGJdID0gcmFuZ2Uuc3BsaXQoJyAtICcsIDIpO1xuICAgICAgICAgICAgcmV0dXJuIHNhdGlzZmllcyh2ZXJzaW9uLCBgPj0ke2F9IDw9JHtifWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJhbmdlLmluY2x1ZGVzKCcgJykpIHtcbiAgICAgICAgICAgIHJldHVybiByYW5nZVxuICAgICAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxzezIsfS9nLCAnICcpXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcgJylcbiAgICAgICAgICAgICAgICAuZXZlcnkoKHIpID0+IHNhdGlzZmllcyh2ZXJzaW9uLCByKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgbm8gcmFuZ2Ugb3BlcmF0b3IgdGhlbiBcIj1cIlxuICAgICAgICBjb25zdCBtID0gcmFuZ2UubWF0Y2goL14oWzw+PX5eXSspLyk7XG4gICAgICAgIGNvbnN0IG9wID0gbSA/IG1bMV0gOiAnPSc7XG4gICAgICAgIC8vIGlmIGd0L2x0L2VxIHRoZW4gb3BlcmF0b3IgY29tcGFyZVxuICAgICAgICBpZiAob3AgIT09ICdeJyAmJiBvcCAhPT0gJ34nKVxuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmUodmVyc2lvbiwgcmFuZ2UsIG9wKTtcbiAgICAgICAgLy8gZWxzZSByYW5nZSBvZiBlaXRoZXIgXCJ+XCIgb3IgXCJeXCIgaXMgYXNzdW1lZFxuICAgICAgICBjb25zdCBbdjEsIHYyLCB2MywgLCB2cF0gPSB2YWxpZGF0ZUFuZFBhcnNlKHZlcnNpb24pO1xuICAgICAgICBjb25zdCBbcjEsIHIyLCByMywgLCBycF0gPSB2YWxpZGF0ZUFuZFBhcnNlKHJhbmdlKTtcbiAgICAgICAgY29uc3QgdiA9IFt2MSwgdjIsIHYzXTtcbiAgICAgICAgY29uc3QgciA9IFtyMSwgcjIgIT09IG51bGwgJiYgcjIgIT09IHZvaWQgMCA/IHIyIDogJ3gnLCByMyAhPT0gbnVsbCAmJiByMyAhPT0gdm9pZCAwID8gcjMgOiAneCddO1xuICAgICAgICAvLyB2YWxpZGF0ZSBwcmUtcmVsZWFzZVxuICAgICAgICBpZiAocnApIHtcbiAgICAgICAgICAgIGlmICghdnApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKGNvbXBhcmVTZWdtZW50cyh2LCByKSAhPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoY29tcGFyZVNlZ21lbnRzKHZwLnNwbGl0KCcuJyksIHJwLnNwbGl0KCcuJykpID09PSAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZmlyc3Qgbm9uLXplcm8gbnVtYmVyXG4gICAgICAgIGNvbnN0IG5vblplcm8gPSByLmZpbmRJbmRleCgodikgPT4gdiAhPT0gJzAnKSArIDE7XG4gICAgICAgIC8vIHBvaW50ZXIgdG8gd2hlcmUgc2VnbWVudHMgY2FuIGJlID49XG4gICAgICAgIGNvbnN0IGkgPSBvcCA9PT0gJ34nID8gMiA6IG5vblplcm8gPiAxID8gbm9uWmVybyA6IDE7XG4gICAgICAgIC8vIGJlZm9yZSBwb2ludGVyIG11c3QgYmUgZXF1YWxcbiAgICAgICAgaWYgKGNvbXBhcmVTZWdtZW50cyh2LnNsaWNlKDAsIGkpLCByLnNsaWNlKDAsIGkpKSAhPT0gMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gYWZ0ZXIgcG9pbnRlciBtdXN0IGJlID49XG4gICAgICAgIGlmIChjb21wYXJlU2VnbWVudHModi5zbGljZShpKSwgci5zbGljZShpKSkgPT09IC0xKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgW3NlbXZlcl0oaHR0cHM6Ly9zZW12ZXIub3JnLykgdmVyc2lvbiBzdHJpbmdzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZlcnNpb24gVmVyc2lvbiBudW1iZXIgdG8gdmFsaWRhdGVcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZlcnNpb24gbnVtYmVyIGlzIGEgdmFsaWQgc2VtdmVyIHZlcnNpb24gbnVtYmVyLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogdmFsaWRhdGUoJzEuMC4wLXJjLjEnKTsgLy8gcmV0dXJuIHRydWVcbiAgICAgKiB2YWxpZGF0ZSgnMS4wLXJjLjEnKTsgLy8gcmV0dXJuIGZhbHNlXG4gICAgICogdmFsaWRhdGUoJ2ZvbycpOyAvLyByZXR1cm4gZmFsc2VcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb25zdCB2YWxpZGF0ZSA9ICh2ZXJzaW9uKSA9PiB0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycgJiYgL15bdlxcZF0vLnRlc3QodmVyc2lvbikgJiYgc2VtdmVyLnRlc3QodmVyc2lvbik7XG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgW3NlbXZlcl0oaHR0cHM6Ly9zZW12ZXIub3JnLykgdmVyc2lvbiBzdHJpbmdzIHN0cmljdGx5LiBXaWxsIG5vdCBhY2NlcHQgd2lsZGNhcmRzIGFuZCB2ZXJzaW9uIHJhbmdlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFZlcnNpb24gbnVtYmVyIHRvIHZhbGlkYXRlXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2ZXJzaW9uIG51bWJlciBpcyBhIHZhbGlkIHNlbXZlciB2ZXJzaW9uIG51bWJlciBgZmFsc2VgIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiB2YWxpZGF0ZSgnMS4wLjAtcmMuMScpOyAvLyByZXR1cm4gdHJ1ZVxuICAgICAqIHZhbGlkYXRlKCcxLjAtcmMuMScpOyAvLyByZXR1cm4gZmFsc2VcbiAgICAgKiB2YWxpZGF0ZSgnZm9vJyk7IC8vIHJldHVybiBmYWxzZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbnN0IHZhbGlkYXRlU3RyaWN0ID0gKHZlcnNpb24pID0+IHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAvXigwfFsxLTldXFxkKilcXC4oMHxbMS05XVxcZCopXFwuKDB8WzEtOV1cXGQqKSg/Oi0oKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKD86XFwuKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKSopKT8oPzpcXCsoWzAtOWEtekEtWi1dKyg/OlxcLlswLTlhLXpBLVotXSspKikpPyQvLnRlc3QodmVyc2lvbik7XG5cbiAgICBleHBvcnRzLmNvbXBhcmUgPSBjb21wYXJlO1xuICAgIGV4cG9ydHMuY29tcGFyZVZlcnNpb25zID0gY29tcGFyZVZlcnNpb25zO1xuICAgIGV4cG9ydHMuc2F0aXNmaWVzID0gc2F0aXNmaWVzO1xuICAgIGV4cG9ydHMudmFsaWRhdGUgPSB2YWxpZGF0ZTtcbiAgICBleHBvcnRzLnZhbGlkYXRlU3RyaWN0ID0gdmFsaWRhdGVTdHJpY3Q7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiLyohXG4gKiAgaG93bGVyLmpzIHYyLjIuMVxuICogIGhvd2xlcmpzLmNvbVxuICpcbiAqICAoYykgMjAxMy0yMDIwLCBKYW1lcyBTaW1wc29uIG9mIEdvbGRGaXJlIFN0dWRpb3NcbiAqICBnb2xkZmlyZXN0dWRpb3MuY29tXG4gKlxuICogIE1JVCBMaWNlbnNlXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuXG4gICd1c2Ugc3RyaWN0JztcblxuICAvKiogR2xvYmFsIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgZ2xvYmFsIGNvbnRyb2xsZXIuIEFsbCBjb250YWluZWQgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBhcHBseVxuICAgKiB0byBhbGwgc291bmRzIHRoYXQgYXJlIGN1cnJlbnRseSBwbGF5aW5nIG9yIHdpbGwgYmUgaW4gdGhlIGZ1dHVyZS5cbiAgICovXG4gIHZhciBIb3dsZXJHbG9iYWwgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgfTtcbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgSG93bGVyIG9iamVjdC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBDcmVhdGUgYSBnbG9iYWwgSUQgY291bnRlci5cbiAgICAgIHNlbGYuX2NvdW50ZXIgPSAxMDAwO1xuXG4gICAgICAvLyBQb29sIG9mIHVubG9ja2VkIEhUTUw1IEF1ZGlvIG9iamVjdHMuXG4gICAgICBzZWxmLl9odG1sNUF1ZGlvUG9vbCA9IFtdO1xuICAgICAgc2VsZi5odG1sNVBvb2xTaXplID0gMTA7XG5cbiAgICAgIC8vIEludGVybmFsIHByb3BlcnRpZXMuXG4gICAgICBzZWxmLl9jb2RlY3MgPSB7fTtcbiAgICAgIHNlbGYuX2hvd2xzID0gW107XG4gICAgICBzZWxmLl9tdXRlZCA9IGZhbHNlO1xuICAgICAgc2VsZi5fdm9sdW1lID0gMTtcbiAgICAgIHNlbGYuX2NhblBsYXlFdmVudCA9ICdjYW5wbGF5dGhyb3VnaCc7XG4gICAgICBzZWxmLl9uYXZpZ2F0b3IgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lm5hdmlnYXRvcikgPyB3aW5kb3cubmF2aWdhdG9yIDogbnVsbDtcblxuICAgICAgLy8gUHVibGljIHByb3BlcnRpZXMuXG4gICAgICBzZWxmLm1hc3RlckdhaW4gPSBudWxsO1xuICAgICAgc2VsZi5ub0F1ZGlvID0gZmFsc2U7XG4gICAgICBzZWxmLnVzaW5nV2ViQXVkaW8gPSB0cnVlO1xuICAgICAgc2VsZi5hdXRvU3VzcGVuZCA9IHRydWU7XG4gICAgICBzZWxmLmN0eCA9IG51bGw7XG5cbiAgICAgIC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHRoZSBhdXRvIGF1ZGlvIHVubG9ja2VyLlxuICAgICAgc2VsZi5hdXRvVW5sb2NrID0gdHJ1ZTtcblxuICAgICAgLy8gU2V0dXAgdGhlIHZhcmlvdXMgc3RhdGUgdmFsdWVzIGZvciBnbG9iYWwgdHJhY2tpbmcuXG4gICAgICBzZWxmLl9zZXR1cCgpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgZ2xvYmFsIHZvbHVtZSBmb3IgYWxsIHNvdW5kcy5cbiAgICAgKiBAcGFyYW0gIHtGbG9hdH0gdm9sIFZvbHVtZSBmcm9tIDAuMCB0byAxLjAuXG4gICAgICogQHJldHVybiB7SG93bGVyL0Zsb2F0fSAgICAgUmV0dXJucyBzZWxmIG9yIGN1cnJlbnQgdm9sdW1lLlxuICAgICAqL1xuICAgIHZvbHVtZTogZnVuY3Rpb24odm9sKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuICAgICAgdm9sID0gcGFyc2VGbG9hdCh2b2wpO1xuXG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIEF1ZGlvQ29udGV4dCBjcmVhdGVkIHlldCwgcnVuIHRoZSBzZXR1cC5cbiAgICAgIGlmICghc2VsZi5jdHgpIHtcbiAgICAgICAgc2V0dXBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2b2wgIT09ICd1bmRlZmluZWQnICYmIHZvbCA+PSAwICYmIHZvbCA8PSAxKSB7XG4gICAgICAgIHNlbGYuX3ZvbHVtZSA9IHZvbDtcblxuICAgICAgICAvLyBEb24ndCB1cGRhdGUgYW55IG9mIHRoZSBub2RlcyBpZiB3ZSBhcmUgbXV0ZWQuXG4gICAgICAgIGlmIChzZWxmLl9tdXRlZCkge1xuICAgICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiB1c2luZyBXZWIgQXVkaW8sIHdlIGp1c3QgbmVlZCB0byBhZGp1c3QgdGhlIG1hc3RlciBnYWluLlxuICAgICAgICBpZiAoc2VsZi51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICAgICAgc2VsZi5tYXN0ZXJHYWluLmdhaW4uc2V0VmFsdWVBdFRpbWUodm9sLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbmQgY2hhbmdlIHZvbHVtZSBmb3IgYWxsIEhUTUw1IGF1ZGlvIG5vZGVzLlxuICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIXNlbGYuX2hvd2xzW2ldLl93ZWJBdWRpbykge1xuICAgICAgICAgICAgLy8gR2V0IGFsbCBvZiB0aGUgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICAgICAgICAgIHZhciBpZHMgPSBzZWxmLl9ob3dsc1tpXS5fZ2V0U291bmRJZHMoKTtcblxuICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBzb3VuZHMgYW5kIGNoYW5nZSB0aGUgdm9sdW1lcy5cbiAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxpZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5faG93bHNbaV0uX3NvdW5kQnlJZChpZHNbal0pO1xuXG4gICAgICAgICAgICAgIGlmIChzb3VuZCAmJiBzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgICAgIHNvdW5kLl9ub2RlLnZvbHVtZSA9IHNvdW5kLl92b2x1bWUgKiB2b2w7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuX3ZvbHVtZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIG11dGluZyBhbmQgdW5tdXRpbmcgZ2xvYmFsbHkuXG4gICAgICogQHBhcmFtICB7Qm9vbGVhbn0gbXV0ZWQgSXMgbXV0ZWQgb3Igbm90LlxuICAgICAqL1xuICAgIG11dGU6IGZ1bmN0aW9uKG11dGVkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIEF1ZGlvQ29udGV4dCBjcmVhdGVkIHlldCwgcnVuIHRoZSBzZXR1cC5cbiAgICAgIGlmICghc2VsZi5jdHgpIHtcbiAgICAgICAgc2V0dXBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgc2VsZi5fbXV0ZWQgPSBtdXRlZDtcblxuICAgICAgLy8gV2l0aCBXZWIgQXVkaW8sIHdlIGp1c3QgbmVlZCB0byBtdXRlIHRoZSBtYXN0ZXIgZ2Fpbi5cbiAgICAgIGlmIChzZWxmLnVzaW5nV2ViQXVkaW8pIHtcbiAgICAgICAgc2VsZi5tYXN0ZXJHYWluLmdhaW4uc2V0VmFsdWVBdFRpbWUobXV0ZWQgPyAwIDogc2VsZi5fdm9sdW1lLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIGFuZCBtdXRlIGFsbCBIVE1MNSBBdWRpbyBub2Rlcy5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXNlbGYuX2hvd2xzW2ldLl93ZWJBdWRpbykge1xuICAgICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2hvd2xzW2ldLl9nZXRTb3VuZElkcygpO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBzb3VuZHMgYW5kIG1hcmsgdGhlIGF1ZGlvIG5vZGUgYXMgbXV0ZWQuXG4gICAgICAgICAgZm9yICh2YXIgaj0wOyBqPGlkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5faG93bHNbaV0uX3NvdW5kQnlJZChpZHNbal0pO1xuXG4gICAgICAgICAgICBpZiAoc291bmQgJiYgc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUubXV0ZWQgPSAobXV0ZWQpID8gdHJ1ZSA6IHNvdW5kLl9tdXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBzdG9wcGluZyBhbGwgc291bmRzIGdsb2JhbGx5LlxuICAgICAqL1xuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBIb3dscyBhbmQgc3RvcCB0aGVtLlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNlbGYuX2hvd2xzW2ldLnN0b3AoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVubG9hZCBhbmQgZGVzdHJveSBhbGwgY3VycmVudGx5IGxvYWRlZCBIb3dsIG9iamVjdHMuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIHVubG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICBmb3IgKHZhciBpPXNlbGYuX2hvd2xzLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHtcbiAgICAgICAgc2VsZi5faG93bHNbaV0udW5sb2FkKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBBdWRpb0NvbnRleHQgdG8gbWFrZSBzdXJlIGl0IGlzIGZ1bGx5IHJlc2V0LlxuICAgICAgaWYgKHNlbGYudXNpbmdXZWJBdWRpbyAmJiBzZWxmLmN0eCAmJiB0eXBlb2Ygc2VsZi5jdHguY2xvc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNlbGYuY3R4LmNsb3NlKCk7XG4gICAgICAgIHNlbGYuY3R4ID0gbnVsbDtcbiAgICAgICAgc2V0dXBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGZvciBjb2RlYyBzdXBwb3J0IG9mIHNwZWNpZmljIGV4dGVuc2lvbi5cbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IGV4dCBBdWRpbyBmaWxlIGV4dGVudGlvbi5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGNvZGVjczogZnVuY3Rpb24oZXh0KSB7XG4gICAgICByZXR1cm4gKHRoaXMgfHwgSG93bGVyKS5fY29kZWNzW2V4dC5yZXBsYWNlKC9eeC0vLCAnJyldO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXR1cCB2YXJpb3VzIHN0YXRlIHZhbHVlcyBmb3IgZ2xvYmFsIHRyYWNraW5nLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfc2V0dXA6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHN1c3BlbmQvcmVzdW1lIHN0YXRlIG9mIHRoZSBBdWRpb0NvbnRleHQuXG4gICAgICBzZWxmLnN0YXRlID0gc2VsZi5jdHggPyBzZWxmLmN0eC5zdGF0ZSB8fCAnc3VzcGVuZGVkJyA6ICdzdXNwZW5kZWQnO1xuXG4gICAgICAvLyBBdXRvbWF0aWNhbGx5IGJlZ2luIHRoZSAzMC1zZWNvbmQgc3VzcGVuZCBwcm9jZXNzXG4gICAgICBzZWxmLl9hdXRvU3VzcGVuZCgpO1xuXG4gICAgICAvLyBDaGVjayBpZiBhdWRpbyBpcyBhdmFpbGFibGUuXG4gICAgICBpZiAoIXNlbGYudXNpbmdXZWJBdWRpbykge1xuICAgICAgICAvLyBObyBhdWRpbyBpcyBhdmFpbGFibGUgb24gdGhpcyBzeXN0ZW0gaWYgbm9BdWRpbyBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgICAgaWYgKHR5cGVvZiBBdWRpbyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHRlc3QgPSBuZXcgQXVkaW8oKTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNhbnBsYXl0aHJvdWdoIGV2ZW50IGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGVzdC5vbmNhbnBsYXl0aHJvdWdoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBzZWxmLl9jYW5QbGF5RXZlbnQgPSAnY2FucGxheSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICBzZWxmLm5vQXVkaW8gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLm5vQXVkaW8gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRlc3QgdG8gbWFrZSBzdXJlIGF1ZGlvIGlzbid0IGRpc2FibGVkIGluIEludGVybmV0IEV4cGxvcmVyLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHRlc3QgPSBuZXcgQXVkaW8oKTtcbiAgICAgICAgaWYgKHRlc3QubXV0ZWQpIHtcbiAgICAgICAgICBzZWxmLm5vQXVkaW8gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAvLyBDaGVjayBmb3Igc3VwcG9ydGVkIGNvZGVjcy5cbiAgICAgIGlmICghc2VsZi5ub0F1ZGlvKSB7XG4gICAgICAgIHNlbGYuX3NldHVwQ29kZWNzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBmb3IgYnJvd3NlciBzdXBwb3J0IGZvciB2YXJpb3VzIGNvZGVjcyBhbmQgY2FjaGUgdGhlIHJlc3VsdHMuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIF9zZXR1cENvZGVjczogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuICAgICAgdmFyIGF1ZGlvVGVzdCA9IG51bGw7XG5cbiAgICAgIC8vIE11c3Qgd3JhcCBpbiBhIHRyeS9jYXRjaCBiZWNhdXNlIElFMTEgaW4gc2VydmVyIG1vZGUgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgdHJ5IHtcbiAgICAgICAgYXVkaW9UZXN0ID0gKHR5cGVvZiBBdWRpbyAhPT0gJ3VuZGVmaW5lZCcpID8gbmV3IEF1ZGlvKCkgOiBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWF1ZGlvVGVzdCB8fCB0eXBlb2YgYXVkaW9UZXN0LmNhblBsYXlUeXBlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICB2YXIgbXBlZ1Rlc3QgPSBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL21wZWc7JykucmVwbGFjZSgvXm5vJC8sICcnKTtcblxuICAgICAgLy8gT3BlcmEgdmVyc2lvbiA8MzMgaGFzIG1peGVkIE1QMyBzdXBwb3J0LCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGZvciBhbmQgYmxvY2sgaXQuXG4gICAgICB2YXIgY2hlY2tPcGVyYSA9IHNlbGYuX25hdmlnYXRvciAmJiBzZWxmLl9uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PUFJcXC8oWzAtNl0uKS9nKTtcbiAgICAgIHZhciBpc09sZE9wZXJhID0gKGNoZWNrT3BlcmEgJiYgcGFyc2VJbnQoY2hlY2tPcGVyYVswXS5zcGxpdCgnLycpWzFdLCAxMCkgPCAzMyk7XG5cbiAgICAgIHNlbGYuX2NvZGVjcyA9IHtcbiAgICAgICAgbXAzOiAhISghaXNPbGRPcGVyYSAmJiAobXBlZ1Rlc3QgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9tcDM7JykucmVwbGFjZSgvXm5vJC8sICcnKSkpLFxuICAgICAgICBtcGVnOiAhIW1wZWdUZXN0LFxuICAgICAgICBvcHVzOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vb2dnOyBjb2RlY3M9XCJvcHVzXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBvZ2c6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9vZ2c7IGNvZGVjcz1cInZvcmJpc1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgb2dhOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vb2dnOyBjb2RlY3M9XCJ2b3JiaXNcIicpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIHdhdjogISEoYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby93YXY7IGNvZGVjcz1cIjFcIicpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vd2F2JykpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIGFhYzogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL2FhYzsnKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBjYWY6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby94LWNhZjsnKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBtNGE6ICEhKGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8veC1tNGE7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9tNGE7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9hYWM7JykpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIG00YjogISEoYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby94LW00YjsnKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL200YjsnKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL2FhYzsnKSkucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgbXA0OiAhIShhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3gtbXA0OycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vbXA0OycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vYWFjOycpKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICB3ZWJhOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vd2VibTsgY29kZWNzPVwidm9yYmlzXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICB3ZWJtOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vd2VibTsgY29kZWNzPVwidm9yYmlzXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBkb2xieTogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL21wNDsgY29kZWNzPVwiZWMtM1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgZmxhYzogISEoYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby94LWZsYWM7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9mbGFjOycpKS5yZXBsYWNlKC9ebm8kLywgJycpXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU29tZSBicm93c2Vycy9kZXZpY2VzIHdpbGwgb25seSBhbGxvdyBhdWRpbyB0byBiZSBwbGF5ZWQgYWZ0ZXIgYSB1c2VyIGludGVyYWN0aW9uLlxuICAgICAqIEF0dGVtcHQgdG8gYXV0b21hdGljYWxseSB1bmxvY2sgYXVkaW8gb24gdGhlIGZpcnN0IHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICogQ29uY2VwdCBmcm9tOiBodHRwOi8vcGF1bGJha2F1cy5jb20vdHV0b3JpYWxzL2h0bWw1L3dlYi1hdWRpby1vbi1pb3MvXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIF91bmxvY2tBdWRpbzogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBPbmx5IHJ1biB0aGlzIGlmIFdlYiBBdWRpbyBpcyBzdXBwb3J0ZWQgYW5kIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gdW5sb2NrZWQuXG4gICAgICBpZiAoc2VsZi5fYXVkaW9VbmxvY2tlZCB8fCAhc2VsZi5jdHgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZWxmLl9hdWRpb1VubG9ja2VkID0gZmFsc2U7XG4gICAgICBzZWxmLmF1dG9VbmxvY2sgPSBmYWxzZTtcblxuICAgICAgLy8gU29tZSBtb2JpbGUgZGV2aWNlcy9wbGF0Zm9ybXMgaGF2ZSBkaXN0b3J0aW9uIGlzc3VlcyB3aGVuIG9wZW5pbmcvY2xvc2luZyB0YWJzIGFuZC9vciB3ZWIgdmlld3MuXG4gICAgICAvLyBCdWdzIGluIHRoZSBicm93c2VyIChlc3BlY2lhbGx5IE1vYmlsZSBTYWZhcmkpIGNhbiBjYXVzZSB0aGUgc2FtcGxlUmF0ZSB0byBjaGFuZ2UgZnJvbSA0NDEwMCB0byA0ODAwMC5cbiAgICAgIC8vIEJ5IGNhbGxpbmcgSG93bGVyLnVubG9hZCgpLCB3ZSBjcmVhdGUgYSBuZXcgQXVkaW9Db250ZXh0IHdpdGggdGhlIGNvcnJlY3Qgc2FtcGxlUmF0ZS5cbiAgICAgIGlmICghc2VsZi5fbW9iaWxlVW5sb2FkZWQgJiYgc2VsZi5jdHguc2FtcGxlUmF0ZSAhPT0gNDQxMDApIHtcbiAgICAgICAgc2VsZi5fbW9iaWxlVW5sb2FkZWQgPSB0cnVlO1xuICAgICAgICBzZWxmLnVubG9hZCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBTY3JhdGNoIGJ1ZmZlciBmb3IgZW5hYmxpbmcgaU9TIHRvIGRpc3Bvc2Ugb2Ygd2ViIGF1ZGlvIGJ1ZmZlcnMgY29ycmVjdGx5LCBhcyBwZXI6XG4gICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI0MTE5Njg0XG4gICAgICBzZWxmLl9zY3JhdGNoQnVmZmVyID0gc2VsZi5jdHguY3JlYXRlQnVmZmVyKDEsIDEsIDIyMDUwKTtcblxuICAgICAgLy8gQ2FsbCB0aGlzIG1ldGhvZCBvbiB0b3VjaCBzdGFydCB0byBjcmVhdGUgYW5kIHBsYXkgYSBidWZmZXIsXG4gICAgICAvLyB0aGVuIGNoZWNrIGlmIHRoZSBhdWRpbyBhY3R1YWxseSBwbGF5ZWQgdG8gZGV0ZXJtaW5lIGlmXG4gICAgICAvLyBhdWRpbyBoYXMgbm93IGJlZW4gdW5sb2NrZWQgb24gaU9TLCBBbmRyb2lkLCBldGMuXG4gICAgICB2YXIgdW5sb2NrID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBwb29sIG9mIHVubG9ja2VkIEhUTUw1IEF1ZGlvIG9iamVjdHMgdGhhdCBjYW5cbiAgICAgICAgLy8gYmUgdXNlZCBmb3IgcGxheWluZyBzb3VuZHMgd2l0aG91dCB1c2VyIGludGVyYWN0aW9uLiBIVE1MNVxuICAgICAgICAvLyBBdWRpbyBvYmplY3RzIG11c3QgYmUgaW5kaXZpZHVhbGx5IHVubG9ja2VkLCBhcyBvcHBvc2VkXG4gICAgICAgIC8vIHRvIHRoZSBXZWJBdWRpbyBBUEkgd2hpY2ggb25seSBuZWVkcyBhIHNpbmdsZSBhY3RpdmF0aW9uLlxuICAgICAgICAvLyBUaGlzIG11c3Qgb2NjdXIgYmVmb3JlIFdlYkF1ZGlvIHNldHVwIG9yIHRoZSBzb3VyY2Uub25lbmRlZFxuICAgICAgICAvLyBldmVudCB3aWxsIG5vdCBmaXJlLlxuICAgICAgICB3aGlsZSAoc2VsZi5faHRtbDVBdWRpb1Bvb2wubGVuZ3RoIDwgc2VsZi5odG1sNVBvb2xTaXplKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBhdWRpb05vZGUgPSBuZXcgQXVkaW8oKTtcblxuICAgICAgICAgICAgLy8gTWFyayB0aGlzIEF1ZGlvIG9iamVjdCBhcyB1bmxvY2tlZCB0byBlbnN1cmUgaXQgY2FuIGdldCByZXR1cm5lZFxuICAgICAgICAgICAgLy8gdG8gdGhlIHVubG9ja2VkIHBvb2wgd2hlbiByZWxlYXNlZC5cbiAgICAgICAgICAgIGF1ZGlvTm9kZS5fdW5sb2NrZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIGF1ZGlvIG5vZGUgdG8gdGhlIHBvb2wuXG4gICAgICAgICAgICBzZWxmLl9yZWxlYXNlSHRtbDVBdWRpbyhhdWRpb05vZGUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNlbGYubm9BdWRpbyA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb29wIHRocm91Z2ggYW55IGFzc2lnbmVkIGF1ZGlvIG5vZGVzIGFuZCB1bmxvY2sgdGhlbS5cbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFzZWxmLl9ob3dsc1tpXS5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICAgICAgICB2YXIgaWRzID0gc2VsZi5faG93bHNbaV0uX2dldFNvdW5kSWRzKCk7XG5cbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgc291bmRzIGFuZCB1bmxvY2sgdGhlIGF1ZGlvIG5vZGVzLlxuICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPGlkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9ob3dsc1tpXS5fc291bmRCeUlkKGlkc1tqXSk7XG5cbiAgICAgICAgICAgICAgaWYgKHNvdW5kICYmIHNvdW5kLl9ub2RlICYmICFzb3VuZC5fbm9kZS5fdW5sb2NrZWQpIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5fdW5sb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmxvYWQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpeCBBbmRyb2lkIGNhbiBub3QgcGxheSBpbiBzdXNwZW5kIHN0YXRlLlxuICAgICAgICBzZWxmLl9hdXRvUmVzdW1lKCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGJ1ZmZlci5cbiAgICAgICAgdmFyIHNvdXJjZSA9IHNlbGYuY3R4LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xuICAgICAgICBzb3VyY2UuYnVmZmVyID0gc2VsZi5fc2NyYXRjaEJ1ZmZlcjtcbiAgICAgICAgc291cmNlLmNvbm5lY3Qoc2VsZi5jdHguZGVzdGluYXRpb24pO1xuXG4gICAgICAgIC8vIFBsYXkgdGhlIGVtcHR5IGJ1ZmZlci5cbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2Uuc3RhcnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgc291cmNlLm5vdGVPbigwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3VyY2Uuc3RhcnQoMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsaW5nIHJlc3VtZSgpIG9uIGEgc3RhY2sgaW5pdGlhdGVkIGJ5IHVzZXIgZ2VzdHVyZSBpcyB3aGF0IGFjdHVhbGx5IHVubG9ja3MgdGhlIGF1ZGlvIG9uIEFuZHJvaWQgQ2hyb21lID49IDU1LlxuICAgICAgICBpZiAodHlwZW9mIHNlbGYuY3R4LnJlc3VtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNlbGYuY3R4LnJlc3VtZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0dXAgYSB0aW1lb3V0IHRvIGNoZWNrIHRoYXQgd2UgYXJlIHVubG9ja2VkIG9uIHRoZSBuZXh0IGV2ZW50IGxvb3AuXG4gICAgICAgIHNvdXJjZS5vbmVuZGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc291cmNlLmRpc2Nvbm5lY3QoMCk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgdGhlIHVubG9ja2VkIHN0YXRlIGFuZCBwcmV2ZW50IHRoaXMgY2hlY2sgZnJvbSBoYXBwZW5pbmcgYWdhaW4uXG4gICAgICAgICAgc2VsZi5fYXVkaW9VbmxvY2tlZCA9IHRydWU7XG5cbiAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRvdWNoIHN0YXJ0IGxpc3RlbmVyLlxuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB1bmxvY2ssIHRydWUpO1xuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdW5sb2NrLCB0cnVlKTtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHVubG9jaywgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBMZXQgYWxsIHNvdW5kcyBrbm93IHRoYXQgYXVkaW8gaGFzIGJlZW4gdW5sb2NrZWQuXG4gICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzZWxmLl9ob3dsc1tpXS5fZW1pdCgndW5sb2NrJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfTtcblxuICAgICAgLy8gU2V0dXAgYSB0b3VjaCBzdGFydCBsaXN0ZW5lciB0byBhdHRlbXB0IGFuIHVubG9jayBpbi5cbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB1bmxvY2ssIHRydWUpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB1bmxvY2ssIHRydWUpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1bmxvY2ssIHRydWUpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGFuIHVubG9ja2VkIEhUTUw1IEF1ZGlvIG9iamVjdCBmcm9tIHRoZSBwb29sLiBJZiBub25lIGFyZSBsZWZ0LFxuICAgICAqIHJldHVybiBhIG5ldyBBdWRpbyBvYmplY3QgYW5kIHRocm93IGEgd2FybmluZy5cbiAgICAgKiBAcmV0dXJuIHtBdWRpb30gSFRNTDUgQXVkaW8gb2JqZWN0LlxuICAgICAqL1xuICAgIF9vYnRhaW5IdG1sNUF1ZGlvOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgbmV4dCBvYmplY3QgZnJvbSB0aGUgcG9vbCBpZiBvbmUgZXhpc3RzLlxuICAgICAgaWYgKHNlbGYuX2h0bWw1QXVkaW9Qb29sLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc2VsZi5faHRtbDVBdWRpb1Bvb2wucG9wKCk7XG4gICAgICB9XG5cbiAgICAgIC8vLkNoZWNrIGlmIHRoZSBhdWRpbyBpcyBsb2NrZWQgYW5kIHRocm93IGEgd2FybmluZy5cbiAgICAgIHZhciB0ZXN0UGxheSA9IG5ldyBBdWRpbygpLnBsYXkoKTtcbiAgICAgIGlmICh0ZXN0UGxheSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgKHRlc3RQbGF5IGluc3RhbmNlb2YgUHJvbWlzZSB8fCB0eXBlb2YgdGVzdFBsYXkudGhlbiA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgdGVzdFBsYXkuY2F0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdIVE1MNSBBdWRpbyBwb29sIGV4aGF1c3RlZCwgcmV0dXJuaW5nIHBvdGVudGlhbGx5IGxvY2tlZCBhdWRpbyBvYmplY3QuJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEF1ZGlvKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBhY3RpdmF0ZWQgSFRNTDUgQXVkaW8gb2JqZWN0IHRvIHRoZSBwb29sLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfcmVsZWFzZUh0bWw1QXVkaW86IGZ1bmN0aW9uKGF1ZGlvKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBEb24ndCBhZGQgYXVkaW8gdG8gdGhlIHBvb2wgaWYgd2UgZG9uJ3Qga25vdyBpZiBpdCBoYXMgYmVlbiB1bmxvY2tlZC5cbiAgICAgIGlmIChhdWRpby5fdW5sb2NrZWQpIHtcbiAgICAgICAgc2VsZi5faHRtbDVBdWRpb1Bvb2wucHVzaChhdWRpbyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBdXRvbWF0aWNhbGx5IHN1c3BlbmQgdGhlIFdlYiBBdWRpbyBBdWRpb0NvbnRleHQgYWZ0ZXIgbm8gc291bmQgaGFzIHBsYXllZCBmb3IgMzAgc2Vjb25kcy5cbiAgICAgKiBUaGlzIHNhdmVzIHByb2Nlc3NpbmcvZW5lcmd5IGFuZCBmaXhlcyB2YXJpb3VzIGJyb3dzZXItc3BlY2lmaWMgYnVncyB3aXRoIGF1ZGlvIGdldHRpbmcgc3R1Y2suXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIF9hdXRvU3VzcGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmICghc2VsZi5hdXRvU3VzcGVuZCB8fCAhc2VsZi5jdHggfHwgdHlwZW9mIHNlbGYuY3R4LnN1c3BlbmQgPT09ICd1bmRlZmluZWQnIHx8ICFIb3dsZXIudXNpbmdXZWJBdWRpbykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFueSBzb3VuZHMgYXJlIHBsYXlpbmcuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNlbGYuX2hvd2xzW2ldLl93ZWJBdWRpbykge1xuICAgICAgICAgIGZvciAodmFyIGo9MDsgajxzZWxmLl9ob3dsc1tpXS5fc291bmRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoIXNlbGYuX2hvd2xzW2ldLl9zb3VuZHNbal0uX3BhdXNlZCkge1xuICAgICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGYuX3N1c3BlbmRUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5fc3VzcGVuZFRpbWVyKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gc291bmQgaGFzIHBsYXllZCBhZnRlciAzMCBzZWNvbmRzLCBzdXNwZW5kIHRoZSBjb250ZXh0LlxuICAgICAgc2VsZi5fc3VzcGVuZFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCFzZWxmLmF1dG9TdXNwZW5kKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5fc3VzcGVuZFRpbWVyID0gbnVsbDtcbiAgICAgICAgc2VsZi5zdGF0ZSA9ICdzdXNwZW5kaW5nJztcblxuICAgICAgICAvLyBIYW5kbGUgdXBkYXRpbmcgdGhlIHN0YXRlIG9mIHRoZSBhdWRpbyBjb250ZXh0IGFmdGVyIHN1c3BlbmRpbmcuXG4gICAgICAgIHZhciBoYW5kbGVTdXNwZW5zaW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5zdGF0ZSA9ICdzdXNwZW5kZWQnO1xuXG4gICAgICAgICAgaWYgKHNlbGYuX3Jlc3VtZUFmdGVyU3VzcGVuZCkge1xuICAgICAgICAgICAgZGVsZXRlIHNlbGYuX3Jlc3VtZUFmdGVyU3VzcGVuZDtcbiAgICAgICAgICAgIHNlbGYuX2F1dG9SZXN1bWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRWl0aGVyIHRoZSBzdGF0ZSBnZXRzIHN1c3BlbmRlZCBvciBpdCBpcyBpbnRlcnJ1cHRlZC5cbiAgICAgICAgLy8gRWl0aGVyIHdheSwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN0YXRlIHRvIHN1c3BlbmRlZC5cbiAgICAgICAgc2VsZi5jdHguc3VzcGVuZCgpLnRoZW4oaGFuZGxlU3VzcGVuc2lvbiwgaGFuZGxlU3VzcGVuc2lvbik7XG4gICAgICB9LCAzMDAwMCk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBdXRvbWF0aWNhbGx5IHJlc3VtZSB0aGUgV2ViIEF1ZGlvIEF1ZGlvQ29udGV4dCB3aGVuIGEgbmV3IHNvdW5kIGlzIHBsYXllZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgX2F1dG9SZXN1bWU6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBpZiAoIXNlbGYuY3R4IHx8IHR5cGVvZiBzZWxmLmN0eC5yZXN1bWUgPT09ICd1bmRlZmluZWQnIHx8ICFIb3dsZXIudXNpbmdXZWJBdWRpbykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLnN0YXRlID09PSAncnVubmluZycgJiYgc2VsZi5jdHguc3RhdGUgIT09ICdpbnRlcnJ1cHRlZCcgJiYgc2VsZi5fc3VzcGVuZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChzZWxmLl9zdXNwZW5kVGltZXIpO1xuICAgICAgICBzZWxmLl9zdXNwZW5kVGltZXIgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLnN0YXRlID09PSAnc3VzcGVuZGVkJyB8fCBzZWxmLnN0YXRlID09PSAncnVubmluZycgJiYgc2VsZi5jdHguc3RhdGUgPT09ICdpbnRlcnJ1cHRlZCcpIHtcbiAgICAgICAgc2VsZi5jdHgucmVzdW1lKCkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLnN0YXRlID0gJ3J1bm5pbmcnO1xuXG4gICAgICAgICAgLy8gRW1pdCB0byBhbGwgSG93bHMgdGhhdCB0aGUgYXVkaW8gaGFzIHJlc3VtZWQuXG4gICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzZWxmLl9ob3dsc1tpXS5fZW1pdCgncmVzdW1lJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc2VsZi5fc3VzcGVuZFRpbWVyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHNlbGYuX3N1c3BlbmRUaW1lcik7XG4gICAgICAgICAgc2VsZi5fc3VzcGVuZFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxmLnN0YXRlID09PSAnc3VzcGVuZGluZycpIHtcbiAgICAgICAgc2VsZi5fcmVzdW1lQWZ0ZXJTdXNwZW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuICB9O1xuXG4gIC8vIFNldHVwIHRoZSBnbG9iYWwgYXVkaW8gY29udHJvbGxlci5cbiAgdmFyIEhvd2xlciA9IG5ldyBIb3dsZXJHbG9iYWwoKTtcblxuICAvKiogR3JvdXAgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGF1ZGlvIGdyb3VwIGNvbnRyb2xsZXIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvIFBhc3NlZCBpbiBwcm9wZXJ0aWVzIGZvciB0aGlzIGdyb3VwLlxuICAgKi9cbiAgdmFyIEhvd2wgPSBmdW5jdGlvbihvKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gVGhyb3cgYW4gZXJyb3IgaWYgbm8gc291cmNlIGlzIHByb3ZpZGVkLlxuICAgIGlmICghby5zcmMgfHwgby5zcmMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdBbiBhcnJheSBvZiBzb3VyY2UgZmlsZXMgbXVzdCBiZSBwYXNzZWQgd2l0aCBhbnkgbmV3IEhvd2wuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VsZi5pbml0KG8pO1xuICB9O1xuICBIb3dsLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGEgbmV3IEhvd2wgZ3JvdXAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gbyBQYXNzZWQgaW4gcHJvcGVydGllcyBmb3IgdGhpcyBncm91cC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIGluaXQ6IGZ1bmN0aW9uKG8pIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBBdWRpb0NvbnRleHQgY3JlYXRlZCB5ZXQsIHJ1biB0aGUgc2V0dXAuXG4gICAgICBpZiAoIUhvd2xlci5jdHgpIHtcbiAgICAgICAgc2V0dXBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0dXAgdXNlci1kZWZpbmVkIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgIHNlbGYuX2F1dG9wbGF5ID0gby5hdXRvcGxheSB8fCBmYWxzZTtcbiAgICAgIHNlbGYuX2Zvcm1hdCA9ICh0eXBlb2Ygby5mb3JtYXQgIT09ICdzdHJpbmcnKSA/IG8uZm9ybWF0IDogW28uZm9ybWF0XTtcbiAgICAgIHNlbGYuX2h0bWw1ID0gby5odG1sNSB8fCBmYWxzZTtcbiAgICAgIHNlbGYuX211dGVkID0gby5tdXRlIHx8IGZhbHNlO1xuICAgICAgc2VsZi5fbG9vcCA9IG8ubG9vcCB8fCBmYWxzZTtcbiAgICAgIHNlbGYuX3Bvb2wgPSBvLnBvb2wgfHwgNTtcbiAgICAgIHNlbGYuX3ByZWxvYWQgPSAodHlwZW9mIG8ucHJlbG9hZCA9PT0gJ2Jvb2xlYW4nIHx8IG8ucHJlbG9hZCA9PT0gJ21ldGFkYXRhJykgPyBvLnByZWxvYWQgOiB0cnVlO1xuICAgICAgc2VsZi5fcmF0ZSA9IG8ucmF0ZSB8fCAxO1xuICAgICAgc2VsZi5fc3ByaXRlID0gby5zcHJpdGUgfHwge307XG4gICAgICBzZWxmLl9zcmMgPSAodHlwZW9mIG8uc3JjICE9PSAnc3RyaW5nJykgPyBvLnNyYyA6IFtvLnNyY107XG4gICAgICBzZWxmLl92b2x1bWUgPSBvLnZvbHVtZSAhPT0gdW5kZWZpbmVkID8gby52b2x1bWUgOiAxO1xuICAgICAgc2VsZi5feGhyID0ge1xuICAgICAgICBtZXRob2Q6IG8ueGhyICYmIG8ueGhyLm1ldGhvZCA/IG8ueGhyLm1ldGhvZCA6ICdHRVQnLFxuICAgICAgICBoZWFkZXJzOiBvLnhociAmJiBvLnhoci5oZWFkZXJzID8gby54aHIuaGVhZGVycyA6IG51bGwsXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogby54aHIgJiYgby54aHIud2l0aENyZWRlbnRpYWxzID8gby54aHIud2l0aENyZWRlbnRpYWxzIDogZmFsc2UsXG4gICAgICB9O1xuXG4gICAgICAvLyBTZXR1cCBhbGwgb3RoZXIgZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5fZHVyYXRpb24gPSAwO1xuICAgICAgc2VsZi5fc3RhdGUgPSAndW5sb2FkZWQnO1xuICAgICAgc2VsZi5fc291bmRzID0gW107XG4gICAgICBzZWxmLl9lbmRUaW1lcnMgPSB7fTtcbiAgICAgIHNlbGYuX3F1ZXVlID0gW107XG4gICAgICBzZWxmLl9wbGF5TG9jayA9IGZhbHNlO1xuXG4gICAgICAvLyBTZXR1cCBldmVudCBsaXN0ZW5lcnMuXG4gICAgICBzZWxmLl9vbmVuZCA9IG8ub25lbmQgPyBbe2ZuOiBvLm9uZW5kfV0gOiBbXTtcbiAgICAgIHNlbGYuX29uZmFkZSA9IG8ub25mYWRlID8gW3tmbjogby5vbmZhZGV9XSA6IFtdO1xuICAgICAgc2VsZi5fb25sb2FkID0gby5vbmxvYWQgPyBbe2ZuOiBvLm9ubG9hZH1dIDogW107XG4gICAgICBzZWxmLl9vbmxvYWRlcnJvciA9IG8ub25sb2FkZXJyb3IgPyBbe2ZuOiBvLm9ubG9hZGVycm9yfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucGxheWVycm9yID0gby5vbnBsYXllcnJvciA/IFt7Zm46IG8ub25wbGF5ZXJyb3J9XSA6IFtdO1xuICAgICAgc2VsZi5fb25wYXVzZSA9IG8ub25wYXVzZSA/IFt7Zm46IG8ub25wYXVzZX1dIDogW107XG4gICAgICBzZWxmLl9vbnBsYXkgPSBvLm9ucGxheSA/IFt7Zm46IG8ub25wbGF5fV0gOiBbXTtcbiAgICAgIHNlbGYuX29uc3RvcCA9IG8ub25zdG9wID8gW3tmbjogby5vbnN0b3B9XSA6IFtdO1xuICAgICAgc2VsZi5fb25tdXRlID0gby5vbm11dGUgPyBbe2ZuOiBvLm9ubXV0ZX1dIDogW107XG4gICAgICBzZWxmLl9vbnZvbHVtZSA9IG8ub252b2x1bWUgPyBbe2ZuOiBvLm9udm9sdW1lfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucmF0ZSA9IG8ub25yYXRlID8gW3tmbjogby5vbnJhdGV9XSA6IFtdO1xuICAgICAgc2VsZi5fb25zZWVrID0gby5vbnNlZWsgPyBbe2ZuOiBvLm9uc2Vla31dIDogW107XG4gICAgICBzZWxmLl9vbnVubG9jayA9IG8ub251bmxvY2sgPyBbe2ZuOiBvLm9udW5sb2NrfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucmVzdW1lID0gW107XG5cbiAgICAgIC8vIFdlYiBBdWRpbyBvciBIVE1MNSBBdWRpbz9cbiAgICAgIHNlbGYuX3dlYkF1ZGlvID0gSG93bGVyLnVzaW5nV2ViQXVkaW8gJiYgIXNlbGYuX2h0bWw1O1xuXG4gICAgICAvLyBBdXRvbWF0aWNhbGx5IHRyeSB0byBlbmFibGUgYXVkaW8uXG4gICAgICBpZiAodHlwZW9mIEhvd2xlci5jdHggIT09ICd1bmRlZmluZWQnICYmIEhvd2xlci5jdHggJiYgSG93bGVyLmF1dG9VbmxvY2spIHtcbiAgICAgICAgSG93bGVyLl91bmxvY2tBdWRpbygpO1xuICAgICAgfVxuXG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoaXMgSG93bCBncm91cCBpbiB0aGUgZ2xvYmFsIGNvbnRyb2xsZXIuXG4gICAgICBIb3dsZXIuX2hvd2xzLnB1c2goc2VsZik7XG5cbiAgICAgIC8vIElmIHRoZXkgc2VsZWN0ZWQgYXV0b3BsYXksIGFkZCBhIHBsYXkgZXZlbnQgdG8gdGhlIGxvYWQgcXVldWUuXG4gICAgICBpZiAoc2VsZi5fYXV0b3BsYXkpIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdwbGF5JyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5wbGF5KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZCB0aGUgc291cmNlIGZpbGUgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuXG4gICAgICBpZiAoc2VsZi5fcHJlbG9hZCAmJiBzZWxmLl9wcmVsb2FkICE9PSAnbm9uZScpIHtcbiAgICAgICAgc2VsZi5sb2FkKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSBhdWRpbyBmaWxlLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBsb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciB1cmwgPSBudWxsO1xuXG4gICAgICAvLyBJZiBubyBhdWRpbyBpcyBhdmFpbGFibGUsIHF1aXQgaW1tZWRpYXRlbHkuXG4gICAgICBpZiAoSG93bGVyLm5vQXVkaW8pIHtcbiAgICAgICAgc2VsZi5fZW1pdCgnbG9hZGVycm9yJywgbnVsbCwgJ05vIGF1ZGlvIHN1cHBvcnQuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIG91ciBzb3VyY2UgaXMgaW4gYW4gYXJyYXkuXG4gICAgICBpZiAodHlwZW9mIHNlbGYuX3NyYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2VsZi5fc3JjID0gW3NlbGYuX3NyY107XG4gICAgICB9XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgc291cmNlcyBhbmQgcGljayB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgY29tcGF0aWJsZS5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9zcmMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGV4dCwgc3RyO1xuXG4gICAgICAgIGlmIChzZWxmLl9mb3JtYXQgJiYgc2VsZi5fZm9ybWF0W2ldKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXh0ZW5zaW9uIHdhcyBzcGVjaWZpZWQsIHVzZSB0aGF0IGluc3RlYWQuXG4gICAgICAgICAgZXh0ID0gc2VsZi5fZm9ybWF0W2ldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc291cmNlIGlzIGEgc3RyaW5nLlxuICAgICAgICAgIHN0ciA9IHNlbGYuX3NyY1tpXTtcbiAgICAgICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHNlbGYuX2VtaXQoJ2xvYWRlcnJvcicsIG51bGwsICdOb24tc3RyaW5nIGZvdW5kIGluIHNlbGVjdGVkIGF1ZGlvIHNvdXJjZXMgLSBpZ25vcmluZy4nKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIGZpbGUgZXh0ZW5zaW9uIGZyb20gdGhlIFVSTCBvciBiYXNlNjQgZGF0YSBVUkkuXG4gICAgICAgICAgZXh0ID0gL15kYXRhOmF1ZGlvXFwvKFteOyxdKyk7L2kuZXhlYyhzdHIpO1xuICAgICAgICAgIGlmICghZXh0KSB7XG4gICAgICAgICAgICBleHQgPSAvXFwuKFteLl0rKSQvLmV4ZWMoc3RyLnNwbGl0KCc/JywgMSlbMF0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgIGV4dCA9IGV4dFsxXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvZyBhIHdhcm5pbmcgaWYgbm8gZXh0ZW5zaW9uIHdhcyBmb3VuZC5cbiAgICAgICAgaWYgKCFleHQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIGZpbGUgZXh0ZW5zaW9uIHdhcyBmb3VuZC4gQ29uc2lkZXIgdXNpbmcgdGhlIFwiZm9ybWF0XCIgcHJvcGVydHkgb3Igc3BlY2lmeSBhbiBleHRlbnNpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGV4dGVuc2lvbiBpcyBhdmFpbGFibGUuXG4gICAgICAgIGlmIChleHQgJiYgSG93bGVyLmNvZGVjcyhleHQpKSB7XG4gICAgICAgICAgdXJsID0gc2VsZi5fc3JjW2ldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHNlbGYuX2VtaXQoJ2xvYWRlcnJvcicsIG51bGwsICdObyBjb2RlYyBzdXBwb3J0IGZvciBzZWxlY3RlZCBhdWRpbyBzb3VyY2VzLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbGYuX3NyYyA9IHVybDtcbiAgICAgIHNlbGYuX3N0YXRlID0gJ2xvYWRpbmcnO1xuXG4gICAgICAvLyBJZiB0aGUgaG9zdGluZyBwYWdlIGlzIEhUVFBTIGFuZCB0aGUgc291cmNlIGlzbid0LFxuICAgICAgLy8gZHJvcCBkb3duIHRvIEhUTUw1IEF1ZGlvIHRvIGF2b2lkIE1peGVkIENvbnRlbnQgZXJyb3JzLlxuICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgJiYgdXJsLnNsaWNlKDAsIDUpID09PSAnaHR0cDonKSB7XG4gICAgICAgIHNlbGYuX2h0bWw1ID0gdHJ1ZTtcbiAgICAgICAgc2VsZi5fd2ViQXVkaW8gPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHNvdW5kIG9iamVjdCBhbmQgYWRkIGl0IHRvIHRoZSBwb29sLlxuICAgICAgbmV3IFNvdW5kKHNlbGYpO1xuXG4gICAgICAvLyBMb2FkIGFuZCBkZWNvZGUgdGhlIGF1ZGlvIGRhdGEgZm9yIHBsYXliYWNrLlxuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgIGxvYWRCdWZmZXIoc2VsZik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQbGF5IGEgc291bmQgb3IgcmVzdW1lIHByZXZpb3VzIHBsYXliYWNrLlxuICAgICAqIEBwYXJhbSAge1N0cmluZy9OdW1iZXJ9IHNwcml0ZSAgIFNwcml0ZSBuYW1lIGZvciBzcHJpdGUgcGxheWJhY2sgb3Igc291bmQgaWQgdG8gY29udGludWUgcHJldmlvdXMuXG4gICAgICogQHBhcmFtICB7Qm9vbGVhbn0gaW50ZXJuYWwgSW50ZXJuYWwgVXNlOiB0cnVlIHByZXZlbnRzIGV2ZW50IGZpcmluZy5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgIFNvdW5kIElELlxuICAgICAqL1xuICAgIHBsYXk6IGZ1bmN0aW9uKHNwcml0ZSwgaW50ZXJuYWwpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBpZCA9IG51bGw7XG5cbiAgICAgIC8vIERldGVybWluZSBpZiBhIHNwcml0ZSwgc291bmQgaWQgb3Igbm90aGluZyB3YXMgcGFzc2VkXG4gICAgICBpZiAodHlwZW9mIHNwcml0ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWQgPSBzcHJpdGU7XG4gICAgICAgIHNwcml0ZSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcHJpdGUgPT09ICdzdHJpbmcnICYmIHNlbGYuX3N0YXRlID09PSAnbG9hZGVkJyAmJiAhc2VsZi5fc3ByaXRlW3Nwcml0ZV0pIHtcbiAgICAgICAgLy8gSWYgdGhlIHBhc3NlZCBzcHJpdGUgZG9lc24ndCBleGlzdCwgZG8gbm90aGluZy5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcHJpdGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBzb3VuZCBzcHJpdGUgKHBsYXlzIHRoZSBmdWxsIGF1ZGlvIGxlbmd0aCkuXG4gICAgICAgIHNwcml0ZSA9ICdfX2RlZmF1bHQnO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgc2luZ2xlIHBhdXNlZCBzb3VuZCB0aGF0IGlzbid0IGVuZGVkLlxuICAgICAgICAvLyBJZiB0aGVyZSBpcywgcGxheSB0aGF0IHNvdW5kLiBJZiBub3QsIGNvbnRpbnVlIGFzIHVzdWFsLlxuICAgICAgICBpZiAoIXNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgICAgdmFyIG51bSA9IDA7XG4gICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHNlbGYuX3NvdW5kc1tpXS5fcGF1c2VkICYmICFzZWxmLl9zb3VuZHNbaV0uX2VuZGVkKSB7XG4gICAgICAgICAgICAgIG51bSsrO1xuICAgICAgICAgICAgICBpZCA9IHNlbGYuX3NvdW5kc1tpXS5faWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG51bSA9PT0gMSkge1xuICAgICAgICAgICAgc3ByaXRlID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIHNlbGVjdGVkIG5vZGUsIG9yIGdldCBvbmUgZnJvbSB0aGUgcG9vbC5cbiAgICAgIHZhciBzb3VuZCA9IGlkID8gc2VsZi5fc291bmRCeUlkKGlkKSA6IHNlbGYuX2luYWN0aXZlU291bmQoKTtcblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGRvZXNuJ3QgZXhpc3QsIGRvIG5vdGhpbmcuXG4gICAgICBpZiAoIXNvdW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBTZWxlY3QgdGhlIHNwcml0ZSBkZWZpbml0aW9uLlxuICAgICAgaWYgKGlkICYmICFzcHJpdGUpIHtcbiAgICAgICAgc3ByaXRlID0gc291bmQuX3Nwcml0ZSB8fCAnX19kZWZhdWx0JztcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIHdlIG11c3Qgd2FpdCB0byBnZXQgdGhlIGF1ZGlvJ3MgZHVyYXRpb24uXG4gICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gd2FpdCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgcnVuIGludG8gcmFjZSBjb25kaXRpb25zIHdpdGhcbiAgICAgIC8vIHRoZSBvcmRlciBvZiBmdW5jdGlvbiBjYWxscy5cbiAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgLy8gU2V0IHRoZSBzcHJpdGUgdmFsdWUgb24gdGhpcyBzb3VuZC5cbiAgICAgICAgc291bmQuX3Nwcml0ZSA9IHNwcml0ZTtcblxuICAgICAgICAvLyBNYXJrIHRoaXMgc291bmQgYXMgbm90IGVuZGVkIGluIGNhc2UgYW5vdGhlciBzb3VuZCBpcyBwbGF5ZWQgYmVmb3JlIHRoaXMgb25lIGxvYWRzLlxuICAgICAgICBzb3VuZC5fZW5kZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBBZGQgdGhlIHNvdW5kIHRvIHRoZSBxdWV1ZSB0byBiZSBwbGF5ZWQgb24gbG9hZC5cbiAgICAgICAgdmFyIHNvdW5kSWQgPSBzb3VuZC5faWQ7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAncGxheScsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYucGxheShzb3VuZElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzb3VuZElkO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBwbGF5IHRoZSBzb3VuZCBpZiBhbiBpZCB3YXMgcGFzc2VkIGFuZCBpdCBpcyBhbHJlYWR5IHBsYXlpbmcuXG4gICAgICBpZiAoaWQgJiYgIXNvdW5kLl9wYXVzZWQpIHtcbiAgICAgICAgLy8gVHJpZ2dlciB0aGUgcGxheSBldmVudCwgaW4gb3JkZXIgdG8ga2VlcCBpdGVyYXRpbmcgdGhyb3VnaCBxdWV1ZS5cbiAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgIHNlbGYuX2xvYWRRdWV1ZSgncGxheScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNvdW5kLl9pZDtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIHRoZSBBdWRpb0NvbnRleHQgaXNuJ3Qgc3VzcGVuZGVkLCBhbmQgcmVzdW1lIGl0IGlmIGl0IGlzLlxuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgIEhvd2xlci5fYXV0b1Jlc3VtZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBEZXRlcm1pbmUgaG93IGxvbmcgdG8gcGxheSBmb3IgYW5kIHdoZXJlIHRvIHN0YXJ0IHBsYXlpbmcuXG4gICAgICB2YXIgc2VlayA9IE1hdGgubWF4KDAsIHNvdW5kLl9zZWVrID4gMCA/IHNvdW5kLl9zZWVrIDogc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMF0gLyAxMDAwKTtcbiAgICAgIHZhciBkdXJhdGlvbiA9IE1hdGgubWF4KDAsICgoc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMF0gKyBzZWxmLl9zcHJpdGVbc3ByaXRlXVsxXSkgLyAxMDAwKSAtIHNlZWspO1xuICAgICAgdmFyIHRpbWVvdXQgPSAoZHVyYXRpb24gKiAxMDAwKSAvIE1hdGguYWJzKHNvdW5kLl9yYXRlKTtcbiAgICAgIHZhciBzdGFydCA9IHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzBdIC8gMTAwMDtcbiAgICAgIHZhciBzdG9wID0gKHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzBdICsgc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMV0pIC8gMTAwMDtcbiAgICAgIHNvdW5kLl9zcHJpdGUgPSBzcHJpdGU7XG5cbiAgICAgIC8vIE1hcmsgdGhlIHNvdW5kIGFzIGVuZGVkIGluc3RhbnRseSBzbyB0aGF0IHRoaXMgYXN5bmMgcGxheWJhY2tcbiAgICAgIC8vIGRvZXNuJ3QgZ2V0IGdyYWJiZWQgYnkgYW5vdGhlciBjYWxsIHRvIHBsYXkgd2hpbGUgdGhpcyBvbmUgd2FpdHMgdG8gc3RhcnQuXG4gICAgICBzb3VuZC5fZW5kZWQgPSBmYWxzZTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBzb3VuZC5cbiAgICAgIHZhciBzZXRQYXJhbXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgc291bmQuX3BhdXNlZCA9IGZhbHNlO1xuICAgICAgICBzb3VuZC5fc2VlayA9IHNlZWs7XG4gICAgICAgIHNvdW5kLl9zdGFydCA9IHN0YXJ0O1xuICAgICAgICBzb3VuZC5fc3RvcCA9IHN0b3A7XG4gICAgICAgIHNvdW5kLl9sb29wID0gISEoc291bmQuX2xvb3AgfHwgc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMl0pO1xuICAgICAgfTtcblxuICAgICAgLy8gRW5kIHRoZSBzb3VuZCBpbnN0YW50bHkgaWYgc2VlayBpcyBhdCB0aGUgZW5kLlxuICAgICAgaWYgKHNlZWsgPj0gc3RvcCkge1xuICAgICAgICBzZWxmLl9lbmRlZChzb3VuZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQmVnaW4gdGhlIGFjdHVhbCBwbGF5YmFjay5cbiAgICAgIHZhciBub2RlID0gc291bmQuX25vZGU7XG4gICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgLy8gRmlyZSB0aGlzIHdoZW4gdGhlIHNvdW5kIGlzIHJlYWR5IHRvIHBsYXkgdG8gYmVnaW4gV2ViIEF1ZGlvIHBsYXliYWNrLlxuICAgICAgICB2YXIgcGxheVdlYkF1ZGlvID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSBmYWxzZTtcbiAgICAgICAgICBzZXRQYXJhbXMoKTtcbiAgICAgICAgICBzZWxmLl9yZWZyZXNoQnVmZmVyKHNvdW5kKTtcblxuICAgICAgICAgIC8vIFNldHVwIHRoZSBwbGF5YmFjayBwYXJhbXMuXG4gICAgICAgICAgdmFyIHZvbCA9IChzb3VuZC5fbXV0ZWQgfHwgc2VsZi5fbXV0ZWQpID8gMCA6IHNvdW5kLl92b2x1bWU7XG4gICAgICAgICAgbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKHZvbCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgc291bmQuX3BsYXlTdGFydCA9IEhvd2xlci5jdHguY3VycmVudFRpbWU7XG5cbiAgICAgICAgICAvLyBQbGF5IHRoZSBzb3VuZCB1c2luZyB0aGUgc3VwcG9ydGVkIG1ldGhvZC5cbiAgICAgICAgICBpZiAodHlwZW9mIG5vZGUuYnVmZmVyU291cmNlLnN0YXJ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc291bmQuX2xvb3AgPyBub2RlLmJ1ZmZlclNvdXJjZS5ub3RlR3JhaW5PbigwLCBzZWVrLCA4NjQwMCkgOiBub2RlLmJ1ZmZlclNvdXJjZS5ub3RlR3JhaW5PbigwLCBzZWVrLCBkdXJhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvdW5kLl9sb29wID8gbm9kZS5idWZmZXJTb3VyY2Uuc3RhcnQoMCwgc2VlaywgODY0MDApIDogbm9kZS5idWZmZXJTb3VyY2Uuc3RhcnQoMCwgc2VlaywgZHVyYXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3IHRpbWVyIGlmIG5vbmUgaXMgcHJlc2VudC5cbiAgICAgICAgICBpZiAodGltZW91dCAhPT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdID0gc2V0VGltZW91dChzZWxmLl9lbmRlZC5iaW5kKHNlbGYsIHNvdW5kKSwgdGltZW91dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgc2VsZi5fZW1pdCgncGxheScsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgICAgIHNlbGYuX2xvYWRRdWV1ZSgpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChIb3dsZXIuc3RhdGUgPT09ICdydW5uaW5nJyAmJiBIb3dsZXIuY3R4LnN0YXRlICE9PSAnaW50ZXJydXB0ZWQnKSB7XG4gICAgICAgICAgcGxheVdlYkF1ZGlvKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGF1ZGlvIGNvbnRleHQgdG8gcmVzdW1lIGJlZm9yZSBwbGF5aW5nLlxuICAgICAgICAgIHNlbGYub25jZSgncmVzdW1lJywgcGxheVdlYkF1ZGlvKTtcblxuICAgICAgICAgIC8vIENhbmNlbCB0aGUgZW5kIHRpbWVyLlxuICAgICAgICAgIHNlbGYuX2NsZWFyVGltZXIoc291bmQuX2lkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmlyZSB0aGlzIHdoZW4gdGhlIHNvdW5kIGlzIHJlYWR5IHRvIHBsYXkgdG8gYmVnaW4gSFRNTDUgQXVkaW8gcGxheWJhY2suXG4gICAgICAgIHZhciBwbGF5SHRtbDUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBub2RlLmN1cnJlbnRUaW1lID0gc2VlaztcbiAgICAgICAgICBub2RlLm11dGVkID0gc291bmQuX211dGVkIHx8IHNlbGYuX211dGVkIHx8IEhvd2xlci5fbXV0ZWQgfHwgbm9kZS5tdXRlZDtcbiAgICAgICAgICBub2RlLnZvbHVtZSA9IHNvdW5kLl92b2x1bWUgKiBIb3dsZXIudm9sdW1lKCk7XG4gICAgICAgICAgbm9kZS5wbGF5YmFja1JhdGUgPSBzb3VuZC5fcmF0ZTtcblxuICAgICAgICAgIC8vIFNvbWUgYnJvd3NlcnMgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGlzIGlzIGNhbGxlZCB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBwbGF5ID0gbm9kZS5wbGF5KCk7XG5cbiAgICAgICAgICAgIC8vIFN1cHBvcnQgb2xkZXIgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHByb21pc2VzLCBhbmQgdGh1cyBkb24ndCBoYXZlIHRoaXMgaXNzdWUuXG4gICAgICAgICAgICBpZiAocGxheSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgKHBsYXkgaW5zdGFuY2VvZiBQcm9taXNlIHx8IHR5cGVvZiBwbGF5LnRoZW4gPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgICAgIC8vIEltcGxlbWVudHMgYSBsb2NrIHRvIHByZXZlbnQgRE9NRXhjZXB0aW9uOiBUaGUgcGxheSgpIHJlcXVlc3Qgd2FzIGludGVycnVwdGVkIGJ5IGEgY2FsbCB0byBwYXVzZSgpLlxuICAgICAgICAgICAgICBzZWxmLl9wbGF5TG9jayA9IHRydWU7XG5cbiAgICAgICAgICAgICAgLy8gU2V0IHBhcmFtIHZhbHVlcyBpbW1lZGlhdGVseS5cbiAgICAgICAgICAgICAgc2V0UGFyYW1zKCk7XG5cbiAgICAgICAgICAgICAgLy8gUmVsZWFzZXMgdGhlIGxvY2sgYW5kIGV4ZWN1dGVzIHF1ZXVlZCBhY3Rpb25zLlxuICAgICAgICAgICAgICBwbGF5XG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLl9wbGF5TG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgbm9kZS5fdW5sb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbWl0KCdwbGF5Jywgc291bmQuX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9hZFF1ZXVlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLl9wbGF5TG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgc2VsZi5fZW1pdCgncGxheWVycm9yJywgc291bmQuX2lkLCAnUGxheWJhY2sgd2FzIHVuYWJsZSB0byBzdGFydC4gVGhpcyBpcyBtb3N0IGNvbW1vbmx5IGFuIGlzc3VlICcgK1xuICAgICAgICAgICAgICAgICAgICAnb24gbW9iaWxlIGRldmljZXMgYW5kIENocm9tZSB3aGVyZSBwbGF5YmFjayB3YXMgbm90IHdpdGhpbiBhIHVzZXIgaW50ZXJhY3Rpb24uJyk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlbmRlZCBhbmQgcGF1c2VkIHZhbHVlcy5cbiAgICAgICAgICAgICAgICAgIHNvdW5kLl9lbmRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBzb3VuZC5fcGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWludGVybmFsKSB7XG4gICAgICAgICAgICAgIHNlbGYuX3BsYXlMb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgIHNldFBhcmFtcygpO1xuICAgICAgICAgICAgICBzZWxmLl9lbWl0KCdwbGF5Jywgc291bmQuX2lkKTtcbiAgICAgICAgICAgICAgc2VsZi5fbG9hZFF1ZXVlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldHRpbmcgcmF0ZSBiZWZvcmUgcGxheWluZyB3b24ndCB3b3JrIGluIElFLCBzbyB3ZSBzZXQgaXQgYWdhaW4gaGVyZS5cbiAgICAgICAgICAgIG5vZGUucGxheWJhY2tSYXRlID0gc291bmQuX3JhdGU7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIHN0aWxsIHBhdXNlZCwgdGhlbiB3ZSBjYW4gYXNzdW1lIHRoZXJlIHdhcyBhIHBsYXliYWNrIGlzc3VlLlxuICAgICAgICAgICAgaWYgKG5vZGUucGF1c2VkKSB7XG4gICAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3BsYXllcnJvcicsIHNvdW5kLl9pZCwgJ1BsYXliYWNrIHdhcyB1bmFibGUgdG8gc3RhcnQuIFRoaXMgaXMgbW9zdCBjb21tb25seSBhbiBpc3N1ZSAnICtcbiAgICAgICAgICAgICAgICAnb24gbW9iaWxlIGRldmljZXMgYW5kIENocm9tZSB3aGVyZSBwbGF5YmFjayB3YXMgbm90IHdpdGhpbiBhIHVzZXIgaW50ZXJhY3Rpb24uJyk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0dXAgdGhlIGVuZCB0aW1lciBvbiBzcHJpdGVzIG9yIGxpc3RlbiBmb3IgdGhlIGVuZGVkIGV2ZW50LlxuICAgICAgICAgICAgaWYgKHNwcml0ZSAhPT0gJ19fZGVmYXVsdCcgfHwgc291bmQuX2xvb3ApIHtcbiAgICAgICAgICAgICAgc2VsZi5fZW5kVGltZXJzW3NvdW5kLl9pZF0gPSBzZXRUaW1lb3V0KHNlbGYuX2VuZGVkLmJpbmQoc2VsZiwgc291bmQpLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZSBlbmRlZCBvbiB0aGlzIGF1ZGlvIG5vZGUuXG4gICAgICAgICAgICAgICAgc2VsZi5fZW5kZWQoc291bmQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhpcyBsaXN0ZW5lci5cbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc2VsZi5fZW5kVGltZXJzW3NvdW5kLl9pZF0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBzZWxmLl9lbWl0KCdwbGF5ZXJyb3InLCBzb3VuZC5faWQsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgc3RyZWFtaW5nIGF1ZGlvLCBtYWtlIHN1cmUgdGhlIHNyYyBpcyBzZXQgYW5kIGxvYWQgYWdhaW4uXG4gICAgICAgIGlmIChub2RlLnNyYyA9PT0gJ2RhdGE6YXVkaW8vd2F2O2Jhc2U2NCxVa2xHUmlnQUFBQlhRVlpGWm0xMElCSUFBQUFCQUFFQVJLd0FBSWhZQVFBQ0FCQUFBQUJrWVhSaEFnQUFBQUVBJykge1xuICAgICAgICAgIG5vZGUuc3JjID0gc2VsZi5fc3JjO1xuICAgICAgICAgIG5vZGUubG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGxheSBpbW1lZGlhdGVseSBpZiByZWFkeSwgb3Igd2FpdCBmb3IgdGhlICdjYW5wbGF5dGhyb3VnaCdlIHZlbnQuXG4gICAgICAgIHZhciBsb2FkZWROb1JlYWR5U3RhdGUgPSAod2luZG93ICYmIHdpbmRvdy5lamVjdGEpIHx8ICghbm9kZS5yZWFkeVN0YXRlICYmIEhvd2xlci5fbmF2aWdhdG9yLmlzQ29jb29uSlMpO1xuICAgICAgICBpZiAobm9kZS5yZWFkeVN0YXRlID49IDMgfHwgbG9hZGVkTm9SZWFkeVN0YXRlKSB7XG4gICAgICAgICAgcGxheUh0bWw1KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSB0cnVlO1xuXG4gICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBCZWdpbiBwbGF5YmFjay5cbiAgICAgICAgICAgIHBsYXlIdG1sNSgpO1xuXG4gICAgICAgICAgICAvLyBDbGVhciB0aGlzIGxpc3RlbmVyLlxuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBsaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBsaXN0ZW5lciwgZmFsc2UpO1xuXG4gICAgICAgICAgLy8gQ2FuY2VsIHRoZSBlbmQgdGltZXIuXG4gICAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihzb3VuZC5faWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzb3VuZC5faWQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBhdXNlIHBsYXliYWNrIGFuZCBzYXZlIGN1cnJlbnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBUaGUgc291bmQgSUQgKGVtcHR5IHRvIHBhdXNlIGFsbCBpbiBncm91cCkuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBwYXVzZTogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQgb3IgYSBwbGF5KCkgcHJvbWlzZSBpcyBwZW5kaW5nLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gcGF1c2Ugd2hlbiBjYXBhYmxlLlxuICAgICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJyB8fCBzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogJ3BhdXNlJyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5wYXVzZShpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gaWQgaXMgcGFzc2VkLCBnZXQgYWxsIElEJ3MgdG8gYmUgcGF1c2VkLlxuICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcblxuICAgICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBDbGVhciB0aGUgZW5kIHRpbWVyLlxuICAgICAgICBzZWxmLl9jbGVhclRpbWVyKGlkc1tpXSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgICAgaWYgKHNvdW5kICYmICFzb3VuZC5fcGF1c2VkKSB7XG4gICAgICAgICAgLy8gUmVzZXQgdGhlIHNlZWsgcG9zaXRpb24uXG4gICAgICAgICAgc291bmQuX3NlZWsgPSBzZWxmLnNlZWsoaWRzW2ldKTtcbiAgICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSAwO1xuICAgICAgICAgIHNvdW5kLl9wYXVzZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gU3RvcCBjdXJyZW50bHkgcnVubmluZyBmYWRlcy5cbiAgICAgICAgICBzZWxmLl9zdG9wRmFkZShpZHNbaV0pO1xuXG4gICAgICAgICAgaWYgKHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzb3VuZCBoYXMgYmVlbiBjcmVhdGVkLlxuICAgICAgICAgICAgICBpZiAoIXNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uuc3RvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uubm90ZU9mZigwKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uuc3RvcCgwKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSBidWZmZXIgc291cmNlLlxuICAgICAgICAgICAgICBzZWxmLl9jbGVhbkJ1ZmZlcihzb3VuZC5fbm9kZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc05hTihzb3VuZC5fbm9kZS5kdXJhdGlvbikgfHwgc291bmQuX25vZGUuZHVyYXRpb24gPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLnBhdXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyZSB0aGUgcGF1c2UgZXZlbnQsIHVubGVzcyBgdHJ1ZWAgaXMgcGFzc2VkIGFzIHRoZSAybmQgYXJndW1lbnQuXG4gICAgICAgIGlmICghYXJndW1lbnRzWzFdKSB7XG4gICAgICAgICAgc2VsZi5fZW1pdCgncGF1c2UnLCBzb3VuZCA/IHNvdW5kLl9pZCA6IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdG9wIHBsYXliYWNrIGFuZCByZXNldCB0byBzdGFydC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIFRoZSBzb3VuZCBJRCAoZW1wdHkgdG8gc3RvcCBhbGwgaW4gZ3JvdXApLlxuICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IGludGVybmFsIEludGVybmFsIFVzZTogdHJ1ZSBwcmV2ZW50cyBldmVudCBmaXJpbmcuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBzdG9wOiBmdW5jdGlvbihpZCwgaW50ZXJuYWwpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBzdG9wIHdoZW4gY2FwYWJsZS5cbiAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcgfHwgc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdzdG9wJyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5zdG9wKGlkLCBpbnRlcm5hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gaWQgaXMgcGFzc2VkLCBnZXQgYWxsIElEJ3MgdG8gYmUgc3RvcHBlZC5cbiAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGVuZCB0aW1lci5cbiAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihpZHNbaV0pO1xuXG4gICAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAgIC8vIFJlc2V0IHRoZSBzZWVrIHBvc2l0aW9uLlxuICAgICAgICAgIHNvdW5kLl9zZWVrID0gc291bmQuX3N0YXJ0IHx8IDA7XG4gICAgICAgICAgc291bmQuX3JhdGVTZWVrID0gMDtcbiAgICAgICAgICBzb3VuZC5fcGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgICBzb3VuZC5fZW5kZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gU3RvcCBjdXJyZW50bHkgcnVubmluZyBmYWRlcy5cbiAgICAgICAgICBzZWxmLl9zdG9wRmFkZShpZHNbaV0pO1xuXG4gICAgICAgICAgaWYgKHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzb3VuZCdzIEF1ZGlvQnVmZmVyU291cmNlTm9kZSBoYXMgYmVlbiBjcmVhdGVkLlxuICAgICAgICAgICAgICBpZiAoc291bmQuX25vZGUuYnVmZmVyU291cmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uuc3RvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5ub3RlT2ZmKDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uuc3RvcCgwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgYnVmZmVyIHNvdXJjZS5cbiAgICAgICAgICAgICAgICBzZWxmLl9jbGVhbkJ1ZmZlcihzb3VuZC5fbm9kZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzTmFOKHNvdW5kLl9ub2RlLmR1cmF0aW9uKSB8fCBzb3VuZC5fbm9kZS5kdXJhdGlvbiA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUuY3VycmVudFRpbWUgPSBzb3VuZC5fc3RhcnQgfHwgMDtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUucGF1c2UoKTtcblxuICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGl2ZSBzdHJlYW0sIHN0b3AgZG93bmxvYWQgb25jZSB0aGUgYXVkaW8gaXMgc3RvcHBlZC5cbiAgICAgICAgICAgICAgaWYgKHNvdW5kLl9ub2RlLmR1cmF0aW9uID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgICAgIHNlbGYuX2NsZWFyU291bmQoc291bmQuX25vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgICAgc2VsZi5fZW1pdCgnc3RvcCcsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNdXRlL3VubXV0ZSBhIHNpbmdsZSBzb3VuZCBvciBhbGwgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICAgKiBAcGFyYW0gIHtCb29sZWFufSBtdXRlZCBTZXQgdG8gdHJ1ZSB0byBtdXRlIGFuZCBmYWxzZSB0byB1bm11dGUuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAgICBUaGUgc291bmQgSUQgdG8gdXBkYXRlIChvbWl0IHRvIG11dGUvdW5tdXRlIGFsbCkuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBtdXRlOiBmdW5jdGlvbihtdXRlZCwgaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBtdXRlIHdoZW4gY2FwYWJsZS5cbiAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCd8fCBzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogJ211dGUnLFxuICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLm11dGUobXV0ZWQsIGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBhcHBseWluZyBtdXRlL3VubXV0ZSB0byBhbGwgc291bmRzLCB1cGRhdGUgdGhlIGdyb3VwJ3MgdmFsdWUuXG4gICAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAodHlwZW9mIG11dGVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBzZWxmLl9tdXRlZCA9IG11dGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzZWxmLl9tdXRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBpZCBpcyBwYXNzZWQsIGdldCBhbGwgSUQncyB0byBiZSBtdXRlZC5cbiAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgICAgc291bmQuX211dGVkID0gbXV0ZWQ7XG5cbiAgICAgICAgICAvLyBDYW5jZWwgYWN0aXZlIGZhZGUgYW5kIHNldCB0aGUgdm9sdW1lIHRvIHRoZSBlbmQgdmFsdWUuXG4gICAgICAgICAgaWYgKHNvdW5kLl9pbnRlcnZhbCkge1xuICAgICAgICAgICAgc2VsZi5fc3RvcEZhZGUoc291bmQuX2lkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8gJiYgc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUobXV0ZWQgPyAwIDogc291bmQuX3ZvbHVtZSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgc291bmQuX25vZGUubXV0ZWQgPSBIb3dsZXIuX211dGVkID8gdHJ1ZSA6IG11dGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuX2VtaXQoJ211dGUnLCBzb3VuZC5faWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQvc2V0IHRoZSB2b2x1bWUgb2YgdGhpcyBzb3VuZCBvciBvZiB0aGUgSG93bCBncm91cC4gVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbHkgdGFrZSAwLCAxIG9yIDIgYXJndW1lbnRzLlxuICAgICAqICAgdm9sdW1lKCkgLT4gUmV0dXJucyB0aGUgZ3JvdXAncyB2b2x1bWUgdmFsdWUuXG4gICAgICogICB2b2x1bWUoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgY3VycmVudCB2b2x1bWUuXG4gICAgICogICB2b2x1bWUodm9sKSAtPiBTZXRzIHRoZSB2b2x1bWUgb2YgYWxsIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICogICB2b2x1bWUodm9sLCBpZCkgLT4gU2V0cyB0aGUgdm9sdW1lIG9mIHBhc3NlZCBzb3VuZCBpZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsL051bWJlcn0gUmV0dXJucyBzZWxmIG9yIGN1cnJlbnQgdm9sdW1lLlxuICAgICAqL1xuICAgIHZvbHVtZTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIHZhciB2b2wsIGlkO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBiYXNlZCBvbiBhcmd1bWVudHMuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ3JvdXBzJyB2b2x1bWUuXG4gICAgICAgIHJldHVybiBzZWxmLl92b2x1bWU7XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxIHx8IGFyZ3MubGVuZ3RoID09PSAyICYmIHR5cGVvZiBhcmdzWzFdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGlzIGlzIGFuIElELCBhbmQgaWYgbm90LCBhc3N1bWUgaXQgaXMgYSBuZXcgdm9sdW1lLlxuICAgICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoKTtcbiAgICAgICAgdmFyIGluZGV4ID0gaWRzLmluZGV4T2YoYXJnc1swXSk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgaWQgPSBwYXJzZUludChhcmdzWzBdLCAxMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdm9sID0gcGFyc2VGbG9hdChhcmdzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHZvbCA9IHBhcnNlRmxvYXQoYXJnc1swXSk7XG4gICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1sxXSwgMTApO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdGhlIHZvbHVtZSBvciByZXR1cm4gdGhlIGN1cnJlbnQgdm9sdW1lLlxuICAgICAgdmFyIHNvdW5kO1xuICAgICAgaWYgKHR5cGVvZiB2b2wgIT09ICd1bmRlZmluZWQnICYmIHZvbCA+PSAwICYmIHZvbCA8PSAxKSB7XG4gICAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gY2hhbmdlIHZvbHVtZSB3aGVuIGNhcGFibGUuXG4gICAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCd8fCBzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgICAgZXZlbnQ6ICd2b2x1bWUnLFxuICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgc2VsZi52b2x1bWUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgZ3JvdXAgdm9sdW1lLlxuICAgICAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHNlbGYuX3ZvbHVtZSA9IHZvbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBvbmUgb3IgYWxsIHZvbHVtZXMuXG4gICAgICAgIGlkID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgICAgICBmb3IgKHZhciBpPTA7IGk8aWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkW2ldKTtcblxuICAgICAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAgICAgc291bmQuX3ZvbHVtZSA9IHZvbDtcblxuICAgICAgICAgICAgLy8gU3RvcCBjdXJyZW50bHkgcnVubmluZyBmYWRlcy5cbiAgICAgICAgICAgIGlmICghYXJnc1syXSkge1xuICAgICAgICAgICAgICBzZWxmLl9zdG9wRmFkZShpZFtpXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSAmJiAhc291bmQuX211dGVkKSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUodm9sLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291bmQuX25vZGUgJiYgIXNvdW5kLl9tdXRlZCkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS52b2x1bWUgPSB2b2wgKiBIb3dsZXIudm9sdW1lKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3ZvbHVtZScsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3VuZCA9IGlkID8gc2VsZi5fc291bmRCeUlkKGlkKSA6IHNlbGYuX3NvdW5kc1swXTtcbiAgICAgICAgcmV0dXJuIHNvdW5kID8gc291bmQuX3ZvbHVtZSA6IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGYWRlIGEgY3VycmVudGx5IHBsYXlpbmcgc291bmQgYmV0d2VlbiB0d28gdm9sdW1lcyAoaWYgbm8gaWQgaXMgcGFzc2VkLCBhbGwgc291bmRzIHdpbGwgZmFkZSkuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBmcm9tIFRoZSB2YWx1ZSB0byBmYWRlIGZyb20gKDAuMCB0byAxLjApLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gdG8gICBUaGUgdm9sdW1lIHRvIGZhZGUgdG8gKDAuMCB0byAxLjApLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gbGVuICBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byBmYWRlLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgICBUaGUgc291bmQgaWQgKG9taXQgdG8gZmFkZSBhbGwgc291bmRzKS5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIGZhZGU6IGZ1bmN0aW9uKGZyb20sIHRvLCBsZW4sIGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gZmFkZSB3aGVuIGNhcGFibGUuXG4gICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnIHx8IHNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAnZmFkZScsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuZmFkZShmcm9tLCB0bywgbGVuLCBpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0by9mcm9tL2xlbiB2YWx1ZXMgYXJlIG51bWJlcnMuXG4gICAgICBmcm9tID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgcGFyc2VGbG9hdChmcm9tKSksIDEpO1xuICAgICAgdG8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCBwYXJzZUZsb2F0KHRvKSksIDEpO1xuICAgICAgbGVuID0gcGFyc2VGbG9hdChsZW4pO1xuXG4gICAgICAvLyBTZXQgdGhlIHZvbHVtZSB0byB0aGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICBzZWxmLnZvbHVtZShmcm9tLCBpZCk7XG5cbiAgICAgIC8vIEZhZGUgdGhlIHZvbHVtZSBvZiBvbmUgb3IgYWxsIHNvdW5kcy5cbiAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIGxpbmVhciBmYWRlIG9yIGZhbGwgYmFjayB0byB0aW1lb3V0cyB3aXRoIEhUTUw1IEF1ZGlvLlxuICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICAvLyBTdG9wIHRoZSBwcmV2aW91cyBmYWRlIGlmIG5vIHNwcml0ZSBpcyBiZWluZyB1c2VkIChvdGhlcndpc2UsIHZvbHVtZSBoYW5kbGVzIHRoaXMpLlxuICAgICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIHNlbGYuX3N0b3BGYWRlKGlkc1tpXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIFdlYiBBdWRpbywgbGV0IHRoZSBuYXRpdmUgbWV0aG9kcyBkbyB0aGUgYWN0dWFsIGZhZGUuXG4gICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmICFzb3VuZC5fbXV0ZWQpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50VGltZSA9IEhvd2xlci5jdHguY3VycmVudFRpbWU7XG4gICAgICAgICAgICB2YXIgZW5kID0gY3VycmVudFRpbWUgKyAobGVuIC8gMTAwMCk7XG4gICAgICAgICAgICBzb3VuZC5fdm9sdW1lID0gZnJvbTtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUoZnJvbSwgY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgc291bmQuX25vZGUuZ2Fpbi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSh0bywgZW5kKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLl9zdGFydEZhZGVJbnRlcnZhbChzb3VuZCwgZnJvbSwgdG8sIGxlbiwgaWRzW2ldLCB0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRoZSBpbnRlcm5hbCBpbnRlcnZhbCB0byBmYWRlIGEgc291bmQuXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBzb3VuZCBSZWZlcmVuY2UgdG8gc291bmQgdG8gZmFkZS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGZyb20gVGhlIHZhbHVlIHRvIGZhZGUgZnJvbSAoMC4wIHRvIDEuMCkuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSB0byAgIFRoZSB2b2x1bWUgdG8gZmFkZSB0byAoMC4wIHRvIDEuMCkuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBsZW4gIFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGZhZGUuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAgIFRoZSBzb3VuZCBpZCB0byBmYWRlLlxuICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IGlzR3JvdXAgICBJZiB0cnVlLCBzZXQgdGhlIHZvbHVtZSBvbiB0aGUgZ3JvdXAuXG4gICAgICovXG4gICAgX3N0YXJ0RmFkZUludGVydmFsOiBmdW5jdGlvbihzb3VuZCwgZnJvbSwgdG8sIGxlbiwgaWQsIGlzR3JvdXApIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciB2b2wgPSBmcm9tO1xuICAgICAgdmFyIGRpZmYgPSB0byAtIGZyb207XG4gICAgICB2YXIgc3RlcHMgPSBNYXRoLmFicyhkaWZmIC8gMC4wMSk7XG4gICAgICB2YXIgc3RlcExlbiA9IE1hdGgubWF4KDQsIChzdGVwcyA+IDApID8gbGVuIC8gc3RlcHMgOiBsZW4pO1xuICAgICAgdmFyIGxhc3RUaWNrID0gRGF0ZS5ub3coKTtcblxuICAgICAgLy8gU3RvcmUgdGhlIHZhbHVlIGJlaW5nIGZhZGVkIHRvLlxuICAgICAgc291bmQuX2ZhZGVUbyA9IHRvO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIHZvbHVtZSB2YWx1ZSBvbiBlYWNoIGludGVydmFsIHRpY2suXG4gICAgICBzb3VuZC5faW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSB2b2x1bWUgYmFzZWQgb24gdGhlIHRpbWUgc2luY2UgdGhlIGxhc3QgdGljay5cbiAgICAgICAgdmFyIHRpY2sgPSAoRGF0ZS5ub3coKSAtIGxhc3RUaWNrKSAvIGxlbjtcbiAgICAgICAgbGFzdFRpY2sgPSBEYXRlLm5vdygpO1xuICAgICAgICB2b2wgKz0gZGlmZiAqIHRpY2s7XG5cbiAgICAgICAgLy8gUm91bmQgdG8gd2l0aGluIDIgZGVjaW1hbCBwb2ludHMuXG4gICAgICAgIHZvbCA9IE1hdGgucm91bmQodm9sICogMTAwKSAvIDEwMDtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHZvbHVtZSBpcyBpbiB0aGUgcmlnaHQgYm91bmRzLlxuICAgICAgICBpZiAoZGlmZiA8IDApIHtcbiAgICAgICAgICB2b2wgPSBNYXRoLm1heCh0bywgdm9sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2b2wgPSBNYXRoLm1pbih0bywgdm9sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoYW5nZSB0aGUgdm9sdW1lLlxuICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICBzb3VuZC5fdm9sdW1lID0gdm9sO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYudm9sdW1lKHZvbCwgc291bmQuX2lkLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgZ3JvdXAncyB2b2x1bWUuXG4gICAgICAgIGlmIChpc0dyb3VwKSB7XG4gICAgICAgICAgc2VsZi5fdm9sdW1lID0gdm9sO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiB0aGUgZmFkZSBpcyBjb21wbGV0ZSwgc3RvcCBpdCBhbmQgZmlyZSBldmVudC5cbiAgICAgICAgaWYgKCh0byA8IGZyb20gJiYgdm9sIDw9IHRvKSB8fCAodG8gPiBmcm9tICYmIHZvbCA+PSB0bykpIHtcbiAgICAgICAgICBjbGVhckludGVydmFsKHNvdW5kLl9pbnRlcnZhbCk7XG4gICAgICAgICAgc291bmQuX2ludGVydmFsID0gbnVsbDtcbiAgICAgICAgICBzb3VuZC5fZmFkZVRvID0gbnVsbDtcbiAgICAgICAgICBzZWxmLnZvbHVtZSh0bywgc291bmQuX2lkKTtcbiAgICAgICAgICBzZWxmLl9lbWl0KCdmYWRlJywgc291bmQuX2lkKTtcbiAgICAgICAgfVxuICAgICAgfSwgc3RlcExlbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IHN0b3BzIHRoZSBjdXJyZW50bHkgcGxheWluZyBmYWRlIHdoZW5cbiAgICAgKiBhIG5ldyBmYWRlIHN0YXJ0cywgdm9sdW1lIGlzIGNoYW5nZWQgb3IgdGhlIHNvdW5kIGlzIHN0b3BwZWQuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBUaGUgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfc3RvcEZhZGU6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWQpO1xuXG4gICAgICBpZiAoc291bmQgJiYgc291bmQuX2ludGVydmFsKSB7XG4gICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgIHNvdW5kLl9ub2RlLmdhaW4uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xlYXJJbnRlcnZhbChzb3VuZC5faW50ZXJ2YWwpO1xuICAgICAgICBzb3VuZC5faW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICBzZWxmLnZvbHVtZShzb3VuZC5fZmFkZVRvLCBpZCk7XG4gICAgICAgIHNvdW5kLl9mYWRlVG8gPSBudWxsO1xuICAgICAgICBzZWxmLl9lbWl0KCdmYWRlJywgaWQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgbG9vcCBwYXJhbWV0ZXIgb24gYSBzb3VuZC4gVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbHkgdGFrZSAwLCAxIG9yIDIgYXJndW1lbnRzLlxuICAgICAqICAgbG9vcCgpIC0+IFJldHVybnMgdGhlIGdyb3VwJ3MgbG9vcCB2YWx1ZS5cbiAgICAgKiAgIGxvb3AoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgbG9vcCB2YWx1ZS5cbiAgICAgKiAgIGxvb3AobG9vcCkgLT4gU2V0cyB0aGUgbG9vcCB2YWx1ZSBmb3IgYWxsIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICogICBsb29wKGxvb3AsIGlkKSAtPiBTZXRzIHRoZSBsb29wIHZhbHVlIG9mIHBhc3NlZCBzb3VuZCBpZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsL0Jvb2xlYW59IFJldHVybnMgc2VsZiBvciBjdXJyZW50IGxvb3AgdmFsdWUuXG4gICAgICovXG4gICAgbG9vcDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIHZhciBsb29wLCBpZCwgc291bmQ7XG5cbiAgICAgIC8vIERldGVybWluZSB0aGUgdmFsdWVzIGZvciBsb29wIGFuZCBpZC5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIGdyb3UncyBsb29wIHZhbHVlLlxuICAgICAgICByZXR1cm4gc2VsZi5fbG9vcDtcbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBsb29wID0gYXJnc1swXTtcbiAgICAgICAgICBzZWxmLl9sb29wID0gbG9vcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBSZXR1cm4gdGhpcyBzb3VuZCdzIGxvb3AgdmFsdWUuXG4gICAgICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQocGFyc2VJbnQoYXJnc1swXSwgMTApKTtcbiAgICAgICAgICByZXR1cm4gc291bmQgPyBzb3VuZC5fbG9vcCA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGxvb3AgPSBhcmdzWzBdO1xuICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gaWQgaXMgcGFzc2VkLCBnZXQgYWxsIElEJ3MgdG8gYmUgbG9vcGVkLlxuICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICBzb3VuZC5fbG9vcCA9IGxvb3A7XG4gICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmIHNvdW5kLl9ub2RlICYmIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSkge1xuICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3AgPSBsb29wO1xuICAgICAgICAgICAgaWYgKGxvb3ApIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3BTdGFydCA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UubG9vcEVuZCA9IHNvdW5kLl9zdG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgcGxheWJhY2sgcmF0ZSBvZiBhIHNvdW5kLiBUaGlzIG1ldGhvZCBjYW4gb3B0aW9uYWxseSB0YWtlIDAsIDEgb3IgMiBhcmd1bWVudHMuXG4gICAgICogICByYXRlKCkgLT4gUmV0dXJucyB0aGUgZmlyc3Qgc291bmQgbm9kZSdzIGN1cnJlbnQgcGxheWJhY2sgcmF0ZS5cbiAgICAgKiAgIHJhdGUoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgY3VycmVudCBwbGF5YmFjayByYXRlLlxuICAgICAqICAgcmF0ZShyYXRlKSAtPiBTZXRzIHRoZSBwbGF5YmFjayByYXRlIG9mIGFsbCBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAqICAgcmF0ZShyYXRlLCBpZCkgLT4gU2V0cyB0aGUgcGxheWJhY2sgcmF0ZSBvZiBwYXNzZWQgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bC9OdW1iZXJ9IFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCBwbGF5YmFjayByYXRlLlxuICAgICAqL1xuICAgIHJhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICB2YXIgcmF0ZSwgaWQ7XG5cbiAgICAgIC8vIERldGVybWluZSB0aGUgdmFsdWVzIGJhc2VkIG9uIGFyZ3VtZW50cy5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBXZSB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgcmF0ZSBvZiB0aGUgZmlyc3Qgbm9kZS5cbiAgICAgICAgaWQgPSBzZWxmLl9zb3VuZHNbMF0uX2lkO1xuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGlzIGlzIGFuIElELCBhbmQgaWYgbm90LCBhc3N1bWUgaXQgaXMgYSBuZXcgcmF0ZSB2YWx1ZS5cbiAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKCk7XG4gICAgICAgIHZhciBpbmRleCA9IGlkcy5pbmRleE9mKGFyZ3NbMF0pO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1swXSwgMTApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJhdGUgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJhdGUgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHRoZSBwbGF5YmFjayByYXRlIG9yIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgIHZhciBzb3VuZDtcbiAgICAgIGlmICh0eXBlb2YgcmF0ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBjaGFuZ2UgcGxheWJhY2sgcmF0ZSB3aGVuIGNhcGFibGUuXG4gICAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcgfHwgc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgIGV2ZW50OiAncmF0ZScsXG4gICAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBzZWxmLnJhdGUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgZ3JvdXAgcmF0ZS5cbiAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBzZWxmLl9yYXRlID0gcmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBvbmUgb3IgYWxsIHZvbHVtZXMuXG4gICAgICAgIGlkID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgICAgICBmb3IgKHZhciBpPTA7IGk8aWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkW2ldKTtcblxuICAgICAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBvdXIgcG9zaXRpb24gd2hlbiB0aGUgcmF0ZSBjaGFuZ2VkIGFuZCB1cGRhdGUgdGhlIHBsYXliYWNrXG4gICAgICAgICAgICAvLyBzdGFydCBwb3NpdGlvbiBzbyB3ZSBjYW4gcHJvcGVybHkgYWRqdXN0IHRoZSBzZWVrIHBvc2l0aW9uIGZvciB0aW1lIGVsYXBzZWQuXG4gICAgICAgICAgICBpZiAoc2VsZi5wbGF5aW5nKGlkW2ldKSkge1xuICAgICAgICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSBzZWxmLnNlZWsoaWRbaV0pO1xuICAgICAgICAgICAgICBzb3VuZC5fcGxheVN0YXJ0ID0gc2VsZi5fd2ViQXVkaW8gPyBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lIDogc291bmQuX3BsYXlTdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNvdW5kLl9yYXRlID0gcmF0ZTtcblxuICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBwbGF5YmFjayByYXRlLlxuICAgICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmIHNvdW5kLl9ub2RlICYmIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UucGxheWJhY2tSYXRlLnNldFZhbHVlQXRUaW1lKHJhdGUsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5wbGF5YmFja1JhdGUgPSByYXRlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZXNldCB0aGUgdGltZXJzLlxuICAgICAgICAgICAgdmFyIHNlZWsgPSBzZWxmLnNlZWsoaWRbaV0pO1xuICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gKChzZWxmLl9zcHJpdGVbc291bmQuX3Nwcml0ZV1bMF0gKyBzZWxmLl9zcHJpdGVbc291bmQuX3Nwcml0ZV1bMV0pIC8gMTAwMCkgLSBzZWVrO1xuICAgICAgICAgICAgdmFyIHRpbWVvdXQgPSAoZHVyYXRpb24gKiAxMDAwKSAvIE1hdGguYWJzKHNvdW5kLl9yYXRlKTtcblxuICAgICAgICAgICAgLy8gU3RhcnQgYSBuZXcgZW5kIHRpbWVyIGlmIHNvdW5kIGlzIGFscmVhZHkgcGxheWluZy5cbiAgICAgICAgICAgIGlmIChzZWxmLl9lbmRUaW1lcnNbaWRbaV1dIHx8ICFzb3VuZC5fcGF1c2VkKSB7XG4gICAgICAgICAgICAgIHNlbGYuX2NsZWFyVGltZXIoaWRbaV0pO1xuICAgICAgICAgICAgICBzZWxmLl9lbmRUaW1lcnNbaWRbaV1dID0gc2V0VGltZW91dChzZWxmLl9lbmRlZC5iaW5kKHNlbGYsIHNvdW5kKSwgdGltZW91dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3JhdGUnLCBzb3VuZC5faWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWQpO1xuICAgICAgICByZXR1cm4gc291bmQgPyBzb3VuZC5fcmF0ZSA6IHNlbGYuX3JhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQvc2V0IHRoZSBzZWVrIHBvc2l0aW9uIG9mIGEgc291bmQuIFRoaXMgbWV0aG9kIGNhbiBvcHRpb25hbGx5IHRha2UgMCwgMSBvciAyIGFyZ3VtZW50cy5cbiAgICAgKiAgIHNlZWsoKSAtPiBSZXR1cm5zIHRoZSBmaXJzdCBzb3VuZCBub2RlJ3MgY3VycmVudCBzZWVrIHBvc2l0aW9uLlxuICAgICAqICAgc2VlayhpZCkgLT4gUmV0dXJucyB0aGUgc291bmQgaWQncyBjdXJyZW50IHNlZWsgcG9zaXRpb24uXG4gICAgICogICBzZWVrKHNlZWspIC0+IFNldHMgdGhlIHNlZWsgcG9zaXRpb24gb2YgdGhlIGZpcnN0IHNvdW5kIG5vZGUuXG4gICAgICogICBzZWVrKHNlZWssIGlkKSAtPiBTZXRzIHRoZSBzZWVrIHBvc2l0aW9uIG9mIHBhc3NlZCBzb3VuZCBpZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsL051bWJlcn0gUmV0dXJucyBzZWxmIG9yIHRoZSBjdXJyZW50IHNlZWsgcG9zaXRpb24uXG4gICAgICovXG4gICAgc2VlazogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIHZhciBzZWVrLCBpZDtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB2YWx1ZXMgYmFzZWQgb24gYXJndW1lbnRzLlxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIFdlIHdpbGwgc2ltcGx5IHJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgbm9kZS5cbiAgICAgICAgaWQgPSBzZWxmLl9zb3VuZHNbMF0uX2lkO1xuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGlzIGlzIGFuIElELCBhbmQgaWYgbm90LCBhc3N1bWUgaXQgaXMgYSBuZXcgc2VlayBwb3NpdGlvbi5cbiAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKCk7XG4gICAgICAgIHZhciBpbmRleCA9IGlkcy5pbmRleE9mKGFyZ3NbMF0pO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1swXSwgMTApO1xuICAgICAgICB9IGVsc2UgaWYgKHNlbGYuX3NvdW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZCA9IHNlbGYuX3NvdW5kc1swXS5faWQ7XG4gICAgICAgICAgc2VlayA9IHBhcnNlRmxvYXQoYXJnc1swXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgc2VlayA9IHBhcnNlRmxvYXQoYXJnc1swXSk7XG4gICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1sxXSwgMTApO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGVyZSBpcyBubyBJRCwgYmFpbCBvdXQuXG4gICAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBzZWVrIHdoZW4gY2FwYWJsZS5cbiAgICAgIGlmICh0eXBlb2Ygc2VlayA9PT0gJ251bWJlcicgJiYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJyB8fCBzZWxmLl9wbGF5TG9jaykpIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdzZWVrJyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5zZWVrLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWQpO1xuXG4gICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZWVrID09PSAnbnVtYmVyJyAmJiBzZWVrID49IDApIHtcbiAgICAgICAgICAvLyBQYXVzZSB0aGUgc291bmQgYW5kIHVwZGF0ZSBwb3NpdGlvbiBmb3IgcmVzdGFydGluZyBwbGF5YmFjay5cbiAgICAgICAgICB2YXIgcGxheWluZyA9IHNlbGYucGxheWluZyhpZCk7XG4gICAgICAgICAgaWYgKHBsYXlpbmcpIHtcbiAgICAgICAgICAgIHNlbGYucGF1c2UoaWQsIHRydWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1vdmUgdGhlIHBvc2l0aW9uIG9mIHRoZSB0cmFjayBhbmQgY2FuY2VsIHRpbWVyLlxuICAgICAgICAgIHNvdW5kLl9zZWVrID0gc2VlaztcbiAgICAgICAgICBzb3VuZC5fZW5kZWQgPSBmYWxzZTtcbiAgICAgICAgICBzZWxmLl9jbGVhclRpbWVyKGlkKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2VlayBwb3NpdGlvbiBmb3IgSFRNTDUgQXVkaW8uXG4gICAgICAgICAgaWYgKCFzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSAmJiAhaXNOYU4oc291bmQuX25vZGUuZHVyYXRpb24pKSB7XG4gICAgICAgICAgICBzb3VuZC5fbm9kZS5jdXJyZW50VGltZSA9IHNlZWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VlayBhbmQgZW1pdCB3aGVuIHJlYWR5LlxuICAgICAgICAgIHZhciBzZWVrQW5kRW1pdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5fZW1pdCgnc2VlaycsIGlkKTtcblxuICAgICAgICAgICAgLy8gUmVzdGFydCB0aGUgcGxheWJhY2sgaWYgdGhlIHNvdW5kIHdhcyBwbGF5aW5nLlxuICAgICAgICAgICAgaWYgKHBsYXlpbmcpIHtcbiAgICAgICAgICAgICAgc2VsZi5wbGF5KGlkLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHBsYXkgbG9jayB0byBiZSB1bnNldCBiZWZvcmUgZW1pdHRpbmcgKEhUTUw1IEF1ZGlvKS5cbiAgICAgICAgICBpZiAocGxheWluZyAmJiAhc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgIHZhciBlbWl0U2VlayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoIXNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgICAgICAgICAgc2Vla0FuZEVtaXQoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGVtaXRTZWVrLCAwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZW1pdFNlZWssIDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWVrQW5kRW1pdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgIHZhciByZWFsVGltZSA9IHNlbGYucGxheWluZyhpZCkgPyBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lIC0gc291bmQuX3BsYXlTdGFydCA6IDA7XG4gICAgICAgICAgICB2YXIgcmF0ZVNlZWsgPSBzb3VuZC5fcmF0ZVNlZWsgPyBzb3VuZC5fcmF0ZVNlZWsgLSBzb3VuZC5fc2VlayA6IDA7XG4gICAgICAgICAgICByZXR1cm4gc291bmQuX3NlZWsgKyAocmF0ZVNlZWsgKyByZWFsVGltZSAqIE1hdGguYWJzKHNvdW5kLl9yYXRlKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VuZC5fbm9kZS5jdXJyZW50VGltZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgc3BlY2lmaWMgc291bmQgaXMgY3VycmVudGx5IHBsYXlpbmcgb3Igbm90IChpZiBpZCBpcyBwcm92aWRlZCksIG9yIGNoZWNrIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgc291bmRzIGluIHRoZSBncm91cCBpcyBwbGF5aW5nIG9yIG5vdC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9ICBpZCBUaGUgc291bmQgaWQgdG8gY2hlY2suIElmIG5vbmUgaXMgcGFzc2VkLCB0aGUgd2hvbGUgc291bmQgZ3JvdXAgaXMgY2hlY2tlZC5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHBsYXlpbmcgYW5kIGZhbHNlIGlmIG5vdC5cbiAgICAgKi9cbiAgICBwbGF5aW5nOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBDaGVjayB0aGUgcGFzc2VkIHNvdW5kIElEIChpZiBhbnkpLlxuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcbiAgICAgICAgcmV0dXJuIHNvdW5kID8gIXNvdW5kLl9wYXVzZWQgOiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gT3RoZXJ3aXNlLCBsb29wIHRocm91Z2ggYWxsIHNvdW5kcyBhbmQgY2hlY2sgaWYgYW55IGFyZSBwbGF5aW5nLlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXNlbGYuX3NvdW5kc1tpXS5fcGF1c2VkKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoaXMgc291bmQuIFBhc3NpbmcgYSBzb3VuZCBpZCB3aWxsIHJldHVybiB0aGUgc3ByaXRlIGR1cmF0aW9uLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgVGhlIHNvdW5kIGlkIHRvIGNoZWNrLiBJZiBub25lIGlzIHBhc3NlZCwgcmV0dXJuIGZ1bGwgc291cmNlIGR1cmF0aW9uLlxuICAgICAqIEByZXR1cm4ge051bWJlcn0gQXVkaW8gZHVyYXRpb24gaW4gc2Vjb25kcy5cbiAgICAgKi9cbiAgICBkdXJhdGlvbjogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBkdXJhdGlvbiA9IHNlbGYuX2R1cmF0aW9uO1xuXG4gICAgICAvLyBJZiB3ZSBwYXNzIGFuIElELCBnZXQgdGhlIHNvdW5kIGFuZCByZXR1cm4gdGhlIHNwcml0ZSBsZW5ndGguXG4gICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWQpO1xuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIGR1cmF0aW9uID0gc2VsZi5fc3ByaXRlW3NvdW5kLl9zcHJpdGVdWzFdIC8gMTAwMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGR1cmF0aW9uO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxvYWRlZCBzdGF0ZSBvZiB0aGlzIEhvd2wuXG4gICAgICogQHJldHVybiB7U3RyaW5nfSAndW5sb2FkZWQnLCAnbG9hZGluZycsICdsb2FkZWQnXG4gICAgICovXG4gICAgc3RhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVbmxvYWQgYW5kIGRlc3Ryb3kgdGhlIGN1cnJlbnQgSG93bCBvYmplY3QuXG4gICAgICogVGhpcyB3aWxsIGltbWVkaWF0ZWx5IHN0b3AgYWxsIHNvdW5kIGluc3RhbmNlcyBhdHRhY2hlZCB0byB0aGlzIGdyb3VwLlxuICAgICAqL1xuICAgIHVubG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIFN0b3AgcGxheWluZyBhbnkgYWN0aXZlIHNvdW5kcy5cbiAgICAgIHZhciBzb3VuZHMgPSBzZWxmLl9zb3VuZHM7XG4gICAgICBmb3IgKHZhciBpPTA7IGk8c291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIFN0b3AgdGhlIHNvdW5kIGlmIGl0IGlzIGN1cnJlbnRseSBwbGF5aW5nLlxuICAgICAgICBpZiAoIXNvdW5kc1tpXS5fcGF1c2VkKSB7XG4gICAgICAgICAgc2VsZi5zdG9wKHNvdW5kc1tpXS5faWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBzb3VyY2Ugb3IgZGlzY29ubmVjdC5cbiAgICAgICAgaWYgKCFzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgIC8vIFNldCB0aGUgc291cmNlIHRvIDAtc2Vjb25kIHNpbGVuY2UgdG8gc3RvcCBhbnkgZG93bmxvYWRpbmcgKGV4Y2VwdCBpbiBJRSkuXG4gICAgICAgICAgc2VsZi5fY2xlYXJTb3VuZChzb3VuZHNbaV0uX25vZGUpO1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIGFueSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICAgICAgc291bmRzW2ldLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgc291bmRzW2ldLl9lcnJvckZuLCBmYWxzZSk7XG4gICAgICAgICAgc291bmRzW2ldLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoSG93bGVyLl9jYW5QbGF5RXZlbnQsIHNvdW5kc1tpXS5fbG9hZEZuLCBmYWxzZSk7XG4gICAgICAgICAgc291bmRzW2ldLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc291bmRzW2ldLl9lbmRGbiwgZmFsc2UpO1xuXG4gICAgICAgICAgLy8gUmVsZWFzZSB0aGUgQXVkaW8gb2JqZWN0IGJhY2sgdG8gdGhlIHBvb2wuXG4gICAgICAgICAgSG93bGVyLl9yZWxlYXNlSHRtbDVBdWRpbyhzb3VuZHNbaV0uX25vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1wdHkgb3V0IGFsbCBvZiB0aGUgbm9kZXMuXG4gICAgICAgIGRlbGV0ZSBzb3VuZHNbaV0uX25vZGU7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIGFsbCB0aW1lcnMgYXJlIGNsZWFyZWQgb3V0LlxuICAgICAgICBzZWxmLl9jbGVhclRpbWVyKHNvdW5kc1tpXS5faWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgdGhlIHJlZmVyZW5jZXMgaW4gdGhlIGdsb2JhbCBIb3dsZXIgb2JqZWN0LlxuICAgICAgdmFyIGluZGV4ID0gSG93bGVyLl9ob3dscy5pbmRleE9mKHNlbGYpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgSG93bGVyLl9ob3dscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgdGhpcyBzb3VuZCBmcm9tIHRoZSBjYWNoZSAoaWYgbm8gb3RoZXIgSG93bCBpcyB1c2luZyBpdCkuXG4gICAgICB2YXIgcmVtQ2FjaGUgPSB0cnVlO1xuICAgICAgZm9yIChpPTA7IGk8SG93bGVyLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoSG93bGVyLl9ob3dsc1tpXS5fc3JjID09PSBzZWxmLl9zcmMgfHwgc2VsZi5fc3JjLmluZGV4T2YoSG93bGVyLl9ob3dsc1tpXS5fc3JjKSA+PSAwKSB7XG4gICAgICAgICAgcmVtQ2FjaGUgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2FjaGUgJiYgcmVtQ2FjaGUpIHtcbiAgICAgICAgZGVsZXRlIGNhY2hlW3NlbGYuX3NyY107XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIGdsb2JhbCBlcnJvcnMuXG4gICAgICBIb3dsZXIubm9BdWRpbyA9IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBvdXQgYHNlbGZgLlxuICAgICAgc2VsZi5fc3RhdGUgPSAndW5sb2FkZWQnO1xuICAgICAgc2VsZi5fc291bmRzID0gW107XG4gICAgICBzZWxmID0gbnVsbDtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiB0byBhIGN1c3RvbSBldmVudC5cbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgZXZlbnQgRXZlbnQgbmFtZS5cbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gZm4gICAgTGlzdGVuZXIgdG8gY2FsbC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9ICAgaWQgICAgKG9wdGlvbmFsKSBPbmx5IGxpc3RlbiB0byBldmVudHMgZm9yIHRoaXMgc291bmQuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgIG9uY2UgIChJTlRFUk5BTCkgTWFya3MgZXZlbnQgdG8gZmlyZSBvbmx5IG9uY2UuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBvbjogZnVuY3Rpb24oZXZlbnQsIGZuLCBpZCwgb25jZSkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGV2ZW50cyA9IHNlbGZbJ19vbicgKyBldmVudF07XG5cbiAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXZlbnRzLnB1c2gob25jZSA/IHtpZDogaWQsIGZuOiBmbiwgb25jZTogb25jZX0gOiB7aWQ6IGlkLCBmbjogZm59KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGN1c3RvbSBldmVudC4gQ2FsbCB3aXRob3V0IHBhcmFtZXRlcnMgdG8gcmVtb3ZlIGFsbCBldmVudHMuXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgIGV2ZW50IEV2ZW50IG5hbWUuXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGZuICAgIExpc3RlbmVyIHRvIHJlbW92ZS4gTGVhdmUgZW1wdHkgdG8gcmVtb3ZlIGFsbC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9ICAgaWQgICAgKG9wdGlvbmFsKSBPbmx5IHJlbW92ZSBldmVudHMgZm9yIHRoaXMgc291bmQuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBvZmY6IGZ1bmN0aW9uKGV2ZW50LCBmbiwgaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBldmVudHMgPSBzZWxmWydfb24nICsgZXZlbnRdO1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICAvLyBBbGxvdyBwYXNzaW5nIGp1c3QgYW4gZXZlbnQgYW5kIElELlxuICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWQgPSBmbjtcbiAgICAgICAgZm4gPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm4gfHwgaWQpIHtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGV2ZW50IHN0b3JlIGFuZCByZW1vdmUgdGhlIHBhc3NlZCBmdW5jdGlvbi5cbiAgICAgICAgZm9yIChpPTA7IGk8ZXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGlzSWQgPSAoaWQgPT09IGV2ZW50c1tpXS5pZCk7XG4gICAgICAgICAgaWYgKGZuID09PSBldmVudHNbaV0uZm4gJiYgaXNJZCB8fCAhZm4gJiYgaXNJZCkge1xuICAgICAgICAgICAgZXZlbnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldmVudCkge1xuICAgICAgICAvLyBDbGVhciBvdXQgYWxsIGV2ZW50cyBvZiB0aGlzIHR5cGUuXG4gICAgICAgIHNlbGZbJ19vbicgKyBldmVudF0gPSBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENsZWFyIG91dCBhbGwgZXZlbnRzIG9mIGV2ZXJ5IHR5cGUuXG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc2VsZik7XG4gICAgICAgIGZvciAoaT0wOyBpPGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoKGtleXNbaV0uaW5kZXhPZignX29uJykgPT09IDApICYmIEFycmF5LmlzQXJyYXkoc2VsZltrZXlzW2ldXSkpIHtcbiAgICAgICAgICAgIHNlbGZba2V5c1tpXV0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiB0byBhIGN1c3RvbSBldmVudCBhbmQgcmVtb3ZlIGl0IG9uY2UgZmlyZWQuXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgIGV2ZW50IEV2ZW50IG5hbWUuXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGZuICAgIExpc3RlbmVyIHRvIGNhbGwuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgIGlkICAgIChvcHRpb25hbCkgT25seSBsaXN0ZW4gdG8gZXZlbnRzIGZvciB0aGlzIHNvdW5kLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgb25jZTogZnVuY3Rpb24oZXZlbnQsIGZuLCBpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBTZXR1cCB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAgICBzZWxmLm9uKGV2ZW50LCBmbiwgaWQsIDEpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRW1pdCBhbGwgZXZlbnRzIG9mIGEgc3BlY2lmaWMgdHlwZSBhbmQgcGFzcyB0aGUgc291bmQgaWQuXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSBldmVudCBFdmVudCBuYW1lLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgICAgU291bmQgSUQuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBtc2cgICBNZXNzYWdlIHRvIGdvIHdpdGggZXZlbnQuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfZW1pdDogZnVuY3Rpb24oZXZlbnQsIGlkLCBtc2cpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBldmVudHMgPSBzZWxmWydfb24nICsgZXZlbnRdO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggZXZlbnQgc3RvcmUgYW5kIGZpcmUgYWxsIGZ1bmN0aW9ucy5cbiAgICAgIGZvciAodmFyIGk9ZXZlbnRzLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHtcbiAgICAgICAgLy8gT25seSBmaXJlIHRoZSBsaXN0ZW5lciBpZiB0aGUgY29ycmVjdCBJRCBpcyB1c2VkLlxuICAgICAgICBpZiAoIWV2ZW50c1tpXS5pZCB8fCBldmVudHNbaV0uaWQgPT09IGlkIHx8IGV2ZW50ID09PSAnbG9hZCcpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICBmbi5jYWxsKHRoaXMsIGlkLCBtc2cpO1xuICAgICAgICAgIH0uYmluZChzZWxmLCBldmVudHNbaV0uZm4pLCAwKTtcblxuICAgICAgICAgIC8vIElmIHRoaXMgZXZlbnQgd2FzIHNldHVwIHdpdGggYG9uY2VgLCByZW1vdmUgaXQuXG4gICAgICAgICAgaWYgKGV2ZW50c1tpXS5vbmNlKSB7XG4gICAgICAgICAgICBzZWxmLm9mZihldmVudCwgZXZlbnRzW2ldLmZuLCBldmVudHNbaV0uaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQYXNzIHRoZSBldmVudCB0eXBlIGludG8gbG9hZCBxdWV1ZSBzbyB0aGF0IGl0IGNhbiBjb250aW51ZSBzdGVwcGluZy5cbiAgICAgIHNlbGYuX2xvYWRRdWV1ZShldmVudCk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBRdWV1ZSBvZiBhY3Rpb25zIGluaXRpYXRlZCBiZWZvcmUgdGhlIHNvdW5kIGhhcyBsb2FkZWQuXG4gICAgICogVGhlc2Ugd2lsbCBiZSBjYWxsZWQgaW4gc2VxdWVuY2UsIHdpdGggdGhlIG5leHQgb25seSBmaXJpbmdcbiAgICAgKiBhZnRlciB0aGUgcHJldmlvdXMgaGFzIGZpbmlzaGVkIGV4ZWN1dGluZyAoZXZlbiBpZiBhc3luYyBsaWtlIHBsYXkpLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX2xvYWRRdWV1ZTogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgaWYgKHNlbGYuX3F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIHRhc2sgPSBzZWxmLl9xdWV1ZVswXTtcblxuICAgICAgICAvLyBSZW1vdmUgdGhpcyB0YXNrIGlmIGEgbWF0Y2hpbmcgZXZlbnQgd2FzIHBhc3NlZC5cbiAgICAgICAgaWYgKHRhc2suZXZlbnQgPT09IGV2ZW50KSB7XG4gICAgICAgICAgc2VsZi5fcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICBzZWxmLl9sb2FkUXVldWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJ1biB0aGUgdGFzayBpZiBubyBldmVudCB0eXBlIGlzIHBhc3NlZC5cbiAgICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICAgIHRhc2suYWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gcGxheWJhY2sgZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBkdXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gIHtTb3VuZH0gc291bmQgVGhlIHNvdW5kIG9iamVjdCB0byB3b3JrIHdpdGguXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfZW5kZWQ6IGZ1bmN0aW9uKHNvdW5kKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc3ByaXRlID0gc291bmQuX3Nwcml0ZTtcblxuICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIElFIGFuZCB0aGVyZSB3YXMgbmV0d29yayBsYXRlbmN5IHdlIG1heSBiZSBjbGlwcGluZ1xuICAgICAgLy8gYXVkaW8gYmVmb3JlIGl0IGNvbXBsZXRlcyBwbGF5aW5nLiBMZXRzIGNoZWNrIHRoZSBub2RlIHRvIG1ha2Ugc3VyZSBpdFxuICAgICAgLy8gYmVsaWV2ZXMgaXQgaGFzIGNvbXBsZXRlZCwgYmVmb3JlIGVuZGluZyB0aGUgcGxheWJhY2suXG4gICAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvICYmIHNvdW5kLl9ub2RlICYmICFzb3VuZC5fbm9kZS5wYXVzZWQgJiYgIXNvdW5kLl9ub2RlLmVuZGVkICYmIHNvdW5kLl9ub2RlLmN1cnJlbnRUaW1lIDwgc291bmQuX3N0b3ApIHtcbiAgICAgICAgc2V0VGltZW91dChzZWxmLl9lbmRlZC5iaW5kKHNlbGYsIHNvdW5kKSwgMTAwKTtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3VsZCB0aGlzIHNvdW5kIGxvb3A/XG4gICAgICB2YXIgbG9vcCA9ICEhKHNvdW5kLl9sb29wIHx8IHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzJdKTtcblxuICAgICAgLy8gRmlyZSB0aGUgZW5kZWQgZXZlbnQuXG4gICAgICBzZWxmLl9lbWl0KCdlbmQnLCBzb3VuZC5faWQpO1xuXG4gICAgICAvLyBSZXN0YXJ0IHRoZSBwbGF5YmFjayBmb3IgSFRNTDUgQXVkaW8gbG9vcC5cbiAgICAgIGlmICghc2VsZi5fd2ViQXVkaW8gJiYgbG9vcCkge1xuICAgICAgICBzZWxmLnN0b3Aoc291bmQuX2lkLCB0cnVlKS5wbGF5KHNvdW5kLl9pZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc3RhcnQgdGhpcyB0aW1lciBpZiBvbiBhIFdlYiBBdWRpbyBsb29wLlxuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmIGxvb3ApIHtcbiAgICAgICAgc2VsZi5fZW1pdCgncGxheScsIHNvdW5kLl9pZCk7XG4gICAgICAgIHNvdW5kLl9zZWVrID0gc291bmQuX3N0YXJ0IHx8IDA7XG4gICAgICAgIHNvdW5kLl9yYXRlU2VlayA9IDA7XG4gICAgICAgIHNvdW5kLl9wbGF5U3RhcnQgPSBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lO1xuXG4gICAgICAgIHZhciB0aW1lb3V0ID0gKChzb3VuZC5fc3RvcCAtIHNvdW5kLl9zdGFydCkgKiAxMDAwKSAvIE1hdGguYWJzKHNvdW5kLl9yYXRlKTtcbiAgICAgICAgc2VsZi5fZW5kVGltZXJzW3NvdW5kLl9pZF0gPSBzZXRUaW1lb3V0KHNlbGYuX2VuZGVkLmJpbmQoc2VsZiwgc291bmQpLCB0aW1lb3V0KTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFyayB0aGUgbm9kZSBhcyBwYXVzZWQuXG4gICAgICBpZiAoc2VsZi5fd2ViQXVkaW8gJiYgIWxvb3ApIHtcbiAgICAgICAgc291bmQuX3BhdXNlZCA9IHRydWU7XG4gICAgICAgIHNvdW5kLl9lbmRlZCA9IHRydWU7XG4gICAgICAgIHNvdW5kLl9zZWVrID0gc291bmQuX3N0YXJ0IHx8IDA7XG4gICAgICAgIHNvdW5kLl9yYXRlU2VlayA9IDA7XG4gICAgICAgIHNlbGYuX2NsZWFyVGltZXIoc291bmQuX2lkKTtcblxuICAgICAgICAvLyBDbGVhbiB1cCB0aGUgYnVmZmVyIHNvdXJjZS5cbiAgICAgICAgc2VsZi5fY2xlYW5CdWZmZXIoc291bmQuX25vZGUpO1xuXG4gICAgICAgIC8vIEF0dGVtcHQgdG8gYXV0by1zdXNwZW5kIEF1ZGlvQ29udGV4dCBpZiBubyBzb3VuZHMgYXJlIHN0aWxsIHBsYXlpbmcuXG4gICAgICAgIEhvd2xlci5fYXV0b1N1c3BlbmQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2hlbiB1c2luZyBhIHNwcml0ZSwgZW5kIHRoZSB0cmFjay5cbiAgICAgIGlmICghc2VsZi5fd2ViQXVkaW8gJiYgIWxvb3ApIHtcbiAgICAgICAgc2VsZi5zdG9wKHNvdW5kLl9pZCwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGUgZW5kIHRpbWVyIGZvciBhIHNvdW5kIHBsYXliYWNrLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgVGhlIHNvdW5kIElELlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX2NsZWFyVGltZXI6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmIChzZWxmLl9lbmRUaW1lcnNbaWRdKSB7XG4gICAgICAgIC8vIENsZWFyIHRoZSB0aW1lb3V0IG9yIHJlbW92ZSB0aGUgZW5kZWQgbGlzdGVuZXIuXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZi5fZW5kVGltZXJzW2lkXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNsZWFyVGltZW91dChzZWxmLl9lbmRUaW1lcnNbaWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWQpO1xuICAgICAgICAgIGlmIChzb3VuZCAmJiBzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgc291bmQuX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBzZWxmLl9lbmRUaW1lcnNbaWRdLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHNlbGYuX2VuZFRpbWVyc1tpZF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHNvdW5kIGlkZW50aWZpZWQgYnkgdGhpcyBJRCwgb3IgcmV0dXJuIG51bGwuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBTb3VuZCBJRFxuICAgICAqIEByZXR1cm4ge09iamVjdH0gICAgU291bmQgb2JqZWN0IG9yIG51bGwuXG4gICAgICovXG4gICAgX3NvdW5kQnlJZDogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBzb3VuZHMgYW5kIGZpbmQgdGhlIG9uZSB3aXRoIHRoaXMgSUQuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5fc291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpZCA9PT0gc2VsZi5fc291bmRzW2ldLl9pZCkge1xuICAgICAgICAgIHJldHVybiBzZWxmLl9zb3VuZHNbaV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBpbmFjdGl2ZSBzb3VuZCBmcm9tIHRoZSBwb29sIG9yIGNyZWF0ZSBhIG5ldyBvbmUuXG4gICAgICogQHJldHVybiB7U291bmR9IFNvdW5kIHBsYXliYWNrIG9iamVjdC5cbiAgICAgKi9cbiAgICBfaW5hY3RpdmVTb3VuZDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIHNlbGYuX2RyYWluKCk7XG5cbiAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGluYWN0aXZlIG5vZGUgdG8gcmVjeWNsZS5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9zb3VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNlbGYuX3NvdW5kc1tpXS5fZW5kZWQpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5fc291bmRzW2ldLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gaW5hY3RpdmUgbm9kZSB3YXMgZm91bmQsIGNyZWF0ZSBhIG5ldyBvbmUuXG4gICAgICByZXR1cm4gbmV3IFNvdW5kKHNlbGYpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEcmFpbiBleGNlc3MgaW5hY3RpdmUgc291bmRzIGZyb20gdGhlIHBvb2wuXG4gICAgICovXG4gICAgX2RyYWluOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBsaW1pdCA9IHNlbGYuX3Bvb2w7XG4gICAgICB2YXIgY250ID0gMDtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgLy8gSWYgdGhlcmUgYXJlIGxlc3Mgc291bmRzIHRoYW4gdGhlIG1heCBwb29sIHNpemUsIHdlIGFyZSBkb25lLlxuICAgICAgaWYgKHNlbGYuX3NvdW5kcy5sZW5ndGggPCBsaW1pdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgaW5hY3RpdmUgc291bmRzLlxuICAgICAgZm9yIChpPTA7IGk8c2VsZi5fc291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLl9zb3VuZHNbaV0uX2VuZGVkKSB7XG4gICAgICAgICAgY250Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIGV4Y2VzcyBpbmFjdGl2ZSBzb3VuZHMsIGdvaW5nIGluIHJldmVyc2Ugb3JkZXIuXG4gICAgICBmb3IgKGk9c2VsZi5fc291bmRzLmxlbmd0aCAtIDE7IGk+PTA7IGktLSkge1xuICAgICAgICBpZiAoY250IDw9IGxpbWl0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGYuX3NvdW5kc1tpXS5fZW5kZWQpIHtcbiAgICAgICAgICAvLyBEaXNjb25uZWN0IHRoZSBhdWRpbyBzb3VyY2Ugd2hlbiB1c2luZyBXZWIgQXVkaW8uXG4gICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmIHNlbGYuX3NvdW5kc1tpXS5fbm9kZSkge1xuICAgICAgICAgICAgc2VsZi5fc291bmRzW2ldLl9ub2RlLmRpc2Nvbm5lY3QoMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmVtb3ZlIHNvdW5kcyB1bnRpbCB3ZSBoYXZlIHRoZSBwb29sIHNpemUuXG4gICAgICAgICAgc2VsZi5fc291bmRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBjbnQtLTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIElEJ3MgZnJvbSB0aGUgc291bmRzIHBvb2wuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBPbmx5IHJldHVybiBvbmUgSUQgaWYgb25lIGlzIHBhc3NlZC5cbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gICAgQXJyYXkgb2YgSURzLlxuICAgICAqL1xuICAgIF9nZXRTb3VuZElkczogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIGlkcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5fc291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWRzLnB1c2goc2VsZi5fc291bmRzW2ldLl9pZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaWRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtpZF07XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIHNvdW5kIGJhY2sgaW50byB0aGUgYnVmZmVyIHNvdXJjZS5cbiAgICAgKiBAcGFyYW0gIHtTb3VuZH0gc291bmQgVGhlIHNvdW5kIG9iamVjdCB0byB3b3JrIHdpdGguXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfcmVmcmVzaEJ1ZmZlcjogZnVuY3Rpb24oc291bmQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gU2V0dXAgdGhlIGJ1ZmZlciBzb3VyY2UgZm9yIHBsYXliYWNrLlxuICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlID0gSG93bGVyLmN0eC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtcbiAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5idWZmZXIgPSBjYWNoZVtzZWxmLl9zcmNdO1xuXG4gICAgICAvLyBDb25uZWN0IHRvIHRoZSBjb3JyZWN0IG5vZGUuXG4gICAgICBpZiAoc291bmQuX3Bhbm5lcikge1xuICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UuY29ubmVjdChzb3VuZC5fcGFubmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5jb25uZWN0KHNvdW5kLl9ub2RlKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0dXAgbG9vcGluZyBhbmQgcGxheWJhY2sgcmF0ZS5cbiAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5sb29wID0gc291bmQuX2xvb3A7XG4gICAgICBpZiAoc291bmQuX2xvb3ApIHtcbiAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3BTdGFydCA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UubG9vcEVuZCA9IHNvdW5kLl9zdG9wIHx8IDA7XG4gICAgICB9XG4gICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UucGxheWJhY2tSYXRlLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9yYXRlLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXZlbnQgbWVtb3J5IGxlYWtzIGJ5IGNsZWFuaW5nIHVwIHRoZSBidWZmZXIgc291cmNlIGFmdGVyIHBsYXliYWNrLlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gbm9kZSBTb3VuZCdzIGF1ZGlvIG5vZGUgY29udGFpbmluZyB0aGUgYnVmZmVyIHNvdXJjZS5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9jbGVhbkJ1ZmZlcjogZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGlzSU9TID0gSG93bGVyLl9uYXZpZ2F0b3IgJiYgSG93bGVyLl9uYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoJ0FwcGxlJykgPj0gMDtcblxuICAgICAgaWYgKEhvd2xlci5fc2NyYXRjaEJ1ZmZlciAmJiBub2RlLmJ1ZmZlclNvdXJjZSkge1xuICAgICAgICBub2RlLmJ1ZmZlclNvdXJjZS5vbmVuZGVkID0gbnVsbDtcbiAgICAgICAgbm9kZS5idWZmZXJTb3VyY2UuZGlzY29ubmVjdCgwKTtcbiAgICAgICAgaWYgKGlzSU9TKSB7XG4gICAgICAgICAgdHJ5IHsgbm9kZS5idWZmZXJTb3VyY2UuYnVmZmVyID0gSG93bGVyLl9zY3JhdGNoQnVmZmVyOyB9IGNhdGNoKGUpIHt9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5vZGUuYnVmZmVyU291cmNlID0gbnVsbDtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgc291cmNlIHRvIGEgMC1zZWNvbmQgc2lsZW5jZSB0byBzdG9wIGFueSBkb3dubG9hZGluZyAoZXhjZXB0IGluIElFKS5cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IG5vZGUgQXVkaW8gbm9kZSB0byBjbGVhci5cbiAgICAgKi9cbiAgICBfY2xlYXJTb3VuZDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIGNoZWNrSUUgPSAvTVNJRSB8VHJpZGVudFxcLy8udGVzdChIb3dsZXIuX25hdmlnYXRvciAmJiBIb3dsZXIuX25hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgICAgaWYgKCFjaGVja0lFKSB7XG4gICAgICAgIG5vZGUuc3JjID0gJ2RhdGE6YXVkaW8vd2F2O2Jhc2U2NCxVa2xHUmlnQUFBQlhRVlpGWm0xMElCSUFBQUFCQUFFQVJLd0FBSWhZQVFBQ0FCQUFBQUJrWVhSaEFnQUFBQUVBJztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqIFNpbmdsZSBTb3VuZCBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBTZXR1cCB0aGUgc291bmQgb2JqZWN0LCB3aGljaCBlYWNoIG5vZGUgYXR0YWNoZWQgdG8gYSBIb3dsIGdyb3VwIGlzIGNvbnRhaW5lZCBpbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IGhvd2wgVGhlIEhvd2wgcGFyZW50IGdyb3VwLlxuICAgKi9cbiAgdmFyIFNvdW5kID0gZnVuY3Rpb24oaG93bCkge1xuICAgIHRoaXMuX3BhcmVudCA9IGhvd2w7XG4gICAgdGhpcy5pbml0KCk7XG4gIH07XG4gIFNvdW5kLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGEgbmV3IFNvdW5kIG9iamVjdC5cbiAgICAgKiBAcmV0dXJuIHtTb3VuZH1cbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBwYXJlbnQgPSBzZWxmLl9wYXJlbnQ7XG5cbiAgICAgIC8vIFNldHVwIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuXG4gICAgICBzZWxmLl9tdXRlZCA9IHBhcmVudC5fbXV0ZWQ7XG4gICAgICBzZWxmLl9sb29wID0gcGFyZW50Ll9sb29wO1xuICAgICAgc2VsZi5fdm9sdW1lID0gcGFyZW50Ll92b2x1bWU7XG4gICAgICBzZWxmLl9yYXRlID0gcGFyZW50Ll9yYXRlO1xuICAgICAgc2VsZi5fc2VlayA9IDA7XG4gICAgICBzZWxmLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgc2VsZi5fZW5kZWQgPSB0cnVlO1xuICAgICAgc2VsZi5fc3ByaXRlID0gJ19fZGVmYXVsdCc7XG5cbiAgICAgIC8vIEdlbmVyYXRlIGEgdW5pcXVlIElEIGZvciB0aGlzIHNvdW5kLlxuICAgICAgc2VsZi5faWQgPSArK0hvd2xlci5fY291bnRlcjtcblxuICAgICAgLy8gQWRkIGl0c2VsZiB0byB0aGUgcGFyZW50J3MgcG9vbC5cbiAgICAgIHBhcmVudC5fc291bmRzLnB1c2goc2VsZik7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IG5vZGUuXG4gICAgICBzZWxmLmNyZWF0ZSgpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuZCBzZXR1cCBhIG5ldyBzb3VuZCBvYmplY3QsIHdoZXRoZXIgSFRNTDUgQXVkaW8gb3IgV2ViIEF1ZGlvLlxuICAgICAqIEByZXR1cm4ge1NvdW5kfVxuICAgICAqL1xuICAgIGNyZWF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuICAgICAgdmFyIHZvbHVtZSA9IChIb3dsZXIuX211dGVkIHx8IHNlbGYuX211dGVkIHx8IHNlbGYuX3BhcmVudC5fbXV0ZWQpID8gMCA6IHNlbGYuX3ZvbHVtZTtcblxuICAgICAgaWYgKHBhcmVudC5fd2ViQXVkaW8pIHtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBnYWluIG5vZGUgZm9yIGNvbnRyb2xsaW5nIHZvbHVtZSAodGhlIHNvdXJjZSB3aWxsIGNvbm5lY3QgdG8gdGhpcykuXG4gICAgICAgIHNlbGYuX25vZGUgPSAodHlwZW9mIEhvd2xlci5jdHguY3JlYXRlR2FpbiA9PT0gJ3VuZGVmaW5lZCcpID8gSG93bGVyLmN0eC5jcmVhdGVHYWluTm9kZSgpIDogSG93bGVyLmN0eC5jcmVhdGVHYWluKCk7XG4gICAgICAgIHNlbGYuX25vZGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZSh2b2x1bWUsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICBzZWxmLl9ub2RlLnBhdXNlZCA9IHRydWU7XG4gICAgICAgIHNlbGYuX25vZGUuY29ubmVjdChIb3dsZXIubWFzdGVyR2Fpbik7XG4gICAgICB9IGVsc2UgaWYgKCFIb3dsZXIubm9BdWRpbykge1xuICAgICAgICAvLyBHZXQgYW4gdW5sb2NrZWQgQXVkaW8gb2JqZWN0IGZyb20gdGhlIHBvb2wuXG4gICAgICAgIHNlbGYuX25vZGUgPSBIb3dsZXIuX29idGFpbkh0bWw1QXVkaW8oKTtcblxuICAgICAgICAvLyBMaXN0ZW4gZm9yIGVycm9ycyAoaHR0cDovL2Rldi53My5vcmcvaHRtbDUvc3BlYy1hdXRob3Itdmlldy9zcGVjLmh0bWwjbWVkaWFlcnJvcikuXG4gICAgICAgIHNlbGYuX2Vycm9yRm4gPSBzZWxmLl9lcnJvckxpc3RlbmVyLmJpbmQoc2VsZik7XG4gICAgICAgIHNlbGYuX25vZGUuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBzZWxmLl9lcnJvckZuLCBmYWxzZSk7XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciAnY2FucGxheXRocm91Z2gnIGV2ZW50IHRvIGxldCB1cyBrbm93IHRoZSBzb3VuZCBpcyByZWFkeS5cbiAgICAgICAgc2VsZi5fbG9hZEZuID0gc2VsZi5fbG9hZExpc3RlbmVyLmJpbmQoc2VsZik7XG4gICAgICAgIHNlbGYuX25vZGUuYWRkRXZlbnRMaXN0ZW5lcihIb3dsZXIuX2NhblBsYXlFdmVudCwgc2VsZi5fbG9hZEZuLCBmYWxzZSk7XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciB0aGUgJ2VuZGVkJyBldmVudCBvbiB0aGUgc291bmQgdG8gYWNjb3VudCBmb3IgZWRnZS1jYXNlIHdoZXJlXG4gICAgICAgIC8vIGEgZmluaXRlIHNvdW5kIGhhcyBhIGR1cmF0aW9uIG9mIEluZmluaXR5LlxuICAgICAgICBzZWxmLl9lbmRGbiA9IHNlbGYuX2VuZExpc3RlbmVyLmJpbmQoc2VsZik7XG4gICAgICAgIHNlbGYuX25vZGUuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBzZWxmLl9lbmRGbiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIFNldHVwIHRoZSBuZXcgYXVkaW8gbm9kZS5cbiAgICAgICAgc2VsZi5fbm9kZS5zcmMgPSBwYXJlbnQuX3NyYztcbiAgICAgICAgc2VsZi5fbm9kZS5wcmVsb2FkID0gcGFyZW50Ll9wcmVsb2FkID09PSB0cnVlID8gJ2F1dG8nIDogcGFyZW50Ll9wcmVsb2FkO1xuICAgICAgICBzZWxmLl9ub2RlLnZvbHVtZSA9IHZvbHVtZSAqIEhvd2xlci52b2x1bWUoKTtcblxuICAgICAgICAvLyBCZWdpbiBsb2FkaW5nIHRoZSBzb3VyY2UuXG4gICAgICAgIHNlbGYuX25vZGUubG9hZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBzb3VuZCB0byB0aGUgb3JpZ2luYWwgc3RhdGUgKGZvciByZWN5Y2xlKS5cbiAgICAgKiBAcmV0dXJuIHtTb3VuZH1cbiAgICAgKi9cbiAgICByZXNldDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBSZXNldCBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBzb3VuZC5cbiAgICAgIHNlbGYuX211dGVkID0gcGFyZW50Ll9tdXRlZDtcbiAgICAgIHNlbGYuX2xvb3AgPSBwYXJlbnQuX2xvb3A7XG4gICAgICBzZWxmLl92b2x1bWUgPSBwYXJlbnQuX3ZvbHVtZTtcbiAgICAgIHNlbGYuX3JhdGUgPSBwYXJlbnQuX3JhdGU7XG4gICAgICBzZWxmLl9zZWVrID0gMDtcbiAgICAgIHNlbGYuX3JhdGVTZWVrID0gMDtcbiAgICAgIHNlbGYuX3BhdXNlZCA9IHRydWU7XG4gICAgICBzZWxmLl9lbmRlZCA9IHRydWU7XG4gICAgICBzZWxmLl9zcHJpdGUgPSAnX19kZWZhdWx0JztcblxuICAgICAgLy8gR2VuZXJhdGUgYSBuZXcgSUQgc28gdGhhdCBpdCBpc24ndCBjb25mdXNlZCB3aXRoIHRoZSBwcmV2aW91cyBzb3VuZC5cbiAgICAgIHNlbGYuX2lkID0gKytIb3dsZXIuX2NvdW50ZXI7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIVE1MNSBBdWRpbyBlcnJvciBsaXN0ZW5lciBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBfZXJyb3JMaXN0ZW5lcjogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIEZpcmUgYW4gZXJyb3IgZXZlbnQgYW5kIHBhc3MgYmFjayB0aGUgY29kZS5cbiAgICAgIHNlbGYuX3BhcmVudC5fZW1pdCgnbG9hZGVycm9yJywgc2VsZi5faWQsIHNlbGYuX25vZGUuZXJyb3IgPyBzZWxmLl9ub2RlLmVycm9yLmNvZGUgOiAwKTtcblxuICAgICAgLy8gQ2xlYXIgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgc2VsZi5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHNlbGYuX2Vycm9yRm4sIGZhbHNlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSFRNTDUgQXVkaW8gY2FucGxheXRocm91Z2ggbGlzdGVuZXIgY2FsbGJhY2suXG4gICAgICovXG4gICAgX2xvYWRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBSb3VuZCB1cCB0aGUgZHVyYXRpb24gdG8gYWNjb3VudCBmb3IgdGhlIGxvd2VyIHByZWNpc2lvbiBpbiBIVE1MNSBBdWRpby5cbiAgICAgIHBhcmVudC5fZHVyYXRpb24gPSBNYXRoLmNlaWwoc2VsZi5fbm9kZS5kdXJhdGlvbiAqIDEwKSAvIDEwO1xuXG4gICAgICAvLyBTZXR1cCBhIHNwcml0ZSBpZiBub25lIGlzIGRlZmluZWQuXG4gICAgICBpZiAoT2JqZWN0LmtleXMocGFyZW50Ll9zcHJpdGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwYXJlbnQuX3Nwcml0ZSA9IHtfX2RlZmF1bHQ6IFswLCBwYXJlbnQuX2R1cmF0aW9uICogMTAwMF19O1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Ll9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgcGFyZW50Ll9zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgICBwYXJlbnQuX2VtaXQoJ2xvYWQnKTtcbiAgICAgICAgcGFyZW50Ll9sb2FkUXVldWUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgc2VsZi5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBzZWxmLl9sb2FkRm4sIGZhbHNlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSFRNTDUgQXVkaW8gZW5kZWQgbGlzdGVuZXIgY2FsbGJhY2suXG4gICAgICovXG4gICAgX2VuZExpc3RlbmVyOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBwYXJlbnQgPSBzZWxmLl9wYXJlbnQ7XG5cbiAgICAgIC8vIE9ubHkgaGFuZGxlIHRoZSBgZW5kZWRgYCBldmVudCBpZiB0aGUgZHVyYXRpb24gaXMgSW5maW5pdHkuXG4gICAgICBpZiAocGFyZW50Ll9kdXJhdGlvbiA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBwYXJlbnQgZHVyYXRpb24gdG8gbWF0Y2ggdGhlIHJlYWwgYXVkaW8gZHVyYXRpb24uXG4gICAgICAgIC8vIFJvdW5kIHVwIHRoZSBkdXJhdGlvbiB0byBhY2NvdW50IGZvciB0aGUgbG93ZXIgcHJlY2lzaW9uIGluIEhUTUw1IEF1ZGlvLlxuICAgICAgICBwYXJlbnQuX2R1cmF0aW9uID0gTWF0aC5jZWlsKHNlbGYuX25vZGUuZHVyYXRpb24gKiAxMCkgLyAxMDtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIHNwcml0ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSByZWFsIGR1cmF0aW9uLlxuICAgICAgICBpZiAocGFyZW50Ll9zcHJpdGUuX19kZWZhdWx0WzFdID09PSBJbmZpbml0eSkge1xuICAgICAgICAgIHBhcmVudC5fc3ByaXRlLl9fZGVmYXVsdFsxXSA9IHBhcmVudC5fZHVyYXRpb24gKiAxMDAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVuIHRoZSByZWd1bGFyIGVuZGVkIG1ldGhvZC5cbiAgICAgICAgcGFyZW50Ll9lbmRlZChzZWxmKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGhlIGV2ZW50IGxpc3RlbmVyIHNpbmNlIHRoZSBkdXJhdGlvbiBpcyBub3cgY29ycmVjdC5cbiAgICAgIHNlbGYuX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBzZWxmLl9lbmRGbiwgZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICAvKiogSGVscGVyIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgdmFyIGNhY2hlID0ge307XG5cbiAgLyoqXG4gICAqIEJ1ZmZlciBhIHNvdW5kIGZyb20gVVJMLCBEYXRhIFVSSSBvciBjYWNoZSBhbmQgZGVjb2RlIHRvIGF1ZGlvIHNvdXJjZSAoV2ViIEF1ZGlvIEFQSSkuXG4gICAqIEBwYXJhbSAge0hvd2x9IHNlbGZcbiAgICovXG4gIHZhciBsb2FkQnVmZmVyID0gZnVuY3Rpb24oc2VsZikge1xuICAgIHZhciB1cmwgPSBzZWxmLl9zcmM7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gY2FjaGVkIGFuZCB1c2UgaXQgaW5zdGVhZC5cbiAgICBpZiAoY2FjaGVbdXJsXSkge1xuICAgICAgLy8gU2V0IHRoZSBkdXJhdGlvbiBmcm9tIHRoZSBjYWNoZS5cbiAgICAgIHNlbGYuX2R1cmF0aW9uID0gY2FjaGVbdXJsXS5kdXJhdGlvbjtcblxuICAgICAgLy8gTG9hZCB0aGUgc291bmQgaW50byB0aGlzIEhvd2wuXG4gICAgICBsb2FkU291bmQoc2VsZik7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoL15kYXRhOlteO10rO2Jhc2U2NCwvLnRlc3QodXJsKSkge1xuICAgICAgLy8gRGVjb2RlIHRoZSBiYXNlNjQgZGF0YSBVUkkgd2l0aG91dCBYSFIsIHNpbmNlIHNvbWUgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCBpdC5cbiAgICAgIHZhciBkYXRhID0gYXRvYih1cmwuc3BsaXQoJywnKVsxXSk7XG4gICAgICB2YXIgZGF0YVZpZXcgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpPTA7IGk8ZGF0YS5sZW5ndGg7ICsraSkge1xuICAgICAgICBkYXRhVmlld1tpXSA9IGRhdGEuY2hhckNvZGVBdChpKTtcbiAgICAgIH1cblxuICAgICAgZGVjb2RlQXVkaW9EYXRhKGRhdGFWaWV3LmJ1ZmZlciwgc2VsZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExvYWQgdGhlIGJ1ZmZlciBmcm9tIHRoZSBVUkwuXG4gICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICB4aHIub3BlbihzZWxmLl94aHIubWV0aG9kLCB1cmwsIHRydWUpO1xuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHNlbGYuX3hoci53aXRoQ3JlZGVudGlhbHM7XG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcblxuICAgICAgLy8gQXBwbHkgYW55IGN1c3RvbSBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0LlxuICAgICAgaWYgKHNlbGYuX3hoci5oZWFkZXJzKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHNlbGYuX3hoci5oZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgc2VsZi5feGhyLmhlYWRlcnNba2V5XSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBnZXQgYSBzdWNjZXNzZnVsIHJlc3BvbnNlIGJhY2suXG4gICAgICAgIHZhciBjb2RlID0gKHhoci5zdGF0dXMgKyAnJylbMF07XG4gICAgICAgIGlmIChjb2RlICE9PSAnMCcgJiYgY29kZSAhPT0gJzInICYmIGNvZGUgIT09ICczJykge1xuICAgICAgICAgIHNlbGYuX2VtaXQoJ2xvYWRlcnJvcicsIG51bGwsICdGYWlsZWQgbG9hZGluZyBhdWRpbyBmaWxlIHdpdGggc3RhdHVzOiAnICsgeGhyLnN0YXR1cyArICcuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVjb2RlQXVkaW9EYXRhKHhoci5yZXNwb25zZSwgc2VsZik7XG4gICAgICB9O1xuICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHN3aXRjaCB0byBIVE1MNSBBdWRpby5cbiAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgc2VsZi5faHRtbDUgPSB0cnVlO1xuICAgICAgICAgIHNlbGYuX3dlYkF1ZGlvID0gZmFsc2U7XG4gICAgICAgICAgc2VsZi5fc291bmRzID0gW107XG4gICAgICAgICAgZGVsZXRlIGNhY2hlW3VybF07XG4gICAgICAgICAgc2VsZi5sb2FkKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBzYWZlWGhyU2VuZCh4aHIpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU2VuZCB0aGUgWEhSIHJlcXVlc3Qgd3JhcHBlZCBpbiBhIHRyeS9jYXRjaC5cbiAgICogQHBhcmFtICB7T2JqZWN0fSB4aHIgWEhSIHRvIHNlbmQuXG4gICAqL1xuICB2YXIgc2FmZVhoclNlbmQgPSBmdW5jdGlvbih4aHIpIHtcbiAgICB0cnkge1xuICAgICAgeGhyLnNlbmQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB4aHIub25lcnJvcigpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRGVjb2RlIGF1ZGlvIGRhdGEgZnJvbSBhbiBhcnJheSBidWZmZXIuXG4gICAqIEBwYXJhbSAge0FycmF5QnVmZmVyfSBhcnJheWJ1ZmZlciBUaGUgYXVkaW8gZGF0YS5cbiAgICogQHBhcmFtICB7SG93bH0gICAgICAgIHNlbGZcbiAgICovXG4gIHZhciBkZWNvZGVBdWRpb0RhdGEgPSBmdW5jdGlvbihhcnJheWJ1ZmZlciwgc2VsZikge1xuICAgIC8vIEZpcmUgYSBsb2FkIGVycm9yIGlmIHNvbWV0aGluZyBicm9rZS5cbiAgICB2YXIgZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuX2VtaXQoJ2xvYWRlcnJvcicsIG51bGwsICdEZWNvZGluZyBhdWRpbyBkYXRhIGZhaWxlZC4nKTtcbiAgICB9O1xuXG4gICAgLy8gTG9hZCB0aGUgc291bmQgb24gc3VjY2Vzcy5cbiAgICB2YXIgc3VjY2VzcyA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAgICAgaWYgKGJ1ZmZlciAmJiBzZWxmLl9zb3VuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjYWNoZVtzZWxmLl9zcmNdID0gYnVmZmVyO1xuICAgICAgICBsb2FkU291bmQoc2VsZiwgYnVmZmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIERlY29kZSB0aGUgYnVmZmVyIGludG8gYW4gYXVkaW8gc291cmNlLlxuICAgIGlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgSG93bGVyLmN0eC5kZWNvZGVBdWRpb0RhdGEubGVuZ3RoID09PSAxKSB7XG4gICAgICBIb3dsZXIuY3R4LmRlY29kZUF1ZGlvRGF0YShhcnJheWJ1ZmZlcikudGhlbihzdWNjZXNzKS5jYXRjaChlcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIEhvd2xlci5jdHguZGVjb2RlQXVkaW9EYXRhKGFycmF5YnVmZmVyLCBzdWNjZXNzLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvdW5kIGlzIG5vdyBsb2FkZWQsIHNvIGZpbmlzaCBzZXR0aW5nIGV2ZXJ5dGhpbmcgdXAgYW5kIGZpcmUgdGhlIGxvYWRlZCBldmVudC5cbiAgICogQHBhcmFtICB7SG93bH0gc2VsZlxuICAgKiBAcGFyYW0gIHtPYmplY3R9IGJ1ZmZlciBUaGUgZGVjb2RlZCBidWZmZXIgc291bmQgc291cmNlLlxuICAgKi9cbiAgdmFyIGxvYWRTb3VuZCA9IGZ1bmN0aW9uKHNlbGYsIGJ1ZmZlcikge1xuICAgIC8vIFNldCB0aGUgZHVyYXRpb24uXG4gICAgaWYgKGJ1ZmZlciAmJiAhc2VsZi5fZHVyYXRpb24pIHtcbiAgICAgIHNlbGYuX2R1cmF0aW9uID0gYnVmZmVyLmR1cmF0aW9uO1xuICAgIH1cblxuICAgIC8vIFNldHVwIGEgc3ByaXRlIGlmIG5vbmUgaXMgZGVmaW5lZC5cbiAgICBpZiAoT2JqZWN0LmtleXMoc2VsZi5fc3ByaXRlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHNlbGYuX3Nwcml0ZSA9IHtfX2RlZmF1bHQ6IFswLCBzZWxmLl9kdXJhdGlvbiAqIDEwMDBdfTtcbiAgICB9XG5cbiAgICAvLyBGaXJlIHRoZSBsb2FkZWQgZXZlbnQuXG4gICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgc2VsZi5fc3RhdGUgPSAnbG9hZGVkJztcbiAgICAgIHNlbGYuX2VtaXQoJ2xvYWQnKTtcbiAgICAgIHNlbGYuX2xvYWRRdWV1ZSgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU2V0dXAgdGhlIGF1ZGlvIGNvbnRleHQgd2hlbiBhdmFpbGFibGUsIG9yIHN3aXRjaCB0byBIVE1MNSBBdWRpbyBtb2RlLlxuICAgKi9cbiAgdmFyIHNldHVwQXVkaW9Db250ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IGRldGVjdGVkIHRoYXQgV2ViIEF1ZGlvIGlzbid0IHN1cHBvcnRlZCwgZG9uJ3QgcnVuIHRoaXMgc3RlcCBhZ2Fpbi5cbiAgICBpZiAoIUhvd2xlci51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgd2UgYXJlIHVzaW5nIFdlYiBBdWRpbyBhbmQgc2V0dXAgdGhlIEF1ZGlvQ29udGV4dCBpZiB3ZSBhcmUuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgQXVkaW9Db250ZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBIb3dsZXIuY3R4ID0gbmV3IEF1ZGlvQ29udGV4dCgpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygd2Via2l0QXVkaW9Db250ZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBIb3dsZXIuY3R4ID0gbmV3IHdlYmtpdEF1ZGlvQ29udGV4dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgSG93bGVyLnVzaW5nV2ViQXVkaW8gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIEhvd2xlci51c2luZ1dlYkF1ZGlvID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGF1ZGlvIGNvbnRleHQgY3JlYXRpb24gc3RpbGwgZmFpbGVkLCBzZXQgdXNpbmcgd2ViIGF1ZGlvIHRvIGZhbHNlLlxuICAgIGlmICghSG93bGVyLmN0eCkge1xuICAgICAgSG93bGVyLnVzaW5nV2ViQXVkaW8gPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBhIHdlYnZpZXcgaXMgYmVpbmcgdXNlZCBvbiBpT1M4IG9yIGVhcmxpZXIgKHJhdGhlciB0aGFuIHRoZSBicm93c2VyKS5cbiAgICAvLyBJZiBpdCBpcywgZGlzYWJsZSBXZWIgQXVkaW8gYXMgaXQgY2F1c2VzIGNyYXNoaW5nLlxuICAgIHZhciBpT1MgPSAoL2lQKGhvbmV8b2R8YWQpLy50ZXN0KEhvd2xlci5fbmF2aWdhdG9yICYmIEhvd2xlci5fbmF2aWdhdG9yLnBsYXRmb3JtKSk7XG4gICAgdmFyIGFwcFZlcnNpb24gPSBIb3dsZXIuX25hdmlnYXRvciAmJiBIb3dsZXIuX25hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9PUyAoXFxkKylfKFxcZCspXz8oXFxkKyk/Lyk7XG4gICAgdmFyIHZlcnNpb24gPSBhcHBWZXJzaW9uID8gcGFyc2VJbnQoYXBwVmVyc2lvblsxXSwgMTApIDogbnVsbDtcbiAgICBpZiAoaU9TICYmIHZlcnNpb24gJiYgdmVyc2lvbiA8IDkpIHtcbiAgICAgIHZhciBzYWZhcmkgPSAvc2FmYXJpLy50ZXN0KEhvd2xlci5fbmF2aWdhdG9yICYmIEhvd2xlci5fbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGlmIChIb3dsZXIuX25hdmlnYXRvciAmJiAhc2FmYXJpKSB7XG4gICAgICAgIEhvd2xlci51c2luZ1dlYkF1ZGlvID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFuZCBleHBvc2UgdGhlIG1hc3RlciBHYWluTm9kZSB3aGVuIHVzaW5nIFdlYiBBdWRpbyAodXNlZnVsIGZvciBwbHVnaW5zIG9yIGFkdmFuY2VkIHVzYWdlKS5cbiAgICBpZiAoSG93bGVyLnVzaW5nV2ViQXVkaW8pIHtcbiAgICAgIEhvd2xlci5tYXN0ZXJHYWluID0gKHR5cGVvZiBIb3dsZXIuY3R4LmNyZWF0ZUdhaW4gPT09ICd1bmRlZmluZWQnKSA/IEhvd2xlci5jdHguY3JlYXRlR2Fpbk5vZGUoKSA6IEhvd2xlci5jdHguY3JlYXRlR2FpbigpO1xuICAgICAgSG93bGVyLm1hc3RlckdhaW4uZ2Fpbi5zZXRWYWx1ZUF0VGltZShIb3dsZXIuX211dGVkID8gMCA6IEhvd2xlci5fdm9sdW1lLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgIEhvd2xlci5tYXN0ZXJHYWluLmNvbm5lY3QoSG93bGVyLmN0eC5kZXN0aW5hdGlvbik7XG4gICAgfVxuXG4gICAgLy8gUmUtcnVuIHRoZSBzZXR1cCBvbiBIb3dsZXIuXG4gICAgSG93bGVyLl9zZXR1cCgpO1xuICB9O1xuXG4gIC8vIEFkZCBzdXBwb3J0IGZvciBBTUQgKEFzeW5jaHJvbm91cyBNb2R1bGUgRGVmaW5pdGlvbikgbGlicmFyaWVzIHN1Y2ggYXMgcmVxdWlyZS5qcy5cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbXSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBIb3dsZXI6IEhvd2xlcixcbiAgICAgICAgSG93bDogSG93bFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEFkZCBzdXBwb3J0IGZvciBDb21tb25KUyBsaWJyYXJpZXMgc3VjaCBhcyBicm93c2VyaWZ5LlxuICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZXhwb3J0cy5Ib3dsZXIgPSBIb3dsZXI7XG4gICAgZXhwb3J0cy5Ib3dsID0gSG93bDtcbiAgfVxuXG4gIC8vIEFkZCB0byBnbG9iYWwgaW4gTm9kZS5qcyAoZm9yIHRlc3RpbmcsIGV0YykuXG4gIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIGdsb2JhbC5Ib3dsZXJHbG9iYWwgPSBIb3dsZXJHbG9iYWw7XG4gICAgZ2xvYmFsLkhvd2xlciA9IEhvd2xlcjtcbiAgICBnbG9iYWwuSG93bCA9IEhvd2w7XG4gICAgZ2xvYmFsLlNvdW5kID0gU291bmQ7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHsgIC8vIERlZmluZSBnbG9iYWxseSBpbiBjYXNlIEFNRCBpcyBub3QgYXZhaWxhYmxlIG9yIHVudXNlZC5cbiAgICB3aW5kb3cuSG93bGVyR2xvYmFsID0gSG93bGVyR2xvYmFsO1xuICAgIHdpbmRvdy5Ib3dsZXIgPSBIb3dsZXI7XG4gICAgd2luZG93Lkhvd2wgPSBIb3dsO1xuICAgIHdpbmRvdy5Tb3VuZCA9IFNvdW5kO1xuICB9XG59KSgpO1xuXG5cbi8qIVxuICogIFNwYXRpYWwgUGx1Z2luIC0gQWRkcyBzdXBwb3J0IGZvciBzdGVyZW8gYW5kIDNEIGF1ZGlvIHdoZXJlIFdlYiBBdWRpbyBpcyBzdXBwb3J0ZWQuXG4gKiAgXG4gKiAgaG93bGVyLmpzIHYyLjIuMVxuICogIGhvd2xlcmpzLmNvbVxuICpcbiAqICAoYykgMjAxMy0yMDIwLCBKYW1lcyBTaW1wc29uIG9mIEdvbGRGaXJlIFN0dWRpb3NcbiAqICBnb2xkZmlyZXN0dWRpb3MuY29tXG4gKlxuICogIE1JVCBMaWNlbnNlXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuXG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBTZXR1cCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUuX3BvcyA9IFswLCAwLCAwXTtcbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZS5fb3JpZW50YXRpb24gPSBbMCwgMCwgLTEsIDAsIDEsIDBdO1xuXG4gIC8qKiBHbG9iYWwgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byB1cGRhdGUgdGhlIHN0ZXJlbyBwYW5uaW5nIHBvc2l0aW9uIG9mIGFsbCBjdXJyZW50IEhvd2xzLlxuICAgKiBGdXR1cmUgSG93bHMgd2lsbCBub3QgdXNlIHRoaXMgdmFsdWUgdW5sZXNzIGV4cGxpY2l0bHkgc2V0LlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHBhbiBBIHZhbHVlIG9mIC0xLjAgaXMgYWxsIHRoZSB3YXkgbGVmdCBhbmQgMS4wIGlzIGFsbCB0aGUgd2F5IHJpZ2h0LlxuICAgKiBAcmV0dXJuIHtIb3dsZXIvTnVtYmVyfSAgICAgU2VsZiBvciBjdXJyZW50IHN0ZXJlbyBwYW5uaW5nIHZhbHVlLlxuICAgKi9cbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZS5zdGVyZW8gPSBmdW5jdGlvbihwYW4pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuY3R4IHx8ICFzZWxmLmN0eC5saXN0ZW5lcikge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBIb3dscyBhbmQgdXBkYXRlIHRoZWlyIHN0ZXJlbyBwYW5uaW5nLlxuICAgIGZvciAodmFyIGk9c2VsZi5faG93bHMubGVuZ3RoLTE7IGk+PTA7IGktLSkge1xuICAgICAgc2VsZi5faG93bHNbaV0uc3RlcmVvKHBhbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBsaXN0ZW5lciBpbiAzRCBjYXJ0ZXNpYW4gc3BhY2UuIFNvdW5kcyB1c2luZ1xuICAgKiAzRCBwb3NpdGlvbiB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsaXN0ZW5lcidzIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHggVGhlIHgtcG9zaXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHkgVGhlIHktcG9zaXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHogVGhlIHotcG9zaXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcmV0dXJuIHtIb3dsZXIvQXJyYXl9ICAgU2VsZiBvciBjdXJyZW50IGxpc3RlbmVyIHBvc2l0aW9uLlxuICAgKi9cbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZS5wb3MgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLmN0eCB8fCAhc2VsZi5jdHgubGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdHMgZm9yIG9wdGlvbmFsICd5JyAmICd6Jy5cbiAgICB5ID0gKHR5cGVvZiB5ICE9PSAnbnVtYmVyJykgPyBzZWxmLl9wb3NbMV0gOiB5O1xuICAgIHogPSAodHlwZW9mIHogIT09ICdudW1iZXInKSA/IHNlbGYuX3Bvc1syXSA6IHo7XG5cbiAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICBzZWxmLl9wb3MgPSBbeCwgeSwgel07XG5cbiAgICAgIGlmICh0eXBlb2Ygc2VsZi5jdHgubGlzdGVuZXIucG9zaXRpb25YICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci5wb3NpdGlvblguc2V0VGFyZ2V0QXRUaW1lKHNlbGYuX3Bvc1swXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIucG9zaXRpb25ZLnNldFRhcmdldEF0VGltZShzZWxmLl9wb3NbMV0sIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnBvc2l0aW9uWi5zZXRUYXJnZXRBdFRpbWUoc2VsZi5fcG9zWzJdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIuc2V0UG9zaXRpb24oc2VsZi5fcG9zWzBdLCBzZWxmLl9wb3NbMV0sIHNlbGYuX3Bvc1syXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzZWxmLl9wb3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIGRpcmVjdGlvbiB0aGUgbGlzdGVuZXIgaXMgcG9pbnRpbmcgaW4gdGhlIDNEIGNhcnRlc2lhbiBzcGFjZS5cbiAgICogQSBmcm9udCBhbmQgdXAgdmVjdG9yIG11c3QgYmUgcHJvdmlkZWQuIFRoZSBmcm9udCBpcyB0aGUgZGlyZWN0aW9uIHRoZVxuICAgKiBmYWNlIG9mIHRoZSBsaXN0ZW5lciBpcyBwb2ludGluZywgYW5kIHVwIGlzIHRoZSBkaXJlY3Rpb24gdGhlIHRvcCBvZiB0aGVcbiAgICogbGlzdGVuZXIgaXMgcG9pbnRpbmcuIFRodXMsIHRoZXNlIHZhbHVlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgYXQgcmlnaHQgYW5nbGVzXG4gICAqIGZyb20gZWFjaCBvdGhlci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB4ICAgVGhlIHgtb3JpZW50YXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHkgICBUaGUgeS1vcmllbnRhdGlvbiBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geiAgIFRoZSB6LW9yaWVudGF0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB4VXAgVGhlIHgtb3JpZW50YXRpb24gb2YgdGhlIHRvcCBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geVVwIFRoZSB5LW9yaWVudGF0aW9uIG9mIHRoZSB0b3Agb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHpVcCBUaGUgei1vcmllbnRhdGlvbiBvZiB0aGUgdG9wIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHJldHVybiB7SG93bGVyL0FycmF5fSAgICAgUmV0dXJucyBzZWxmIG9yIHRoZSBjdXJyZW50IG9yaWVudGF0aW9uIHZlY3RvcnMuXG4gICAqL1xuICBIb3dsZXJHbG9iYWwucHJvdG90eXBlLm9yaWVudGF0aW9uID0gZnVuY3Rpb24oeCwgeSwgeiwgeFVwLCB5VXAsIHpVcCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5jdHggfHwgIXNlbGYuY3R4Lmxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIGRlZmF1bHRzIGZvciBvcHRpb25hbCAneScgJiAneicuXG4gICAgdmFyIG9yID0gc2VsZi5fb3JpZW50YXRpb247XG4gICAgeSA9ICh0eXBlb2YgeSAhPT0gJ251bWJlcicpID8gb3JbMV0gOiB5O1xuICAgIHogPSAodHlwZW9mIHogIT09ICdudW1iZXInKSA/IG9yWzJdIDogejtcbiAgICB4VXAgPSAodHlwZW9mIHhVcCAhPT0gJ251bWJlcicpID8gb3JbM10gOiB4VXA7XG4gICAgeVVwID0gKHR5cGVvZiB5VXAgIT09ICdudW1iZXInKSA/IG9yWzRdIDogeVVwO1xuICAgIHpVcCA9ICh0eXBlb2YgelVwICE9PSAnbnVtYmVyJykgPyBvcls1XSA6IHpVcDtcblxuICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHNlbGYuX29yaWVudGF0aW9uID0gW3gsIHksIHosIHhVcCwgeVVwLCB6VXBdO1xuXG4gICAgICBpZiAodHlwZW9mIHNlbGYuY3R4Lmxpc3RlbmVyLmZvcndhcmRYICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci5mb3J3YXJkWC5zZXRUYXJnZXRBdFRpbWUoeCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIuZm9yd2FyZFkuc2V0VGFyZ2V0QXRUaW1lKHksIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLmZvcndhcmRaLnNldFRhcmdldEF0VGltZSh6LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci51cFguc2V0VGFyZ2V0QXRUaW1lKHhVcCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIudXBZLnNldFRhcmdldEF0VGltZSh5VXAsIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnVwWi5zZXRUYXJnZXRBdFRpbWUoelVwLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIuc2V0T3JpZW50YXRpb24oeCwgeSwgeiwgeFVwLCB5VXAsIHpVcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKiogR3JvdXAgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogQWRkIG5ldyBwcm9wZXJ0aWVzIHRvIHRoZSBjb3JlIGluaXQuXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBfc3VwZXIgQ29yZSBpbml0IG1ldGhvZC5cbiAgICogQHJldHVybiB7SG93bH1cbiAgICovXG4gIEhvd2wucHJvdG90eXBlLmluaXQgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG8pIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gU2V0dXAgdXNlci1kZWZpbmVkIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgIHNlbGYuX29yaWVudGF0aW9uID0gby5vcmllbnRhdGlvbiB8fCBbMSwgMCwgMF07XG4gICAgICBzZWxmLl9zdGVyZW8gPSBvLnN0ZXJlbyB8fCBudWxsO1xuICAgICAgc2VsZi5fcG9zID0gby5wb3MgfHwgbnVsbDtcbiAgICAgIHNlbGYuX3Bhbm5lckF0dHIgPSB7XG4gICAgICAgIGNvbmVJbm5lckFuZ2xlOiB0eXBlb2Ygby5jb25lSW5uZXJBbmdsZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLmNvbmVJbm5lckFuZ2xlIDogMzYwLFxuICAgICAgICBjb25lT3V0ZXJBbmdsZTogdHlwZW9mIG8uY29uZU91dGVyQW5nbGUgIT09ICd1bmRlZmluZWQnID8gby5jb25lT3V0ZXJBbmdsZSA6IDM2MCxcbiAgICAgICAgY29uZU91dGVyR2FpbjogdHlwZW9mIG8uY29uZU91dGVyR2FpbiAhPT0gJ3VuZGVmaW5lZCcgPyBvLmNvbmVPdXRlckdhaW4gOiAwLFxuICAgICAgICBkaXN0YW5jZU1vZGVsOiB0eXBlb2Ygby5kaXN0YW5jZU1vZGVsICE9PSAndW5kZWZpbmVkJyA/IG8uZGlzdGFuY2VNb2RlbCA6ICdpbnZlcnNlJyxcbiAgICAgICAgbWF4RGlzdGFuY2U6IHR5cGVvZiBvLm1heERpc3RhbmNlICE9PSAndW5kZWZpbmVkJyA/IG8ubWF4RGlzdGFuY2UgOiAxMDAwMCxcbiAgICAgICAgcGFubmluZ01vZGVsOiB0eXBlb2Ygby5wYW5uaW5nTW9kZWwgIT09ICd1bmRlZmluZWQnID8gby5wYW5uaW5nTW9kZWwgOiAnSFJURicsXG4gICAgICAgIHJlZkRpc3RhbmNlOiB0eXBlb2Ygby5yZWZEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLnJlZkRpc3RhbmNlIDogMSxcbiAgICAgICAgcm9sbG9mZkZhY3RvcjogdHlwZW9mIG8ucm9sbG9mZkZhY3RvciAhPT0gJ3VuZGVmaW5lZCcgPyBvLnJvbGxvZmZGYWN0b3IgOiAxXG4gICAgICB9O1xuXG4gICAgICAvLyBTZXR1cCBldmVudCBsaXN0ZW5lcnMuXG4gICAgICBzZWxmLl9vbnN0ZXJlbyA9IG8ub25zdGVyZW8gPyBbe2ZuOiBvLm9uc3RlcmVvfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucG9zID0gby5vbnBvcyA/IFt7Zm46IG8ub25wb3N9XSA6IFtdO1xuICAgICAgc2VsZi5fb25vcmllbnRhdGlvbiA9IG8ub25vcmllbnRhdGlvbiA/IFt7Zm46IG8ub25vcmllbnRhdGlvbn1dIDogW107XG5cbiAgICAgIC8vIENvbXBsZXRlIGluaXRpbGl6YXRpb24gd2l0aCBob3dsZXIuanMgY29yZSdzIGluaXQgZnVuY3Rpb24uXG4gICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgbyk7XG4gICAgfTtcbiAgfSkoSG93bC5wcm90b3R5cGUuaW5pdCk7XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIHN0ZXJlbyBwYW5uaW5nIG9mIHRoZSBhdWRpbyBzb3VyY2UgZm9yIHRoaXMgc291bmQgb3IgYWxsIGluIHRoZSBncm91cC5cbiAgICogQHBhcmFtICB7TnVtYmVyfSBwYW4gIEEgdmFsdWUgb2YgLTEuMCBpcyBhbGwgdGhlIHdheSBsZWZ0IGFuZCAxLjAgaXMgYWxsIHRoZSB3YXkgcmlnaHQuXG4gICAqIEBwYXJhbSAge051bWJlcn0gaWQgKG9wdGlvbmFsKSBUaGUgc291bmQgSUQuIElmIG5vbmUgaXMgcGFzc2VkLCBhbGwgaW4gZ3JvdXAgd2lsbCBiZSB1cGRhdGVkLlxuICAgKiBAcmV0dXJuIHtIb3dsL051bWJlcn0gICAgUmV0dXJucyBzZWxmIG9yIHRoZSBjdXJyZW50IHN0ZXJlbyBwYW5uaW5nIHZhbHVlLlxuICAgKi9cbiAgSG93bC5wcm90b3R5cGUuc3RlcmVvID0gZnVuY3Rpb24ocGFuLCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gY2hhbmdlIHN0ZXJlbyBwYW4gd2hlbiBjYXBhYmxlLlxuICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogJ3N0ZXJlbycsXG4gICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5zdGVyZW8ocGFuLCBpZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgUGFubmVyU3RlcmVvTm9kZSBzdXBwb3J0IGFuZCBmYWxsYmFjayB0byBQYW5uZXJOb2RlIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgdmFyIHBhbm5lclR5cGUgPSAodHlwZW9mIEhvd2xlci5jdHguY3JlYXRlU3RlcmVvUGFubmVyID09PSAndW5kZWZpbmVkJykgPyAnc3BhdGlhbCcgOiAnc3RlcmVvJztcblxuICAgIC8vIFNldHVwIHRoZSBncm91cCdzIHN0ZXJlbyBwYW5uaW5nIGlmIG5vIElEIGlzIHBhc3NlZC5cbiAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gUmV0dXJuIHRoZSBncm91cCdzIHN0ZXJlbyBwYW5uaW5nIGlmIG5vIHBhcmFtZXRlcnMgYXJlIHBhc3NlZC5cbiAgICAgIGlmICh0eXBlb2YgcGFuID09PSAnbnVtYmVyJykge1xuICAgICAgICBzZWxmLl9zdGVyZW8gPSBwYW47XG4gICAgICAgIHNlbGYuX3BvcyA9IFtwYW4sIDAsIDBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX3N0ZXJlbztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGFuZ2UgdGhlIHN0cmVvIHBhbm5pbmcgb2Ygb25lIG9yIGFsbCBzb3VuZHMgaW4gZ3JvdXAuXG4gICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICBpZiAodHlwZW9mIHBhbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBzb3VuZC5fc3RlcmVvID0gcGFuO1xuICAgICAgICAgIHNvdW5kLl9wb3MgPSBbcGFuLCAwLCAwXTtcblxuICAgICAgICAgIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGZhbGxpbmcgYmFjaywgbWFrZSBzdXJlIHRoZSBwYW5uaW5nTW9kZWwgaXMgZXF1YWxwb3dlci5cbiAgICAgICAgICAgIHNvdW5kLl9wYW5uZXJBdHRyLnBhbm5pbmdNb2RlbCA9ICdlcXVhbHBvd2VyJztcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBwYW5uZXIgc2V0dXAgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbm90LlxuICAgICAgICAgICAgaWYgKCFzb3VuZC5fcGFubmVyIHx8ICFzb3VuZC5fcGFubmVyLnBhbikge1xuICAgICAgICAgICAgICBzZXR1cFBhbm5lcihzb3VuZCwgcGFubmVyVHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwYW5uZXJUeXBlID09PSAnc3BhdGlhbCcpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWC5zZXRWYWx1ZUF0VGltZShwYW4sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25ZLnNldFZhbHVlQXRUaW1lKDAsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25aLnNldFZhbHVlQXRUaW1lKDAsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIuc2V0UG9zaXRpb24ocGFuLCAwLCAwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5wYW4uc2V0VmFsdWVBdFRpbWUocGFuLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLl9lbWl0KCdzdGVyZW8nLCBzb3VuZC5faWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzb3VuZC5fc3RlcmVvO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIDNEIHNwYXRpYWwgcG9zaXRpb24gb2YgdGhlIGF1ZGlvIHNvdXJjZSBmb3IgdGhpcyBzb3VuZCBvciBncm91cCByZWxhdGl2ZSB0byB0aGUgZ2xvYmFsIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHggIFRoZSB4LXBvc2l0aW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UuXG4gICAqIEBwYXJhbSAge051bWJlcn0geSAgVGhlIHktcG9zaXRpb24gb2YgdGhlIGF1ZGlvIHNvdXJjZS5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB6ICBUaGUgei1wb3NpdGlvbiBvZiB0aGUgYXVkaW8gc291cmNlLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIChvcHRpb25hbCkgVGhlIHNvdW5kIElELiBJZiBub25lIGlzIHBhc3NlZCwgYWxsIGluIGdyb3VwIHdpbGwgYmUgdXBkYXRlZC5cbiAgICogQHJldHVybiB7SG93bC9BcnJheX0gICAgUmV0dXJucyBzZWxmIG9yIHRoZSBjdXJyZW50IDNEIHNwYXRpYWwgcG9zaXRpb246IFt4LCB5LCB6XS5cbiAgICovXG4gIEhvd2wucHJvdG90eXBlLnBvcyA9IGZ1bmN0aW9uKHgsIHksIHosIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLl93ZWJBdWRpbykge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBjaGFuZ2UgcG9zaXRpb24gd2hlbiBjYXBhYmxlLlxuICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogJ3BvcycsXG4gICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5wb3MoeCwgeSwgeiwgaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0cyBmb3Igb3B0aW9uYWwgJ3knICYgJ3onLlxuICAgIHkgPSAodHlwZW9mIHkgIT09ICdudW1iZXInKSA/IDAgOiB5O1xuICAgIHogPSAodHlwZW9mIHogIT09ICdudW1iZXInKSA/IC0wLjUgOiB6O1xuXG4gICAgLy8gU2V0dXAgdGhlIGdyb3VwJ3Mgc3BhdGlhbCBwb3NpdGlvbiBpZiBubyBJRCBpcyBwYXNzZWQuXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFJldHVybiB0aGUgZ3JvdXAncyBzcGF0aWFsIHBvc2l0aW9uIGlmIG5vIHBhcmFtZXRlcnMgYXJlIHBhc3NlZC5cbiAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2VsZi5fcG9zID0gW3gsIHksIHpdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX3BvcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGFuZ2UgdGhlIHNwYXRpYWwgcG9zaXRpb24gb2Ygb25lIG9yIGFsbCBzb3VuZHMgaW4gZ3JvdXAuXG4gICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgc291bmQuX3BvcyA9IFt4LCB5LCB6XTtcblxuICAgICAgICAgIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBwYW5uZXIgc2V0dXAgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbm90LlxuICAgICAgICAgICAgaWYgKCFzb3VuZC5fcGFubmVyIHx8IHNvdW5kLl9wYW5uZXIucGFuKSB7XG4gICAgICAgICAgICAgIHNldHVwUGFubmVyKHNvdW5kLCAnc3BhdGlhbCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdW5kLl9wYW5uZXIucG9zaXRpb25YICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWC5zZXRWYWx1ZUF0VGltZSh4LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblkuc2V0VmFsdWVBdFRpbWUoeSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25aLnNldFZhbHVlQXRUaW1lKHosIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5zZXRQb3NpdGlvbih4LCB5LCB6KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLl9lbWl0KCdwb3MnLCBzb3VuZC5faWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzb3VuZC5fcG9zO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIGRpcmVjdGlvbiB0aGUgYXVkaW8gc291cmNlIGlzIHBvaW50aW5nIGluIHRoZSAzRCBjYXJ0ZXNpYW4gY29vcmRpbmF0ZVxuICAgKiBzcGFjZS4gRGVwZW5kaW5nIG9uIGhvdyBkaXJlY3Rpb24gdGhlIHNvdW5kIGlzLCBiYXNlZCBvbiB0aGUgYGNvbmVgIGF0dHJpYnV0ZXMsXG4gICAqIGEgc291bmQgcG9pbnRpbmcgYXdheSBmcm9tIHRoZSBsaXN0ZW5lciBjYW4gYmUgcXVpZXQgb3Igc2lsZW50LlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHggIFRoZSB4LW9yaWVudGF0aW9uIG9mIHRoZSBzb3VyY2UuXG4gICAqIEBwYXJhbSAge051bWJlcn0geSAgVGhlIHktb3JpZW50YXRpb24gb2YgdGhlIHNvdXJjZS5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB6ICBUaGUgei1vcmllbnRhdGlvbiBvZiB0aGUgc291cmNlLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIChvcHRpb25hbCkgVGhlIHNvdW5kIElELiBJZiBub25lIGlzIHBhc3NlZCwgYWxsIGluIGdyb3VwIHdpbGwgYmUgdXBkYXRlZC5cbiAgICogQHJldHVybiB7SG93bC9BcnJheX0gICAgUmV0dXJucyBzZWxmIG9yIHRoZSBjdXJyZW50IDNEIHNwYXRpYWwgb3JpZW50YXRpb246IFt4LCB5LCB6XS5cbiAgICovXG4gIEhvd2wucHJvdG90eXBlLm9yaWVudGF0aW9uID0gZnVuY3Rpb24oeCwgeSwgeiwgaWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIGNoYW5nZSBvcmllbnRhdGlvbiB3aGVuIGNhcGFibGUuXG4gICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiAnb3JpZW50YXRpb24nLFxuICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYub3JpZW50YXRpb24oeCwgeSwgeiwgaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0cyBmb3Igb3B0aW9uYWwgJ3knICYgJ3onLlxuICAgIHkgPSAodHlwZW9mIHkgIT09ICdudW1iZXInKSA/IHNlbGYuX29yaWVudGF0aW9uWzFdIDogeTtcbiAgICB6ID0gKHR5cGVvZiB6ICE9PSAnbnVtYmVyJykgPyBzZWxmLl9vcmllbnRhdGlvblsyXSA6IHo7XG5cbiAgICAvLyBTZXR1cCB0aGUgZ3JvdXAncyBzcGF0aWFsIG9yaWVudGF0aW9uIGlmIG5vIElEIGlzIHBhc3NlZC5cbiAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gUmV0dXJuIHRoZSBncm91cCdzIHNwYXRpYWwgb3JpZW50YXRpb24gaWYgbm8gcGFyYW1ldGVycyBhcmUgcGFzc2VkLlxuICAgICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuICAgICAgICBzZWxmLl9vcmllbnRhdGlvbiA9IFt4LCB5LCB6XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzZWxmLl9vcmllbnRhdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGFuZ2UgdGhlIHNwYXRpYWwgb3JpZW50YXRpb24gb2Ygb25lIG9yIGFsbCBzb3VuZHMgaW4gZ3JvdXAuXG4gICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgc291bmQuX29yaWVudGF0aW9uID0gW3gsIHksIHpdO1xuXG4gICAgICAgICAgaWYgKHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHBhbm5lciBzZXR1cCBhbmQgY3JlYXRlIGEgbmV3IG9uZSBpZiBub3QuXG4gICAgICAgICAgICBpZiAoIXNvdW5kLl9wYW5uZXIpIHtcbiAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBwb3NpdGlvbiB0byBzZXR1cCB0aGUgbm9kZSB3aXRoLlxuICAgICAgICAgICAgICBpZiAoIXNvdW5kLl9wb3MpIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fcG9zID0gc2VsZi5fcG9zIHx8IFswLCAwLCAtMC41XTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNldHVwUGFubmVyKHNvdW5kLCAnc3BhdGlhbCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25YICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLm9yaWVudGF0aW9uWC5zZXRWYWx1ZUF0VGltZSh4LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblkuc2V0VmFsdWVBdFRpbWUoeSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25aLnNldFZhbHVlQXRUaW1lKHosIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5zZXRPcmllbnRhdGlvbih4LCB5LCB6KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLl9lbWl0KCdvcmllbnRhdGlvbicsIHNvdW5kLl9pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNvdW5kLl9vcmllbnRhdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBwYW5uZXIgbm9kZSdzIGF0dHJpYnV0ZXMgZm9yIGEgc291bmQgb3IgZ3JvdXAgb2Ygc291bmRzLlxuICAgKiBUaGlzIG1ldGhvZCBjYW4gb3B0aW9uYWxsIHRha2UgMCwgMSBvciAyIGFyZ3VtZW50cy5cbiAgICogICBwYW5uZXJBdHRyKCkgLT4gUmV0dXJucyB0aGUgZ3JvdXAncyB2YWx1ZXMuXG4gICAqICAgcGFubmVyQXR0cihpZCkgLT4gUmV0dXJucyB0aGUgc291bmQgaWQncyB2YWx1ZXMuXG4gICAqICAgcGFubmVyQXR0cihvKSAtPiBTZXQncyB0aGUgdmFsdWVzIG9mIGFsbCBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgKiAgIHBhbm5lckF0dHIobywgaWQpIC0+IFNldCdzIHRoZSB2YWx1ZXMgb2YgcGFzc2VkIHNvdW5kIGlkLlxuICAgKlxuICAgKiAgIEF0dHJpYnV0ZXM6XG4gICAqICAgICBjb25lSW5uZXJBbmdsZSAtICgzNjAgYnkgZGVmYXVsdCkgQSBwYXJhbWV0ZXIgZm9yIGRpcmVjdGlvbmFsIGF1ZGlvIHNvdXJjZXMsIHRoaXMgaXMgYW4gYW5nbGUsIGluIGRlZ3JlZXMsXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGluc2lkZSBvZiB3aGljaCB0aGVyZSB3aWxsIGJlIG5vIHZvbHVtZSByZWR1Y3Rpb24uXG4gICAqICAgICBjb25lT3V0ZXJBbmdsZSAtICgzNjAgYnkgZGVmYXVsdCkgQSBwYXJhbWV0ZXIgZm9yIGRpcmVjdGlvbmFsIGF1ZGlvIHNvdXJjZXMsIHRoaXMgaXMgYW4gYW5nbGUsIGluIGRlZ3JlZXMsXG4gICAqICAgICAgICAgICAgICAgICAgICAgIG91dHNpZGUgb2Ygd2hpY2ggdGhlIHZvbHVtZSB3aWxsIGJlIHJlZHVjZWQgdG8gYSBjb25zdGFudCB2YWx1ZSBvZiBgY29uZU91dGVyR2FpbmAuXG4gICAqICAgICBjb25lT3V0ZXJHYWluIC0gKDAgYnkgZGVmYXVsdCkgQSBwYXJhbWV0ZXIgZm9yIGRpcmVjdGlvbmFsIGF1ZGlvIHNvdXJjZXMsIHRoaXMgaXMgdGhlIGdhaW4gb3V0c2lkZSBvZiB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICBgY29uZU91dGVyQW5nbGVgLiBJdCBpcyBhIGxpbmVhciB2YWx1ZSBpbiB0aGUgcmFuZ2UgYFswLCAxXWAuXG4gICAqICAgICBkaXN0YW5jZU1vZGVsIC0gKCdpbnZlcnNlJyBieSBkZWZhdWx0KSBEZXRlcm1pbmVzIGFsZ29yaXRobSB1c2VkIHRvIHJlZHVjZSB2b2x1bWUgYXMgYXVkaW8gbW92ZXMgYXdheSBmcm9tXG4gICAqICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuIENhbiBiZSBgbGluZWFyYCwgYGludmVyc2VgIG9yIGBleHBvbmVudGlhbC5cbiAgICogICAgIG1heERpc3RhbmNlIC0gKDEwMDAwIGJ5IGRlZmF1bHQpIFRoZSBtYXhpbXVtIGRpc3RhbmNlIGJldHdlZW4gc291cmNlIGFuZCBsaXN0ZW5lciwgYWZ0ZXIgd2hpY2ggdGhlIHZvbHVtZVxuICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIG5vdCBiZSByZWR1Y2VkIGFueSBmdXJ0aGVyLlxuICAgKiAgICAgcmVmRGlzdGFuY2UgLSAoMSBieSBkZWZhdWx0KSBBIHJlZmVyZW5jZSBkaXN0YW5jZSBmb3IgcmVkdWNpbmcgdm9sdW1lIGFzIHNvdXJjZSBtb3ZlcyBmdXJ0aGVyIGZyb20gdGhlIGxpc3RlbmVyLlxuICAgKiAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHNpbXBseSBhIHZhcmlhYmxlIG9mIHRoZSBkaXN0YW5jZSBtb2RlbCBhbmQgaGFzIGEgZGlmZmVyZW50IGVmZmVjdCBkZXBlbmRpbmcgb24gd2hpY2ggbW9kZWxcbiAgICogICAgICAgICAgICAgICAgICAgaXMgdXNlZCBhbmQgdGhlIHNjYWxlIG9mIHlvdXIgY29vcmRpbmF0ZXMuIEdlbmVyYWxseSwgdm9sdW1lIHdpbGwgYmUgZXF1YWwgdG8gMSBhdCB0aGlzIGRpc3RhbmNlLlxuICAgKiAgICAgcm9sbG9mZkZhY3RvciAtICgxIGJ5IGRlZmF1bHQpIEhvdyBxdWlja2x5IHRoZSB2b2x1bWUgcmVkdWNlcyBhcyBzb3VyY2UgbW92ZXMgZnJvbSBsaXN0ZW5lci4gVGhpcyBpcyBzaW1wbHkgYVxuICAgKiAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9mIHRoZSBkaXN0YW5jZSBtb2RlbCBhbmQgY2FuIGJlIGluIHRoZSByYW5nZSBvZiBgWzAsIDFdYCB3aXRoIGBsaW5lYXJgIGFuZCBgWzAsIOKInl1gXG4gICAqICAgICAgICAgICAgICAgICAgICAgd2l0aCBgaW52ZXJzZWAgYW5kIGBleHBvbmVudGlhbGAuXG4gICAqICAgICBwYW5uaW5nTW9kZWwgLSAoJ0hSVEYnIGJ5IGRlZmF1bHQpIERldGVybWluZXMgd2hpY2ggc3BhdGlhbGl6YXRpb24gYWxnb3JpdGhtIGlzIHVzZWQgdG8gcG9zaXRpb24gYXVkaW8uXG4gICAqICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGBIUlRGYCBvciBgZXF1YWxwb3dlcmAuXG4gICAqXG4gICAqIEByZXR1cm4ge0hvd2wvT2JqZWN0fSBSZXR1cm5zIHNlbGYgb3IgY3VycmVudCBwYW5uZXIgYXR0cmlidXRlcy5cbiAgICovXG4gIEhvd2wucHJvdG90eXBlLnBhbm5lckF0dHIgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIG8sIGlkLCBzb3VuZDtcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSB0aGUgdmFsdWVzIGJhc2VkIG9uIGFyZ3VtZW50cy5cbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFJldHVybiB0aGUgZ3JvdXAncyBwYW5uZXIgYXR0cmlidXRlIHZhbHVlcy5cbiAgICAgIHJldHVybiBzZWxmLl9wYW5uZXJBdHRyO1xuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgbyA9IGFyZ3NbMF07XG5cbiAgICAgICAgLy8gU2V0IHRoZSBncm91J3MgcGFubmVyIGF0dHJpYnV0ZSB2YWx1ZXMuXG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKCFvLnBhbm5lckF0dHIpIHtcbiAgICAgICAgICAgIG8ucGFubmVyQXR0ciA9IHtcbiAgICAgICAgICAgICAgY29uZUlubmVyQW5nbGU6IG8uY29uZUlubmVyQW5nbGUsXG4gICAgICAgICAgICAgIGNvbmVPdXRlckFuZ2xlOiBvLmNvbmVPdXRlckFuZ2xlLFxuICAgICAgICAgICAgICBjb25lT3V0ZXJHYWluOiBvLmNvbmVPdXRlckdhaW4sXG4gICAgICAgICAgICAgIGRpc3RhbmNlTW9kZWw6IG8uZGlzdGFuY2VNb2RlbCxcbiAgICAgICAgICAgICAgbWF4RGlzdGFuY2U6IG8ubWF4RGlzdGFuY2UsXG4gICAgICAgICAgICAgIHJlZkRpc3RhbmNlOiBvLnJlZkRpc3RhbmNlLFxuICAgICAgICAgICAgICByb2xsb2ZmRmFjdG9yOiBvLnJvbGxvZmZGYWN0b3IsXG4gICAgICAgICAgICAgIHBhbm5pbmdNb2RlbDogby5wYW5uaW5nTW9kZWxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fcGFubmVyQXR0ciA9IHtcbiAgICAgICAgICAgIGNvbmVJbm5lckFuZ2xlOiB0eXBlb2Ygby5wYW5uZXJBdHRyLmNvbmVJbm5lckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5jb25lSW5uZXJBbmdsZSA6IHNlbGYuX2NvbmVJbm5lckFuZ2xlLFxuICAgICAgICAgICAgY29uZU91dGVyQW5nbGU6IHR5cGVvZiBvLnBhbm5lckF0dHIuY29uZU91dGVyQW5nbGUgIT09ICd1bmRlZmluZWQnID8gby5wYW5uZXJBdHRyLmNvbmVPdXRlckFuZ2xlIDogc2VsZi5fY29uZU91dGVyQW5nbGUsXG4gICAgICAgICAgICBjb25lT3V0ZXJHYWluOiB0eXBlb2Ygby5wYW5uZXJBdHRyLmNvbmVPdXRlckdhaW4gIT09ICd1bmRlZmluZWQnID8gby5wYW5uZXJBdHRyLmNvbmVPdXRlckdhaW4gOiBzZWxmLl9jb25lT3V0ZXJHYWluLFxuICAgICAgICAgICAgZGlzdGFuY2VNb2RlbDogdHlwZW9mIG8ucGFubmVyQXR0ci5kaXN0YW5jZU1vZGVsICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5kaXN0YW5jZU1vZGVsIDogc2VsZi5fZGlzdGFuY2VNb2RlbCxcbiAgICAgICAgICAgIG1heERpc3RhbmNlOiB0eXBlb2Ygby5wYW5uZXJBdHRyLm1heERpc3RhbmNlICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5tYXhEaXN0YW5jZSA6IHNlbGYuX21heERpc3RhbmNlLFxuICAgICAgICAgICAgcmVmRGlzdGFuY2U6IHR5cGVvZiBvLnBhbm5lckF0dHIucmVmRGlzdGFuY2UgIT09ICd1bmRlZmluZWQnID8gby5wYW5uZXJBdHRyLnJlZkRpc3RhbmNlIDogc2VsZi5fcmVmRGlzdGFuY2UsXG4gICAgICAgICAgICByb2xsb2ZmRmFjdG9yOiB0eXBlb2Ygby5wYW5uZXJBdHRyLnJvbGxvZmZGYWN0b3IgIT09ICd1bmRlZmluZWQnID8gby5wYW5uZXJBdHRyLnJvbGxvZmZGYWN0b3IgOiBzZWxmLl9yb2xsb2ZmRmFjdG9yLFxuICAgICAgICAgICAgcGFubmluZ01vZGVsOiB0eXBlb2Ygby5wYW5uZXJBdHRyLnBhbm5pbmdNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIucGFubmluZ01vZGVsIDogc2VsZi5fcGFubmluZ01vZGVsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoaXMgc291bmQncyBwYW5uZXIgYXR0cmlidXRlIHZhbHVlcy5cbiAgICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQocGFyc2VJbnQoYXJnc1swXSwgMTApKTtcbiAgICAgICAgcmV0dXJuIHNvdW5kID8gc291bmQuX3Bhbm5lckF0dHIgOiBzZWxmLl9wYW5uZXJBdHRyO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICAgIG8gPSBhcmdzWzBdO1xuICAgICAgaWQgPSBwYXJzZUludChhcmdzWzFdLCAxMCk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBzb3VuZHMuXG4gICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgLy8gTWVyZ2UgdGhlIG5ldyB2YWx1ZXMgaW50byB0aGUgc291bmQuXG4gICAgICAgIHZhciBwYSA9IHNvdW5kLl9wYW5uZXJBdHRyO1xuICAgICAgICBwYSA9IHtcbiAgICAgICAgICBjb25lSW5uZXJBbmdsZTogdHlwZW9mIG8uY29uZUlubmVyQW5nbGUgIT09ICd1bmRlZmluZWQnID8gby5jb25lSW5uZXJBbmdsZSA6IHBhLmNvbmVJbm5lckFuZ2xlLFxuICAgICAgICAgIGNvbmVPdXRlckFuZ2xlOiB0eXBlb2Ygby5jb25lT3V0ZXJBbmdsZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLmNvbmVPdXRlckFuZ2xlIDogcGEuY29uZU91dGVyQW5nbGUsXG4gICAgICAgICAgY29uZU91dGVyR2FpbjogdHlwZW9mIG8uY29uZU91dGVyR2FpbiAhPT0gJ3VuZGVmaW5lZCcgPyBvLmNvbmVPdXRlckdhaW4gOiBwYS5jb25lT3V0ZXJHYWluLFxuICAgICAgICAgIGRpc3RhbmNlTW9kZWw6IHR5cGVvZiBvLmRpc3RhbmNlTW9kZWwgIT09ICd1bmRlZmluZWQnID8gby5kaXN0YW5jZU1vZGVsIDogcGEuZGlzdGFuY2VNb2RlbCxcbiAgICAgICAgICBtYXhEaXN0YW5jZTogdHlwZW9mIG8ubWF4RGlzdGFuY2UgIT09ICd1bmRlZmluZWQnID8gby5tYXhEaXN0YW5jZSA6IHBhLm1heERpc3RhbmNlLFxuICAgICAgICAgIHJlZkRpc3RhbmNlOiB0eXBlb2Ygby5yZWZEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLnJlZkRpc3RhbmNlIDogcGEucmVmRGlzdGFuY2UsXG4gICAgICAgICAgcm9sbG9mZkZhY3RvcjogdHlwZW9mIG8ucm9sbG9mZkZhY3RvciAhPT0gJ3VuZGVmaW5lZCcgPyBvLnJvbGxvZmZGYWN0b3IgOiBwYS5yb2xsb2ZmRmFjdG9yLFxuICAgICAgICAgIHBhbm5pbmdNb2RlbDogdHlwZW9mIG8ucGFubmluZ01vZGVsICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmluZ01vZGVsIDogcGEucGFubmluZ01vZGVsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBwYW5uZXIgdmFsdWVzIG9yIGNyZWF0ZSBhIG5ldyBwYW5uZXIgaWYgbm9uZSBleGlzdHMuXG4gICAgICAgIHZhciBwYW5uZXIgPSBzb3VuZC5fcGFubmVyO1xuICAgICAgICBpZiAocGFubmVyKSB7XG4gICAgICAgICAgcGFubmVyLmNvbmVJbm5lckFuZ2xlID0gcGEuY29uZUlubmVyQW5nbGU7XG4gICAgICAgICAgcGFubmVyLmNvbmVPdXRlckFuZ2xlID0gcGEuY29uZU91dGVyQW5nbGU7XG4gICAgICAgICAgcGFubmVyLmNvbmVPdXRlckdhaW4gPSBwYS5jb25lT3V0ZXJHYWluO1xuICAgICAgICAgIHBhbm5lci5kaXN0YW5jZU1vZGVsID0gcGEuZGlzdGFuY2VNb2RlbDtcbiAgICAgICAgICBwYW5uZXIubWF4RGlzdGFuY2UgPSBwYS5tYXhEaXN0YW5jZTtcbiAgICAgICAgICBwYW5uZXIucmVmRGlzdGFuY2UgPSBwYS5yZWZEaXN0YW5jZTtcbiAgICAgICAgICBwYW5uZXIucm9sbG9mZkZhY3RvciA9IHBhLnJvbGxvZmZGYWN0b3I7XG4gICAgICAgICAgcGFubmVyLnBhbm5pbmdNb2RlbCA9IHBhLnBhbm5pbmdNb2RlbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHBvc2l0aW9uIHRvIHNldHVwIHRoZSBub2RlIHdpdGguXG4gICAgICAgICAgaWYgKCFzb3VuZC5fcG9zKSB7XG4gICAgICAgICAgICBzb3VuZC5fcG9zID0gc2VsZi5fcG9zIHx8IFswLCAwLCAtMC41XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGFubmVyIG5vZGUuXG4gICAgICAgICAgc2V0dXBQYW5uZXIoc291bmQsICdzcGF0aWFsJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKiogU2luZ2xlIFNvdW5kIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIEFkZCBuZXcgcHJvcGVydGllcyB0byB0aGUgY29yZSBTb3VuZCBpbml0LlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gX3N1cGVyIENvcmUgU291bmQgaW5pdCBtZXRob2QuXG4gICAqIEByZXR1cm4ge1NvdW5kfVxuICAgKi9cbiAgU291bmQucHJvdG90eXBlLmluaXQgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcblxuICAgICAgLy8gU2V0dXAgdXNlci1kZWZpbmVkIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgIHNlbGYuX29yaWVudGF0aW9uID0gcGFyZW50Ll9vcmllbnRhdGlvbjtcbiAgICAgIHNlbGYuX3N0ZXJlbyA9IHBhcmVudC5fc3RlcmVvO1xuICAgICAgc2VsZi5fcG9zID0gcGFyZW50Ll9wb3M7XG4gICAgICBzZWxmLl9wYW5uZXJBdHRyID0gcGFyZW50Ll9wYW5uZXJBdHRyO1xuXG4gICAgICAvLyBDb21wbGV0ZSBpbml0aWxpemF0aW9uIHdpdGggaG93bGVyLmpzIGNvcmUgU291bmQncyBpbml0IGZ1bmN0aW9uLlxuICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG5cbiAgICAgIC8vIElmIGEgc3RlcmVvIG9yIHBvc2l0aW9uIHdhcyBzcGVjaWZpZWQsIHNldCBpdCB1cC5cbiAgICAgIGlmIChzZWxmLl9zdGVyZW8pIHtcbiAgICAgICAgcGFyZW50LnN0ZXJlbyhzZWxmLl9zdGVyZW8pO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLl9wb3MpIHtcbiAgICAgICAgcGFyZW50LnBvcyhzZWxmLl9wb3NbMF0sIHNlbGYuX3Bvc1sxXSwgc2VsZi5fcG9zWzJdLCBzZWxmLl9pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSkoU291bmQucHJvdG90eXBlLmluaXQpO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgU291bmQucmVzZXQgbWV0aG9kIHRvIGNsZWFuIHVwIHByb3BlcnRpZXMgZnJvbSB0aGUgc3BhdGlhbCBwbHVnaW4uXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBfc3VwZXIgU291bmQgcmVzZXQgbWV0aG9kLlxuICAgKiBAcmV0dXJuIHtTb3VuZH1cbiAgICovXG4gIFNvdW5kLnByb3RvdHlwZS5yZXNldCA9IChmdW5jdGlvbihfc3VwZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBSZXNldCBhbGwgc3BhdGlhbCBwbHVnaW4gcHJvcGVydGllcyBvbiB0aGlzIHNvdW5kLlxuICAgICAgc2VsZi5fb3JpZW50YXRpb24gPSBwYXJlbnQuX29yaWVudGF0aW9uO1xuICAgICAgc2VsZi5fc3RlcmVvID0gcGFyZW50Ll9zdGVyZW87XG4gICAgICBzZWxmLl9wb3MgPSBwYXJlbnQuX3BvcztcbiAgICAgIHNlbGYuX3Bhbm5lckF0dHIgPSBwYXJlbnQuX3Bhbm5lckF0dHI7XG5cbiAgICAgIC8vIElmIGEgc3RlcmVvIG9yIHBvc2l0aW9uIHdhcyBzcGVjaWZpZWQsIHNldCBpdCB1cC5cbiAgICAgIGlmIChzZWxmLl9zdGVyZW8pIHtcbiAgICAgICAgcGFyZW50LnN0ZXJlbyhzZWxmLl9zdGVyZW8pO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLl9wb3MpIHtcbiAgICAgICAgcGFyZW50LnBvcyhzZWxmLl9wb3NbMF0sIHNlbGYuX3Bvc1sxXSwgc2VsZi5fcG9zWzJdLCBzZWxmLl9pZCk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGYuX3Bhbm5lcikge1xuICAgICAgICAvLyBEaXNjb25uZWN0IHRoZSBwYW5uZXIuXG4gICAgICAgIHNlbGYuX3Bhbm5lci5kaXNjb25uZWN0KDApO1xuICAgICAgICBzZWxmLl9wYW5uZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHBhcmVudC5fcmVmcmVzaEJ1ZmZlcihzZWxmKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29tcGxldGUgcmVzZXR0aW5nIG9mIHRoZSBzb3VuZC5cbiAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICB9O1xuICB9KShTb3VuZC5wcm90b3R5cGUucmVzZXQpO1xuXG4gIC8qKiBIZWxwZXIgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBhbm5lciBub2RlIGFuZCBzYXZlIGl0IG9uIHRoZSBzb3VuZC5cbiAgICogQHBhcmFtICB7U291bmR9IHNvdW5kIFNwZWNpZmljIHNvdW5kIHRvIHNldHVwIHBhbm5pbmcgb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFR5cGUgb2YgcGFubmVyIHRvIGNyZWF0ZTogJ3N0ZXJlbycgb3IgJ3NwYXRpYWwnLlxuICAgKi9cbiAgdmFyIHNldHVwUGFubmVyID0gZnVuY3Rpb24oc291bmQsIHR5cGUpIHtcbiAgICB0eXBlID0gdHlwZSB8fCAnc3BhdGlhbCc7XG5cbiAgICAvLyBDcmVhdGUgdGhlIG5ldyBwYW5uZXIgbm9kZS5cbiAgICBpZiAodHlwZSA9PT0gJ3NwYXRpYWwnKSB7XG4gICAgICBzb3VuZC5fcGFubmVyID0gSG93bGVyLmN0eC5jcmVhdGVQYW5uZXIoKTtcbiAgICAgIHNvdW5kLl9wYW5uZXIuY29uZUlubmVyQW5nbGUgPSBzb3VuZC5fcGFubmVyQXR0ci5jb25lSW5uZXJBbmdsZTtcbiAgICAgIHNvdW5kLl9wYW5uZXIuY29uZU91dGVyQW5nbGUgPSBzb3VuZC5fcGFubmVyQXR0ci5jb25lT3V0ZXJBbmdsZTtcbiAgICAgIHNvdW5kLl9wYW5uZXIuY29uZU91dGVyR2FpbiA9IHNvdW5kLl9wYW5uZXJBdHRyLmNvbmVPdXRlckdhaW47XG4gICAgICBzb3VuZC5fcGFubmVyLmRpc3RhbmNlTW9kZWwgPSBzb3VuZC5fcGFubmVyQXR0ci5kaXN0YW5jZU1vZGVsO1xuICAgICAgc291bmQuX3Bhbm5lci5tYXhEaXN0YW5jZSA9IHNvdW5kLl9wYW5uZXJBdHRyLm1heERpc3RhbmNlO1xuICAgICAgc291bmQuX3Bhbm5lci5yZWZEaXN0YW5jZSA9IHNvdW5kLl9wYW5uZXJBdHRyLnJlZkRpc3RhbmNlO1xuICAgICAgc291bmQuX3Bhbm5lci5yb2xsb2ZmRmFjdG9yID0gc291bmQuX3Bhbm5lckF0dHIucm9sbG9mZkZhY3RvcjtcbiAgICAgIHNvdW5kLl9wYW5uZXIucGFubmluZ01vZGVsID0gc291bmQuX3Bhbm5lckF0dHIucGFubmluZ01vZGVsO1xuXG4gICAgICBpZiAodHlwZW9mIHNvdW5kLl9wYW5uZXIucG9zaXRpb25YICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWC5zZXRWYWx1ZUF0VGltZShzb3VuZC5fcG9zWzBdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblkuc2V0VmFsdWVBdFRpbWUoc291bmQuX3Bvc1sxXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25aLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9wb3NbMl0sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291bmQuX3Bhbm5lci5zZXRQb3NpdGlvbihzb3VuZC5fcG9zWzBdLCBzb3VuZC5fcG9zWzFdLCBzb3VuZC5fcG9zWzJdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fcGFubmVyLm9yaWVudGF0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblguc2V0VmFsdWVBdFRpbWUoc291bmQuX29yaWVudGF0aW9uWzBdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblkuc2V0VmFsdWVBdFRpbWUoc291bmQuX29yaWVudGF0aW9uWzFdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblouc2V0VmFsdWVBdFRpbWUoc291bmQuX29yaWVudGF0aW9uWzJdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIuc2V0T3JpZW50YXRpb24oc291bmQuX29yaWVudGF0aW9uWzBdLCBzb3VuZC5fb3JpZW50YXRpb25bMV0sIHNvdW5kLl9vcmllbnRhdGlvblsyXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdW5kLl9wYW5uZXIgPSBIb3dsZXIuY3R4LmNyZWF0ZVN0ZXJlb1Bhbm5lcigpO1xuICAgICAgc291bmQuX3Bhbm5lci5wYW4uc2V0VmFsdWVBdFRpbWUoc291bmQuX3N0ZXJlbywgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgfVxuXG4gICAgc291bmQuX3Bhbm5lci5jb25uZWN0KHNvdW5kLl9ub2RlKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgY29ubmVjdGlvbnMuXG4gICAgaWYgKCFzb3VuZC5fcGF1c2VkKSB7XG4gICAgICBzb3VuZC5fcGFyZW50LnBhdXNlKHNvdW5kLl9pZCwgdHJ1ZSkucGxheShzb3VuZC5faWQsIHRydWUpO1xuICAgIH1cbiAgfTtcbn0pKCk7XG4iLCIvKiEgaWVlZTc1NC4gQlNELTMtQ2xhdXNlIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSAoZSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSAobSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICgodmFsdWUgKiBjKSAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxuXG52YXIgRXZlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBFdmVudCh0eXBlLCB0YXJnZXQpIHtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEV2ZW50O1xyXG59KCkpO1xyXG52YXIgRXJyb3JFdmVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcclxuICAgIF9fZXh0ZW5kcyhFcnJvckV2ZW50LCBfc3VwZXIpO1xyXG4gICAgZnVuY3Rpb24gRXJyb3JFdmVudChlcnJvciwgdGFyZ2V0KSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgJ2Vycm9yJywgdGFyZ2V0KSB8fCB0aGlzO1xyXG4gICAgICAgIF90aGlzLm1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xyXG4gICAgICAgIF90aGlzLmVycm9yID0gZXJyb3I7XHJcbiAgICAgICAgcmV0dXJuIF90aGlzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEVycm9yRXZlbnQ7XHJcbn0oRXZlbnQpKTtcclxudmFyIENsb3NlRXZlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XHJcbiAgICBfX2V4dGVuZHMoQ2xvc2VFdmVudCwgX3N1cGVyKTtcclxuICAgIGZ1bmN0aW9uIENsb3NlRXZlbnQoY29kZSwgcmVhc29uLCB0YXJnZXQpIHtcclxuICAgICAgICBpZiAoY29kZSA9PT0gdm9pZCAwKSB7IGNvZGUgPSAxMDAwOyB9XHJcbiAgICAgICAgaWYgKHJlYXNvbiA9PT0gdm9pZCAwKSB7IHJlYXNvbiA9ICcnOyB9XHJcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgJ2Nsb3NlJywgdGFyZ2V0KSB8fCB0aGlzO1xyXG4gICAgICAgIF90aGlzLndhc0NsZWFuID0gdHJ1ZTtcclxuICAgICAgICBfdGhpcy5jb2RlID0gY29kZTtcclxuICAgICAgICBfdGhpcy5yZWFzb24gPSByZWFzb247XHJcbiAgICAgICAgcmV0dXJuIF90aGlzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIENsb3NlRXZlbnQ7XHJcbn0oRXZlbnQpKTtcblxuLyohXHJcbiAqIFJlY29ubmVjdGluZyBXZWJTb2NrZXRcclxuICogYnkgUGVkcm8gTGFkYXJpYSA8cGVkcm8ubGFkYXJpYUBnbWFpbC5jb20+XHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9wbGFkYXJpYS9yZWNvbm5lY3Rpbmctd2Vic29ja2V0XHJcbiAqIExpY2Vuc2UgTUlUXHJcbiAqL1xyXG52YXIgZ2V0R2xvYmFsV2ViU29ja2V0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKHR5cGVvZiBXZWJTb2NrZXQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHJldHVybiBXZWJTb2NrZXQ7XHJcbiAgICB9XHJcbn07XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRydWUgaWYgZ2l2ZW4gYXJndW1lbnQgbG9va3MgbGlrZSBhIFdlYlNvY2tldCBjbGFzc1xyXG4gKi9cclxudmFyIGlzV2ViU29ja2V0ID0gZnVuY3Rpb24gKHcpIHsgcmV0dXJuIHR5cGVvZiB3ICE9PSAndW5kZWZpbmVkJyAmJiAhIXcgJiYgdy5DTE9TSU5HID09PSAyOyB9O1xyXG52YXIgREVGQVVMVCA9IHtcclxuICAgIG1heFJlY29ubmVjdGlvbkRlbGF5OiAxMDAwMCxcclxuICAgIG1pblJlY29ubmVjdGlvbkRlbGF5OiAxMDAwICsgTWF0aC5yYW5kb20oKSAqIDQwMDAsXHJcbiAgICBtaW5VcHRpbWU6IDUwMDAsXHJcbiAgICByZWNvbm5lY3Rpb25EZWxheUdyb3dGYWN0b3I6IDEuMyxcclxuICAgIGNvbm5lY3Rpb25UaW1lb3V0OiA0MDAwLFxyXG4gICAgbWF4UmV0cmllczogSW5maW5pdHksXHJcbiAgICBtYXhFbnF1ZXVlZE1lc3NhZ2VzOiBJbmZpbml0eSxcclxuICAgIHN0YXJ0Q2xvc2VkOiBmYWxzZSxcclxuICAgIGRlYnVnOiBmYWxzZSxcclxufTtcclxudmFyIFJlY29ubmVjdGluZ1dlYlNvY2tldCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIFJlY29ubmVjdGluZ1dlYlNvY2tldCh1cmwsIHByb3RvY29scywgb3B0aW9ucykge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cclxuICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSB7XHJcbiAgICAgICAgICAgIGVycm9yOiBbXSxcclxuICAgICAgICAgICAgbWVzc2FnZTogW10sXHJcbiAgICAgICAgICAgIG9wZW46IFtdLFxyXG4gICAgICAgICAgICBjbG9zZTogW10sXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9yZXRyeUNvdW50ID0gLTE7XHJcbiAgICAgICAgdGhpcy5fc2hvdWxkUmVjb25uZWN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9jb25uZWN0TG9jayA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2JpbmFyeVR5cGUgPSAnYmxvYic7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VDYWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlUXVldWUgPSBbXTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBldmVudCBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24ncyByZWFkeVN0YXRlIGNoYW5nZXMgdG8gQ0xPU0VEXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vbmNsb3NlID0gbnVsbDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBldmVudCBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiBhbiBlcnJvciBvY2N1cnNcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9uZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGNhbGxlZCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9ubWVzc2FnZSA9IG51bGw7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gZXZlbnQgbGlzdGVuZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uJ3MgcmVhZHlTdGF0ZSBjaGFuZ2VzIHRvIE9QRU47XHJcbiAgICAgICAgICogdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyByZWFkeSB0byBzZW5kIGFuZCByZWNlaXZlIGRhdGFcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9ub3BlbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5faGFuZGxlT3BlbiA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBfdGhpcy5fZGVidWcoJ29wZW4gZXZlbnQnKTtcclxuICAgICAgICAgICAgdmFyIF9hID0gX3RoaXMuX29wdGlvbnMubWluVXB0aW1lLCBtaW5VcHRpbWUgPSBfYSA9PT0gdm9pZCAwID8gREVGQVVMVC5taW5VcHRpbWUgOiBfYTtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLl9jb25uZWN0VGltZW91dCk7XHJcbiAgICAgICAgICAgIF90aGlzLl91cHRpbWVUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fYWNjZXB0T3BlbigpOyB9LCBtaW5VcHRpbWUpO1xyXG4gICAgICAgICAgICBfdGhpcy5fd3MuYmluYXJ5VHlwZSA9IF90aGlzLl9iaW5hcnlUeXBlO1xyXG4gICAgICAgICAgICAvLyBzZW5kIGVucXVldWVkIG1lc3NhZ2VzIChtZXNzYWdlcyBzZW50IGJlZm9yZSB3ZWJzb2NrZXQgb3BlbiBldmVudClcclxuICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VRdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uIChtZXNzYWdlKSB7IHJldHVybiBfdGhpcy5fd3Muc2VuZChtZXNzYWdlKTsgfSk7XHJcbiAgICAgICAgICAgIF90aGlzLl9tZXNzYWdlUXVldWUgPSBbXTtcclxuICAgICAgICAgICAgaWYgKF90aGlzLm9ub3Blbikge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25vcGVuKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdGhpcy5fbGlzdGVuZXJzLm9wZW4uZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIF90aGlzLl9jYWxsRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpOyB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZU1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMuX2RlYnVnKCdtZXNzYWdlIGV2ZW50Jyk7XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vbm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9ubWVzc2FnZShldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX3RoaXMuX2xpc3RlbmVycy5tZXNzYWdlLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBfdGhpcy5fY2FsbEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTsgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9oYW5kbGVFcnJvciA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBfdGhpcy5fZGVidWcoJ2Vycm9yIGV2ZW50JywgZXZlbnQubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIF90aGlzLl9kaXNjb25uZWN0KHVuZGVmaW5lZCwgZXZlbnQubWVzc2FnZSA9PT0gJ1RJTUVPVVQnID8gJ3RpbWVvdXQnIDogdW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgaWYgKF90aGlzLm9uZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9uZXJyb3IoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLl9kZWJ1ZygnZXhlYyBlcnJvciBsaXN0ZW5lcnMnKTtcclxuICAgICAgICAgICAgX3RoaXMuX2xpc3RlbmVycy5lcnJvci5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gX3RoaXMuX2NhbGxFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7IH0pO1xyXG4gICAgICAgICAgICBfdGhpcy5fY29ubmVjdCgpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5faGFuZGxlQ2xvc2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMuX2RlYnVnKCdjbG9zZSBldmVudCcpO1xyXG4gICAgICAgICAgICBfdGhpcy5fY2xlYXJUaW1lb3V0cygpO1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMuX3Nob3VsZFJlY29ubmVjdCkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoX3RoaXMub25jbG9zZSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25jbG9zZShldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX3RoaXMuX2xpc3RlbmVycy5jbG9zZS5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gX3RoaXMuX2NhbGxFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7IH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsO1xyXG4gICAgICAgIHRoaXMuX3Byb3RvY29scyA9IHByb3RvY29scztcclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5zdGFydENsb3NlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zaG91bGRSZWNvbm5lY3QgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29ubmVjdCgpO1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldCwgXCJDT05ORUNUSU5HXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LCBcIk9QRU5cIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQsIFwiQ0xPU0lOR1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAyO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldCwgXCJDTE9TRURcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gMztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcIkNPTk5FQ1RJTkdcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVjb25uZWN0aW5nV2ViU29ja2V0LkNPTk5FQ1RJTkc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJPUEVOXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlY29ubmVjdGluZ1dlYlNvY2tldC5PUEVOO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiQ0xPU0lOR1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQuQ0xPU0lORztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcIkNMT1NFRFwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQuQ0xPU0VEO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiYmluYXJ5VHlwZVwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93cyA/IHRoaXMuX3dzLmJpbmFyeVR5cGUgOiB0aGlzLl9iaW5hcnlUeXBlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fYmluYXJ5VHlwZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dzLmJpbmFyeVR5cGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwicmV0cnlDb3VudFwiLCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9yIGNvbm5lY3Rpb24gcmV0cmllc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5fcmV0cnlDb3VudCwgMCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJidWZmZXJlZEFtb3VudFwiLCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRoYXQgaGF2ZSBiZWVuIHF1ZXVlZCB1c2luZyBjYWxscyB0byBzZW5kKCkgYnV0IG5vdCB5ZXRcclxuICAgICAgICAgKiB0cmFuc21pdHRlZCB0byB0aGUgbmV0d29yay4gVGhpcyB2YWx1ZSByZXNldHMgdG8gemVybyBvbmNlIGFsbCBxdWV1ZWQgZGF0YSBoYXMgYmVlbiBzZW50LlxyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgZG9lcyBub3QgcmVzZXQgdG8gemVybyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZDsgaWYgeW91IGtlZXAgY2FsbGluZyBzZW5kKCksXHJcbiAgICAgICAgICogdGhpcyB3aWxsIGNvbnRpbnVlIHRvIGNsaW1iLiBSZWFkIG9ubHlcclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5fbWVzc2FnZVF1ZXVlLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjICs9IG1lc3NhZ2UubGVuZ3RoOyAvLyBub3QgYnl0ZSBzaXplXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgQmxvYikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjYyArPSBtZXNzYWdlLnNpemU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhY2MgKz0gbWVzc2FnZS5ieXRlTGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICAgIHJldHVybiBieXRlcyArICh0aGlzLl93cyA/IHRoaXMuX3dzLmJ1ZmZlcmVkQW1vdW50IDogMCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJleHRlbnNpb25zXCIsIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZXh0ZW5zaW9ucyBzZWxlY3RlZCBieSB0aGUgc2VydmVyLiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHRoZSBlbXB0eSBzdHJpbmcgb3IgYSBsaXN0IG9mXHJcbiAgICAgICAgICogZXh0ZW5zaW9ucyBhcyBuZWdvdGlhdGVkIGJ5IHRoZSBjb25uZWN0aW9uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93cyA/IHRoaXMuX3dzLmV4dGVuc2lvbnMgOiAnJztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcInByb3RvY29sXCIsIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBuYW1lIG9mIHRoZSBzdWItcHJvdG9jb2wgdGhlIHNlcnZlciBzZWxlY3RlZDtcclxuICAgICAgICAgKiB0aGlzIHdpbGwgYmUgb25lIG9mIHRoZSBzdHJpbmdzIHNwZWNpZmllZCBpbiB0aGUgcHJvdG9jb2xzIHBhcmFtZXRlciB3aGVuIGNyZWF0aW5nIHRoZVxyXG4gICAgICAgICAqIFdlYlNvY2tldCBvYmplY3RcclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dzID8gdGhpcy5fd3MucHJvdG9jb2wgOiAnJztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcInJlYWR5U3RhdGVcIiwge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uOyB0aGlzIGlzIG9uZSBvZiB0aGUgUmVhZHkgc3RhdGUgY29uc3RhbnRzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl93cykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dzLnJlYWR5U3RhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnMuc3RhcnRDbG9zZWRcclxuICAgICAgICAgICAgICAgID8gUmVjb25uZWN0aW5nV2ViU29ja2V0LkNMT1NFRFxyXG4gICAgICAgICAgICAgICAgOiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQuQ09OTkVDVElORztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcInVybFwiLCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFVSTCBhcyByZXNvbHZlZCBieSB0aGUgY29uc3RydWN0b3JcclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dzID8gdGhpcy5fd3MudXJsIDogJyc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICAvKipcclxuICAgICAqIENsb3NlcyB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gb3IgY29ubmVjdGlvbiBhdHRlbXB0LCBpZiBhbnkuIElmIHRoZSBjb25uZWN0aW9uIGlzIGFscmVhZHlcclxuICAgICAqIENMT1NFRCwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nXHJcbiAgICAgKi9cclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoY29kZSwgcmVhc29uKSB7XHJcbiAgICAgICAgaWYgKGNvZGUgPT09IHZvaWQgMCkgeyBjb2RlID0gMTAwMDsgfVxyXG4gICAgICAgIHRoaXMuX2Nsb3NlQ2FsbGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9zaG91bGRSZWNvbm5lY3QgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9jbGVhclRpbWVvdXRzKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93cykge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZygnY2xvc2UgZW5xdWV1ZWQ6IG5vIHdzIGluc3RhbmNlJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3dzLnJlYWR5U3RhdGUgPT09IHRoaXMuQ0xPU0VEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdjbG9zZTogYWxyZWFkeSBjbG9zZWQnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl93cy5jbG9zZShjb2RlLCByZWFzb24pO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogQ2xvc2VzIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBvciBjb25uZWN0aW9uIGF0dGVtcHQgYW5kIGNvbm5lY3RzIGFnYWluLlxyXG4gICAgICogUmVzZXRzIHJldHJ5IGNvdW50ZXI7XHJcbiAgICAgKi9cclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUucmVjb25uZWN0ID0gZnVuY3Rpb24gKGNvZGUsIHJlYXNvbikge1xyXG4gICAgICAgIHRoaXMuX3Nob3VsZFJlY29ubmVjdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VDYWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9yZXRyeUNvdW50ID0gLTE7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93cyB8fCB0aGlzLl93cy5yZWFkeVN0YXRlID09PSB0aGlzLkNMT1NFRCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9kaXNjb25uZWN0KGNvZGUsIHJlYXNvbik7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3QoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBFbnF1ZXVlIHNwZWNpZmllZCBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkIHRvIHRoZSBzZXJ2ZXIgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cclxuICAgICAqL1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICBpZiAodGhpcy5fd3MgJiYgdGhpcy5fd3MucmVhZHlTdGF0ZSA9PT0gdGhpcy5PUEVOKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdzZW5kJywgZGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dzLnNlbmQoZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLl9vcHRpb25zLm1heEVucXVldWVkTWVzc2FnZXMsIG1heEVucXVldWVkTWVzc2FnZXMgPSBfYSA9PT0gdm9pZCAwID8gREVGQVVMVC5tYXhFbnF1ZXVlZE1lc3NhZ2VzIDogX2E7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tZXNzYWdlUXVldWUubGVuZ3RoIDwgbWF4RW5xdWV1ZWRNZXNzYWdlcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJ2VucXVldWUnLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VRdWV1ZS5wdXNoKGRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgYW4gZXZlbnQgaGFuZGxlciBvZiBhIHNwZWNpZmljIGV2ZW50IHR5cGVcclxuICAgICAqL1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyc1t0eXBlXSkge1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyc1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgdmFyIGVfMSwgX2E7XHJcbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldmVudC50eXBlXTtcclxuICAgICAgICBpZiAobGlzdGVuZXJzKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBsaXN0ZW5lcnNfMSA9IF9fdmFsdWVzKGxpc3RlbmVycyksIGxpc3RlbmVyc18xXzEgPSBsaXN0ZW5lcnNfMS5uZXh0KCk7ICFsaXN0ZW5lcnNfMV8xLmRvbmU7IGxpc3RlbmVyc18xXzEgPSBsaXN0ZW5lcnNfMS5uZXh0KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNfMV8xLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cclxuICAgICAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNfMV8xICYmICFsaXN0ZW5lcnNfMV8xLmRvbmUgJiYgKF9hID0gbGlzdGVuZXJzXzEucmV0dXJuKSkgX2EuY2FsbChsaXN0ZW5lcnNfMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xyXG4gICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbdHlwZV0pIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gPSB0aGlzLl9saXN0ZW5lcnNbdHlwZV0uZmlsdGVyKGZ1bmN0aW9uIChsKSB7IHJldHVybiBsICE9PSBsaXN0ZW5lcjsgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2RlYnVnID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBhcmdzID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5kZWJ1Zykge1xyXG4gICAgICAgICAgICAvLyBub3QgdXNpbmcgc3ByZWFkIGJlY2F1c2UgY29tcGlsZWQgdmVyc2lvbiB1c2VzIFN5bWJvbHNcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIF9fc3ByZWFkKFsnUldTPiddLCBhcmdzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2dldE5leHREZWxheSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgX2EgPSB0aGlzLl9vcHRpb25zLCBfYiA9IF9hLnJlY29ubmVjdGlvbkRlbGF5R3Jvd0ZhY3RvciwgcmVjb25uZWN0aW9uRGVsYXlHcm93RmFjdG9yID0gX2IgPT09IHZvaWQgMCA/IERFRkFVTFQucmVjb25uZWN0aW9uRGVsYXlHcm93RmFjdG9yIDogX2IsIF9jID0gX2EubWluUmVjb25uZWN0aW9uRGVsYXksIG1pblJlY29ubmVjdGlvbkRlbGF5ID0gX2MgPT09IHZvaWQgMCA/IERFRkFVTFQubWluUmVjb25uZWN0aW9uRGVsYXkgOiBfYywgX2QgPSBfYS5tYXhSZWNvbm5lY3Rpb25EZWxheSwgbWF4UmVjb25uZWN0aW9uRGVsYXkgPSBfZCA9PT0gdm9pZCAwID8gREVGQVVMVC5tYXhSZWNvbm5lY3Rpb25EZWxheSA6IF9kO1xyXG4gICAgICAgIHZhciBkZWxheSA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JldHJ5Q291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGRlbGF5ID1cclxuICAgICAgICAgICAgICAgIG1pblJlY29ubmVjdGlvbkRlbGF5ICogTWF0aC5wb3cocmVjb25uZWN0aW9uRGVsYXlHcm93RmFjdG9yLCB0aGlzLl9yZXRyeUNvdW50IC0gMSk7XHJcbiAgICAgICAgICAgIGlmIChkZWxheSA+IG1heFJlY29ubmVjdGlvbkRlbGF5KSB7XHJcbiAgICAgICAgICAgICAgICBkZWxheSA9IG1heFJlY29ubmVjdGlvbkRlbGF5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RlYnVnKCduZXh0IGRlbGF5JywgZGVsYXkpO1xyXG4gICAgICAgIHJldHVybiBkZWxheTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl93YWl0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgX3RoaXMuX2dldE5leHREZWxheSgpKTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9nZXROZXh0VXJsID0gZnVuY3Rpb24gKHVybFByb3ZpZGVyKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB1cmxQcm92aWRlciA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1cmxQcm92aWRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgdXJsUHJvdmlkZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdmFyIHVybCA9IHVybFByb3ZpZGVyKCk7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1cmwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghIXVybC50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIFVSTCcpO1xyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICBpZiAodGhpcy5fY29ubmVjdExvY2sgfHwgIXRoaXMuX3Nob3VsZFJlY29ubmVjdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2Nvbm5lY3RMb2NrID0gdHJ1ZTtcclxuICAgICAgICB2YXIgX2EgPSB0aGlzLl9vcHRpb25zLCBfYiA9IF9hLm1heFJldHJpZXMsIG1heFJldHJpZXMgPSBfYiA9PT0gdm9pZCAwID8gREVGQVVMVC5tYXhSZXRyaWVzIDogX2IsIF9jID0gX2EuY29ubmVjdGlvblRpbWVvdXQsIGNvbm5lY3Rpb25UaW1lb3V0ID0gX2MgPT09IHZvaWQgMCA/IERFRkFVTFQuY29ubmVjdGlvblRpbWVvdXQgOiBfYywgX2QgPSBfYS5XZWJTb2NrZXQsIFdlYlNvY2tldCA9IF9kID09PSB2b2lkIDAgPyBnZXRHbG9iYWxXZWJTb2NrZXQoKSA6IF9kO1xyXG4gICAgICAgIGlmICh0aGlzLl9yZXRyeUNvdW50ID49IG1heFJldHJpZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVidWcoJ21heCByZXRyaWVzIHJlYWNoZWQnLCB0aGlzLl9yZXRyeUNvdW50LCAnPj0nLCBtYXhSZXRyaWVzKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9yZXRyeUNvdW50Kys7XHJcbiAgICAgICAgdGhpcy5fZGVidWcoJ2Nvbm5lY3QnLCB0aGlzLl9yZXRyeUNvdW50KTtcclxuICAgICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTtcclxuICAgICAgICBpZiAoIWlzV2ViU29ja2V0KFdlYlNvY2tldCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ05vIHZhbGlkIFdlYlNvY2tldCBjbGFzcyBwcm92aWRlZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl93YWl0KClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX2dldE5leHRVcmwoX3RoaXMuX3VybCk7IH0pXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICh1cmwpIHtcclxuICAgICAgICAgICAgLy8gY2xvc2UgY291bGQgYmUgY2FsbGVkIGJlZm9yZSBjcmVhdGluZyB0aGUgd3NcclxuICAgICAgICAgICAgaWYgKF90aGlzLl9jbG9zZUNhbGxlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLl9kZWJ1ZygnY29ubmVjdCcsIHsgdXJsOiB1cmwsIHByb3RvY29sczogX3RoaXMuX3Byb3RvY29scyB9KTtcclxuICAgICAgICAgICAgX3RoaXMuX3dzID0gX3RoaXMuX3Byb3RvY29sc1xyXG4gICAgICAgICAgICAgICAgPyBuZXcgV2ViU29ja2V0KHVybCwgX3RoaXMuX3Byb3RvY29scylcclxuICAgICAgICAgICAgICAgIDogbmV3IFdlYlNvY2tldCh1cmwpO1xyXG4gICAgICAgICAgICBfdGhpcy5fd3MuYmluYXJ5VHlwZSA9IF90aGlzLl9iaW5hcnlUeXBlO1xyXG4gICAgICAgICAgICBfdGhpcy5fY29ubmVjdExvY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgX3RoaXMuX2FkZExpc3RlbmVycygpO1xyXG4gICAgICAgICAgICBfdGhpcy5fY29ubmVjdFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9oYW5kbGVUaW1lb3V0KCk7IH0sIGNvbm5lY3Rpb25UaW1lb3V0KTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9oYW5kbGVUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuX2RlYnVnKCd0aW1lb3V0IGV2ZW50Jyk7XHJcbiAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IobmV3IEVycm9yRXZlbnQoRXJyb3IoJ1RJTUVPVVQnKSwgdGhpcykpO1xyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2Rpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoY29kZSwgcmVhc29uKSB7XHJcbiAgICAgICAgaWYgKGNvZGUgPT09IHZvaWQgMCkgeyBjb2RlID0gMTAwMDsgfVxyXG4gICAgICAgIHRoaXMuX2NsZWFyVGltZW91dHMoKTtcclxuICAgICAgICBpZiAoIXRoaXMuX3dzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5fd3MuY2xvc2UoY29kZSwgcmVhc29uKTtcclxuICAgICAgICAgICAgdGhpcy5faGFuZGxlQ2xvc2UobmV3IENsb3NlRXZlbnQoY29kZSwgcmVhc29uLCB0aGlzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fYWNjZXB0T3BlbiA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLl9kZWJ1ZygnYWNjZXB0IG9wZW4nKTtcclxuICAgICAgICB0aGlzLl9yZXRyeUNvdW50ID0gMDtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9jYWxsRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgbGlzdGVuZXIpIHtcclxuICAgICAgICBpZiAoJ2hhbmRsZUV2ZW50JyBpbiBsaXN0ZW5lcikge1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9yZW1vdmVMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RlYnVnKCdyZW1vdmVMaXN0ZW5lcnMnKTtcclxuICAgICAgICB0aGlzLl93cy5yZW1vdmVFdmVudExpc3RlbmVyKCdvcGVuJywgdGhpcy5faGFuZGxlT3Blbik7XHJcbiAgICAgICAgdGhpcy5fd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCB0aGlzLl9oYW5kbGVDbG9zZSk7XHJcbiAgICAgICAgdGhpcy5fd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuX2hhbmRsZU1lc3NhZ2UpO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLl93cy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMuX2hhbmRsZUVycm9yKTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9hZGRMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RlYnVnKCdhZGRMaXN0ZW5lcnMnKTtcclxuICAgICAgICB0aGlzLl93cy5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgdGhpcy5faGFuZGxlT3Blbik7XHJcbiAgICAgICAgdGhpcy5fd3MuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCB0aGlzLl9oYW5kbGVDbG9zZSk7XHJcbiAgICAgICAgdGhpcy5fd3MuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuX2hhbmRsZU1lc3NhZ2UpO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLl93cy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMuX2hhbmRsZUVycm9yKTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9jbGVhclRpbWVvdXRzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jb25uZWN0VGltZW91dCk7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3VwdGltZVRpbWVvdXQpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQ7XHJcbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVjb25uZWN0aW5nV2ViU29ja2V0O1xuIl19
|
|
7779
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJkaXN0L0F1ZGlvUGxheWVyLmpzIiwiZGlzdC9Db2dzQ29ubmVjdGlvbi5qcyIsImRpc3QvRGF0YVN0b3JlLmpzIiwiZGlzdC9SdHNwU3RyZWFtZXIuanMiLCJkaXN0L1ZpZGVvUGxheWVyLmpzIiwiZGlzdC9oZWxwZXJzL3VybHMuanMiLCJkaXN0L2luZGV4LmpzIiwiZGlzdC90eXBlcy9BdWRpb1N0YXRlLmpzIiwiZGlzdC90eXBlcy9TaG93UGhhc2UuanMiLCJkaXN0L3R5cGVzL1ZpZGVvU3RhdGUuanMiLCJub2RlX21vZHVsZXMvQGNsb2Nrd29ya2RvZy9tZWRpYS1zdHJlYW0tbGlicmFyeS1icm93c2VyL2Rpc3QvaW5kZXguY2pzLmpzIiwibm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29tcGFyZS12ZXJzaW9ucy9saWIvdW1kL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2hvd2xlci9kaXN0L2hvd2xlci5qcyIsIm5vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWNvbm5lY3Rpbmctd2Vic29ja2V0L2Rpc3QvcmVjb25uZWN0aW5nLXdlYnNvY2tldC1janMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDblZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTs7Ozs7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzFCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNqdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN6cEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGhvd2xlcl8xID0gcmVxdWlyZShcImhvd2xlclwiKTtcbmNvbnN0IERFQlVHID0gZmFsc2U7XG4vLyBDaGVjayBhbiBpT1Mtb25seSBwcm9wZXJ0eSAoU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9OYXZpZ2F0b3Ijbm9uLXN0YW5kYXJkX3Byb3BlcnRpZXMpXG5jb25zdCBJU19JT1MgPSB0eXBlb2YgbmF2aWdhdG9yLnN0YW5kYWxvbmUgIT09ICd1bmRlZmluZWQnO1xuY2xhc3MgQXVkaW9QbGF5ZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvZ3NDb25uZWN0aW9uKSB7XG4gICAgICAgIHRoaXMuY29nc0Nvbm5lY3Rpb24gPSBjb2dzQ29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldCA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgICAgICB0aGlzLmdsb2JhbFZvbHVtZSA9IDE7XG4gICAgICAgIHRoaXMuYXVkaW9DbGlwUGxheWVycyA9IHt9O1xuICAgICAgICB0aGlzLnNpbmtJZCA9ICcnO1xuICAgICAgICAvLyBTZW5kIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBlYWNoIGNsaXAgdG8gQ09HU1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2F1ZGlvQ2xpcFN0YXRlJywgKHsgZGV0YWlsIH0pID0+IHtcbiAgICAgICAgICAgIGNvZ3NDb25uZWN0aW9uLnNlbmRNZWRpYUNsaXBTdGF0ZShkZXRhaWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBhdWRpbyBjb250cm9sIG1lc3NhZ2VzXG4gICAgICAgIGNvZ3NDb25uZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBtZXNzYWdlIH0pID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWVkaWFfY29uZmlnX3VwZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdsb2JhbFZvbHVtZSAhPT0gbWVzc2FnZS5nbG9iYWxWb2x1bWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0R2xvYmFsVm9sdW1lKG1lc3NhZ2UuZ2xvYmFsVm9sdW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5hdWRpb091dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaW5rSWQgPSBjb2dzQ29ubmVjdGlvbi5nZXRBdWRpb1NpbmtJZChtZXNzYWdlLmF1ZGlvT3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXVkaW9TaW5rKHNpbmtJZCAhPT0gbnVsbCAmJiBzaW5rSWQgIT09IHZvaWQgMCA/IHNpbmtJZCA6ICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbmZpZyhtZXNzYWdlLmZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYXVkaW9fcGxheSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGxheUF1ZGlvQ2xpcChtZXNzYWdlLmZpbGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlJZDogbWVzc2FnZS5wbGF5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWU6IG1lc3NhZ2Uudm9sdW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcDogQm9vbGVhbihtZXNzYWdlLmxvb3ApLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFkZTogbWVzc2FnZS5mYWRlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYXVkaW9fcGF1c2UnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdXNlQXVkaW9DbGlwKG1lc3NhZ2UuZmlsZSwgeyBmYWRlOiBtZXNzYWdlLmZhZGUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2F1ZGlvX3N0b3AnOlxuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5maWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BBdWRpb0NsaXAobWVzc2FnZS5maWxlLCB7IGZhZGU6IG1lc3NhZ2UuZmFkZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcEFsbEF1ZGlvQ2xpcHMoeyBmYWRlOiBtZXNzYWdlLmZhZGUgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnYXVkaW9fc2V0X2NsaXBfdm9sdW1lJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBdWRpb0NsaXBWb2x1bWUobWVzc2FnZS5maWxlLCB7IHZvbHVtZTogbWVzc2FnZS52b2x1bWUsIGZhZGU6IG1lc3NhZ2UuZmFkZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBPbiBjb25uZWN0aW9uLCBzZW5kIHRoZSBjdXJyZW50IHBsYXlpbmcgc3RhdGUgb2YgYWxsIGNsaXBzXG4gICAgICAgIC8vIChVc3VhbGx5IGVtcHR5IHVubGVzcyB3ZWJzb2NrZXQgaXMgcmVjb25uZWN0aW5nKVxuICAgICAgICBjb25zdCBzZW5kSW5pdGlhbENsaXBTdGF0ZXMgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuYXVkaW9DbGlwUGxheWVycykubWFwKChbZmlsZSwgcGxheWVyXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUNsaXBzID0gT2JqZWN0LnZhbHVlcyhwbGF5ZXIuYWN0aXZlQ2xpcHMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IGFjdGl2ZUNsaXBzLnNvbWUoKHsgc3RhdGUgfSkgPT4gc3RhdGUudHlwZSA9PT0gJ3BsYXlpbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnR5cGUgPT09ICdwYXVzaW5nJyB8fFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS50eXBlID09PSAnc3RvcHBpbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnR5cGUgPT09ICdwbGF5X3JlcXVlc3RlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudHlwZSA9PT0gJ3BhdXNlX3JlcXVlc3RlZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUudHlwZSA9PT0gJ3N0b3BfcmVxdWVzdGVkJylcbiAgICAgICAgICAgICAgICAgICAgPyAncGxheWluZydcbiAgICAgICAgICAgICAgICAgICAgOiBhY3RpdmVDbGlwcy5zb21lKCh7IHN0YXRlIH0pID0+IHN0YXRlLnR5cGUgPT09ICdwYXVzZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAncGF1c2VkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAnc3RvcHBlZCc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtmaWxlLCBzdGF0dXNdO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb2dzQ29ubmVjdGlvbi5zZW5kSW5pdGlhbE1lZGlhQ2xpcFN0YXRlcyh7IG1lZGlhVHlwZTogJ2F1ZGlvJywgZmlsZXMgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvZ3NDb25uZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCBzZW5kSW5pdGlhbENsaXBTdGF0ZXMpO1xuICAgICAgICBzZW5kSW5pdGlhbENsaXBTdGF0ZXMoKTtcbiAgICB9XG4gICAgc2V0R2xvYmFsVm9sdW1lKHZvbHVtZSkge1xuICAgICAgICB0aGlzLmdsb2JhbFZvbHVtZSA9IHZvbHVtZTtcbiAgICAgICAgaG93bGVyXzEuSG93bGVyLnZvbHVtZSh2b2x1bWUpO1xuICAgICAgICB0aGlzLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7XG4gICAgfVxuICAgIHBsYXlBdWRpb0NsaXAocGF0aCwgeyBwbGF5SWQsIHZvbHVtZSwgZmFkZSwgbG9vcCB9KSB7XG4gICAgICAgIGxvZygnUGxheWluZyBjbGlwJywgeyBwYXRoIH0pO1xuICAgICAgICBpZiAoIShwYXRoIGluIHRoaXMuYXVkaW9DbGlwUGxheWVycykpIHtcbiAgICAgICAgICAgIGxvZygnQ3JlYXRpbmcgZXBoZW1lcmFsIGNsaXAnLCB7IHBhdGggfSk7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvQ2xpcFBsYXllcnNbcGF0aF0gPSB0aGlzLmNyZWF0ZUNsaXAocGF0aCwgeyBwcmVsb2FkOiBmYWxzZSwgZXBoZW1lcmFsOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQXVkaW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICAvLyBQYXVzZWQgY2xpcHMgbmVlZCB0byBiZSBwbGF5ZWQgYWdhaW5cbiAgICAgICAgICAgIGNvbnN0IHBhdXNlZFNvdW5kSWRzID0gT2JqZWN0LmVudHJpZXMoY2xpcFBsYXllci5hY3RpdmVDbGlwcylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChbLCB7IHN0YXRlIH1dKSA9PiBzdGF0ZS50eXBlID09PSAncGF1c2VkJylcbiAgICAgICAgICAgICAgICAubWFwKChbaWRdKSA9PiBwYXJzZUludChpZCkpO1xuICAgICAgICAgICAgY29uc3QgcGF1c2luZ1NvdW5kSWRzID0gT2JqZWN0LmVudHJpZXMoY2xpcFBsYXllci5hY3RpdmVDbGlwcylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChbLCB7IHN0YXRlIH1dKSA9PiBzdGF0ZS50eXBlID09PSAncGF1c2luZycpXG4gICAgICAgICAgICAgICAgLm1hcCgoW2lkXSkgPT4gcGFyc2VJbnQoaWQpKTtcbiAgICAgICAgICAgIHBhdXNlZFNvdW5kSWRzLmZvckVhY2goKHNvdW5kSWQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2coJ1Jlc3VtaW5nIHBhdXNlZCBjbGlwJywgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIucGxheShzb3VuZElkKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQ2xpcHMgd2l0aCBwYXVzZSByZXF1ZXN0ZWQgbm8gbG9uZ2VyIG5lZWQgdG8gcGF1c2UsIHRoZXkgY2FuIGNvbnRpbnVlIHBsYXlpbmcgbm93XG4gICAgICAgICAgICBjb25zdCBwYXVzZVJlcXVlc3RlZFNvdW5kSWRzID0gT2JqZWN0LmVudHJpZXMoY2xpcFBsYXllci5hY3RpdmVDbGlwcylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChbLCB7IHN0YXRlIH1dKSA9PiBzdGF0ZS50eXBlID09PSAncGF1c2VfcmVxdWVzdGVkJylcbiAgICAgICAgICAgICAgICAubWFwKChbaWRdKSA9PiBwYXJzZUludChpZCkpO1xuICAgICAgICAgICAgLy8gSWYgbm8gY3VycmVudGx5IHBhdXNlZC9wYXVzaW5nL3BhdXNlX3JlcXVlc3RlZCBjbGlwcywgcGxheSBhIG5ldyBjbGlwXG4gICAgICAgICAgICBjb25zdCBuZXdTb3VuZElkcyA9IHBhdXNlZFNvdW5kSWRzLmxlbmd0aCA+IDAgfHwgcGF1c2luZ1NvdW5kSWRzLmxlbmd0aCA+IDAgfHwgcGF1c2VSZXF1ZXN0ZWRTb3VuZElkcy5sZW5ndGggPiAwID8gW10gOiBbY2xpcFBsYXllci5wbGF5ZXIucGxheSgpXTtcbiAgICAgICAgICAgIC8vIFBhdXNpbmcgY2xpcHMgYXJlIHRlY2huaWNhbGx5IGN1cnJlbnRseSBwbGF5aW5nIGFzIGZhciBhcyBIb3dsZXIgaXMgY29uY2VybmVkXG4gICAgICAgICAgICBwYXVzaW5nU291bmRJZHMuZm9yRWFjaCgoc291bmRJZCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvZygnU3RvcHBpbmcgZmFkZSBhbmQgcmVzdW1pbmcgcGF1c2luZyBjbGlwJywgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgLy8gU3RvcCB0aGUgZmFkZSBjYWxsYmFja1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9mZignZmFkZScsIHVuZGVmaW5lZCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgLy8gU2V0IGxvb3AgcHJvcGVydHlcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5sb29wKGxvb3AsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBzdGF0ZSB0byAncGxheWluZydcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUF1ZGlvQ2xpcChwYXRoLCBzb3VuZElkLCAoY2xpcCkgPT4gKHsgLi4uY2xpcCwgc3RhdGU6IHsgdHlwZTogJ3BsYXlpbmcnIH0gfSkpO1xuICAgICAgICAgICAgICAgIC8vIFNldCB2b2x1bWUsIG9yIHN0YXJ0IGEgbmV3IGZhZGVcbiAgICAgICAgICAgICAgICBpZiAoaXNGYWRlVmFsaWQoZmFkZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgZmFkZSB3aGVuIGNsaXAgc3RhcnRzXG4gICAgICAgICAgICAgICAgICAgIGZhZGVBdWRpb1BsYXllclZvbHVtZShjbGlwUGxheWVyLnBsYXllciwgdm9sdW1lLCBmYWRlICogMTAwMCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZXRBdWRpb1BsYXllclZvbHVtZShjbGlwUGxheWVyLnBsYXllciwgdm9sdW1lLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIHBhdXNlZCBhbmQgcGF1c2VfcmVxdWVzdGVkIGNsaXBzIHRyZWF0ZWQgdGhlIHNhbWUsIHRoZXkgc2hvdWxkIGhhdmUgdGhlaXIgcHJvcGVydGllc1xuICAgICAgICAgICAgLy8gdXBkYXRlZCB3aXRoIHRoZSBsYXRlc3QgcGxheSBhY3Rpb24ncyBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBbLi4ucGF1c2VkU291bmRJZHMsIC4uLnBhdXNlUmVxdWVzdGVkU291bmRJZHMsIC4uLm5ld1NvdW5kSWRzXS5mb3JFYWNoKChzb3VuZElkKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIubG9vcChsb29wLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIGFueSBvbGQgY2FsbGJhY2tzIGZpcnN0XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIub2ZmKCdwbGF5JywgdW5kZWZpbmVkLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vZmYoJ3BhdXNlJywgdW5kZWZpbmVkLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vZmYoJ2ZhZGUnLCB1bmRlZmluZWQsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9mZignZW5kJywgdW5kZWZpbmVkLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vZmYoJ3N0b3AnLCB1bmRlZmluZWQsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIC8vIE5vbi1wcmVsb2FkZWQgY2xpcHMgZG9uJ3QgeWV0IGhhdmUgYW4gSFRNTCBhdWRpbyBub2RlXG4gICAgICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBzZXQgdGhlIGF1ZGlvIG91dHB1dCB3aGVuIGl0J3MgcGxheWluZ1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9uY2UoJ3BsYXknLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldFBsYXllclNpbmtJZChjbGlwUGxheWVyLnBsYXllciwgdGhpcy5zaW5rSWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9uY2UoJ3N0b3AnLCAoKSA9PiB0aGlzLmhhbmRsZVN0b3BwZWRDbGlwKHBhdGgsIHBsYXlJZCwgc291bmRJZCksIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIC8vIExvb3BpbmcgY2xpcHMgZmlyZSB0aGUgJ2VuZCcgY2FsbGJhY2sgb24gZXZlcnkgbG9vcFxuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoKF9hID0gY2xpcFBsYXllci5hY3RpdmVDbGlwc1tzb3VuZElkXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxvb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN0b3BwZWRDbGlwKHBhdGgsIHBsYXlJZCwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVDbGlwID0ge1xuICAgICAgICAgICAgICAgICAgICBwbGF5SWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiB7IHR5cGU6ICdwbGF5X3JlcXVlc3RlZCcgfSxcbiAgICAgICAgICAgICAgICAgICAgbG9vcCxcbiAgICAgICAgICAgICAgICAgICAgdm9sdW1lLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbG9nKCdDTElQIC0+IHBsYXlfcmVxdWVzdGVkJywgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgLy8gT25jZSBjbGlwIHN0YXJ0cywgY2hlY2sgaWYgaXQgc2hvdWxkIGFjdHVhbGx5IGJlIHBhdXNlZCBvciBzdG9wcGVkXG4gICAgICAgICAgICAgICAgLy8gSWYgbm90LCB0aGVuIHVwZGF0ZSBzdGF0ZSB0byAncGxheWluZydcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vbmNlKCdwbGF5JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaXBTdGF0ZSA9IChfYSA9IGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHNbc291bmRJZF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChjbGlwU3RhdGUgPT09IG51bGwgfHwgY2xpcFN0YXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGlwU3RhdGUudHlwZSkgPT09ICdwYXVzZV9yZXF1ZXN0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NsaXAgc3RhcnRlZCBwbGF5aW5nIGJ1dCBzaG91bGQgYmUgcGF1c2VkJywgeyBwYXRoLCBzb3VuZElkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXVzZUF1ZGlvQ2xpcChwYXRoLCB7IGZhZGU6IGNsaXBTdGF0ZS5mYWRlIH0sIHNvdW5kSWQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChjbGlwU3RhdGUgPT09IG51bGwgfHwgY2xpcFN0YXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjbGlwU3RhdGUudHlwZSkgPT09ICdzdG9wX3JlcXVlc3RlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ2xpcCBzdGFydGVkIHBsYXlpbmcgYnV0IHNob3VsZCBiZSBzdG9wcGVkJywgeyBwYXRoLCBzb3VuZElkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wQXVkaW9DbGlwKHBhdGgsIHsgZmFkZTogY2xpcFN0YXRlLmZhZGUgfSwgc291bmRJZCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NMSVAgLT4gcGxheWluZycsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVBdWRpb0NsaXAocGF0aCwgc291bmRJZCwgKGNsaXApID0+ICh7IC4uLmNsaXAsIHN0YXRlOiB7IHR5cGU6ICdwbGF5aW5nJyB9IH0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRvIGZhZGUgb3IgdG8gbm8gZmFkZT9cbiAgICAgICAgICAgICAgICBpZiAoaXNGYWRlVmFsaWQoZmFkZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgZmFkZSB3aGVuIGNsaXAgc3RhcnRzXG4gICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnZvbHVtZSgwLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIubXV0ZShmYWxzZSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9uY2UoJ3BsYXknLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWRlQXVkaW9QbGF5ZXJWb2x1bWUoY2xpcFBsYXllci5wbGF5ZXIsIHZvbHVtZSwgZmFkZSAqIDEwMDAsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICB9LCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEF1ZGlvUGxheWVyVm9sdW1lKGNsaXBQbGF5ZXIucGxheWVyLCB2b2x1bWUsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBUcmFjayBuZXcvdXBkYXRlZCBhY3RpdmUgY2xpcFxuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMgPSB7IC4uLmNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMsIFtzb3VuZElkXTogYWN0aXZlQ2xpcCB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHBsYXlJZCwgcGF0aCwgJ3BsYXlpbmcnKTtcbiAgICB9XG4gICAgcGF1c2VBdWRpb0NsaXAocGF0aCwgeyBmYWRlIH0sIG9ubHlTb3VuZElkLCBhbGxvd0lmUGF1c2VSZXF1ZXN0ZWQpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgLy8gTm8gYWN0aXZlIGNsaXBzIHRvIHBhdXNlXG4gICAgICAgIGlmIChPYmplY3Qua2V5cygoX2IgPSAoX2EgPSB0aGlzLmF1ZGlvQ2xpcFBsYXllcnNbcGF0aF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hY3RpdmVDbGlwcykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDoge30pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQXVkaW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMpLm1hcCgoW3NvdW5kSWRTdHIsIGNsaXBdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc291bmRJZCA9IHBhcnNlSW50KHNvdW5kSWRTdHIpO1xuICAgICAgICAgICAgICAgIC8vIElmIG9ubHlTb3VuZElkIHNwZWNpZmllZCwgb25seSB1cGRhdGUgdGhhdCBjbGlwXG4gICAgICAgICAgICAgICAgaWYgKG9ubHlTb3VuZElkID09PSB1bmRlZmluZWQgfHwgb25seVNvdW5kSWQgPT09IHNvdW5kSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChhbGxvd0lmUGF1c2VSZXF1ZXN0ZWQgJiYgY2xpcC5zdGF0ZS50eXBlID09PSAncGF1c2VfcmVxdWVzdGVkJykgfHwgY2xpcC5zdGF0ZS50eXBlID09PSAncGxheWluZycgfHwgY2xpcC5zdGF0ZS50eXBlID09PSAncGF1c2luZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0ZhZGVWYWxpZChmYWRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhZGUgdGhlbiBwYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLm9uY2UoJ2ZhZGUnLCAoc291bmRJZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5wYXVzZShzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDTElQIC0+IHBhdXNlZCAoYWZ0ZXIgZmFkZSknLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVBdWRpb0NsaXAocGF0aCwgc291bmRJZCwgKGNsaXApID0+ICh7IC4uLmNsaXAsIHN0YXRlOiB7IHR5cGU6ICdwYXVzZWQnIH0gfSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhjbGlwLnBsYXlJZCwgcGF0aCwgJ3BhdXNlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhZGVBdWRpb1BsYXllclZvbHVtZShjbGlwUGxheWVyLnBsYXllciwgMCwgZmFkZSAqIDEwMDAsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnQ0xJUCAtPiBwYXVzaW5nJywgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZSA9IHsgdHlwZTogJ3BhdXNpbmcnIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXVzZSBub3dcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5wYXVzZShzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NMSVAgLT4gcGF1c2VkJywgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZSA9IHsgdHlwZTogJ3BhdXNlZCcgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhjbGlwLnBsYXlJZCwgcGF0aCwgJ3BhdXNlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIENsaXAgaGFzbid0IHN0YXJ0ZWQgcGxheWluZyB5ZXQsIG9yIGhhcyBhbHJlYWR5IGhhZCBwYXVzZV9yZXF1ZXN0ZWQgKGJ1dCBmYWRlIG1heSBoYXZlIGNoYW5nZWQgc28gdXBkYXRlIGhlcmUpXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BsYXlfcmVxdWVzdGVkJyB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzZV9yZXF1ZXN0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ0NMSVAgLT4gcGF1c2VfcmVxdWVzdGVkJywgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlID0geyB0eXBlOiAncGF1c2VfcmVxdWVzdGVkJywgZmFkZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBbc291bmRJZFN0ciwgY2xpcF07XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0b3BBdWRpb0NsaXAocGF0aCwgeyBmYWRlIH0sIG9ubHlTb3VuZElkLCBhbGxvd0lmU3RvcFJlcXVlc3RlZCkge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYztcbiAgICAgICAgbG9nKCdTdG9wIGF1ZGlvIGNsaXAnLCB7IGFjdGl2ZUNsaXBzOiAoX2EgPSB0aGlzLmF1ZGlvQ2xpcFBsYXllcnNbcGF0aF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hY3RpdmVDbGlwcyB9KTtcbiAgICAgICAgLy8gTm8gYWN0aXZlIGNsaXBzIHRvIHN0b3BcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKChfYyA9IChfYiA9IHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmFjdGl2ZUNsaXBzKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiB7fSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoY2xpcFBsYXllci5hY3RpdmVDbGlwcykubWFwKChbc291bmRJZFN0ciwgY2xpcF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3VuZElkID0gcGFyc2VJbnQoc291bmRJZFN0cik7XG4gICAgICAgICAgICAgICAgLy8gSWYgb25seVNvdW5kSWQgc3BlY2lmaWVkLCBvbmx5IHVwZGF0ZSB0aGF0IGNsaXBcbiAgICAgICAgICAgICAgICBpZiAob25seVNvdW5kSWQgPT09IHVuZGVmaW5lZCB8fCBvbmx5U291bmRJZCA9PT0gc291bmRJZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGFsbG93SWZTdG9wUmVxdWVzdGVkICYmIGNsaXAuc3RhdGUudHlwZSA9PT0gJ3N0b3BfcmVxdWVzdGVkJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaXAuc3RhdGUudHlwZSA9PT0gJ3BsYXlpbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlLnR5cGUgPT09ICdwYXVzaW5nJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZS50eXBlID09PSAncGF1c2VkJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZS50eXBlID09PSAnc3RvcHBpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGYWRlVmFsaWQoZmFkZSkgJiYgY2xpcC5zdGF0ZS50eXBlICE9PSAncGF1c2VkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFudXAgYW55IG9sZCBmYWRlIGNhbGxiYWNrcyBmaXJzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBjYXN0IG9uY2UgaHR0cHM6Ly9naXRodWIuY29tL0RlZmluaXRlbHlUeXBlZC9EZWZpbml0ZWx5VHlwZWQvcHVsbC81OTQxMSBpcyBtZXJnZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vZmYoJ2ZhZGUnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWRlQXVkaW9QbGF5ZXJWb2x1bWUoY2xpcFBsYXllci5wbGF5ZXIsIDAsIGZhZGUgKiAxMDAwLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgY2FsbGJhY2sgYWZ0ZXIgc3RhcnRpbmcgbmV3IGZhZGUsIG90aGVyd2lzZSBpdCB3aWxsIGZpcmUgc3RyYWlnaHQgYXdheSBhcyB0aGUgcHJldmlvdXMgZmFkZSBpcyBjYW5jZWxsZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5vbmNlKCdmYWRlJywgKHNvdW5kSWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBsYXllci5wbGF5ZXIubG9vcChmYWxzZSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnN0b3Aoc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDTElQIC0+IHN0b3BwaW5nJywgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcC5zdGF0ZSA9IHsgdHlwZTogJ3N0b3BwaW5nJyB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdTdG9wIGNsaXAnLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5sb29wKGZhbHNlLCBzb3VuZElkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUGxheWVyLnBsYXllci5zdG9wKHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIENsaXAgaGFzbid0IHN0YXJ0ZWQgcGxheWluZyB5ZXQsIG9yIGhhcyBhbHJlYWR5IGhhZCBzdG9wX3JlcXVlc3RlZCAoYnV0IGZhZGUgbWF5IGhhdmUgY2hhbmdlZCBzbyB1cGRhdGUgaGVyZSlcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgaGFzIHBhdXNlX3JlcXVlc3RlZCwgYnV0IHN0b3AgdGFrZXMgcHJlY2VkZW5jZVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjbGlwLnN0YXRlLnR5cGUgPT09ICdwbGF5X3JlcXVlc3RlZCcgfHwgY2xpcC5zdGF0ZS50eXBlID09PSAncGF1c2VfcmVxdWVzdGVkJyB8fCBjbGlwLnN0YXRlLnR5cGUgPT09ICdzdG9wX3JlcXVlc3RlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhcIlRyeWluZyB0byBzdG9wIGNsaXAgd2hpY2ggaGFzbid0IHN0YXJ0ZWQgcGxheWluZyB5ZXRcIiwgeyBwYXRoLCBzb3VuZElkIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDTElQIC0+IHN0b3BfcmVxdWVzdGVkJywgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGlwLnN0YXRlID0geyB0eXBlOiAnc3RvcF9yZXF1ZXN0ZWQnLCBmYWRlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtzb3VuZElkU3RyLCBjbGlwXTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RvcEFsbEF1ZGlvQ2xpcHMob3B0aW9ucykge1xuICAgICAgICBsb2coJ1N0b3BwaW5nIGFsbCBjbGlwcycpO1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmF1ZGlvQ2xpcFBsYXllcnMpLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3RvcEF1ZGlvQ2xpcChwYXRoLCBvcHRpb25zKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldEF1ZGlvQ2xpcFZvbHVtZShwYXRoLCB7IHZvbHVtZSwgZmFkZSB9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGlmICghKHZvbHVtZSA+PSAwICYmIHZvbHVtZSA8PSAxKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdJbnZhbGlkIHZvbHVtZScsIHZvbHVtZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gYWN0aXZlIGNsaXBzIHRvIHNldCB2b2x1bWUgZm9yXG4gICAgICAgIGlmIChPYmplY3Qua2V5cygoX2IgPSAoX2EgPSB0aGlzLmF1ZGlvQ2xpcFBsYXllcnNbcGF0aF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hY3RpdmVDbGlwcykgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDoge30pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlQXVkaW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMpLm1hcCgoW3NvdW5kSWRTdHIsIGNsaXBdKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlZCBmb3IgcGF1c2luZy9zdG9wcGluZyBpbnN0YW5jZXNcbiAgICAgICAgICAgICAgICBpZiAoY2xpcC5zdGF0ZS50eXBlICE9PSAncGF1c2luZycgJiYgY2xpcC5zdGF0ZS50eXBlICE9PSAnc3RvcHBpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdW5kSWQgPSBwYXJzZUludChzb3VuZElkU3RyKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmFkZVZhbGlkKGZhZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmYWRlQXVkaW9QbGF5ZXJWb2x1bWUoY2xpcFBsYXllci5wbGF5ZXIsIHZvbHVtZSwgZmFkZSAqIDEwMDAsIHNvdW5kSWQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QXVkaW9QbGF5ZXJWb2x1bWUoY2xpcFBsYXllci5wbGF5ZXIsIHZvbHVtZSwgc291bmRJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtzb3VuZElkU3RyLCB7IC4uLmNsaXAsIHZvbHVtZSB9XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbc291bmRJZFN0ciwgY2xpcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoYW5kbGVTdG9wcGVkQ2xpcChwYXRoLCBwbGF5SWQsIHNvdW5kSWQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIGRlbGV0ZSBjbGlwUGxheWVyLmFjdGl2ZUNsaXBzW3NvdW5kSWRdO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyhwbGF5SWQsIHBhdGgsICdzdG9wcGVkJyk7XG4gICAgfVxuICAgIHVwZGF0ZUFjdGl2ZUF1ZGlvQ2xpcChwYXRoLCBzb3VuZElkLCB1cGRhdGUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0NsaXBQbGF5ZXIocGF0aCwgKGNsaXBQbGF5ZXIpID0+IHNvdW5kSWQgaW4gY2xpcFBsYXllci5hY3RpdmVDbGlwc1xuICAgICAgICAgICAgPyB7IC4uLmNsaXBQbGF5ZXIsIGFjdGl2ZUNsaXBzOiB7IC4uLmNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHMsIFtzb3VuZElkXTogdXBkYXRlKGNsaXBQbGF5ZXIuYWN0aXZlQ2xpcHNbc291bmRJZF0pIH0gfVxuICAgICAgICAgICAgOiBjbGlwUGxheWVyKTtcbiAgICB9XG4gICAgdXBkYXRlQXVkaW9DbGlwUGxheWVyKHBhdGgsIHVwZGF0ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmIChwYXRoIGluIHRoaXMuYXVkaW9DbGlwUGxheWVycykge1xuICAgICAgICAgICAgdGhpcy5hdWRpb0NsaXBQbGF5ZXJzID0geyAuLi50aGlzLmF1ZGlvQ2xpcFBsYXllcnMsIFtwYXRoXTogdXBkYXRlKHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXSkgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmNlIGxhc3QgaW5zdGFuY2Ugb2YgYW4gZXBoZW1lcmFsIGNsaXAgaXMgcmVtb3ZlZCwgY2xlYW51cCBhbmQgcmVtb3ZlIHRoZSBwbGF5ZXJcbiAgICAgICAgY29uc3QgY2xpcFBsYXllciA9IHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXTtcbiAgICAgICAgaWYgKGNsaXBQbGF5ZXIgJiYgT2JqZWN0LmtleXMoKF9hID0gY2xpcFBsYXllci5hY3RpdmVDbGlwcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDoge30pLmxlbmd0aCA9PT0gMCAmJiBjbGlwUGxheWVyLmNvbmZpZy5lcGhlbWVyYWwpIHtcbiAgICAgICAgICAgIGNsaXBQbGF5ZXIucGxheWVyLnVubG9hZCgpO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYXVkaW9DbGlwUGxheWVyc1twYXRoXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7XG4gICAgfVxuICAgIHNldEF1ZGlvU2luayhzaW5rSWQpIHtcbiAgICAgICAgbG9nKGBTZXR0aW5nIHNpbmsgSUQgZm9yIGFsbCBjbGlwczpgLCBzaW5rSWQpO1xuICAgICAgICBmb3IgKGNvbnN0IGNsaXBQbGF5ZXIgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmF1ZGlvQ2xpcFBsYXllcnMpKSB7XG4gICAgICAgICAgICBzZXRQbGF5ZXJTaW5rSWQoY2xpcFBsYXllci5wbGF5ZXIsIHNpbmtJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaW5rSWQgPSBzaW5rSWQ7XG4gICAgfVxuICAgIHVwZGF0ZUNvbmZpZyhuZXdGaWxlcykge1xuICAgICAgICBjb25zdCBuZXdBdWRpb0ZpbGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG5ld0ZpbGVzKS5maWx0ZXIoKGZpbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBmaWxlWzFdLnR5cGU7XG4gICAgICAgICAgICAvLyBDT0dTIDQuNiBkaWQgbm90IHNlbmQgYSBgdHlwZWAgYnV0IG9ubHkgcmVwb3J0ZWQgYXVkaW8gZmlsZXNcbiAgICAgICAgICAgIC8vIHNvIHdlIGFzc3VtZSBhdWRpbyBpZiBubyBgdHlwZWAgaXMgZ2l2ZW5cbiAgICAgICAgICAgIHJldHVybiB0eXBlID09PSAnYXVkaW8nIHx8ICF0eXBlO1xuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQ2xpcFBsYXllcnMgPSB0aGlzLmF1ZGlvQ2xpcFBsYXllcnM7XG4gICAgICAgIHRoaXMuYXVkaW9DbGlwUGxheWVycyA9ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjbGlwUGxheWVycyA9IHsgLi4ucHJldmlvdXNDbGlwUGxheWVycyB9O1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZENsaXBzID0gT2JqZWN0LmtleXMocHJldmlvdXNDbGlwUGxheWVycykuZmlsdGVyKChwcmV2aW91c0ZpbGUpID0+ICEocHJldmlvdXNGaWxlIGluIG5ld0F1ZGlvRmlsZXMpICYmICFwcmV2aW91c0NsaXBQbGF5ZXJzW3ByZXZpb3VzRmlsZV0uY29uZmlnLmVwaGVtZXJhbCk7XG4gICAgICAgICAgICByZW1vdmVkQ2xpcHMuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IHByZXZpb3VzQ2xpcFBsYXllcnNbZmlsZV0ucGxheWVyO1xuICAgICAgICAgICAgICAgIHBsYXllci51bmxvYWQoKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgY2xpcFBsYXllcnNbZmlsZV07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGFkZGVkQ2xpcHMgPSBPYmplY3QuZW50cmllcyhuZXdBdWRpb0ZpbGVzKS5maWx0ZXIoKFtuZXdmaWxlXSkgPT4gIXByZXZpb3VzQ2xpcFBsYXllcnNbbmV3ZmlsZV0pO1xuICAgICAgICAgICAgYWRkZWRDbGlwcy5mb3JFYWNoKChbcGF0aCwgY29uZmlnXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXJzW3BhdGhdID0gdGhpcy5jcmVhdGVDbGlwKHBhdGgsIHsgLi4uY29uZmlnLCBlcGhlbWVyYWw6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkQ2xpcHMgPSBPYmplY3Qua2V5cyhwcmV2aW91c0NsaXBQbGF5ZXJzKS5maWx0ZXIoKHByZXZpb3VzRmlsZSkgPT4gcHJldmlvdXNGaWxlIGluIG5ld0F1ZGlvRmlsZXMpO1xuICAgICAgICAgICAgdXBkYXRlZENsaXBzLmZvckVhY2goKHBhdGgpID0+IHtcbiAgICAgICAgICAgICAgICBjbGlwUGxheWVyc1twYXRoXSA9IHRoaXMudXBkYXRlZENsaXAocGF0aCwgY2xpcFBsYXllcnNbcGF0aF0sIHsgLi4ubmV3QXVkaW9GaWxlc1twYXRoXSwgZXBoZW1lcmFsOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXJzO1xuICAgICAgICB9KSgpO1xuICAgICAgICB0aGlzLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7XG4gICAgfVxuICAgIG5vdGlmeVN0YXRlTGlzdGVuZXJzKCkge1xuICAgICAgICBjb25zdCBjbGlwcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuYXVkaW9DbGlwUGxheWVycykucmVkdWNlKChjbGlwcywgW3BhdGgsIGNsaXBQbGF5ZXJdKSA9PiB7XG4gICAgICAgICAgICBjbGlwc1twYXRoXSA9IHtcbiAgICAgICAgICAgICAgICBjb25maWc6IHsgcHJlbG9hZDogY2xpcFBsYXllci5jb25maWcucHJlbG9hZCwgZXBoZW1lcmFsOiBjbGlwUGxheWVyLmNvbmZpZy5lcGhlbWVyYWwgfSxcbiAgICAgICAgICAgICAgICBhY3RpdmVDbGlwczogY2xpcFBsYXllci5hY3RpdmVDbGlwcyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gY2xpcHM7XG4gICAgICAgIH0sIHt9KTtcbiAgICAgICAgY29uc3QgaXNQbGF5aW5nID0gT2JqZWN0LnZhbHVlcyh0aGlzLmF1ZGlvQ2xpcFBsYXllcnMpLnNvbWUoKHsgYWN0aXZlQ2xpcHMgfSkgPT4gT2JqZWN0LnZhbHVlcyhhY3RpdmVDbGlwcykuc29tZSgoY2xpcCkgPT4gY2xpcC5zdGF0ZS50eXBlID09PSAncGxheWluZycgfHwgY2xpcC5zdGF0ZS50eXBlID09PSAncGF1c2luZycgfHwgY2xpcC5zdGF0ZS50eXBlID09PSAnc3RvcHBpbmcnKSk7XG4gICAgICAgIGNvbnN0IGF1ZGlvU3RhdGUgPSB7XG4gICAgICAgICAgICBnbG9iYWxWb2x1bWU6IHRoaXMuZ2xvYmFsVm9sdW1lLFxuICAgICAgICAgICAgaXNQbGF5aW5nLFxuICAgICAgICAgICAgY2xpcHMsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnc3RhdGUnLCBhdWRpb1N0YXRlKTtcbiAgICB9XG4gICAgbm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHBsYXlJZCwgZmlsZSwgc3RhdHVzKSB7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnYXVkaW9DbGlwU3RhdGUnLCB7IG1lZGlhVHlwZTogJ2F1ZGlvJywgcGxheUlkLCBmaWxlLCBzdGF0dXMgfSk7XG4gICAgfVxuICAgIC8vIFR5cGUtc2FmZSB3cmFwcGVyIGFyb3VuZCBFdmVudFRhcmdldFxuICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBkaXNwYXRjaEV2ZW50KHR5cGUsIGRldGFpbCkge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KHR5cGUsIHsgZGV0YWlsIH0pKTtcbiAgICB9XG4gICAgY3JlYXRlUGxheWVyKHBhdGgsIGNvbmZpZykge1xuICAgICAgICBjb25zdCBwbGF5ZXIgPSBuZXcgaG93bGVyXzEuSG93bCh7XG4gICAgICAgICAgICBzcmM6IHRoaXMuY29nc0Nvbm5lY3Rpb24uZ2V0QXNzZXRVcmwocGF0aCksXG4gICAgICAgICAgICBhdXRvcGxheTogZmFsc2UsXG4gICAgICAgICAgICBsb29wOiBmYWxzZSxcbiAgICAgICAgICAgIHZvbHVtZTogMSxcbiAgICAgICAgICAgIGh0bWw1OiB0cnVlLFxuICAgICAgICAgICAgcHJlbG9hZDogY29uZmlnLnByZWxvYWQsXG4gICAgICAgIH0pO1xuICAgICAgICBzZXRQbGF5ZXJTaW5rSWQocGxheWVyLCB0aGlzLnNpbmtJZCk7XG4gICAgICAgIHJldHVybiBwbGF5ZXI7XG4gICAgfVxuICAgIGNyZWF0ZUNsaXAoZmlsZSwgY29uZmlnKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICBwbGF5ZXI6IHRoaXMuY3JlYXRlUGxheWVyKGZpbGUsIGNvbmZpZyksXG4gICAgICAgICAgICBhY3RpdmVDbGlwczoge30sXG4gICAgICAgIH07XG4gICAgfVxuICAgIHVwZGF0ZWRDbGlwKGNsaXBQYXRoLCBwcmV2aW91c0NsaXAsIG5ld0NvbmZpZykge1xuICAgICAgICBjb25zdCBjbGlwID0geyAuLi5wcmV2aW91c0NsaXAsIGNvbmZpZzogbmV3Q29uZmlnIH07XG4gICAgICAgIGlmIChwcmV2aW91c0NsaXAuY29uZmlnLnByZWxvYWQgIT09IG5ld0NvbmZpZy5wcmVsb2FkKSB7XG4gICAgICAgICAgICBjbGlwLnBsYXllci51bmxvYWQoKTtcbiAgICAgICAgICAgIGNsaXAucGxheWVyID0gdGhpcy5jcmVhdGVQbGF5ZXIoY2xpcFBhdGgsIG5ld0NvbmZpZyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNsaXA7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gQXVkaW9QbGF5ZXI7XG5mdW5jdGlvbiBsb2coLi4uZGF0YSkge1xuICAgIGlmIChERUJVRykge1xuICAgICAgICBjb25zb2xlLmxvZyguLi5kYXRhKTtcbiAgICB9XG59XG4vKipcbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGlzIGlzIHRoaXMgYSB2YWxpZCBmYWRlIGR1cmF0aW9uLiBBbHdheXMgcmV0dXJucyBgZmFsc2VgIG9uIGlPU1xuICovXG5mdW5jdGlvbiBpc0ZhZGVWYWxpZChmYWRlKSB7XG4gICAgcmV0dXJuICFJU19JT1MgJiYgdHlwZW9mIGZhZGUgPT09ICdudW1iZXInICYmICFpc05hTihmYWRlKSAmJiBmYWRlID4gMDtcbn1cbmZ1bmN0aW9uIHNldFBsYXllclNpbmtJZChwbGF5ZXIsIHNpbmtJZCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoc2lua0lkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocGxheWVyLl9odG1sNSkge1xuICAgICAgICAoX2EgPSBwbGF5ZXIuX3NvdW5kcykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvckVhY2goKHNvdW5kKSA9PiB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAgICAgKF9iID0gKF9hID0gc291bmQuX25vZGUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRTaW5rSWQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBzaW5rSWQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIFRPRE86IGhhbmRsZSB3ZWIgYXVkaW9cbiAgICAgICAgY29uc29sZS53YXJuKCdDYW5ub3Qgc2V0IHNpbmsgSUQ6IHdlYiBhdWRpbyBub3Qgc3VwcG9ydGVkJywgcGxheWVyKTtcbiAgICB9XG59XG4vKipcbiAqIFNldCBhdWRpbyB2b2x1bWVcbiAqXG4gKiBUaGlzIGRvZXNuJ3Qgd29yayBvbiBpT1MgKHZvbHVtZSBpcyByZWFkLW9ubHkpIHNvIGF0IGxlYXN0IG11dGUgaXQgaWYgdGhlIHZvbHVtZSBpcyB6ZXJvXG4gKi9cbmZ1bmN0aW9uIHNldEF1ZGlvUGxheWVyVm9sdW1lKGhvd2wsIHZvbHVtZSwgc291bmRJZCkge1xuICAgIGhvd2wudm9sdW1lKHZvbHVtZSwgc291bmRJZCk7XG4gICAgaG93bC5tdXRlKHZvbHVtZSA9PT0gMCwgc291bmRJZCk7XG59XG4vKipcbiAqIEZhZGUgdG8gYXVkaW8gdm9sdW1lXG4gKlxuICogTm90ZTogVGhpcyBkb2Vzbid0IHdvcmsgb24gaU9TICh2b2x1bWUgaXMgcmVhZC1vbmx5KVxuICovXG5mdW5jdGlvbiBmYWRlQXVkaW9QbGF5ZXJWb2x1bWUoaG93bCwgdm9sdW1lLCBmYWRlLCBzb3VuZElkKSB7XG4gICAgaG93bC5mYWRlKGhvd2wudm9sdW1lKHNvdW5kSWQpLCB2b2x1bWUsIGZhZGUsIHNvdW5kSWQpO1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNvZ3NJbmNvbWluZ0V2ZW50ID0gZXhwb3J0cy5Db2dzU3RhdGVDaGFuZ2VkRXZlbnQgPSBleHBvcnRzLkNvZ3NDb25maWdDaGFuZ2VkRXZlbnQgPSBleHBvcnRzLkNvZ3NNZXNzYWdlRXZlbnQgPSBleHBvcnRzLkNvZ3NDb25uZWN0aW9uQ2xvc2VFdmVudCA9IGV4cG9ydHMuQ29nc0Nvbm5lY3Rpb25PcGVuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCBjb21wYXJlX3ZlcnNpb25zXzEgPSByZXF1aXJlKFwiY29tcGFyZS12ZXJzaW9uc1wiKTtcbmNvbnN0IFNob3dQaGFzZV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCIuL3R5cGVzL1Nob3dQaGFzZVwiKSk7XG5jb25zdCByZWNvbm5lY3Rpbmdfd2Vic29ja2V0XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInJlY29ubmVjdGluZy13ZWJzb2NrZXRcIikpO1xuY29uc3QgdXJsc18xID0gcmVxdWlyZShcIi4vaGVscGVycy91cmxzXCIpO1xuY29uc3QgRGF0YVN0b3JlXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vRGF0YVN0b3JlXCIpKTtcbmNsYXNzIENvZ3NDb25uZWN0aW9uIHtcbiAgICBnZXQgY29uZmlnKCkge1xuICAgICAgICByZXR1cm4geyAuLi50aGlzLmN1cnJlbnRDb25maWcgfTtcbiAgICB9XG4gICAgZ2V0IHN0YXRlKCkge1xuICAgICAgICByZXR1cm4geyAuLi50aGlzLmN1cnJlbnRTdGF0ZSB9O1xuICAgIH1cbiAgICBnZXQgc2hvd1BoYXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvd1BoYXNlO1xuICAgIH1cbiAgICBnZXQgdGltZXJTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVyU3RhdGUgPyB7IC4uLnRoaXMuX3RpbWVyU3RhdGUgfSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBzdXBwb3J0c0h0dHAyQXNzZXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGllbnRTdXBwb3J0c0h0dHAyQXNzZXRzICYmIHRoaXMuc2VydmVyU3VwcG9ydHNIdHRwMkFzc2V0cztcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFzc2V0IFVSTHMgdXNpbmcgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjbGllbnQgYW5kIHNlcnZlciBzdXBwb3J0IGZvciBIVFRQLzJcbiAgICAgKi9cbiAgICBnZXRBc3NldFVybChwYXRoKSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHJldHVybiBgJHsoMCwgdXJsc18xLmFzc2V0VXJsKShwYXRoLCB0aGlzLnN1cHBvcnRzSHR0cDJBc3NldHMpfT8keyhfYiA9IChfYSA9IHRoaXMudXJsUGFyYW1zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudG9TdHJpbmcoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJyd9YDtcbiAgICB9XG4gICAgZ2V0IHNlbGVjdGVkQXVkaW9PdXRwdXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEF1ZGlvT3V0cHV0O1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihtYW5pZmVzdCwgeyBob3N0bmFtZSA9IGRvY3VtZW50LmxvY2F0aW9uLmhvc3RuYW1lLCBwb3J0ID0gdXJsc18xLkNPR1NfU0VSVkVSX1BPUlQgfSA9IHt9LCBpbml0aWFsQ2xpZW50U3RhdGUsIGluaXRpYWxEYXRhU3RvcmVEYXRhKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5tYW5pZmVzdCA9IG1hbmlmZXN0O1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgICAgIHRoaXMuY3VycmVudENvbmZpZyA9IHt9OyAvLyBSZWNlaXZlZCBvbiBvcGVuIGNvbm5lY3Rpb25cbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSB7fTsgLy8gUmVjZWl2ZWQgb24gb3BlbiBjb25uZWN0aW9uIC0gVE9ETzogc2V0IGluaXRpYWwgc3RhdGUgZnJvbSBtYW5pZmVzdD9cbiAgICAgICAgdGhpcy5fc2hvd1BoYXNlID0gU2hvd1BoYXNlXzEuZGVmYXVsdC5TZXR1cDtcbiAgICAgICAgdGhpcy5fdGltZXJTdGF0ZSA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcmFjayB0aGUgc3VwcG9ydCBmb3IgSFRUUC8yIGFzc2V0cyBvbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZVxuICAgICAgICAgKiBDbGllbnQgc2lkZSBpcyBkaWN0YXRlZCBieSB0aGUgZW52aXJvbm1lbnQgd2UncmUgY29ubmVjdGluZyBmcm9tIChhbmQgdGhlIG1lZGlhIGNvZ3MtYXYtYm94IHZlcnNpb24pXG4gICAgICAgICAqIFNlcnZlciBzaWRlIGlzIGRpY3RhdGVkIGJ5IHRoZSBDT0dTIHZlcnNpb24gd2hpY2ggYWRkZWQgdGhlIEhUVFAvMiBhc3NldHMgc2VydmVyIGl0c2VsZlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5jbGllbnRTdXBwb3J0c0h0dHAyQXNzZXRzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VydmVyU3VwcG9ydHNIdHRwMkFzc2V0cyA9IGZhbHNlO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2FjaGVkIGF1ZGlvIG91dHB1dHMgdXNlIHRvIGxvb2sgdXAgdGhlIGRldmljZS9zaW5rIElEIHdoZW4gYSBkaWZmZXJlbnQgZGV2aWNlIGxhYmVsIGlzIHJlcXVlc3RlZFxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5hdWRpb091dHB1dHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3NlbGVjdGVkQXVkaW9PdXRwdXQgPSAnJztcbiAgICAgICAgdGhpcy5jdXJyZW50U3RhdGUgPSB7IC4uLmluaXRpYWxDbGllbnRTdGF0ZSB9O1xuICAgICAgICB0aGlzLnN0b3JlID0gbmV3IERhdGFTdG9yZV8xLmRlZmF1bHQoaW5pdGlhbERhdGFTdG9yZURhdGEgIT09IG51bGwgJiYgaW5pdGlhbERhdGFTdG9yZURhdGEgIT09IHZvaWQgMCA/IGluaXRpYWxEYXRhU3RvcmVEYXRhIDoge30pO1xuICAgICAgICBjb25zdCB7IHVzZVJlY29ubmVjdGluZ1dlYnNvY2tldCwgcGF0aCwgcGF0aFBhcmFtcywgc3VwcG9ydHNIdHRwMkFzc2V0cyB9ID0gd2Vic29ja2V0UGFyYW1ldGVyc0Zyb21VcmwoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgICAgIC8vIFN0b3JlIHRoZSBVUkwgcGFyYW1ldGVycyBmb3IgdXNlIGluIGFzc2V0IFVSTHNcbiAgICAgICAgLy8gYW5kIGFkZCBzY3JlZW4gZGltZW5zaW9ucyB3aGljaCBDT0dTIGNhbiB1c2UgdG8gZGV0ZXJtaW5lIHRoZSBiZXN0IGFzc2V0IHF1YWxpdHkgdG8gc2VydmVcbiAgICAgICAgLy9cbiAgICAgICAgLy8gTm90ZSB0aGF0IGNvbnRlbnQgYWx3YXlzIHJ1bnMgZnVsbHNjcmVlbiBhbmRcbiAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBzY3JlZW4gcmVzb2x1dGlvbiB3aWxsIG5vdCBjaGFuZ2Ugd2hpbGUgdGhlIGNvbnRlbnQgaXMgcnVubmluZy5cbiAgICAgICAgdGhpcy51cmxQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhdGhQYXJhbXMpO1xuICAgICAgICB0aGlzLnVybFBhcmFtcy5zZXQoJ3NjcmVlbldpZHRoJywgd2luZG93LnNjcmVlbi53aWR0aC50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy51cmxQYXJhbXMuc2V0KCdzY3JlZW5IZWlnaHQnLCB3aW5kb3cuc2NyZWVuLmhlaWdodC50b1N0cmluZygpKTtcbiAgICAgICAgdGhpcy51cmxQYXJhbXMuc2V0KCdzY3JlZW5QaXhlbFJhdGlvJywgd2luZG93LmRldmljZVBpeGVsUmF0aW8udG9TdHJpbmcoKSk7XG4gICAgICAgIGNvbnN0IHNvY2tldFVybCA9IGB3czovLyR7aG9zdG5hbWV9OiR7cG9ydH0ke3BhdGh9PyR7dGhpcy51cmxQYXJhbXN9YDtcbiAgICAgICAgdGhpcy53ZWJzb2NrZXQgPSB1c2VSZWNvbm5lY3RpbmdXZWJzb2NrZXQgPyBuZXcgcmVjb25uZWN0aW5nX3dlYnNvY2tldF8xLmRlZmF1bHQoc29ja2V0VXJsKSA6IG5ldyBXZWJTb2NrZXQoc29ja2V0VXJsKTtcbiAgICAgICAgdGhpcy5jbGllbnRTdXBwb3J0c0h0dHAyQXNzZXRzID0gISFzdXBwb3J0c0h0dHAyQXNzZXRzO1xuICAgICAgICB0aGlzLndlYnNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcgPSB7fTsgLy8gUmVjZWl2ZWQgb24gb3BlbiBjb25uZWN0aW9uXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHt9OyAvLyBSZWNlaXZlZCBvbiBvcGVuIGNvbm5lY3Rpb25cbiAgICAgICAgICAgIC8vIFJlc2V0IHRoaXMgZmxhZyBhcyB3ZSBtaWdodCBoYXZlIGp1c3QgY29ubmVjdGVkIHRvIGFuIG9sZCBDT0dTIHZlcnNpb24gd2hpY2ggZG9lc24ndCBzdXBwb3J0IEhUVFAvMlxuICAgICAgICAgICAgLy8gVGhlIGZsYWcgd2lsbCBiZSBzZXQgd2hlbiBDT0dTIHNlbmRzIGEgXCJjb2dzX2Vudmlyb25tZW50XCIgbWVzc2FnZVxuICAgICAgICAgICAgdGhpcy5zZXJ2ZXJTdXBwb3J0c0h0dHAyQXNzZXRzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IENvZ3NDb25uZWN0aW9uT3BlbkV2ZW50KCkpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh0aGlzLmN1cnJlbnRTdGF0ZSk7IC8vIFRPRE86IFJlbW92ZSB0aGlzIGJlY2F1c2UgeW91IHNob3VsZCBzZXQgaXQgbWFudWFsbHkuLi4/P1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLndlYnNvY2tldC5vbmNsb3NlID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDb2dzQ29ubmVjdGlvbkNsb3NlRXZlbnQoKSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud2Vic29ja2V0Lm9ubWVzc2FnZSA9ICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWQuY29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRDb25maWcgPSBwYXJzZWQuY29uZmlnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDb2dzQ29uZmlnQ2hhbmdlZEV2ZW50KHRoaXMuY3VycmVudENvbmZpZykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcnNlZC51cGRhdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHsgLi4udGhpcy5jdXJyZW50U3RhdGUsIC4uLnBhcnNlZC51cGRhdGVzIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IENvZ3NTdGF0ZUNoYW5nZWRFdmVudChwYXJzZWQudXBkYXRlcykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcnNlZC5ldmVudCAmJiBwYXJzZWQuZXZlbnQua2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IENvZ3NJbmNvbWluZ0V2ZW50KHBhcnNlZC5ldmVudC5rZXksIHBhcnNlZC5ldmVudC52YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwYXJzZWQubWVzc2FnZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBwYXJzZWQubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWRqdXN0YWJsZV90aW1lcl91cGRhdGUnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1lclN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25NaWxsaXM6IG1lc3NhZ2UuZHVyYXRpb25NaWxsaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNraW5nOiBtZXNzYWdlLnRpY2tpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3Nob3dfcGhhc2UnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaG93UGhhc2UgPSBtZXNzYWdlLnBoYXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb2dzX2Vudmlyb25tZW50JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXJ2ZXJTdXBwb3J0c0h0dHAyQXNzZXRzID0gbWVzc2FnZS5odHRwMkFzc2V0c1NlcnZlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbWVkaWFfY29uZmlnX3VwZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uTmFtZSBvZiBbJ3ByZWZlck9wdGltaXplZEF1ZGlvJywgJ3ByZWZlck9wdGltaXplZFZpZGVvJywgJ3ByZWZlck9wdGltaXplZEltYWdlcyddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25FbmFibGVkID0gbWVzc2FnZVtvcHRpb25OYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25FbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cmxQYXJhbXMuc2V0KG9wdGlvbk5hbWUsICd0cnVlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVybFBhcmFtcy5kZWxldGUob3B0aW9uTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGF0YV9zdG9yZV9pdGVtcyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuaGFuZGxlRGF0YVN0b3JlSXRlbXNNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ29nc01lc3NhZ2VFdmVudChtZXNzYWdlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciBoYW5kbGluZyBkYXRhJywgZGF0YSwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gcGFyc2UgaW5jb21pbmcgZGF0YSBmcm9tIHNlcnZlcicsIGRhdGEsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBUZWxsIENPR1Mgd2hlbiBhbnkgZGF0YSBzdG9yZSBpdGVtcyBjaGFuZ2VcbiAgICAgICAgdGhpcy5zdG9yZS5hZGRFdmVudExpc3RlbmVyKCdpdGVtcycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZW5kRGF0YVN0b3JlSXRlbXMoZXZlbnQuaXRlbXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gU2VuZCBhIGxpc3Qgb2YgYXVkaW8gb3V0cHV0cyB0byBDT0dTIGFuZCBrZWVwIGl0IHVwIHRvIGRhdGVcbiAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcmVmcmVzaEF1ZGlvT3V0cHV0cyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc2AgaXMgdW5kZWZpbmVkIG9uIENPR1MgQVYgPD0gNC41IGJlY2F1c2Ugb2Ygc2VjdXJlIG9yaWdpbiBwZXJtaXNzaW9uc1xuICAgICAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IubWVkaWFEZXZpY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvT3V0cHV0cyA9IChhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKSkuZmlsdGVyKCh7IGtpbmQgfSkgPT4ga2luZCA9PT0gJ2F1ZGlvb3V0cHV0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZEF1ZGlvT3V0cHV0cyhhdWRpb091dHB1dHMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvT3V0cHV0cyA9IGF1ZGlvT3V0cHV0cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgcmVmcmVzaEF1ZGlvT3V0cHV0cyk7XG4gICAgICAgICAgICAoX2EgPSBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWRkRXZlbnRMaXN0ZW5lcignZGV2aWNlY2hhbmdlJywgcmVmcmVzaEF1ZGlvT3V0cHV0cyk7XG4gICAgICAgICAgICByZWZyZXNoQXVkaW9PdXRwdXRzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlzQ29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53ZWJzb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU47XG4gICAgfVxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLndlYnNvY2tldC5jbG9zZSgpO1xuICAgIH1cbiAgICBzZW5kRXZlbnQoZXZlbnROYW1lLCAuLi5bZXZlbnRWYWx1ZV0pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIGV2ZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogZXZlbnROYW1lLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXZlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFN0YXRlKHZhbHVlcykge1xuICAgICAgICB0aGlzLmN1cnJlbnRTdGF0ZSA9IHsgLi4udGhpcy5jdXJyZW50U3RhdGUsIC4uLnZhbHVlcyB9O1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IHVwZGF0ZXM6IHZhbHVlcyB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0QXVkaW9TaW5rSWQoYXVkaW9PdXRwdXQpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgcmV0dXJuIGF1ZGlvT3V0cHV0ID8gKF9iID0gKF9hID0gdGhpcy5hdWRpb091dHB1dHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5maW5kKCh7IGxhYmVsIH0pID0+IGxhYmVsID09PSBhdWRpb091dHB1dCkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5kZXZpY2VJZCA6ICcnO1xuICAgIH1cbiAgICBzZW5kSW5pdGlhbE1lZGlhQ2xpcFN0YXRlcyhhbGxNZWRpYUNsaXBTdGF0ZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMud2Vic29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoeyBhbGxNZWRpYUNsaXBTdGF0ZXMgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNlbmRNZWRpYUNsaXBTdGF0ZShtZWRpYUNsaXBTdGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IG1lZGlhQ2xpcFN0YXRlIH0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZW5kQXVkaW9PdXRwdXRzKGF1ZGlvT3V0cHV0cykge1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IGF1ZGlvT3V0cHV0cyB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2VuZERhdGFTdG9yZUl0ZW1zKHBhcnRpYWxJdGVtcykge1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IGRhdGFTdG9yZUl0ZW1zOiBwYXJ0aWFsSXRlbXMgfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3cgb3IgaGlkZSB0aGUgcGx1Z2luIHdpbmRvdy5cbiAgICAgKiBAcGFyYW0gdmlzaWJsZSBXaGV0aGVyIHRvIHNob3cgb3IgaGlkZSB0aGUgd2luZG93XG4gICAgICogVGhpcyBpcyBvbmx5IHJlbGV2YW50IGZvciBwbHVnaW5zLCBub3QgZm9yIE1lZGlhIE1hc3RlciBjb250ZW50LlxuICAgICAqL1xuICAgIHNldFBsdWdpbldpbmRvd1Zpc2libGUodmlzaWJsZSkge1xuICAgICAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgICAgdGhpcy53ZWJzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IHdpbmRvdzogeyB2aXNpYmxlIH0gfSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFR5cGUtc2FmZSB3cmFwcGVyIGFyb3VuZCBFdmVudFRhcmdldFxuICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gQ29nc0Nvbm5lY3Rpb247XG5mdW5jdGlvbiB3ZWJzb2NrZXRQYXJhbWV0ZXJzRnJvbVVybCh1cmwpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oO1xuICAgIGNvbnN0IHBhcnNlZFVybCA9IG5ldyBVUkwodXJsKTtcbiAgICBjb25zdCBwYXRoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJzZWRVcmwuc2VhcmNoUGFyYW1zKTtcbiAgICBjb25zdCBsb2NhbENsaWVudElkID0gcGF0aFBhcmFtcy5nZXQoJ2xvY2FsX2lkJyk7XG4gICAgY29uc3QgaXNTaW11bGF0b3IgPSBwYXRoUGFyYW1zLmdldCgnc2ltdWxhdG9yJykgPT09ICd0cnVlJztcbiAgICBjb25zdCBkaXNwbGF5ID0gKF9hID0gcGF0aFBhcmFtcy5nZXQoJ2Rpc3BsYXknKSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogJyc7XG4gICAgY29uc3QgcGx1Z2luSWQgPSBwYXJzZWRVcmwucGF0aG5hbWUuc3RhcnRzV2l0aCgnL3BsdWdpbi8nKSA/IGRlY29kZVVSSUNvbXBvbmVudChwYXJzZWRVcmwucGF0aG5hbWUuc3BsaXQoJy8nKVsyXSkgOiB1bmRlZmluZWQ7XG4gICAgLy8gQWxsb3cgZXhwbGljaXRseSBkaXNhYmxpbmcgSFRUUC8yIGFzc2V0cy4gVGhpcyBpcyB1c2VmdWwgaW4gc2l0dWF0aW9ucyB3aGVyZSB3ZSBrbm93IHRoZSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBjYW5ub3QgYmVcbiAgICAvLyBzdXBwb3J0ZWQgc3VjaCBhcyB0aGUgbmF0aXZlIG1vYmlsZSBhcHBcbiAgICBjb25zdCBkaXNhYmxlSHR0cDJBc3NldHMgPSAoKF9iID0gcGF0aFBhcmFtcy5nZXQoJ2h0dHAyQXNzZXRzJykpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6ICcnKSA9PT0gJ2ZhbHNlJztcbiAgICBpZiAobG9jYWxDbGllbnRJZCkge1xuICAgICAgICBjb25zdCB0eXBlID0gKF9jID0gcGF0aFBhcmFtcy5nZXQoJ3QnKSkgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogJyc7XG4gICAgICAgIHBhdGhQYXJhbXMuZGVsZXRlKCdsb2NhbF9pZCcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogYC9sb2NhbC8ke2VuY29kZVVSSUNvbXBvbmVudChsb2NhbENsaWVudElkKX1gLFxuICAgICAgICAgICAgcGF0aFBhcmFtczogbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHQ6IHR5cGUgfSksXG4gICAgICAgICAgICB1c2VSZWNvbm5lY3RpbmdXZWJzb2NrZXQ6IHRydWUsXG4gICAgICAgICAgICBzdXBwb3J0c0h0dHAyQXNzZXRzOiAhZGlzYWJsZUh0dHAyQXNzZXRzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChpc1NpbXVsYXRvcikge1xuICAgICAgICBjb25zdCBzdXBwb3J0c0h0dHAyQXNzZXRzID0gKChfZCA9IHBhdGhQYXJhbXMuZ2V0KCdodHRwMkFzc2V0cycpKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAnJykgPT09ICd0cnVlJztcbiAgICAgICAgcGF0aFBhcmFtcy5kZWxldGUoJ2h0dHAyQXNzZXRzJyk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAoX2UgPSBwYXRoUGFyYW1zLmdldCgnbmFtZScpKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiAnJztcbiAgICAgICAgcGF0aFBhcmFtcy5kZWxldGUoJ3NpbXVsYXRvcicpO1xuICAgICAgICBwYXRoUGFyYW1zLmRlbGV0ZSgnbmFtZScpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogYC9zaW11bGF0b3IvJHtlbmNvZGVVUklDb21wb25lbnQobmFtZSl9YCxcbiAgICAgICAgICAgIHBhdGhQYXJhbXMsXG4gICAgICAgICAgICB1c2VSZWNvbm5lY3RpbmdXZWJzb2NrZXQ6IHRydWUsXG4gICAgICAgICAgICBzdXBwb3J0c0h0dHAyQXNzZXRzOiAhZGlzYWJsZUh0dHAyQXNzZXRzICYmIHN1cHBvcnRzSHR0cDJBc3NldHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGRpc3BsYXkpIHtcbiAgICAgICAgY29uc3QgZGlzcGxheUlkSW5kZXggPSAoX2YgPSBwYXRoUGFyYW1zLmdldCgnZGlzcGxheUlkSW5kZXgnKSkgIT09IG51bGwgJiYgX2YgIT09IHZvaWQgMCA/IF9mIDogJyc7XG4gICAgICAgIHBhdGhQYXJhbXMuZGVsZXRlKCdkaXNwbGF5Jyk7XG4gICAgICAgIHBhdGhQYXJhbXMuZGVsZXRlKCdkaXNwbGF5SWRJbmRleCcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGF0aDogYC9kaXNwbGF5LyR7ZW5jb2RlVVJJQ29tcG9uZW50KGRpc3BsYXkpfS8ke2VuY29kZVVSSUNvbXBvbmVudChkaXNwbGF5SWRJbmRleCl9YCxcbiAgICAgICAgICAgIHN1cHBvcnRzSHR0cDJBc3NldHM6ICFkaXNhYmxlSHR0cDJBc3NldHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHBsdWdpbklkKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYXRoOiBgL3BsdWdpbi8ke2VuY29kZVVSSUNvbXBvbmVudChwbHVnaW5JZCl9YCxcbiAgICAgICAgICAgIHVzZVJlY29ubmVjdGluZ1dlYnNvY2tldDogdHJ1ZSxcbiAgICAgICAgICAgIHN1cHBvcnRzSHR0cDJBc3NldHM6ICFkaXNhYmxlSHR0cDJBc3NldHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBzZXJpYWwgPSAoX2cgPSBwYXRoUGFyYW1zLmdldCgnc2VyaWFsJykpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6ICcnO1xuICAgICAgICBwYXRoUGFyYW1zLmRlbGV0ZSgnc2VyaWFsJyk7XG4gICAgICAgIC8vIENoZWNrIGlmIGNvZ3MtYm94LWF2IGlzIGEgdmVyc2lvbiB3aGljaCBhZGRlZCBzdXBwb3J0IGZvciBpZ25vcmluZyBIVFRQLzIgc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzXG4gICAgICAgIGNvbnN0IGZpcm13YXJlVmVyc2lvbiA9ICgoX2ggPSBwYXRoUGFyYW1zLmdldCgnZicpKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiAnJykucmVwbGFjZSgvXnYvLCAnJyk7XG4gICAgICAgIGNvbnN0IGlzQ29nc0JveEF2RGV2QnVpbGQgPSBmaXJtd2FyZVZlcnNpb24gPT09ICcwLjAuMCc7IC8vIFdlIGFzc3VtZSBkZXYgZmlybXdhcmUgYnVpbGRzIGhhdmUgSFRUUC8yIGFzc2V0cyBzdXBwb3J0IC0gQWRkZWQgaW4gMjAyNC0wM1xuICAgICAgICBjb25zdCBzdXBwb3J0c0h0dHAyQXNzZXRzID0gaXNDb2dzQm94QXZEZXZCdWlsZCB8fCAoKDAsIGNvbXBhcmVfdmVyc2lvbnNfMS52YWxpZGF0ZSkoZmlybXdhcmVWZXJzaW9uKSAmJiAoMCwgY29tcGFyZV92ZXJzaW9uc18xLnNhdGlzZmllcykoZmlybXdhcmVWZXJzaW9uLCAnPj00LjkuMCcpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhdGg6IGAvY2xpZW50LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcmlhbCl9YCxcbiAgICAgICAgICAgIHBhdGhQYXJhbXMsXG4gICAgICAgICAgICBzdXBwb3J0c0h0dHAyQXNzZXRzOiAhZGlzYWJsZUh0dHAyQXNzZXRzICYmIHN1cHBvcnRzSHR0cDJBc3NldHMsXG4gICAgICAgIH07XG4gICAgfVxufVxuY2xhc3MgQ29nc0Nvbm5lY3Rpb25PcGVuRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdvcGVuJyk7XG4gICAgICAgIHRoaXMuX2NvZ3NDb25uZWN0aW9uRXZlbnRUeXBlID0gJ29wZW4nO1xuICAgIH1cbn1cbmV4cG9ydHMuQ29nc0Nvbm5lY3Rpb25PcGVuRXZlbnQgPSBDb2dzQ29ubmVjdGlvbk9wZW5FdmVudDtcbmNsYXNzIENvZ3NDb25uZWN0aW9uQ2xvc2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ2Nsb3NlJyk7XG4gICAgICAgIHRoaXMuX2NvZ3NDb25uZWN0aW9uRXZlbnRUeXBlID0gJ2Nsb3NlJztcbiAgICB9XG59XG5leHBvcnRzLkNvZ3NDb25uZWN0aW9uQ2xvc2VFdmVudCA9IENvZ3NDb25uZWN0aW9uQ2xvc2VFdmVudDtcbmNsYXNzIENvZ3NNZXNzYWdlRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcignbWVzc2FnZScpO1xuICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB0aGlzLl9jb2dzQ29ubmVjdGlvbkV2ZW50VHlwZSA9ICdtZXNzYWdlJztcbiAgICB9XG59XG5leHBvcnRzLkNvZ3NNZXNzYWdlRXZlbnQgPSBDb2dzTWVzc2FnZUV2ZW50O1xuY2xhc3MgQ29nc0NvbmZpZ0NoYW5nZWRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICAgICAgc3VwZXIoJ2NvbmZpZycpO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5fY29nc0Nvbm5lY3Rpb25FdmVudFR5cGUgPSAnY29uZmlnJztcbiAgICB9XG59XG5leHBvcnRzLkNvZ3NDb25maWdDaGFuZ2VkRXZlbnQgPSBDb2dzQ29uZmlnQ2hhbmdlZEV2ZW50O1xuY2xhc3MgQ29nc1N0YXRlQ2hhbmdlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKHN0YXRlKSB7XG4gICAgICAgIHN1cGVyKCdzdGF0ZScpO1xuICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMuX2NvZ3NDb25uZWN0aW9uRXZlbnRUeXBlID0gJ3N0YXRlJztcbiAgICB9XG59XG5leHBvcnRzLkNvZ3NTdGF0ZUNoYW5nZWRFdmVudCA9IENvZ3NTdGF0ZUNoYW5nZWRFdmVudDtcbmNsYXNzIENvZ3NJbmNvbWluZ0V2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCdldmVudCcpO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX2NvZ3NDb25uZWN0aW9uRXZlbnRUeXBlID0gJ2V2ZW50JztcbiAgICB9XG59XG5leHBvcnRzLkNvZ3NJbmNvbWluZ0V2ZW50ID0gQ29nc0luY29taW5nRXZlbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0ID0gKHRoaXMgJiYgdGhpcy5fX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KSB8fCBmdW5jdGlvbiAocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XG4gICAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHJlYWQgcHJpdmF0ZSBtZW1iZXIgZnJvbSBhbiBvYmplY3Qgd2hvc2UgY2xhc3MgZGlkIG5vdCBkZWNsYXJlIGl0XCIpO1xuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XG59O1xudmFyIF9EYXRhU3RvcmVfZXZlbnRUYXJnZXQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkRhdGFTdG9yZUl0ZW1zRXZlbnQgPSBleHBvcnRzLkRhdGFTdG9yZUl0ZW1FdmVudCA9IHZvaWQgMDtcbi8qKlxuICogQSBzaW1wbGUga2V5LXZhbHVlIHN0b3JlIGZvciBzdG9yaW5nIGRhdGEgaW4gQ09HU1xuICpcbiAqIFdoZW4gcmVjb25uZWN0ZWQgdGhlIGRhdGEgd2lsbCBiZSByZXN0b3JlZC5cbiAqL1xuY2xhc3MgRGF0YVN0b3JlIHtcbiAgICBjb25zdHJ1Y3RvcihkZWZhdWx0SXRlbXMpIHtcbiAgICAgICAgX0RhdGFTdG9yZV9ldmVudFRhcmdldC5zZXQodGhpcywgbmV3IEV2ZW50VGFyZ2V0KCkpO1xuICAgICAgICB0aGlzLl9pdGVtcyA9IHsgLi4uZGVmYXVsdEl0ZW1zIH07XG4gICAgfVxuICAgIGhhbmRsZURhdGFTdG9yZUl0ZW1zTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zID0geyAuLi50aGlzLl9pdGVtcywgLi4ubWVzc2FnZS5pdGVtcyB9O1xuICAgICAgICBPYmplY3QuZW50cmllcyhtZXNzYWdlLml0ZW1zKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRGF0YVN0b3JlSXRlbUV2ZW50KGtleSwgdmFsdWUpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRGF0YVN0b3JlSXRlbXNFdmVudChtZXNzYWdlLml0ZW1zKSk7XG4gICAgfVxuICAgIGdldCBpdGVtcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xuICAgIH1cbiAgICBnZXRJdGVtKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlbXNba2V5XTtcbiAgICB9XG4gICAgc2V0SXRlbXMocGFydGlhbEl0ZW1zKSB7XG4gICAgICAgIHRoaXMuX2l0ZW1zID0geyAuLi50aGlzLl9pdGVtcywgLi4ucGFydGlhbEl0ZW1zIH07XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHBhcnRpYWxJdGVtcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IERhdGFTdG9yZUl0ZW1FdmVudChrZXksIHZhbHVlKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IERhdGFTdG9yZUl0ZW1zRXZlbnQocGFydGlhbEl0ZW1zKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBUeXBlLXNhZmUgbGlzdGVuZXJzXG4gICAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9EYXRhU3RvcmVfZXZlbnRUYXJnZXQsIFwiZlwiKS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9EYXRhU3RvcmVfZXZlbnRUYXJnZXQsIFwiZlwiKS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICB9XG4gICAgZGlzcGF0Y2hFdmVudChldmVudCkge1xuICAgICAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0KHRoaXMsIF9EYXRhU3RvcmVfZXZlbnRUYXJnZXQsIFwiZlwiKS5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICB9XG59XG5fRGF0YVN0b3JlX2V2ZW50VGFyZ2V0ID0gbmV3IFdlYWtNYXAoKTtcbmV4cG9ydHMuZGVmYXVsdCA9IERhdGFTdG9yZTtcbmNsYXNzIERhdGFTdG9yZUl0ZW1FdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihrZXksIHZhbHVlKSB7XG4gICAgICAgIHN1cGVyKCdpdGVtJyk7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuX2NvZ3NDb25uZWN0aW9uRXZlbnRUeXBlID0gJ2l0ZW0nO1xuICAgIH1cbn1cbmV4cG9ydHMuRGF0YVN0b3JlSXRlbUV2ZW50ID0gRGF0YVN0b3JlSXRlbUV2ZW50O1xuY2xhc3MgRGF0YVN0b3JlSXRlbXNFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihpdGVtcykge1xuICAgICAgICBzdXBlcignaXRlbXMnKTtcbiAgICAgICAgdGhpcy5pdGVtcyA9IGl0ZW1zO1xuICAgICAgICB0aGlzLl9jb2dzQ29ubmVjdGlvbkV2ZW50VHlwZSA9ICdpdGVtJztcbiAgICB9XG59XG5leHBvcnRzLkRhdGFTdG9yZUl0ZW1zRXZlbnQgPSBEYXRhU3RvcmVJdGVtc0V2ZW50O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkxJVkVfVklERU9fUExBWUJBQ0tfUkFURSA9IHZvaWQgMDtcbmNvbnN0IG1lZGlhX3N0cmVhbV9saWJyYXJ5X2Jyb3dzZXJfMSA9IHJlcXVpcmUoXCJAY2xvY2t3b3JrZG9nL21lZGlhLXN0cmVhbS1saWJyYXJ5LWJyb3dzZXJcIik7XG5jb25zdCB1cmxzXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3VybHNcIik7XG5jb25zdCBERUZBVUxUX1ZJREVPX1BMQVlCQUNLX1JBVEUgPSAxO1xuLy8gVXNlIGEgZmFzdGVyLXRoYW4tcmVhbHRpbWUgcGxheWJhY2sgcmF0ZSBieSBkZWZhdWx0XG4vLyBzbyB0aGF0IGl0IGtlZXBzIHVwIHdpdGggYSByZWFsdGltZSBzdHJlYW0gaW4gY2FzZSBvZiB2aWRlbyBidWZmZXJpbmdcbmV4cG9ydHMuTElWRV9WSURFT19QTEFZQkFDS19SQVRFID0gMS4xO1xuLyoqXG4gKiBNYW5hZ2VzIGEgd2Vic29ja2V0IGNvbm5lY3Rpb24gdG8gdGhlIENPR1MgVENQIHJlbGF5IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNlbmQgUlRTUCB2aWRlb1xuICogZmVlZHMgdG8gdGhlIHdlYi5cbiAqL1xuY2xhc3MgUnRzcFN0cmVhbWVyIHtcbiAgICBjb25zdHJ1Y3Rvcih7IGhvc3RuYW1lID0gZG9jdW1lbnQubG9jYXRpb24uaG9zdG5hbWUsIHBvcnQgPSB1cmxzXzEuQ09HU19TRVJWRVJfUE9SVCwgcGF0aCA9ICcvdGNwLXByb3h5JywgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuX3dlYnNvY2tldFVyaSA9IGB3czovLyR7aG9zdG5hbWV9OiR7cG9ydH0ke3BhdGh9YDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnQgYW4gUlRTUCB2aWRlbyBzdHJlYW0gb24gd2l0aCB0aGUgZ2l2ZW4gVVJJIG9uIHRoZSBnaXZlbiB2aWRlbyBlbGVtZW50LlxuICAgICAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIGEgZnVuY3Rpb24gdG8gY2xvc2UgdGhlIHBpcGVsaW5lXG4gICAgICovXG4gICAgcGxheShwYXJhbXMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBjb25zdCB7IHVyaSwgdmlkZW9FbGVtZW50IH0gPSBwYXJhbXM7XG4gICAgICAgIHZpZGVvRWxlbWVudC5wbGF5c0lubGluZSA9IHRydWU7IC8vIFJlcXVpcmVkIGZvciBpT1NcbiAgICAgICAgbGV0IHBpcGVsaW5lO1xuICAgICAgICBjb25zdCBzdGFydFBpcGVsaW5lID0gKCkgPT4ge1xuICAgICAgICAgICAgcGlwZWxpbmUgPT09IG51bGwgfHwgcGlwZWxpbmUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBpcGVsaW5lLmNsb3NlKCk7XG4gICAgICAgICAgICBwaXBlbGluZSA9IG5ldyBtZWRpYV9zdHJlYW1fbGlicmFyeV9icm93c2VyXzEuSHRtbDVWaWRlb1BpcGVsaW5lKHtcbiAgICAgICAgICAgICAgICB3czogeyB1cmk6IHRoaXMuX3dlYnNvY2tldFVyaSB9LFxuICAgICAgICAgICAgICAgIHJ0c3A6IHsgdXJpOiB1cmkgfSxcbiAgICAgICAgICAgICAgICBtZWRpYUVsZW1lbnQ6IHZpZGVvRWxlbWVudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gUmVzdGFydCBzdHJlYW0gb24gUlRDUCBCWUUgKHN0cmVhbSBlbmRlZClcbiAgICAgICAgICAgIHBpcGVsaW5lLnJ0c3Aub25SdGNwID0gKHJ0Y3ApID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoKDAsIG1lZGlhX3N0cmVhbV9saWJyYXJ5X2Jyb3dzZXJfMS5pc1J0Y3BCeWUpKHJ0Y3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdWaWRlbyBzdHJlYW0gZW5kZWQuIFJlc3RhcnRpbmcuJyk7XG4gICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHN0YXJ0UGlwZWxpbmUsIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBTdGFydCBwbGF5YmFjayB3aGVuIHJlYWR5XG4gICAgICAgICAgICBwaXBlbGluZS5yZWFkeS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBwaXBlbGluZS5ydHNwLnBsYXkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBzdGFydFBpcGVsaW5lKCk7XG4gICAgICAgIGlmIChwYXJhbXMucGxheWJhY2tSYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBwbGF5YmFja1JhdGUgPSAoX2EgPSBwYXJhbXMucGxheWJhY2tSYXRlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBERUZBVUxUX1ZJREVPX1BMQVlCQUNLX1JBVEU7XG4gICAgICAgICAgICB2aWRlb0VsZW1lbnQucGxheWJhY2tSYXRlID0gcGxheWJhY2tSYXRlO1xuICAgICAgICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXknLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnBsYXliYWNrUmF0ZSA9IHBsYXliYWNrUmF0ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZW1vdmVSZXN0YXJ0TGlzdGVuZXJzID0gbnVsbDtcbiAgICAgICAgaWYgKHBhcmFtcy5yZXN0YXJ0SWZTdG9wcGVkKSB7XG4gICAgICAgICAgICBsZXQgcGxheWluZyA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGludGVydmFsID0gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVRpbWVVcGRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcGxheWluZyA9IHRydWU7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlUGxheSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBwbGF5aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZVRpbWVVcGRhdGUpO1xuICAgICAgICAgICAgICAgIGlmICghaW50ZXJ2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYXlpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnVmlkZW8gc3RvcHBlZCBwbGF5aW5nLiBSZXN0YXJ0aW5nLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoc3RhcnRQaXBlbGluZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5aW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVQYXVzZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIGhhbmRsZVRpbWVVcGRhdGUpO1xuICAgICAgICAgICAgICAgIGlmIChpbnRlcnZhbCkge1xuICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGxheScsIGhhbmRsZVBsYXkpO1xuICAgICAgICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgaGFuZGxlUGF1c2UpO1xuICAgICAgICAgICAgcmVtb3ZlUmVzdGFydExpc3RlbmVycyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVQYXVzZSgpO1xuICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdwbGF5JywgaGFuZGxlUGxheSk7XG4gICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BhdXNlJywgaGFuZGxlUGF1c2UpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBwaXBlbGluZSA9PT0gbnVsbCB8fCBwaXBlbGluZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcGlwZWxpbmUuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICByZW1vdmVSZXN0YXJ0TGlzdGVuZXJzID09PSBudWxsIHx8IHJlbW92ZVJlc3RhcnRMaXN0ZW5lcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJlbW92ZVJlc3RhcnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0cy5kZWZhdWx0ID0gUnRzcFN0cmVhbWVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBWaWRlb1N0YXRlXzEgPSByZXF1aXJlKFwiLi90eXBlcy9WaWRlb1N0YXRlXCIpO1xuY29uc3QgREVGQVVMVF9QQVJFTlRfRUxFTUVOVCA9IGRvY3VtZW50LmJvZHk7XG5jbGFzcyBWaWRlb1BsYXllciB7XG4gICAgY29uc3RydWN0b3IoY29nc0Nvbm5lY3Rpb24sIHBhcmVudEVsZW1lbnQgPSBERUZBVUxUX1BBUkVOVF9FTEVNRU5UKSB7XG4gICAgICAgIHRoaXMuY29nc0Nvbm5lY3Rpb24gPSBjb2dzQ29ubmVjdGlvbjtcbiAgICAgICAgdGhpcy5ldmVudFRhcmdldCA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgICAgICB0aGlzLmdsb2JhbFZvbHVtZSA9IDE7XG4gICAgICAgIHRoaXMudmlkZW9DbGlwUGxheWVycyA9IHt9O1xuICAgICAgICB0aGlzLnNpbmtJZCA9ICcnO1xuICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgICAvLyBTZW5kIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBlYWNoIGNsaXAgdG8gQ09HU1xuICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3ZpZGVvQ2xpcFN0YXRlJywgKHsgZGV0YWlsIH0pID0+IHtcbiAgICAgICAgICAgIGNvZ3NDb25uZWN0aW9uLnNlbmRNZWRpYUNsaXBTdGF0ZShkZXRhaWwpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciB2aWRlbyBjb250cm9sIG1lc3NhZ2VzXG4gICAgICAgIGNvZ3NDb25uZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBtZXNzYWdlIH0pID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbWVkaWFfY29uZmlnX3VwZGF0ZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0R2xvYmFsVm9sdW1lKG1lc3NhZ2UuZ2xvYmFsVm9sdW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuYXVkaW9PdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lua0lkID0gY29nc0Nvbm5lY3Rpb24uZ2V0QXVkaW9TaW5rSWQobWVzc2FnZS5hdWRpb091dHB1dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEF1ZGlvU2luayhzaW5rSWQgIT09IG51bGwgJiYgc2lua0lkICE9PSB2b2lkIDAgPyBzaW5rSWQgOiAnJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb25maWcobWVzc2FnZS5maWxlcyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3ZpZGVvX3BsYXknOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlWaWRlb0NsaXAobWVzc2FnZS5maWxlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5SWQ6IG1lc3NhZ2UucGxheUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lOiBtZXNzYWdlLnZvbHVtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3A6IEJvb2xlYW4obWVzc2FnZS5sb29wKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpdDogbWVzc2FnZS5maXQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2aWRlb19wYXVzZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGF1c2VWaWRlb0NsaXAoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndmlkZW9fc3RvcCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFZpZGVvQ2xpcCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2aWRlb19zZXRfdm9sdW1lJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWaWRlb0NsaXBWb2x1bWUoeyB2b2x1bWU6IG1lc3NhZ2Uudm9sdW1lIH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2aWRlb19zZXRfZml0JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWaWRlb0NsaXBGaXQoeyBmaXQ6IG1lc3NhZ2UuZml0IH0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIE9uIGNvbm5lY3Rpb24sIHNlbmQgdGhlIGN1cnJlbnQgcGxheWluZyBzdGF0ZSBvZiBhbGwgY2xpcHNcbiAgICAgICAgLy8gKFVzdWFsbHkgZW1wdHkgdW5sZXNzIHdlYnNvY2tldCBpcyByZWNvbm5lY3RpbmcpXG4gICAgICAgIGNvbnN0IHNlbmRJbml0aWFsQ2xpcFN0YXRlcyA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVzID0gT2JqZWN0LmVudHJpZXModGhpcy52aWRlb0NsaXBQbGF5ZXJzKS5tYXAoKFtmaWxlLCBwbGF5ZXJdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gIXBsYXllci52aWRlb0VsZW1lbnQucGF1c2VkXG4gICAgICAgICAgICAgICAgICAgID8gJ3BsYXlpbmcnXG4gICAgICAgICAgICAgICAgICAgIDogcGxheWVyLnZpZGVvRWxlbWVudC5jdXJyZW50VGltZSA9PT0gMCB8fCBwbGF5ZXIudmlkZW9FbGVtZW50LmN1cnJlbnRUaW1lID09PSBwbGF5ZXIudmlkZW9FbGVtZW50LmR1cmF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdwYXVzZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdzdG9wcGVkJztcbiAgICAgICAgICAgICAgICByZXR1cm4gW2ZpbGUsIHN0YXR1c107XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvZ3NDb25uZWN0aW9uLnNlbmRJbml0aWFsTWVkaWFDbGlwU3RhdGVzKHsgbWVkaWFUeXBlOiAndmlkZW8nLCBmaWxlcyB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29nc0Nvbm5lY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHNlbmRJbml0aWFsQ2xpcFN0YXRlcyk7XG4gICAgICAgIHNlbmRJbml0aWFsQ2xpcFN0YXRlcygpO1xuICAgIH1cbiAgICBzZXRQYXJlbnRFbGVtZW50KHBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudDtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpZGVvQ2xpcFBsYXllcnMpLmZvckVhY2goKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2xpcFBsYXllci52aWRlb0VsZW1lbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVzZXRQYXJlbnRFbGVtZW50KCkge1xuICAgICAgICB0aGlzLnNldFBhcmVudEVsZW1lbnQoREVGQVVMVF9QQVJFTlRfRUxFTUVOVCk7XG4gICAgfVxuICAgIHNldEdsb2JhbFZvbHVtZShnbG9iYWxWb2x1bWUpIHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLnZpZGVvQ2xpcFBsYXllcnMpLmZvckVhY2goKGNsaXBQbGF5ZXIpID0+IHtcbiAgICAgICAgICAgIHNldFZpZGVvRWxlbWVudFZvbHVtZShjbGlwUGxheWVyLnZpZGVvRWxlbWVudCwgY2xpcFBsYXllci52b2x1bWUgKiBnbG9iYWxWb2x1bWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nbG9iYWxWb2x1bWUgPSBnbG9iYWxWb2x1bWU7XG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgcGxheVZpZGVvQ2xpcChwYXRoLCB7IHBsYXlJZCwgdm9sdW1lLCBsb29wLCBmaXQgfSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3BhdGhdKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0gPSB0aGlzLmNyZWF0ZUNsaXBQbGF5ZXIocGF0aCwgeyBwcmVsb2FkOiAnbm9uZScsIGVwaGVtZXJhbDogdHJ1ZSwgZml0IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYWxyZWFkeSBhIHBlbmRpbmcgY2xpcCwgd2hpY2ggaGFzIG5vdyBiZWVuIHN1cGVyc2VkZWQgYW5kIGFib3J0IHRoZSBwbGF5IG9wZXJhdGlvblxuICAgICAgICBpZiAodGhpcy5wZW5kaW5nQ2xpcCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWRlb0NsaXBQbGF5ZXIodGhpcy5wZW5kaW5nQ2xpcC5wYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LmxvYWQoKTsgLy8gUmVzZXRzIHRoZSBtZWRpYSBlbGVtZW50XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBOZXcgcGVuZGluZyBjbGlwIGlzIHZpZGVvIGJlaW5nIHJlcXVlc3RlZFxuICAgICAgICBpZiAoKChfYSA9IHRoaXMuYWN0aXZlQ2xpcCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhdGgpICE9PSBwYXRoKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwID0geyBwYXRoLCBwbGF5SWQsIGFjdGlvbk9uY2VQbGF5aW5nOiAncGxheScgfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXR1cCBhbmQgcGxheSB0aGUgcGVuZGluZyBjbGlwJ3MgcGxheWVyXG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZvbHVtZSA9IHZvbHVtZTtcbiAgICAgICAgICAgIHNldFZpZGVvRWxlbWVudFZvbHVtZShjbGlwUGxheWVyLnZpZGVvRWxlbWVudCwgdm9sdW1lICogdGhpcy5nbG9iYWxWb2x1bWUpO1xuICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQubG9vcCA9IGxvb3A7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5zdHlsZS5vYmplY3RGaXQgPSBmaXQ7XG4gICAgICAgICAgICBpZiAoY2xpcFBsYXllci52aWRlb0VsZW1lbnQuY3VycmVudFRpbWUgPT09IGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LmR1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuY3VycmVudFRpbWUgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQucGxheSgpO1xuICAgICAgICAgICAgLy8gRGlzcGxheSByaWdodCBhd2F5IGlmIHRoZXJlJ3MgY3VycmVudGx5IG5vIGFjdGl2ZSBjbGlwXG4gICAgICAgICAgICBpZiAoIXRoaXMuYWN0aXZlQ2xpcCkge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXVzZVZpZGVvQ2xpcCgpIHtcbiAgICAgICAgLy8gUGVuZGluZyBjbGlwIHNob3VsZCBiZSBwYXVzZWQgd2hlbiBpdCBsb2FkcyBhbmQgYmVjb21lcyBhY3RpdmVcbiAgICAgICAgaWYgKHRoaXMucGVuZGluZ0NsaXApIHtcbiAgICAgICAgICAgIHRoaXMucGVuZGluZ0NsaXAuYWN0aW9uT25jZVBsYXlpbmcgPSAncGF1c2UnO1xuICAgICAgICB9XG4gICAgICAgIC8vIFBhdXNlIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNsaXBcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlQ2xpcCkge1xuICAgICAgICAgICAgY29uc3QgeyBwbGF5SWQsIHBhdGggfSA9IHRoaXMuYWN0aXZlQ2xpcDtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIChfYSA9IGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGF1c2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBwYXRoLCAncGF1c2VkJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RvcFZpZGVvQ2xpcCgpIHtcbiAgICAgICAgLy8gUGVuZGluZyBjbGlwIHNob3VsZCBiZSBzdG9wcGVkIHdoZW4gaXQgbG9hZHMgYW5kIGJlY29tZXMgYWN0aXZlXG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmdDbGlwKSB7XG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdDbGlwLmFjdGlvbk9uY2VQbGF5aW5nID0gJ3N0b3AnO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0b3AgdGhlIGN1cnJlbnRseSBhY3RpdmUgY2xpcFxuICAgICAgICBpZiAodGhpcy5hY3RpdmVDbGlwKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVN0b3BwZWRDbGlwKHRoaXMuYWN0aXZlQ2xpcC5wYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRWaWRlb0NsaXBWb2x1bWUoeyB2b2x1bWUgfSkge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHBlbmRpbmcgY2xpcCwgdGhpcyBpcyBsYXRlc3QgdG8gaGF2ZSBiZWVuIHBsYXllZCBzbyB1cGRhdGUgaXRzIHZvbHVtZVxuICAgICAgICBjb25zdCBjbGlwVG9VcGRhdGUgPSAoX2IgPSAoX2EgPSB0aGlzLnBlbmRpbmdDbGlwKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLmFjdGl2ZUNsaXApICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCFjbGlwVG9VcGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISh2b2x1bWUgPj0gMCAmJiB2b2x1bWUgPD0gMSkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignSW52YWxpZCB2b2x1bWUnLCB2b2x1bWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKGNsaXBUb1VwZGF0ZS5wYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgaWYgKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci52b2x1bWUgPSB2b2x1bWU7XG4gICAgICAgICAgICAgICAgc2V0VmlkZW9FbGVtZW50Vm9sdW1lKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50LCB2b2x1bWUgKiB0aGlzLmdsb2JhbFZvbHVtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcjtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldFZpZGVvQ2xpcEZpdCh7IGZpdCB9KSB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcGVuZGluZyBjbGlwLCB0aGlzIGlzIGxhdGVzdCB0byBoYXZlIGJlZW4gcGxheWVkIHNvIHVwZGF0ZSBpdHMgZml0XG4gICAgICAgIGNvbnN0IGNsaXBUb1VwZGF0ZSA9IChfYiA9IChfYSA9IHRoaXMucGVuZGluZ0NsaXApICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMuYWN0aXZlQ2xpcCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoIWNsaXBUb1VwZGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKGNsaXBUb1VwZGF0ZS5wYXRoLCAoY2xpcFBsYXllcikgPT4ge1xuICAgICAgICAgICAgaWYgKGNsaXBQbGF5ZXIudmlkZW9FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuc3R5bGUub2JqZWN0Rml0ID0gZml0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNsaXBQbGF5ZXI7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoYW5kbGVTdG9wcGVkQ2xpcChwYXRoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZUNsaXAgfHwgdGhpcy5hY3RpdmVDbGlwLnBhdGggIT09IHBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwbGF5SWQgPSB0aGlzLmFjdGl2ZUNsaXAucGxheUlkO1xuICAgICAgICAvLyBPbmNlIGFuIGVwaGVtZXJhbCBjbGlwIHN0b3BzLCBjbGVhbnVwIGFuZCByZW1vdmUgdGhlIHBsYXllclxuICAgICAgICBpZiAoKF9hID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3RoaXMuYWN0aXZlQ2xpcC5wYXRoXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNvbmZpZy5lcGhlbWVyYWwpIHtcbiAgICAgICAgICAgIHRoaXMudW5sb2FkQ2xpcChwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGl2ZUNsaXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIChjbGlwUGxheWVyKSA9PiB7XG4gICAgICAgICAgICBjbGlwUGxheWVyLnZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuY3VycmVudFRpbWUgPSAwO1xuICAgICAgICAgICAgY2xpcFBsYXllci52aWRlb0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHJldHVybiBjbGlwUGxheWVyO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBwYXRoLCAnc3RvcHBlZCcpO1xuICAgIH1cbiAgICB1cGRhdGVWaWRlb0NsaXBQbGF5ZXIocGF0aCwgdXBkYXRlKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0pIHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BsYXllciA9IHVwZGF0ZSh0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0pO1xuICAgICAgICAgICAgaWYgKG5ld1BsYXllcikge1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9DbGlwUGxheWVyc1twYXRoXSA9IG5ld1BsYXllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm5vdGlmeVN0YXRlTGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0QXVkaW9TaW5rKHNpbmtJZCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNsaXBQbGF5ZXIgb2YgT2JqZWN0LnZhbHVlcyh0aGlzLnZpZGVvQ2xpcFBsYXllcnMpKSB7XG4gICAgICAgICAgICBzZXRQbGF5ZXJTaW5rSWQoY2xpcFBsYXllciwgc2lua0lkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNpbmtJZCA9IHNpbmtJZDtcbiAgICB9XG4gICAgdXBkYXRlQ29uZmlnKG5ld1BhdGhzKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZpZGVvUGF0aHMgPSBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMobmV3UGF0aHMpLmZpbHRlcigoWywgeyB0eXBlIH1dKSA9PiB0eXBlID09PSAndmlkZW8nIHx8ICF0eXBlKSk7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQ2xpcFBsYXllcnMgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnM7XG4gICAgICAgIHRoaXMudmlkZW9DbGlwUGxheWVycyA9ICgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjbGlwUGxheWVycyA9IHsgLi4ucHJldmlvdXNDbGlwUGxheWVycyB9O1xuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZENsaXBzID0gT2JqZWN0LmtleXMocHJldmlvdXNDbGlwUGxheWVycykuZmlsdGVyKChwcmV2aW91c1BhdGgpID0+ICEocHJldmlvdXNQYXRoIGluIG5ld1ZpZGVvUGF0aHMpKTtcbiAgICAgICAgICAgIHJlbW92ZWRDbGlwcy5mb3JFYWNoKChwYXRoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgICAgICBpZiAoKChfYSA9IHRoaXMuYWN0aXZlQ2xpcCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhdGgpID09PSBwYXRoICYmICgoX2IgPSBwcmV2aW91c0NsaXBQbGF5ZXJzW3BhdGhdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY29uZmlnLmVwaGVtZXJhbCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsIChwbGF5ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci5jb25maWcgPSB7IC4uLnBsYXllci5jb25maWcsIGVwaGVtZXJhbDogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllcjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVubG9hZENsaXAocGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBjbGlwUGxheWVyc1twYXRoXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGFkZGVkQ2xpcHMgPSBPYmplY3QuZW50cmllcyhuZXdWaWRlb1BhdGhzKS5maWx0ZXIoKFtuZXdGaWxlXSkgPT4gIXByZXZpb3VzQ2xpcFBsYXllcnNbbmV3RmlsZV0pO1xuICAgICAgICAgICAgYWRkZWRDbGlwcy5mb3JFYWNoKChbcGF0aCwgY29uZmlnXSkgPT4ge1xuICAgICAgICAgICAgICAgIGNsaXBQbGF5ZXJzW3BhdGhdID0gdGhpcy5jcmVhdGVDbGlwUGxheWVyKHBhdGgsIHsgLi4uY29uZmlnLCBwcmVsb2FkOiBwcmVsb2FkU3RyaW5nKGNvbmZpZy5wcmVsb2FkKSwgZXBoZW1lcmFsOiBmYWxzZSwgZml0OiAnY29udGFpbicgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWRDbGlwcyA9IE9iamVjdC5lbnRyaWVzKHByZXZpb3VzQ2xpcFBsYXllcnMpLmZpbHRlcigoW3ByZXZpb3VzUGF0aF0pID0+IHByZXZpb3VzUGF0aCBpbiBuZXdWaWRlb1BhdGhzKTtcbiAgICAgICAgICAgIHVwZGF0ZWRDbGlwcy5mb3JFYWNoKChbcGF0aCwgcHJldmlvdXNDbGlwUGxheWVyXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0NsaXBQbGF5ZXIuY29uZmlnLnByZWxvYWQgIT09IG5ld1ZpZGVvUGF0aHNbcGF0aF0ucHJlbG9hZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZGVvQ2xpcFBsYXllcihwYXRoLCAocGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuY29uZmlnID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBsYXllci5jb25maWcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbG9hZDogcHJlbG9hZFN0cmluZyhuZXdWaWRlb1BhdGhzW3BhdGhdLnByZWxvYWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwaGVtZXJhbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLnZpZGVvRWxlbWVudC5wcmVsb2FkID0gcGxheWVyLmNvbmZpZy5wcmVsb2FkO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsYXllcjtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gY2xpcFBsYXllcnM7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIHRoaXMubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTtcbiAgICB9XG4gICAgbm90aWZ5U3RhdGVMaXN0ZW5lcnMoKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZCwgX2UsIF9mLCBfZztcbiAgICAgICAgY29uc3QgVmlkZW9TdGF0ZSA9IHtcbiAgICAgICAgICAgIGdsb2JhbFZvbHVtZTogdGhpcy5nbG9iYWxWb2x1bWUsXG4gICAgICAgICAgICBpc1BsYXlpbmc6IHRoaXMuYWN0aXZlQ2xpcCA/ICEoKF9hID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3RoaXMuYWN0aXZlQ2xpcC5wYXRoXS52aWRlb0VsZW1lbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXVzZWQpIDogZmFsc2UsXG4gICAgICAgICAgICBjbGlwczogeyAuLi50aGlzLnZpZGVvQ2xpcFBsYXllcnMgfSxcbiAgICAgICAgICAgIGFjdGl2ZUNsaXA6IHRoaXMuYWN0aXZlQ2xpcFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiB0aGlzLmFjdGl2ZUNsaXAucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6ICEoKF9iID0gdGhpcy52aWRlb0NsaXBQbGF5ZXJzW3RoaXMuYWN0aXZlQ2xpcC5wYXRoXS52aWRlb0VsZW1lbnQpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXVzZWQpID8gVmlkZW9TdGF0ZV8xLkFjdGl2ZVZpZGVvQ2xpcFN0YXRlLlBsYXlpbmcgOiBWaWRlb1N0YXRlXzEuQWN0aXZlVmlkZW9DbGlwU3RhdGUuUGF1c2VkLFxuICAgICAgICAgICAgICAgICAgICBsb29wOiAoX2QgPSAoX2MgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbdGhpcy5hY3RpdmVDbGlwLnBhdGhdLnZpZGVvRWxlbWVudCkgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmxvb3ApICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB2b2x1bWU6ICgoX2UgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbdGhpcy5hY3RpdmVDbGlwLnBhdGhdLnZpZGVvRWxlbWVudCkgPT09IG51bGwgfHwgX2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9lLm11dGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgICAgICAgICAgICA6IChfZyA9IChfZiA9IHRoaXMudmlkZW9DbGlwUGxheWVyc1t0aGlzLmFjdGl2ZUNsaXAucGF0aF0udmlkZW9FbGVtZW50KSA9PT0gbnVsbCB8fCBfZiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Yudm9sdW1lKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiAwLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdzdGF0ZScsIFZpZGVvU3RhdGUpO1xuICAgIH1cbiAgICBub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnMocGxheUlkLCBmaWxlLCBzdGF0dXMpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCd2aWRlb0NsaXBTdGF0ZScsIHsgcGxheUlkLCBtZWRpYVR5cGU6ICd2aWRlbycsIGZpbGUsIHN0YXR1cyB9KTtcbiAgICB9XG4gICAgLy8gVHlwZS1zYWZlIHdyYXBwZXIgYXJvdW5kIEV2ZW50VGFyZ2V0XG4gICAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgfVxuICAgIGRpc3BhdGNoRXZlbnQodHlwZSwgZGV0YWlsKSB7XG4gICAgICAgIHRoaXMuZXZlbnRUYXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQodHlwZSwgeyBkZXRhaWwgfSkpO1xuICAgIH1cbiAgICBjcmVhdGVWaWRlb0VsZW1lbnQocGF0aCwgY29uZmlnLCB7IHZvbHVtZSB9KSB7XG4gICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICAgIHZpZGVvRWxlbWVudC5wbGF5c0lubGluZSA9IHRydWU7IC8vIFJlcXVpcmVkIGZvciBpT1NcbiAgICAgICAgdmlkZW9FbGVtZW50LnNyYyA9IHRoaXMuY29nc0Nvbm5lY3Rpb24uZ2V0QXNzZXRVcmwocGF0aCk7XG4gICAgICAgIHZpZGVvRWxlbWVudC5hdXRvcGxheSA9IGZhbHNlO1xuICAgICAgICB2aWRlb0VsZW1lbnQubG9vcCA9IGZhbHNlO1xuICAgICAgICBzZXRWaWRlb0VsZW1lbnRWb2x1bWUodmlkZW9FbGVtZW50LCB2b2x1bWUgKiB0aGlzLmdsb2JhbFZvbHVtZSk7XG4gICAgICAgIHZpZGVvRWxlbWVudC5wcmVsb2FkID0gY29uZmlnLnByZWxvYWQ7XG4gICAgICAgIHZpZGVvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdwbGF5aW5nJywgKCkgPT4ge1xuICAgICAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgICAgIC8vIElmIHRoZSBjbGlwIGlzIHN0aWxsIHRoZSBwZW5kaW5nIG9uZSB3aGVuIGl0IGFjdHVhbGx5IHN0YXJ0IHBsYXlpbmcsIHRoZW4gZW5zdXJlIGl0IGlzIGluIHRoZSBjb3JyZWN0IHN0YXRlXG4gICAgICAgICAgICBpZiAoKChfYSA9IHRoaXMucGVuZGluZ0NsaXApID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXRoKSA9PT0gcGF0aCkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5wZW5kaW5nQ2xpcC5hY3Rpb25PbmNlUGxheWluZykge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdwbGF5Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udGludWUgcGxheWluZywgc2hvdyB0aGUgdmlkZW8gZWxlbWVudCwgYW5kIG5vdGlmeSBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHRoaXMucGVuZGluZ0NsaXAucGxheUlkLCBwYXRoLCAncGxheWluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncGF1c2UnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXVzZSBwbGF5YmFjaywgc2hvdyB0aGUgdmlkZW8gZWxlbWVudCwgYW5kIG5vdGlmeSBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnModGhpcy5wZW5kaW5nQ2xpcC5wbGF5SWQsIHBhdGgsICdwYXVzZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3N0b3AnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXVzZSBwbGF5YmFjaywgbGVhdmUgdGhlIHZpZGVvIGVsZW1lbnQgaGlkZGVuLCBhbmQgbm90aWZ5IGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9FbGVtZW50LnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUNsaXBTdGF0ZUxpc3RlbmVycyh0aGlzLnBlbmRpbmdDbGlwLnBsYXlJZCwgcGF0aCwgJ3N0b3BwZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIHdhcyBhIHByZXZpb3VzbHkgYWN0aXZlIGNsaXAsIHRoZW4gc3RvcCBpdFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUNsaXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdG9wcGVkQ2xpcCh0aGlzLmFjdGl2ZUNsaXAucGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2xpcCA9IHRoaXMucGVuZGluZ0NsaXA7XG4gICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQ2xpcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCgoX2IgPSB0aGlzLmFjdGl2ZUNsaXApID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wYXRoKSA9PT0gcGF0aCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHdlIHdlcmUgdGhlIGFjdGl2ZSBjbGlwIHRoZW4ganVzdCBub3RpZnkgbGlzdGVuZXJzIHRoYXQgd2UgYXJlIG5vdyBwbGF5aW5nXG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlDbGlwU3RhdGVMaXN0ZW5lcnModGhpcy5hY3RpdmVDbGlwLnBsYXlJZCwgcGF0aCwgJ3BsYXlpbmcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBpdCBzaG91bGRuJ3QgYmUgcGxheWluZywgbGlrZSBiZWNhdXNlIGFub3RoZXIgY2xpcCBiZWNhbWUgcGVuZGluZyBiZWZvcmUgd2UgbG9hZGVkLFxuICAgICAgICAgICAgICAgIC8vIHNvIHdlIHBhdXNlIGFuZCBkb24ndCBzaG93IG9yIG5vdGlmeSBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZpZGVvRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsICgpID0+IHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBpZiB0aGVyZSdzIGEgcGVuZGluZyBjbGlwLCBhcyBvbmNlIHRoYXQgc3RhcnRzIHBsYXlpbmcgdGhlIGFjdGl2ZSBjbGlwIHdpbGwgYmUgc3RvcHBlZFxuICAgICAgICAgICAgLy8gQWxzbyBpZ25vcmUgaWYgdGhlIHZpZGVvIGlzIHNldCB0byBsb29wXG4gICAgICAgICAgICBpZiAoIXRoaXMucGVuZGluZ0NsaXAgJiYgIXZpZGVvRWxlbWVudC5sb29wKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdG9wcGVkQ2xpcChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS50b3AgPSAnMCc7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5sZWZ0ID0gJzAnO1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3R5bGUud2lkdGggPSAnMTAwJSc7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zdHlsZS5vYmplY3RGaXQgPSBjb25maWcuZml0O1xuICAgICAgICB2aWRlb0VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHZpZGVvRWxlbWVudCk7XG4gICAgICAgIHJldHVybiB2aWRlb0VsZW1lbnQ7XG4gICAgfVxuICAgIGNyZWF0ZUNsaXBQbGF5ZXIocGF0aCwgY29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHZvbHVtZSA9IDE7XG4gICAgICAgIGNvbnN0IHBsYXllciA9IHtcbiAgICAgICAgICAgIGNvbmZpZyxcbiAgICAgICAgICAgIHZpZGVvRWxlbWVudDogdGhpcy5jcmVhdGVWaWRlb0VsZW1lbnQocGF0aCwgY29uZmlnLCB7IHZvbHVtZSB9KSxcbiAgICAgICAgICAgIHZvbHVtZSxcbiAgICAgICAgfTtcbiAgICAgICAgc2V0UGxheWVyU2lua0lkKHBsYXllciwgdGhpcy5zaW5rSWQpO1xuICAgICAgICByZXR1cm4gcGxheWVyO1xuICAgIH1cbiAgICB1bmxvYWRDbGlwKHBhdGgpIHtcbiAgICAgICAgdmFyIF9hLCBfYjtcbiAgICAgICAgaWYgKCgoX2EgPSB0aGlzLmFjdGl2ZUNsaXApID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXRoKSA9PT0gcGF0aCkge1xuICAgICAgICAgICAgY29uc3QgcGxheUlkID0gdGhpcy5hY3RpdmVDbGlwLnBsYXlJZDtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlQ2xpcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5Q2xpcFN0YXRlTGlzdGVuZXJzKHBsYXlJZCwgcGF0aCwgJ3N0b3BwZWQnKTtcbiAgICAgICAgfVxuICAgICAgICAoX2IgPSB0aGlzLnZpZGVvQ2xpcFBsYXllcnNbcGF0aF0pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi52aWRlb0VsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9DbGlwUGxheWVyKHBhdGgsICgpID0+IG51bGwpO1xuICAgIH1cbn1cbmV4cG9ydHMuZGVmYXVsdCA9IFZpZGVvUGxheWVyO1xuZnVuY3Rpb24gcHJlbG9hZFN0cmluZyhwcmVsb2FkKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBwcmVsb2FkID09PSAnc3RyaW5nJyA/IHByZWxvYWQgOiBwcmVsb2FkID8gJ2F1dG8nIDogJ25vbmUnO1xufVxuZnVuY3Rpb24gc2V0UGxheWVyU2lua0lkKHBsYXllciwgc2lua0lkKSB7XG4gICAgaWYgKHNpbmtJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwbGF5ZXIudmlkZW9FbGVtZW50LnNldFNpbmtJZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwbGF5ZXIudmlkZW9FbGVtZW50LnNldFNpbmtJZChzaW5rSWQpO1xuICAgIH1cbn1cbi8qKlxuICogU2V0IHZpZGVvIHZvbHVtZVxuICpcbiAqIFRoaXMgZG9lc24ndCB3b3JrIG9uIGlPUyAodm9sdW1lIGlzIHJlYWQtb25seSkgc28gYXQgbGVhc3QgbXV0ZSBpdCBpZiB0aGUgdm9sdW1lIGlzIHplcm9cbiAqL1xuZnVuY3Rpb24gc2V0VmlkZW9FbGVtZW50Vm9sdW1lKHZpZGVvRWxlbWVudCwgdm9sdW1lKSB7XG4gICAgdmlkZW9FbGVtZW50LnZvbHVtZSA9IHZvbHVtZTtcbiAgICB2aWRlb0VsZW1lbnQubXV0ZWQgPSB2b2x1bWUgPT09IDA7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucHJlbG9hZFVybCA9IGV4cG9ydHMuYXNzZXRVcmwgPSBleHBvcnRzLkNPR1NfU0VSVkVSX1BPUlQgPSBleHBvcnRzLkNPR1NfQVNTRVRTX1NFUlZFUl9QT1JUID0gdm9pZCAwO1xuZXhwb3J0cy5DT0dTX0FTU0VUU19TRVJWRVJfUE9SVCA9IDEyMDk0O1xuZXhwb3J0cy5DT0dTX1NFUlZFUl9QT1JUID0gMTIwOTU7XG5mdW5jdGlvbiBhc3NldFVybChmaWxlLCB1c2VIdHRwMkFzc2V0c1NlcnZlcikge1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cubG9jYXRpb24gOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGF0aCA9IGAvYXNzZXRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGZpbGUpfWA7XG4gICAgaWYgKHVzZUh0dHAyQXNzZXRzU2VydmVyKSB7XG4gICAgICAgIHJldHVybiBgaHR0cHM6Ly8ke2xvY2F0aW9uID09PSBudWxsIHx8IGxvY2F0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhdGlvbi5ob3N0bmFtZX06JHtleHBvcnRzLkNPR1NfQVNTRVRTX1NFUlZFUl9QT1JUfSR7cGF0aH1gO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke2xvY2F0aW9uID09PSBudWxsIHx8IGxvY2F0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhdGlvbi5wcm90b2NvbH0vLyR7bG9jYXRpb24gPT09IG51bGwgfHwgbG9jYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2F0aW9uLmhvc3RuYW1lfToke2V4cG9ydHMuQ09HU19TRVJWRVJfUE9SVH0ke3BhdGh9YDtcbiAgICB9XG59XG5leHBvcnRzLmFzc2V0VXJsID0gYXNzZXRVcmw7XG5hc3luYyBmdW5jdGlvbiBwcmVsb2FkVXJsKHVybCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAvLyBXZSB1c2VkIGFycmF5QnVmZmVyKClgIGluc3RlYWQgb2YgYGJsb2IoKWAgYmVjYXVzZSB0aGUgbGF0dGVyIHNlZW1zIHRvIGZhaWwgb24gUGlzIHdoZW4gcHJlbG9hZGluZyBzb21lIGZpbGVzXG4gICAgcmV0dXJuIFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2F3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCldKSk7XG59XG5leHBvcnRzLnByZWxvYWRVcmwgPSBwcmVsb2FkVXJsO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV4cG9ydHMsIHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1hbmlmZXN0VHlwZXMgPSBleHBvcnRzLnByZWxvYWRVcmwgPSBleHBvcnRzLmFzc2V0VXJsID0gZXhwb3J0cy5Db2dzVmlkZW9QbGF5ZXIgPSBleHBvcnRzLkxJVkVfVklERU9fUExBWUJBQ0tfUkFURSA9IGV4cG9ydHMuQ29nc1J0c3BTdHJlYW1lciA9IGV4cG9ydHMuQ29nc0F1ZGlvUGxheWVyID0gZXhwb3J0cy5TaG93UGhhc2UgPSBleHBvcnRzLkNvZ3NDb25uZWN0aW9uID0gdm9pZCAwO1xudmFyIENvZ3NDb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9Db2dzQ29ubmVjdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvZ3NDb25uZWN0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2ltcG9ydERlZmF1bHQoQ29nc0Nvbm5lY3Rpb25fMSkuZGVmYXVsdDsgfSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9Db2dzQ29ubmVjdGlvblwiKSwgZXhwb3J0cyk7XG52YXIgU2hvd1BoYXNlXzEgPSByZXF1aXJlKFwiLi90eXBlcy9TaG93UGhhc2VcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJTaG93UGhhc2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9faW1wb3J0RGVmYXVsdChTaG93UGhhc2VfMSkuZGVmYXVsdDsgfSB9KTtcbnZhciBBdWRpb1BsYXllcl8xID0gcmVxdWlyZShcIi4vQXVkaW9QbGF5ZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb2dzQXVkaW9QbGF5ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9faW1wb3J0RGVmYXVsdChBdWRpb1BsYXllcl8xKS5kZWZhdWx0OyB9IH0pO1xudmFyIFJ0c3BTdHJlYW1lcl8xID0gcmVxdWlyZShcIi4vUnRzcFN0cmVhbWVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29nc1J0c3BTdHJlYW1lclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gX19pbXBvcnREZWZhdWx0KFJ0c3BTdHJlYW1lcl8xKS5kZWZhdWx0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTElWRV9WSURFT19QTEFZQkFDS19SQVRFXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBSdHNwU3RyZWFtZXJfMS5MSVZFX1ZJREVPX1BMQVlCQUNLX1JBVEU7IH0gfSk7XG52YXIgVmlkZW9QbGF5ZXJfMSA9IHJlcXVpcmUoXCIuL1ZpZGVvUGxheWVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29nc1ZpZGVvUGxheWVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfX2ltcG9ydERlZmF1bHQoVmlkZW9QbGF5ZXJfMSkuZGVmYXVsdDsgfSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi90eXBlcy9BdWRpb1N0YXRlXCIpLCBleHBvcnRzKTtcbnZhciB1cmxzXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3VybHNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJhc3NldFVybFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdXJsc18xLmFzc2V0VXJsOyB9IH0pO1xudmFyIHVybHNfMiA9IHJlcXVpcmUoXCIuL2hlbHBlcnMvdXJsc1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInByZWxvYWRVcmxcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVybHNfMi5wcmVsb2FkVXJsOyB9IH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3R5cGVzL0NvZ3NQbHVnaW5NYW5pZmVzdFwiKSwgZXhwb3J0cyk7XG5leHBvcnRzLk1hbmlmZXN0VHlwZXMgPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcIi4vdHlwZXMvTWFuaWZlc3RUeXBlc1wiKSk7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vRGF0YVN0b3JlXCIpLCBleHBvcnRzKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgU2hvd1BoYXNlO1xuKGZ1bmN0aW9uIChTaG93UGhhc2UpIHtcbiAgICBTaG93UGhhc2VbXCJTZXR1cFwiXSA9IFwic2V0dXBcIjtcbiAgICBTaG93UGhhc2VbXCJQcmVzaG93XCJdID0gXCJwcmUtc2hvd1wiO1xuICAgIFNob3dQaGFzZVtcIkluUHJvZ3Jlc3NcIl0gPSBcImluIHByb2dyZXNzXCI7XG4gICAgU2hvd1BoYXNlW1wiRmluaXNoZWRcIl0gPSBcImZpbmlzaGVkXCI7XG59KShTaG93UGhhc2UgfHwgKFNob3dQaGFzZSA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBTaG93UGhhc2U7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQWN0aXZlVmlkZW9DbGlwU3RhdGUgPSB2b2lkIDA7XG52YXIgQWN0aXZlVmlkZW9DbGlwU3RhdGU7XG4oZnVuY3Rpb24gKEFjdGl2ZVZpZGVvQ2xpcFN0YXRlKSB7XG4gICAgQWN0aXZlVmlkZW9DbGlwU3RhdGVbXCJQYXVzZWRcIl0gPSBcInBhdXNlZFwiO1xuICAgIEFjdGl2ZVZpZGVvQ2xpcFN0YXRlW1wiUGxheWluZ1wiXSA9IFwicGxheWluZ1wiO1xufSkoQWN0aXZlVmlkZW9DbGlwU3RhdGUgfHwgKGV4cG9ydHMuQWN0aXZlVmlkZW9DbGlwU3RhdGUgPSBBY3RpdmVWaWRlb0NsaXBTdGF0ZSA9IHt9KSk7XG4iLCJ2YXIgZmE9T2JqZWN0LmNyZWF0ZTt2YXIgRnQ9T2JqZWN0LmRlZmluZVByb3BlcnR5O3ZhciBjYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO3ZhciBsYT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lczt2YXIgZGE9T2JqZWN0LmdldFByb3RvdHlwZU9mLHBhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGhhPShyLGUpPT4oKT0+KHImJihlPXIocj0wKSksZSk7dmFyIFM9KHIsZSk9PigpPT4oZXx8cigoZT17ZXhwb3J0czp7fX0pLmV4cG9ydHMsZSksZS5leHBvcnRzKSxQdD0ocixlKT0+e2Zvcih2YXIgdCBpbiBlKUZ0KHIsdCx7Z2V0OmVbdF0sZW51bWVyYWJsZTohMH0pfSxzaT0ocixlLHQsbik9PntpZihlJiZ0eXBlb2YgZT09XCJvYmplY3RcInx8dHlwZW9mIGU9PVwiZnVuY3Rpb25cIilmb3IobGV0IGkgb2YgbGEoZSkpIXBhLmNhbGwocixpKSYmaSE9PXQmJkZ0KHIsaSx7Z2V0OigpPT5lW2ldLGVudW1lcmFibGU6IShuPWNhKGUsaSkpfHxuLmVudW1lcmFibGV9KTtyZXR1cm4gcn07dmFyIEM9KHIsZSx0KT0+KHQ9ciE9bnVsbD9mYShkYShyKSk6e30sc2koZXx8IXJ8fCFyLl9fZXNNb2R1bGU/RnQodCxcImRlZmF1bHRcIix7dmFsdWU6cixlbnVtZXJhYmxlOiEwfSk6dCxyKSksbWE9cj0+c2koRnQoe30sXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSkscik7dmFyIGZpPVMoa3Q9PntcInVzZSBzdHJpY3RcIjtjKCk7a3QuYnl0ZUxlbmd0aD15YTtrdC50b0J5dGVBcnJheT14YTtrdC5mcm9tQnl0ZUFycmF5PXZhO3ZhciBuZT1bXSxLPVtdLGdhPXR5cGVvZiBVaW50OEFycmF5PFwidVwiP1VpbnQ4QXJyYXk6QXJyYXksVnI9XCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvXCI7Zm9yKEZlPTAsYWk9VnIubGVuZ3RoO0ZlPGFpOysrRmUpbmVbRmVdPVZyW0ZlXSxLW1ZyLmNoYXJDb2RlQXQoRmUpXT1GZTt2YXIgRmUsYWk7S1tcIi1cIi5jaGFyQ29kZUF0KDApXT02MjtLW1wiX1wiLmNoYXJDb2RlQXQoMCldPTYzO2Z1bmN0aW9uIHVpKHIpe3ZhciBlPXIubGVuZ3RoO2lmKGUlND4wKXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDRcIik7dmFyIHQ9ci5pbmRleE9mKFwiPVwiKTt0PT09LTEmJih0PWUpO3ZhciBuPXQ9PT1lPzA6NC10JTQ7cmV0dXJuW3Qsbl19ZnVuY3Rpb24geWEocil7dmFyIGU9dWkociksdD1lWzBdLG49ZVsxXTtyZXR1cm4odCtuKSozLzQtbn1mdW5jdGlvbiBiYShyLGUsdCl7cmV0dXJuKGUrdCkqMy80LXR9ZnVuY3Rpb24geGEocil7dmFyIGUsdD11aShyKSxuPXRbMF0saT10WzFdLG89bmV3IGdhKGJhKHIsbixpKSkscz0wLGE9aT4wP24tNDpuLHU7Zm9yKHU9MDt1PGE7dSs9NCllPUtbci5jaGFyQ29kZUF0KHUpXTw8MTh8S1tyLmNoYXJDb2RlQXQodSsxKV08PDEyfEtbci5jaGFyQ29kZUF0KHUrMildPDw2fEtbci5jaGFyQ29kZUF0KHUrMyldLG9bcysrXT1lPj4xNiYyNTUsb1tzKytdPWU+PjgmMjU1LG9bcysrXT1lJjI1NTtyZXR1cm4gaT09PTImJihlPUtbci5jaGFyQ29kZUF0KHUpXTw8MnxLW3IuY2hhckNvZGVBdCh1KzEpXT4+NCxvW3MrK109ZSYyNTUpLGk9PT0xJiYoZT1LW3IuY2hhckNvZGVBdCh1KV08PDEwfEtbci5jaGFyQ29kZUF0KHUrMSldPDw0fEtbci5jaGFyQ29kZUF0KHUrMildPj4yLG9bcysrXT1lPj44JjI1NSxvW3MrK109ZSYyNTUpLG99ZnVuY3Rpb24gX2Eocil7cmV0dXJuIG5lW3I+PjE4JjYzXStuZVtyPj4xMiY2M10rbmVbcj4+NiY2M10rbmVbciY2M119ZnVuY3Rpb24gd2EocixlLHQpe2Zvcih2YXIgbixpPVtdLG89ZTtvPHQ7bys9MyluPShyW29dPDwxNiYxNjcxMTY4MCkrKHJbbysxXTw8OCY2NTI4MCkrKHJbbysyXSYyNTUpLGkucHVzaChfYShuKSk7cmV0dXJuIGkuam9pbihcIlwiKX1mdW5jdGlvbiB2YShyKXtmb3IodmFyIGUsdD1yLmxlbmd0aCxuPXQlMyxpPVtdLG89MTYzODMscz0wLGE9dC1uO3M8YTtzKz1vKWkucHVzaCh3YShyLHMscytvPmE/YTpzK28pKTtyZXR1cm4gbj09PTE/KGU9clt0LTFdLGkucHVzaChuZVtlPj4yXStuZVtlPDw0JjYzXStcIj09XCIpKTpuPT09MiYmKGU9KHJbdC0yXTw8OCkrclt0LTFdLGkucHVzaChuZVtlPj4xMF0rbmVbZT4+NCY2M10rbmVbZTw8MiY2M10rXCI9XCIpKSxpLmpvaW4oXCJcIil9fSk7dmFyIGNpPVMoenI9PntjKCk7enIucmVhZD1mdW5jdGlvbihyLGUsdCxuLGkpe3ZhciBvLHMsYT1pKjgtbi0xLHU9KDE8PGEpLTEsZj11Pj4xLGw9LTcsZD10P2ktMTowLGg9dD8tMToxLG09cltlK2RdO2ZvcihkKz1oLG89bSYoMTw8LWwpLTEsbT4+PS1sLGwrPWE7bD4wO289byoyNTYrcltlK2RdLGQrPWgsbC09OCk7Zm9yKHM9byYoMTw8LWwpLTEsbz4+PS1sLGwrPW47bD4wO3M9cyoyNTYrcltlK2RdLGQrPWgsbC09OCk7aWYobz09PTApbz0xLWY7ZWxzZXtpZihvPT09dSlyZXR1cm4gcz9OYU46KG0/LTE6MSkqKDEvMCk7cz1zK01hdGgucG93KDIsbiksbz1vLWZ9cmV0dXJuKG0/LTE6MSkqcypNYXRoLnBvdygyLG8tbil9O3pyLndyaXRlPWZ1bmN0aW9uKHIsZSx0LG4saSxvKXt2YXIgcyxhLHUsZj1vKjgtaS0xLGw9KDE8PGYpLTEsZD1sPj4xLGg9aT09PTIzP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxtPW4/MDpvLTEsYj1uPzE6LTEseT1lPDB8fGU9PT0wJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KGE9aXNOYU4oZSk/MTowLHM9bCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSoodT1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSx1Kj0yKSxzK2Q+PTE/ZSs9aC91OmUrPWgqTWF0aC5wb3coMiwxLWQpLGUqdT49MiYmKHMrKyx1Lz0yKSxzK2Q+PWw/KGE9MCxzPWwpOnMrZD49MT8oYT0oZSp1LTEpKk1hdGgucG93KDIsaSkscz1zK2QpOihhPWUqTWF0aC5wb3coMixkLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODtyW3QrbV09YSYyNTUsbSs9YixhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLGYrPWk7Zj4wO3JbdCttXT1zJjI1NSxtKz1iLHMvPTI1NixmLT04KTtyW3QrbS1iXXw9eSoxMjh9fSk7dmFyIFhlPVMoS2U9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFlyPWZpKCksemU9Y2koKSxsaT10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJnR5cGVvZiBTeW1ib2wuZm9yPT1cImZ1bmN0aW9uXCI/U3ltYm9sLmZvcihcIm5vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tXCIpOm51bGw7S2UuQnVmZmVyPXA7S2UuU2xvd0J1ZmZlcj1CYTtLZS5JTlNQRUNUX01BWF9CWVRFUz01MDt2YXIgT3Q9MjE0NzQ4MzY0NztLZS5rTWF4TGVuZ3RoPU90O3AuVFlQRURfQVJSQVlfU1VQUE9SVD1FYSgpOyFwLlRZUEVEX0FSUkFZX1NVUFBPUlQmJnR5cGVvZiBjb25zb2xlPFwidVwiJiZ0eXBlb2YgY29uc29sZS5lcnJvcj09XCJmdW5jdGlvblwiJiZjb25zb2xlLmVycm9yKFwiVGhpcyBicm93c2VyIGxhY2tzIHR5cGVkIGFycmF5IChVaW50OEFycmF5KSBzdXBwb3J0IHdoaWNoIGlzIHJlcXVpcmVkIGJ5IGBidWZmZXJgIHY1LnguIFVzZSBgYnVmZmVyYCB2NC54IGlmIHlvdSByZXF1aXJlIG9sZCBicm93c2VyIHN1cHBvcnQuXCIpO2Z1bmN0aW9uIEVhKCl7dHJ5e2xldCByPW5ldyBVaW50OEFycmF5KDEpLGU9e2ZvbzpmdW5jdGlvbigpe3JldHVybiA0Mn19O3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YoZSxVaW50OEFycmF5LnByb3RvdHlwZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHIsZSksci5mb28oKT09PTQyfWNhdGNoe3JldHVybiExfX1PYmplY3QuZGVmaW5lUHJvcGVydHkocC5wcm90b3R5cGUsXCJwYXJlbnRcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtpZighIXAuaXNCdWZmZXIodGhpcykpcmV0dXJuIHRoaXMuYnVmZmVyfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShwLnByb3RvdHlwZSxcIm9mZnNldFwiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKCEhcC5pc0J1ZmZlcih0aGlzKSlyZXR1cm4gdGhpcy5ieXRlT2Zmc2V0fX0pO2Z1bmN0aW9uIGRlKHIpe2lmKHI+T3QpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicrcisnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJyk7bGV0IGU9bmV3IFVpbnQ4QXJyYXkocik7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihlLHAucHJvdG90eXBlKSxlfWZ1bmN0aW9uIHAocixlLHQpe2lmKHR5cGVvZiByPT1cIm51bWJlclwiKXtpZih0eXBlb2YgZT09XCJzdHJpbmdcIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLiBSZWNlaXZlZCB0eXBlIG51bWJlcicpO3JldHVybiBRcihyKX1yZXR1cm4gbWkocixlLHQpfXAucG9vbFNpemU9ODE5MjtmdW5jdGlvbiBtaShyLGUsdCl7aWYodHlwZW9mIHI9PVwic3RyaW5nXCIpcmV0dXJuIFJhKHIsZSk7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KHIpKXJldHVybiBUYShyKTtpZihyPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSBcIit0eXBlb2Ygcik7aWYoaWUocixBcnJheUJ1ZmZlcil8fHImJmllKHIuYnVmZmVyLEFycmF5QnVmZmVyKXx8dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyPFwidVwiJiYoaWUocixTaGFyZWRBcnJheUJ1ZmZlcil8fHImJmllKHIuYnVmZmVyLFNoYXJlZEFycmF5QnVmZmVyKSkpcmV0dXJuIFhyKHIsZSx0KTtpZih0eXBlb2Ygcj09XCJudW1iZXJcIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlIG51bWJlcicpO2xldCBuPXIudmFsdWVPZiYmci52YWx1ZU9mKCk7aWYobiE9bnVsbCYmbiE9PXIpcmV0dXJuIHAuZnJvbShuLGUsdCk7bGV0IGk9Q2Eocik7aWYoaSlyZXR1cm4gaTtpZih0eXBlb2YgU3ltYm9sPFwidVwiJiZTeW1ib2wudG9QcmltaXRpdmUhPW51bGwmJnR5cGVvZiByW1N5bWJvbC50b1ByaW1pdGl2ZV09PVwiZnVuY3Rpb25cIilyZXR1cm4gcC5mcm9tKHJbU3ltYm9sLnRvUHJpbWl0aXZlXShcInN0cmluZ1wiKSxlLHQpO3Rocm93IG5ldyBUeXBlRXJyb3IoXCJUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSBcIit0eXBlb2Ygcil9cC5mcm9tPWZ1bmN0aW9uKHIsZSx0KXtyZXR1cm4gbWkocixlLHQpfTtPYmplY3Quc2V0UHJvdG90eXBlT2YocC5wcm90b3R5cGUsVWludDhBcnJheS5wcm90b3R5cGUpO09iamVjdC5zZXRQcm90b3R5cGVPZihwLFVpbnQ4QXJyYXkpO2Z1bmN0aW9uIGdpKHIpe2lmKHR5cGVvZiByIT1cIm51bWJlclwiKXRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXInKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicrcisnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJyl9ZnVuY3Rpb24gU2EocixlLHQpe3JldHVybiBnaShyKSxyPD0wP2RlKHIpOmUhPT12b2lkIDA/dHlwZW9mIHQ9PVwic3RyaW5nXCI/ZGUocikuZmlsbChlLHQpOmRlKHIpLmZpbGwoZSk6ZGUocil9cC5hbGxvYz1mdW5jdGlvbihyLGUsdCl7cmV0dXJuIFNhKHIsZSx0KX07ZnVuY3Rpb24gUXIocil7cmV0dXJuIGdpKHIpLGRlKHI8MD8wOlpyKHIpfDApfXAuYWxsb2NVbnNhZmU9ZnVuY3Rpb24ocil7cmV0dXJuIFFyKHIpfTtwLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihyKXtyZXR1cm4gUXIocil9O2Z1bmN0aW9uIFJhKHIsZSl7aWYoKHR5cGVvZiBlIT1cInN0cmluZ1wifHxlPT09XCJcIikmJihlPVwidXRmOFwiKSwhcC5pc0VuY29kaW5nKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIitlKTtsZXQgdD15aShyLGUpfDAsbj1kZSh0KSxpPW4ud3JpdGUocixlKTtyZXR1cm4gaSE9PXQmJihuPW4uc2xpY2UoMCxpKSksbn1mdW5jdGlvbiBLcihyKXtsZXQgZT1yLmxlbmd0aDwwPzA6WnIoci5sZW5ndGgpfDAsdD1kZShlKTtmb3IobGV0IG49MDtuPGU7bis9MSl0W25dPXJbbl0mMjU1O3JldHVybiB0fWZ1bmN0aW9uIFRhKHIpe2lmKGllKHIsVWludDhBcnJheSkpe2xldCBlPW5ldyBVaW50OEFycmF5KHIpO3JldHVybiBYcihlLmJ1ZmZlcixlLmJ5dGVPZmZzZXQsZS5ieXRlTGVuZ3RoKX1yZXR1cm4gS3Iocil9ZnVuY3Rpb24gWHIocixlLHQpe2lmKGU8MHx8ci5ieXRlTGVuZ3RoPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJyk7aWYoci5ieXRlTGVuZ3RoPGUrKHR8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCdcImxlbmd0aFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpO2xldCBuO3JldHVybiBlPT09dm9pZCAwJiZ0PT09dm9pZCAwP249bmV3IFVpbnQ4QXJyYXkocik6dD09PXZvaWQgMD9uPW5ldyBVaW50OEFycmF5KHIsZSk6bj1uZXcgVWludDhBcnJheShyLGUsdCksT2JqZWN0LnNldFByb3RvdHlwZU9mKG4scC5wcm90b3R5cGUpLG59ZnVuY3Rpb24gQ2Eocil7aWYocC5pc0J1ZmZlcihyKSl7bGV0IGU9WnIoci5sZW5ndGgpfDAsdD1kZShlKTtyZXR1cm4gdC5sZW5ndGg9PT0wfHxyLmNvcHkodCwwLDAsZSksdH1pZihyLmxlbmd0aCE9PXZvaWQgMClyZXR1cm4gdHlwZW9mIHIubGVuZ3RoIT1cIm51bWJlclwifHx0bihyLmxlbmd0aCk/ZGUoMCk6S3Iocik7aWYoci50eXBlPT09XCJCdWZmZXJcIiYmQXJyYXkuaXNBcnJheShyLmRhdGEpKXJldHVybiBLcihyLmRhdGEpfWZ1bmN0aW9uIFpyKHIpe2lmKHI+PU90KXRocm93IG5ldyBSYW5nZUVycm9yKFwiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweFwiK090LnRvU3RyaW5nKDE2KStcIiBieXRlc1wiKTtyZXR1cm4gcnwwfWZ1bmN0aW9uIEJhKHIpe3JldHVybityIT1yJiYocj0wKSxwLmFsbG9jKCtyKX1wLmlzQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiBlIT1udWxsJiZlLl9pc0J1ZmZlcj09PSEwJiZlIT09cC5wcm90b3R5cGV9O3AuY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKGllKGUsVWludDhBcnJheSkmJihlPXAuZnJvbShlLGUub2Zmc2V0LGUuYnl0ZUxlbmd0aCkpLGllKHQsVWludDhBcnJheSkmJih0PXAuZnJvbSh0LHQub2Zmc2V0LHQuYnl0ZUxlbmd0aCkpLCFwLmlzQnVmZmVyKGUpfHwhcC5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJidWYxXCIsIFwiYnVmMlwiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5Jyk7aWYoZT09PXQpcmV0dXJuIDA7bGV0IG49ZS5sZW5ndGgsaT10Lmxlbmd0aDtmb3IobGV0IG89MCxzPU1hdGgubWluKG4saSk7bzxzOysrbylpZihlW29dIT09dFtvXSl7bj1lW29dLGk9dFtvXTticmVha31yZXR1cm4gbjxpPy0xOmk8bj8xOjB9O3AuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2VcImhleFwiOmNhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOmNhc2VcImFzY2lpXCI6Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6Y2FzZVwiYmFzZTY0XCI6Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19O3AuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBwLmFsbG9jKDApO2xldCBuO2lmKHQ9PT12b2lkIDApZm9yKHQ9MCxuPTA7bjxlLmxlbmd0aDsrK24pdCs9ZVtuXS5sZW5ndGg7bGV0IGk9cC5hbGxvY1Vuc2FmZSh0KSxvPTA7Zm9yKG49MDtuPGUubGVuZ3RoOysrbil7bGV0IHM9ZVtuXTtpZihpZShzLFVpbnQ4QXJyYXkpKW8rcy5sZW5ndGg+aS5sZW5ndGg/KHAuaXNCdWZmZXIocyl8fChzPXAuZnJvbShzKSkscy5jb3B5KGksbykpOlVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGkscyxvKTtlbHNlIGlmKHAuaXNCdWZmZXIocykpcy5jb3B5KGksbyk7ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvKz1zLmxlbmd0aH1yZXR1cm4gaX07ZnVuY3Rpb24geWkocixlKXtpZihwLmlzQnVmZmVyKHIpKXJldHVybiByLmxlbmd0aDtpZihBcnJheUJ1ZmZlci5pc1ZpZXcocil8fGllKHIsQXJyYXlCdWZmZXIpKXJldHVybiByLmJ5dGVMZW5ndGg7aWYodHlwZW9mIHIhPVwic3RyaW5nXCIpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgb3IgQXJyYXlCdWZmZXIuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2Ygcik7bGV0IHQ9ci5sZW5ndGgsbj1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXT09PSEwO2lmKCFuJiZ0PT09MClyZXR1cm4gMDtsZXQgaT0hMTtmb3IoOzspc3dpdGNoKGUpe2Nhc2VcImFzY2lpXCI6Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuIHQ7Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6cmV0dXJuIEpyKHIpLmxlbmd0aDtjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpyZXR1cm4gdCoyO2Nhc2VcImhleFwiOnJldHVybiB0Pj4+MTtjYXNlXCJiYXNlNjRcIjpyZXR1cm4gVGkocikubGVuZ3RoO2RlZmF1bHQ6aWYoaSlyZXR1cm4gbj8tMTpKcihyKS5sZW5ndGg7ZT0oXCJcIitlKS50b0xvd2VyQ2FzZSgpLGk9ITB9fXAuYnl0ZUxlbmd0aD15aTtmdW5jdGlvbiBNYShyLGUsdCl7bGV0IG49ITE7aWYoKGU9PT12b2lkIDB8fGU8MCkmJihlPTApLGU+dGhpcy5sZW5ndGh8fCgodD09PXZvaWQgMHx8dD50aGlzLmxlbmd0aCkmJih0PXRoaXMubGVuZ3RoKSx0PD0wKXx8KHQ+Pj49MCxlPj4+PTAsdDw9ZSkpcmV0dXJuXCJcIjtmb3Iocnx8KHI9XCJ1dGY4XCIpOzspc3dpdGNoKHIpe2Nhc2VcImhleFwiOnJldHVybiBOYSh0aGlzLGUsdCk7Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6cmV0dXJuIHhpKHRoaXMsZSx0KTtjYXNlXCJhc2NpaVwiOnJldHVybiBVYSh0aGlzLGUsdCk7Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuIERhKHRoaXMsZSx0KTtjYXNlXCJiYXNlNjRcIjpyZXR1cm4ga2EodGhpcyxlLHQpO2Nhc2VcInVjczJcIjpjYXNlXCJ1Y3MtMlwiOmNhc2VcInV0ZjE2bGVcIjpjYXNlXCJ1dGYtMTZsZVwiOnJldHVybiBIYSh0aGlzLGUsdCk7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIityKTtyPShyK1wiXCIpLnRvTG93ZXJDYXNlKCksbj0hMH19cC5wcm90b3R5cGUuX2lzQnVmZmVyPSEwO2Z1bmN0aW9uIFBlKHIsZSx0KXtsZXQgbj1yW2VdO3JbZV09clt0XSxyW3RdPW59cC5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7bGV0IGU9dGhpcy5sZW5ndGg7aWYoZSUyIT09MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzXCIpO2ZvcihsZXQgdD0wO3Q8ZTt0Kz0yKVBlKHRoaXMsdCx0KzEpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXtsZXQgZT10aGlzLmxlbmd0aDtpZihlJTQhPT0wKXRocm93IG5ldyBSYW5nZUVycm9yKFwiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHNcIik7Zm9yKGxldCB0PTA7dDxlO3QrPTQpUGUodGhpcyx0LHQrMyksUGUodGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7bGV0IGU9dGhpcy5sZW5ndGg7aWYoZSU4IT09MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzXCIpO2ZvcihsZXQgdD0wO3Q8ZTt0Kz04KVBlKHRoaXMsdCx0KzcpLFBlKHRoaXMsdCsxLHQrNiksUGUodGhpcyx0KzIsdCs1KSxQZSh0aGlzLHQrMyx0KzQpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2xldCBlPXRoaXMubGVuZ3RoO3JldHVybiBlPT09MD9cIlwiOmFyZ3VtZW50cy5sZW5ndGg9PT0wP3hpKHRoaXMsMCxlKTpNYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3AucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nPXAucHJvdG90eXBlLnRvU3RyaW5nO3AucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighcC5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlclwiKTtyZXR1cm4gdGhpcz09PWU/ITA6cC5jb21wYXJlKHRoaXMsZSk9PT0wfTtwLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7bGV0IGU9XCJcIix0PUtlLklOU1BFQ1RfTUFYX0JZVEVTO3JldHVybiBlPXRoaXMudG9TdHJpbmcoXCJoZXhcIiwwLHQpLnJlcGxhY2UoLyguezJ9KS9nLFwiJDEgXCIpLnRyaW0oKSx0aGlzLmxlbmd0aD50JiYoZSs9XCIgLi4uIFwiKSxcIjxCdWZmZXIgXCIrZStcIj5cIn07bGkmJihwLnByb3RvdHlwZVtsaV09cC5wcm90b3R5cGUuaW5zcGVjdCk7cC5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbihlLHQsbixpLG8pe2lmKGllKGUsVWludDhBcnJheSkmJihlPXAuZnJvbShlLGUub2Zmc2V0LGUuYnl0ZUxlbmd0aCkpLCFwLmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInRhcmdldFwiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgZSk7aWYodD09PXZvaWQgMCYmKHQ9MCksbj09PXZvaWQgMCYmKG49ZT9lLmxlbmd0aDowKSxpPT09dm9pZCAwJiYoaT0wKSxvPT09dm9pZCAwJiYobz10aGlzLmxlbmd0aCksdDwwfHxuPmUubGVuZ3RofHxpPDB8fG8+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvdXQgb2YgcmFuZ2UgaW5kZXhcIik7aWYoaT49byYmdD49bilyZXR1cm4gMDtpZihpPj1vKXJldHVybi0xO2lmKHQ+PW4pcmV0dXJuIDE7aWYodD4+Pj0wLG4+Pj49MCxpPj4+PTAsbz4+Pj0wLHRoaXM9PT1lKXJldHVybiAwO2xldCBzPW8taSxhPW4tdCx1PU1hdGgubWluKHMsYSksZj10aGlzLnNsaWNlKGksbyksbD1lLnNsaWNlKHQsbik7Zm9yKGxldCBkPTA7ZDx1OysrZClpZihmW2RdIT09bFtkXSl7cz1mW2RdLGE9bFtkXTticmVha31yZXR1cm4gczxhPy0xOmE8cz8xOjB9O2Z1bmN0aW9uIGJpKHIsZSx0LG4saSl7aWYoci5sZW5ndGg9PT0wKXJldHVybi0xO2lmKHR5cGVvZiB0PT1cInN0cmluZ1wiPyhuPXQsdD0wKTp0PjIxNDc0ODM2NDc/dD0yMTQ3NDgzNjQ3OnQ8LTIxNDc0ODM2NDgmJih0PS0yMTQ3NDgzNjQ4KSx0PSt0LHRuKHQpJiYodD1pPzA6ci5sZW5ndGgtMSksdDwwJiYodD1yLmxlbmd0aCt0KSx0Pj1yLmxlbmd0aCl7aWYoaSlyZXR1cm4tMTt0PXIubGVuZ3RoLTF9ZWxzZSBpZih0PDApaWYoaSl0PTA7ZWxzZSByZXR1cm4tMTtpZih0eXBlb2YgZT09XCJzdHJpbmdcIiYmKGU9cC5mcm9tKGUsbikpLHAuaXNCdWZmZXIoZSkpcmV0dXJuIGUubGVuZ3RoPT09MD8tMTpkaShyLGUsdCxuLGkpO2lmKHR5cGVvZiBlPT1cIm51bWJlclwiKXJldHVybiBlPWUmMjU1LHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mPT1cImZ1bmN0aW9uXCI/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwocixlLHQpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwocixlLHQpOmRpKHIsW2VdLHQsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyXCIpfWZ1bmN0aW9uIGRpKHIsZSx0LG4saSl7bGV0IG89MSxzPXIubGVuZ3RoLGE9ZS5sZW5ndGg7aWYobiE9PXZvaWQgMCYmKG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCksbj09PVwidWNzMlwifHxuPT09XCJ1Y3MtMlwifHxuPT09XCJ1dGYxNmxlXCJ8fG49PT1cInV0Zi0xNmxlXCIpKXtpZihyLmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO289MixzLz0yLGEvPTIsdC89Mn1mdW5jdGlvbiB1KGwsZCl7cmV0dXJuIG89PT0xP2xbZF06bC5yZWFkVUludDE2QkUoZCpvKX1sZXQgZjtpZihpKXtsZXQgbD0tMTtmb3IoZj10O2Y8cztmKyspaWYodShyLGYpPT09dShlLGw9PT0tMT8wOmYtbCkpe2lmKGw9PT0tMSYmKGw9ZiksZi1sKzE9PT1hKXJldHVybiBsKm99ZWxzZSBsIT09LTEmJihmLT1mLWwpLGw9LTF9ZWxzZSBmb3IodCthPnMmJih0PXMtYSksZj10O2Y+PTA7Zi0tKXtsZXQgbD0hMDtmb3IobGV0IGQ9MDtkPGE7ZCsrKWlmKHUocixmK2QpIT09dShlLGQpKXtsPSExO2JyZWFrfWlmKGwpcmV0dXJuIGZ9cmV0dXJuLTF9cC5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmluZGV4T2YoZSx0LG4pIT09LTF9O3AucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBiaSh0aGlzLGUsdCxuLCEwKX07cC5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBiaSh0aGlzLGUsdCxuLCExKX07ZnVuY3Rpb24gTGEocixlLHQsbil7dD1OdW1iZXIodCl8fDA7bGV0IGk9ci5sZW5ndGgtdDtuPyhuPU51bWJlcihuKSxuPmkmJihuPWkpKTpuPWk7bGV0IG89ZS5sZW5ndGg7bj5vLzImJihuPW8vMik7bGV0IHM7Zm9yKHM9MDtzPG47KytzKXtsZXQgYT1wYXJzZUludChlLnN1YnN0cihzKjIsMiksMTYpO2lmKHRuKGEpKXJldHVybiBzO3JbdCtzXT1hfXJldHVybiBzfWZ1bmN0aW9uIElhKHIsZSx0LG4pe3JldHVybiBVdChKcihlLHIubGVuZ3RoLXQpLHIsdCxuKX1mdW5jdGlvbiBBYShyLGUsdCxuKXtyZXR1cm4gVXQoJGEoZSkscix0LG4pfWZ1bmN0aW9uIEZhKHIsZSx0LG4pe3JldHVybiBVdChUaShlKSxyLHQsbil9ZnVuY3Rpb24gUGEocixlLHQsbil7cmV0dXJuIFV0KEdhKGUsci5sZW5ndGgtdCkscix0LG4pfXAucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxuLGkpe2lmKHQ9PT12b2lkIDApaT1cInV0ZjhcIixuPXRoaXMubGVuZ3RoLHQ9MDtlbHNlIGlmKG49PT12b2lkIDAmJnR5cGVvZiB0PT1cInN0cmluZ1wiKWk9dCxuPXRoaXMubGVuZ3RoLHQ9MDtlbHNlIGlmKGlzRmluaXRlKHQpKXQ9dD4+PjAsaXNGaW5pdGUobik/KG49bj4+PjAsaT09PXZvaWQgMCYmKGk9XCJ1dGY4XCIpKTooaT1uLG49dm9pZCAwKTtlbHNlIHRocm93IG5ldyBFcnJvcihcIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkXCIpO2xldCBvPXRoaXMubGVuZ3RoLXQ7aWYoKG49PT12b2lkIDB8fG4+bykmJihuPW8pLGUubGVuZ3RoPjAmJihuPDB8fHQ8MCl8fHQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kc1wiKTtpfHwoaT1cInV0ZjhcIik7bGV0IHM9ITE7Zm9yKDs7KXN3aXRjaChpKXtjYXNlXCJoZXhcIjpyZXR1cm4gTGEodGhpcyxlLHQsbik7Y2FzZVwidXRmOFwiOmNhc2VcInV0Zi04XCI6cmV0dXJuIElhKHRoaXMsZSx0LG4pO2Nhc2VcImFzY2lpXCI6Y2FzZVwibGF0aW4xXCI6Y2FzZVwiYmluYXJ5XCI6cmV0dXJuIEFhKHRoaXMsZSx0LG4pO2Nhc2VcImJhc2U2NFwiOnJldHVybiBGYSh0aGlzLGUsdCxuKTtjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpyZXR1cm4gUGEodGhpcyxlLHQsbik7ZGVmYXVsdDppZihzKXRocm93IG5ldyBUeXBlRXJyb3IoXCJVbmtub3duIGVuY29kaW5nOiBcIitpKTtpPShcIlwiK2kpLnRvTG93ZXJDYXNlKCkscz0hMH19O3AucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOlwiQnVmZmVyXCIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTtmdW5jdGlvbiBrYShyLGUsdCl7cmV0dXJuIGU9PT0wJiZ0PT09ci5sZW5ndGg/WXIuZnJvbUJ5dGVBcnJheShyKTpZci5mcm9tQnl0ZUFycmF5KHIuc2xpY2UoZSx0KSl9ZnVuY3Rpb24geGkocixlLHQpe3Q9TWF0aC5taW4oci5sZW5ndGgsdCk7bGV0IG49W10saT1lO2Zvcig7aTx0Oyl7bGV0IG89cltpXSxzPW51bGwsYT1vPjIzOT80Om8+MjIzPzM6bz4xOTE/MjoxO2lmKGkrYTw9dCl7bGV0IHUsZixsLGQ7c3dpdGNoKGEpe2Nhc2UgMTpvPDEyOCYmKHM9byk7YnJlYWs7Y2FzZSAyOnU9cltpKzFdLCh1JjE5Mik9PT0xMjgmJihkPShvJjMxKTw8Nnx1JjYzLGQ+MTI3JiYocz1kKSk7YnJlYWs7Y2FzZSAzOnU9cltpKzFdLGY9cltpKzJdLCh1JjE5Mik9PT0xMjgmJihmJjE5Mik9PT0xMjgmJihkPShvJjE1KTw8MTJ8KHUmNjMpPDw2fGYmNjMsZD4yMDQ3JiYoZDw1NTI5Nnx8ZD41NzM0MykmJihzPWQpKTticmVhaztjYXNlIDQ6dT1yW2krMV0sZj1yW2krMl0sbD1yW2krM10sKHUmMTkyKT09PTEyOCYmKGYmMTkyKT09PTEyOCYmKGwmMTkyKT09PTEyOCYmKGQ9KG8mMTUpPDwxOHwodSY2Myk8PDEyfChmJjYzKTw8NnxsJjYzLGQ+NjU1MzUmJmQ8MTExNDExMiYmKHM9ZCkpfX1zPT09bnVsbD8ocz02NTUzMyxhPTEpOnM+NjU1MzUmJihzLT02NTUzNixuLnB1c2gocz4+PjEwJjEwMjN8NTUyOTYpLHM9NTYzMjB8cyYxMDIzKSxuLnB1c2gocyksaSs9YX1yZXR1cm4gT2Eobil9dmFyIHBpPTQwOTY7ZnVuY3Rpb24gT2Eocil7bGV0IGU9ci5sZW5ndGg7aWYoZTw9cGkpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHIpO2xldCB0PVwiXCIsbj0wO2Zvcig7bjxlOyl0Kz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxyLnNsaWNlKG4sbis9cGkpKTtyZXR1cm4gdH1mdW5jdGlvbiBVYShyLGUsdCl7bGV0IG49XCJcIjt0PU1hdGgubWluKHIubGVuZ3RoLHQpO2ZvcihsZXQgaT1lO2k8dDsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZShyW2ldJjEyNyk7cmV0dXJuIG59ZnVuY3Rpb24gRGEocixlLHQpe2xldCBuPVwiXCI7dD1NYXRoLm1pbihyLmxlbmd0aCx0KTtmb3IobGV0IGk9ZTtpPHQ7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUocltpXSk7cmV0dXJuIG59ZnVuY3Rpb24gTmEocixlLHQpe2xldCBuPXIubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCF0fHx0PDB8fHQ+bikmJih0PW4pO2xldCBpPVwiXCI7Zm9yKGxldCBvPWU7bzx0OysrbylpKz1WYVtyW29dXTtyZXR1cm4gaX1mdW5jdGlvbiBIYShyLGUsdCl7bGV0IG49ci5zbGljZShlLHQpLGk9XCJcIjtmb3IobGV0IG89MDtvPG4ubGVuZ3RoLTE7bys9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5bb10rbltvKzFdKjI1Nik7cmV0dXJuIGl9cC5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24oZSx0KXtsZXQgbj10aGlzLmxlbmd0aDtlPX5+ZSx0PXQ9PT12b2lkIDA/bjp+fnQsZTwwPyhlKz1uLGU8MCYmKGU9MCkpOmU+biYmKGU9biksdDwwPyh0Kz1uLHQ8MCYmKHQ9MCkpOnQ+biYmKHQ9biksdDxlJiYodD1lKTtsZXQgaT10aGlzLnN1YmFycmF5KGUsdCk7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihpLHAucHJvdG90eXBlKSxpfTtmdW5jdGlvbiBEKHIsZSx0KXtpZihyJTEhPT0wfHxyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJvZmZzZXQgaXMgbm90IHVpbnRcIik7aWYocitlPnQpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoXCIpfXAucHJvdG90eXBlLnJlYWRVaW50TEU9cC5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbihlLHQsbil7ZT1lPj4+MCx0PXQ+Pj4wLG58fEQoZSx0LHRoaXMubGVuZ3RoKTtsZXQgaT10aGlzW2VdLG89MSxzPTA7Zm9yKDsrK3M8dCYmKG8qPTI1Nik7KWkrPXRoaXNbZStzXSpvO3JldHVybiBpfTtwLnByb3RvdHlwZS5yZWFkVWludEJFPXAucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2U9ZT4+PjAsdD10Pj4+MCxufHxEKGUsdCx0aGlzLmxlbmd0aCk7bGV0IGk9dGhpc1tlKy0tdF0sbz0xO2Zvcig7dD4wJiYobyo9MjU2KTspaSs9dGhpc1tlKy0tdF0qbztyZXR1cm4gaX07cC5wcm90b3R5cGUucmVhZFVpbnQ4PXAucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSwxLHRoaXMubGVuZ3RoKSx0aGlzW2VdfTtwLnByb3RvdHlwZS5yZWFkVWludDE2TEU9cC5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fTtwLnByb3RvdHlwZS5yZWFkVWludDE2QkU9cC5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDh8dGhpc1tlKzFdfTtwLnByb3RvdHlwZS5yZWFkVWludDMyTEU9cC5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDQsdGhpcy5sZW5ndGgpLCh0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2KSt0aGlzW2UrM10qMTY3NzcyMTZ9O3AucHJvdG90eXBlLnJlYWRVaW50MzJCRT1wLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXSoxNjc3NzIxNisodGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdKX07cC5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NExFPWJlKGZ1bmN0aW9uKGUpe2U9ZT4+PjAsWWUoZSxcIm9mZnNldFwiKTtsZXQgdD10aGlzW2VdLG49dGhpc1tlKzddOyh0PT09dm9pZCAwfHxuPT09dm9pZCAwKSYmd3QoZSx0aGlzLmxlbmd0aC04KTtsZXQgaT10K3RoaXNbKytlXSoyKio4K3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqMjQsbz10aGlzWysrZV0rdGhpc1srK2VdKjIqKjgrdGhpc1srK2VdKjIqKjE2K24qMioqMjQ7cmV0dXJuIEJpZ0ludChpKSsoQmlnSW50KG8pPDxCaWdJbnQoMzIpKX0pO3AucHJvdG90eXBlLnJlYWRCaWdVSW50NjRCRT1iZShmdW5jdGlvbihlKXtlPWU+Pj4wLFllKGUsXCJvZmZzZXRcIik7bGV0IHQ9dGhpc1tlXSxuPXRoaXNbZSs3XTsodD09PXZvaWQgMHx8bj09PXZvaWQgMCkmJnd0KGUsdGhpcy5sZW5ndGgtOCk7bGV0IGk9dCoyKioyNCt0aGlzWysrZV0qMioqMTYrdGhpc1srK2VdKjIqKjgrdGhpc1srK2VdLG89dGhpc1srK2VdKjIqKjI0K3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqOCtuO3JldHVybihCaWdJbnQoaSk8PEJpZ0ludCgzMikpK0JpZ0ludChvKX0pO3AucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbihlLHQsbil7ZT1lPj4+MCx0PXQ+Pj4wLG58fEQoZSx0LHRoaXMubGVuZ3RoKTtsZXQgaT10aGlzW2VdLG89MSxzPTA7Zm9yKDsrK3M8dCYmKG8qPTI1Nik7KWkrPXRoaXNbZStzXSpvO3JldHVybiBvKj0xMjgsaT49byYmKGktPU1hdGgucG93KDIsOCp0KSksaX07cC5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKGUsdCxuKXtlPWU+Pj4wLHQ9dD4+PjAsbnx8RChlLHQsdGhpcy5sZW5ndGgpO2xldCBpPXQsbz0xLHM9dGhpc1tlKy0taV07Zm9yKDtpPjAmJihvKj0yNTYpOylzKz10aGlzW2UrLS1pXSpvO3JldHVybiBvKj0xMjgscz49byYmKHMtPU1hdGgucG93KDIsOCp0KSksc307cC5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXSYxMjg/KDI1NS10aGlzW2VdKzEpKi0xOnRoaXNbZV19O3AucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7ZT1lPj4+MCx0fHxEKGUsMix0aGlzLmxlbmd0aCk7bGV0IG49dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIG4mMzI3Njg/bnw0Mjk0OTAxNzYwOm59O3AucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7ZT1lPj4+MCx0fHxEKGUsMix0aGlzLmxlbmd0aCk7bGV0IG49dGhpc1tlKzFdfHRoaXNbZV08PDg7cmV0dXJuIG4mMzI3Njg/bnw0Mjk0OTAxNzYwOm59O3AucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH07cC5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfTtwLnByb3RvdHlwZS5yZWFkQmlnSW50NjRMRT1iZShmdW5jdGlvbihlKXtlPWU+Pj4wLFllKGUsXCJvZmZzZXRcIik7bGV0IHQ9dGhpc1tlXSxuPXRoaXNbZSs3XTsodD09PXZvaWQgMHx8bj09PXZvaWQgMCkmJnd0KGUsdGhpcy5sZW5ndGgtOCk7bGV0IGk9dGhpc1tlKzRdK3RoaXNbZSs1XSoyKio4K3RoaXNbZSs2XSoyKioxNisobjw8MjQpO3JldHVybihCaWdJbnQoaSk8PEJpZ0ludCgzMikpK0JpZ0ludCh0K3RoaXNbKytlXSoyKio4K3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqMjQpfSk7cC5wcm90b3R5cGUucmVhZEJpZ0ludDY0QkU9YmUoZnVuY3Rpb24oZSl7ZT1lPj4+MCxZZShlLFwib2Zmc2V0XCIpO2xldCB0PXRoaXNbZV0sbj10aGlzW2UrN107KHQ9PT12b2lkIDB8fG49PT12b2lkIDApJiZ3dChlLHRoaXMubGVuZ3RoLTgpO2xldCBpPSh0PDwyNCkrdGhpc1srK2VdKjIqKjE2K3RoaXNbKytlXSoyKio4K3RoaXNbKytlXTtyZXR1cm4oQmlnSW50KGkpPDxCaWdJbnQoMzIpKStCaWdJbnQodGhpc1srK2VdKjIqKjI0K3RoaXNbKytlXSoyKioxNit0aGlzWysrZV0qMioqOCtuKX0pO3AucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDQsdGhpcy5sZW5ndGgpLHplLnJlYWQodGhpcyxlLCEwLDIzLDQpfTtwLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWU+Pj4wLHR8fEQoZSw0LHRoaXMubGVuZ3RoKSx6ZS5yZWFkKHRoaXMsZSwhMSwyMyw0KX07cC5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9ZT4+PjAsdHx8RChlLDgsdGhpcy5sZW5ndGgpLHplLnJlYWQodGhpcyxlLCEwLDUyLDgpfTtwLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1lPj4+MCx0fHxEKGUsOCx0aGlzLmxlbmd0aCksemUucmVhZCh0aGlzLGUsITEsNTIsOCl9O2Z1bmN0aW9uIFcocixlLHQsbixpLG8pe2lmKCFwLmlzQnVmZmVyKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+aXx8ZTxvKXRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKHQrbj5yLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKX1wLnByb3RvdHlwZS53cml0ZVVpbnRMRT1wLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHQsbixpKXtpZihlPStlLHQ9dD4+PjAsbj1uPj4+MCwhaSl7bGV0IGE9TWF0aC5wb3coMiw4Km4pLTE7Vyh0aGlzLGUsdCxuLGEsMCl9bGV0IG89MSxzPTA7Zm9yKHRoaXNbdF09ZSYyNTU7KytzPG4mJihvKj0yNTYpOyl0aGlzW3Qrc109ZS9vJjI1NTtyZXR1cm4gdCtufTtwLnByb3RvdHlwZS53cml0ZVVpbnRCRT1wLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbihlLHQsbixpKXtpZihlPStlLHQ9dD4+PjAsbj1uPj4+MCwhaSl7bGV0IGE9TWF0aC5wb3coMiw4Km4pLTE7Vyh0aGlzLGUsdCxuLGEsMCl9bGV0IG89bi0xLHM9MTtmb3IodGhpc1t0K29dPWUmMjU1Oy0tbz49MCYmKHMqPTI1Nik7KXRoaXNbdCtvXT1lL3MmMjU1O3JldHVybiB0K259O3AucHJvdG90eXBlLndyaXRlVWludDg9cC5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDEsMjU1LDApLHRoaXNbdF09ZSYyNTUsdCsxfTtwLnByb3RvdHlwZS53cml0ZVVpbnQxNkxFPXAucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCwyLDY1NTM1LDApLHRoaXNbdF09ZSYyNTUsdGhpc1t0KzFdPWU+Pj44LHQrMn07cC5wcm90b3R5cGUud3JpdGVVaW50MTZCRT1wLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMiw2NTUzNSwwKSx0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT1lJjI1NSx0KzJ9O3AucHJvdG90eXBlLndyaXRlVWludDMyTEU9cC5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdD10Pj4+MCxufHxXKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSx0aGlzW3QrM109ZT4+PjI0LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdF09ZSYyNTUsdCs0fTtwLnByb3RvdHlwZS53cml0ZVVpbnQzMkJFPXAucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCw0LDQyOTQ5NjcyOTUsMCksdGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPWUmMjU1LHQrNH07ZnVuY3Rpb24gX2kocixlLHQsbixpKXtSaShlLG4saSxyLHQsNyk7bGV0IG89TnVtYmVyKGUmQmlnSW50KDQyOTQ5NjcyOTUpKTtyW3QrK109byxvPW8+Pjgsclt0KytdPW8sbz1vPj44LHJbdCsrXT1vLG89bz4+OCxyW3QrK109bztsZXQgcz1OdW1iZXIoZT4+QmlnSW50KDMyKSZCaWdJbnQoNDI5NDk2NzI5NSkpO3JldHVybiByW3QrK109cyxzPXM+Pjgsclt0KytdPXMscz1zPj44LHJbdCsrXT1zLHM9cz4+OCxyW3QrK109cyx0fWZ1bmN0aW9uIHdpKHIsZSx0LG4saSl7UmkoZSxuLGkscix0LDcpO2xldCBvPU51bWJlcihlJkJpZ0ludCg0Mjk0OTY3Mjk1KSk7clt0KzddPW8sbz1vPj44LHJbdCs2XT1vLG89bz4+OCxyW3QrNV09byxvPW8+Pjgsclt0KzRdPW87bGV0IHM9TnVtYmVyKGU+PkJpZ0ludCgzMikmQmlnSW50KDQyOTQ5NjcyOTUpKTtyZXR1cm4gclt0KzNdPXMscz1zPj44LHJbdCsyXT1zLHM9cz4+OCxyW3QrMV09cyxzPXM+Pjgsclt0XT1zLHQrOH1wLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NExFPWJlKGZ1bmN0aW9uKGUsdD0wKXtyZXR1cm4gX2kodGhpcyxlLHQsQmlnSW50KDApLEJpZ0ludChcIjB4ZmZmZmZmZmZmZmZmZmZmZlwiKSl9KTtwLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NEJFPWJlKGZ1bmN0aW9uKGUsdD0wKXtyZXR1cm4gd2kodGhpcyxlLHQsQmlnSW50KDApLEJpZ0ludChcIjB4ZmZmZmZmZmZmZmZmZmZmZlwiKSl9KTtwLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKGUsdCxuLGkpe2lmKGU9K2UsdD10Pj4+MCwhaSl7bGV0IHU9TWF0aC5wb3coMiw4Km4tMSk7Vyh0aGlzLGUsdCxuLHUtMSwtdSl9bGV0IG89MCxzPTEsYT0wO2Zvcih0aGlzW3RdPWUmMjU1OysrbzxuJiYocyo9MjU2KTspZTwwJiZhPT09MCYmdGhpc1t0K28tMV0hPT0wJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrbn07cC5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbihlLHQsbixpKXtpZihlPStlLHQ9dD4+PjAsIWkpe2xldCB1PU1hdGgucG93KDIsOCpuLTEpO1codGhpcyxlLHQsbix1LTEsLXUpfWxldCBvPW4tMSxzPTEsYT0wO2Zvcih0aGlzW3Qrb109ZSYyNTU7LS1vPj0wJiYocyo9MjU2KTspZTwwJiZhPT09MCYmdGhpc1t0K28rMV0hPT0wJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrbn07cC5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMSwxMjcsLTEyOCksZTwwJiYoZT0yNTUrZSsxKSx0aGlzW3RdPWUmMjU1LHQrMX07cC5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLHRoaXNbdF09ZSYyNTUsdGhpc1t0KzFdPWU+Pj44LHQrMn07cC5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPWUmMjU1LHQrMn07cC5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0PXQ+Pj4wLG58fFcodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0aGlzW3RdPWUmMjU1LHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQsdCs0fTtwLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHQ9dD4+PjAsbnx8Vyh0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGU8MCYmKGU9NDI5NDk2NzI5NStlKzEpLHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT1lJjI1NSx0KzR9O3AucHJvdG90eXBlLndyaXRlQmlnSW50NjRMRT1iZShmdW5jdGlvbihlLHQ9MCl7cmV0dXJuIF9pKHRoaXMsZSx0LC1CaWdJbnQoXCIweDgwMDAwMDAwMDAwMDAwMDBcIiksQmlnSW50KFwiMHg3ZmZmZmZmZmZmZmZmZmZmXCIpKX0pO3AucHJvdG90eXBlLndyaXRlQmlnSW50NjRCRT1iZShmdW5jdGlvbihlLHQ9MCl7cmV0dXJuIHdpKHRoaXMsZSx0LC1CaWdJbnQoXCIweDgwMDAwMDAwMDAwMDAwMDBcIiksQmlnSW50KFwiMHg3ZmZmZmZmZmZmZmZmZmZmXCIpKX0pO2Z1bmN0aW9uIHZpKHIsZSx0LG4saSxvKXtpZih0K24+ci5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIik7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpfWZ1bmN0aW9uIEVpKHIsZSx0LG4saSl7cmV0dXJuIGU9K2UsdD10Pj4+MCxpfHx2aShyLGUsdCw0LDM0MDI4MjM0NjYzODUyODg2ZTIyLC0zNDAyODIzNDY2Mzg1Mjg4NmUyMiksemUud3JpdGUocixlLHQsbiwyMyw0KSx0KzR9cC5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRWkodGhpcyxlLHQsITAsbil9O3AucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEVpKHRoaXMsZSx0LCExLG4pfTtmdW5jdGlvbiBTaShyLGUsdCxuLGkpe3JldHVybiBlPStlLHQ9dD4+PjAsaXx8dmkocixlLHQsOCwxNzk3NjkzMTM0ODYyMzE1N2UyOTIsLTE3OTc2OTMxMzQ4NjIzMTU3ZTI5MiksemUud3JpdGUocixlLHQsbiw1Miw4KSx0Kzh9cC5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIFNpKHRoaXMsZSx0LCEwLG4pfTtwLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gU2kodGhpcyxlLHQsITEsbil9O3AucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oZSx0LG4saSl7aWYoIXAuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcImFyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlclwiKTtpZihufHwobj0wKSwhaSYmaSE9PTAmJihpPXRoaXMubGVuZ3RoKSx0Pj1lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLHR8fCh0PTApLGk+MCYmaTxuJiYoaT1uKSxpPT09bnx8ZS5sZW5ndGg9PT0wfHx0aGlzLmxlbmd0aD09PTApcmV0dXJuIDA7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKFwidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kc1wiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpO2lmKGk8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzXCIpO2k+dGhpcy5sZW5ndGgmJihpPXRoaXMubGVuZ3RoKSxlLmxlbmd0aC10PGktbiYmKGk9ZS5sZW5ndGgtdCtuKTtsZXQgbz1pLW47cmV0dXJuIHRoaXM9PT1lJiZ0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbj09XCJmdW5jdGlvblwiP3RoaXMuY29weVdpdGhpbih0LG4saSk6VWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoZSx0aGlzLnN1YmFycmF5KG4saSksdCksb307cC5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbihlLHQsbixpKXtpZih0eXBlb2YgZT09XCJzdHJpbmdcIil7aWYodHlwZW9mIHQ9PVwic3RyaW5nXCI/KGk9dCx0PTAsbj10aGlzLmxlbmd0aCk6dHlwZW9mIG49PVwic3RyaW5nXCImJihpPW4sbj10aGlzLmxlbmd0aCksaSE9PXZvaWQgMCYmdHlwZW9mIGkhPVwic3RyaW5nXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihcImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmdcIik7aWYodHlwZW9mIGk9PVwic3RyaW5nXCImJiFwLmlzRW5jb2RpbmcoaSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVua25vd24gZW5jb2Rpbmc6IFwiK2kpO2lmKGUubGVuZ3RoPT09MSl7bGV0IHM9ZS5jaGFyQ29kZUF0KDApOyhpPT09XCJ1dGY4XCImJnM8MTI4fHxpPT09XCJsYXRpbjFcIikmJihlPXMpfX1lbHNlIHR5cGVvZiBlPT1cIm51bWJlclwiP2U9ZSYyNTU6dHlwZW9mIGU9PVwiYm9vbGVhblwiJiYoZT1OdW1iZXIoZSkpO2lmKHQ8MHx8dGhpcy5sZW5ndGg8dHx8dGhpcy5sZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIk91dCBvZiByYW5nZSBpbmRleFwiKTtpZihuPD10KXJldHVybiB0aGlzO3Q9dD4+PjAsbj1uPT09dm9pZCAwP3RoaXMubGVuZ3RoOm4+Pj4wLGV8fChlPTApO2xldCBvO2lmKHR5cGVvZiBlPT1cIm51bWJlclwiKWZvcihvPXQ7bzxuOysrbyl0aGlzW29dPWU7ZWxzZXtsZXQgcz1wLmlzQnVmZmVyKGUpP2U6cC5mcm9tKGUsaSksYT1zLmxlbmd0aDtpZihhPT09MCl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgXCInK2UrJ1wiIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50IFwidmFsdWVcIicpO2ZvcihvPTA7bzxuLXQ7KytvKXRoaXNbbyt0XT1zW28lYV19cmV0dXJuIHRoaXN9O3ZhciBWZT17fTtmdW5jdGlvbiBlbihyLGUsdCl7VmVbcl09Y2xhc3MgZXh0ZW5kcyB0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcIm1lc3NhZ2VcIix7dmFsdWU6ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSksdGhpcy5uYW1lPWAke3RoaXMubmFtZX0gWyR7cn1dYCx0aGlzLnN0YWNrLGRlbGV0ZSB0aGlzLm5hbWV9Z2V0IGNvZGUoKXtyZXR1cm4gcn1zZXQgY29kZShpKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxcImNvZGVcIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6aSx3cml0YWJsZTohMH0pfXRvU3RyaW5nKCl7cmV0dXJuYCR7dGhpcy5uYW1lfSBbJHtyfV06ICR7dGhpcy5tZXNzYWdlfWB9fX1lbihcIkVSUl9CVUZGRVJfT1VUX09GX0JPVU5EU1wiLGZ1bmN0aW9uKHIpe3JldHVybiByP2Ake3J9IGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kc2A6XCJBdHRlbXB0IHRvIGFjY2VzcyBtZW1vcnkgb3V0c2lkZSBidWZmZXIgYm91bmRzXCJ9LFJhbmdlRXJyb3IpO2VuKFwiRVJSX0lOVkFMSURfQVJHX1RZUEVcIixmdW5jdGlvbihyLGUpe3JldHVybmBUaGUgXCIke3J9XCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSAke3R5cGVvZiBlfWB9LFR5cGVFcnJvcik7ZW4oXCJFUlJfT1VUX09GX1JBTkdFXCIsZnVuY3Rpb24ocixlLHQpe2xldCBuPWBUaGUgdmFsdWUgb2YgXCIke3J9XCIgaXMgb3V0IG9mIHJhbmdlLmAsaT10O3JldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHQpJiZNYXRoLmFicyh0KT4yKiozMj9pPWhpKFN0cmluZyh0KSk6dHlwZW9mIHQ9PVwiYmlnaW50XCImJihpPVN0cmluZyh0KSwodD5CaWdJbnQoMikqKkJpZ0ludCgzMil8fHQ8LShCaWdJbnQoMikqKkJpZ0ludCgzMikpKSYmKGk9aGkoaSkpLGkrPVwiblwiKSxuKz1gIEl0IG11c3QgYmUgJHtlfS4gUmVjZWl2ZWQgJHtpfWAsbn0sUmFuZ2VFcnJvcik7ZnVuY3Rpb24gaGkocil7bGV0IGU9XCJcIix0PXIubGVuZ3RoLG49clswXT09PVwiLVwiPzE6MDtmb3IoO3Q+PW4rNDt0LT0zKWU9YF8ke3Iuc2xpY2UodC0zLHQpfSR7ZX1gO3JldHVybmAke3Iuc2xpY2UoMCx0KX0ke2V9YH1mdW5jdGlvbiBxYShyLGUsdCl7WWUoZSxcIm9mZnNldFwiKSwocltlXT09PXZvaWQgMHx8cltlK3RdPT09dm9pZCAwKSYmd3QoZSxyLmxlbmd0aC0odCsxKSl9ZnVuY3Rpb24gUmkocixlLHQsbixpLG8pe2lmKHI+dHx8cjxlKXtsZXQgcz10eXBlb2YgZT09XCJiaWdpbnRcIj9cIm5cIjpcIlwiLGE7dGhyb3cgbz4zP2U9PT0wfHxlPT09QmlnSW50KDApP2E9YD49IDAke3N9IGFuZCA8IDIke3N9ICoqICR7KG8rMSkqOH0ke3N9YDphPWA+PSAtKDIke3N9ICoqICR7KG8rMSkqOC0xfSR7c30pIGFuZCA8IDIgKiogJHsobysxKSo4LTF9JHtzfWA6YT1gPj0gJHtlfSR7c30gYW5kIDw9ICR7dH0ke3N9YCxuZXcgVmUuRVJSX09VVF9PRl9SQU5HRShcInZhbHVlXCIsYSxyKX1xYShuLGksbyl9ZnVuY3Rpb24gWWUocixlKXtpZih0eXBlb2YgciE9XCJudW1iZXJcIil0aHJvdyBuZXcgVmUuRVJSX0lOVkFMSURfQVJHX1RZUEUoZSxcIm51bWJlclwiLHIpfWZ1bmN0aW9uIHd0KHIsZSx0KXt0aHJvdyBNYXRoLmZsb29yKHIpIT09cj8oWWUocix0KSxuZXcgVmUuRVJSX09VVF9PRl9SQU5HRSh0fHxcIm9mZnNldFwiLFwiYW4gaW50ZWdlclwiLHIpKTplPDA/bmV3IFZlLkVSUl9CVUZGRVJfT1VUX09GX0JPVU5EUzpuZXcgVmUuRVJSX09VVF9PRl9SQU5HRSh0fHxcIm9mZnNldFwiLGA+PSAke3Q/MTowfSBhbmQgPD0gJHtlfWAscil9dmFyIGphPS9bXisvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gV2Eocil7aWYocj1yLnNwbGl0KFwiPVwiKVswXSxyPXIudHJpbSgpLnJlcGxhY2UoamEsXCJcIiksci5sZW5ndGg8MilyZXR1cm5cIlwiO2Zvcig7ci5sZW5ndGglNCE9PTA7KXI9citcIj1cIjtyZXR1cm4gcn1mdW5jdGlvbiBKcihyLGUpe2U9ZXx8MS8wO2xldCB0LG49ci5sZW5ndGgsaT1udWxsLG89W107Zm9yKGxldCBzPTA7czxuOysrcyl7aWYodD1yLmNoYXJDb2RlQXQocyksdD41NTI5NSYmdDw1NzM0NCl7aWYoIWkpe2lmKHQ+NTYzMTkpeyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1lbHNlIGlmKHMrMT09PW4peyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPXQ7Y29udGludWV9aWYodDw1NjMyMCl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9dDtjb250aW51ZX10PShpLTU1Mjk2PDwxMHx0LTU2MzIwKSs2NTUzNn1lbHNlIGkmJihlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwsdDwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO28ucHVzaCh0KX1lbHNlIGlmKHQ8MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7by5wdXNoKHQ+PjZ8MTkyLHQmNjN8MTI4KX1lbHNlIGlmKHQ8NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO28ucHVzaCh0Pj4xMnwyMjQsdD4+NiY2M3wxMjgsdCY2M3wxMjgpfWVsc2UgaWYodDwxMTE0MTEyKXtpZigoZS09NCk8MClicmVhaztvLnB1c2godD4+MTh8MjQwLHQ+PjEyJjYzfDEyOCx0Pj42JjYzfDEyOCx0JjYzfDEyOCl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvZGUgcG9pbnRcIil9cmV0dXJuIG99ZnVuY3Rpb24gJGEocil7bGV0IGU9W107Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDsrK3QpZS5wdXNoKHIuY2hhckNvZGVBdCh0KSYyNTUpO3JldHVybiBlfWZ1bmN0aW9uIEdhKHIsZSl7bGV0IHQsbixpLG89W107Zm9yKGxldCBzPTA7czxyLmxlbmd0aCYmISgoZS09Mik8MCk7KytzKXQ9ci5jaGFyQ29kZUF0KHMpLG49dD4+OCxpPXQlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99ZnVuY3Rpb24gVGkocil7cmV0dXJuIFlyLnRvQnl0ZUFycmF5KFdhKHIpKX1mdW5jdGlvbiBVdChyLGUsdCxuKXtsZXQgaTtmb3IoaT0wO2k8biYmIShpK3Q+PWUubGVuZ3RofHxpPj1yLmxlbmd0aCk7KytpKWVbaSt0XT1yW2ldO3JldHVybiBpfWZ1bmN0aW9uIGllKHIsZSl7cmV0dXJuIHIgaW5zdGFuY2VvZiBlfHxyIT1udWxsJiZyLmNvbnN0cnVjdG9yIT1udWxsJiZyLmNvbnN0cnVjdG9yLm5hbWUhPW51bGwmJnIuY29uc3RydWN0b3IubmFtZT09PWUubmFtZX1mdW5jdGlvbiB0bihyKXtyZXR1cm4gciE9PXJ9dmFyIFZhPWZ1bmN0aW9uKCl7bGV0IHI9XCIwMTIzNDU2Nzg5YWJjZGVmXCIsZT1uZXcgQXJyYXkoMjU2KTtmb3IobGV0IHQ9MDt0PDE2OysrdCl7bGV0IG49dCoxNjtmb3IobGV0IGk9MDtpPDE2OysraSllW24raV09clt0XStyW2ldfXJldHVybiBlfSgpO2Z1bmN0aW9uIGJlKHIpe3JldHVybiB0eXBlb2YgQmlnSW50PlwidVwiP3phOnJ9ZnVuY3Rpb24gemEoKXt0aHJvdyBuZXcgRXJyb3IoXCJCaWdJbnQgbm90IHN1cHBvcnRlZFwiKX19KTt2YXIgSWk9UygoY2wsTGkpPT57YygpO3ZhciBQPUxpLmV4cG9ydHM9e30sb2Usc2U7ZnVuY3Rpb24gcm4oKXt0aHJvdyBuZXcgRXJyb3IoXCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpfWZ1bmN0aW9uIG5uKCl7dGhyb3cgbmV3IEVycm9yKFwiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkXCIpfShmdW5jdGlvbigpe3RyeXt0eXBlb2Ygc2V0VGltZW91dD09XCJmdW5jdGlvblwiP29lPXNldFRpbWVvdXQ6b2U9cm59Y2F0Y2h7b2U9cm59dHJ5e3R5cGVvZiBjbGVhclRpbWVvdXQ9PVwiZnVuY3Rpb25cIj9zZT1jbGVhclRpbWVvdXQ6c2U9bm59Y2F0Y2h7c2U9bm59fSkoKTtmdW5jdGlvbiBDaShyKXtpZihvZT09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQociwwKTtpZigob2U9PT1ybnx8IW9lKSYmc2V0VGltZW91dClyZXR1cm4gb2U9c2V0VGltZW91dCxzZXRUaW1lb3V0KHIsMCk7dHJ5e3JldHVybiBvZShyLDApfWNhdGNoe3RyeXtyZXR1cm4gb2UuY2FsbChudWxsLHIsMCl9Y2F0Y2h7cmV0dXJuIG9lLmNhbGwodGhpcyxyLDApfX19ZnVuY3Rpb24gWWEocil7aWYoc2U9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChyKTtpZigoc2U9PT1ubnx8IXNlKSYmY2xlYXJUaW1lb3V0KXJldHVybiBzZT1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KHIpO3RyeXtyZXR1cm4gc2Uocil9Y2F0Y2h7dHJ5e3JldHVybiBzZS5jYWxsKG51bGwscil9Y2F0Y2h7cmV0dXJuIHNlLmNhbGwodGhpcyxyKX19fXZhciBwZT1bXSxKZT0hMSxrZSxEdD0tMTtmdW5jdGlvbiBLYSgpeyFKZXx8IWtlfHwoSmU9ITEsa2UubGVuZ3RoP3BlPWtlLmNvbmNhdChwZSk6RHQ9LTEscGUubGVuZ3RoJiZCaSgpKX1mdW5jdGlvbiBCaSgpe2lmKCFKZSl7dmFyIHI9Q2koS2EpO0plPSEwO2Zvcih2YXIgZT1wZS5sZW5ndGg7ZTspe2ZvcihrZT1wZSxwZT1bXTsrK0R0PGU7KWtlJiZrZVtEdF0ucnVuKCk7RHQ9LTEsZT1wZS5sZW5ndGh9a2U9bnVsbCxKZT0hMSxZYShyKX19UC5uZXh0VGljaz1mdW5jdGlvbihyKXt2YXIgZT1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyllW3QtMV09YXJndW1lbnRzW3RdO3BlLnB1c2gobmV3IE1pKHIsZSkpLHBlLmxlbmd0aD09PTEmJiFKZSYmQ2koQmkpfTtmdW5jdGlvbiBNaShyLGUpe3RoaXMuZnVuPXIsdGhpcy5hcnJheT1lfU1pLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtQLnRpdGxlPVwiYnJvd3NlclwiO1AuYnJvd3Nlcj0hMDtQLmVudj17fTtQLmFyZ3Y9W107UC52ZXJzaW9uPVwiXCI7UC52ZXJzaW9ucz17fTtmdW5jdGlvbiBoZSgpe31QLm9uPWhlO1AuYWRkTGlzdGVuZXI9aGU7UC5vbmNlPWhlO1Aub2ZmPWhlO1AucmVtb3ZlTGlzdGVuZXI9aGU7UC5yZW1vdmVBbGxMaXN0ZW5lcnM9aGU7UC5lbWl0PWhlO1AucHJlcGVuZExpc3RlbmVyPWhlO1AucHJlcGVuZE9uY2VMaXN0ZW5lcj1oZTtQLmxpc3RlbmVycz1mdW5jdGlvbihyKXtyZXR1cm5bXX07UC5iaW5kaW5nPWZ1bmN0aW9uKHIpe3Rocm93IG5ldyBFcnJvcihcInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkXCIpfTtQLmN3ZD1mdW5jdGlvbigpe3JldHVyblwiL1wifTtQLmNoZGlyPWZ1bmN0aW9uKHIpe3Rocm93IG5ldyBFcnJvcihcInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZFwiKX07UC51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0pO3ZhciBBaSxYYSxjPWhhKCgpPT57QWk9QyhYZSgpKSxYYT1DKElpKCkpO3dpbmRvdy5CdWZmZXI9QWkuQnVmZmVyO3dpbmRvdy5wcm9jZXNzPVhhfSk7dmFyIGppPVMoKGxsLG9uKT0+e1widXNlIHN0cmljdFwiO2MoKTt2YXIgUWU9dHlwZW9mIFJlZmxlY3Q9PVwib2JqZWN0XCI/UmVmbGVjdDpudWxsLEZpPVFlJiZ0eXBlb2YgUWUuYXBwbHk9PVwiZnVuY3Rpb25cIj9RZS5hcHBseTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGUsdCxuKX0sTnQ7UWUmJnR5cGVvZiBRZS5vd25LZXlzPT1cImZ1bmN0aW9uXCI/TnQ9UWUub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP050PWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKSl9Ok50PWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKX07ZnVuY3Rpb24gSmEocil7Y29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4ocil9dmFyIGtpPU51bWJlci5pc05hTnx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT1lfTtmdW5jdGlvbiBCKCl7Qi5pbml0LmNhbGwodGhpcyl9b24uZXhwb3J0cz1CO29uLmV4cG9ydHMub25jZT10dTtCLkV2ZW50RW1pdHRlcj1CO0IucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwO0IucHJvdG90eXBlLl9ldmVudHNDb3VudD0wO0IucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBQaT0xMDtmdW5jdGlvbiBIdChyKXtpZih0eXBlb2YgciE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImxpc3RlbmVyXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShCLFwiZGVmYXVsdE1heExpc3RlbmVyc1wiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBQaX0sc2V0OmZ1bmN0aW9uKHIpe2lmKHR5cGVvZiByIT1cIm51bWJlclwifHxyPDB8fGtpKHIpKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJkZWZhdWx0TWF4TGlzdGVuZXJzXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytyK1wiLlwiKTtQaT1yfX0pO0IuaW5pdD1mdW5jdGlvbigpeyh0aGlzLl9ldmVudHM9PT12b2lkIDB8fHRoaXMuX2V2ZW50cz09PU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKS5fZXZlbnRzKSYmKHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH07Qi5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKGUpe2lmKHR5cGVvZiBlIT1cIm51bWJlclwifHxlPDB8fGtpKGUpKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgXCJuXCIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytlK1wiLlwiKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPWUsdGhpc307ZnVuY3Rpb24gT2kocil7cmV0dXJuIHIuX21heExpc3RlbmVycz09PXZvaWQgMD9CLmRlZmF1bHRNYXhMaXN0ZW5lcnM6ci5fbWF4TGlzdGVuZXJzfUIucHJvdG90eXBlLmdldE1heExpc3RlbmVycz1mdW5jdGlvbigpe3JldHVybiBPaSh0aGlzKX07Qi5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdC5wdXNoKGFyZ3VtZW50c1tuXSk7dmFyIGk9ZT09PVwiZXJyb3JcIixvPXRoaXMuX2V2ZW50cztpZihvIT09dm9pZCAwKWk9aSYmby5lcnJvcj09PXZvaWQgMDtlbHNlIGlmKCFpKXJldHVybiExO2lmKGkpe3ZhciBzO2lmKHQubGVuZ3RoPjAmJihzPXRbMF0pLHMgaW5zdGFuY2VvZiBFcnJvcil0aHJvdyBzO3ZhciBhPW5ldyBFcnJvcihcIlVuaGFuZGxlZCBlcnJvci5cIisocz9cIiAoXCIrcy5tZXNzYWdlK1wiKVwiOlwiXCIpKTt0aHJvdyBhLmNvbnRleHQ9cyxhfXZhciB1PW9bZV07aWYodT09PXZvaWQgMClyZXR1cm4hMTtpZih0eXBlb2YgdT09XCJmdW5jdGlvblwiKUZpKHUsdGhpcyx0KTtlbHNlIGZvcih2YXIgZj11Lmxlbmd0aCxsPXFpKHUsZiksbj0wO248ZjsrK24pRmkobFtuXSx0aGlzLHQpO3JldHVybiEwfTtmdW5jdGlvbiBVaShyLGUsdCxuKXt2YXIgaSxvLHM7aWYoSHQodCksbz1yLl9ldmVudHMsbz09PXZvaWQgMD8obz1yLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxyLl9ldmVudHNDb3VudD0wKTooby5uZXdMaXN0ZW5lciE9PXZvaWQgMCYmKHIuZW1pdChcIm5ld0xpc3RlbmVyXCIsZSx0Lmxpc3RlbmVyP3QubGlzdGVuZXI6dCksbz1yLl9ldmVudHMpLHM9b1tlXSkscz09PXZvaWQgMClzPW9bZV09dCwrK3IuX2V2ZW50c0NvdW50O2Vsc2UgaWYodHlwZW9mIHM9PVwiZnVuY3Rpb25cIj9zPW9bZV09bj9bdCxzXTpbcyx0XTpuP3MudW5zaGlmdCh0KTpzLnB1c2godCksaT1PaShyKSxpPjAmJnMubGVuZ3RoPmkmJiFzLndhcm5lZCl7cy53YXJuZWQ9ITA7dmFyIGE9bmV3IEVycm9yKFwiUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiBcIitzLmxlbmd0aCtcIiBcIitTdHJpbmcoZSkrXCIgbGlzdGVuZXJzIGFkZGVkLiBVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdFwiKTthLm5hbWU9XCJNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmdcIixhLmVtaXR0ZXI9cixhLnR5cGU9ZSxhLmNvdW50PXMubGVuZ3RoLEphKGEpfXJldHVybiByfUIucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFVpKHRoaXMsZSx0LCExKX07Qi5wcm90b3R5cGUub249Qi5wcm90b3R5cGUuYWRkTGlzdGVuZXI7Qi5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFVpKHRoaXMsZSx0LCEwKX07ZnVuY3Rpb24gUWEoKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLGFyZ3VtZW50cy5sZW5ndGg9PT0wP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIERpKHIsZSx0KXt2YXIgbj17ZmlyZWQ6ITEsd3JhcEZuOnZvaWQgMCx0YXJnZXQ6cix0eXBlOmUsbGlzdGVuZXI6dH0saT1RYS5iaW5kKG4pO3JldHVybiBpLmxpc3RlbmVyPXQsbi53cmFwRm49aSxpfUIucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSHQodCksdGhpcy5vbihlLERpKHRoaXMsZSx0KSksdGhpc307Qi5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiBIdCh0KSx0aGlzLnByZXBlbmRMaXN0ZW5lcihlLERpKHRoaXMsZSx0KSksdGhpc307Qi5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbixpLG8scyxhO2lmKEh0KHQpLGk9dGhpcy5fZXZlbnRzLGk9PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj1pW2VdLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobj09PXR8fG4ubGlzdGVuZXI9PT10KS0tdGhpcy5fZXZlbnRzQ291bnQ9PT0wP3RoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpOihkZWxldGUgaVtlXSxpLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoXCJyZW1vdmVMaXN0ZW5lclwiLGUsbi5saXN0ZW5lcnx8dCkpO2Vsc2UgaWYodHlwZW9mIG4hPVwiZnVuY3Rpb25cIil7Zm9yKG89LTEscz1uLmxlbmd0aC0xO3M+PTA7cy0tKWlmKG5bc109PT10fHxuW3NdLmxpc3RlbmVyPT09dCl7YT1uW3NdLmxpc3RlbmVyLG89czticmVha31pZihvPDApcmV0dXJuIHRoaXM7bz09PTA/bi5zaGlmdCgpOlphKG4sbyksbi5sZW5ndGg9PT0xJiYoaVtlXT1uWzBdKSxpLnJlbW92ZUxpc3RlbmVyIT09dm9pZCAwJiZ0aGlzLmVtaXQoXCJyZW1vdmVMaXN0ZW5lclwiLGUsYXx8dCl9cmV0dXJuIHRoaXN9O0IucHJvdG90eXBlLm9mZj1CLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtCLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7dmFyIHQsbixpO2lmKG49dGhpcy5fZXZlbnRzLG49PT12b2lkIDApcmV0dXJuIHRoaXM7aWYobi5yZW1vdmVMaXN0ZW5lcj09PXZvaWQgMClyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTA/KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApOm5bZV0hPT12b2lkIDAmJigtLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgbltlXSksdGhpcztpZihhcmd1bWVudHMubGVuZ3RoPT09MCl7dmFyIG89T2JqZWN0LmtleXMobikscztmb3IoaT0wO2k8by5sZW5ndGg7KytpKXM9b1tpXSxzIT09XCJyZW1vdmVMaXN0ZW5lclwiJiZ0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhzKTtyZXR1cm4gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoXCJyZW1vdmVMaXN0ZW5lclwiKSx0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYodD1uW2VdLHR5cGVvZiB0PT1cImZ1bmN0aW9uXCIpdGhpcy5yZW1vdmVMaXN0ZW5lcihlLHQpO2Vsc2UgaWYodCE9PXZvaWQgMClmb3IoaT10Lmxlbmd0aC0xO2k+PTA7aS0tKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSx0W2ldKTtyZXR1cm4gdGhpc307ZnVuY3Rpb24gTmkocixlLHQpe3ZhciBuPXIuX2V2ZW50cztpZihuPT09dm9pZCAwKXJldHVybltdO3ZhciBpPW5bZV07cmV0dXJuIGk9PT12b2lkIDA/W106dHlwZW9mIGk9PVwiZnVuY3Rpb25cIj90P1tpLmxpc3RlbmVyfHxpXTpbaV06dD9ldShpKTpxaShpLGkubGVuZ3RoKX1CLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIE5pKHRoaXMsZSwhMCl9O0IucHJvdG90eXBlLnJhd0xpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm4gTmkodGhpcyxlLCExKX07Qi5saXN0ZW5lckNvdW50PWZ1bmN0aW9uKHIsZSl7cmV0dXJuIHR5cGVvZiByLmxpc3RlbmVyQ291bnQ9PVwiZnVuY3Rpb25cIj9yLmxpc3RlbmVyQ291bnQoZSk6SGkuY2FsbChyLGUpfTtCLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PUhpO2Z1bmN0aW9uIEhpKHIpe3ZhciBlPXRoaXMuX2V2ZW50cztpZihlIT09dm9pZCAwKXt2YXIgdD1lW3JdO2lmKHR5cGVvZiB0PT1cImZ1bmN0aW9uXCIpcmV0dXJuIDE7aWYodCE9PXZvaWQgMClyZXR1cm4gdC5sZW5ndGh9cmV0dXJuIDB9Qi5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP050KHRoaXMuX2V2ZW50cyk6W119O2Z1bmN0aW9uIHFpKHIsZSl7Zm9yKHZhciB0PW5ldyBBcnJheShlKSxuPTA7bjxlOysrbil0W25dPXJbbl07cmV0dXJuIHR9ZnVuY3Rpb24gWmEocixlKXtmb3IoO2UrMTxyLmxlbmd0aDtlKyspcltlXT1yW2UrMV07ci5wb3AoKX1mdW5jdGlvbiBldShyKXtmb3IodmFyIGU9bmV3IEFycmF5KHIubGVuZ3RoKSx0PTA7dDxlLmxlbmd0aDsrK3QpZVt0XT1yW3RdLmxpc3RlbmVyfHxyW3RdO3JldHVybiBlfWZ1bmN0aW9uIHR1KHIsZSl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gaSgpe28hPT12b2lkIDAmJnIucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLG8pLHQoW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKX12YXIgbztlIT09XCJlcnJvclwiJiYobz1mdW5jdGlvbihhKXtyLnJlbW92ZUxpc3RlbmVyKGUsaSksbihhKX0sci5vbmNlKFwiZXJyb3JcIixvKSksci5vbmNlKGUsaSl9KX19KTt2YXIgT2U9UygoZGwsc24pPT57YygpO3R5cGVvZiBPYmplY3QuY3JlYXRlPT1cImZ1bmN0aW9uXCI/c24uZXhwb3J0cz1mdW5jdGlvbihlLHQpe3QmJihlLnN1cGVyXz10LGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pKX06c24uZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKHQpe2Uuc3VwZXJfPXQ7dmFyIG49ZnVuY3Rpb24oKXt9O24ucHJvdG90eXBlPXQucHJvdG90eXBlLGUucHJvdG90eXBlPW5ldyBuLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWV9fX0pO3ZhciB1bj1TKChwbCxhbik9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFplPXR5cGVvZiBSZWZsZWN0PT1cIm9iamVjdFwiP1JlZmxlY3Q6bnVsbCxXaT1aZSYmdHlwZW9mIFplLmFwcGx5PT1cImZ1bmN0aW9uXCI/WmUuYXBwbHk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChlLHQsbil9LHF0O1plJiZ0eXBlb2YgWmUub3duS2V5cz09XCJmdW5jdGlvblwiP3F0PVplLm93bktleXM6T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9xdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSkpfTpxdD1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSl9O2Z1bmN0aW9uIHJ1KHIpe2NvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKHIpfXZhciBHaT1OdW1iZXIuaXNOYU58fGZ1bmN0aW9uKGUpe3JldHVybiBlIT09ZX07ZnVuY3Rpb24gTSgpe00uaW5pdC5jYWxsKHRoaXMpfWFuLmV4cG9ydHM9TTthbi5leHBvcnRzLm9uY2U9c3U7TS5FdmVudEVtaXR0ZXI9TTtNLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMDtNLnByb3RvdHlwZS5fZXZlbnRzQ291bnQ9MDtNLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMDt2YXIgJGk9MTA7ZnVuY3Rpb24ganQocil7aWYodHlwZW9mIHIhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJsaXN0ZW5lclwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnK3R5cGVvZiByKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoTSxcImRlZmF1bHRNYXhMaXN0ZW5lcnNcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gJGl9LHNldDpmdW5jdGlvbihyKXtpZih0eXBlb2YgciE9XCJudW1iZXJcInx8cjwwfHxHaShyKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiZGVmYXVsdE1heExpc3RlbmVyc1wiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcrcitcIi5cIik7JGk9cn19KTtNLmluaXQ9ZnVuY3Rpb24oKXsodGhpcy5fZXZlbnRzPT09dm9pZCAwfHx0aGlzLl9ldmVudHM9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50cykmJih0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9O00ucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbihlKXtpZih0eXBlb2YgZSE9XCJudW1iZXJcInx8ZTwwfHxHaShlKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mIFwiblwiIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcrZStcIi5cIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz1lLHRoaXN9O2Z1bmN0aW9uIFZpKHIpe3JldHVybiByLl9tYXhMaXN0ZW5lcnM9PT12b2lkIDA/TS5kZWZhdWx0TWF4TGlzdGVuZXJzOnIuX21heExpc3RlbmVyc31NLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gVmkodGhpcyl9O00ucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQucHVzaChhcmd1bWVudHNbbl0pO3ZhciBpPWU9PT1cImVycm9yXCIsbz10aGlzLl9ldmVudHM7aWYobyE9PXZvaWQgMClpPWkmJm8uZXJyb3I9PT12b2lkIDA7ZWxzZSBpZighaSlyZXR1cm4hMTtpZihpKXt2YXIgcztpZih0Lmxlbmd0aD4wJiYocz10WzBdKSxzIGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgczt2YXIgYT1uZXcgRXJyb3IoXCJVbmhhbmRsZWQgZXJyb3IuXCIrKHM/XCIgKFwiK3MubWVzc2FnZStcIilcIjpcIlwiKSk7dGhyb3cgYS5jb250ZXh0PXMsYX12YXIgdT1vW2VdO2lmKHU9PT12b2lkIDApcmV0dXJuITE7aWYodHlwZW9mIHU9PVwiZnVuY3Rpb25cIilXaSh1LHRoaXMsdCk7ZWxzZSBmb3IodmFyIGY9dS5sZW5ndGgsbD1KaSh1LGYpLG49MDtuPGY7KytuKVdpKGxbbl0sdGhpcyx0KTtyZXR1cm4hMH07ZnVuY3Rpb24gemkocixlLHQsbil7dmFyIGksbyxzO2lmKGp0KHQpLG89ci5fZXZlbnRzLG89PT12b2lkIDA/KG89ci5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksci5fZXZlbnRzQ291bnQ9MCk6KG8ubmV3TGlzdGVuZXIhPT12b2lkIDAmJihyLmVtaXQoXCJuZXdMaXN0ZW5lclwiLGUsdC5saXN0ZW5lcj90Lmxpc3RlbmVyOnQpLG89ci5fZXZlbnRzKSxzPW9bZV0pLHM9PT12b2lkIDApcz1vW2VdPXQsKytyLl9ldmVudHNDb3VudDtlbHNlIGlmKHR5cGVvZiBzPT1cImZ1bmN0aW9uXCI/cz1vW2VdPW4/W3Qsc106W3MsdF06bj9zLnVuc2hpZnQodCk6cy5wdXNoKHQpLGk9VmkociksaT4wJiZzLmxlbmd0aD5pJiYhcy53YXJuZWQpe3Mud2FybmVkPSEwO3ZhciBhPW5ldyBFcnJvcihcIlBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgbGVhayBkZXRlY3RlZC4gXCIrcy5sZW5ndGgrXCIgXCIrU3RyaW5nKGUpK1wiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXRcIik7YS5uYW1lPVwiTWF4TGlzdGVuZXJzRXhjZWVkZWRXYXJuaW5nXCIsYS5lbWl0dGVyPXIsYS50eXBlPWUsYS5jb3VudD1zLmxlbmd0aCxydShhKX1yZXR1cm4gcn1NLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiB6aSh0aGlzLGUsdCwhMSl9O00ucHJvdG90eXBlLm9uPU0ucHJvdG90eXBlLmFkZExpc3RlbmVyO00ucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiB6aSh0aGlzLGUsdCwhMCl9O2Z1bmN0aW9uIG51KCl7aWYoIXRoaXMuZmlyZWQpcmV0dXJuIHRoaXMudGFyZ2V0LnJlbW92ZUxpc3RlbmVyKHRoaXMudHlwZSx0aGlzLndyYXBGbiksdGhpcy5maXJlZD0hMCxhcmd1bWVudHMubGVuZ3RoPT09MD90aGlzLmxpc3RlbmVyLmNhbGwodGhpcy50YXJnZXQpOnRoaXMubGlzdGVuZXIuYXBwbHkodGhpcy50YXJnZXQsYXJndW1lbnRzKX1mdW5jdGlvbiBZaShyLGUsdCl7dmFyIG49e2ZpcmVkOiExLHdyYXBGbjp2b2lkIDAsdGFyZ2V0OnIsdHlwZTplLGxpc3RlbmVyOnR9LGk9bnUuYmluZChuKTtyZXR1cm4gaS5saXN0ZW5lcj10LG4ud3JhcEZuPWksaX1NLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGp0KHQpLHRoaXMub24oZSxZaSh0aGlzLGUsdCkpLHRoaXN9O00ucHJvdG90eXBlLnByZXBlbmRPbmNlTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4ganQodCksdGhpcy5wcmVwZW5kTGlzdGVuZXIoZSxZaSh0aGlzLGUsdCkpLHRoaXN9O00ucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dmFyIG4saSxvLHMsYTtpZihqdCh0KSxpPXRoaXMuX2V2ZW50cyxpPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG49aVtlXSxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG49PT10fHxuLmxpc3RlbmVyPT09dCktLXRoaXMuX2V2ZW50c0NvdW50PT09MD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTooZGVsZXRlIGlbZV0saS5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KFwicmVtb3ZlTGlzdGVuZXJcIixlLG4ubGlzdGVuZXJ8fHQpKTtlbHNlIGlmKHR5cGVvZiBuIT1cImZ1bmN0aW9uXCIpe2ZvcihvPS0xLHM9bi5sZW5ndGgtMTtzPj0wO3MtLSlpZihuW3NdPT09dHx8bltzXS5saXN0ZW5lcj09PXQpe2E9bltzXS5saXN0ZW5lcixvPXM7YnJlYWt9aWYobzwwKXJldHVybiB0aGlzO289PT0wP24uc2hpZnQoKTppdShuLG8pLG4ubGVuZ3RoPT09MSYmKGlbZV09blswXSksaS5yZW1vdmVMaXN0ZW5lciE9PXZvaWQgMCYmdGhpcy5lbWl0KFwicmVtb3ZlTGlzdGVuZXJcIixlLGF8fHQpfXJldHVybiB0aGlzfTtNLnByb3RvdHlwZS5vZmY9TS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI7TS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3ZhciB0LG4saTtpZihuPXRoaXMuX2V2ZW50cyxuPT09dm9pZCAwKXJldHVybiB0aGlzO2lmKG4ucmVtb3ZlTGlzdGVuZXI9PT12b2lkIDApcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0wPyh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKTpuW2VdIT09dm9pZCAwJiYoLS10aGlzLl9ldmVudHNDb3VudD09PTA/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6ZGVsZXRlIG5bZV0pLHRoaXM7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApe3ZhciBvPU9iamVjdC5rZXlzKG4pLHM7Zm9yKGk9MDtpPG8ubGVuZ3RoOysraSlzPW9baV0scyE9PVwicmVtb3ZlTGlzdGVuZXJcIiYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMocyk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKFwicmVtb3ZlTGlzdGVuZXJcIiksdGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fZXZlbnRzQ291bnQ9MCx0aGlzfWlmKHQ9bltlXSx0eXBlb2YgdD09XCJmdW5jdGlvblwiKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSx0KTtlbHNlIGlmKHQhPT12b2lkIDApZm9yKGk9dC5sZW5ndGgtMTtpPj0wO2ktLSl0aGlzLnJlbW92ZUxpc3RlbmVyKGUsdFtpXSk7cmV0dXJuIHRoaXN9O2Z1bmN0aW9uIEtpKHIsZSx0KXt2YXIgbj1yLl9ldmVudHM7aWYobj09PXZvaWQgMClyZXR1cm5bXTt2YXIgaT1uW2VdO3JldHVybiBpPT09dm9pZCAwP1tdOnR5cGVvZiBpPT1cImZ1bmN0aW9uXCI/dD9baS5saXN0ZW5lcnx8aV06W2ldOnQ/b3UoaSk6SmkoaSxpLmxlbmd0aCl9TS5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybiBLaSh0aGlzLGUsITApfTtNLnByb3RvdHlwZS5yYXdMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIEtpKHRoaXMsZSwhMSl9O00ubGlzdGVuZXJDb3VudD1mdW5jdGlvbihyLGUpe3JldHVybiB0eXBlb2Ygci5saXN0ZW5lckNvdW50PT1cImZ1bmN0aW9uXCI/ci5saXN0ZW5lckNvdW50KGUpOlhpLmNhbGwocixlKX07TS5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1YaTtmdW5jdGlvbiBYaShyKXt2YXIgZT10aGlzLl9ldmVudHM7aWYoZSE9PXZvaWQgMCl7dmFyIHQ9ZVtyXTtpZih0eXBlb2YgdD09XCJmdW5jdGlvblwiKXJldHVybiAxO2lmKHQhPT12b2lkIDApcmV0dXJuIHQubGVuZ3RofXJldHVybiAwfU0ucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9xdCh0aGlzLl9ldmVudHMpOltdfTtmdW5jdGlvbiBKaShyLGUpe2Zvcih2YXIgdD1uZXcgQXJyYXkoZSksbj0wO248ZTsrK24pdFtuXT1yW25dO3JldHVybiB0fWZ1bmN0aW9uIGl1KHIsZSl7Zm9yKDtlKzE8ci5sZW5ndGg7ZSsrKXJbZV09cltlKzFdO3IucG9wKCl9ZnVuY3Rpb24gb3Uocil7Zm9yKHZhciBlPW5ldyBBcnJheShyLmxlbmd0aCksdD0wO3Q8ZS5sZW5ndGg7Kyt0KWVbdF09clt0XS5saXN0ZW5lcnx8clt0XTtyZXR1cm4gZX1mdW5jdGlvbiBzdShyLGUpe3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGkoKXtvIT09dm9pZCAwJiZyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIixvKSx0KFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzKSl9dmFyIG87ZSE9PVwiZXJyb3JcIiYmKG89ZnVuY3Rpb24oYSl7ci5yZW1vdmVMaXN0ZW5lcihlLGkpLG4oYSl9LHIub25jZShcImVycm9yXCIsbykpLHIub25jZShlLGkpfSl9fSk7dmFyIGZuPVMoKGhsLFFpKT0+e2MoKTtRaS5leHBvcnRzPXVuKCkuRXZlbnRFbWl0dGVyfSk7dmFyIGNuPVMoKCk9PntjKCl9KTt2YXIgcm89UygoeWwsdG8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO2Z1bmN0aW9uIFppKHIsZSl7dmFyIHQ9T2JqZWN0LmtleXMocik7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhyKTtlJiYobj1uLmZpbHRlcihmdW5jdGlvbihpKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLGkpLmVudW1lcmFibGV9KSksdC5wdXNoLmFwcGx5KHQsbil9cmV0dXJuIHR9ZnVuY3Rpb24gYXUocil7Zm9yKHZhciBlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl7dmFyIHQ9YXJndW1lbnRzW2VdIT1udWxsP2FyZ3VtZW50c1tlXTp7fTtlJTI/WmkoT2JqZWN0KHQpLCEwKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3V1KHIsbix0W25dKX0pOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHIsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModCkpOlppKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbihuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkocixuLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKSl9KX1yZXR1cm4gcn1mdW5jdGlvbiB1dShyLGUsdCl7cmV0dXJuIGUgaW4gcj9PYmplY3QuZGVmaW5lUHJvcGVydHkocixlLHt2YWx1ZTp0LGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6cltlXT10LHJ9ZnVuY3Rpb24gZnUocixlKXtpZighKHIgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfWZ1bmN0aW9uIGVvKHIsZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF07bi5lbnVtZXJhYmxlPW4uZW51bWVyYWJsZXx8ITEsbi5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbiYmKG4ud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLG4ua2V5LG4pfX1mdW5jdGlvbiBjdShyLGUsdCl7cmV0dXJuIGUmJmVvKHIucHJvdG90eXBlLGUpLHQmJmVvKHIsdCkscn12YXIgbHU9WGUoKSxXdD1sdS5CdWZmZXIsZHU9Y24oKSxsbj1kdS5pbnNwZWN0LHB1PWxuJiZsbi5jdXN0b218fFwiaW5zcGVjdFwiO2Z1bmN0aW9uIGh1KHIsZSx0KXtXdC5wcm90b3R5cGUuY29weS5jYWxsKHIsZSx0KX10by5leHBvcnRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcigpe2Z1KHRoaXMsciksdGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH1yZXR1cm4gY3Uocixbe2tleTpcInB1c2hcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgbj17ZGF0YTp0LG5leHQ6bnVsbH07dGhpcy5sZW5ndGg+MD90aGlzLnRhaWwubmV4dD1uOnRoaXMuaGVhZD1uLHRoaXMudGFpbD1uLCsrdGhpcy5sZW5ndGh9fSx7a2V5OlwidW5zaGlmdFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBuPXtkYXRhOnQsbmV4dDp0aGlzLmhlYWR9O3RoaXMubGVuZ3RoPT09MCYmKHRoaXMudGFpbD1uKSx0aGlzLmhlYWQ9biwrK3RoaXMubGVuZ3RofX0se2tleTpcInNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmxlbmd0aCE9PTApe3ZhciB0PXRoaXMuaGVhZC5kYXRhO3JldHVybiB0aGlzLmxlbmd0aD09PTE/dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsOnRoaXMuaGVhZD10aGlzLmhlYWQubmV4dCwtLXRoaXMubGVuZ3RoLHR9fX0se2tleTpcImNsZWFyXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH19LHtrZXk6XCJqb2luXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodGhpcy5sZW5ndGg9PT0wKXJldHVyblwiXCI7Zm9yKHZhciBuPXRoaXMuaGVhZCxpPVwiXCIrbi5kYXRhO249bi5uZXh0OylpKz10K24uZGF0YTtyZXR1cm4gaX19LHtrZXk6XCJjb25jYXRcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0aGlzLmxlbmd0aD09PTApcmV0dXJuIFd0LmFsbG9jKDApO2Zvcih2YXIgbj1XdC5hbGxvY1Vuc2FmZSh0Pj4+MCksaT10aGlzLmhlYWQsbz0wO2k7KWh1KGkuZGF0YSxuLG8pLG8rPWkuZGF0YS5sZW5ndGgsaT1pLm5leHQ7cmV0dXJuIG59fSx7a2V5OlwiY29uc3VtZVwiLHZhbHVlOmZ1bmN0aW9uKHQsbil7dmFyIGk7cmV0dXJuIHQ8dGhpcy5oZWFkLmRhdGEubGVuZ3RoPyhpPXRoaXMuaGVhZC5kYXRhLnNsaWNlKDAsdCksdGhpcy5oZWFkLmRhdGE9dGhpcy5oZWFkLmRhdGEuc2xpY2UodCkpOnQ9PT10aGlzLmhlYWQuZGF0YS5sZW5ndGg/aT10aGlzLnNoaWZ0KCk6aT1uP3RoaXMuX2dldFN0cmluZyh0KTp0aGlzLl9nZXRCdWZmZXIodCksaX19LHtrZXk6XCJmaXJzdFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVhZC5kYXRhfX0se2tleTpcIl9nZXRTdHJpbmdcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLmhlYWQsaT0xLG89bi5kYXRhO2Zvcih0LT1vLmxlbmd0aDtuPW4ubmV4dDspe3ZhciBzPW4uZGF0YSxhPXQ+cy5sZW5ndGg/cy5sZW5ndGg6dDtpZihhPT09cy5sZW5ndGg/bys9czpvKz1zLnNsaWNlKDAsdCksdC09YSx0PT09MCl7YT09PXMubGVuZ3RoPygrK2ksbi5uZXh0P3RoaXMuaGVhZD1uLm5leHQ6dGhpcy5oZWFkPXRoaXMudGFpbD1udWxsKToodGhpcy5oZWFkPW4sbi5kYXRhPXMuc2xpY2UoYSkpO2JyZWFrfSsraX1yZXR1cm4gdGhpcy5sZW5ndGgtPWksb319LHtrZXk6XCJfZ2V0QnVmZmVyXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIG49V3QuYWxsb2NVbnNhZmUodCksaT10aGlzLmhlYWQsbz0xO2ZvcihpLmRhdGEuY29weShuKSx0LT1pLmRhdGEubGVuZ3RoO2k9aS5uZXh0Oyl7dmFyIHM9aS5kYXRhLGE9dD5zLmxlbmd0aD9zLmxlbmd0aDp0O2lmKHMuY29weShuLG4ubGVuZ3RoLXQsMCxhKSx0LT1hLHQ9PT0wKXthPT09cy5sZW5ndGg/KCsrbyxpLm5leHQ/dGhpcy5oZWFkPWkubmV4dDp0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwpOih0aGlzLmhlYWQ9aSxpLmRhdGE9cy5zbGljZShhKSk7YnJlYWt9KytvfXJldHVybiB0aGlzLmxlbmd0aC09byxufX0se2tleTpwdSx2YWx1ZTpmdW5jdGlvbih0LG4pe3JldHVybiBsbih0aGlzLGF1KHt9LG4se2RlcHRoOjAsY3VzdG9tSW5zcGVjdDohMX0pKX19XSkscn0oKX0pO3ZhciBwbj1TKChibCxpbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7ZnVuY3Rpb24gbXUocixlKXt2YXIgdD10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQsaT10aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtyZXR1cm4gbnx8aT8oZT9lKHIpOnImJih0aGlzLl93cml0YWJsZVN0YXRlP3RoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkfHwodGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAscHJvY2Vzcy5uZXh0VGljayhkbix0aGlzLHIpKTpwcm9jZXNzLm5leHRUaWNrKGRuLHRoaXMscikpLHRoaXMpOih0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMCksdGhpcy5fZGVzdHJveShyfHxudWxsLGZ1bmN0aW9uKG8peyFlJiZvP3QuX3dyaXRhYmxlU3RhdGU/dC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ/cHJvY2Vzcy5uZXh0VGljaygkdCx0KToodC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAscHJvY2Vzcy5uZXh0VGljayhubyx0LG8pKTpwcm9jZXNzLm5leHRUaWNrKG5vLHQsbyk6ZT8ocHJvY2Vzcy5uZXh0VGljaygkdCx0KSxlKG8pKTpwcm9jZXNzLm5leHRUaWNrKCR0LHQpfSksdGhpcyl9ZnVuY3Rpb24gbm8ocixlKXtkbihyLGUpLCR0KHIpfWZ1bmN0aW9uICR0KHIpe3IuX3dyaXRhYmxlU3RhdGUmJiFyLl93cml0YWJsZVN0YXRlLmVtaXRDbG9zZXx8ci5fcmVhZGFibGVTdGF0ZSYmIXIuX3JlYWRhYmxlU3RhdGUuZW1pdENsb3NlfHxyLmVtaXQoXCJjbG9zZVwiKX1mdW5jdGlvbiBndSgpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLnJlYWRpbmc9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRlZD0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQ9ITEpLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kaW5nPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZmluYWxDYWxsZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5wcmVmaW5pc2hlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSExKX1mdW5jdGlvbiBkbihyLGUpe3IuZW1pdChcImVycm9yXCIsZSl9ZnVuY3Rpb24geXUocixlKXt2YXIgdD1yLl9yZWFkYWJsZVN0YXRlLG49ci5fd3JpdGFibGVTdGF0ZTt0JiZ0LmF1dG9EZXN0cm95fHxuJiZuLmF1dG9EZXN0cm95P3IuZGVzdHJveShlKTpyLmVtaXQoXCJlcnJvclwiLGUpfWlvLmV4cG9ydHM9e2Rlc3Ryb3k6bXUsdW5kZXN0cm95Omd1LGVycm9yT3JEZXN0cm95Onl1fX0pO3ZhciBVZT1TKCh4bCxhbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7ZnVuY3Rpb24gYnUocixlKXtyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxyLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1yLHIuX19wcm90b19fPWV9dmFyIHNvPXt9O2Z1bmN0aW9uIFgocixlLHQpe3R8fCh0PUVycm9yKTtmdW5jdGlvbiBuKG8scyxhKXtyZXR1cm4gdHlwZW9mIGU9PVwic3RyaW5nXCI/ZTplKG8scyxhKX12YXIgaT1mdW5jdGlvbihvKXtidShzLG8pO2Z1bmN0aW9uIHMoYSx1LGYpe3JldHVybiBvLmNhbGwodGhpcyxuKGEsdSxmKSl8fHRoaXN9cmV0dXJuIHN9KHQpO2kucHJvdG90eXBlLm5hbWU9dC5uYW1lLGkucHJvdG90eXBlLmNvZGU9cixzb1tyXT1pfWZ1bmN0aW9uIG9vKHIsZSl7aWYoQXJyYXkuaXNBcnJheShyKSl7dmFyIHQ9ci5sZW5ndGg7cmV0dXJuIHI9ci5tYXAoZnVuY3Rpb24obil7cmV0dXJuIFN0cmluZyhuKX0pLHQ+Mj9cIm9uZSBvZiBcIi5jb25jYXQoZSxcIiBcIikuY29uY2F0KHIuc2xpY2UoMCx0LTEpLmpvaW4oXCIsIFwiKSxcIiwgb3IgXCIpK3JbdC0xXTp0PT09Mj9cIm9uZSBvZiBcIi5jb25jYXQoZSxcIiBcIikuY29uY2F0KHJbMF0sXCIgb3IgXCIpLmNvbmNhdChyWzFdKTpcIm9mIFwiLmNvbmNhdChlLFwiIFwiKS5jb25jYXQoclswXSl9ZWxzZSByZXR1cm5cIm9mIFwiLmNvbmNhdChlLFwiIFwiKS5jb25jYXQoU3RyaW5nKHIpKX1mdW5jdGlvbiB4dShyLGUsdCl7cmV0dXJuIHIuc3Vic3RyKCF0fHx0PDA/MDordCxlLmxlbmd0aCk9PT1lfWZ1bmN0aW9uIF91KHIsZSx0KXtyZXR1cm4odD09PXZvaWQgMHx8dD5yLmxlbmd0aCkmJih0PXIubGVuZ3RoKSxyLnN1YnN0cmluZyh0LWUubGVuZ3RoLHQpPT09ZX1mdW5jdGlvbiB3dShyLGUsdCl7cmV0dXJuIHR5cGVvZiB0IT1cIm51bWJlclwiJiYodD0wKSx0K2UubGVuZ3RoPnIubGVuZ3RoPyExOnIuaW5kZXhPZihlLHQpIT09LTF9WChcIkVSUl9JTlZBTElEX09QVF9WQUxVRVwiLGZ1bmN0aW9uKHIsZSl7cmV0dXJuJ1RoZSB2YWx1ZSBcIicrZSsnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwiJytyKydcIid9LFR5cGVFcnJvcik7WChcIkVSUl9JTlZBTElEX0FSR19UWVBFXCIsZnVuY3Rpb24ocixlLHQpe3ZhciBuO3R5cGVvZiBlPT1cInN0cmluZ1wiJiZ4dShlLFwibm90IFwiKT8obj1cIm11c3Qgbm90IGJlXCIsZT1lLnJlcGxhY2UoL15ub3QgLyxcIlwiKSk6bj1cIm11c3QgYmVcIjt2YXIgaTtpZihfdShyLFwiIGFyZ3VtZW50XCIpKWk9XCJUaGUgXCIuY29uY2F0KHIsXCIgXCIpLmNvbmNhdChuLFwiIFwiKS5jb25jYXQob28oZSxcInR5cGVcIikpO2Vsc2V7dmFyIG89d3UocixcIi5cIik/XCJwcm9wZXJ0eVwiOlwiYXJndW1lbnRcIjtpPSdUaGUgXCInLmNvbmNhdChyLCdcIiAnKS5jb25jYXQobyxcIiBcIikuY29uY2F0KG4sXCIgXCIpLmNvbmNhdChvbyhlLFwidHlwZVwiKSl9cmV0dXJuIGkrPVwiLiBSZWNlaXZlZCB0eXBlIFwiLmNvbmNhdCh0eXBlb2YgdCksaX0sVHlwZUVycm9yKTtYKFwiRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRlwiLFwic3RyZWFtLnB1c2goKSBhZnRlciBFT0ZcIik7WChcIkVSUl9NRVRIT0RfTk9UX0lNUExFTUVOVEVEXCIsZnVuY3Rpb24ocil7cmV0dXJuXCJUaGUgXCIrcitcIiBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkXCJ9KTtYKFwiRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0VcIixcIlByZW1hdHVyZSBjbG9zZVwiKTtYKFwiRVJSX1NUUkVBTV9ERVNUUk9ZRURcIixmdW5jdGlvbihyKXtyZXR1cm5cIkNhbm5vdCBjYWxsIFwiK3IrXCIgYWZ0ZXIgYSBzdHJlYW0gd2FzIGRlc3Ryb3llZFwifSk7WChcIkVSUl9NVUxUSVBMRV9DQUxMQkFDS1wiLFwiQ2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzXCIpO1goXCJFUlJfU1RSRUFNX0NBTk5PVF9QSVBFXCIsXCJDYW5ub3QgcGlwZSwgbm90IHJlYWRhYmxlXCIpO1goXCJFUlJfU1RSRUFNX1dSSVRFX0FGVEVSX0VORFwiLFwid3JpdGUgYWZ0ZXIgZW5kXCIpO1goXCJFUlJfU1RSRUFNX05VTExfVkFMVUVTXCIsXCJNYXkgbm90IHdyaXRlIG51bGwgdmFsdWVzIHRvIHN0cmVhbVwiLFR5cGVFcnJvcik7WChcIkVSUl9VTktOT1dOX0VOQ09ESU5HXCIsZnVuY3Rpb24ocil7cmV0dXJuXCJVbmtub3duIGVuY29kaW5nOiBcIityfSxUeXBlRXJyb3IpO1goXCJFUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5UXCIsXCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudFwiKTthby5leHBvcnRzLmNvZGVzPXNvfSk7dmFyIGhuPVMoKF9sLHVvKT0+e1widXNlIHN0cmljdFwiO2MoKTt2YXIgdnU9VWUoKS5jb2Rlcy5FUlJfSU5WQUxJRF9PUFRfVkFMVUU7ZnVuY3Rpb24gRXUocixlLHQpe3JldHVybiByLmhpZ2hXYXRlck1hcmshPW51bGw/ci5oaWdoV2F0ZXJNYXJrOmU/clt0XTpudWxsfWZ1bmN0aW9uIFN1KHIsZSx0LG4pe3ZhciBpPUV1KGUsbix0KTtpZihpIT1udWxsKXtpZighKGlzRmluaXRlKGkpJiZNYXRoLmZsb29yKGkpPT09aSl8fGk8MCl7dmFyIG89bj90OlwiaGlnaFdhdGVyTWFya1wiO3Rocm93IG5ldyB2dShvLGkpfXJldHVybiBNYXRoLmZsb29yKGkpfXJldHVybiByLm9iamVjdE1vZGU/MTY6MTYqMTAyNH11by5leHBvcnRzPXtnZXRIaWdoV2F0ZXJNYXJrOlN1fX0pO3ZhciBjbz1TKCh3bCxmbyk9PntjKCk7Zm8uZXhwb3J0cz1SdTtmdW5jdGlvbiBSdShyLGUpe2lmKG1uKFwibm9EZXByZWNhdGlvblwiKSlyZXR1cm4gcjt2YXIgdD0hMTtmdW5jdGlvbiBuKCl7aWYoIXQpe2lmKG1uKFwidGhyb3dEZXByZWNhdGlvblwiKSl0aHJvdyBuZXcgRXJyb3IoZSk7bW4oXCJ0cmFjZURlcHJlY2F0aW9uXCIpP2NvbnNvbGUudHJhY2UoZSk6Y29uc29sZS53YXJuKGUpLHQ9ITB9cmV0dXJuIHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBufWZ1bmN0aW9uIG1uKHIpe3RyeXtpZighZ2xvYmFsLmxvY2FsU3RvcmFnZSlyZXR1cm4hMX1jYXRjaHtyZXR1cm4hMX12YXIgZT1nbG9iYWwubG9jYWxTdG9yYWdlW3JdO3JldHVybiBlPT1udWxsPyExOlN0cmluZyhlKS50b0xvd2VyQ2FzZSgpPT09XCJ0cnVlXCJ9fSk7dmFyIGJuPVMoKHZsLHlvKT0+e1widXNlIHN0cmljdFwiO2MoKTt5by5leHBvcnRzPUY7ZnVuY3Rpb24gcG8ocil7dmFyIGU9dGhpczt0aGlzLm5leHQ9bnVsbCx0aGlzLmVudHJ5PW51bGwsdGhpcy5maW5pc2g9ZnVuY3Rpb24oKXtRdShlLHIpfX12YXIgZXQ7Ri5Xcml0YWJsZVN0YXRlPUV0O3ZhciBUdT17ZGVwcmVjYXRlOmNvKCl9LGhvPWZuKCksVnQ9WGUoKS5CdWZmZXIsQ3U9Z2xvYmFsLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBCdShyKXtyZXR1cm4gVnQuZnJvbShyKX1mdW5jdGlvbiBNdShyKXtyZXR1cm4gVnQuaXNCdWZmZXIocil8fHIgaW5zdGFuY2VvZiBDdX12YXIgeW49cG4oKSxMdT1obigpLEl1PUx1LmdldEhpZ2hXYXRlck1hcmsseGU9VWUoKS5jb2RlcyxBdT14ZS5FUlJfSU5WQUxJRF9BUkdfVFlQRSxGdT14ZS5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxQdT14ZS5FUlJfTVVMVElQTEVfQ0FMTEJBQ0ssa3U9eGUuRVJSX1NUUkVBTV9DQU5OT1RfUElQRSxPdT14ZS5FUlJfU1RSRUFNX0RFU1RST1lFRCxVdT14ZS5FUlJfU1RSRUFNX05VTExfVkFMVUVTLER1PXhlLkVSUl9TVFJFQU1fV1JJVEVfQUZURVJfRU5ELE51PXhlLkVSUl9VTktOT1dOX0VOQ09ESU5HLHR0PXluLmVycm9yT3JEZXN0cm95O09lKCkoRixobyk7ZnVuY3Rpb24gSHUoKXt9ZnVuY3Rpb24gRXQocixlLHQpe2V0PWV0fHxEZSgpLHI9cnx8e30sdHlwZW9mIHQhPVwiYm9vbGVhblwiJiYodD1lIGluc3RhbmNlb2YgZXQpLHRoaXMub2JqZWN0TW9kZT0hIXIub2JqZWN0TW9kZSx0JiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISFyLndyaXRhYmxlT2JqZWN0TW9kZSksdGhpcy5oaWdoV2F0ZXJNYXJrPUl1KHRoaXMscixcIndyaXRhYmxlSGlnaFdhdGVyTWFya1wiLHQpLHRoaXMuZmluYWxDYWxsZWQ9ITEsdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExLHRoaXMuZGVzdHJveWVkPSExO3ZhciBuPXIuZGVjb2RlU3RyaW5ncz09PSExO3RoaXMuZGVjb2RlU3RyaW5ncz0hbix0aGlzLmRlZmF1bHRFbmNvZGluZz1yLmRlZmF1bHRFbmNvZGluZ3x8XCJ1dGY4XCIsdGhpcy5sZW5ndGg9MCx0aGlzLndyaXRpbmc9ITEsdGhpcy5jb3JrZWQ9MCx0aGlzLnN5bmM9ITAsdGhpcy5idWZmZXJQcm9jZXNzaW5nPSExLHRoaXMub253cml0ZT1mdW5jdGlvbihpKXt6dShlLGkpfSx0aGlzLndyaXRlY2I9bnVsbCx0aGlzLndyaXRlbGVuPTAsdGhpcy5idWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCx0aGlzLnBlbmRpbmdjYj0wLHRoaXMucHJlZmluaXNoZWQ9ITEsdGhpcy5lcnJvckVtaXR0ZWQ9ITEsdGhpcy5lbWl0Q2xvc2U9ci5lbWl0Q2xvc2UhPT0hMSx0aGlzLmF1dG9EZXN0cm95PSEhci5hdXRvRGVzdHJveSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IHBvKHRoaXMpfUV0LnByb3RvdHlwZS5nZXRCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5idWZmZXJlZFJlcXVlc3QsdD1bXTtlOyl0LnB1c2goZSksZT1lLm5leHQ7cmV0dXJuIHR9OyhmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoRXQucHJvdG90eXBlLFwiYnVmZmVyXCIse2dldDpUdS5kZXByZWNhdGUoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCdWZmZXIoKX0sXCJfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciBpbnN0ZWFkLlwiLFwiREVQMDAwM1wiKX0pfWNhdGNoe319KSgpO3ZhciBHdDt0eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJlN5bWJvbC5oYXNJbnN0YW5jZSYmdHlwZW9mIEZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdPT1cImZ1bmN0aW9uXCI/KEd0PUZ1bmN0aW9uLnByb3RvdHlwZVtTeW1ib2wuaGFzSW5zdGFuY2VdLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGLFN5bWJvbC5oYXNJbnN0YW5jZSx7dmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIEd0LmNhbGwodGhpcyxlKT8hMDp0aGlzIT09Rj8hMTplJiZlLl93cml0YWJsZVN0YXRlIGluc3RhbmNlb2YgRXR9fSkpOkd0PWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdGhpc307ZnVuY3Rpb24gRihyKXtldD1ldHx8RGUoKTt2YXIgZT10aGlzIGluc3RhbmNlb2YgZXQ7aWYoIWUmJiFHdC5jYWxsKEYsdGhpcykpcmV0dXJuIG5ldyBGKHIpO3RoaXMuX3dyaXRhYmxlU3RhdGU9bmV3IEV0KHIsdGhpcyxlKSx0aGlzLndyaXRhYmxlPSEwLHImJih0eXBlb2Ygci53cml0ZT09XCJmdW5jdGlvblwiJiYodGhpcy5fd3JpdGU9ci53cml0ZSksdHlwZW9mIHIud3JpdGV2PT1cImZ1bmN0aW9uXCImJih0aGlzLl93cml0ZXY9ci53cml0ZXYpLHR5cGVvZiByLmRlc3Ryb3k9PVwiZnVuY3Rpb25cIiYmKHRoaXMuX2Rlc3Ryb3k9ci5kZXN0cm95KSx0eXBlb2Ygci5maW5hbD09XCJmdW5jdGlvblwiJiYodGhpcy5fZmluYWw9ci5maW5hbCkpLGhvLmNhbGwodGhpcyl9Ri5wcm90b3R5cGUucGlwZT1mdW5jdGlvbigpe3R0KHRoaXMsbmV3IGt1KX07ZnVuY3Rpb24gcXUocixlKXt2YXIgdD1uZXcgRHU7dHQocix0KSxwcm9jZXNzLm5leHRUaWNrKGUsdCl9ZnVuY3Rpb24ganUocixlLHQsbil7dmFyIGk7cmV0dXJuIHQ9PT1udWxsP2k9bmV3IFV1OnR5cGVvZiB0IT1cInN0cmluZ1wiJiYhZS5vYmplY3RNb2RlJiYoaT1uZXcgQXUoXCJjaHVua1wiLFtcInN0cmluZ1wiLFwiQnVmZmVyXCJdLHQpKSxpPyh0dChyLGkpLHByb2Nlc3MubmV4dFRpY2sobixpKSwhMSk6ITB9Ri5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24ocixlLHQpe3ZhciBuPXRoaXMuX3dyaXRhYmxlU3RhdGUsaT0hMSxvPSFuLm9iamVjdE1vZGUmJk11KHIpO3JldHVybiBvJiYhVnQuaXNCdWZmZXIocikmJihyPUJ1KHIpKSx0eXBlb2YgZT09XCJmdW5jdGlvblwiJiYodD1lLGU9bnVsbCksbz9lPVwiYnVmZmVyXCI6ZXx8KGU9bi5kZWZhdWx0RW5jb2RpbmcpLHR5cGVvZiB0IT1cImZ1bmN0aW9uXCImJih0PUh1KSxuLmVuZGluZz9xdSh0aGlzLHQpOihvfHxqdSh0aGlzLG4scix0KSkmJihuLnBlbmRpbmdjYisrLGk9JHUodGhpcyxuLG8scixlLHQpKSxpfTtGLnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK307Ri5wcm90b3R5cGUudW5jb3JrPWZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5fd3JpdGFibGVTdGF0ZTtyLmNvcmtlZCYmKHIuY29ya2VkLS0sIXIud3JpdGluZyYmIXIuY29ya2VkJiYhci5idWZmZXJQcm9jZXNzaW5nJiZyLmJ1ZmZlcmVkUmVxdWVzdCYmbW8odGhpcyxyKSl9O0YucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbihlKXtpZih0eXBlb2YgZT09XCJzdHJpbmdcIiYmKGU9ZS50b0xvd2VyQ2FzZSgpKSwhKFtcImhleFwiLFwidXRmOFwiLFwidXRmLThcIixcImFzY2lpXCIsXCJiaW5hcnlcIixcImJhc2U2NFwiLFwidWNzMlwiLFwidWNzLTJcIixcInV0ZjE2bGVcIixcInV0Zi0xNmxlXCIsXCJyYXdcIl0uaW5kZXhPZigoZStcIlwiKS50b0xvd2VyQ2FzZSgpKT4tMSkpdGhyb3cgbmV3IE51KGUpO3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmRlZmF1bHRFbmNvZGluZz1lLHRoaXN9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShGLnByb3RvdHlwZSxcIndyaXRhYmxlQnVmZmVyXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyKCl9fSk7ZnVuY3Rpb24gV3UocixlLHQpe3JldHVybiFyLm9iamVjdE1vZGUmJnIuZGVjb2RlU3RyaW5ncyE9PSExJiZ0eXBlb2YgZT09XCJzdHJpbmdcIiYmKGU9VnQuZnJvbShlLHQpKSxlfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShGLnByb3RvdHlwZSxcIndyaXRhYmxlSGlnaFdhdGVyTWFya1wiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSk7ZnVuY3Rpb24gJHUocixlLHQsbixpLG8pe2lmKCF0KXt2YXIgcz1XdShlLG4saSk7biE9PXMmJih0PSEwLGk9XCJidWZmZXJcIixuPXMpfXZhciBhPWUub2JqZWN0TW9kZT8xOm4ubGVuZ3RoO2UubGVuZ3RoKz1hO3ZhciB1PWUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyaztpZih1fHwoZS5uZWVkRHJhaW49ITApLGUud3JpdGluZ3x8ZS5jb3JrZWQpe3ZhciBmPWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9e2NodW5rOm4sZW5jb2Rpbmc6aSxpc0J1Zjp0LGNhbGxiYWNrOm8sbmV4dDpudWxsfSxmP2YubmV4dD1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q6ZS5idWZmZXJlZFJlcXVlc3Q9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBnbihyLGUsITEsYSxuLGksbyk7cmV0dXJuIHV9ZnVuY3Rpb24gZ24ocixlLHQsbixpLG8scyl7ZS53cml0ZWxlbj1uLGUud3JpdGVjYj1zLGUud3JpdGluZz0hMCxlLnN5bmM9ITAsZS5kZXN0cm95ZWQ/ZS5vbndyaXRlKG5ldyBPdShcIndyaXRlXCIpKTp0P3IuX3dyaXRldihpLGUub253cml0ZSk6ci5fd3JpdGUoaSxvLGUub253cml0ZSksZS5zeW5jPSExfWZ1bmN0aW9uIEd1KHIsZSx0LG4saSl7LS1lLnBlbmRpbmdjYix0Pyhwcm9jZXNzLm5leHRUaWNrKGksbikscHJvY2Vzcy5uZXh0VGljayh2dCxyLGUpLHIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHR0KHIsbikpOihpKG4pLHIuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLHR0KHIsbiksdnQocixlKSl9ZnVuY3Rpb24gVnUocil7ci53cml0aW5nPSExLHIud3JpdGVjYj1udWxsLHIubGVuZ3RoLT1yLndyaXRlbGVuLHIud3JpdGVsZW49MH1mdW5jdGlvbiB6dShyLGUpe3ZhciB0PXIuX3dyaXRhYmxlU3RhdGUsbj10LnN5bmMsaT10LndyaXRlY2I7aWYodHlwZW9mIGkhPVwiZnVuY3Rpb25cIil0aHJvdyBuZXcgUHU7aWYoVnUodCksZSlHdShyLHQsbixlLGkpO2Vsc2V7dmFyIG89Z28odCl8fHIuZGVzdHJveWVkOyFvJiYhdC5jb3JrZWQmJiF0LmJ1ZmZlclByb2Nlc3NpbmcmJnQuYnVmZmVyZWRSZXF1ZXN0JiZtbyhyLHQpLG4/cHJvY2Vzcy5uZXh0VGljayhsbyxyLHQsbyxpKTpsbyhyLHQsbyxpKX19ZnVuY3Rpb24gbG8ocixlLHQsbil7dHx8WXUocixlKSxlLnBlbmRpbmdjYi0tLG4oKSx2dChyLGUpfWZ1bmN0aW9uIFl1KHIsZSl7ZS5sZW5ndGg9PT0wJiZlLm5lZWREcmFpbiYmKGUubmVlZERyYWluPSExLHIuZW1pdChcImRyYWluXCIpKX1mdW5jdGlvbiBtbyhyLGUpe2UuYnVmZmVyUHJvY2Vzc2luZz0hMDt2YXIgdD1lLmJ1ZmZlcmVkUmVxdWVzdDtpZihyLl93cml0ZXYmJnQmJnQubmV4dCl7dmFyIG49ZS5idWZmZXJlZFJlcXVlc3RDb3VudCxpPW5ldyBBcnJheShuKSxvPWUuY29ya2VkUmVxdWVzdHNGcmVlO28uZW50cnk9dDtmb3IodmFyIHM9MCxhPSEwO3Q7KWlbc109dCx0LmlzQnVmfHwoYT0hMSksdD10Lm5leHQscys9MTtpLmFsbEJ1ZmZlcnM9YSxnbihyLGUsITAsZS5sZW5ndGgsaSxcIlwiLG8uZmluaXNoKSxlLnBlbmRpbmdjYisrLGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLG8ubmV4dD8oZS5jb3JrZWRSZXF1ZXN0c0ZyZWU9by5uZXh0LG8ubmV4dD1udWxsKTplLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgcG8oZSksZS5idWZmZXJlZFJlcXVlc3RDb3VudD0wfWVsc2V7Zm9yKDt0Oyl7dmFyIHU9dC5jaHVuayxmPXQuZW5jb2RpbmcsbD10LmNhbGxiYWNrLGQ9ZS5vYmplY3RNb2RlPzE6dS5sZW5ndGg7aWYoZ24ocixlLCExLGQsdSxmLGwpLHQ9dC5uZXh0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQtLSxlLndyaXRpbmcpYnJlYWt9dD09PW51bGwmJihlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9bnVsbCl9ZS5idWZmZXJlZFJlcXVlc3Q9dCxlLmJ1ZmZlclByb2Nlc3Npbmc9ITF9Ri5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHIsZSx0KXt0KG5ldyBGdShcIl93cml0ZSgpXCIpKX07Ri5wcm90b3R5cGUuX3dyaXRldj1udWxsO0YucHJvdG90eXBlLmVuZD1mdW5jdGlvbihyLGUsdCl7dmFyIG49dGhpcy5fd3JpdGFibGVTdGF0ZTtyZXR1cm4gdHlwZW9mIHI9PVwiZnVuY3Rpb25cIj8odD1yLHI9bnVsbCxlPW51bGwpOnR5cGVvZiBlPT1cImZ1bmN0aW9uXCImJih0PWUsZT1udWxsKSxyIT1udWxsJiZ0aGlzLndyaXRlKHIsZSksbi5jb3JrZWQmJihuLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLG4uZW5kaW5nfHxKdSh0aGlzLG4sdCksdGhpc307T2JqZWN0LmRlZmluZVByb3BlcnR5KEYucHJvdG90eXBlLFwid3JpdGFibGVMZW5ndGhcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5sZW5ndGh9fSk7ZnVuY3Rpb24gZ28ocil7cmV0dXJuIHIuZW5kaW5nJiZyLmxlbmd0aD09PTAmJnIuYnVmZmVyZWRSZXF1ZXN0PT09bnVsbCYmIXIuZmluaXNoZWQmJiFyLndyaXRpbmd9ZnVuY3Rpb24gS3UocixlKXtyLl9maW5hbChmdW5jdGlvbih0KXtlLnBlbmRpbmdjYi0tLHQmJnR0KHIsdCksZS5wcmVmaW5pc2hlZD0hMCxyLmVtaXQoXCJwcmVmaW5pc2hcIiksdnQocixlKX0pfWZ1bmN0aW9uIFh1KHIsZSl7IWUucHJlZmluaXNoZWQmJiFlLmZpbmFsQ2FsbGVkJiYodHlwZW9mIHIuX2ZpbmFsPT1cImZ1bmN0aW9uXCImJiFlLmRlc3Ryb3llZD8oZS5wZW5kaW5nY2IrKyxlLmZpbmFsQ2FsbGVkPSEwLHByb2Nlc3MubmV4dFRpY2soS3UscixlKSk6KGUucHJlZmluaXNoZWQ9ITAsci5lbWl0KFwicHJlZmluaXNoXCIpKSl9ZnVuY3Rpb24gdnQocixlKXt2YXIgdD1nbyhlKTtpZih0JiYoWHUocixlKSxlLnBlbmRpbmdjYj09PTAmJihlLmZpbmlzaGVkPSEwLHIuZW1pdChcImZpbmlzaFwiKSxlLmF1dG9EZXN0cm95KSkpe3ZhciBuPXIuX3JlYWRhYmxlU3RhdGU7KCFufHxuLmF1dG9EZXN0cm95JiZuLmVuZEVtaXR0ZWQpJiZyLmRlc3Ryb3koKX1yZXR1cm4gdH1mdW5jdGlvbiBKdShyLGUsdCl7ZS5lbmRpbmc9ITAsdnQocixlKSx0JiYoZS5maW5pc2hlZD9wcm9jZXNzLm5leHRUaWNrKHQpOnIub25jZShcImZpbmlzaFwiLHQpKSxlLmVuZGVkPSEwLHIud3JpdGFibGU9ITF9ZnVuY3Rpb24gUXUocixlLHQpe3ZhciBuPXIuZW50cnk7Zm9yKHIuZW50cnk9bnVsbDtuOyl7dmFyIGk9bi5jYWxsYmFjaztlLnBlbmRpbmdjYi0tLGkodCksbj1uLm5leHR9ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1yfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShGLnByb3RvdHlwZSxcImRlc3Ryb3llZFwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlPT09dm9pZCAwPyExOnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24oZSl7IXRoaXMuX3dyaXRhYmxlU3RhdGV8fCh0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD1lKX19KTtGLnByb3RvdHlwZS5kZXN0cm95PXluLmRlc3Ryb3k7Ri5wcm90b3R5cGUuX3VuZGVzdHJveT15bi51bmRlc3Ryb3k7Ri5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24ocixlKXtlKHIpfX0pO3ZhciBEZT1TKChFbCx4byk9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFp1PU9iamVjdC5rZXlzfHxmdW5jdGlvbihyKXt2YXIgZT1bXTtmb3IodmFyIHQgaW4gcillLnB1c2godCk7cmV0dXJuIGV9O3hvLmV4cG9ydHM9YWU7dmFyIGJvPXduKCksX249Ym4oKTtPZSgpKGFlLGJvKTtmb3IoeG49WnUoX24ucHJvdG90eXBlKSx6dD0wO3p0PHhuLmxlbmd0aDt6dCsrKVl0PXhuW3p0XSxhZS5wcm90b3R5cGVbWXRdfHwoYWUucHJvdG90eXBlW1l0XT1fbi5wcm90b3R5cGVbWXRdKTt2YXIgeG4sWXQsenQ7ZnVuY3Rpb24gYWUocil7aWYoISh0aGlzIGluc3RhbmNlb2YgYWUpKXJldHVybiBuZXcgYWUocik7Ym8uY2FsbCh0aGlzLHIpLF9uLmNhbGwodGhpcyxyKSx0aGlzLmFsbG93SGFsZk9wZW49ITAsciYmKHIucmVhZGFibGU9PT0hMSYmKHRoaXMucmVhZGFibGU9ITEpLHIud3JpdGFibGU9PT0hMSYmKHRoaXMud3JpdGFibGU9ITEpLHIuYWxsb3dIYWxmT3Blbj09PSExJiYodGhpcy5hbGxvd0hhbGZPcGVuPSExLHRoaXMub25jZShcImVuZFwiLGVmKSkpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhZS5wcm90b3R5cGUsXCJ3cml0YWJsZUhpZ2hXYXRlck1hcmtcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JpdGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhZS5wcm90b3R5cGUsXCJ3cml0YWJsZUJ1ZmZlclwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmdldEJ1ZmZlcigpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhZS5wcm90b3R5cGUsXCJ3cml0YWJsZUxlbmd0aFwiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmxlbmd0aH19KTtmdW5jdGlvbiBlZigpe3RoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fHByb2Nlc3MubmV4dFRpY2sodGYsdGhpcyl9ZnVuY3Rpb24gdGYocil7ci5lbmQoKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoYWUucHJvdG90eXBlLFwiZGVzdHJveWVkXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGU9PT12b2lkIDB8fHRoaXMuX3dyaXRhYmxlU3RhdGU9PT12b2lkIDA/ITE6dGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQmJnRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkfSxzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fcmVhZGFibGVTdGF0ZT09PXZvaWQgMHx8dGhpcy5fd3JpdGFibGVTdGF0ZT09PXZvaWQgMHx8KHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPWUsdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ZSl9fSl9KTt2YXIgdm89Uygodm4sd28pPT57YygpO3ZhciBLdD1YZSgpLHVlPUt0LkJ1ZmZlcjtmdW5jdGlvbiBfbyhyLGUpe2Zvcih2YXIgdCBpbiByKWVbdF09clt0XX11ZS5mcm9tJiZ1ZS5hbGxvYyYmdWUuYWxsb2NVbnNhZmUmJnVlLmFsbG9jVW5zYWZlU2xvdz93by5leHBvcnRzPUt0OihfbyhLdCx2biksdm4uQnVmZmVyPU5lKTtmdW5jdGlvbiBOZShyLGUsdCl7cmV0dXJuIHVlKHIsZSx0KX1OZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh1ZS5wcm90b3R5cGUpO19vKHVlLE5lKTtOZS5mcm9tPWZ1bmN0aW9uKHIsZSx0KXtpZih0eXBlb2Ygcj09XCJudW1iZXJcIil0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXJcIik7cmV0dXJuIHVlKHIsZSx0KX07TmUuYWxsb2M9ZnVuY3Rpb24ocixlLHQpe2lmKHR5cGVvZiByIT1cIm51bWJlclwiKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyXCIpO3ZhciBuPXVlKHIpO3JldHVybiBlIT09dm9pZCAwP3R5cGVvZiB0PT1cInN0cmluZ1wiP24uZmlsbChlLHQpOm4uZmlsbChlKTpuLmZpbGwoMCksbn07TmUuYWxsb2NVbnNhZmU9ZnVuY3Rpb24ocil7aWYodHlwZW9mIHIhPVwibnVtYmVyXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXJcIik7cmV0dXJuIHVlKHIpfTtOZS5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24ocil7aWYodHlwZW9mIHIhPVwibnVtYmVyXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXJcIik7cmV0dXJuIEt0LlNsb3dCdWZmZXIocil9fSk7dmFyIFJuPVMoU289PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFNuPXZvKCkuQnVmZmVyLEVvPVNuLmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKHIpe3N3aXRjaChyPVwiXCIrcixyJiZyLnRvTG93ZXJDYXNlKCkpe2Nhc2VcImhleFwiOmNhc2VcInV0ZjhcIjpjYXNlXCJ1dGYtOFwiOmNhc2VcImFzY2lpXCI6Y2FzZVwiYmluYXJ5XCI6Y2FzZVwiYmFzZTY0XCI6Y2FzZVwidWNzMlwiOmNhc2VcInVjcy0yXCI6Y2FzZVwidXRmMTZsZVwiOmNhc2VcInV0Zi0xNmxlXCI6Y2FzZVwicmF3XCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19O2Z1bmN0aW9uIHJmKHIpe2lmKCFyKXJldHVyblwidXRmOFwiO2Zvcih2YXIgZTs7KXN3aXRjaChyKXtjYXNlXCJ1dGY4XCI6Y2FzZVwidXRmLThcIjpyZXR1cm5cInV0ZjhcIjtjYXNlXCJ1Y3MyXCI6Y2FzZVwidWNzLTJcIjpjYXNlXCJ1dGYxNmxlXCI6Y2FzZVwidXRmLTE2bGVcIjpyZXR1cm5cInV0ZjE2bGVcIjtjYXNlXCJsYXRpbjFcIjpjYXNlXCJiaW5hcnlcIjpyZXR1cm5cImxhdGluMVwiO2Nhc2VcImJhc2U2NFwiOmNhc2VcImFzY2lpXCI6Y2FzZVwiaGV4XCI6cmV0dXJuIHI7ZGVmYXVsdDppZihlKXJldHVybjtyPShcIlwiK3IpLnRvTG93ZXJDYXNlKCksZT0hMH19ZnVuY3Rpb24gbmYocil7dmFyIGU9cmYocik7aWYodHlwZW9mIGUhPVwic3RyaW5nXCImJihTbi5pc0VuY29kaW5nPT09RW98fCFFbyhyKSkpdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIrcik7cmV0dXJuIGV8fHJ9U28uU3RyaW5nRGVjb2Rlcj1TdDtmdW5jdGlvbiBTdChyKXt0aGlzLmVuY29kaW5nPW5mKHIpO3ZhciBlO3N3aXRjaCh0aGlzLmVuY29kaW5nKXtjYXNlXCJ1dGYxNmxlXCI6dGhpcy50ZXh0PWNmLHRoaXMuZW5kPWxmLGU9NDticmVhaztjYXNlXCJ1dGY4XCI6dGhpcy5maWxsTGFzdD1hZixlPTQ7YnJlYWs7Y2FzZVwiYmFzZTY0XCI6dGhpcy50ZXh0PWRmLHRoaXMuZW5kPXBmLGU9MzticmVhaztkZWZhdWx0OnRoaXMud3JpdGU9aGYsdGhpcy5lbmQ9bWY7cmV0dXJufXRoaXMubGFzdE5lZWQ9MCx0aGlzLmxhc3RUb3RhbD0wLHRoaXMubGFzdENoYXI9U24uYWxsb2NVbnNhZmUoZSl9U3QucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHIpe2lmKHIubGVuZ3RoPT09MClyZXR1cm5cIlwiO3ZhciBlLHQ7aWYodGhpcy5sYXN0TmVlZCl7aWYoZT10aGlzLmZpbGxMYXN0KHIpLGU9PT12b2lkIDApcmV0dXJuXCJcIjt0PXRoaXMubGFzdE5lZWQsdGhpcy5sYXN0TmVlZD0wfWVsc2UgdD0wO3JldHVybiB0PHIubGVuZ3RoP2U/ZSt0aGlzLnRleHQocix0KTp0aGlzLnRleHQocix0KTplfHxcIlwifTtTdC5wcm90b3R5cGUuZW5kPWZmO1N0LnByb3RvdHlwZS50ZXh0PXVmO1N0LnByb3RvdHlwZS5maWxsTGFzdD1mdW5jdGlvbihyKXtpZih0aGlzLmxhc3ROZWVkPD1yLmxlbmd0aClyZXR1cm4gci5jb3B5KHRoaXMubGFzdENoYXIsdGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCwwLHRoaXMubGFzdE5lZWQpLHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywwLHRoaXMubGFzdFRvdGFsKTtyLmNvcHkodGhpcy5sYXN0Q2hhcix0aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLDAsci5sZW5ndGgpLHRoaXMubGFzdE5lZWQtPXIubGVuZ3RofTtmdW5jdGlvbiBFbihyKXtyZXR1cm4gcjw9MTI3PzA6cj4+NT09PTY/MjpyPj40PT09MTQ/MzpyPj4zPT09MzA/NDpyPj42PT09Mj8tMTotMn1mdW5jdGlvbiBvZihyLGUsdCl7dmFyIG49ZS5sZW5ndGgtMTtpZihuPHQpcmV0dXJuIDA7dmFyIGk9RW4oZVtuXSk7cmV0dXJuIGk+PTA/KGk+MCYmKHIubGFzdE5lZWQ9aS0xKSxpKTotLW48dHx8aT09PS0yPzA6KGk9RW4oZVtuXSksaT49MD8oaT4wJiYoci5sYXN0TmVlZD1pLTIpLGkpOi0tbjx0fHxpPT09LTI/MDooaT1FbihlW25dKSxpPj0wPyhpPjAmJihpPT09Mj9pPTA6ci5sYXN0TmVlZD1pLTMpLGkpOjApKX1mdW5jdGlvbiBzZihyLGUsdCl7aWYoKGVbMF0mMTkyKSE9PTEyOClyZXR1cm4gci5sYXN0TmVlZD0wLFwiXFx1RkZGRFwiO2lmKHIubGFzdE5lZWQ+MSYmZS5sZW5ndGg+MSl7aWYoKGVbMV0mMTkyKSE9PTEyOClyZXR1cm4gci5sYXN0TmVlZD0xLFwiXFx1RkZGRFwiO2lmKHIubGFzdE5lZWQ+MiYmZS5sZW5ndGg+MiYmKGVbMl0mMTkyKSE9PTEyOClyZXR1cm4gci5sYXN0TmVlZD0yLFwiXFx1RkZGRFwifX1mdW5jdGlvbiBhZihyKXt2YXIgZT10aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLHQ9c2YodGhpcyxyLGUpO2lmKHQhPT12b2lkIDApcmV0dXJuIHQ7aWYodGhpcy5sYXN0TmVlZDw9ci5sZW5ndGgpcmV0dXJuIHIuY29weSh0aGlzLmxhc3RDaGFyLGUsMCx0aGlzLmxhc3ROZWVkKSx0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCx0aGlzLmxhc3RUb3RhbCk7ci5jb3B5KHRoaXMubGFzdENoYXIsZSwwLHIubGVuZ3RoKSx0aGlzLmxhc3ROZWVkLT1yLmxlbmd0aH1mdW5jdGlvbiB1ZihyLGUpe3ZhciB0PW9mKHRoaXMscixlKTtpZighdGhpcy5sYXN0TmVlZClyZXR1cm4gci50b1N0cmluZyhcInV0ZjhcIixlKTt0aGlzLmxhc3RUb3RhbD10O3ZhciBuPXIubGVuZ3RoLSh0LXRoaXMubGFzdE5lZWQpO3JldHVybiByLmNvcHkodGhpcy5sYXN0Q2hhciwwLG4pLHIudG9TdHJpbmcoXCJ1dGY4XCIsZSxuKX1mdW5jdGlvbiBmZihyKXt2YXIgZT1yJiZyLmxlbmd0aD90aGlzLndyaXRlKHIpOlwiXCI7cmV0dXJuIHRoaXMubGFzdE5lZWQ/ZStcIlxcdUZGRkRcIjplfWZ1bmN0aW9uIGNmKHIsZSl7aWYoKHIubGVuZ3RoLWUpJTI9PT0wKXt2YXIgdD1yLnRvU3RyaW5nKFwidXRmMTZsZVwiLGUpO2lmKHQpe3ZhciBuPXQuY2hhckNvZGVBdCh0Lmxlbmd0aC0xKTtpZihuPj01NTI5NiYmbjw9NTYzMTkpcmV0dXJuIHRoaXMubGFzdE5lZWQ9Mix0aGlzLmxhc3RUb3RhbD00LHRoaXMubGFzdENoYXJbMF09cltyLmxlbmd0aC0yXSx0aGlzLmxhc3RDaGFyWzFdPXJbci5sZW5ndGgtMV0sdC5zbGljZSgwLC0xKX1yZXR1cm4gdH1yZXR1cm4gdGhpcy5sYXN0TmVlZD0xLHRoaXMubGFzdFRvdGFsPTIsdGhpcy5sYXN0Q2hhclswXT1yW3IubGVuZ3RoLTFdLHIudG9TdHJpbmcoXCJ1dGYxNmxlXCIsZSxyLmxlbmd0aC0xKX1mdW5jdGlvbiBsZihyKXt2YXIgZT1yJiZyLmxlbmd0aD90aGlzLndyaXRlKHIpOlwiXCI7aWYodGhpcy5sYXN0TmVlZCl7dmFyIHQ9dGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZDtyZXR1cm4gZSt0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKFwidXRmMTZsZVwiLDAsdCl9cmV0dXJuIGV9ZnVuY3Rpb24gZGYocixlKXt2YXIgdD0oci5sZW5ndGgtZSklMztyZXR1cm4gdD09PTA/ci50b1N0cmluZyhcImJhc2U2NFwiLGUpOih0aGlzLmxhc3ROZWVkPTMtdCx0aGlzLmxhc3RUb3RhbD0zLHQ9PT0xP3RoaXMubGFzdENoYXJbMF09cltyLmxlbmd0aC0xXToodGhpcy5sYXN0Q2hhclswXT1yW3IubGVuZ3RoLTJdLHRoaXMubGFzdENoYXJbMV09cltyLmxlbmd0aC0xXSksci50b1N0cmluZyhcImJhc2U2NFwiLGUsci5sZW5ndGgtdCkpfWZ1bmN0aW9uIHBmKHIpe3ZhciBlPXImJnIubGVuZ3RoP3RoaXMud3JpdGUocik6XCJcIjtyZXR1cm4gdGhpcy5sYXN0TmVlZD9lK3RoaXMubGFzdENoYXIudG9TdHJpbmcoXCJiYXNlNjRcIiwwLDMtdGhpcy5sYXN0TmVlZCk6ZX1mdW5jdGlvbiBoZihyKXtyZXR1cm4gci50b1N0cmluZyh0aGlzLmVuY29kaW5nKX1mdW5jdGlvbiBtZihyKXtyZXR1cm4gciYmci5sZW5ndGg/dGhpcy53cml0ZShyKTpcIlwifX0pO3ZhciBYdD1TKChSbCxDbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIFJvPVVlKCkuY29kZXMuRVJSX1NUUkVBTV9QUkVNQVRVUkVfQ0xPU0U7ZnVuY3Rpb24gZ2Yocil7dmFyIGU9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIWUpe2U9ITA7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodCksaT0wO2k8dDtpKyspbltpXT1hcmd1bWVudHNbaV07ci5hcHBseSh0aGlzLG4pfX19ZnVuY3Rpb24geWYoKXt9ZnVuY3Rpb24gYmYocil7cmV0dXJuIHIuc2V0SGVhZGVyJiZ0eXBlb2Ygci5hYm9ydD09XCJmdW5jdGlvblwifWZ1bmN0aW9uIFRvKHIsZSx0KXtpZih0eXBlb2YgZT09XCJmdW5jdGlvblwiKXJldHVybiBUbyhyLG51bGwsZSk7ZXx8KGU9e30pLHQ9Z2YodHx8eWYpO3ZhciBuPWUucmVhZGFibGV8fGUucmVhZGFibGUhPT0hMSYmci5yZWFkYWJsZSxpPWUud3JpdGFibGV8fGUud3JpdGFibGUhPT0hMSYmci53cml0YWJsZSxvPWZ1bmN0aW9uKCl7ci53cml0YWJsZXx8YSgpfSxzPXIuX3dyaXRhYmxlU3RhdGUmJnIuX3dyaXRhYmxlU3RhdGUuZmluaXNoZWQsYT1mdW5jdGlvbigpe2k9ITEscz0hMCxufHx0LmNhbGwocil9LHU9ci5fcmVhZGFibGVTdGF0ZSYmci5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkLGY9ZnVuY3Rpb24oKXtuPSExLHU9ITAsaXx8dC5jYWxsKHIpfSxsPWZ1bmN0aW9uKGIpe3QuY2FsbChyLGIpfSxkPWZ1bmN0aW9uKCl7dmFyIGI7aWYobiYmIXUpcmV0dXJuKCFyLl9yZWFkYWJsZVN0YXRlfHwhci5fcmVhZGFibGVTdGF0ZS5lbmRlZCkmJihiPW5ldyBSbyksdC5jYWxsKHIsYik7aWYoaSYmIXMpcmV0dXJuKCFyLl93cml0YWJsZVN0YXRlfHwhci5fd3JpdGFibGVTdGF0ZS5lbmRlZCkmJihiPW5ldyBSbyksdC5jYWxsKHIsYil9LGg9ZnVuY3Rpb24oKXtyLnJlcS5vbihcImZpbmlzaFwiLGEpfTtyZXR1cm4gYmYocik/KHIub24oXCJjb21wbGV0ZVwiLGEpLHIub24oXCJhYm9ydFwiLGQpLHIucmVxP2goKTpyLm9uKFwicmVxdWVzdFwiLGgpKTppJiYhci5fd3JpdGFibGVTdGF0ZSYmKHIub24oXCJlbmRcIixvKSxyLm9uKFwiY2xvc2VcIixvKSksci5vbihcImVuZFwiLGYpLHIub24oXCJmaW5pc2hcIixhKSxlLmVycm9yIT09ITEmJnIub24oXCJlcnJvclwiLGwpLHIub24oXCJjbG9zZVwiLGQpLGZ1bmN0aW9uKCl7ci5yZW1vdmVMaXN0ZW5lcihcImNvbXBsZXRlXCIsYSksci5yZW1vdmVMaXN0ZW5lcihcImFib3J0XCIsZCksci5yZW1vdmVMaXN0ZW5lcihcInJlcXVlc3RcIixoKSxyLnJlcSYmci5yZXEucmVtb3ZlTGlzdGVuZXIoXCJmaW5pc2hcIixhKSxyLnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIsbyksci5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsbyksci5yZW1vdmVMaXN0ZW5lcihcImZpbmlzaFwiLGEpLHIucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIixmKSxyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIixsKSxyLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixkKX19Q28uZXhwb3J0cz1Ub30pO3ZhciBNbz1TKChUbCxCbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7dmFyIEp0O2Z1bmN0aW9uIF9lKHIsZSx0KXtyZXR1cm4gZSBpbiByP09iamVjdC5kZWZpbmVQcm9wZXJ0eShyLGUse3ZhbHVlOnQsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTpyW2VdPXQscn12YXIgeGY9WHQoKSx3ZT1TeW1ib2woXCJsYXN0UmVzb2x2ZVwiKSxIZT1TeW1ib2woXCJsYXN0UmVqZWN0XCIpLFJ0PVN5bWJvbChcImVycm9yXCIpLFF0PVN5bWJvbChcImVuZGVkXCIpLHFlPVN5bWJvbChcImxhc3RQcm9taXNlXCIpLFRuPVN5bWJvbChcImhhbmRsZVByb21pc2VcIiksamU9U3ltYm9sKFwic3RyZWFtXCIpO2Z1bmN0aW9uIHZlKHIsZSl7cmV0dXJue3ZhbHVlOnIsZG9uZTplfX1mdW5jdGlvbiBfZihyKXt2YXIgZT1yW3dlXTtpZihlIT09bnVsbCl7dmFyIHQ9cltqZV0ucmVhZCgpO3QhPT1udWxsJiYocltxZV09bnVsbCxyW3dlXT1udWxsLHJbSGVdPW51bGwsZSh2ZSh0LCExKSkpfX1mdW5jdGlvbiB3ZihyKXtwcm9jZXNzLm5leHRUaWNrKF9mLHIpfWZ1bmN0aW9uIHZmKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7ci50aGVuKGZ1bmN0aW9uKCl7aWYoZVtRdF0pe3QodmUodm9pZCAwLCEwKSk7cmV0dXJufWVbVG5dKHQsbil9LG4pfX12YXIgRWY9T2JqZWN0LmdldFByb3RvdHlwZU9mKGZ1bmN0aW9uKCl7fSksU2Y9T2JqZWN0LnNldFByb3RvdHlwZU9mKChKdD17Z2V0IHN0cmVhbSgpe3JldHVybiB0aGlzW2plXX0sbmV4dDpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD10aGlzW1J0XTtpZih0IT09bnVsbClyZXR1cm4gUHJvbWlzZS5yZWplY3QodCk7aWYodGhpc1tRdF0pcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2ZSh2b2lkIDAsITApKTtpZih0aGlzW2plXS5kZXN0cm95ZWQpcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHMsYSl7cHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbigpe2VbUnRdP2EoZVtSdF0pOnModmUodm9pZCAwLCEwKSl9KX0pO3ZhciBuPXRoaXNbcWVdLGk7aWYobilpPW5ldyBQcm9taXNlKHZmKG4sdGhpcykpO2Vsc2V7dmFyIG89dGhpc1tqZV0ucmVhZCgpO2lmKG8hPT1udWxsKXJldHVybiBQcm9taXNlLnJlc29sdmUodmUobywhMSkpO2k9bmV3IFByb21pc2UodGhpc1tUbl0pfXJldHVybiB0aGlzW3FlXT1pLGl9fSxfZShKdCxTeW1ib2wuYXN5bmNJdGVyYXRvcixmdW5jdGlvbigpe3JldHVybiB0aGlzfSksX2UoSnQsXCJyZXR1cm5cIixmdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHQsbil7ZVtqZV0uZGVzdHJveShudWxsLGZ1bmN0aW9uKGkpe2lmKGkpe24oaSk7cmV0dXJufXQodmUodm9pZCAwLCEwKSl9KX0pfSksSnQpLEVmKSxSZj1mdW5jdGlvbihlKXt2YXIgdCxuPU9iamVjdC5jcmVhdGUoU2YsKHQ9e30sX2UodCxqZSx7dmFsdWU6ZSx3cml0YWJsZTohMH0pLF9lKHQsd2Use3ZhbHVlOm51bGwsd3JpdGFibGU6ITB9KSxfZSh0LEhlLHt2YWx1ZTpudWxsLHdyaXRhYmxlOiEwfSksX2UodCxSdCx7dmFsdWU6bnVsbCx3cml0YWJsZTohMH0pLF9lKHQsUXQse3ZhbHVlOmUuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZCx3cml0YWJsZTohMH0pLF9lKHQsVG4se3ZhbHVlOmZ1bmN0aW9uKG8scyl7dmFyIGE9bltqZV0ucmVhZCgpO2E/KG5bcWVdPW51bGwsblt3ZV09bnVsbCxuW0hlXT1udWxsLG8odmUoYSwhMSkpKTooblt3ZV09byxuW0hlXT1zKX0sd3JpdGFibGU6ITB9KSx0KSk7cmV0dXJuIG5bcWVdPW51bGwseGYoZSxmdW5jdGlvbihpKXtpZihpJiZpLmNvZGUhPT1cIkVSUl9TVFJFQU1fUFJFTUFUVVJFX0NMT1NFXCIpe3ZhciBvPW5bSGVdO28hPT1udWxsJiYobltxZV09bnVsbCxuW3dlXT1udWxsLG5bSGVdPW51bGwsbyhpKSksbltSdF09aTtyZXR1cm59dmFyIHM9blt3ZV07cyE9PW51bGwmJihuW3FlXT1udWxsLG5bd2VdPW51bGwsbltIZV09bnVsbCxzKHZlKHZvaWQgMCwhMCkpKSxuW1F0XT0hMH0pLGUub24oXCJyZWFkYWJsZVwiLHdmLmJpbmQobnVsbCxuKSksbn07Qm8uZXhwb3J0cz1SZn0pO3ZhciBJbz1TKChDbCxMbyk9PntjKCk7TG8uZXhwb3J0cz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIlJlYWRhYmxlLmZyb20gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgYnJvd3NlclwiKX19KTt2YXIgd249UygoTWwscW8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3FvLmV4cG9ydHM9RTt2YXIgcnQ7RS5SZWFkYWJsZVN0YXRlPWtvO3ZhciBCbD11bigpLkV2ZW50RW1pdHRlcixQbz1mdW5jdGlvbihlLHQpe3JldHVybiBlLmxpc3RlbmVycyh0KS5sZW5ndGh9LEN0PWZuKCksWnQ9WGUoKS5CdWZmZXIsVGY9Z2xvYmFsLlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBDZihyKXtyZXR1cm4gWnQuZnJvbShyKX1mdW5jdGlvbiBCZihyKXtyZXR1cm4gWnQuaXNCdWZmZXIocil8fHIgaW5zdGFuY2VvZiBUZn12YXIgQ249Y24oKSx4O0NuJiZDbi5kZWJ1Z2xvZz94PUNuLmRlYnVnbG9nKFwic3RyZWFtXCIpOng9ZnVuY3Rpb24oKXt9O3ZhciBNZj1ybygpLFBuPXBuKCksTGY9aG4oKSxJZj1MZi5nZXRIaWdoV2F0ZXJNYXJrLGVyPVVlKCkuY29kZXMsQWY9ZXIuRVJSX0lOVkFMSURfQVJHX1RZUEUsRmY9ZXIuRVJSX1NUUkVBTV9QVVNIX0FGVEVSX0VPRixQZj1lci5FUlJfTUVUSE9EX05PVF9JTVBMRU1FTlRFRCxrZj1lci5FUlJfU1RSRUFNX1VOU0hJRlRfQUZURVJfRU5EX0VWRU5ULG50LEJuLE1uO09lKCkoRSxDdCk7dmFyIFR0PVBuLmVycm9yT3JEZXN0cm95LExuPVtcImVycm9yXCIsXCJjbG9zZVwiLFwiZGVzdHJveVwiLFwicGF1c2VcIixcInJlc3VtZVwiXTtmdW5jdGlvbiBPZihyLGUsdCl7aWYodHlwZW9mIHIucHJlcGVuZExpc3RlbmVyPT1cImZ1bmN0aW9uXCIpcmV0dXJuIHIucHJlcGVuZExpc3RlbmVyKGUsdCk7IXIuX2V2ZW50c3x8IXIuX2V2ZW50c1tlXT9yLm9uKGUsdCk6QXJyYXkuaXNBcnJheShyLl9ldmVudHNbZV0pP3IuX2V2ZW50c1tlXS51bnNoaWZ0KHQpOnIuX2V2ZW50c1tlXT1bdCxyLl9ldmVudHNbZV1dfWZ1bmN0aW9uIGtvKHIsZSx0KXtydD1ydHx8RGUoKSxyPXJ8fHt9LHR5cGVvZiB0IT1cImJvb2xlYW5cIiYmKHQ9ZSBpbnN0YW5jZW9mIHJ0KSx0aGlzLm9iamVjdE1vZGU9ISFyLm9iamVjdE1vZGUsdCYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhci5yZWFkYWJsZU9iamVjdE1vZGUpLHRoaXMuaGlnaFdhdGVyTWFyaz1JZih0aGlzLHIsXCJyZWFkYWJsZUhpZ2hXYXRlck1hcmtcIix0KSx0aGlzLmJ1ZmZlcj1uZXcgTWYsdGhpcy5sZW5ndGg9MCx0aGlzLnBpcGVzPW51bGwsdGhpcy5waXBlc0NvdW50PTAsdGhpcy5mbG93aW5nPW51bGwsdGhpcy5lbmRlZD0hMSx0aGlzLmVuZEVtaXR0ZWQ9ITEsdGhpcy5yZWFkaW5nPSExLHRoaXMuc3luYz0hMCx0aGlzLm5lZWRSZWFkYWJsZT0hMSx0aGlzLmVtaXR0ZWRSZWFkYWJsZT0hMSx0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPSExLHRoaXMucmVzdW1lU2NoZWR1bGVkPSExLHRoaXMucGF1c2VkPSEwLHRoaXMuZW1pdENsb3NlPXIuZW1pdENsb3NlIT09ITEsdGhpcy5hdXRvRGVzdHJveT0hIXIuYXV0b0Rlc3Ryb3ksdGhpcy5kZXN0cm95ZWQ9ITEsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9ci5kZWZhdWx0RW5jb2Rpbmd8fFwidXRmOFwiLHRoaXMuYXdhaXREcmFpbj0wLHRoaXMucmVhZGluZ01vcmU9ITEsdGhpcy5kZWNvZGVyPW51bGwsdGhpcy5lbmNvZGluZz1udWxsLHIuZW5jb2RpbmcmJihudHx8KG50PVJuKCkuU3RyaW5nRGVjb2RlciksdGhpcy5kZWNvZGVyPW5ldyBudChyLmVuY29kaW5nKSx0aGlzLmVuY29kaW5nPXIuZW5jb2RpbmcpfWZ1bmN0aW9uIEUocil7aWYocnQ9cnR8fERlKCksISh0aGlzIGluc3RhbmNlb2YgRSkpcmV0dXJuIG5ldyBFKHIpO3ZhciBlPXRoaXMgaW5zdGFuY2VvZiBydDt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyBrbyhyLHRoaXMsZSksdGhpcy5yZWFkYWJsZT0hMCxyJiYodHlwZW9mIHIucmVhZD09XCJmdW5jdGlvblwiJiYodGhpcy5fcmVhZD1yLnJlYWQpLHR5cGVvZiByLmRlc3Ryb3k9PVwiZnVuY3Rpb25cIiYmKHRoaXMuX2Rlc3Ryb3k9ci5kZXN0cm95KSksQ3QuY2FsbCh0aGlzKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoRS5wcm90b3R5cGUsXCJkZXN0cm95ZWRcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZT09PXZvaWQgMD8hMTp0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uKGUpeyF0aGlzLl9yZWFkYWJsZVN0YXRlfHwodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ZSl9fSk7RS5wcm90b3R5cGUuZGVzdHJveT1Qbi5kZXN0cm95O0UucHJvdG90eXBlLl91bmRlc3Ryb3k9UG4udW5kZXN0cm95O0UucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHIsZSl7ZShyKX07RS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihyLGUpe3ZhciB0PXRoaXMuX3JlYWRhYmxlU3RhdGUsbjtyZXR1cm4gdC5vYmplY3RNb2RlP249ITA6dHlwZW9mIHI9PVwic3RyaW5nXCImJihlPWV8fHQuZGVmYXVsdEVuY29kaW5nLGUhPT10LmVuY29kaW5nJiYocj1adC5mcm9tKHIsZSksZT1cIlwiKSxuPSEwKSxPbyh0aGlzLHIsZSwhMSxuKX07RS5wcm90b3R5cGUudW5zaGlmdD1mdW5jdGlvbihyKXtyZXR1cm4gT28odGhpcyxyLG51bGwsITAsITEpfTtmdW5jdGlvbiBPbyhyLGUsdCxuLGkpe3goXCJyZWFkYWJsZUFkZENodW5rXCIsZSk7dmFyIG89ci5fcmVhZGFibGVTdGF0ZTtpZihlPT09bnVsbClvLnJlYWRpbmc9ITEsTmYocixvKTtlbHNle3ZhciBzO2lmKGl8fChzPVVmKG8sZSkpLHMpVHQocixzKTtlbHNlIGlmKG8ub2JqZWN0TW9kZXx8ZSYmZS5sZW5ndGg+MClpZih0eXBlb2YgZSE9XCJzdHJpbmdcIiYmIW8ub2JqZWN0TW9kZSYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpIT09WnQucHJvdG90eXBlJiYoZT1DZihlKSksbilvLmVuZEVtaXR0ZWQ/VHQocixuZXcga2YpOkluKHIsbyxlLCEwKTtlbHNlIGlmKG8uZW5kZWQpVHQocixuZXcgRmYpO2Vsc2V7aWYoby5kZXN0cm95ZWQpcmV0dXJuITE7by5yZWFkaW5nPSExLG8uZGVjb2RlciYmIXQ/KGU9by5kZWNvZGVyLndyaXRlKGUpLG8ub2JqZWN0TW9kZXx8ZS5sZW5ndGghPT0wP0luKHIsbyxlLCExKTpGbihyLG8pKTpJbihyLG8sZSwhMSl9ZWxzZSBufHwoby5yZWFkaW5nPSExLEZuKHIsbykpfXJldHVybiFvLmVuZGVkJiYoby5sZW5ndGg8by5oaWdoV2F0ZXJNYXJrfHxvLmxlbmd0aD09PTApfWZ1bmN0aW9uIEluKHIsZSx0LG4pe2UuZmxvd2luZyYmZS5sZW5ndGg9PT0wJiYhZS5zeW5jPyhlLmF3YWl0RHJhaW49MCxyLmVtaXQoXCJkYXRhXCIsdCkpOihlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6dC5sZW5ndGgsbj9lLmJ1ZmZlci51bnNoaWZ0KHQpOmUuYnVmZmVyLnB1c2godCksZS5uZWVkUmVhZGFibGUmJnRyKHIpKSxGbihyLGUpfWZ1bmN0aW9uIFVmKHIsZSl7dmFyIHQ7cmV0dXJuIUJmKGUpJiZ0eXBlb2YgZSE9XCJzdHJpbmdcIiYmZSE9PXZvaWQgMCYmIXIub2JqZWN0TW9kZSYmKHQ9bmV3IEFmKFwiY2h1bmtcIixbXCJzdHJpbmdcIixcIkJ1ZmZlclwiLFwiVWludDhBcnJheVwiXSxlKSksdH1FLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9PT0hMX07RS5wcm90b3R5cGUuc2V0RW5jb2Rpbmc9ZnVuY3Rpb24ocil7bnR8fChudD1SbigpLlN0cmluZ0RlY29kZXIpO3ZhciBlPW5ldyBudChyKTt0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9ZSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlci5lbmNvZGluZztmb3IodmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuaGVhZCxuPVwiXCI7dCE9PW51bGw7KW4rPWUud3JpdGUodC5kYXRhKSx0PXQubmV4dDtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIuY2xlYXIoKSxuIT09XCJcIiYmdGhpcy5fcmVhZGFibGVTdGF0ZS5idWZmZXIucHVzaChuKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmxlbmd0aD1uLmxlbmd0aCx0aGlzfTt2YXIgQW89MTA3Mzc0MTgyNDtmdW5jdGlvbiBEZihyKXtyZXR1cm4gcj49QW8/cj1Bbzooci0tLHJ8PXI+Pj4xLHJ8PXI+Pj4yLHJ8PXI+Pj40LHJ8PXI+Pj44LHJ8PXI+Pj4xNixyKyspLHJ9ZnVuY3Rpb24gRm8ocixlKXtyZXR1cm4gcjw9MHx8ZS5sZW5ndGg9PT0wJiZlLmVuZGVkPzA6ZS5vYmplY3RNb2RlPzE6ciE9PXI/ZS5mbG93aW5nJiZlLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoOmUubGVuZ3RoOihyPmUuaGlnaFdhdGVyTWFyayYmKGUuaGlnaFdhdGVyTWFyaz1EZihyKSkscjw9ZS5sZW5ndGg/cjplLmVuZGVkP2UubGVuZ3RoOihlLm5lZWRSZWFkYWJsZT0hMCwwKSl9RS5wcm90b3R5cGUucmVhZD1mdW5jdGlvbihyKXt4KFwicmVhZFwiLHIpLHI9cGFyc2VJbnQociwxMCk7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSx0PXI7aWYociE9PTAmJihlLmVtaXR0ZWRSZWFkYWJsZT0hMSkscj09PTAmJmUubmVlZFJlYWRhYmxlJiYoKGUuaGlnaFdhdGVyTWFyayE9PTA/ZS5sZW5ndGg+PWUuaGlnaFdhdGVyTWFyazplLmxlbmd0aD4wKXx8ZS5lbmRlZCkpcmV0dXJuIHgoXCJyZWFkOiBlbWl0UmVhZGFibGVcIixlLmxlbmd0aCxlLmVuZGVkKSxlLmxlbmd0aD09PTAmJmUuZW5kZWQ/QW4odGhpcyk6dHIodGhpcyksbnVsbDtpZihyPUZvKHIsZSkscj09PTAmJmUuZW5kZWQpcmV0dXJuIGUubGVuZ3RoPT09MCYmQW4odGhpcyksbnVsbDt2YXIgbj1lLm5lZWRSZWFkYWJsZTt4KFwibmVlZCByZWFkYWJsZVwiLG4pLChlLmxlbmd0aD09PTB8fGUubGVuZ3RoLXI8ZS5oaWdoV2F0ZXJNYXJrKSYmKG49ITAseChcImxlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrXCIsbikpLGUuZW5kZWR8fGUucmVhZGluZz8obj0hMSx4KFwicmVhZGluZyBvciBlbmRlZFwiLG4pKTpuJiYoeChcImRvIHJlYWRcIiksZS5yZWFkaW5nPSEwLGUuc3luYz0hMCxlLmxlbmd0aD09PTAmJihlLm5lZWRSZWFkYWJsZT0hMCksdGhpcy5fcmVhZChlLmhpZ2hXYXRlck1hcmspLGUuc3luYz0hMSxlLnJlYWRpbmd8fChyPUZvKHQsZSkpKTt2YXIgaTtyZXR1cm4gcj4wP2k9Tm8ocixlKTppPW51bGwsaT09PW51bGw/KGUubmVlZFJlYWRhYmxlPWUubGVuZ3RoPD1lLmhpZ2hXYXRlck1hcmsscj0wKTooZS5sZW5ndGgtPXIsZS5hd2FpdERyYWluPTApLGUubGVuZ3RoPT09MCYmKGUuZW5kZWR8fChlLm5lZWRSZWFkYWJsZT0hMCksdCE9PXImJmUuZW5kZWQmJkFuKHRoaXMpKSxpIT09bnVsbCYmdGhpcy5lbWl0KFwiZGF0YVwiLGkpLGl9O2Z1bmN0aW9uIE5mKHIsZSl7aWYoeChcIm9uRW9mQ2h1bmtcIiksIWUuZW5kZWQpe2lmKGUuZGVjb2Rlcil7dmFyIHQ9ZS5kZWNvZGVyLmVuZCgpO3QmJnQubGVuZ3RoJiYoZS5idWZmZXIucHVzaCh0KSxlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6dC5sZW5ndGgpfWUuZW5kZWQ9ITAsZS5zeW5jP3RyKHIpOihlLm5lZWRSZWFkYWJsZT0hMSxlLmVtaXR0ZWRSZWFkYWJsZXx8KGUuZW1pdHRlZFJlYWRhYmxlPSEwLFVvKHIpKSl9fWZ1bmN0aW9uIHRyKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7eChcImVtaXRSZWFkYWJsZVwiLGUubmVlZFJlYWRhYmxlLGUuZW1pdHRlZFJlYWRhYmxlKSxlLm5lZWRSZWFkYWJsZT0hMSxlLmVtaXR0ZWRSZWFkYWJsZXx8KHgoXCJlbWl0UmVhZGFibGVcIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLHByb2Nlc3MubmV4dFRpY2soVW8scikpfWZ1bmN0aW9uIFVvKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7eChcImVtaXRSZWFkYWJsZV9cIixlLmRlc3Ryb3llZCxlLmxlbmd0aCxlLmVuZGVkKSwhZS5kZXN0cm95ZWQmJihlLmxlbmd0aHx8ZS5lbmRlZCkmJihyLmVtaXQoXCJyZWFkYWJsZVwiKSxlLmVtaXR0ZWRSZWFkYWJsZT0hMSksZS5uZWVkUmVhZGFibGU9IWUuZmxvd2luZyYmIWUuZW5kZWQmJmUubGVuZ3RoPD1lLmhpZ2hXYXRlck1hcmssa24ocil9ZnVuY3Rpb24gRm4ocixlKXtlLnJlYWRpbmdNb3JlfHwoZS5yZWFkaW5nTW9yZT0hMCxwcm9jZXNzLm5leHRUaWNrKEhmLHIsZSkpfWZ1bmN0aW9uIEhmKHIsZSl7Zm9yKDshZS5yZWFkaW5nJiYhZS5lbmRlZCYmKGUubGVuZ3RoPGUuaGlnaFdhdGVyTWFya3x8ZS5mbG93aW5nJiZlLmxlbmd0aD09PTApOyl7dmFyIHQ9ZS5sZW5ndGg7aWYoeChcIm1heWJlUmVhZE1vcmUgcmVhZCAwXCIpLHIucmVhZCgwKSx0PT09ZS5sZW5ndGgpYnJlYWt9ZS5yZWFkaW5nTW9yZT0hMX1FLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbihyKXtUdCh0aGlzLG5ldyBQZihcIl9yZWFkKClcIikpfTtFLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHIsZSl7dmFyIHQ9dGhpcyxuPXRoaXMuX3JlYWRhYmxlU3RhdGU7c3dpdGNoKG4ucGlwZXNDb3VudCl7Y2FzZSAwOm4ucGlwZXM9cjticmVhaztjYXNlIDE6bi5waXBlcz1bbi5waXBlcyxyXTticmVhaztkZWZhdWx0Om4ucGlwZXMucHVzaChyKTticmVha31uLnBpcGVzQ291bnQrPTEseChcInBpcGUgY291bnQ9JWQgb3B0cz0lalwiLG4ucGlwZXNDb3VudCxlKTt2YXIgaT0oIWV8fGUuZW5kIT09ITEpJiZyIT09cHJvY2Vzcy5zdGRvdXQmJnIhPT1wcm9jZXNzLnN0ZGVycixvPWk/YTp5O24uZW5kRW1pdHRlZD9wcm9jZXNzLm5leHRUaWNrKG8pOnQub25jZShcImVuZFwiLG8pLHIub24oXCJ1bnBpcGVcIixzKTtmdW5jdGlvbiBzKHcsXyl7eChcIm9udW5waXBlXCIpLHc9PT10JiZfJiZfLmhhc1VucGlwZWQ9PT0hMSYmKF8uaGFzVW5waXBlZD0hMCxsKCkpfWZ1bmN0aW9uIGEoKXt4KFwib25lbmRcIiksci5lbmQoKX12YXIgdT1xZih0KTtyLm9uKFwiZHJhaW5cIix1KTt2YXIgZj0hMTtmdW5jdGlvbiBsKCl7eChcImNsZWFudXBcIiksci5yZW1vdmVMaXN0ZW5lcihcImNsb3NlXCIsbSksci5yZW1vdmVMaXN0ZW5lcihcImZpbmlzaFwiLGIpLHIucmVtb3ZlTGlzdGVuZXIoXCJkcmFpblwiLHUpLHIucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLGgpLHIucmVtb3ZlTGlzdGVuZXIoXCJ1bnBpcGVcIixzKSx0LnJlbW92ZUxpc3RlbmVyKFwiZW5kXCIsYSksdC5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLHkpLHQucmVtb3ZlTGlzdGVuZXIoXCJkYXRhXCIsZCksZj0hMCxuLmF3YWl0RHJhaW4mJighci5fd3JpdGFibGVTdGF0ZXx8ci5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW4pJiZ1KCl9dC5vbihcImRhdGFcIixkKTtmdW5jdGlvbiBkKHcpe3goXCJvbmRhdGFcIik7dmFyIF89ci53cml0ZSh3KTt4KFwiZGVzdC53cml0ZVwiLF8pLF89PT0hMSYmKChuLnBpcGVzQ291bnQ9PT0xJiZuLnBpcGVzPT09cnx8bi5waXBlc0NvdW50PjEmJkhvKG4ucGlwZXMscikhPT0tMSkmJiFmJiYoeChcImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZVwiLG4uYXdhaXREcmFpbiksbi5hd2FpdERyYWluKyspLHQucGF1c2UoKSl9ZnVuY3Rpb24gaCh3KXt4KFwib25lcnJvclwiLHcpLHkoKSxyLnJlbW92ZUxpc3RlbmVyKFwiZXJyb3JcIixoKSxQbyhyLFwiZXJyb3JcIik9PT0wJiZUdChyLHcpfU9mKHIsXCJlcnJvclwiLGgpO2Z1bmN0aW9uIG0oKXtyLnJlbW92ZUxpc3RlbmVyKFwiZmluaXNoXCIsYikseSgpfXIub25jZShcImNsb3NlXCIsbSk7ZnVuY3Rpb24gYigpe3goXCJvbmZpbmlzaFwiKSxyLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixtKSx5KCl9ci5vbmNlKFwiZmluaXNoXCIsYik7ZnVuY3Rpb24geSgpe3goXCJ1bnBpcGVcIiksdC51bnBpcGUocil9cmV0dXJuIHIuZW1pdChcInBpcGVcIix0KSxuLmZsb3dpbmd8fCh4KFwicGlwZSByZXN1bWVcIiksdC5yZXN1bWUoKSkscn07ZnVuY3Rpb24gcWYocil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9ci5fcmVhZGFibGVTdGF0ZTt4KFwicGlwZU9uRHJhaW5cIix0LmF3YWl0RHJhaW4pLHQuYXdhaXREcmFpbiYmdC5hd2FpdERyYWluLS0sdC5hd2FpdERyYWluPT09MCYmUG8ocixcImRhdGFcIikmJih0LmZsb3dpbmc9ITAsa24ocikpfX1FLnByb3RvdHlwZS51bnBpcGU9ZnVuY3Rpb24ocil7dmFyIGU9dGhpcy5fcmVhZGFibGVTdGF0ZSx0PXtoYXNVbnBpcGVkOiExfTtpZihlLnBpcGVzQ291bnQ9PT0wKXJldHVybiB0aGlzO2lmKGUucGlwZXNDb3VudD09PTEpcmV0dXJuIHImJnIhPT1lLnBpcGVzP3RoaXM6KHJ8fChyPWUucGlwZXMpLGUucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITEsciYmci5lbWl0KFwidW5waXBlXCIsdGhpcyx0KSx0aGlzKTtpZighcil7dmFyIG49ZS5waXBlcyxpPWUucGlwZXNDb3VudDtlLnBpcGVzPW51bGwsZS5waXBlc0NvdW50PTAsZS5mbG93aW5nPSExO2Zvcih2YXIgbz0wO288aTtvKyspbltvXS5lbWl0KFwidW5waXBlXCIsdGhpcyx7aGFzVW5waXBlZDohMX0pO3JldHVybiB0aGlzfXZhciBzPUhvKGUucGlwZXMscik7cmV0dXJuIHM9PT0tMT90aGlzOihlLnBpcGVzLnNwbGljZShzLDEpLGUucGlwZXNDb3VudC09MSxlLnBpcGVzQ291bnQ9PT0xJiYoZS5waXBlcz1lLnBpcGVzWzBdKSxyLmVtaXQoXCJ1bnBpcGVcIix0aGlzLHQpLHRoaXMpfTtFLnByb3RvdHlwZS5vbj1mdW5jdGlvbihyLGUpe3ZhciB0PUN0LnByb3RvdHlwZS5vbi5jYWxsKHRoaXMscixlKSxuPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHI9PT1cImRhdGFcIj8obi5yZWFkYWJsZUxpc3RlbmluZz10aGlzLmxpc3RlbmVyQ291bnQoXCJyZWFkYWJsZVwiKT4wLG4uZmxvd2luZyE9PSExJiZ0aGlzLnJlc3VtZSgpKTpyPT09XCJyZWFkYWJsZVwiJiYhbi5lbmRFbWl0dGVkJiYhbi5yZWFkYWJsZUxpc3RlbmluZyYmKG4ucmVhZGFibGVMaXN0ZW5pbmc9bi5uZWVkUmVhZGFibGU9ITAsbi5mbG93aW5nPSExLG4uZW1pdHRlZFJlYWRhYmxlPSExLHgoXCJvbiByZWFkYWJsZVwiLG4ubGVuZ3RoLG4ucmVhZGluZyksbi5sZW5ndGg/dHIodGhpcyk6bi5yZWFkaW5nfHxwcm9jZXNzLm5leHRUaWNrKGpmLHRoaXMpKSx0fTtFLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1FLnByb3RvdHlwZS5vbjtFLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihyLGUpe3ZhciB0PUN0LnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lci5jYWxsKHRoaXMscixlKTtyZXR1cm4gcj09PVwicmVhZGFibGVcIiYmcHJvY2Vzcy5uZXh0VGljayhEbyx0aGlzKSx0fTtFLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24ocil7dmFyIGU9Q3QucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuKHI9PT1cInJlYWRhYmxlXCJ8fHI9PT12b2lkIDApJiZwcm9jZXNzLm5leHRUaWNrKERvLHRoaXMpLGV9O2Z1bmN0aW9uIERvKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7ZS5yZWFkYWJsZUxpc3RlbmluZz1yLmxpc3RlbmVyQ291bnQoXCJyZWFkYWJsZVwiKT4wLGUucmVzdW1lU2NoZWR1bGVkJiYhZS5wYXVzZWQ/ZS5mbG93aW5nPSEwOnIubGlzdGVuZXJDb3VudChcImRhdGFcIik+MCYmci5yZXN1bWUoKX1mdW5jdGlvbiBqZihyKXt4KFwicmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwXCIpLHIucmVhZCgwKX1FLnByb3RvdHlwZS5yZXN1bWU9ZnVuY3Rpb24oKXt2YXIgcj10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiByLmZsb3dpbmd8fCh4KFwicmVzdW1lXCIpLHIuZmxvd2luZz0hci5yZWFkYWJsZUxpc3RlbmluZyxXZih0aGlzLHIpKSxyLnBhdXNlZD0hMSx0aGlzfTtmdW5jdGlvbiBXZihyLGUpe2UucmVzdW1lU2NoZWR1bGVkfHwoZS5yZXN1bWVTY2hlZHVsZWQ9ITAscHJvY2Vzcy5uZXh0VGljaygkZixyLGUpKX1mdW5jdGlvbiAkZihyLGUpe3goXCJyZXN1bWVcIixlLnJlYWRpbmcpLGUucmVhZGluZ3x8ci5yZWFkKDApLGUucmVzdW1lU2NoZWR1bGVkPSExLHIuZW1pdChcInJlc3VtZVwiKSxrbihyKSxlLmZsb3dpbmcmJiFlLnJlYWRpbmcmJnIucmVhZCgwKX1FLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiB4KFwiY2FsbCBwYXVzZSBmbG93aW5nPSVqXCIsdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmchPT0hMSYmKHgoXCJwYXVzZVwiKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmc9ITEsdGhpcy5lbWl0KFwicGF1c2VcIikpLHRoaXMuX3JlYWRhYmxlU3RhdGUucGF1c2VkPSEwLHRoaXN9O2Z1bmN0aW9uIGtuKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7Zm9yKHgoXCJmbG93XCIsZS5mbG93aW5nKTtlLmZsb3dpbmcmJnIucmVhZCgpIT09bnVsbDspO31FLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHIpe3ZhciBlPXRoaXMsdD10aGlzLl9yZWFkYWJsZVN0YXRlLG49ITE7ci5vbihcImVuZFwiLGZ1bmN0aW9uKCl7aWYoeChcIndyYXBwZWQgZW5kXCIpLHQuZGVjb2RlciYmIXQuZW5kZWQpe3ZhciBzPXQuZGVjb2Rlci5lbmQoKTtzJiZzLmxlbmd0aCYmZS5wdXNoKHMpfWUucHVzaChudWxsKX0pLHIub24oXCJkYXRhXCIsZnVuY3Rpb24ocyl7aWYoeChcIndyYXBwZWQgZGF0YVwiKSx0LmRlY29kZXImJihzPXQuZGVjb2Rlci53cml0ZShzKSksISh0Lm9iamVjdE1vZGUmJnM9PW51bGwpJiYhKCF0Lm9iamVjdE1vZGUmJighc3x8IXMubGVuZ3RoKSkpe3ZhciBhPWUucHVzaChzKTthfHwobj0hMCxyLnBhdXNlKCkpfX0pO2Zvcih2YXIgaSBpbiByKXRoaXNbaV09PT12b2lkIDAmJnR5cGVvZiByW2ldPT1cImZ1bmN0aW9uXCImJih0aGlzW2ldPWZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiByW2FdLmFwcGx5KHIsYXJndW1lbnRzKX19KGkpKTtmb3IodmFyIG89MDtvPExuLmxlbmd0aDtvKyspci5vbihMbltvXSx0aGlzLmVtaXQuYmluZCh0aGlzLExuW29dKSk7cmV0dXJuIHRoaXMuX3JlYWQ9ZnVuY3Rpb24ocyl7eChcIndyYXBwZWQgX3JlYWRcIixzKSxuJiYobj0hMSxyLnJlc3VtZSgpKX0sdGhpc307dHlwZW9mIFN5bWJvbD09XCJmdW5jdGlvblwiJiYoRS5wcm90b3R5cGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIEJuPT09dm9pZCAwJiYoQm49TW8oKSksQm4odGhpcyl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5wcm90b3R5cGUsXCJyZWFkYWJsZUhpZ2hXYXRlck1hcmtcIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShFLnByb3RvdHlwZSxcInJlYWRhYmxlQnVmZmVyXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuYnVmZmVyfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShFLnByb3RvdHlwZSxcInJlYWRhYmxlRmxvd2luZ1wiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmd9LHNldDpmdW5jdGlvbihlKXt0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPWUpfX0pO0UuX2Zyb21MaXN0PU5vO09iamVjdC5kZWZpbmVQcm9wZXJ0eShFLnByb3RvdHlwZSxcInJlYWRhYmxlTGVuZ3RoXCIse2VudW1lcmFibGU6ITEsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUubGVuZ3RofX0pO2Z1bmN0aW9uIE5vKHIsZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBudWxsO3ZhciB0O3JldHVybiBlLm9iamVjdE1vZGU/dD1lLmJ1ZmZlci5zaGlmdCgpOiFyfHxyPj1lLmxlbmd0aD8oZS5kZWNvZGVyP3Q9ZS5idWZmZXIuam9pbihcIlwiKTplLmJ1ZmZlci5sZW5ndGg9PT0xP3Q9ZS5idWZmZXIuZmlyc3QoKTp0PWUuYnVmZmVyLmNvbmNhdChlLmxlbmd0aCksZS5idWZmZXIuY2xlYXIoKSk6dD1lLmJ1ZmZlci5jb25zdW1lKHIsZS5kZWNvZGVyKSx0fWZ1bmN0aW9uIEFuKHIpe3ZhciBlPXIuX3JlYWRhYmxlU3RhdGU7eChcImVuZFJlYWRhYmxlXCIsZS5lbmRFbWl0dGVkKSxlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLHByb2Nlc3MubmV4dFRpY2soR2YsZSxyKSl9ZnVuY3Rpb24gR2YocixlKXtpZih4KFwiZW5kUmVhZGFibGVOVFwiLHIuZW5kRW1pdHRlZCxyLmxlbmd0aCksIXIuZW5kRW1pdHRlZCYmci5sZW5ndGg9PT0wJiYoci5lbmRFbWl0dGVkPSEwLGUucmVhZGFibGU9ITEsZS5lbWl0KFwiZW5kXCIpLHIuYXV0b0Rlc3Ryb3kpKXt2YXIgdD1lLl93cml0YWJsZVN0YXRlOyghdHx8dC5hdXRvRGVzdHJveSYmdC5maW5pc2hlZCkmJmUuZGVzdHJveSgpfX10eXBlb2YgU3ltYm9sPT1cImZ1bmN0aW9uXCImJihFLmZyb209ZnVuY3Rpb24ocixlKXtyZXR1cm4gTW49PT12b2lkIDAmJihNbj1JbygpKSxNbihFLHIsZSl9KTtmdW5jdGlvbiBIbyhyLGUpe2Zvcih2YXIgdD0wLG49ci5sZW5ndGg7dDxuO3QrKylpZihyW3RdPT09ZSlyZXR1cm4gdDtyZXR1cm4tMX19KTt2YXIgT249UygoTGwsV28pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO1dvLmV4cG9ydHM9bWU7dmFyIHJyPVVlKCkuY29kZXMsVmY9cnIuRVJSX01FVEhPRF9OT1RfSU1QTEVNRU5URUQsemY9cnIuRVJSX01VTFRJUExFX0NBTExCQUNLLFlmPXJyLkVSUl9UUkFOU0ZPUk1fQUxSRUFEWV9UUkFOU0ZPUk1JTkcsS2Y9cnIuRVJSX1RSQU5TRk9STV9XSVRIX0xFTkdUSF8wLG5yPURlKCk7T2UoKShtZSxucik7ZnVuY3Rpb24gWGYocixlKXt2YXIgdD10aGlzLl90cmFuc2Zvcm1TdGF0ZTt0LnRyYW5zZm9ybWluZz0hMTt2YXIgbj10LndyaXRlY2I7aWYobj09PW51bGwpcmV0dXJuIHRoaXMuZW1pdChcImVycm9yXCIsbmV3IHpmKTt0LndyaXRlY2h1bms9bnVsbCx0LndyaXRlY2I9bnVsbCxlIT1udWxsJiZ0aGlzLnB1c2goZSksbihyKTt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlO2kucmVhZGluZz0hMSwoaS5uZWVkUmVhZGFibGV8fGkubGVuZ3RoPGkuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoaS5oaWdoV2F0ZXJNYXJrKX1mdW5jdGlvbiBtZShyKXtpZighKHRoaXMgaW5zdGFuY2VvZiBtZSkpcmV0dXJuIG5ldyBtZShyKTtuci5jYWxsKHRoaXMsciksdGhpcy5fdHJhbnNmb3JtU3RhdGU9e2FmdGVyVHJhbnNmb3JtOlhmLmJpbmQodGhpcyksbmVlZFRyYW5zZm9ybTohMSx0cmFuc2Zvcm1pbmc6ITEsd3JpdGVjYjpudWxsLHdyaXRlY2h1bms6bnVsbCx3cml0ZWVuY29kaW5nOm51bGx9LHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlPSEwLHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYz0hMSxyJiYodHlwZW9mIHIudHJhbnNmb3JtPT1cImZ1bmN0aW9uXCImJih0aGlzLl90cmFuc2Zvcm09ci50cmFuc2Zvcm0pLHR5cGVvZiByLmZsdXNoPT1cImZ1bmN0aW9uXCImJih0aGlzLl9mbHVzaD1yLmZsdXNoKSksdGhpcy5vbihcInByZWZpbmlzaFwiLEpmKX1mdW5jdGlvbiBKZigpe3ZhciByPXRoaXM7dHlwZW9mIHRoaXMuX2ZsdXNoPT1cImZ1bmN0aW9uXCImJiF0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD90aGlzLl9mbHVzaChmdW5jdGlvbihlLHQpe2pvKHIsZSx0KX0pOmpvKHRoaXMsbnVsbCxudWxsKX1tZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihyLGUpe3JldHVybiB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtPSExLG5yLnByb3RvdHlwZS5wdXNoLmNhbGwodGhpcyxyLGUpfTttZS5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbihyLGUsdCl7dChuZXcgVmYoXCJfdHJhbnNmb3JtKClcIikpfTttZS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHIsZSx0KXt2YXIgbj10aGlzLl90cmFuc2Zvcm1TdGF0ZTtpZihuLndyaXRlY2I9dCxuLndyaXRlY2h1bms9cixuLndyaXRlZW5jb2Rpbmc9ZSwhbi50cmFuc2Zvcm1pbmcpe3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7KG4ubmVlZFRyYW5zZm9ybXx8aS5uZWVkUmVhZGFibGV8fGkubGVuZ3RoPGkuaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoaS5oaWdoV2F0ZXJNYXJrKX19O21lLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbihyKXt2YXIgZT10aGlzLl90cmFuc2Zvcm1TdGF0ZTtlLndyaXRlY2h1bmshPT1udWxsJiYhZS50cmFuc2Zvcm1pbmc/KGUudHJhbnNmb3JtaW5nPSEwLHRoaXMuX3RyYW5zZm9ybShlLndyaXRlY2h1bmssZS53cml0ZWVuY29kaW5nLGUuYWZ0ZXJUcmFuc2Zvcm0pKTplLm5lZWRUcmFuc2Zvcm09ITB9O21lLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbihyLGUpe25yLnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMscixmdW5jdGlvbih0KXtlKHQpfSl9O2Z1bmN0aW9uIGpvKHIsZSx0KXtpZihlKXJldHVybiByLmVtaXQoXCJlcnJvclwiLGUpO2lmKHQhPW51bGwmJnIucHVzaCh0KSxyLl93cml0YWJsZVN0YXRlLmxlbmd0aCl0aHJvdyBuZXcgS2Y7aWYoci5fdHJhbnNmb3JtU3RhdGUudHJhbnNmb3JtaW5nKXRocm93IG5ldyBZZjtyZXR1cm4gci5wdXNoKG51bGwpfX0pO3ZhciBWbz1TKChJbCxHbyk9PntcInVzZSBzdHJpY3RcIjtjKCk7R28uZXhwb3J0cz1CdDt2YXIgJG89T24oKTtPZSgpKEJ0LCRvKTtmdW5jdGlvbiBCdChyKXtpZighKHRoaXMgaW5zdGFuY2VvZiBCdCkpcmV0dXJuIG5ldyBCdChyKTskby5jYWxsKHRoaXMscil9QnQucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24ocixlLHQpe3QobnVsbCxyKX19KTt2YXIgSm89UygoQWwsWG8pPT57XCJ1c2Ugc3RyaWN0XCI7YygpO3ZhciBVbjtmdW5jdGlvbiBRZihyKXt2YXIgZT0hMTtyZXR1cm4gZnVuY3Rpb24oKXtlfHwoZT0hMCxyLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpKX19dmFyIEtvPVVlKCkuY29kZXMsWmY9S28uRVJSX01JU1NJTkdfQVJHUyxlYz1Lby5FUlJfU1RSRUFNX0RFU1RST1lFRDtmdW5jdGlvbiB6byhyKXtpZihyKXRocm93IHJ9ZnVuY3Rpb24gdGMocil7cmV0dXJuIHIuc2V0SGVhZGVyJiZ0eXBlb2Ygci5hYm9ydD09XCJmdW5jdGlvblwifWZ1bmN0aW9uIHJjKHIsZSx0LG4pe249UWYobik7dmFyIGk9ITE7ci5vbihcImNsb3NlXCIsZnVuY3Rpb24oKXtpPSEwfSksVW49PT12b2lkIDAmJihVbj1YdCgpKSxVbihyLHtyZWFkYWJsZTplLHdyaXRhYmxlOnR9LGZ1bmN0aW9uKHMpe2lmKHMpcmV0dXJuIG4ocyk7aT0hMCxuKCl9KTt2YXIgbz0hMTtyZXR1cm4gZnVuY3Rpb24ocyl7aWYoIWkmJiFvKXtpZihvPSEwLHRjKHIpKXJldHVybiByLmFib3J0KCk7aWYodHlwZW9mIHIuZGVzdHJveT09XCJmdW5jdGlvblwiKXJldHVybiByLmRlc3Ryb3koKTtuKHN8fG5ldyBlYyhcInBpcGVcIikpfX19ZnVuY3Rpb24gWW8ocil7cigpfWZ1bmN0aW9uIG5jKHIsZSl7cmV0dXJuIHIucGlwZShlKX1mdW5jdGlvbiBpYyhyKXtyZXR1cm4hci5sZW5ndGh8fHR5cGVvZiByW3IubGVuZ3RoLTFdIT1cImZ1bmN0aW9uXCI/em86ci5wb3AoKX1mdW5jdGlvbiBvYygpe2Zvcih2YXIgcj1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHIpLHQ9MDt0PHI7dCsrKWVbdF09YXJndW1lbnRzW3RdO3ZhciBuPWljKGUpO2lmKEFycmF5LmlzQXJyYXkoZVswXSkmJihlPWVbMF0pLGUubGVuZ3RoPDIpdGhyb3cgbmV3IFpmKFwic3RyZWFtc1wiKTt2YXIgaSxvPWUubWFwKGZ1bmN0aW9uKHMsYSl7dmFyIHU9YTxlLmxlbmd0aC0xLGY9YT4wO3JldHVybiByYyhzLHUsZixmdW5jdGlvbihsKXtpfHwoaT1sKSxsJiZvLmZvckVhY2goWW8pLCF1JiYoby5mb3JFYWNoKFlvKSxuKGkpKX0pfSk7cmV0dXJuIGUucmVkdWNlKG5jKX1Yby5leHBvcnRzPW9jfSk7dmFyIE49UygoRmwsUW8pPT57YygpO1FvLmV4cG9ydHM9Sjt2YXIgRG49amkoKS5FdmVudEVtaXR0ZXIsc2M9T2UoKTtzYyhKLERuKTtKLlJlYWRhYmxlPXduKCk7Si5Xcml0YWJsZT1ibigpO0ouRHVwbGV4PURlKCk7Si5UcmFuc2Zvcm09T24oKTtKLlBhc3NUaHJvdWdoPVZvKCk7Si5maW5pc2hlZD1YdCgpO0oucGlwZWxpbmU9Sm8oKTtKLlN0cmVhbT1KO2Z1bmN0aW9uIEooKXtEbi5jYWxsKHRoaXMpfUoucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24ocixlKXt2YXIgdD10aGlzO2Z1bmN0aW9uIG4obCl7ci53cml0YWJsZSYmci53cml0ZShsKT09PSExJiZ0LnBhdXNlJiZ0LnBhdXNlKCl9dC5vbihcImRhdGFcIixuKTtmdW5jdGlvbiBpKCl7dC5yZWFkYWJsZSYmdC5yZXN1bWUmJnQucmVzdW1lKCl9ci5vbihcImRyYWluXCIsaSksIXIuX2lzU3RkaW8mJighZXx8ZS5lbmQhPT0hMSkmJih0Lm9uKFwiZW5kXCIscyksdC5vbihcImNsb3NlXCIsYSkpO3ZhciBvPSExO2Z1bmN0aW9uIHMoKXtvfHwobz0hMCxyLmVuZCgpKX1mdW5jdGlvbiBhKCl7b3x8KG89ITAsdHlwZW9mIHIuZGVzdHJveT09XCJmdW5jdGlvblwiJiZyLmRlc3Ryb3koKSl9ZnVuY3Rpb24gdShsKXtpZihmKCksRG4ubGlzdGVuZXJDb3VudCh0aGlzLFwiZXJyb3JcIik9PT0wKXRocm93IGx9dC5vbihcImVycm9yXCIsdSksci5vbihcImVycm9yXCIsdSk7ZnVuY3Rpb24gZigpe3QucmVtb3ZlTGlzdGVuZXIoXCJkYXRhXCIsbiksci5yZW1vdmVMaXN0ZW5lcihcImRyYWluXCIsaSksdC5yZW1vdmVMaXN0ZW5lcihcImVuZFwiLHMpLHQucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLGEpLHQucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLHUpLHIucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLHUpLHQucmVtb3ZlTGlzdGVuZXIoXCJlbmRcIixmKSx0LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixmKSxyLnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIixmKX1yZXR1cm4gdC5vbihcImVuZFwiLGYpLHQub24oXCJjbG9zZVwiLGYpLHIub24oXCJjbG9zZVwiLGYpLHIuZW1pdChcInBpcGVcIix0KSxyfX0pO3ZhciB1cz1TKCh5ZCxhcyk9PntjKCk7dmFyIGF0PTFlMyx1dD1hdCo2MCxmdD11dCo2MCwkZT1mdCoyNCxmYz0kZSo3LGNjPSRlKjM2NS4yNTthcy5leHBvcnRzPWZ1bmN0aW9uKHIsZSl7ZT1lfHx7fTt2YXIgdD10eXBlb2YgcjtpZih0PT09XCJzdHJpbmdcIiYmci5sZW5ndGg+MClyZXR1cm4gbGMocik7aWYodD09PVwibnVtYmVyXCImJmlzRmluaXRlKHIpKXJldHVybiBlLmxvbmc/cGMocik6ZGMocik7dGhyb3cgbmV3IEVycm9yKFwidmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD1cIitKU09OLnN0cmluZ2lmeShyKSl9O2Z1bmN0aW9uIGxjKHIpe2lmKHI9U3RyaW5nKHIpLCEoci5sZW5ndGg+MTAwKSl7dmFyIGU9L14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKHIpO2lmKCEhZSl7dmFyIHQ9cGFyc2VGbG9hdChlWzFdKSxuPShlWzJdfHxcIm1zXCIpLnRvTG93ZXJDYXNlKCk7c3dpdGNoKG4pe2Nhc2VcInllYXJzXCI6Y2FzZVwieWVhclwiOmNhc2VcInlyc1wiOmNhc2VcInlyXCI6Y2FzZVwieVwiOnJldHVybiB0KmNjO2Nhc2VcIndlZWtzXCI6Y2FzZVwid2Vla1wiOmNhc2VcIndcIjpyZXR1cm4gdCpmYztjYXNlXCJkYXlzXCI6Y2FzZVwiZGF5XCI6Y2FzZVwiZFwiOnJldHVybiB0KiRlO2Nhc2VcImhvdXJzXCI6Y2FzZVwiaG91clwiOmNhc2VcImhyc1wiOmNhc2VcImhyXCI6Y2FzZVwiaFwiOnJldHVybiB0KmZ0O2Nhc2VcIm1pbnV0ZXNcIjpjYXNlXCJtaW51dGVcIjpjYXNlXCJtaW5zXCI6Y2FzZVwibWluXCI6Y2FzZVwibVwiOnJldHVybiB0KnV0O2Nhc2VcInNlY29uZHNcIjpjYXNlXCJzZWNvbmRcIjpjYXNlXCJzZWNzXCI6Y2FzZVwic2VjXCI6Y2FzZVwic1wiOnJldHVybiB0KmF0O2Nhc2VcIm1pbGxpc2Vjb25kc1wiOmNhc2VcIm1pbGxpc2Vjb25kXCI6Y2FzZVwibXNlY3NcIjpjYXNlXCJtc2VjXCI6Y2FzZVwibXNcIjpyZXR1cm4gdDtkZWZhdWx0OnJldHVybn19fX1mdW5jdGlvbiBkYyhyKXt2YXIgZT1NYXRoLmFicyhyKTtyZXR1cm4gZT49JGU/TWF0aC5yb3VuZChyLyRlKStcImRcIjplPj1mdD9NYXRoLnJvdW5kKHIvZnQpK1wiaFwiOmU+PXV0P01hdGgucm91bmQoci91dCkrXCJtXCI6ZT49YXQ/TWF0aC5yb3VuZChyL2F0KStcInNcIjpyK1wibXNcIn1mdW5jdGlvbiBwYyhyKXt2YXIgZT1NYXRoLmFicyhyKTtyZXR1cm4gZT49JGU/ZnIocixlLCRlLFwiZGF5XCIpOmU+PWZ0P2ZyKHIsZSxmdCxcImhvdXJcIik6ZT49dXQ/ZnIocixlLHV0LFwibWludXRlXCIpOmU+PWF0P2ZyKHIsZSxhdCxcInNlY29uZFwiKTpyK1wiIG1zXCJ9ZnVuY3Rpb24gZnIocixlLHQsbil7dmFyIGk9ZT49dCoxLjU7cmV0dXJuIE1hdGgucm91bmQoci90KStcIiBcIituKyhpP1wic1wiOlwiXCIpfX0pO3ZhciBjcz1TKChiZCxmcyk9PntjKCk7ZnVuY3Rpb24gaGMocil7dC5kZWJ1Zz10LHQuZGVmYXVsdD10LHQuY29lcmNlPXUsdC5kaXNhYmxlPW8sdC5lbmFibGU9aSx0LmVuYWJsZWQ9cyx0Lmh1bWFuaXplPXVzKCksdC5kZXN0cm95PWYsT2JqZWN0LmtleXMocikuZm9yRWFjaChsPT57dFtsXT1yW2xdfSksdC5uYW1lcz1bXSx0LnNraXBzPVtdLHQuZm9ybWF0dGVycz17fTtmdW5jdGlvbiBlKGwpe2xldCBkPTA7Zm9yKGxldCBoPTA7aDxsLmxlbmd0aDtoKyspZD0oZDw8NSktZCtsLmNoYXJDb2RlQXQoaCksZHw9MDtyZXR1cm4gdC5jb2xvcnNbTWF0aC5hYnMoZCkldC5jb2xvcnMubGVuZ3RoXX10LnNlbGVjdENvbG9yPWU7ZnVuY3Rpb24gdChsKXtsZXQgZCxoPW51bGwsbSxiO2Z1bmN0aW9uIHkoLi4udyl7aWYoIXkuZW5hYmxlZClyZXR1cm47bGV0IF89eSx2PU51bWJlcihuZXcgRGF0ZSkscT12LShkfHx2KTtfLmRpZmY9cSxfLnByZXY9ZCxfLmN1cnI9dixkPXYsd1swXT10LmNvZXJjZSh3WzBdKSx0eXBlb2Ygd1swXSE9XCJzdHJpbmdcIiYmdy51bnNoaWZ0KFwiJU9cIik7bGV0IEE9MDt3WzBdPXdbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csKFksR2UpPT57aWYoWT09PVwiJSVcIilyZXR1cm5cIiVcIjtBKys7bGV0IEllPXQuZm9ybWF0dGVyc1tHZV07aWYodHlwZW9mIEllPT1cImZ1bmN0aW9uXCIpe2xldCBBZT13W0FdO1k9SWUuY2FsbChfLEFlKSx3LnNwbGljZShBLDEpLEEtLX1yZXR1cm4gWX0pLHQuZm9ybWF0QXJncy5jYWxsKF8sdyksKF8ubG9nfHx0LmxvZykuYXBwbHkoXyx3KX1yZXR1cm4geS5uYW1lc3BhY2U9bCx5LnVzZUNvbG9ycz10LnVzZUNvbG9ycygpLHkuY29sb3I9dC5zZWxlY3RDb2xvcihsKSx5LmV4dGVuZD1uLHkuZGVzdHJveT10LmRlc3Ryb3ksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksXCJlbmFibGVkXCIse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiExLGdldDooKT0+aCE9PW51bGw/aDoobSE9PXQubmFtZXNwYWNlcyYmKG09dC5uYW1lc3BhY2VzLGI9dC5lbmFibGVkKGwpKSxiKSxzZXQ6dz0+e2g9d319KSx0eXBlb2YgdC5pbml0PT1cImZ1bmN0aW9uXCImJnQuaW5pdCh5KSx5fWZ1bmN0aW9uIG4obCxkKXtsZXQgaD10KHRoaXMubmFtZXNwYWNlKyh0eXBlb2YgZD5cInVcIj9cIjpcIjpkKStsKTtyZXR1cm4gaC5sb2c9dGhpcy5sb2csaH1mdW5jdGlvbiBpKGwpe3Quc2F2ZShsKSx0Lm5hbWVzcGFjZXM9bCx0Lm5hbWVzPVtdLHQuc2tpcHM9W107bGV0IGQsaD0odHlwZW9mIGw9PVwic3RyaW5nXCI/bDpcIlwiKS5zcGxpdCgvW1xccyxdKy8pLG09aC5sZW5ndGg7Zm9yKGQ9MDtkPG07ZCsrKSFoW2RdfHwobD1oW2RdLnJlcGxhY2UoL1xcKi9nLFwiLio/XCIpLGxbMF09PT1cIi1cIj90LnNraXBzLnB1c2gobmV3IFJlZ0V4cChcIl5cIitsLnNsaWNlKDEpK1wiJFwiKSk6dC5uYW1lcy5wdXNoKG5ldyBSZWdFeHAoXCJeXCIrbCtcIiRcIikpKX1mdW5jdGlvbiBvKCl7bGV0IGw9Wy4uLnQubmFtZXMubWFwKGEpLC4uLnQuc2tpcHMubWFwKGEpLm1hcChkPT5cIi1cIitkKV0uam9pbihcIixcIik7cmV0dXJuIHQuZW5hYmxlKFwiXCIpLGx9ZnVuY3Rpb24gcyhsKXtpZihsW2wubGVuZ3RoLTFdPT09XCIqXCIpcmV0dXJuITA7bGV0IGQsaDtmb3IoZD0wLGg9dC5za2lwcy5sZW5ndGg7ZDxoO2QrKylpZih0LnNraXBzW2RdLnRlc3QobCkpcmV0dXJuITE7Zm9yKGQ9MCxoPXQubmFtZXMubGVuZ3RoO2Q8aDtkKyspaWYodC5uYW1lc1tkXS50ZXN0KGwpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIGEobCl7cmV0dXJuIGwudG9TdHJpbmcoKS5zdWJzdHJpbmcoMixsLnRvU3RyaW5nKCkubGVuZ3RoLTIpLnJlcGxhY2UoL1xcLlxcKlxcPyQvLFwiKlwiKX1mdW5jdGlvbiB1KGwpe3JldHVybiBsIGluc3RhbmNlb2YgRXJyb3I/bC5zdGFja3x8bC5tZXNzYWdlOmx9ZnVuY3Rpb24gZigpe2NvbnNvbGUud2FybihcIkluc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC5cIil9cmV0dXJuIHQuZW5hYmxlKHQubG9hZCgpKSx0fWZzLmV4cG9ydHM9aGN9KTt2YXIgbGU9Uygoeixjcik9PntjKCk7ei5mb3JtYXRBcmdzPWdjO3ouc2F2ZT15Yzt6LmxvYWQ9YmM7ei51c2VDb2xvcnM9bWM7ei5zdG9yYWdlPXhjKCk7ei5kZXN0cm95PSgoKT0+e2xldCByPSExO3JldHVybigpPT57cnx8KHI9ITAsY29uc29sZS53YXJuKFwiSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLlwiKSl9fSkoKTt6LmNvbG9ycz1bXCIjMDAwMENDXCIsXCIjMDAwMEZGXCIsXCIjMDAzM0NDXCIsXCIjMDAzM0ZGXCIsXCIjMDA2NkNDXCIsXCIjMDA2NkZGXCIsXCIjMDA5OUNDXCIsXCIjMDA5OUZGXCIsXCIjMDBDQzAwXCIsXCIjMDBDQzMzXCIsXCIjMDBDQzY2XCIsXCIjMDBDQzk5XCIsXCIjMDBDQ0NDXCIsXCIjMDBDQ0ZGXCIsXCIjMzMwMENDXCIsXCIjMzMwMEZGXCIsXCIjMzMzM0NDXCIsXCIjMzMzM0ZGXCIsXCIjMzM2NkNDXCIsXCIjMzM2NkZGXCIsXCIjMzM5OUNDXCIsXCIjMzM5OUZGXCIsXCIjMzNDQzAwXCIsXCIjMzNDQzMzXCIsXCIjMzNDQzY2XCIsXCIjMzNDQzk5XCIsXCIjMzNDQ0NDXCIsXCIjMzNDQ0ZGXCIsXCIjNjYwMENDXCIsXCIjNjYwMEZGXCIsXCIjNjYzM0NDXCIsXCIjNjYzM0ZGXCIsXCIjNjZDQzAwXCIsXCIjNjZDQzMzXCIsXCIjOTkwMENDXCIsXCIjOTkwMEZGXCIsXCIjOTkzM0NDXCIsXCIjOTkzM0ZGXCIsXCIjOTlDQzAwXCIsXCIjOTlDQzMzXCIsXCIjQ0MwMDAwXCIsXCIjQ0MwMDMzXCIsXCIjQ0MwMDY2XCIsXCIjQ0MwMDk5XCIsXCIjQ0MwMENDXCIsXCIjQ0MwMEZGXCIsXCIjQ0MzMzAwXCIsXCIjQ0MzMzMzXCIsXCIjQ0MzMzY2XCIsXCIjQ0MzMzk5XCIsXCIjQ0MzM0NDXCIsXCIjQ0MzM0ZGXCIsXCIjQ0M2NjAwXCIsXCIjQ0M2NjMzXCIsXCIjQ0M5OTAwXCIsXCIjQ0M5OTMzXCIsXCIjQ0NDQzAwXCIsXCIjQ0NDQzMzXCIsXCIjRkYwMDAwXCIsXCIjRkYwMDMzXCIsXCIjRkYwMDY2XCIsXCIjRkYwMDk5XCIsXCIjRkYwMENDXCIsXCIjRkYwMEZGXCIsXCIjRkYzMzAwXCIsXCIjRkYzMzMzXCIsXCIjRkYzMzY2XCIsXCIjRkYzMzk5XCIsXCIjRkYzM0NDXCIsXCIjRkYzM0ZGXCIsXCIjRkY2NjAwXCIsXCIjRkY2NjMzXCIsXCIjRkY5OTAwXCIsXCIjRkY5OTMzXCIsXCIjRkZDQzAwXCIsXCIjRkZDQzMzXCJdO2Z1bmN0aW9uIG1jKCl7cmV0dXJuIHR5cGVvZiB3aW5kb3c8XCJ1XCImJndpbmRvdy5wcm9jZXNzJiYod2luZG93LnByb2Nlc3MudHlwZT09PVwicmVuZGVyZXJcInx8d2luZG93LnByb2Nlc3MuX19ud2pzKT8hMDp0eXBlb2YgbmF2aWdhdG9yPFwidVwiJiZuYXZpZ2F0b3IudXNlckFnZW50JiZuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLyk/ITE6dHlwZW9mIGRvY3VtZW50PFwidVwiJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQmJmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2V8fHR5cGVvZiB3aW5kb3c8XCJ1XCImJndpbmRvdy5jb25zb2xlJiYod2luZG93LmNvbnNvbGUuZmlyZWJ1Z3x8d2luZG93LmNvbnNvbGUuZXhjZXB0aW9uJiZ3aW5kb3cuY29uc29sZS50YWJsZSl8fHR5cGVvZiBuYXZpZ2F0b3I8XCJ1XCImJm5hdmlnYXRvci51c2VyQWdlbnQmJm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvZmlyZWZveFxcLyhcXGQrKS8pJiZwYXJzZUludChSZWdFeHAuJDEsMTApPj0zMXx8dHlwZW9mIG5hdmlnYXRvcjxcInVcIiYmbmF2aWdhdG9yLnVzZXJBZ2VudCYmbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pfWZ1bmN0aW9uIGdjKHIpe2lmKHJbMF09KHRoaXMudXNlQ29sb3JzP1wiJWNcIjpcIlwiKSt0aGlzLm5hbWVzcGFjZSsodGhpcy51c2VDb2xvcnM/XCIgJWNcIjpcIiBcIikrclswXSsodGhpcy51c2VDb2xvcnM/XCIlYyBcIjpcIiBcIikrXCIrXCIrY3IuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpLCF0aGlzLnVzZUNvbG9ycylyZXR1cm47bGV0IGU9XCJjb2xvcjogXCIrdGhpcy5jb2xvcjtyLnNwbGljZSgxLDAsZSxcImNvbG9yOiBpbmhlcml0XCIpO2xldCB0PTAsbj0wO3JbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLGk9PntpIT09XCIlJVwiJiYodCsrLGk9PT1cIiVjXCImJihuPXQpKX0pLHIuc3BsaWNlKG4sMCxlKX16LmxvZz1jb25zb2xlLmRlYnVnfHxjb25zb2xlLmxvZ3x8KCgpPT57fSk7ZnVuY3Rpb24geWMocil7dHJ5e3I/ei5zdG9yYWdlLnNldEl0ZW0oXCJkZWJ1Z1wiLHIpOnouc3RvcmFnZS5yZW1vdmVJdGVtKFwiZGVidWdcIil9Y2F0Y2h7fX1mdW5jdGlvbiBiYygpe2xldCByO3RyeXtyPXouc3RvcmFnZS5nZXRJdGVtKFwiZGVidWdcIil9Y2F0Y2h7fXJldHVybiFyJiZ0eXBlb2YgcHJvY2VzczxcInVcIiYmXCJlbnZcImluIHByb2Nlc3MmJihyPXByb2Nlc3MuZW52LkRFQlVHKSxyfWZ1bmN0aW9uIHhjKCl7dHJ5e3JldHVybiBsb2NhbFN0b3JhZ2V9Y2F0Y2h7fX1jci5leHBvcnRzPWNzKCkoeik7dmFye2Zvcm1hdHRlcnM6X2N9PWNyLmV4cG9ydHM7X2Muaj1mdW5jdGlvbihyKXt0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHIpfWNhdGNoKGUpe3JldHVyblwiW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06IFwiK2UubWVzc2FnZX19fSk7dmFyIG5hPVModGk9PntcInVzZSBzdHJpY3RcIjtjKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRpLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciByYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHIoKXt0aGlzLl9kYXRhTGVuZ3RoPTAsdGhpcy5fYnVmZmVyTGVuZ3RoPTAsdGhpcy5fc3RhdGU9bmV3IEludDMyQXJyYXkoNCksdGhpcy5fYnVmZmVyPW5ldyBBcnJheUJ1ZmZlcig2OCksdGhpcy5fYnVmZmVyOD1uZXcgVWludDhBcnJheSh0aGlzLl9idWZmZXIsMCw2OCksdGhpcy5fYnVmZmVyMzI9bmV3IFVpbnQzMkFycmF5KHRoaXMuX2J1ZmZlciwwLDE3KSx0aGlzLnN0YXJ0KCl9cmV0dXJuIHIuaGFzaFN0cj1mdW5jdGlvbihlLHQpe3JldHVybiB0PT09dm9pZCAwJiYodD0hMSksdGhpcy5vbmVQYXNzSGFzaGVyLnN0YXJ0KCkuYXBwZW5kU3RyKGUpLmVuZCh0KX0sci5oYXNoQXNjaWlTdHI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD09PXZvaWQgMCYmKHQ9ITEpLHRoaXMub25lUGFzc0hhc2hlci5zdGFydCgpLmFwcGVuZEFzY2lpU3RyKGUpLmVuZCh0KX0sci5faGV4PWZ1bmN0aW9uKGUpe3ZhciB0PXIuaGV4Q2hhcnMsbj1yLmhleE91dCxpLG8scyxhO2ZvcihhPTA7YTw0O2ErPTEpZm9yKG89YSo4LGk9ZVthXSxzPTA7czw4O3MrPTIpbltvKzErc109dC5jaGFyQXQoaSYxNSksaT4+Pj00LG5bbyswK3NdPXQuY2hhckF0KGkmMTUpLGk+Pj49NDtyZXR1cm4gbi5qb2luKFwiXCIpfSxyLl9tZDVjeWNsZT1mdW5jdGlvbihlLHQpe3ZhciBuPWVbMF0saT1lWzFdLG89ZVsyXSxzPWVbM107bis9KGkmb3x+aSZzKSt0WzBdLTY4MDg3NjkzNnwwLG49KG48PDd8bj4+PjI1KStpfDAscys9KG4maXx+biZvKSt0WzFdLTM4OTU2NDU4NnwwLHM9KHM8PDEyfHM+Pj4yMCkrbnwwLG8rPShzJm58fnMmaSkrdFsyXSs2MDYxMDU4MTl8MCxvPShvPDwxN3xvPj4+MTUpK3N8MCxpKz0obyZzfH5vJm4pK3RbM10tMTA0NDUyNTMzMHwwLGk9KGk8PDIyfGk+Pj4xMCkrb3wwLG4rPShpJm98fmkmcykrdFs0XS0xNzY0MTg4OTd8MCxuPShuPDw3fG4+Pj4yNSkraXwwLHMrPShuJml8fm4mbykrdFs1XSsxMjAwMDgwNDI2fDAscz0oczw8MTJ8cz4+PjIwKStufDAsbys9KHMmbnx+cyZpKSt0WzZdLTE0NzMyMzEzNDF8MCxvPShvPDwxN3xvPj4+MTUpK3N8MCxpKz0obyZzfH5vJm4pK3RbN10tNDU3MDU5ODN8MCxpPShpPDwyMnxpPj4+MTApK298MCxuKz0oaSZvfH5pJnMpK3RbOF0rMTc3MDAzNTQxNnwwLG49KG48PDd8bj4+PjI1KStpfDAscys9KG4maXx+biZvKSt0WzldLTE5NTg0MTQ0MTd8MCxzPShzPDwxMnxzPj4+MjApK258MCxvKz0ocyZufH5zJmkpK3RbMTBdLTQyMDYzfDAsbz0obzw8MTd8bz4+PjE1KStzfDAsaSs9KG8mc3x+byZuKSt0WzExXS0xOTkwNDA0MTYyfDAsaT0oaTw8MjJ8aT4+PjEwKStvfDAsbis9KGkmb3x+aSZzKSt0WzEyXSsxODA0NjAzNjgyfDAsbj0objw8N3xuPj4+MjUpK2l8MCxzKz0obiZpfH5uJm8pK3RbMTNdLTQwMzQxMTAxfDAscz0oczw8MTJ8cz4+PjIwKStufDAsbys9KHMmbnx+cyZpKSt0WzE0XS0xNTAyMDAyMjkwfDAsbz0obzw8MTd8bz4+PjE1KStzfDAsaSs9KG8mc3x+byZuKSt0WzE1XSsxMjM2NTM1MzI5fDAsaT0oaTw8MjJ8aT4+PjEwKStvfDAsbis9KGkmc3xvJn5zKSt0WzFdLTE2NTc5NjUxMHwwLG49KG48PDV8bj4+PjI3KStpfDAscys9KG4mb3xpJn5vKSt0WzZdLTEwNjk1MDE2MzJ8MCxzPShzPDw5fHM+Pj4yMykrbnwwLG8rPShzJml8biZ+aSkrdFsxMV0rNjQzNzE3NzEzfDAsbz0obzw8MTR8bz4+PjE4KStzfDAsaSs9KG8mbnxzJn5uKSt0WzBdLTM3Mzg5NzMwMnwwLGk9KGk8PDIwfGk+Pj4xMikrb3wwLG4rPShpJnN8byZ+cykrdFs1XS03MDE1NTg2OTF8MCxuPShuPDw1fG4+Pj4yNykraXwwLHMrPShuJm98aSZ+bykrdFsxMF0rMzgwMTYwODN8MCxzPShzPDw5fHM+Pj4yMykrbnwwLG8rPShzJml8biZ+aSkrdFsxNV0tNjYwNDc4MzM1fDAsbz0obzw8MTR8bz4+PjE4KStzfDAsaSs9KG8mbnxzJn5uKSt0WzRdLTQwNTUzNzg0OHwwLGk9KGk8PDIwfGk+Pj4xMikrb3wwLG4rPShpJnN8byZ+cykrdFs5XSs1Njg0NDY0Mzh8MCxuPShuPDw1fG4+Pj4yNykraXwwLHMrPShuJm98aSZ+bykrdFsxNF0tMTAxOTgwMzY5MHwwLHM9KHM8PDl8cz4+PjIzKStufDAsbys9KHMmaXxuJn5pKSt0WzNdLTE4NzM2Mzk2MXwwLG89KG88PDE0fG8+Pj4xOCkrc3wwLGkrPShvJm58cyZ+bikrdFs4XSsxMTYzNTMxNTAxfDAsaT0oaTw8MjB8aT4+PjEyKStvfDAsbis9KGkmc3xvJn5zKSt0WzEzXS0xNDQ0NjgxNDY3fDAsbj0objw8NXxuPj4+MjcpK2l8MCxzKz0obiZvfGkmfm8pK3RbMl0tNTE0MDM3ODR8MCxzPShzPDw5fHM+Pj4yMykrbnwwLG8rPShzJml8biZ+aSkrdFs3XSsxNzM1MzI4NDczfDAsbz0obzw8MTR8bz4+PjE4KStzfDAsaSs9KG8mbnxzJn5uKSt0WzEyXS0xOTI2NjA3NzM0fDAsaT0oaTw8MjB8aT4+PjEyKStvfDAsbis9KGleb15zKSt0WzVdLTM3ODU1OHwwLG49KG48PDR8bj4+PjI4KStpfDAscys9KG5eaV5vKSt0WzhdLTIwMjI1NzQ0NjN8MCxzPShzPDwxMXxzPj4+MjEpK258MCxvKz0oc15uXmkpK3RbMTFdKzE4MzkwMzA1NjJ8MCxvPShvPDwxNnxvPj4+MTYpK3N8MCxpKz0ob15zXm4pK3RbMTRdLTM1MzA5NTU2fDAsaT0oaTw8MjN8aT4+PjkpK298MCxuKz0oaV5vXnMpK3RbMV0tMTUzMDk5MjA2MHwwLG49KG48PDR8bj4+PjI4KStpfDAscys9KG5eaV5vKSt0WzRdKzEyNzI4OTMzNTN8MCxzPShzPDwxMXxzPj4+MjEpK258MCxvKz0oc15uXmkpK3RbN10tMTU1NDk3NjMyfDAsbz0obzw8MTZ8bz4+PjE2KStzfDAsaSs9KG9ec15uKSt0WzEwXS0xMDk0NzMwNjQwfDAsaT0oaTw8MjN8aT4+PjkpK298MCxuKz0oaV5vXnMpK3RbMTNdKzY4MTI3OTE3NHwwLG49KG48PDR8bj4+PjI4KStpfDAscys9KG5eaV5vKSt0WzBdLTM1ODUzNzIyMnwwLHM9KHM8PDExfHM+Pj4yMSkrbnwwLG8rPShzXm5eaSkrdFszXS03MjI1MjE5Nzl8MCxvPShvPDwxNnxvPj4+MTYpK3N8MCxpKz0ob15zXm4pK3RbNl0rNzYwMjkxODl8MCxpPShpPDwyM3xpPj4+OSkrb3wwLG4rPShpXm9ecykrdFs5XS02NDAzNjQ0ODd8MCxuPShuPDw0fG4+Pj4yOCkraXwwLHMrPShuXmlebykrdFsxMl0tNDIxODE1ODM1fDAscz0oczw8MTF8cz4+PjIxKStufDAsbys9KHNebl5pKSt0WzE1XSs1MzA3NDI1MjB8MCxvPShvPDwxNnxvPj4+MTYpK3N8MCxpKz0ob15zXm4pK3RbMl0tOTk1MzM4NjUxfDAsaT0oaTw8MjN8aT4+PjkpK298MCxuKz0ob14oaXx+cykpK3RbMF0tMTk4NjMwODQ0fDAsbj0objw8NnxuPj4+MjYpK2l8MCxzKz0oaV4obnx+bykpK3RbN10rMTEyNjg5MTQxNXwwLHM9KHM8PDEwfHM+Pj4yMikrbnwwLG8rPShuXihzfH5pKSkrdFsxNF0tMTQxNjM1NDkwNXwwLG89KG88PDE1fG8+Pj4xNykrc3wwLGkrPShzXihvfH5uKSkrdFs1XS01NzQzNDA1NXwwLGk9KGk8PDIxfGk+Pj4xMSkrb3wwLG4rPShvXihpfH5zKSkrdFsxMl0rMTcwMDQ4NTU3MXwwLG49KG48PDZ8bj4+PjI2KStpfDAscys9KGleKG58fm8pKSt0WzNdLTE4OTQ5ODY2MDZ8MCxzPShzPDwxMHxzPj4+MjIpK258MCxvKz0obl4oc3x+aSkpK3RbMTBdLTEwNTE1MjN8MCxvPShvPDwxNXxvPj4+MTcpK3N8MCxpKz0oc14ob3x+bikpK3RbMV0tMjA1NDkyMjc5OXwwLGk9KGk8PDIxfGk+Pj4xMSkrb3wwLG4rPShvXihpfH5zKSkrdFs4XSsxODczMzEzMzU5fDAsbj0objw8NnxuPj4+MjYpK2l8MCxzKz0oaV4obnx+bykpK3RbMTVdLTMwNjExNzQ0fDAscz0oczw8MTB8cz4+PjIyKStufDAsbys9KG5eKHN8fmkpKSt0WzZdLTE1NjAxOTgzODB8MCxvPShvPDwxNXxvPj4+MTcpK3N8MCxpKz0oc14ob3x+bikpK3RbMTNdKzEzMDkxNTE2NDl8MCxpPShpPDwyMXxpPj4+MTEpK298MCxuKz0ob14oaXx+cykpK3RbNF0tMTQ1NTIzMDcwfDAsbj0objw8NnxuPj4+MjYpK2l8MCxzKz0oaV4obnx+bykpK3RbMTFdLTExMjAyMTAzNzl8MCxzPShzPDwxMHxzPj4+MjIpK258MCxvKz0obl4oc3x+aSkpK3RbMl0rNzE4Nzg3MjU5fDAsbz0obzw8MTV8bz4+PjE3KStzfDAsaSs9KHNeKG98fm4pKSt0WzldLTM0MzQ4NTU1MXwwLGk9KGk8PDIxfGk+Pj4xMSkrb3wwLGVbMF09bitlWzBdfDAsZVsxXT1pK2VbMV18MCxlWzJdPW8rZVsyXXwwLGVbM109cytlWzNdfDB9LHIucHJvdG90eXBlLnN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RhdGFMZW5ndGg9MCx0aGlzLl9idWZmZXJMZW5ndGg9MCx0aGlzLl9zdGF0ZS5zZXQoci5zdGF0ZUlkZW50aXR5KSx0aGlzfSxyLnByb3RvdHlwZS5hcHBlbmRTdHI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fYnVmZmVyOCxuPXRoaXMuX2J1ZmZlcjMyLGk9dGhpcy5fYnVmZmVyTGVuZ3RoLG8scztmb3Iocz0wO3M8ZS5sZW5ndGg7cys9MSl7aWYobz1lLmNoYXJDb2RlQXQocyksbzwxMjgpdFtpKytdPW87ZWxzZSBpZihvPDIwNDgpdFtpKytdPShvPj4+NikrMTkyLHRbaSsrXT1vJjYzfDEyODtlbHNlIGlmKG88NTUyOTZ8fG8+NTYzMTkpdFtpKytdPShvPj4+MTIpKzIyNCx0W2krK109bz4+PjYmNjN8MTI4LHRbaSsrXT1vJjYzfDEyODtlbHNle2lmKG89KG8tNTUyOTYpKjEwMjQrKGUuY2hhckNvZGVBdCgrK3MpLTU2MzIwKSs2NTUzNixvPjExMTQxMTEpdGhyb3cgbmV3IEVycm9yKFwiVW5pY29kZSBzdGFuZGFyZCBzdXBwb3J0cyBjb2RlIHBvaW50cyB1cCB0byBVKzEwRkZGRlwiKTt0W2krK109KG8+Pj4xOCkrMjQwLHRbaSsrXT1vPj4+MTImNjN8MTI4LHRbaSsrXT1vPj4+NiY2M3wxMjgsdFtpKytdPW8mNjN8MTI4fWk+PTY0JiYodGhpcy5fZGF0YUxlbmd0aCs9NjQsci5fbWQ1Y3ljbGUodGhpcy5fc3RhdGUsbiksaS09NjQsblswXT1uWzE2XSl9cmV0dXJuIHRoaXMuX2J1ZmZlckxlbmd0aD1pLHRoaXN9LHIucHJvdG90eXBlLmFwcGVuZEFzY2lpU3RyPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLl9idWZmZXI4LG49dGhpcy5fYnVmZmVyMzIsaT10aGlzLl9idWZmZXJMZW5ndGgsbyxzPTA7Oyl7Zm9yKG89TWF0aC5taW4oZS5sZW5ndGgtcyw2NC1pKTtvLS07KXRbaSsrXT1lLmNoYXJDb2RlQXQocysrKTtpZihpPDY0KWJyZWFrO3RoaXMuX2RhdGFMZW5ndGgrPTY0LHIuX21kNWN5Y2xlKHRoaXMuX3N0YXRlLG4pLGk9MH1yZXR1cm4gdGhpcy5fYnVmZmVyTGVuZ3RoPWksdGhpc30sci5wcm90b3R5cGUuYXBwZW5kQnl0ZUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLl9idWZmZXI4LG49dGhpcy5fYnVmZmVyMzIsaT10aGlzLl9idWZmZXJMZW5ndGgsbyxzPTA7Oyl7Zm9yKG89TWF0aC5taW4oZS5sZW5ndGgtcyw2NC1pKTtvLS07KXRbaSsrXT1lW3MrK107aWYoaTw2NClicmVhazt0aGlzLl9kYXRhTGVuZ3RoKz02NCxyLl9tZDVjeWNsZSh0aGlzLl9zdGF0ZSxuKSxpPTB9cmV0dXJuIHRoaXMuX2J1ZmZlckxlbmd0aD1pLHRoaXN9LHIucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fc3RhdGU7cmV0dXJue2J1ZmZlcjpTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsQXJyYXkuZnJvbSh0aGlzLl9idWZmZXI4KSksYnVmbGVuOnRoaXMuX2J1ZmZlckxlbmd0aCxsZW5ndGg6dGhpcy5fZGF0YUxlbmd0aCxzdGF0ZTpbZVswXSxlWzFdLGVbMl0sZVszXV19fSxyLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlKXt2YXIgdD1lLmJ1ZmZlcixuPWUuc3RhdGUsaT10aGlzLl9zdGF0ZSxvO2Zvcih0aGlzLl9kYXRhTGVuZ3RoPWUubGVuZ3RoLHRoaXMuX2J1ZmZlckxlbmd0aD1lLmJ1ZmxlbixpWzBdPW5bMF0saVsxXT1uWzFdLGlbMl09blsyXSxpWzNdPW5bM10sbz0wO288dC5sZW5ndGg7bys9MSl0aGlzLl9idWZmZXI4W29dPXQuY2hhckNvZGVBdChvKX0sci5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKGUpe2U9PT12b2lkIDAmJihlPSExKTt2YXIgdD10aGlzLl9idWZmZXJMZW5ndGgsbj10aGlzLl9idWZmZXI4LGk9dGhpcy5fYnVmZmVyMzIsbz0odD4+MikrMTt0aGlzLl9kYXRhTGVuZ3RoKz10O3ZhciBzPXRoaXMuX2RhdGFMZW5ndGgqODtpZihuW3RdPTEyOCxuW3QrMV09blt0KzJdPW5bdCszXT0wLGkuc2V0KHIuYnVmZmVyMzJJZGVudGl0eS5zdWJhcnJheShvKSxvKSx0PjU1JiYoci5fbWQ1Y3ljbGUodGhpcy5fc3RhdGUsaSksaS5zZXQoci5idWZmZXIzMklkZW50aXR5KSksczw9NDI5NDk2NzI5NSlpWzE0XT1zO2Vsc2V7dmFyIGE9cy50b1N0cmluZygxNikubWF0Y2goLyguKj8pKC57MCw4fSkkLyk7aWYoYT09PW51bGwpcmV0dXJuO3ZhciB1PXBhcnNlSW50KGFbMl0sMTYpLGY9cGFyc2VJbnQoYVsxXSwxNil8fDA7aVsxNF09dSxpWzE1XT1mfXJldHVybiByLl9tZDVjeWNsZSh0aGlzLl9zdGF0ZSxpKSxlP3RoaXMuX3N0YXRlOnIuX2hleCh0aGlzLl9zdGF0ZSl9LHIuc3RhdGVJZGVudGl0eT1uZXcgSW50MzJBcnJheShbMTczMjU4NDE5MywtMjcxNzMzODc5LC0xNzMyNTg0MTk0LDI3MTczMzg3OF0pLHIuYnVmZmVyMzJJZGVudGl0eT1uZXcgSW50MzJBcnJheShbMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0pLHIuaGV4Q2hhcnM9XCIwMTIzNDU2Nzg5YWJjZGVmXCIsci5oZXhPdXQ9W10sci5vbmVQYXNzSGFzaGVyPW5ldyByLHJ9KCk7dGkuTWQ1PXJhO2lmKHJhLmhhc2hTdHIoXCJoZWxsb1wiKSE9PVwiNWQ0MTQwMmFiYzRiMmE3NmI5NzE5ZDkxMTAxN2M1OTJcIil0aHJvdyBuZXcgRXJyb3IoXCJNZDUgc2VsZiB0ZXN0IGZhaWxlZC5cIil9KTt2YXIgaWw9e307UHQoaWwse0FBQ0RlcGF5OigpPT5vdCxCYXNpY0RlcGF5OigpPT5zcixDYW52YXNTaW5rOigpPT5zdCxIMjY0RGVwYXk6KCk9PmN0LEh0bWw1Q2FudmFzUGlwZWxpbmU6KCk9PkhyLEh0bWw1VmlkZW9NZXRhZGF0YVBpcGVsaW5lOigpPT5xcixIdG1sNVZpZGVvUGlwZWxpbmU6KCk9Pl90LEh0dHBNc2VQaXBlbGluZTooKT0+R3IsSHR0cFNvdXJjZTooKT0+ZHIsSW5zcGVjdG9yOigpPT5wcixKUEVHRGVwYXk6KCk9Pmx0LE1lc3NhZ2VUeXBlOigpPT5JLE1ldGFkYXRhUGlwZWxpbmU6KCk9PmpyLE1wNENhcHR1cmU6KCk9Pm1yLE1wNE11eGVyOigpPT5wdCxNc2VTaW5rOigpPT5UZSxPTlZJRkRlcGF5OigpPT5DZSxQaXBlbGluZTooKT0+QmUsUlRDUFBhY2tldFR5cGU6KCk9PktuLFJUU1BSZXNwb25zZUVycm9yOigpPT5JdCxSVFNQX01FVEhPRDooKT0+T3IsUnRzcE1qcGVnUGlwZWxpbmU6KCk9Pnh0LFJ0c3BNcDRQaXBlbGluZTooKT0+YnQsUnRzcFBhcnNlcjooKT0+bXQsUnRzcFBpcGVsaW5lOigpPT5lZSxSdHNwU2Vzc2lvbjooKT0+eXQsU0RFU0l0ZW06KCk9PkpuLFNSOigpPT5IcyxTY2hlZHVsZXI6KCk9PldlLFNpbms6KCk9PlEsU291cmNlOigpPT5WLFR1YmU6KCk9PlIsV1NTb3VyY2U6KCk9PkcsV3NTZHBQaXBlbGluZTooKT0+V3IsYWRkUlRTUFJldHJ5OigpPT5hYSxib2R5T2Zmc2V0OigpPT5BcixjU3JjOigpPT5ucyxjU3JjQ291bnQ6KCk9PlNlLGNvbXBvbmVudHM6KCk9PmVpLGNvbm5lY3Rpb25FbmRlZDooKT0+THIsY29udGVudEJhc2U6KCk9PkJyLGNvbnRlbnRMb2NhdGlvbjooKT0+TXIsY3JlYXRlVHJhbnNmb3JtOigpPT55ZSxleHRIZWFkZXI6KCk9PmlzLGV4dEhlYWRlckxlbmd0aDooKT0+TXQsZXh0ZW5zaW9uOigpPT5vcixleHRyYWN0SGVhZGVyVmFsdWU6KCk9PnJlLGV4dHJhY3RVUklzOigpPT5KcyxnZXRUaW1lOigpPT5Qcixpc1J0Y3BBcHA6KCk9PiRzLGlzUnRjcEJ5ZTooKT0+d3IsaXNSdGNwUlI6KCk9PmpzLGlzUnRjcFNERVM6KCk9PldzLGlzUnRjcFNSOigpPT5fcixtYXJrZXI6KCk9PmNlLG1lc3NhZ2VGcm9tQnVmZmVyOigpPT5TcixwYWRkaW5nOigpPT5lcyxwYXJzZTooKT0+UW4scGFyc2VSdGNwOigpPT5YbixwYXlsb2FkOigpPT5aLHBheWxvYWRUeXBlOigpPT5PLHBpcGVsaW5lczooKT0+bmkscmFuZ2U6KCk9PklyLHJ0Y3BNZXNzYWdlRnJvbUJ1ZmZlcjooKT0+eHIsc1NyYzooKT0+cnMsc2VxdWVuY2U6KCk9PlJyLHNlcXVlbmNlTnVtYmVyOigpPT50cyxzZXNzaW9uSWQ6KCk9PlRyLHNlc3Npb25UaW1lb3V0OigpPT5DcixzdGF0dXNDb2RlOigpPT5odCx0aW1lc3RhbXA6KCk9PkgsdXRpbHM6KCk9PmlpLHZlcnNpb246KCk9PlpvfSk7bW9kdWxlLmV4cG9ydHM9bWEoaWwpO2MoKTt2YXIgZWk9e307UHQoZWkse0FBQ0RlcGF5OigpPT5vdCxCYXNpY0RlcGF5OigpPT5zcixDYW52YXNTaW5rOigpPT5zdCxIMjY0RGVwYXk6KCk9PmN0LEh0dHBTb3VyY2U6KCk9PmRyLEluc3BlY3RvcjooKT0+cHIsSlBFR0RlcGF5OigpPT5sdCxNZXNzYWdlVHlwZTooKT0+SSxNcDRDYXB0dXJlOigpPT5tcixNcDRNdXhlcjooKT0+cHQsTXNlU2luazooKT0+VGUsT05WSUZEZXBheTooKT0+Q2UsUlRTUFJlc3BvbnNlRXJyb3I6KCk9Pkl0LFJUU1BfTUVUSE9EOigpPT5PcixSdHNwUGFyc2VyOigpPT5tdCxSdHNwU2Vzc2lvbjooKT0+eXQsU2luazooKT0+USxTb3VyY2U6KCk9PlYsVHViZTooKT0+UixXU1NvdXJjZTooKT0+RyxjcmVhdGVUcmFuc2Zvcm06KCk9PnllfSk7YygpO2MoKTt2YXIgZ2U9QyhOKCkpO2MoKTt2YXIgRWU9QyhOKCkpLGZlPWNsYXNze3N0YXRpYyBjb25zdW1lcihlPSgpPT57fSl7cmV0dXJuIG5ldyBFZS5Xcml0YWJsZSh7b2JqZWN0TW9kZTohMCx3cml0ZSh0LG4saSl7ZSh0KSxpKCl9fSl9c3RhdGljIHBlZWtlcihlKXtpZih0eXBlb2YgZSE9XCJmdW5jdGlvblwiKXRocm93IG5ldyBFcnJvcihcInlvdSBtdXN0IHN1cHBseSBhIGZ1bmN0aW9uXCIpO3JldHVybiBuZXcgRWUuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybSh0LG4saSl7ZSh0KSxpKHZvaWQgMCx0KX19KX1zdGF0aWMgcHJvZHVjZXIoZSl7bGV0IHQ9MDtyZXR1cm4gbmV3IEVlLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwLHJlYWQoKXtlIT09dm9pZCAwJiYodDxlLmxlbmd0aD90aGlzLnB1c2goZVt0KytdKTp0aGlzLnB1c2gobnVsbCkpfX0pfXN0YXRpYyByZWNvcmRlcihlLHQpe3JldHVybiBuZXcgRWUuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybShuLGksbyl7bGV0IHM9RGF0ZS5ub3coKSxhPU9iamVjdC5hc3NpZ24oe30sbix7ZGF0YTpuLmRhdGEudG9TdHJpbmcoXCJiYXNlNjRcIil9KTt0LndyaXRlKEpTT04uc3RyaW5naWZ5KHt0eXBlOmUsdGltZXN0YW1wOnMsbWVzc2FnZTphfSxudWxsLDIpKSx0LndyaXRlKGAsXG5gKSxvKHZvaWQgMCxuKX19KX1zdGF0aWMgcmVwbGF5ZXIoZSl7bGV0IHQ9MCxuPWVbMF0udGltZXN0YW1wO3JldHVybiBuZXcgRWUuUmVhZGFibGUoe29iamVjdE1vZGU6ITAscmVhZCgpe2xldCBpPWVbdCsrXTtpZihpKXtsZXR7dHlwZTpvLHRpbWVzdGFtcDpzLG1lc3NhZ2U6YX09aSx1PXMtbjtpZihuPXMsYSl7bGV0IGY9YS5kYXRhP0J1ZmZlci5mcm9tKGEuZGF0YSxcImJhc2U2NFwiKTpCdWZmZXIuYWxsb2MoMCksbD1PYmplY3QuYXNzaWduKHt9LGEse2RhdGE6Zn0pO3RoaXMucHVzaCh7dHlwZTpvLGRlbGF5OnUsbXNnOmx9KX1lbHNlIHRoaXMucHVzaCh7dHlwZTpvLGRlbGF5OnUsbXNnOm51bGx9KX1lbHNlIHRoaXMucHVzaChudWxsKX19KX19O3ZhciBpcj1jbGFzc3t9LFY9Y2xhc3MgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcih0PW5ldyBnZS5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMH0pLG49bmV3IGdlLldyaXRhYmxlKHtvYmplY3RNb2RlOiEwfSkpe3N1cGVyKCk7dGhpcy5pbmNvbWluZz10LHRoaXMub3V0Z29pbmc9bix0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXY9bnVsbH1zdGF0aWMgZnJvbU1lc3NhZ2VzKHQpe3JldHVybiBuZXcgVihmZS5wcm9kdWNlcih0KSxmZS5jb25zdW1lcigpKX1jb25uZWN0KHQpe2lmKHQ9PT1udWxsKXJldHVybiB0aGlzO2lmKHRoaXMubmV4dCE9PW51bGx8fHQucHJldiE9PW51bGwpdGhyb3cgbmV3IEVycm9yKFwiY29ubmVjdGlvbiBmYWlsZWQ6IGNvbXBvbmVudChzKSBhbHJlYWR5IGNvbm5lY3RlZFwiKTtpZighdGhpcy5pbmNvbWluZy5yZWFkYWJsZXx8IXRoaXMub3V0Z29pbmcud3JpdGFibGUpdGhyb3cgbmV3IEVycm9yKFwiY29ubmVjdGlvbiBmYWlsZWQ6IHRoaXMgY29tcG9uZW50IG5vdCBjb21wYXRpYmxlXCIpO2lmKCF0LmluY29taW5nLndyaXRhYmxlfHwhdC5vdXRnb2luZy5yZWFkYWJsZSl0aHJvdyBuZXcgRXJyb3IoXCJjb25uZWN0aW9uIGZhaWxlZDogbmV4dCBjb21wb25lbnQgbm90IGNvbXBhdGlibGVcIik7dHJ5e3RoaXMuaW5jb21pbmcucGlwZSh0LmluY29taW5nKSx0Lm91dGdvaW5nLnBpcGUodGhpcy5vdXRnb2luZyl9Y2F0Y2gobyl7dGhyb3cgbmV3IEVycm9yKGBjb25uZWN0aW9uIGZhaWxlZDogJHtvLm1lc3NhZ2V9YCl9bGV0IG49bz0+e3RoaXMuaW5jb21pbmcuZW1pdChcImVycm9yXCIsbyl9O3QuaW5jb21pbmcub24oXCJlcnJvclwiLG4pO2xldCBpPW89Pnt0Lm91dGdvaW5nLmVtaXQoXCJlcnJvclwiLG8pfTtyZXR1cm4gdGhpcy5vdXRnb2luZy5vbihcImVycm9yXCIsaSksdGhpcy5uZXh0PXQsdC5wcmV2PXRoaXMsdGhpcy5faW5jb21pbmdFcnJvckhhbmRsZXI9bix0aGlzLl9vdXRnb2luZ0Vycm9ySGFuZGxlcj1pLHR9ZGlzY29ubmVjdCgpe2xldCB0PXRoaXMubmV4dDtyZXR1cm4gdCE9PW51bGwmJih0aGlzLmluY29taW5nLnVucGlwZSh0LmluY29taW5nKSx0Lm91dGdvaW5nLnVucGlwZSh0aGlzLm91dGdvaW5nKSx0eXBlb2YgdGhpcy5faW5jb21pbmdFcnJvckhhbmRsZXI8XCJ1XCImJnQuaW5jb21pbmcucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLHRoaXMuX2luY29taW5nRXJyb3JIYW5kbGVyKSx0eXBlb2YgdGhpcy5fb3V0Z29pbmdFcnJvckhhbmRsZXI8XCJ1XCImJnRoaXMub3V0Z29pbmcucmVtb3ZlTGlzdGVuZXIoXCJlcnJvclwiLHRoaXMuX291dGdvaW5nRXJyb3JIYW5kbGVyKSx0aGlzLm5leHQ9bnVsbCx0LnByZXY9bnVsbCxkZWxldGUgdGhpcy5faW5jb21pbmdFcnJvckhhbmRsZXIsZGVsZXRlIHRoaXMuX291dGdvaW5nRXJyb3JIYW5kbGVyKSx0aGlzfX0sUj1jbGFzcyBleHRlbmRzIFZ7Y29uc3RydWN0b3IodD1uZXcgZ2UuUGFzc1Rocm91Z2goe29iamVjdE1vZGU6ITB9KSxuPW5ldyBnZS5QYXNzVGhyb3VnaCh7b2JqZWN0TW9kZTohMH0pKXtzdXBlcih0LG4pO3RoaXMuaW5jb21pbmc9dCx0aGlzLm91dGdvaW5nPW59c3RhdGljIGZyb21IYW5kbGVycyh0LG4pe2xldCBpPXQ/ZmUucGVla2VyKHQpOnZvaWQgMCxvPW4/ZmUucGVla2VyKG4pOnZvaWQgMDtyZXR1cm4gbmV3IFIoaSxvKX19LFE9Y2xhc3MgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcih0PW5ldyBnZS5Xcml0YWJsZSh7b2JqZWN0TW9kZTohMH0pLG49bmV3IGdlLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwfSkpe3N1cGVyKCk7dGhpcy5pbmNvbWluZz10LHRoaXMub3V0Z29pbmc9bix0aGlzLm5leHQ9bnVsbCx0aGlzLnByZXY9bnVsbH1zdGF0aWMgZnJvbUhhbmRsZXIodCl7bGV0IG49bmV3IFEoZmUuY29uc3VtZXIodCksZmUucHJvZHVjZXIodm9pZCAwKSk7cmV0dXJuIG4uaW5jb21pbmcub24oXCJmaW5pc2hcIiwoKT0+e24ub3V0Z29pbmcucHVzaChudWxsKX0pLG59Y29ubmVjdCgpe3Rocm93IG5ldyBFcnJvcihcImNvbm5lY3Rpb24gZmFpbGVkOiBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgYWZ0ZXIgYSBzaW5rXCIpfWRpc2Nvbm5lY3QoKXtyZXR1cm4gdGhpc319O2MoKTtjKCk7YygpO3ZhciBpdD1bMTI4LDY0LDMyLDE2LDgsNCwyLDFdO3ZhciBabz1yPT5yWzBdPj4+Nixlcz1yPT4hIShyWzBdJml0WzJdKSxvcj1yPT4hIShyWzBdJml0WzNdKSxTZT1yPT5yWzBdJjE1LGNlPXI9PiEhKHJbMV0maXRbMF0pLE89cj0+clsxXSYxMjcsdHM9cj0+ci5yZWFkVUludDE2QkUoMiksSD1yPT5yLnJlYWRVSW50MzJCRSg0KSxycz1yPT5yLnJlYWRVSW50MzJCRSg4KSxucz0ocixlPTApPT5TZShyKT5lP3IucmVhZFVJbnQzMkJFKDEyK2UqNCk6MCxNdD1yPT5vcihyKT9yLnJlYWRVSW50MTZCRSgxMitTZShyKSo0KzIpOjAsaXM9cj0+TXQocik9PT0wP0J1ZmZlci5mcm9tKFtdKTpyLnNsaWNlKDEyK1NlKHIpKjQsMTIrU2UocikqNCs0K010KHIpKjQpLFo9cj0+b3Iocik/ci5zbGljZSgxMitTZShyKSo0KzQrTXQocikqNCk6ci5zbGljZSgxMitTZShyKSo0KTtjKCk7dmFyIEk9KGQ9PihkW2QuVU5LTk9XTj0wXT1cIlVOS05PV05cIixkW2QuUkFXPTFdPVwiUkFXXCIsZFtkLlJUUD0yXT1cIlJUUFwiLGRbZC5SVENQPTNdPVwiUlRDUFwiLGRbZC5SVFNQPTRdPVwiUlRTUFwiLGRbZC5TRFA9NV09XCJTRFBcIixkW2QuRUxFTUVOVEFSWT02XT1cIkVMRU1FTlRBUllcIixkW2QuSDI2ND03XT1cIkgyNjRcIixkW2QuSVNPTT04XT1cIklTT01cIixkW2QuWE1MPTldPVwiWE1MXCIsZFtkLkpQRUc9MTBdPVwiSlBFR1wiLGQpKShJfHx7fSk7YygpO2Z1bmN0aW9uIG9zKHIsZSx0KXtsZXQgbj1aKHIuZGF0YSksaT0wO2lmKGUpe2xldCBzPW4ucmVhZFVJbnQxNkJFKDApO2k9MisocytzJTgpLzh9bGV0IG89e3R5cGU6NixkYXRhOm4uc2xpY2UoaSkscGF5bG9hZFR5cGU6TyhyLmRhdGEpLHRpbWVzdGFtcDpIKHIuZGF0YSksbnRwVGltZXN0YW1wOnIubnRwVGltZXN0YW1wfTt0KG8pfWMoKTt2YXIgc3M9QyhOKCkpLHllPXI9Pm5ldyBzcy5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOnJ9KTt2YXIgb3Q9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCl7bGV0IGUsdCxuPXllKGZ1bmN0aW9uKGksbyxzKXtpZihpLnR5cGU9PT01KXtsZXQgYTtmb3IobGV0IHUgb2YgaS5zZHAubWVkaWEpdS50eXBlPT09XCJhdWRpb1wiJiZ1LmZtdHAmJnUuZm10cC5wYXJhbWV0ZXJzJiZ1LmZtdHAucGFyYW1ldGVycy5tb2RlPT09XCJBQUMtaGJyXCImJihhPXUpO2lmKGEmJmEucnRwbWFwIT09dm9pZCAwKXtlPU51bWJlcihhLnJ0cG1hcC5wYXlsb2FkVHlwZSk7bGV0IHU9YS5mbXRwLnBhcmFtZXRlcnMsZj1OdW1iZXIodS5zaXplbGVuZ3RoKXx8MCxsPU51bWJlcih1LmluZGV4bGVuZ3RoKXx8MCxkPU51bWJlcih1LmluZGV4ZGVsdGFsZW5ndGgpfHwwLGg9TnVtYmVyKHUuY3RzZGVsdGFsZW5ndGgpfHwwLG09TnVtYmVyKHUuZHRzZGVsdGFsZW5ndGgpfHwwLGI9TnVtYmVyKHUucmFuZG9tYWNjZXNzaW5kaWNhdGlvbil8fDAseT1OdW1iZXIodS5zdHJlYW1zdGF0ZWluZGljYXRpb24pfHwwLHc9TnVtYmVyKHUuYXV4aWxpYXJ5ZGF0YXNpemVsZW5ndGgpfHwwO3Q9ZitNYXRoLm1heChsLGQpK2grbStiK3krdz4wfXModm9pZCAwLGkpfWVsc2UgaS50eXBlPT09MiYmTyhpLmRhdGEpPT09ZT8ob3MoaSx0LHRoaXMucHVzaC5iaW5kKHRoaXMpKSxzKCkpOnModm9pZCAwLGkpfSk7c3VwZXIobil9fTtjKCk7dmFyIHNyPWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3RvcihlKXtpZihlPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInlvdSBtdXN0IHN1cHBseSBhIHBheWxvYWQgdHlwZSB0byBCYXNpY0RlcGF5Q29tcG9uZW50XCIpO2xldCB0PUJ1ZmZlci5hbGxvYygwKSxuPXllKGZ1bmN0aW9uKGksbyxzKXtpZihpLnR5cGU9PT0yJiZPKGkuZGF0YSk9PT1lKXtsZXQgYT1aKGkuZGF0YSk7dD1CdWZmZXIuY29uY2F0KFt0LGFdKSxjZShpLmRhdGEpJiYodC5sZW5ndGg+MCYmdGhpcy5wdXNoKHtkYXRhOnQsdGltZXN0YW1wOkgoaS5kYXRhKSxudHBUaW1lc3RhbXA6aS5udHBUaW1lc3RhbXAscGF5bG9hZFR5cGU6TyhpLmRhdGEpLHR5cGU6Nn0pLHQ9QnVmZmVyLmFsbG9jKDApKSxzKCl9ZWxzZSBzKHZvaWQgMCxpKX0pO3N1cGVyKG4pfX07YygpO2MoKTt2YXIgYXI9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmVsYXBzZWQ9MCx0aGlzLnN0YXJ0ZWQ9MCx0aGlzLnN0b3BwZWQ9ITB9c3RhcnQoKXt0aGlzLnN0b3BwZWQmJih0aGlzLnN0YXJ0ZWQ9d2luZG93LnBlcmZvcm1hbmNlLm5vdygpLHRoaXMuc3RvcHBlZD0hMSl9c3RvcCgpe3RoaXMuc3RvcHBlZHx8KHRoaXMuZWxhcHNlZD10aGlzLm5vdygpLHRoaXMuc3RvcHBlZD0hMCl9cmVzZXQoKXt0aGlzLmVsYXBzZWQ9MCx0aGlzLnN0YXJ0ZWQ9MCx0aGlzLnN0b3BwZWQ9ITB9bm93KCl7cmV0dXJuIHRoaXMuc3RvcHBlZD90aGlzLmVsYXBzZWQ6dGhpcy5lbGFwc2VkKyh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCktdGhpcy5zdGFydGVkKX1wbGF5KCl7dGhpcy5zdGFydCgpfXBhdXNlKCl7dGhpcy5zdG9wKCl9Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMubm93KCkvMWUzfX07YygpO3ZhciBXZT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbj0xMCl7dGhpcy5fY2xvY2s9ZSx0aGlzLl9oYW5kbGVyPXQsdGhpcy5fdG9sZXJhbmNlPW4sdGhpcy5fbmV4dFJ1bj0wLHRoaXMuX25leHRQbGF5PTAsdGhpcy5fZmlmbz1bXSx0aGlzLl9udHBQcmVzZW50YXRpb25UaW1lPTAsdGhpcy5fc3VzcGVuZGVkPSExfXJlc2V0KCl7Y2xlYXJUaW1lb3V0KHRoaXMuX25leHRSdW4pLGNsZWFyVGltZW91dCh0aGlzLl9uZXh0UGxheSksdGhpcy5fZmlmbz1bXSx0aGlzLl9udHBQcmVzZW50YXRpb25UaW1lPTAsdGhpcy5fc3VzcGVuZGVkPSExfWluaXQoZSl7dGhpcy5fbnRwUHJlc2VudGF0aW9uVGltZT1lfXN1c3BlbmQoKXtjbGVhclRpbWVvdXQodGhpcy5fbmV4dFBsYXkpLHRoaXMuX3N1c3BlbmRlZD0hMH1yZXN1bWUoKXt0aGlzLl9zdXNwZW5kZWQ9ITEsdGhpcy5ydW4odm9pZCAwKX1ydW4oZSl7aWYoY2xlYXJUaW1lb3V0KHRoaXMuX25leHRSdW4pLHR5cGVvZiB0aGlzLl9udHBQcmVzZW50YXRpb25UaW1lPlwidVwifHwodHlwZW9mIGU8XCJ1XCImJnRoaXMuX2ZpZm8ucHVzaChlKSx0aGlzLl9zdXNwZW5kZWQpfHx0aGlzLl9maWZvLmxlbmd0aD09PTApcmV0dXJuO2xldCB0PTAsbjtkb3tsZXQgaT10aGlzLl9maWZvLnNoaWZ0KCk7aWYoaT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJpbnRlcm5hbCBlcnJvcjogbWVzc2FnZSBzaG91bGQgbmV2ZXIgYmUgdW5kZWZpbmVkXCIpO249aTtsZXQgbz1uLm50cFRpbWVzdGFtcDtpZihvPT09dm9pZCAwKWNvbnRpbnVlO3Q9by10aGlzLl9udHBQcmVzZW50YXRpb25UaW1lLXRoaXMuX2Nsb2NrLmN1cnJlbnRUaW1lKjFlMyxNYXRoLmFicyh0KTx0aGlzLl90b2xlcmFuY2UmJnRoaXMuX2hhbmRsZXImJnRoaXMuX2hhbmRsZXIobil9d2hpbGUodDx0aGlzLl90b2xlcmFuY2UmJnRoaXMuX2ZpZm8ubGVuZ3RoPjApO3Q8LXRoaXMuX3RvbGVyYW5jZT8oY2xlYXJUaW1lb3V0KHRoaXMuX25leHRQbGF5KSx0aGlzLl9jbG9jay5wYXVzZSgpLHRoaXMuX25leHRQbGF5PXdpbmRvdy5zZXRUaW1lb3V0KCgpPT50aGlzLl9jbG9jay5wbGF5KCksLXQpKTp0PnRoaXMuX3RvbGVyYW5jZSYmKHRoaXMuX2ZpZm8udW5zaGlmdChuKSx0aGlzLl9uZXh0UnVuPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT50aGlzLnJ1bih2b2lkIDApLHQpKX19O3ZhciB1cj1DKE4oKSksYWM9cj0+e3IuYml0cmF0ZT0wLHIuZnJhbWVyYXRlPTAsci5yZW5kZXJlZEZyYW1lcz0wfSx1Yz1yPT57bGV0IGU9MCx0PTAsbj0wO3JldHVybihpLHtieXRlTGVuZ3RoOm8sZHVyYXRpb246c30pPT57aWYoZSs9byx0Kz1zLG4rKyx0Pj1yKXtsZXQgYT04KmUsdT1uLGY9dC9yO2kuYml0cmF0ZT1hL2YsaS5mcmFtZXJhdGU9dS9mLGU9MCx0PTAsbj0wfX19LHN0PWNsYXNzIGV4dGVuZHMgUXtjb25zdHJ1Y3Rvcih0KXtpZih0PT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImNhbnZhcyBlbGVtZW50IGFyZ3VtZW50IG1pc3NpbmdcIik7bGV0IG49MCxpPTAsbz0wLHM9e2JpdHJhdGU6MCxmcmFtZXJhdGU6MCxyZW5kZXJlZEZyYW1lczowfSxhLHU9bnVsbDt3aW5kb3cuY3JlYXRlSW1hZ2VCaXRtYXAhPT12b2lkIDAmJih1PXQuZ2V0Q29udGV4dChcImJpdG1hcHJlbmRlcmVyXCIpKSx1PT09bnVsbCYmKHU9dC5nZXRDb250ZXh0KFwiMmRcIikpO2xldCBmO2lmKHU9PT1udWxsKWY9KCk9Pnt9O2Vsc2UgaWYoXCJ0cmFuc2ZlckZyb21JbWFnZUJpdG1hcFwiaW4gdSl7bGV0IF89dTtmPSh7YmxvYjp2fSk9PntzLnJlbmRlcmVkRnJhbWVzKyssd2luZG93LmNyZWF0ZUltYWdlQml0bWFwKHYpLnRoZW4ocT0+e18udHJhbnNmZXJGcm9tSW1hZ2VCaXRtYXAocSl9KS5jYXRjaCgoKT0+e30pfX1lbHNle2xldCBfPXUsdj1uZXcgSW1hZ2U7di5vbmxvYWQ9KCk9PntfLmRyYXdJbWFnZSh2LDAsMCl9LGY9KHtibG9iOnF9KT0+e3MucmVuZGVyZWRGcmFtZXMrKztsZXQgQT13aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChxKTt2LnNyYz1BfX1sZXQgbD1uZXcgYXIsZD1uZXcgV2UobCxmKSxoPTAsbT0oKT0+e3RoaXMub25DYW5wbGF5JiZ0aGlzLm9uQ2FucGxheSgpfSxiPV89Pnt0aGlzLm9uU3luYyYmdGhpcy5vblN5bmMoXyl9LHk9bmV3IHVyLldyaXRhYmxlKHtvYmplY3RNb2RlOiEwLHdyaXRlOihfLHYscSk9PntpZihfLnR5cGU9PT01KXtsLnJlc2V0KCksZC5yZXNldCgpLG49MDtsZXQgQT1fLnNkcC5tZWRpYS5maW5kKGo9PmoudHlwZT09PVwidmlkZW9cIiYmai5ydHBtYXAhPT12b2lkIDAmJmoucnRwbWFwLmVuY29kaW5nTmFtZT09PVwiSlBFR1wiKTtBIT09dm9pZCAwJiZBLnJ0cG1hcCE9PXZvaWQgMCYmKG89QS5ydHBtYXAuY2xvY2tyYXRlLGFjKHMpLGE9dWMobykpLHEoKX1lbHNlIGlmKF8udHlwZT09PTEwKXtsZXR7dGltZXN0YW1wOkEsbnRwVGltZXN0YW1wOmp9PV87aWYoIW4pe249QSxpPUE7bGV0e3dpZHRoOkllLGhlaWdodDpBZX09Xy5mcmFtZXNpemU7dC53aWR0aD1JZSx0LmhlaWdodD1BZSxkLmluaXQoMCl9bGV0IFk9MWUzKihBLW4pL28sR2U9bmV3IHdpbmRvdy5CbG9iKFtfLmRhdGFdLHt0eXBlOlwiaW1hZ2UvanBlZ1wifSk7IWgmJmomJihoPWotWSxiKGgpKSxkLnJ1bih7bnRwVGltZXN0YW1wOlksYmxvYjpHZX0pLEE9PT1uJiZtKCksYShzLHtieXRlTGVuZ3RoOl8uZGF0YS5sZW5ndGgsZHVyYXRpb246QS1pfSksaT1BLHEoKX1lbHNlIHEoKX19KSx3PW5ldyB1ci5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkOmZ1bmN0aW9uKCl7fX0pO3cub24oXCJlcnJvclwiLCgpPT57Y29uc29sZS53YXJuKFwib3V0Z29pbmcgc3RyZWFtIGJyb2tlIHNvbWV3aGVyZVwiKX0pO3N1cGVyKHksdyk7dGhpcy5fY2xvY2s9bCx0aGlzLl9zY2hlZHVsZXI9ZCx0aGlzLl9pbmZvPXMsdGhpcy5vbkNhbnBsYXk9dm9pZCAwLHRoaXMub25TeW5jPXZvaWQgMH1nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5fY2xvY2suY3VycmVudFRpbWV9cGF1c2UoKXt0aGlzLl9zY2hlZHVsZXIuc3VzcGVuZCgpLHRoaXMuX2Nsb2NrLnBhdXNlKCl9cGxheSgpe3RoaXMuX2Nsb2NrLnBsYXkoKSx0aGlzLl9zY2hlZHVsZXIucmVzdW1lKCl9Z2V0IGJpdHJhdGUoKXtyZXR1cm4gdGhpcy5faW5mby5iaXRyYXRlfWdldCBmcmFtZXJhdGUoKXtyZXR1cm4gdGhpcy5faW5mby5mcmFtZXJhdGV9fTtjKCk7dmFyIGRzPUMoTigpKTtjKCk7dmFyIGxzPUMobGUoKSk7dmFyIHdjPSgwLGxzLmRlZmF1bHQpKFwibXNsOmgyNjRkZXBheVwiKSxscj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2MoMCl9cGFyc2UoZSl7bGV0IHQ9WihlLmRhdGEpLG49dFswXSYzMTtpZihuPT09Mjgpe2xldCBpPXRbMF0sbz10WzFdLHM9ISEobz4+NyksYT1vJjMxLHU9aSYyMjR8YSxmPW8mNjQ7aWYocylyZXR1cm4gdGhpcy5fYnVmZmVyPUJ1ZmZlci5jb25jYXQoW0J1ZmZlci5mcm9tKFswLDAsMCwwLHVdKSx0LnNsaWNlKDIpXSksbnVsbDtpZihmKXtsZXQgbD1CdWZmZXIuY29uY2F0KFt0aGlzLl9idWZmZXIsdC5zbGljZSgyKV0pO2wud3JpdGVVSW50MzJCRShsLmxlbmd0aC00LDApO2xldCBkPXtkYXRhOmwsdHlwZTo3LHRpbWVzdGFtcDpIKGUuZGF0YSksbnRwVGltZXN0YW1wOmUubnRwVGltZXN0YW1wLHBheWxvYWRUeXBlOk8oZS5kYXRhKSxuYWxUeXBlOmF9O3JldHVybiB0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jKDApLGR9ZWxzZSByZXR1cm4gdGhpcy5fYnVmZmVyPUJ1ZmZlci5jb25jYXQoW3RoaXMuX2J1ZmZlcix0LnNsaWNlKDIpXSksbnVsbH1lbHNlIGlmKChuPT09MXx8bj09PTUpJiZ0aGlzLl9idWZmZXIubGVuZ3RoPT09MCl7bGV0IGk9QnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oWzAsMCwwLDBdKSx0XSk7aS53cml0ZVVJbnQzMkJFKGkubGVuZ3RoLTQsMCk7bGV0IG89e2RhdGE6aSx0eXBlOjcsdGltZXN0YW1wOkgoZS5kYXRhKSxudHBUaW1lc3RhbXA6ZS5udHBUaW1lc3RhbXAscGF5bG9hZFR5cGU6TyhlLmRhdGEpLG5hbFR5cGU6bn07cmV0dXJuIHRoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2MoMCksb31lbHNlIHJldHVybiB3YyhgSDI2NGRlcGF5Q29tcG9uZW50IGNhbiBvbmx5IGV4dHJhY3QgdHlwZXMgMSw1IGFuZCAyOCwgZ290ICR7bn1gKSx0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jKDApLG51bGx9fTt2YXIgY3Q9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCl7bGV0IGUsdD0hMSxuPVtdLGk9bmV3IGxyLG89bmV3IGRzLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24ocyxhLHUpe2lmKHMudHlwZT09PTUpe2xldCBmPXMuc2RwLm1lZGlhLmZpbmQobD0+bC50eXBlPT09XCJ2aWRlb1wiJiZsLnJ0cG1hcCE9PXZvaWQgMCYmbC5ydHBtYXAuZW5jb2RpbmdOYW1lPT09XCJIMjY0XCIpO2YhPT12b2lkIDAmJmYucnRwbWFwIT09dm9pZCAwJiYoZT1mLnJ0cG1hcC5wYXlsb2FkVHlwZSksdSh2b2lkIDAscyl9ZWxzZSBpZihzLnR5cGU9PT0yJiZPKHMuZGF0YSk9PT1lKXtsZXQgZj1jZShzLmRhdGEpLGw9aS5wYXJzZShzKTtpZihsPT09bnVsbHx8IXQmJmwubmFsVHlwZSE9PTUpe3UoKTtyZXR1cm59dD0hMCxuLnB1c2gobC5kYXRhKSxmJiYodGhpcy5wdXNoKHsuLi5sLGRhdGE6bi5sZW5ndGg9PT0xP25bMF06QnVmZmVyLmNvbmNhdChuKX0pLG49W10pLHUoKX1lbHNlIHUodm9pZCAwLHMpfX0pO3N1cGVyKG8pfX07YygpO3ZhciBwcz1DKGxlKCkpO3ZhciBocz1DKE4oKSk7dmFyIE5uPSgwLHBzLmRlZmF1bHQpKFwibXNsOmh0dHAtc291cmNlXCIpLGRyPWNsYXNzIGV4dGVuZHMgVntjb25zdHJ1Y3Rvcih0KXtsZXR7dXJpOm4sb3B0aW9uczppfT10LG89bmV3IGhzLlJlYWRhYmxlKHtvYmplY3RNb2RlOiEwLHJlYWQ6ZnVuY3Rpb24oKXt9fSk7by5vbihcImVycm9yXCIscz0+e2NvbnNvbGUud2FybihcImNsb3Npbmcgc29ja2V0IGR1ZSB0byBpbmNvbWluZyBlcnJvclwiLHMpLHRoaXMuX3JlYWRlciYmdGhpcy5fcmVhZGVyLmNhbmNlbCgpfSk7c3VwZXIobyk7by5fcmVhZD0oKT0+e3RoaXMuX3B1bGwoKX0sdGhpcy51cmk9bix0aGlzLm9wdGlvbnM9aSx0aGlzLl9hbGxEb25lPSExfXBsYXkoKXtpZih0aGlzLnVyaT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJjYW5ub3Qgc3RhcnQgcGxheWluZyB3aGVuIHRoZXJlIGlzIG5vIFVSSVwiKTt0aGlzLl9hYm9ydENvbnRyb2xsZXI9bmV3IEFib3J0Q29udHJvbGxlcix0aGlzLmxlbmd0aD0wLGZldGNoKHRoaXMudXJpLHtjcmVkZW50aWFsczpcImluY2x1ZGVcIixzaWduYWw6dGhpcy5fYWJvcnRDb250cm9sbGVyLnNpZ25hbCwuLi50aGlzLm9wdGlvbnN9KS50aGVuKHQ9PntpZih0LmJvZHk9PT1udWxsKXRocm93IG5ldyBFcnJvcihcImVtcHR5IHJlc3BvbnNlIGJvZHlcIik7dGhpcy5vbkhlYWRlcnMmJnRoaXMub25IZWFkZXJzKHQuaGVhZGVycyksdGhpcy5fcmVhZGVyPXQuYm9keS5nZXRSZWFkZXIoKSx0aGlzLl9wdWxsKCl9KS5jYXRjaCh0PT57Y29uc29sZS5lcnJvcihcImh0dHAtc291cmNlOiBmZXRjaCBmYWlsZWQ6IFwiLHQpfSl9YWJvcnQoKXt0aGlzLl9yZWFkZXImJnRoaXMuX3JlYWRlci5jYW5jZWwoKS5jYXRjaCh0PT57Y29uc29sZS5sb2coXCJodHRwLXNvdXJjZTogY2FuY2VsIHJlYWRlciBmYWlsZWQ6IFwiLHQpfSksdGhpcy5fYWJvcnRDb250cm9sbGVyJiZ0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKX1faXNDbG9zZWQoKXtyZXR1cm4gdGhpcy5fYWxsRG9uZX1fY2xvc2UoKXt0aGlzLl9yZWFkZXI9dm9pZCAwLHRoaXMuX2FsbERvbmU9ITAsdGhpcy5pbmNvbWluZy5wdXNoKG51bGwpLHRoaXMub25TZXJ2ZXJDbG9zZT8uKCl9X3B1bGwoKXt0aGlzLl9yZWFkZXIhPT12b2lkIDAmJnRoaXMuX3JlYWRlci5yZWFkKCkudGhlbigoe2RvbmU6dCx2YWx1ZTpufSk9PntpZih0KXt0aGlzLl9pc0Nsb3NlZCgpfHwoTm4oXCJmZXRjaCBjb21wbGV0ZWQsIHRvdGFsIGRvd25sb2FkZWQ6IFwiLHRoaXMubGVuZ3RoLFwiIGJ5dGVzXCIpLHRoaXMuX2Nsb3NlKCkpO3JldHVybn1pZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIHZhbHVlIHRvIGJlIGRlZmluZWRcIik7aWYodGhpcy5sZW5ndGg9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiZXhwZWN0ZWQgbGVuZ3RoIHRvIGJlIGRlZmluZWRcIik7dGhpcy5sZW5ndGgrPW4ubGVuZ3RoO2xldCBpPUJ1ZmZlci5mcm9tKG4pO3RoaXMuaW5jb21pbmcucHVzaCh7ZGF0YTppLHR5cGU6MX0pP3RoaXMuX3B1bGwoKTpObihcImRvd25zdHJlYW0gYmFjayBwcmVzc3VyZTogcGF1c2luZyByZWFkXCIpfSkuY2F0Y2godD0+e05uKFwiaHR0cC1zb3VyY2U6IHJlYWQgZmFpbGVkOiBcIix0KSx0aGlzLl9pc0Nsb3NlZCgpfHx0aGlzLl9jbG9zZSgpfSl9fTtjKCk7dmFyIEhuPUMoTigpKSxtcz0ocixlKT0+e2xldCB0PURhdGUubm93KCksbj1pPT57bGV0IG89RGF0ZS5ub3coKTtjb25zb2xlLmxvZyhgJHtyfTogKyR7by10fW1zYCxpKSx0PW99O3JldHVybiBlPT09dm9pZCAwP246aT0+aS50eXBlPT09ZSYmbihpKX0scHI9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKGUpe2xldCB0PW1zKFwiaW5jb21pbmdcIixlKSxuPW5ldyBIbi5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKHMsYSx1KXt0KHMpLHUodm9pZCAwLHMpfX0pLGk9bXMoXCJvdXRnb2luZ1wiLGUpLG89bmV3IEhuLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24ocyxhLHUpe2kocyksdSh2b2lkIDAscyl9fSk7c3VwZXIobixvKX19O2MoKTtjKCk7YygpO2Z1bmN0aW9uIFNzKCl7cmV0dXJuIEJ1ZmZlci5mcm9tKFsyNTUsMjE2XSl9ZnVuY3Rpb24gUnMocixlKXtsZXQgdD1yJjE/MTI4OjY0LG49ciYyPzEyODo2NDtpZihlLmxlbmd0aCE9PXQrbil0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHF1YW50aXphdGlvbiB0YWJsZVwiKTtsZXQgaT1CdWZmZXIuZnJvbShbMjU1LDIxOSwwLHQrMywwXSksbz1CdWZmZXIuZnJvbShbMjU1LDIxOSwwLG4rMywxXSk7cmV0dXJuIEJ1ZmZlci5jb25jYXQoW2ksZS5zbGljZSgwLHQpLG8sZS5zbGljZSh0KV0pfWZ1bmN0aW9uIFRzKHIsZSx0KXtyZXR1cm4gQnVmZmVyLmZyb20oWzI1NSwxOTIsMCwxNyw4LGU+PjgsZSxyPj44LHIsMywwLHQ9PT0wPzMzOjM0LDAsMSwxNywxLDIsMTcsMV0pfXZhciBncz1bMCwxLDUsMSwxLDEsMSwxLDEsMCwwLDAsMCwwLDAsMF0seXM9WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTFdLGJzPVswLDIsMSwzLDMsMiw0LDMsNSw1LDQsNCwwLDAsMSwxMjVdLHhzPVsxLDIsMywwLDQsMTcsNSwxOCwzMyw0OSw2NSw2LDE5LDgxLDk3LDcsMzQsMTEzLDIwLDUwLDEyOSwxNDUsMTYxLDgsMzUsNjYsMTc3LDE5MywyMSw4MiwyMDksMjQwLDM2LDUxLDk4LDExNCwxMzAsOSwxMCwyMiwyMywyNCwyNSwyNiwzNywzOCwzOSw0MCw0MSw0Miw1Miw1Myw1NCw1NSw1Niw1Nyw1OCw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwxNTMsMTU0LDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3OCwxNzksMTgwLDE4MSwxODIsMTgzLDE4NCwxODUsMTg2LDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTBdLF9zPVswLDMsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDAsMCwwXSx3cz1bMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMV0sdnM9WzAsMiwxLDIsNCw0LDMsNCw3LDUsNCw0LDAsMSwyLDExOV0sRXM9WzAsMSwyLDMsMTcsNCw1LDMzLDQ5LDYsMTgsNjUsODEsNyw5NywxMTMsMTksMzQsNTAsMTI5LDgsMjAsNjYsMTQ1LDE2MSwxNzcsMTkzLDksMzUsNTEsODIsMjQwLDIxLDk4LDExNCwyMDksMTAsMjIsMzYsNTIsMjI1LDM3LDI0MSwyMywyNCwyNSwyNiwzOCwzOSw0MCw0MSw0Miw1Myw1NCw1NSw1Niw1Nyw1OCw2Nyw2OCw2OSw3MCw3MSw3Miw3Myw3NCw4Myw4NCw4NSw4Niw4Nyw4OCw4OSw5MCw5OSwxMDAsMTAxLDEwMiwxMDMsMTA0LDEwNSwxMDYsMTE1LDExNiwxMTcsMTE4LDExOSwxMjAsMTIxLDEyMiwxMzAsMTMxLDEzMiwxMzMsMTM0LDEzNSwxMzYsMTM3LDEzOCwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNjIsMTYzLDE2NCwxNjUsMTY2LDE2NywxNjgsMTY5LDE3MCwxNzgsMTc5LDE4MCwxODEsMTgyLDE4MywxODQsMTg1LDE4NiwxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MF07ZnVuY3Rpb24gQ3MoKXtsZXQgcj1bWzI1NSwxOTYsMCwzK2dzLmxlbmd0aCt5cy5sZW5ndGgsMF0sZ3MseXNdLGU9W1syNTUsMTk2LDAsMyticy5sZW5ndGgreHMubGVuZ3RoLDE8PDR8MF0sYnMseHNdLHQ9W1syNTUsMTk2LDAsMytfcy5sZW5ndGgrd3MubGVuZ3RoLDA8PDR8MV0sX3Msd3NdLG49W1syNTUsMTk2LDAsMyt2cy5sZW5ndGgrRXMubGVuZ3RoLDE8PDR8MV0sdnMsRXNdO3JldHVybiBCdWZmZXIuY29uY2F0KFsuLi5yLm1hcChCdWZmZXIuZnJvbSksLi4uZS5tYXAoQnVmZmVyLmZyb20pLC4uLnQubWFwKEJ1ZmZlci5mcm9tKSwuLi5uLm1hcChCdWZmZXIuZnJvbSldKX1mdW5jdGlvbiBCcygpe3JldHVybiBCdWZmZXIuZnJvbShbMjU1LDIxOCwwLDEyLDMsMCwwLDEsMTcsMiwxNywwLDYzLDBdKX1mdW5jdGlvbiBNcyhyKXtyZXR1cm4gQnVmZmVyLmZyb20oWzI1NSwyMjEsMCw0LHI+PjgsciYyNTVdKX1jKCk7YygpO2Z1bmN0aW9uIGhyKHIsZSx0KXtyZXR1cm4gcj50P3Q6cjxlP2U6cn12YXIgRWM9WzE2LDExLDEyLDE0LDEyLDEwLDE2LDE0LDEzLDE0LDE4LDE3LDE2LDE5LDI0LDQwLDI2LDI0LDIyLDIyLDI0LDQ5LDM1LDM3LDI5LDQwLDU4LDUxLDYxLDYwLDU3LDUxLDU2LDU1LDY0LDcyLDkyLDc4LDY0LDY4LDg3LDY5LDU1LDU2LDgwLDEwOSw4MSw4Nyw5NSw5OCwxMDMsMTA0LDEwMyw2Miw3NywxMTMsMTIxLDExMiwxMDAsMTIwLDkyLDEwMSwxMDMsOTldLFNjPVsxNywxOCwxOCwyNCwyMSwyNCw0NywyNiwyNiw0Nyw5OSw2Niw1Niw2Niw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OSw5OV07ZnVuY3Rpb24gTHMocil7bGV0IGU9aHIociwxLDk5KSx0PUJ1ZmZlci5hbGxvYygxMjgpLG49cjw1MD9NYXRoLmZsb29yKDVlMy9lKToyMDAtZSoyO2ZvcihsZXQgaT0wO2k8NjQ7aSsrKXtsZXQgbz1NYXRoLmZsb29yKChFY1tpXSpuKzUwKS8xMDApLHM9TWF0aC5mbG9vcigoU2NbaV0qbis1MCkvMTAwKTt0LndyaXRlVUludDgoaHIobywxLDI1NSksaSksdC53cml0ZVVJbnQ4KGhyKHMsMSwyNTUpLGkrNjQpfXJldHVybiB0fWZ1bmN0aW9uIHFuKHI9MCxlPTApe2xldCB0PVNzKCksbj1DcygpLGk9QnMoKTtyZXR1cm4gZnVuY3Rpb24ocyl7bGV0IGEsdT1bXTtmb3IobGV0IF8gb2Ygcyl7bGV0IHY9WihfKSxxPXYucmVhZFVJbnQ4KDApLEE9di5yZWFkVUludDgoMSk8PDE2fHYucmVhZFVJbnQ4KDIpPDw4fHYucmVhZFVJbnQ4KDMpLGo9di5yZWFkVUludDgoNCksWT12LnJlYWRVSW50OCg1KSxHZT12LnJlYWRVSW50OCg2KSo4fHxyLEllPXYucmVhZFVJbnQ4KDcpKjh8fGU7dj12LnNsaWNlKDgpO2xldCBBZT0wO2lmKGo+PTY0JiZqPD0xMjcmJihBZT12LnJlYWRVSW50MTZCRSgwKSx2PXYuc2xpY2UoNCkpLFk+PTEyOCYmQT09PTApe2xldCBvaT12LnJlYWRVSW50OCgxKSxBdD12LnJlYWRVSW50MTZCRSgyKSx1YT12LnNsaWNlKDQsNCtBdCk7YT17dHlwZVNwZWNpZmljOnEsdHlwZTpqLHdpZHRoOkdlLGhlaWdodDpJZSxEUkk6QWUscHJlY2lzaW9uOm9pLHFUYWJsZTp1YX0sdj12LnNsaWNlKDQrQXQpfWVsc2UgaWYoWTwxMjgmJkE9PT0wKXtsZXQgQXQ9THMoWSk7YT17dHlwZVNwZWNpZmljOnEsdHlwZTpqLHdpZHRoOkdlLGhlaWdodDpJZSxEUkk6QWUscHJlY2lzaW9uOjAscVRhYmxlOkF0fX11LnB1c2godil9aWYoYT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJubyBxdWFudGl6YXRpb24gaGVhZGVyIHByZXNlbnRcIik7bGV0e3ByZWNpc2lvbjpmLHFUYWJsZTpsLHR5cGU6ZCx3aWR0aDpoLGhlaWdodDptfT1hLGI9UnMoZixsKSx5PWEuRFJJPT09MD9CdWZmZXIuYWxsb2MoMCk6TXMoYS5EUkkpLHc9VHMoaCxtLGQpO3JldHVybntzaXplOnt3aWR0aDpoLGhlaWdodDptfSxkYXRhOkJ1ZmZlci5jb25jYXQoW3QsYix5LHcsbixpLC4uLnVdKX19fXZhciBJcz1DKE4oKSk7dmFyIGx0PWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCBlLHQ9W10sbixpPW5ldyBJcy5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKG8scyxhKXtpZihvLnR5cGU9PT01KXtsZXQgdT1vLnNkcC5tZWRpYS5maW5kKGY9PmYudHlwZT09PVwidmlkZW9cIiYmZi5ydHBtYXAhPT12b2lkIDAmJmYucnRwbWFwLmVuY29kaW5nTmFtZT09PVwiSlBFR1wiKTtpZih1IT09dm9pZCAwJiZ1LnJ0cG1hcCE9PXZvaWQgMCl7ZT1OdW1iZXIodS5ydHBtYXAucGF5bG9hZFR5cGUpO2xldCBmPXUuZnJhbWVzaXplO2lmKGYhPT12b2lkIDApe2xldFtsLGRdPWY7bj1xbihsLGQpfWVsc2Ugbj1xbigpfWEodm9pZCAwLG8pfWVsc2UgaWYoby50eXBlPT09MiYmTyhvLmRhdGEpPT09ZSl7aWYodC5wdXNoKG8uZGF0YSksY2Uoby5kYXRhKSYmdC5sZW5ndGg+MCl7bGV0IHU9bih0KTt0aGlzLnB1c2goe3RpbWVzdGFtcDpIKG8uZGF0YSksbnRwVGltZXN0YW1wOm8ubnRwVGltZXN0YW1wLHBheWxvYWRUeXBlOk8oby5kYXRhKSxkYXRhOnUuZGF0YSxmcmFtZXNpemU6dS5zaXplLHR5cGU6MTB9KSx0PVtdfWEoKX1lbHNlIGEodm9pZCAwLG8pfX0pO3N1cGVyKGkpfX07YygpO3ZhciBqbj1DKGxlKCkpO3ZhciBBcz1DKE4oKSk7dmFyIFJjPTIyNWU2LG1yPWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcih0PVJjKXtsZXQgbj1uZXcgQXMuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTooaSxvLHMpPT57dGhpcy5fYWN0aXZlJiZpLnR5cGU9PT04JiZpLnRyYWNrcyE9PXZvaWQgMCYmKHRoaXMuX2NhcHR1cmU9ITApLHRoaXMuX2NhcHR1cmUmJmkudHlwZT09PTgmJih0aGlzLl9idWZmZXJPZmZzZXQ8dGhpcy5fYnVmZmVyLmJ5dGVMZW5ndGgtaS5kYXRhLmJ5dGVMZW5ndGg/KGkuZGF0YS5jb3B5KHRoaXMuX2J1ZmZlcix0aGlzLl9idWZmZXJPZmZzZXQpLHRoaXMuX2J1ZmZlck9mZnNldCs9aS5kYXRhLmJ5dGVMZW5ndGgpOnRoaXMuc3RvcCgpKSxzKHZvaWQgMCxpKX19KTtuLm9uKFwiZmluaXNoXCIsKCk9Pnt0aGlzLnN0b3AoKX0pO3N1cGVyKG4pO3RoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2NVbnNhZmUoMCksdGhpcy5fYnVmZmVyU2l6ZT10LHRoaXMuX2J1ZmZlck9mZnNldD0wLHRoaXMuX2FjdGl2ZT0hMSx0aGlzLl9jYXB0dXJlPSExLHRoaXMuX2NhcHR1cmVDYWxsYmFjaz0oKT0+e319c3RhcnQodCl7dGhpcy5fYWN0aXZlfHwoKDAsam4uZGVmYXVsdCkoXCJtc2w6Y2FwdHVyZTpzdGFydFwiKSh0KSx0aGlzLl9jYXB0dXJlQ2FsbGJhY2s9dCx0aGlzLl9idWZmZXI9QnVmZmVyLmFsbG9jVW5zYWZlKHRoaXMuX2J1ZmZlclNpemUpLHRoaXMuX2J1ZmZlck9mZnNldD0wLHRoaXMuX2FjdGl2ZT0hMCl9c3RvcCgpe2lmKHRoaXMuX2FjdGl2ZSl7KDAsam4uZGVmYXVsdCkoXCJtc2w6Y2FwdHVyZTpzdG9wXCIpKGBjYXB0dXJlZCBieXRlczogJHt0aGlzLl9idWZmZXJPZmZzZXR9YCk7dHJ5e3RoaXMuX2NhcHR1cmVDYWxsYmFjayh0aGlzLl9idWZmZXIuc2xpY2UoMCx0aGlzLl9idWZmZXJPZmZzZXQpKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKHQpfXRoaXMuX2J1ZmZlcj1CdWZmZXIuYWxsb2NVbnNhZmUoMCksdGhpcy5fYnVmZmVyT2Zmc2V0PTAsdGhpcy5fYWN0aXZlPSExLHRoaXMuX2NhcHR1cmU9ITF9fX07YygpO3ZhciBZbj1DKGxlKCkpO2MoKTt2YXIgV249TWF0aC5wb3coMiwzMiksJD1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLmJ5dGVMZW5ndGg9ZX19LHRlPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0PTApe3N1cGVyKHQpO3RoaXMuY29weT0odCxuKT0+e3QuZmlsbCgwLG4sbit0aGlzLmJ5dGVMZW5ndGgpfX1sb2FkKCl7fX0sUmU9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQubGVuZ3RoKTt0aGlzLmNvcHk9KHQsbik9Pntmb3IobGV0IGk9MDtpPHRoaXMuYnl0ZUxlbmd0aDtpKz0xKXRbbitpXT10aGlzLnZhbHVlLmNoYXJDb2RlQXQoaSl9O3RoaXMubG9hZD0odCxuKT0+e3RoaXMudmFsdWU9dC5zbGljZShuLG4rdGhpcy5ieXRlTGVuZ3RoKS50b1N0cmluZyhcImFzY2lpXCIpfTt0aGlzLnZhbHVlPXR9fSxrPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0PTApe3N1cGVyKDEpO3RoaXMuY29weT0odCxuKT0+e3Qud3JpdGVVSW50OCh0aGlzLnZhbHVlLG4pfTt0aGlzLmxvYWQ9KHQsbik9Pnt0aGlzLnZhbHVlPXQucmVhZFVJbnQ4KG4pfTt0aGlzLnZhbHVlPXR9fSxMdD1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodCl7c3VwZXIodC5sZW5ndGgpO3RoaXMuY29weT0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7KytpKXQud3JpdGVVSW50OCh0aGlzLnZhbHVlW2ldLG4raSl9O3RoaXMubG9hZD0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7KytpKXRoaXMudmFsdWVbaV09dC5yZWFkVUludDgobitpKX07dGhpcy52YWx1ZT10fX0sTD1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodD0wKXtzdXBlcigyKTt0aGlzLmNvcHk9KHQsbik9Pnt0LndyaXRlVUludDE2QkUodGhpcy52YWx1ZSxuKX07dGhpcy5sb2FkPSh0LG4pPT57dGhpcy52YWx1ZT10LnJlYWRVSW50MTZCRShuKX07dGhpcy52YWx1ZT10fX0sJG49Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQ9MCl7c3VwZXIoMyk7dGhpcy5jb3B5PSh0LG4pPT57dC53cml0ZVVJbnQ4KHRoaXMudmFsdWU+PjE2JjI1NSxuKSx0LndyaXRlVUludDgodGhpcy52YWx1ZT4+OCYyNTUsbisxKSx0LndyaXRlVUludDgodGhpcy52YWx1ZSYyNTUsbisyKX07dGhpcy5sb2FkPSh0LG4pPT57dGhpcy52YWx1ZT10LnJlYWRVSW50OChuKTw8MTYrdC5yZWFkVUludDgobisxKTw8OCt0LnJlYWRVSW50OChuKzIpfTt0aGlzLnZhbHVlPXR9fSxHbj1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodCl7c3VwZXIodC5sZW5ndGgqMik7dGhpcy5jb3B5PSh0LG4pPT57Zm9yKGxldCBpPTA7aTx0aGlzLnZhbHVlLmxlbmd0aDsrK2kpdC53cml0ZVVJbnQxNkJFKHRoaXMudmFsdWVbaV0sbisyKmkpfTt0aGlzLmxvYWQ9KHQsbik9Pntmb3IobGV0IGk9MDtpPHRoaXMudmFsdWUubGVuZ3RoOysraSl0aGlzLnZhbHVlW2ldPXQucmVhZFVJbnQxNkJFKG4rMippKX07dGhpcy52YWx1ZT10fX0sZz1jbGFzcyBleHRlbmRzICR7Y29uc3RydWN0b3IodD0wKXtzdXBlcig0KTt0aGlzLmNvcHk9KHQsbik9Pnt0LndyaXRlVUludDMyQkUodGhpcy52YWx1ZSxuKX07dGhpcy5sb2FkPSh0LG4pPT57dGhpcy52YWx1ZT10LnJlYWRVSW50MzJCRShuKX07dGhpcy52YWx1ZT10fX0sZHQ9Y2xhc3MgZXh0ZW5kcyAke2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQubGVuZ3RoKjQpO3RoaXMuY29weT0odCxuKT0+e2ZvcihsZXQgaT0wO2k8dGhpcy52YWx1ZS5sZW5ndGg7KytpKXQud3JpdGVVSW50MzJCRSh0aGlzLnZhbHVlW2ldLG4rNCppKX07dGhpcy5sb2FkPSh0LG4pPT57Zm9yKGxldCBpPTA7aTx0aGlzLnZhbHVlLmxlbmd0aDsrK2kpdGhpcy52YWx1ZVtpXT10LnJlYWRVSW50MzJCRShuKzQqaSl9O3RoaXMudmFsdWU9dH19LFZuPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0PTApe3N1cGVyKDgpO3RoaXMuY29weT0odCxuKT0+e2xldCBpPXRoaXMudmFsdWUvV258MCxvPXRoaXMudmFsdWUtaSpXbjt0LndyaXRlVUludDMyQkUoaSxuKSx0LndyaXRlVUludDMyQkUobyxuKzQpfTt0aGlzLmxvYWQ9KHQsbik9PntsZXQgaT10LnJlYWRVSW50MzJCRShuKSxvPXQucmVhZFVJbnQzMkJFKG4rNCk7dGhpcy52YWx1ZT1pKlduK299O3RoaXMudmFsdWU9dH19LEZzPWZ1bmN0aW9uKHI9MCl7cmV0dXJuIGNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3RvcihuKXtzdXBlcigwKTt0aGlzLmNvcHk9KG4saSk9PntsZXQgbz0wO2ZvcihsZXQgcyBvZiB0aGlzLnZhbHVlKXMuY29weShuLGkrbyksbys9cy5ieXRlTGVuZ3RofTt0aGlzLmxvYWQ9KCk9Pnt9O3RoaXMudmFsdWU9bi5yZWR1Y2UoKGksbyk9PmkuY29uY2F0KG5ldyBMKG8ubGVuZ3RoKSxuZXcgTHQobykpLFtuZXcgayhyfG4ubGVuZ3RoKV0pLHRoaXMuYnl0ZUxlbmd0aD10aGlzLnZhbHVlLnJlZHVjZSgoaSxvKT0+aStvLmJ5dGVMZW5ndGgsMCl9fX0sUHM9e2Z0eXA6e2NvbnRhaW5lcjpcImZpbGVcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITAsYm9keTpbW1wibWFqb3JfYnJhbmRcIixSZSxcImlzb21cIl0sW1wibWlub3JfdmVyc2lvblwiLGcsMF0sW1wiY29tcGF0aWJsZV9icmFuZHNcIixSZSxcIm1wNDFcIl1dfSxtb292Ontjb250YWluZXI6XCJmaWxlXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSxtZGF0Ontjb250YWluZXI6XCJmaWxlXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5OlwiYW55XCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W119LG12aGQ6e2NvbnRhaW5lcjpcIm1vb3ZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImNyZWF0aW9uX3RpbWVcIixnLDBdLFtcIm1vZGlmaWNhdGlvbl90aW1lXCIsZywwXSxbXCJ0aW1lc2NhbGVcIixnLDFlM10sW1wiZHVyYXRpb25cIixnLDQyOTQ5NjcyOTVdLFtcInJhdGVcIixnLDY1NTM2XSxbXCJ2b2x1bWVcIixMLDI1Nl0sW1wicmVzZXJ2ZWRcIix0ZSwxMF0sW1wibWF0cml4XCIsZHQsWzY1NTM2LDAsMCwwLDY1NTM2LDAsMCwwLDEwNzM3NDE4MjRdXSxbXCJwcmVfZGVmaW5lZFwiLHRlLDI0XSxbXCJuZXh0X3RyYWNrX0lEXCIsZyw0Mjk0OTY3Mjk1XV19LHRyYWs6e2NvbnRhaW5lcjpcIm1vb3ZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmUrXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSx0a2hkOntjb250YWluZXI6XCJ0cmFrXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxjb25maWc6e2ZsYWdzOjN9LGJvZHk6W1tcImNyZWF0aW9uX3RpbWVcIixnLDBdLFtcIm1vZGlmaWNhdGlvbl90aW1lXCIsZywwXSxbXCJ0cmFja19JRFwiLGcsMV0sW1wicmVzZXJ2ZWRcIix0ZSw0XSxbXCJkdXJhdGlvblwiLGcsMF0sW1wicmVzZXJ2ZWQyXCIsdGUsOF0sW1wibGF5ZXJcIixMLDBdLFtcImFsdGVybmF0ZV9ncm91cFwiLEwsMF0sW1widm9sdW1lXCIsTCwyNTZdLFtcInJlc2VydmVkM1wiLHRlLDJdLFtcIm1hdHJpeFwiLGR0LFs2NTUzNiwwLDAsMCw2NTUzNiwwLDAsMCwxMDczNzQxODI0XV0sW1wid2lkdGhcIixnLDBdLFtcImhlaWdodFwiLGcsMF1dfSx0cmVmOntjb250YWluZXI6XCJ0cmFrXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMX0sbWRpYTp7Y29udGFpbmVyOlwidHJha1wiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sbWRoZDp7Y29udGFpbmVyOlwibWRpYVwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiY3JlYXRpb25fdGltZVwiLGcsMF0sW1wibW9kaWZpY2F0aW9uX3RpbWVcIixnLDBdLFtcInRpbWVzY2FsZVwiLGcsMWUzXSxbXCJkdXJhdGlvblwiLGcsNDI5NDk2NzI5NV0sW1wibGFuZ3VhZ2VcIixMLDBdLFtcInByZV9kZWZpbmVkXCIsTCwwXV19LGhkbHI6e2NvbnRhaW5lcjpcIm1kaWFcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcInByZWRlZmluZWRcIixnLDBdLFtcImhhbmRsZXJfdHlwZVwiLFJlLFwidmlkZVwiXSxbXCJyZXNlcnZlZFwiLHRlLDEyXSxbXCJuYW1lXCIsUmUsXCJWaWRlb0hhbmRsZXJcXDBcIl1dfSxtaW5mOntjb250YWluZXI6XCJtZGlhXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSx2bWhkOntjb250YWluZXI6XCJtaW5mXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxjb25maWc6e2ZsYWdzOjF9LGJvZHk6W1tcImdyYXBoaWNzbW9kZVwiLEwsMF0sW1wib3Bjb2xvclwiLEduLFswLDAsMF1dXX0sc21oZDp7Y29udGFpbmVyOlwibWluZlwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiYmFsYW5jZVwiLEwsMF0sW1wicmVzZXJ2ZWRcIixMXV19LGRpbmY6e2NvbnRhaW5lcjpcIm1pbmZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LGRyZWY6e2NvbnRhaW5lcjpcImRpbmZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiEwLGJvZHk6W1tcImVudHJ5X2NvdW50XCIsZywwXV19LFwidXJsIFwiOntjb250YWluZXI6XCJkcmVmXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lK1wiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsY29uZmlnOntmbGFnczoxfSxib2R5OltdfSxzdGJsOntjb250YWluZXI6XCJtaW5mXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSxzdHRzOntjb250YWluZXI6XCJzdGJsXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJlbnRyeV9jb3VudFwiLGcsMF1dfSxzdHNkOntjb250YWluZXI6XCJzdGJsXCIsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMCxib2R5OltbXCJlbnRyeV9jb3VudFwiLGcsMV1dfSxhdmMxOntjb250YWluZXI6XCJzdHNkXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwLGJvZHk6W1tcInJlc2VydmVkXCIsdGUsNl0sW1wiZGF0YV9yZWZlcmVuY2VfaW5kZXhcIixMLDFdLFtcInByZV9kZWZpbmVkXCIsTCwwXSxbXCJyZXNlcnZlZDJcIix0ZSwyXSxbXCJwcmVfZGVmaW5lZDJcIixkdCxbMCwwLDBdXSxbXCJ3aWR0aFwiLEwsMTkyMF0sW1wiaGVpZ2h0XCIsTCwxMDgwXSxbXCJob3JpenJlc29sdXRpb25cIixnLDQ3MTg1OTJdLFtcInZlcnRyZXNvbHV0aW9uXCIsZyw0NzE4NTkyXSxbXCJyZXNlcnZlZDNcIixnLDBdLFtcImZyYW1lX2NvdW50XCIsTCwxXSxbXCJjb21wcmVzc29ybmFtZVwiLEx0LEJ1ZmZlci5hbGxvYygzMildLFtcImRlcHRoXCIsTCwyNF0sW1wicHJlX2RlZmluZWQzXCIsTCw2NTUzNV1dfSxhdmNDOntjb250YWluZXI6XCJhdmMxXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImNvbmZpZ3VyYXRpb25WZXJzaW9uXCIsaywxXSxbXCJBVkNQcm9maWxlSW5kaWNhdGlvblwiLGssNzddLFtcInByb2ZpbGVfY29tcGF0aWJpbGl0eVwiLGssMF0sW1wiQVZDTGV2ZWxJbmRpY2F0aW9uXCIsayw0MV0sW1wibGVuZ3RoU2l6ZU1pbnVzT25lXCIsaywyNTVdLFtcInNlcXVlbmNlUGFyYW1ldGVyU2V0c1wiLEZzKDIyNCksW11dLFtcInBpY3R1cmVQYXJhbWV0ZXJTZXRzXCIsRnMoKSxbXV1dfSxtcDRhOntjb250YWluZXI6XCJzdHNkXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwLGJvZHk6W1tcInJlc2VydmVkXCIsdGUsNl0sW1wiZGF0YV9yZWZlcmVuY2VfaW5kZXhcIixMLDFdLFtcInJlc2VydmVkMlwiLGR0LFswLDBdXSxbXCJjaGFubmVsY291bnRcIixMLDJdLFtcInNhbXBsZXNpemVcIixMLDE2XSxbXCJwcmVfZGVmaW5lZFwiLEwsMF0sW1wicmVzZXJ2ZWQzXCIsTCwwXSxbXCJzYW1wbGVyYXRlXCIsZywwXV19LGVzZHM6e2NvbnRhaW5lcjpcIm1wNGFcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcIkVTX0Rlc2NyVGFnXCIsaywzXSxbXCJFU19EZXNjckxlbmd0aFwiLGssMjVdLFtcIkVTX0lEXCIsTCwxXSxbXCJmbGFnc0FuZFN0cmVhbVByaW9yaXR5XCIsaywwXSxbXCJEZWNvZGVyQ29uZmlnRGVzY3JUYWdcIixrLDRdLFtcIkRlY29kZXJDb25maWdEZXNjckxlbmd0aFwiLGssMTddLFtcIm9iamVjdFByb2ZpbGVJbmRpY2F0aW9uXCIsayw2NF0sW1wic3RyZWFtVHlwZVVwc3RyZWFtUmVzZXJ2ZWRcIixrLDIxXSxbXCJidWZmZXJTaXplREJcIixMdCxbMCwwLDBdXSxbXCJtYXhCaXRSYXRlXCIsZywwXSxbXCJhdmdCaXRSYXRlXCIsZywwXSxbXCJEZWNTcGVjaWZpY0luZm9TaG9ydFRhZ1wiLGssNV0sW1wiRGVjU3BlY2lmaWNJbmZvU2hvcnRMZW5ndGhcIixrLDJdLFtcImF1ZGlvQ29uZmlnQnl0ZXNcIixMLDBdLFtcIlNMQ29uZmlnRGVzY3JUYWdcIixrLDZdLFtcIlNMQ29uZmlnRGVzY3JMZW5ndGhcIixrLDFdLFtcIlNMQ29uZmlnRGVzY3JQcmVkZWZpbmVkXCIsaywyXV19LHN0c3o6e2NvbnRhaW5lcjpcInN0YmxcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcInNhbXBsZV9zaXplXCIsZywwXSxbXCJzYW1wbGVfY291bnRcIixnLDBdXX0sc3RzYzp7Y29udGFpbmVyOlwic3RibFwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDBdXX0sc3Rjbzp7Y29udGFpbmVyOlwic3RibFwiLG1hbmRhdG9yeTohMCxxdWFudGl0eTpcIm9uZVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDBdXX0sc3Rzczp7Y29udGFpbmVyOlwic3RibFwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImVudHJ5X2NvdW50XCIsZywwXV19LGVkdHM6e2NvbnRhaW5lcjpcInRyYWtcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJvbmUtXCIsYm94OlwiQm94XCIsaXNfY29udGFpbmVyOiEwfSxlbHN0Ontjb250YWluZXI6XCJlZHRzXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsYm9keTpbW1wiZW50cnlfY291bnRcIixnLDFdLFtcInNlZ21lbnRfZHVyYXRpb25cIixnLDBdLFtcIm1lZGlhX3RpbWVcIixnLDQyOTQ5NjcyOTVdLFtcIm1lZGlhX3JhdGVfaW50ZWdlclwiLEwsMV0sW1wibWVkaWFfcmF0ZV9mcmFjdGlvblwiLEwsMF1dfSxtdmV4Ontjb250YWluZXI6XCJtb292XCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkJveFwiLGlzX2NvbnRhaW5lcjohMH0sbWVoZDp7Y29udGFpbmVyOlwibXZleFwiLG1hbmRhdG9yeTohMSxxdWFudGl0eTpcIm9uZS1cIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcImZyYWdtZW50X2R1cmF0aW9uXCIsZywwXV19LHRyZXg6e2NvbnRhaW5lcjpcIm12ZXhcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmUrXCIsYm94OlwiRnVsbEJveFwiLGlzX2NvbnRhaW5lcjohMSxib2R5OltbXCJ0cmFja19JRFwiLGcsMV0sW1wiZGVmYXVsdF9zYW1wbGVfZGVzY3JpcHRpb25faW5kZXhcIixnLDFdLFtcImRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uXCIsZywwXSxbXCJkZWZhdWx0X3NhbXBsZV9zaXplXCIsZywwXSxbXCJkZWZhdWx0X3NhbXBsZV9mbGFnc1wiLGcsMF1dfSxtb29mOntjb250YWluZXI6XCJmaWxlXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5OlwiemVybytcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITF9LG1maGQ6e2NvbnRhaW5lcjpcIm1vb2ZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W1tcInNlcXVlbmNlX251bWJlclwiLGcsMF1dfSx0cmFmOntjb250YWluZXI6XCJtb29mXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5OlwiemVybytcIixib3g6XCJCb3hcIixpc19jb250YWluZXI6ITB9LHRmaGQ6e2NvbnRhaW5lcjpcInRyYWZcIixtYW5kYXRvcnk6ITAscXVhbnRpdHk6XCJvbmVcIixib3g6XCJGdWxsQm94XCIsaXNfY29udGFpbmVyOiExLGNvbmZpZzp7ZmxhZ3M6MzJ9LGJvZHk6W1tcInRyYWNrX0lEXCIsZywxXSxbXCJkZWZhdWx0X3NhbXBsZV9mbGFnc1wiLGcsMF1dfSx0ZmR0Ontjb250YWluZXI6XCJ0cmFmXCIsbWFuZGF0b3J5OiExLHF1YW50aXR5Olwib25lLVwiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsY29uZmlnOnt2ZXJzaW9uOjF9LGJvZHk6W1tcImJhc2VNZWRpYURlY29kZVRpbWVcIixWbiwwXV19LHRydW46e2NvbnRhaW5lcjpcInRyYWZcIixtYW5kYXRvcnk6ITEscXVhbnRpdHk6XCJ6ZXJvK1wiLGJveDpcIkZ1bGxCb3hcIixpc19jb250YWluZXI6ITEsY29uZmlnOntmbGFnczo3NzN9LGJvZHk6W1tcInNhbXBsZV9jb3VudFwiLGcsMV0sW1wiZGF0YV9vZmZzZXRcIixnLDBdLFtcImZpcnN0X3NhbXBsZV9mbGFnc1wiLGcsMF0sW1wic2FtcGxlX2R1cmF0aW9uXCIsZywwXSxbXCJzYW1wbGVfc2l6ZVwiLGcsMF1dfSxcIi4uLi5cIjp7Ym94OlwiQm94XCIsaXNfY29udGFpbmVyOiExLGJvZHk6W119LGZpbGU6e2JveDpcIk5vbmVcIixpc19jb250YWluZXI6ITAsbWFuZGF0b3J5OiEwLHF1YW50aXR5Olwib25lXCJ9fSx6bj1jbGFzc3tzdGF0aWMgTm9uZSgpe3JldHVybltdfXN0YXRpYyBCb3goZSl7cmV0dXJuW1tcInNpemVcIixnLDBdLFtcInR5cGVcIixSZSxlXV19c3RhdGljIEZ1bGxCb3goZSl7cmV0dXJuW10uY29uY2F0KHRoaXMuQm94KGUpLFtbXCJ2ZXJzaW9uXCIsaywwXSxbXCJmbGFnc1wiLCRuLDBdXSl9fSxUPWNsYXNzIGV4dGVuZHMgJHtjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKDApO3RoaXMudHlwZT10O2xldCBpPVBzW3RoaXMudHlwZV07aWYoaT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gYm94IHR5cGU6ICR7dH1gKTt0aGlzLmNvbmZpZz1PYmplY3QuYXNzaWduKHt9LGkuY29uZmlnLG4pO2xldCBvPXpuW2kuYm94XSh0aGlzLnR5cGUpLHM9aS5ib2R5fHxbXTt0aGlzLnN0cnVjdD1uZXcgTWFwO2xldCBhPTA7Zm9yKGxldFt1LGYsbF1vZltdLmNvbmNhdChvLHMpKXtpZih0aGlzLmhhcyh1KSl0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gYWRkIGV4aXN0aW5nIGtleVwiKTtsZXQgZD1sO3RoaXMuY29uZmlnW3VdJiYoZD10aGlzLmNvbmZpZ1t1XSk7bGV0IGg9bmV3IGYoZCk7dGhpcy5zdHJ1Y3Quc2V0KHUse29mZnNldDphLGVsZW1lbnQ6aH0pLGErPWguYnl0ZUxlbmd0aH10aGlzLmJ5dGVMZW5ndGg9YX1lbGVtZW50KHQpe2xldCBuPXRoaXMuc3RydWN0LmdldCh0KTtpZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImludmFsaWQga2V5XCIpO3JldHVybiBuLmVsZW1lbnR9c2V0KHQsbil7dGhpcy5lbGVtZW50KHQpLnZhbHVlPW59Z2V0KHQpe3JldHVybiB0aGlzLmVsZW1lbnQodCkudmFsdWV9b2Zmc2V0KHQpe2xldCBuPXRoaXMuc3RydWN0LmdldCh0KTtpZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImludmFsaWQga2V5XCIpO3JldHVybiBuLm9mZnNldH1oYXModCl7cmV0dXJuIHRoaXMuc3RydWN0Lmhhcyh0KX1hZGQodCxuKXtpZih0aGlzLmhhcyh0KSl0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gYWRkIGV4aXN0aW5nIGtleVwiKTtyZXR1cm4gdGhpcy5zdHJ1Y3Quc2V0KHQse29mZnNldDp0aGlzLmJ5dGVMZW5ndGgsZWxlbWVudDpufSksdGhpcy5ieXRlTGVuZ3RoKz1uLmJ5dGVMZW5ndGgsdGhpc31idWZmZXIoKXtsZXQgdD1CdWZmZXIuYWxsb2NVbnNhZmUodGhpcy5ieXRlTGVuZ3RoKTtyZXR1cm4gdGhpcy5jb3B5KHQpLHR9Y29weSh0LG49MCl7dGhpcy5zZXQoXCJzaXplXCIsdGhpcy5ieXRlTGVuZ3RoKTtmb3IobGV0IGkgb2YgdGhpcy5zdHJ1Y3QudmFsdWVzKCkpaS5lbGVtZW50LmNvcHkodCxuK2kub2Zmc2V0KX1sb2FkKHQsbj0wKXtmb3IobGV0IGkgb2YgdGhpcy5zdHJ1Y3QudmFsdWVzKCkpaS5lbGVtZW50LmxvYWQhPT12b2lkIDAmJmkuZWxlbWVudC5sb2FkKHQsbitpLm9mZnNldCl9Zm9ybWF0KHQ9MCl7bGV0IG49W1wiIFwiLnJlcGVhdCh0KStgWyR7dGhpcy50eXBlfV0gKCR7dGhpcy5ieXRlTGVuZ3RofSlgXTtmb3IobGV0W2ksb11vZiB0aGlzLnN0cnVjdCl7bGV0IHM9by5lbGVtZW50O3MuZm9ybWF0IT09dm9pZCAwP24ucHVzaChzLmZvcm1hdCh0KzIpKTpuLnB1c2goXCIgXCIucmVwZWF0KHQrMikrYCR7aX0gPSAke3MudmFsdWV9ICgke3MuYnl0ZUxlbmd0aH0pYCl9cmV0dXJuIG4uam9pbihgXG5gKX1wcmludCh0KXtjb25zb2xlLndhcm4odGhpcy5mb3JtYXQodCkpfX0sVT1jbGFzcyBleHRlbmRzIFR7Y29uc3RydWN0b3IodCxuLC4uLmkpe3N1cGVyKHQsbik7dGhpcy5ib3hTaXplPTAsdGhpcy5hcHBlbmQoLi4uaSl9YXBwZW5kKC4uLnQpe2ZvcihsZXQgbiBvZiB0KXRoaXMuYWRkKGBib3hfJHt0aGlzLmJveFNpemUrK31gLG4pO3JldHVybiB0aGlzfXBhcnNlKHQpe2xldCBuPVtdO2Zvcig7dC5ieXRlTGVuZ3RoPjA7KXtsZXQgaT1uZXcgUmUoXCIuLi4uXCIpO2kubG9hZCh0LDQpO2xldCBvPWkudmFsdWUscz1Qc1tvXSxhO2lmKHMhPT12b2lkIDApe2lmKHMuaXNfY29udGFpbmVyKXthPW5ldyBVKG8pLGEubG9hZCh0KTtsZXQgdT1hLnBhcnNlKHQuc2xpY2UoYS5ieXRlTGVuZ3RoLGEuZ2V0KFwic2l6ZVwiKSkpO24ucHVzaCguLi51KX1lbHNlIGlmKGE9bmV3IFQobyksYS5sb2FkKHQpLG89PT1cImF2Y0NcIil7bGV0IHU9YS5lbGVtZW50KFwiQVZDUHJvZmlsZUluZGljYXRpb25cIikudmFsdWUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsMCksZj1hLmVsZW1lbnQoXCJwcm9maWxlX2NvbXBhdGliaWxpdHlcIikudmFsdWUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsMCksbD1hLmVsZW1lbnQoXCJBVkNMZXZlbEluZGljYXRpb25cIikudmFsdWUudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsMCk7bi5wdXNoKHt0eXBlOlwidmlkZW9cIixtaW1lOmBhdmMxLiR7dX0ke2Z9JHtsfWB9KX1lbHNlIGlmKG89PT1cImVzZHNcIil7bGV0IGY9YS5lbGVtZW50KFwiYXVkaW9Db25maWdCeXRlc1wiKS52YWx1ZT4+PjExJjMxO24ucHVzaCh7dHlwZTpcImF1ZGlvXCIsbWltZTpgbXA0YS40MC4ke2Z9YH0pfX1lbHNlIGE9bmV3IFQoXCIuLi4uXCIpLGEubG9hZCh0KSxhLnR5cGU9YS5nZXQoXCJ0eXBlXCIpO3RoaXMuYXBwZW5kKGEpLHQ9dC5zbGljZShhLmdldChcInNpemVcIikpfXJldHVybiBufX07YygpO2MoKTt2YXIgVGM9ezE6XCJBQUMgTWFpblwiLDI6XCJBQUMgTENcIn0sQ2M9ezA6XCI5NiBrSHpcIiwxOlwiODguMiBrSHpcIiwyOlwiNjQga0h6XCIsMzpcIjQ4IGtIelwiLDQ6XCI0NC4xIGtIelwiLDU6XCIzMiBrSHpcIiw2OlwiMjQga0h6XCIsNzpcIjIyLjA1IGtIelwiLDg6XCIxNiBrSHpcIiw5OlwiMTIga0h6XCIsMTA6XCIxMS4wMjUga0h6XCIsMTE6XCI4IGtIelwiLDEyOlwiNy4zNSBrSHpcIn0sQmM9ezE6XCJNb25vXCIsMjpcIlN0ZXJlb1wifSxNYz1yPT57bGV0IGU9cj4+PjExJjMxLHQ9cj4+PjcmMTUsbj1yPj4+MyYxNSxpPVRjW2VdfHxgQUFDICgke2V9KWAsbz1DY1t0XXx8XCJ1bmtub3duXCIscz1CY1tuXXx8bi50b1N0cmluZygpO3JldHVybntjb2Rpbmc6aSxzYW1wbGluZ1JhdGU6byxjaGFubmVsczpzfX0sa3M9KHIsZSx0KT0+e2xldCBuPU51bWJlcihyLmZtdHAucGFyYW1ldGVycy5iaXRyYXRlKXx8MzJlNCxpPXBhcnNlSW50KHIuZm10cC5wYXJhbWV0ZXJzLmNvbmZpZy5zdWJzdHIoMCw0KSwxNiksbz1pPj4+MTEmMzE7cmV0dXJue3RraGQ6e3RyYWNrX0lEOnQsY3JlYXRpb25fdGltZTplLG1vZGlmaWNhdGlvbl90aW1lOmUsd2lkdGg6MCxoZWlnaHQ6MCx2b2x1bWU6MX0sbWRoZDp7dGltZXNjYWxlOk51bWJlcihyLnJ0cG1hcC5jbG9ja3JhdGUpLGNyZWF0aW9uX3RpbWU6ZSxtb2RpZmljYXRpb25fdGltZTplLGR1cmF0aW9uOjB9LGhkbHI6e2hhbmRsZXJfdHlwZTpcInNvdW5cIixuYW1lOlwiU291bmRIYW5kbGVyXFwwXCJ9LG1lZGlhSGVhZGVyQm94Om5ldyBUKFwic21oZFwiKSxzYW1wbGVFbnRyeUJveDpuZXcgVShcIm1wNGFcIix7c2FtcGxlcmF0ZTpyLnJ0cG1hcC5jbG9ja3JhdGU8PDE2Pj4+MH0sbmV3IFQoXCJlc2RzXCIse2F1ZGlvQ29uZmlnQnl0ZXM6aSxtYXhCaXRSYXRlOm4sYXZnQml0UmF0ZTpufSkpLGRlZmF1bHRGcmFtZUR1cmF0aW9uOjEwMjQsbWltZTpgbXA0YS40MC4ke299YCxjb2RlYzpNYyhpKX19O2MoKTtjKCk7ZnVuY3Rpb24gTGMocil7cmV0dXJuIHI+NjQmJnI8OTE/ci02NTpyPjk2JiZyPDEyMz9yLTcxOnI+NDcmJnI8NTg/cis0OnI9PT00Mz82MjpyPT09NDc/NjM6MH1mdW5jdGlvbiBPcyhyLGUpe2xldCB0PXIucmVwbGFjZSgvW15BLVphLXowLTkrL10vZyxcIlwiKSxuPXQubGVuZ3RoLGk9ZT9NYXRoLmNlaWwoKG4qMysxPj4yKS9lKSplOm4qMysxPj4yLG89bmV3IFVpbnQ4QXJyYXkoaSkscyxhLHU9MCxmPTA7Zm9yKGxldCBsPTA7bDxuO2wrKylpZihhPWwmMyx1fD1MYyh0LmNoYXJDb2RlQXQobCkpPDwxOC02KmEsYT09PTN8fG4tbD09PTEpe2ZvcihzPTA7czwzJiZmPGk7cysrLGYrKylvW2ZdPXU+Pj4oMTY+Pj5zJjI0KSYyNTU7dT0wfXJldHVybiBvfWMoKTtjKCk7dmFyIGdyPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuX2J1ZmZlcj1lLHRoaXMuX2RhdGFWaWV3PW5ldyBEYXRhVmlldyh0aGlzLl9idWZmZXIpLHRoaXMuX29mZnNldD0wLHRoaXMuX2JpdHBvcz0wLHRoaXMuX2J5dGU9MH1yZWFkVWludDgoZSl7cmV0dXJuIHRoaXMuX2RhdGFWaWV3LmdldFVpbnQ4KGUpfXJlYWRVaW50MTYoZSl7cmV0dXJuIHRoaXMuX2RhdGFWaWV3LmdldFVpbnQxNihlKX1yZWFkVWludDMyKGUpe3JldHVybiB0aGlzLl9kYXRhVmlldy5nZXRVaW50MzIoZSl9cmVhZE5leHQoKXtsZXQgZT10aGlzLnJlYWRVaW50OCh0aGlzLl9vZmZzZXQpO3JldHVybiB0aGlzLl9vZmZzZXQrPTEsZX1yZWFkQml0cyhlKXtpZihlPjMyfHxlPT09MCl0aHJvdyBuZXcgRXJyb3IoXCJsZW5ndGggaGFzIHRvIGJlIGJldHdlZW4gMCAtIDMxIGJpdHNcIik7bGV0IHQ9MDtmb3IobGV0IG49MTtuPD1lOysrbil0aGlzLl9iaXRwb3M9PT0wJiYodGhpcy5fYnl0ZT10aGlzLnJlYWROZXh0KCkpLHQ9dDw8MXx0aGlzLl9ieXRlPj44LSsrdGhpcy5fYml0cG9zJjEsdGhpcy5fYml0cG9zJT04O3JldHVybiB0fXJlYWRVbnNpZ25lZEV4cEdvbG9tYigpe2xldCBlPTA7Zm9yKDt0aGlzLnJlYWRCaXRzKDEpIT09MTspZSsrO2lmKGU9PT0wKXJldHVybiAwO2lmKGU+PTMxKXRocm93IG5ldyBFcnJvcihcInJlYWQgdW5zaWduZWQgZXhwb25lbnRpYWwgR29sb21iOiBpbnRlcm5hbCBlcnJvclwiKTtsZXQgdD10aGlzLnJlYWRCaXRzKGUpO3JldHVybiB0fD0xPDxlLHQtMX1yZWFkU2lnbmVkRXhwR29sb21iKCl7bGV0IGU9dGhpcy5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtyZXR1cm4gZSYxP2U9ZSsxPj4xOmU9LShlPj4xKSxlfXNpemUoKXtyZXR1cm4gdGhpcy5fYnVmZmVyLmJ5dGVMZW5ndGh9Z2V0VWludDhBcnJheSgpe3JldHVybiBuZXcgVWludDhBcnJheSh0aGlzLl9idWZmZXIpfWdldEFycmF5QnVmZmVyKCl7cmV0dXJuIHRoaXMuX2J1ZmZlcn19O3ZhciB5cj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLnJlYWRlcj1uZXcgZ3IoZSl9cGFyc2UoKXt0aGlzLnJlYWRlci5yZWFkTmV4dCgpO2xldCBlPXRoaXMucmVhZGVyLnJlYWROZXh0KCk7dGhpcy5yZWFkZXIucmVhZE5leHQoKTtsZXQgdD10aGlzLnJlYWRlci5yZWFkTmV4dCgpO2lmKHRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpLFsxMDAsMTEwLDEyMiwyNDQsNDQsODMsODYsMTE4XS5pbmNsdWRlcyhlKSl7bGV0IGI9dGhpcy5yZWFkZXIucmVhZFVuc2lnbmVkRXhwR29sb21iKCk7aWYoYj09PTMmJnRoaXMucmVhZGVyLnJlYWRCaXRzKDEpLHRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpLHRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpLHRoaXMucmVhZGVyLnJlYWRCaXRzKDEpLHRoaXMucmVhZGVyLnJlYWRCaXRzKDEpKWZvcihsZXQgdz0wO3c8KGIhPT0zPzg6MTIpO3crKyl0aGlzLnJlYWRlci5yZWFkQml0cygxKX10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtsZXQgbj10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtpZihuPT09MCl0aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtlbHNlIGlmKG49PT0xKXtsZXQgYj0wO3RoaXMucmVhZGVyLnJlYWRCaXRzKDEpLHRoaXMucmVhZGVyLnJlYWRTaWduZWRFeHBHb2xvbWIoKSx0aGlzLnJlYWRlci5yZWFkU2lnbmVkRXhwR29sb21iKCksYj10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKTtmb3IobGV0IHk9MDt5PGI7eSsrKXRoaXMucmVhZGVyLnJlYWRTaWduZWRFeHBHb2xvbWIoKX10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKSx0aGlzLnJlYWRlci5yZWFkQml0cygxKTtsZXQgaT10aGlzLnJlYWRlci5yZWFkVW5zaWduZWRFeHBHb2xvbWIoKSxvPXRoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpLHM9dGhpcy5yZWFkZXIucmVhZEJpdHMoMSk7dGhpcy5yZWFkZXIucmVhZEJpdHMoMSk7bGV0IGE9dGhpcy5yZWFkZXIucmVhZEJpdHMoMSksdT1hP3RoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpOjAsZj1hP3RoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpOjAsbD1hP3RoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpOjAsZD1hP3RoaXMucmVhZGVyLnJlYWRVbnNpZ25lZEV4cEdvbG9tYigpOjAsaD0oaSsxKSoxNi11KjItZioyLG09KDItcykqKG8rMSkqMTYtbCoyLWQqMjtyZXR1cm57cHJvZmlsZTplLGxldmVsOnQvMTAsd2lkdGg6aCxoZWlnaHQ6bX19fTt2YXIgSWM9ezY2OlwiQmFzZWxpbmVcIiw3NzpcIk1haW5cIiwxMDA6XCJIaWdoXCJ9LEFjPXI9PntsZXQgZT1wYXJzZUludChyLnN1YnN0cigwLDIpLDE2KSx0PXBhcnNlSW50KHIuc3Vic3RyKDQsMiksMTYpLG49SWNbZV18fGUudG9TdHJpbmcoKSxpPSh0LzEwKS50b0ZpeGVkKDEpO3JldHVybntjb2Rpbmc6XCJILjI2NFwiLHByb2ZpbGU6bixsZXZlbDppfX0sVXM9KHIsZSx0KT0+e2xldCBuPXIuZm10cC5wYXJhbWV0ZXJzW1wicHJvZmlsZS1sZXZlbC1pZFwiXSxpPXIuZm10cC5wYXJhbWV0ZXJzW1wic3Byb3AtcGFyYW1ldGVyLXNldHNcIl0uc3BsaXQoXCIsXCIpLm1hcChPcyksbz1pLnNsaWNlKDAsMSkscz1pLnNsaWNlKDEpLGE9bmV3IHlyKG9bMF0uYnVmZmVyKS5wYXJzZSgpLHU9MzYwMDtyZXR1cm57bWVkaWFIZWFkZXJCb3g6bmV3IFQoXCJ2bWhkXCIpLHNhbXBsZUVudHJ5Qm94Om5ldyBVKFwiYXZjMVwiLHt3aWR0aDphLndpZHRoLGhlaWdodDphLmhlaWdodH0sbmV3IFQoXCJhdmNDXCIse0FWQ1Byb2ZpbGVJbmRpY2F0aW9uOm9bMF1bMV0scHJvZmlsZV9jb21wYXRpYmlsaXR5Om9bMF1bMl0sQVZDTGV2ZWxJbmRpY2F0aW9uOm9bMF1bM10sc2VxdWVuY2VQYXJhbWV0ZXJTZXRzOm8scGljdHVyZVBhcmFtZXRlclNldHM6c30pKSx0a2hkOnt0cmFja19JRDp0LGNyZWF0aW9uX3RpbWU6ZSxtb2RpZmljYXRpb25fdGltZTplLHdpZHRoOmEud2lkdGg8PDE2LGhlaWdodDphLmhlaWdodDw8MTYsdm9sdW1lOjB9LGhkbHI6e30sbWRoZDp7dGltZXNjYWxlOnIucnRwbWFwLmNsb2NrcmF0ZSxjcmVhdGlvbl90aW1lOmUsbW9kaWZpY2F0aW9uX3RpbWU6ZSxkdXJhdGlvbjowfSxkZWZhdWx0RnJhbWVEdXJhdGlvbjpyLmZyYW1lcmF0ZSE9PXZvaWQgMCYmci5mcmFtZXJhdGU+MCYmTnVtYmVyKHIucnRwbWFwLmNsb2NrcmF0ZSkvTnVtYmVyKHIuZnJhbWVyYXRlKXx8dSxtaW1lOmBhdmMxLiR7bn1gLGNvZGVjOkFjKG4pfX07dmFyIERzPXtcIk1QRUc0LUdFTkVSSUNcIjprcyxIMjY0OlVzfSxGYz0oKT0+KHtsYXN0VGltZXN0YW1wOjAsYmFzZU1lZGlhRGVjb2RlVGltZTowLGRlZmF1bHRGcmFtZUR1cmF0aW9uOjAsY2xvY2tyYXRlOjAsYml0cmF0ZTowLGZyYW1lcmF0ZTowLGN1bXVsYXRpdmVCeXRlTGVuZ3RoOjAsY3VtdWxhdGl2ZUR1cmF0aW9uOjAsY3VtdWxhdGl2ZUZyYW1lczowfSksUGM9KHIse2J5dGVMZW5ndGg6ZSxkdXJhdGlvbjp0fSk9PntpZihyLmN1bXVsYXRpdmVCeXRlTGVuZ3RoKz1lLHIuY3VtdWxhdGl2ZUR1cmF0aW9uKz10LHIuY3VtdWxhdGl2ZUZyYW1lcysrLHIuY3VtdWxhdGl2ZUR1cmF0aW9uPj1yLmNsb2NrcmF0ZSl7bGV0IG49OCpyLmN1bXVsYXRpdmVCeXRlTGVuZ3RoLGk9ci5jdW11bGF0aXZlRnJhbWVzLG89ci5jdW11bGF0aXZlRHVyYXRpb24vci5jbG9ja3JhdGU7ci5iaXRyYXRlPW4vbyxyLmZyYW1lcmF0ZT1pL28sci5jdW11bGF0aXZlQnl0ZUxlbmd0aD0wLHIuY3VtdWxhdGl2ZUR1cmF0aW9uPTAsci5jdW11bGF0aXZlRnJhbWVzPTB9fSxicj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMudHJhY2tJZE1hcD17fSx0aGlzLnNlcXVlbmNlTnVtYmVyPTAsdGhpcy5udHBQcmVzZW50YXRpb25UaW1lPTAsdGhpcy50cmFja0RhdGE9W119dHJhayhlKXtsZXQgdD1uZXcgVShcInRyYWtcIiksbj1uZXcgVShcIm1kaWFcIiksaT1uZXcgVShcIm1pbmZcIiksbz1uZXcgVShcImRpbmZcIikscz1uZXcgVShcImRyZWZcIiksYT1uZXcgVShcInN0YmxcIik7cmV0dXJuIHMuc2V0KFwiZW50cnlfY291bnRcIiwxKSx0LmFwcGVuZChuZXcgVChcInRraGRcIixlLnRraGQpLG4uYXBwZW5kKG5ldyBUKFwibWRoZFwiLGUubWRoZCksbmV3IFQoXCJoZGxyXCIsZS5oZGxyKSxpLmFwcGVuZChlLm1lZGlhSGVhZGVyQm94LG8uYXBwZW5kKHMuYXBwZW5kKG5ldyBUKFwidXJsIFwiKSkpLGEuYXBwZW5kKG5ldyBVKFwic3RzZFwiLHZvaWQgMCxlLnNhbXBsZUVudHJ5Qm94KSxuZXcgVChcInN0dHNcIiksbmV3IFQoXCJzdHNjXCIpLG5ldyBUKFwic3Rjb1wiKSxuZXcgVChcInN0c3pcIiksbmV3IFQoXCJzdHNzXCIpKSkpKSx0fW1vb3YoZSx0KXtsZXQgbj1uZXcgVShcIm1vb3ZcIik7bi5hcHBlbmQobmV3IFQoXCJtdmhkXCIse2NyZWF0aW9uX3RpbWU6dCxtb2RpZmljYXRpb25fdGltZTp0LGR1cmF0aW9uOjB9KSk7bGV0IGk9bmV3IFUoXCJtdmV4XCIpO3RoaXMudHJhY2tJZE1hcD17fSx0aGlzLnNlcXVlbmNlTnVtYmVyPTAsdGhpcy5udHBQcmVzZW50YXRpb25UaW1lPTA7bGV0IG89MDtyZXR1cm4gdGhpcy50cmFja0RhdGE9W10sZS5tZWRpYS5mb3JFYWNoKHM9PntpZihzLnJ0cG1hcD09PXZvaWQgMClyZXR1cm47bGV0IGE9cy5ydHBtYXAucGF5bG9hZFR5cGUsdT1zLnJ0cG1hcC5lbmNvZGluZ05hbWU7aWYoRHNbdV0hPT12b2lkIDApe3RoaXMudHJhY2tJZE1hcFthXT0rK28scy50eXBlLnRvTG93ZXJDYXNlKCk9PT1cInZpZGVvXCImJih0aGlzLnZpZGVvVHJhY2tJZD1vKTtsZXQgZj1Ec1t1XShzLHQsbyk7cy5taW1lPWYubWltZSxzLmNvZGVjPWYuY29kZWM7bGV0IGw9RmMoKTtsLmNsb2NrcmF0ZT1zLnJ0cG1hcC5jbG9ja3JhdGUsbC5kZWZhdWx0RnJhbWVEdXJhdGlvbj1mLmRlZmF1bHRGcmFtZUR1cmF0aW9uLHRoaXMudHJhY2tEYXRhLnB1c2gobCk7bGV0IGQ9dGhpcy50cmFrKGYpO24uYXBwZW5kKGQpLGkuYXBwZW5kKG5ldyBUKFwidHJleFwiLHt0cmFja19JRDpvfSkpfX0pLG4uYXBwZW5kKGkpLG59bW9vZihlKXtsZXR7dHJhY2tJZDp0LHRpbWVzdGFtcDpuLGJ5dGVMZW5ndGg6aX09ZSxvPXQtMSxzPXRoaXMudHJhY2tEYXRhW29dLGE9cy5sYXN0VGltZXN0YW1wIT09MD9uLXMubGFzdFRpbWVzdGFtcHwwOnMuZGVmYXVsdEZyYW1lRHVyYXRpb24sdT1hPjA/YTpzLmRlZmF1bHRGcmFtZUR1cmF0aW9uO3MubGFzdFRpbWVzdGFtcD1hPjA/bjpzLmxhc3RUaW1lc3RhbXArdTtsZXQgZj1uZXcgVShcIm1vb2ZcIiksbD1uZXcgVShcInRyYWZcIiksZD1uZXcgVChcInRydW5cIix7c2FtcGxlX2R1cmF0aW9uOnUsc2FtcGxlX3NpemU6aSxmaXJzdF9zYW1wbGVfZmxhZ3M6NjR9KTtyZXR1cm4gZi5hcHBlbmQobmV3IFQoXCJtZmhkXCIse3NlcXVlbmNlX251bWJlcjp0aGlzLnNlcXVlbmNlTnVtYmVyKyt9KSxsLmFwcGVuZChuZXcgVChcInRmaGRcIix7dHJhY2tfSUQ6dH0pLG5ldyBUKFwidGZkdFwiLHtiYXNlTWVkaWFEZWNvZGVUaW1lOnMuYmFzZU1lZGlhRGVjb2RlVGltZX0pLGQpKSxzLmJhc2VNZWRpYURlY29kZVRpbWUrPXUsZC5zZXQoXCJkYXRhX29mZnNldFwiLGYuYnl0ZUxlbmd0aCs4KSxQYyhzLHtieXRlTGVuZ3RoOmksZHVyYXRpb246dX0pLGZ9bWRhdChlKXtsZXQgdD1uZXcgVChcIm1kYXRcIik7cmV0dXJuIHQuYWRkKFwiZGF0YVwiLGUpLHR9c2V0UHJlc2VudGF0aW9uVGltZShlLHQpe2lmKCF0aGlzLm50cFByZXNlbnRhdGlvblRpbWUmJnQmJmU9PT10aGlzLnZpZGVvVHJhY2tJZCl7bGV0IG49ZS0xLGk9dGhpcy50cmFja0RhdGFbbl07dGhpcy5udHBQcmVzZW50YXRpb25UaW1lPXQtMWUzKihpLmJhc2VNZWRpYURlY29kZVRpbWUvaS5jbG9ja3JhdGUpfX19O3ZhciBOcz1DKE4oKSk7dmFyIHB0PWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCB0PW5ldyBicixuPW89Pnt0aGlzLm9uU3luYyYmdGhpcy5vblN5bmMobyl9LGk9bmV3IE5zLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24obyxzLGEpe2lmKG8udHlwZT09PTUpe2xldCB1PU1hdGguZmxvb3IobmV3IERhdGUoKS5nZXRUaW1lKCkvMWUzKzIwODI4NTJlMyksZj1uZXcgVChcImZ0eXBcIiksbD10Lm1vb3Yoby5zZHAsdSksZD1CdWZmZXIuYWxsb2NVbnNhZmUoZi5ieXRlTGVuZ3RoK2wuYnl0ZUxlbmd0aCk7Zi5jb3B5KGQsMCksbC5jb3B5KGQsZi5ieXRlTGVuZ3RoKSwoMCxZbi5kZWZhdWx0KShcIm1zbDptcDQ6aXNvbVwiKShgZnR5cDogJHtmLmZvcm1hdCgpfWApLCgwLFluLmRlZmF1bHQpKFwibXNsOm1wNDppc29tXCIpKGBtb292OiAke2wuZm9ybWF0KCl9YCk7bGV0IGg9by5zZHAubWVkaWEubWFwKG09Pih7dHlwZTptLnR5cGUsZW5jb2Rpbmc6bS5ydHBtYXAmJm0ucnRwbWFwLmVuY29kaW5nTmFtZSxtaW1lOm0ubWltZSxjb2RlYzptLmNvZGVjfSkpO3RoaXMucHVzaCh7dHlwZTo4LGRhdGE6ZCx0cmFja3M6aCxmdHlwOmYsbW9vdjpsfSl9ZWxzZSBpZihvLnR5cGU9PT02fHxvLnR5cGU9PT03KXtsZXR7cGF5bG9hZFR5cGU6dSx0aW1lc3RhbXA6ZixudHBUaW1lc3RhbXA6bH09byxkPXQudHJhY2tJZE1hcFt1XTtpZihkKXt0Lm50cFByZXNlbnRhdGlvblRpbWV8fCh0LnNldFByZXNlbnRhdGlvblRpbWUoZCxsKSx0Lm50cFByZXNlbnRhdGlvblRpbWUmJm4odC5udHBQcmVzZW50YXRpb25UaW1lKSk7bGV0IGgsbT1vLnR5cGU9PT03P28ubmFsVHlwZT09PTU6dm9pZCAwO3QubnRwUHJlc2VudGF0aW9uVGltZSYmbSYmby5udHBUaW1lc3RhbXAhPT12b2lkIDAmJihoPShvLm50cFRpbWVzdGFtcC10Lm50cFByZXNlbnRhdGlvblRpbWUpLzFlMyk7bGV0IGI9by5kYXRhLmJ5dGVMZW5ndGgseT10Lm1vb2Yoe3RyYWNrSWQ6ZCx0aW1lc3RhbXA6ZixieXRlTGVuZ3RoOmJ9KSx3PXQubWRhdChvLmRhdGEpLF89QnVmZmVyLmFsbG9jVW5zYWZlKHkuYnl0ZUxlbmd0aCt3LmJ5dGVMZW5ndGgpO3kuY29weShfLDApLHcuY29weShfLHkuYnl0ZUxlbmd0aCksdGhpcy5wdXNoKHt0eXBlOjgsZGF0YTpfLG1vb2Y6eSxtZGF0OncsbnRwVGltZXN0YW1wOmwsY2hlY2twb2ludFRpbWU6aH0pfX1lbHNlIHRoaXMucHVzaChvKTthKCl9fSk7c3VwZXIoaSk7dGhpcy5ib3hCdWlsZGVyPXR9Z2V0IGJpdHJhdGUoKXtyZXR1cm4gdGhpcy5ib3hCdWlsZGVyLnRyYWNrRGF0YSYmdGhpcy5ib3hCdWlsZGVyLnRyYWNrRGF0YS5tYXAodD0+dC5iaXRyYXRlKX1nZXQgZnJhbWVyYXRlKCl7cmV0dXJuIHRoaXMuYm94QnVpbGRlci50cmFja0RhdGEmJnRoaXMuYm94QnVpbGRlci50cmFja0RhdGEubWFwKHQ9PnQuZnJhbWVyYXRlKX1nZXQgbnRwUHJlc2VudGF0aW9uVGltZSgpe3JldHVybiB0aGlzLmJveEJ1aWxkZXIubnRwUHJlc2VudGF0aW9uVGltZX19O2MoKTt2YXIgVnM9QyhsZSgpKTt2YXIgdnI9QyhOKCkpO2MoKTt2YXIgS249KG89PihvW28uU1I9MjAwXT1cIlNSXCIsb1tvLlJSPTIwMV09XCJSUlwiLG9bby5TREVTPTIwMl09XCJTREVTXCIsb1tvLkJZRT0yMDNdPVwiQllFXCIsb1tvLkFQUD0yMDRdPVwiQVBQXCIsbykpKEtufHx7fSksa2M9cj0+KHt2ZXJzaW9uOnJbMF0+Pj42LHBhZGRpbmc6ISEoclswXSZpdFsyXSksY291bnQ6clswXSYzMSxwYWNrZXRUeXBlOnIucmVhZFVJbnQ4KDEpLGxlbmd0aDpyLnJlYWRVSW50MTZCRSgyKX0pLFhuPXI9PntsZXQgZT1rYyhyKTtzd2l0Y2goZS5wYWNrZXRUeXBlKXtjYXNlIDIwMDpyZXR1cm4gT2MocixlKTtjYXNlIDIwMTpyZXR1cm4gVWMocixlKTtjYXNlIDIwMjpyZXR1cm4gRGMocixlKTtjYXNlIDIwMzpyZXR1cm4gTmMocixlKTtjYXNlIDIwNDpyZXR1cm4gSGMocixlKTtkZWZhdWx0OnJldHVybiBlfX0seHI9KHIsZSk9Pih7dHlwZTozLGRhdGE6ZSxjaGFubmVsOnIscnRjcDpYbihlKX0pLEhzPXtwYWNrZXRUeXBlOjIwMH0scXM9KHIsZSx0KT0+e2xldCBuPVtdO2ZvcihsZXQgaT0wO2k8cjtpKyspe2xldCBvPXQraSoyNDtuLnB1c2goe3N5bmNTb3VyY2U6ZS5yZWFkVUludDMyQkUobyswKSxmcmFjdGlvbkxvc3Q6ZS5yZWFkVUludDgobys0KSxjdW11bGF0aXZlTnVtYmVyT2ZQYWNrZXRzTG9zdDplLnJlYWRVSW50QkUobys1LDMpLGV4dGVuZGVkSGlnaGVzdFNlcXVlbmNlTnVtYmVyUmVjZWl2ZWQ6ZS5yZWFkVUludDMyQkUobys4KSxpbnRlcmFycml2YWxKaXR0ZXI6ZS5yZWFkVUludDMyQkUobysxMiksbGFzdFNSVGltZXN0YW1wOmUucmVhZFVJbnQzMkJFKG8rMTYpLGRlbGF5U2luY2VMYXN0U1I6ZS5yZWFkVUludDMyQkUobysyMCl9KX1yZXR1cm4gbn0sT2M9KHIsZSk9Pih7Li4uZSxzeW5jU291cmNlOnIucmVhZFVJbnQzMkJFKDQpLG50cE1vc3Q6ci5yZWFkVUludDMyQkUoOCksbnRwTGVhc3Q6ci5yZWFkVUludDMyQkUoMTIpLHJ0cFRpbWVzdGFtcDpyLnJlYWRVSW50MzJCRSgxNiksc2VuZGVyc1BhY2tldENvdW50OnIucmVhZFVJbnQzMkJFKDIwKSxzZW5kZXJzT2N0ZXRDb3VudDpyLnJlYWRVSW50MzJCRSgyNCkscmVwb3J0czpxcyhlLmNvdW50LHIsMjgpfSksX3I9cj0+ci5wYWNrZXRUeXBlPT09MjAwLFVjPShyLGUpPT4oey4uLmUsc3luY1NvdXJjZTpyLnJlYWRVSW50MzJCRSg0KSxyZXBvcnRzOnFzKGUuY291bnQsciw4KX0pLGpzPXI9PnIucGFja2V0VHlwZT09PTIwMSxKbj0odT0+KHVbdS5DTkFNRT0xXT1cIkNOQU1FXCIsdVt1Lk5BTUU9Ml09XCJOQU1FXCIsdVt1LkVNQUlMPTNdPVwiRU1BSUxcIix1W3UuUEhPTkU9NF09XCJQSE9ORVwiLHVbdS5MT0M9NV09XCJMT0NcIix1W3UuVE9PTD02XT1cIlRPT0xcIix1W3UuTk9URT03XT1cIk5PVEVcIix1W3UuUFJJVj04XT1cIlBSSVZcIix1KSkoSm58fHt9KSxEYz0ocixlKT0+e2xldCB0PVtdLG49NDtmb3IobGV0IGk9MDtpPGUuY291bnQ7aSsrKXtsZXQgbz17c291cmNlOnIucmVhZFVJbnQzMkJFKG4pLGl0ZW1zOltdfTtmb3Iobis9NDs7KXtsZXQgcz1yLnJlYWRVSW50OChuKyspO2lmKHM9PT0wKXtuJTQhPT0wJiYobis9NC1uJTQpO2JyZWFrfWxldCBhPXIucmVhZFVJbnQ4KG4rKyk7aWYocz09PTgpe2xldCB1PXIucmVhZFVJbnQ4KG4pLGY9ci50b1N0cmluZyhcInV0ZjhcIixuKzEsbisxK3UpLGw9ci50b1N0cmluZyhcInV0ZjhcIixuKzErdSxuK2EpO28uaXRlbXMucHVzaChbOCxmLGxdKX1lbHNle2xldCB1PXIudG9TdHJpbmcoXCJ1dGY4XCIsbixuK2EpO28uaXRlbXMucHVzaChbcyx1XSl9bis9YX10LnB1c2gobyl9cmV0dXJuey4uLmUsc3luY1NvdXJjZTpyLnJlYWRVSW50MzJCRSg0KSxzb3VyY2VEZXNjcmlwdGlvbnM6dH19LFdzPXI9PnIucGFja2V0VHlwZT09PTIwMixOYz0ocixlKT0+e2xldCB0PVtdO2ZvcihsZXQgaT0wO2k8ZS5jb3VudDtpKyspdC5wdXNoKHIucmVhZFVJbnQzMkJFKDQrNCppKSk7bGV0IG47aWYoZS5sZW5ndGg+ZS5jb3VudCl7bGV0IGk9NCs0KmUuY291bnQsbz1yLnJlYWRVSW50OChpKTtuPXIudG9TdHJpbmcoXCJ1dGYtOFwiLGkrMSxpKzErbyl9cmV0dXJuey4uLmUsc291cmNlczp0LHJlYXNvbjpufX0sd3I9cj0+ci5wYWNrZXRUeXBlPT09MjAzLEhjPShyLGUpPT4oey4uLmUsc3VidHlwZTplLmNvdW50LHNvdXJjZTpyLnJlYWRVSW50MzJCRSg0KSxuYW1lOnIudG9TdHJpbmcoXCJhc2NpaVwiLDgsMTIpLGRhdGE6ci5zbGljZSgxMil9KSwkcz1yPT5yLnBhY2tldFR5cGU9PT0yMDQ7dmFyIHFjPTEwMCxHcz0oMCxWcy5kZWZhdWx0KShcIm1zbDptc2VcIiksVGU9Y2xhc3MgZXh0ZW5kcyBRe2NvbnN0cnVjdG9yKHQpe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwidmlkZW8gZWxlbWVudCBhcmd1bWVudCBtaXNzaW5nXCIpO2xldCBuLGksbz1uZXcgdnIuV3JpdGFibGUoe29iamVjdE1vZGU6ITAsd3JpdGU6KGEsdSxmKT0+e2lmKGEudHlwZT09PTgpaWYodGhpcy5fZG9uZT1mLGEudHJhY2tzIT09dm9pZCAwfHxhLm1pbWUhPT12b2lkIDApe2xldCBsPWEudHJhY2tzPz9bXSxkPWwubWFwKHk9PnkubWltZSkuZmlsdGVyKHk9PnkpLGg9ZC5sZW5ndGghPT0wP2Quam9pbihcIiwgXCIpOlwiYXZjMS42NDAwMjksIG1wNGEuNDAuMlwiLG09YS5taW1lPz9gdmlkZW8vbXA0OyBjb2RlY3M9XCIke2h9XCJgO2lmKCFNZWRpYVNvdXJjZS5pc1R5cGVTdXBwb3J0ZWQobSkpe28uZW1pdChcImVycm9yXCIsYHVuc3VwcG9ydGVkIG1lZGlhIHR5cGU6ICR7bX1gKTtyZXR1cm59dGhpcy5fbGFzdENoZWNrcG9pbnRUaW1lPTAsbj1uZXcgTWVkaWFTb3VyY2UsdC5zcmM9d2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwobik7bGV0IGI9KCk9PntpZihuPT09dm9pZCAwKXtvLmVtaXQoXCJlcnJvclwiLFwibm8gTWVkaWFTb3VyY2UgaW5zdGFuY2VcIik7cmV0dXJufXdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHQuc3JjKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzb3VyY2VvcGVuXCIsYiksdGhpcy5vblNvdXJjZU9wZW4mJnRoaXMub25Tb3VyY2VPcGVuKG4sbCksaT10aGlzLmFkZFNvdXJjZUJ1ZmZlcih0LG4sbSksaS5vbmVycm9yPXk9Pntjb25zb2xlLmVycm9yKFwiZXJyb3Igb24gU291cmNlQnVmZmVyOiBcIix5KSxvLmVtaXQoXCJlcnJvclwiKX07dHJ5e2kuYXBwZW5kQnVmZmVyKGEuZGF0YSl9Y2F0Y2goeSl7R3MoXCJmYWlsZWQgdG8gYXBwZW5kIHRvIFNvdXJjZUJ1ZmZlcjogXCIseSxhKX19O24uYWRkRXZlbnRMaXN0ZW5lcihcInNvdXJjZW9wZW5cIixiKX1lbHNle3RoaXMuX2xhc3RDaGVja3BvaW50VGltZT1hLmNoZWNrcG9pbnRUaW1lIT09dm9pZCAwP2EuY2hlY2twb2ludFRpbWU6dGhpcy5fbGFzdENoZWNrcG9pbnRUaW1lO3RyeXtpPy5hcHBlbmRCdWZmZXIoYS5kYXRhKX1jYXRjaChsKXtHcyhcImZhaWxlZCB0byBhcHBlbmQgdG8gU291cmNlQnVmZmVyOiBcIixsLGEpfX1lbHNlIGEudHlwZT09PTMmJndyKGEucnRjcCkmJm4/LnJlYWR5U3RhdGU9PT1cIm9wZW5cIiYmbi5lbmRPZlN0cmVhbSgpLGYoKX19KTtvLm9uKFwiZmluaXNoXCIsKCk9Pntjb25zb2xlLndhcm4oXCJpbmNvbWluZyBzdHJlYW0gZmluaXNoZWQ6IGVuZCBzdHJlYW1cIiksbiYmbi5yZWFkeVN0YXRlPT09XCJvcGVuXCImJm4uZW5kT2ZTdHJlYW0oKX0pLG8ub24oXCJlcnJvclwiLGE9Pntjb25zb2xlLmVycm9yKFwiZXJyb3Igb24gaW5jb21pbmcgc3RyZWFtOiBcIixhKSxpJiZpLnVwZGF0aW5nP2kuYWRkRXZlbnRMaXN0ZW5lcihcInVwZGF0ZWVuZFwiLCgpPT57bj8ucmVhZHlTdGF0ZT09PVwib3BlblwiJiZuLmVuZE9mU3RyZWFtKCl9KTpuPy5yZWFkeVN0YXRlPT09XCJvcGVuXCImJm4uZW5kT2ZTdHJlYW0oKX0pO2xldCBzPW5ldyB2ci5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkOmZ1bmN0aW9uKCl7fX0pO3Mub24oXCJlcnJvclwiLCgpPT57Y29uc29sZS53YXJuKFwib3V0Z29pbmcgc3RyZWFtIGJyb2tlIHNvbWV3aGVyZVwiKX0pO3N1cGVyKG8scyk7dGhpcy5fdmlkZW9FbD10LHRoaXMuX2xhc3RDaGVja3BvaW50VGltZT0wfWFkZFNvdXJjZUJ1ZmZlcih0LG4saSl7bGV0IG89bi5hZGRTb3VyY2VCdWZmZXIoaSkscz0wLGE9KCk9PntpZigrK3Mscz5xYyYmby5idWZmZXJlZC5sZW5ndGgpe3M9MDtsZXQgdT1vLmJ1ZmZlcmVkLmxlbmd0aC0xLGY9by5idWZmZXJlZC5zdGFydCh1KSxsPU1hdGgubWluKHQuY3VycmVudFRpbWUsdGhpcy5fbGFzdENoZWNrcG9pbnRUaW1lKS0xMDt0cnl7aWYobD5mKXtvLnJlbW92ZShmLGwpO3JldHVybn19Y2F0Y2goZCl7Y29uc29sZS53YXJuKGQpfX10aGlzLl9kb25lJiZ0aGlzLl9kb25lKCl9O3JldHVybiBvLmFkZEV2ZW50TGlzdGVuZXIoXCJ1cGRhdGVlbmRcIixhKSxvfWdldCBjdXJyZW50VGltZSgpe3JldHVybiB0aGlzLl92aWRlb0VsLmN1cnJlbnRUaW1lfWFzeW5jIHBsYXkoKXtyZXR1cm4gYXdhaXQgdGhpcy5fdmlkZW9FbC5wbGF5KCl9cGF1c2UoKXtyZXR1cm4gdGhpcy5fdmlkZW9FbC5wYXVzZSgpfX07YygpO3ZhciB6cz1DKE4oKSk7dmFyIENlPWNsYXNzIGV4dGVuZHMgUntjb25zdHJ1Y3Rvcigpe2xldCBlLHQ9W10sbj1uZXcgenMuVHJhbnNmb3JtKHtvYmplY3RNb2RlOiEwLHRyYW5zZm9ybTpmdW5jdGlvbihpLG8scyl7aWYoaS50eXBlPT09NSl7bGV0IGE7Zm9yKGxldCB1IG9mIGkuc2RwLm1lZGlhKXUudHlwZT09PVwiYXBwbGljYXRpb25cIiYmdS5ydHBtYXAmJnUucnRwbWFwLmVuY29kaW5nTmFtZT09PVwiVk5ELk9OVklGLk1FVEFEQVRBXCImJihhPXUpO2EmJmEucnRwbWFwJiYoZT1OdW1iZXIoYS5ydHBtYXAucGF5bG9hZFR5cGUpKSxzKHZvaWQgMCxpKX1lbHNlIGlmKGkudHlwZT09PTImJk8oaS5kYXRhKT09PWUpe2lmKHQucHVzaChaKGkuZGF0YSkpLGNlKGkuZGF0YSkmJnQubGVuZ3RoPjApe2xldCBhPXt0aW1lc3RhbXA6SChpLmRhdGEpLG50cFRpbWVzdGFtcDppLm50cFRpbWVzdGFtcCxwYXlsb2FkVHlwZTpPKGkuZGF0YSksZGF0YTpCdWZmZXIuY29uY2F0KHQpLHR5cGU6OX07cyh2b2lkIDAsYSksdD1bXTtyZXR1cm59cygpfWVsc2Ugcyh2b2lkIDAsaSl9fSk7c3VwZXIobil9fTtjKCk7dmFyIFpuPUMoTigpKTtjKCk7dmFyIFlzPUMobGUoKSksamM9XCJSVFNQLzEuMFwiLEtzPXI9PntpZighci5tZXRob2R8fCFyLnVyaSl0aHJvdyBuZXcgRXJyb3IoXCJtZXNzYWdlIG5lZWRzIHRvIGNvbnRhaW4gYSBtZXRob2QgYW5kIGEgdXJpXCIpO2xldCBlPXIucHJvdG9jb2x8fGpjLHQ9ci5oZWFkZXJzfHx7fSxuPVtgJHtyLm1ldGhvZH0gJHtyLnVyaX0gJHtlfWAsT2JqZWN0LmVudHJpZXModCkubWFwKChbaSxvXSk9PmkrXCI6IFwiK28pLmpvaW4oYFxcclxuYCksYFxcclxuYF0uam9pbihgXFxyXG5gKTtyZXR1cm4oMCxZcy5kZWZhdWx0KShcIm1zbDpydHNwOm91dGdvaW5nXCIpKG4pLEJ1ZmZlci5mcm9tKG4pfTtjKCk7YygpO3ZhciBXYz0ocixlLHQ9MCk9PntsZXQgbj1gXG4ke2V9YDt0PXIuaW5kZXhPZihuLHQpO2xldCBpPTAsbz1bXTtmb3IoO3Q+PTA7KWk9ci5pbmRleE9mKGBcbmAsdCtuLmxlbmd0aCksby5wdXNoKHIudG9TdHJpbmcoXCJhc2NpaVwiLHQrbi5sZW5ndGgsaSkudHJpbSgpKSx0PXIuaW5kZXhPZihuLGkpO3JldHVybiBvfSwkYz1yPT5yLm1hdGNoKC9ebT0vKSxFcj0ocixlKT0+e2xldCB0PWUuaW5kZXhPZihyKTtyZXR1cm4gdDwwP1tlLnNsaWNlKDApXTpbZS5zbGljZSgwLHQpLGUuc2xpY2UodCsxKV19LFhzPXtmbXRwOnI9PntsZXRbZSx0XT1FcihcIiBcIixyKTtzd2l0Y2goZSl7ZGVmYXVsdDpsZXQgbj10P3QudHJpbSgpLnNwbGl0KFwiO1wiKTpbXSxpPXt9O3JldHVybiBuLmZvckVhY2gobz0+e2xldFtzLGFdPUVyKFwiPVwiLG8pLHU9cy50cmltKCkudG9Mb3dlckNhc2UoKTt1IT09XCJcIiYmKGlbdV09YS50cmltKCkpfSkse2Zvcm1hdDplLHBhcmFtZXRlcnM6aX19fSxmcmFtZXJhdGU6TnVtYmVyLHJ0cG1hcDpyPT57bGV0W2UsdF09RXIoXCIgXCIsciksW24saSxvXT10LnRvVXBwZXJDYXNlKCkuc3BsaXQoXCIvXCIpO3JldHVybiBvPT09dm9pZCAwP3twYXlsb2FkVHlwZTpOdW1iZXIoZSksZW5jb2RpbmdOYW1lOm4sY2xvY2tyYXRlOk51bWJlcihpKX06e3BheWxvYWRUeXBlOk51bWJlcihlKSxlbmNvZGluZ05hbWU6bixjbG9ja3JhdGU6TnVtYmVyKGkpLGVuY29kaW5nUGFyYW1ldGVyczpvfX0sdHJhbnNmb3JtOnI9PnIuc3BsaXQoXCI7XCIpLm1hcChlPT5lLnNwbGl0KFwiLFwiKS5tYXAoTnVtYmVyKSksXCJ4LXNlbnNvci10cmFuc2Zvcm1cIjpyPT5yLnNwbGl0KFwiO1wiKS5tYXAoZT0+ZS5zcGxpdChcIixcIikubWFwKE51bWJlcikpLGZyYW1lc2l6ZTpyPT5yLnNwbGl0KFwiIFwiKVsxXS5zcGxpdChcIi1cIikubWFwKE51bWJlcil9LEdjPXI9PntsZXRbZSx0XT1FcihcIjpcIixyKTtyZXR1cm4gdD09PXZvaWQgMD97W2VdOiEwfTpYc1tlXSE9PXZvaWQgMD97W2VdOlhzW2VdKHQpfTp7W2VdOnR9fSxWYz1yPT57bGV0IGU9ci5zbGljZSgwLDEpLHQ9ci5zbGljZSgyKTtzd2l0Y2goZSl7Y2FzZVwidlwiOnJldHVybnt2ZXJzaW9uOnR9O2Nhc2VcIm9cIjpsZXRbbixpLG8scyxhLHVdPXQuc3BsaXQoXCIgXCIpO3JldHVybntvcmlnaW46e2FkZHJUeXBlOmEsbmV0VHlwZTpzLHNlc3Npb25JZDppLHNlc3Npb25WZXJzaW9uOm8sdW5pY2FzdEFkZHJlc3M6dSx1c2VybmFtZTpufX07Y2FzZVwic1wiOnJldHVybntzZXNzaW9uTmFtZTp0fTtjYXNlXCJpXCI6cmV0dXJue3Nlc3Npb25JbmZvcm1hdGlvbjp0fTtjYXNlXCJ1XCI6cmV0dXJue3VyaTp0fTtjYXNlXCJlXCI6cmV0dXJue2VtYWlsOnR9O2Nhc2VcInBcIjpyZXR1cm57cGhvbmU6dH07Y2FzZVwiY1wiOmxldFtmLGwsZF09dC5zcGxpdChcIiBcIik7cmV0dXJue2Nvbm5lY3Rpb25EYXRhOnthZGRyVHlwZTpsLGNvbm5lY3Rpb25BZGRyZXNzOmQsbmV0VHlwZTpmfX07Y2FzZVwiYlwiOmxldFtoLG1dPXQuc3BsaXQoXCI6XCIpO3JldHVybntid3R5cGU6aCxiYW5kd2lkdGg6bX07Y2FzZVwidFwiOmxldFtiLHldPXQuc3BsaXQoXCIgXCIpLm1hcChOdW1iZXIpO3JldHVybnt0aW1lOntzdGFydFRpbWU6YixzdG9wVGltZTp5fX07Y2FzZVwiclwiOmxldFt3LF8sLi4udl09dC5zcGxpdChcIiBcIikubWFwKE51bWJlcik7cmV0dXJue3JlcGVhdFRpbWVzOntyZXBlYXRJbnRlcnZhbDp3LGFjdGl2ZUR1cmF0aW9uOl8sb2Zmc2V0czp2fX07Y2FzZVwielwiOnJldHVybjtjYXNlXCJrXCI6cmV0dXJuO2Nhc2VcImFcIjpyZXR1cm4gR2ModCk7Y2FzZVwibVwiOmxldFtxLEEsaixZXT10LnNwbGl0KFwiIFwiKTtyZXR1cm57dHlwZTpxLHBvcnQ6TnVtYmVyKEEpLHByb3RvY29sOmosZm10Ok51bWJlcihZKX07ZGVmYXVsdDp9fSxKcz1yPT57bGV0IGU9ci5pbmRleE9mKGBcbm09YCk7cmV0dXJuIFdjKHIsXCJhPWNvbnRyb2w6XCIsZSl9LFFuPXI9PntsZXQgZT1yLnRvU3RyaW5nKFwiYXNjaWlcIikuc3BsaXQoYFxuYCkubWFwKG89Pm8udHJpbSgpKSx0PXtzZXNzaW9uOnt9LG1lZGlhOltdfSxuPTAsaT10LnNlc3Npb247Zm9yKGxldCBvIG9mIGUpJGMobykmJih0Lm1lZGlhW25dPXt9LGk9dC5tZWRpYVtuXSwrK24pLGk9T2JqZWN0LmFzc2lnbihpLFZjKG8pKTtyZXR1cm4gdH0sU3I9cj0+KHt0eXBlOjUsZGF0YTpyLHNkcDpRbihyKX0pO2MoKTt2YXIgcmU9KHIsZSk9PntsZXQgdD1gXG4ke2UudG9Mb3dlckNhc2UoKX06IGAsbj1yLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKHQpO2lmKG4+PTApe2xldCBpPXIuaW5kZXhPZihgXG5gLG4rdC5sZW5ndGgpO3JldHVybiByLnRvU3RyaW5nKFwiYXNjaWlcIixuK3QubGVuZ3RoLGkpLnRyaW0oKX1yZXR1cm4gbnVsbH0sUnI9cj0+e2xldCBlPXJlKHIsXCJDU2VxXCIpO3JldHVybiBlIT09bnVsbD9OdW1iZXIoZSk6bnVsbH0sVHI9cj0+e2xldCBlPXJlKHIsXCJTZXNzaW9uXCIpO3JldHVybiBlP2Uuc3BsaXQoXCI7XCIpWzBdOm51bGx9LENyPXI9PntsZXQgZT1yZShyLFwiU2Vzc2lvblwiKTtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtsZXQgdD02MCxuPVwidGltZW91dD1cIixpPWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKG4pO2lmKGkhPT0tMSl7bGV0IG89ZS5zdWJzdHJpbmcoaStuLmxlbmd0aCk7bz1vLnNwbGl0KFwiO1wiKVswXTtsZXQgcz1wYXJzZUludChvKTtyZXR1cm4gaXNOYU4ocyk/dDpzfXJldHVybiB0fSxodD1yPT5OdW1iZXIoci50b1N0cmluZyhcImFzY2lpXCIsOSwxMikpLEJyPXI9PnJlKHIsXCJDb250ZW50LUJhc2VcIiksTXI9cj0+cmUocixcIkNvbnRlbnQtTG9jYXRpb25cIiksTHI9cj0+e2xldCBlPXJlKHIsXCJDb25uZWN0aW9uXCIpO3JldHVybiBlIT09bnVsbCYmZS50b0xvd2VyQ2FzZSgpPT09XCJjbG9zZVwifSxJcj1yPT57bGV0IGU9cmUocixcIlJhbmdlXCIpO2lmKGUhPT1udWxsKXJldHVybiBlLnNwbGl0KFwiPVwiKVsxXS5zcGxpdChcIi1cIil9LEFyPXI9PntsZXQgZT1bYFxuXG5gLFwiXFxyXFxyXCIsYFxcclxuXFxyXG5gXS5tYXAodD0+e2xldCBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbiE9PS0xP24rdC5sZW5ndGg6bn0pLmZpbHRlcih0PT50IT09LTEpO3JldHVybiBlLmxlbmd0aD4wP2UucmVkdWNlKCh0LG4pPT5NYXRoLm1pbih0LG4pKTotMX07dmFyIFpzPTQsUXM9MzYsemM9cj0+e2xldCBlPUJ1ZmZlci5hbGxvYyhacyksdD0wLG49MDtmb3IoO248ZS5sZW5ndGg7KXtsZXQgdT1yW3QrK10sZj1NYXRoLm1pbih1Lmxlbmd0aCxlLmxlbmd0aC1uKTt1LmNvcHkoZSxuLDAsZiksbis9Zn1sZXQgaT1lWzFdLG89ZS5sZW5ndGgscz1lLnJlYWRVSW50MTZCRSgyKSxhPW8rcztyZXR1cm57Y2hhbm5lbDppLGJlZ2luOm8sZW5kOmF9fSxGcj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2NodW5rcz1bXTt0aGlzLl9sZW5ndGg9MDt0aGlzLl9zdGF0ZT0wO3RoaXMuX2luaXQoKX1faW5pdCgpe3RoaXMuX2NodW5rcz1bXSx0aGlzLl9sZW5ndGg9MCx0aGlzLl9zdGF0ZT0wfV9wdXNoKGUpe3RoaXMuX2NodW5rcy5wdXNoKGUpLHRoaXMuX2xlbmd0aCs9ZS5sZW5ndGh9X3BhcnNlUnRzcCgpe2xldCBlPVtdLHQ9QnVmZmVyLmNvbmNhdCh0aGlzLl9jaHVua3MpLG49QXIodCk7aWYobj09PS0xKXJldHVybiBlO2xldCBpPW4sbz1yZSh0LFwiQ29udGVudC1MZW5ndGhcIik7aWYobyYmcGFyc2VJbnQobyk+dC5sZW5ndGgtaSlyZXR1cm4gZTtpZih0aGlzLl9pbml0KCksaT09PXQubGVuZ3RofHx0W2ldPT09UXMpe2xldCBzPXQuc2xpY2UoMCxpKTtlLnB1c2goe3R5cGU6NCxkYXRhOnN9KTtsZXQgYT10LnNsaWNlKGkpO3RoaXMuX3B1c2goYSl9ZWxzZXtsZXQgcz10LGE9dC5zbGljZShpKTtlLnB1c2goe3R5cGU6NCxkYXRhOnN9KSxlLnB1c2goU3IoYSkpfXJldHVybiBlfV9wYXJzZUludGVybGVhdmVkKCl7bGV0IGU9W107aWYodGhpcy5fbGVuZ3RoPFpzfHwodGhpcy5fcGFja2V0fHwodGhpcy5fcGFja2V0PXpjKHRoaXMuX2NodW5rcykpLHRoaXMuX2xlbmd0aDx0aGlzLl9wYWNrZXQuZW5kKSlyZXR1cm4gZTtsZXQgdD1CdWZmZXIuY29uY2F0KHRoaXMuX2NodW5rcyksbj10LnNsaWNlKHRoaXMuX3BhY2tldC5iZWdpbix0aGlzLl9wYWNrZXQuZW5kKSxpPXQuc2xpY2UodGhpcy5fcGFja2V0LmVuZCksbz10aGlzLl9wYWNrZXQuY2hhbm5lbDtpZihkZWxldGUgdGhpcy5fcGFja2V0LHRoaXMuX2luaXQoKSx0aGlzLl9wdXNoKGkpLG8lMj09PTApZS5wdXNoKHt0eXBlOjIsZGF0YTpuLGNoYW5uZWw6b30pO2Vsc2V7bGV0IHM9bjtkb3tsZXQgYT1zLnJlYWRVSW50MTZCRSgyKSo0KzQ7ZS5wdXNoKHhyKG8scy5zbGljZSgwLGEpKSkscz1zLnNsaWNlKGEpfXdoaWxlKHMubGVuZ3RoPjApfXJldHVybiBlfV9zZXRTdGF0ZSgpe2Zvcig7dGhpcy5fY2h1bmtzLmxlbmd0aD4wJiZ0aGlzLl9jaHVua3NbMF0ubGVuZ3RoPT09MDspdGhpcy5fY2h1bmtzLnNoaWZ0KCk7bGV0IGU9dGhpcy5fY2h1bmtzWzBdO2lmKHRoaXMuX2NodW5rcy5sZW5ndGg9PT0wKXRoaXMuX3N0YXRlPTA7ZWxzZSBpZihlWzBdPT09UXMpdGhpcy5fc3RhdGU9MTtlbHNlIGlmKGUudG9TdHJpbmcoXCJhc2NpaVwiLDAsNCk9PT1cIlJUU1BcIil0aGlzLl9zdGF0ZT0yO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGNodW5rIG9mIGxlbmd0aCAke2UubGVuZ3RofWApfXBhcnNlKGUpe3RoaXMuX3B1c2goZSksdGhpcy5fc3RhdGU9PT0wJiZ0aGlzLl9zZXRTdGF0ZSgpO2xldCB0PVtdLG49ITE7Zm9yKDshbjspe2xldCBpPVtdO3N3aXRjaCh0aGlzLl9zdGF0ZSl7Y2FzZSAwOmJyZWFrO2Nhc2UgMTppPXRoaXMuX3BhcnNlSW50ZXJsZWF2ZWQoKTticmVhaztjYXNlIDI6aT10aGlzLl9wYXJzZVJ0c3AoKTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcImludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlXCIpfWkubGVuZ3RoPjA/dD10LmNvbmNhdChpKTpuPSEwLHRoaXMuX3NldFN0YXRlKCl9cmV0dXJuIHR9fTt2YXIgbXQ9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKCl7bGV0IGU9bmV3IEZyLHQ9bmV3IFpuLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06ZnVuY3Rpb24oaSxvLHMpe2lmKGkudHlwZT09PTEpdHJ5e2UucGFyc2UoaS5kYXRhKS5mb3JFYWNoKGE9PnQucHVzaChhKSkscygpfWNhdGNoKGEpe3MoYSl9ZWxzZSBzKHZvaWQgMCxpKX19KSxuPW5ldyBabi5UcmFuc2Zvcm0oe29iamVjdE1vZGU6ITAsdHJhbnNmb3JtOmZ1bmN0aW9uKGksbyxzKXtpZihpLnR5cGU9PT00KXtsZXQgYT1LcyhpKTtzKHZvaWQgMCx7dHlwZToxLGRhdGE6YX0pfWVsc2Ugcyh2b2lkIDAsaSl9fSk7c3VwZXIodCxuKX19O2MoKTt2YXIga3I9QyhsZSgpKTtjKCk7dmFyIGd0PShyLGUpPT57bGV0IHQ7aWYoZSE9PXZvaWQgMCl7aWYodHlwZW9mIGUhPVwib2JqZWN0XCIpdGhyb3cgbmV3IEVycm9yKFwibWVyZ2UgZXhwZWN0cyBvdmVycmlkZSB0byBiZSBhbiBvYmplY3QhXCIpO3Q9T2JqZWN0LmtleXMoZSkucmVkdWNlKChuLGkpPT4oZVtpXSE9PXZvaWQgMCYmKG5baV09ZVtpXSksbikse30pfXJldHVybiBPYmplY3QuYXNzaWduKHt9LHIsdCl9O3ZhciBlYT1DKE4oKSk7YygpO3ZhciBZYz1EYXRlLlVUQygxOTAwLDAsMSk7ZnVuY3Rpb24gUHIocixlKXtsZXQgdD0ocitlLzQyOTQ5NjcyOTYpKjFlMztyZXR1cm4gWWMrdH1mdW5jdGlvbiBLYyhyKXtyZXR1cm4vXlteOl0rOlxcL1xcLy8udGVzdChyKX12YXIgT3I9KHM9PihzLk9QVElPTlM9XCJPUFRJT05TXCIscy5ERVNDUklCRT1cIkRFU0NSSUJFXCIscy5TRVRVUD1cIlNFVFVQXCIscy5QTEFZPVwiUExBWVwiLHMuUEFVU0U9XCJQQVVTRVwiLHMuVEVBUkRPV049XCJURUFSRE9XTlwiLHMpKShPcnx8e30pLFhjPTUsSmM9KHI9dHlwZW9mIHdpbmRvdz5cInVcIj9cIlwiOndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSxlPVtdKT0+KHt1cmk6ZS5sZW5ndGg+MD9gcnRzcDovLyR7cn0vYXhpcy1tZWRpYS9tZWRpYS5hbXA/JHtlLmpvaW4oXCImXCIpfWA6YHJ0c3A6Ly8ke3J9L2F4aXMtbWVkaWEvbWVkaWEuYW1wYH0pLEl0PWNsYXNzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuKXtzdXBlcih0KTt0aGlzLm5hbWU9XCJSVFNQUmVzcG9uc2VFcnJvclwiLHRoaXMuY29kZT1ufX0seXQ9Y2xhc3MgZXh0ZW5kcyBSe2NvbnN0cnVjdG9yKHQ9e30pe2xldHt1cmk6bixoZWFkZXJzOmksZGVmYXVsdEhlYWRlcnM6b309Z3QoSmModC5ob3N0bmFtZSx0LnBhcmFtZXRlcnMpLHQpLHM9bmV3IGVhLlRyYW5zZm9ybSh7b2JqZWN0TW9kZTohMCx0cmFuc2Zvcm06KGEsdSxmKT0+e2EudHlwZT09PTQ/KHRoaXMuX29uUnRzcChhKSxmKCkpOmEudHlwZT09PTM/KHRoaXMuX29uUnRjcChhKSx0aGlzLm9uUnRjcCYmdGhpcy5vblJ0Y3AoYS5ydGNwKSxmKHZvaWQgMCxhKSk6YS50eXBlPT09Mj8odGhpcy5fb25SdHAoYSksZih2b2lkIDAsYSkpOihhLnR5cGU9PT01JiYodGhpcy5fb25TZHAoYSksdGhpcy5vblNkcCYmdGhpcy5vblNkcChhLnNkcCkpLGYodm9pZCAwLGEpKX19KTtzLm9uKFwiZW5kXCIsKCk9Pnt0aGlzLl9vdXRnb2luZ0Nsb3NlZD0hMH0pO3N1cGVyKHMpO3RoaXMuX291dGdvaW5nQ2xvc2VkPSExLHRoaXMuX3Jlc2V0KCksdGhpcy51cGRhdGUobixpLG8pLHRoaXMuX3Nlc3Npb25Db250cm9sVVJMPXRoaXMuX2NvbnRyb2xVUkwoKX11cGRhdGUodCxuPXt9LGk9e30pe2lmKHQ9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3Qgc3VwcGx5IGFuIHVyaSB3aGVuIGNyZWF0aW5nIGEgUnRzcFNlc3Npb25Db21wb25lbnRcIik7dGhpcy51cmk9dCx0aGlzLmRlZmF1bHRIZWFkZXJzPWksdGhpcy5oZWFkZXJzPU9iamVjdC5hc3NpZ24oe1tcIk9QVElPTlNcIl06e30sW1wiUExBWVwiXTp7fSxbXCJTRVRVUFwiXTp7QmxvY2tzaXplOlwiNjQwMDBcIn0sW1wiREVTQ1JJQkVcIl06e0FjY2VwdDpcImFwcGxpY2F0aW9uL3NkcFwifSxbXCJQQVVTRVwiXTp7fX0sbil9X3Jlc2V0KCl7dGhpcy5fc2VxdWVuY2U9MSx0aGlzLnJldHJ5PSgpPT5jb25zb2xlLmVycm9yKFwiTm8gcmVxdWVzdCBzZW50LCBjYW4ndCByZXRyeVwiKSx0aGlzLl9jYWxsU3RhY2s9W10sdGhpcy5fY2FsbEhpc3Rvcnk9W10sdGhpcy5fc3RhdGU9XCJpZGxlXCIsdGhpcy5fd2FpdGluZz0hMSx0aGlzLl9jb250ZW50QmFzZT1udWxsLHRoaXMuX3Nlc3Npb25JZD1udWxsLHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsIT09bnVsbCYmY2xlYXJJbnRlcnZhbCh0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbCksdGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWw9bnVsbCx0aGlzLnQwPXZvaWQgMCx0aGlzLm4wPXZvaWQgMCx0aGlzLmNsb2NrcmF0ZXM9dm9pZCAwfV9jb250cm9sVVJMKHQpe2lmKHQhPT12b2lkIDAmJktjKHQpKXJldHVybiB0O2xldCBuPXRoaXMuX2NvbnRlbnRCYXNlPz90aGlzLl9jb250ZW50TG9jYXRpb24/P3RoaXMudXJpO2lmKG49PW51bGwpdGhyb3cgbmV3IEVycm9yKFwicmVsYXRpdmUgb3IgbWlzc2luZyBjb250cm9sIGF0dHJpYnV0ZSBidXQgbm8gYmFzZSBVUkwgYXZhaWxhYmxlXCIpO3JldHVybiB0PT09dm9pZCAwfHx0PT09XCIqXCI/bjpuZXcgVVJMKHQsbikuaHJlZn1fb25SdHNwKHQpe3RoaXMuX3dhaXRpbmc9ITE7bGV0IG49aHQodC5kYXRhKSxpPUxyKHQuZGF0YSksbz1Scih0LmRhdGEpO2lmKG89PT1udWxsKXRocm93IG5ldyBFcnJvcihcInJ0c3A6IGV4cGVjdGVkIHNlcXVlbmNlIG51bWJlclwiKTtpZih0aGlzLl9jYWxsSGlzdG9yeT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTtsZXQgcz10aGlzLl9jYWxsSGlzdG9yeVtvLTFdO2lmKCgwLGtyLmRlZmF1bHQpKFwibXNsOnJ0c3A6aW5jb21pbmdcIikoYCR7dC5kYXRhfWApLCF0aGlzLl9zZXNzaW9uSWQmJiFpKXt0aGlzLl9zZXNzaW9uSWQ9VHIodC5kYXRhKTtsZXQgYT1Dcih0LmRhdGEpO2EhPT1udWxsJiYodGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWwhPT1udWxsJiZjbGVhckludGVydmFsKHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsKSx0aGlzLl9yZW5ld1Nlc3Npb25JbnRlcnZhbD1zZXRJbnRlcnZhbCgoKT0+e3RoaXMuX2VucXVldWUoe21ldGhvZDpcIk9QVElPTlNcIn0pLHRoaXMuX2RlcXVldWUoKX0sTWF0aC5tYXgoWGMsYS01KSoxZTMpKX10aGlzLl9jb250ZW50QmFzZXx8KHRoaXMuX2NvbnRlbnRCYXNlPUJyKHQuZGF0YSkpLHRoaXMuX2NvbnRlbnRMb2NhdGlvbnx8KHRoaXMuX2NvbnRlbnRMb2NhdGlvbj1Ncih0LmRhdGEpKSxuPj00MDAmJnRoaXMub25FcnJvciYmdGhpcy5vbkVycm9yKG5ldyBJdCh0LmRhdGEudG9TdHJpbmcoXCJhc2NpaVwiKSxuKSkscz09PVwiUExBWVwiJiZ0aGlzLm9uUGxheSYmdGhpcy5vblBsYXkoSXIodC5kYXRhKSksaSYmKCgwLGtyLmRlZmF1bHQpKFwibXNsOnJ0c3A6aW5jb21pbmdcIikoYFJUU1AgU2Vzc2lvbiAke3RoaXMuX3Nlc3Npb25JZH0gZW5kZWQgd2l0aCBzdGF0dXNDb2RlOiAke259YCksdGhpcy5fc2Vzc2lvbklkPW51bGwpLHRoaXMuX2RlcXVldWUoKX1fb25SdGNwKHQpe2lmKHRoaXMudDA9PT12b2lkIDB8fHRoaXMubjA9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7aWYoX3IodC5ydGNwKSl7bGV0IG49dC5jaGFubmVsLTE7dGhpcy50MFtuXT10LnJ0Y3AucnRwVGltZXN0YW1wLHRoaXMubjBbbl09UHIodC5ydGNwLm50cE1vc3QsdC5ydGNwLm50cExlYXN0KX19X29uUnRwKHQpe2lmKHRoaXMudDA9PT12b2lkIDB8fHRoaXMubjA9PT12b2lkIDB8fHRoaXMuY2xvY2tyYXRlcz09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTtsZXQgbj10LmNoYW5uZWwsaT10aGlzLnQwW25dLG89dGhpcy5uMFtuXTtpZih0eXBlb2YgaTxcInVcIiYmdHlwZW9mIG88XCJ1XCIpe2xldCBzPXRoaXMuY2xvY2tyYXRlc1tuXSx1PUgodC5kYXRhKS1pfDA7dC5udHBUaW1lc3RhbXA9dS9zKjFlMytvfX1fb25TZHAodCl7dGhpcy5uMD17fSx0aGlzLnQwPXt9LHRoaXMuY2xvY2tyYXRlcz17fSx0aGlzLl9zZXNzaW9uQ29udHJvbFVSTD10aGlzLl9jb250cm9sVVJMKHQuc2RwLnNlc3Npb24uY29udHJvbCksdC5zZHAubWVkaWEuZm9yRWFjaCgobixpKT0+e2lmKG4ucnRwbWFwPT09dm9pZCAwKXJldHVybjtsZXR7Y2xvY2tyYXRlOm99PW4ucnRwbWFwLHM9aSoyLGE9cysxLHU9bi5jb250cm9sPT09dm9pZCAwP3RoaXMuX3Nlc3Npb25Db250cm9sVVJMOnRoaXMuX2NvbnRyb2xVUkwobi5jb250cm9sKTt0aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJTRVRVUFwiLGhlYWRlcnM6e1RyYW5zcG9ydDpcIlJUUC9BVlAvVENQO3VuaWNhc3Q7aW50ZXJsZWF2ZWQ9XCIrcytcIi1cIithfSx1cmk6dX0pLHRoaXMuY2xvY2tyYXRlcyE9PXZvaWQgMCYmKHRoaXMuY2xvY2tyYXRlc1tzXT1vKX0pLHRoaXMuX3N0YXRlPT09XCJwbGF5aW5nXCImJnRoaXMuX2VucXVldWUoe21ldGhvZDpcIlBMQVlcIixoZWFkZXJzOntSYW5nZTpgbnB0PSR7dGhpcy5zdGFydFRpbWV8fDB9LWB9LHVyaTp0aGlzLl9zZXNzaW9uQ29udHJvbFVSTH0pLHRoaXMuX2RlcXVldWUoKX1wbGF5KHQ9MCl7aWYodGhpcy5fc3RhdGU9PT1cImlkbGVcIil0aGlzLnN0YXJ0VGltZT1OdW1iZXIodCl8fDAsdGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiT1BUSU9OU1wifSksdGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiREVTQ1JJQkVcIn0pO2Vsc2UgaWYodGhpcy5fc3RhdGU9PT1cInBhdXNlZFwiKXtpZih0aGlzLl9zZXNzaW9uSWQ9PT1udWxsfHx0aGlzLl9zZXNzaW9uSWQ9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwicnRzcDogaW50ZXJuYWwgZXJyb3JcIik7dGhpcy5fZW5xdWV1ZSh7bWV0aG9kOlwiUExBWVwiLGhlYWRlcnM6e1Nlc3Npb246dGhpcy5fc2Vzc2lvbklkfSx1cmk6dGhpcy5fc2Vzc2lvbkNvbnRyb2xVUkx9KX10aGlzLl9zdGF0ZT1cInBsYXlpbmdcIix0aGlzLl9kZXF1ZXVlKCl9cGF1c2UoKXt0aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJQQVVTRVwifSksdGhpcy5fc3RhdGU9XCJwYXVzZWRcIix0aGlzLl9kZXF1ZXVlKCl9c3RvcCgpe3RoaXMuX3Nlc3Npb25JZD90aGlzLl9lbnF1ZXVlKHttZXRob2Q6XCJURUFSRE9XTlwifSk6dGhpcy5fY2FsbFN0YWNrPVtdLHRoaXMuX3N0YXRlPVwiaWRsZVwiLHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsIT09bnVsbCYmKGNsZWFySW50ZXJ2YWwodGhpcy5fcmVuZXdTZXNzaW9uSW50ZXJ2YWwpLHRoaXMuX3JlbmV3U2Vzc2lvbkludGVydmFsPW51bGwpLHRoaXMuX2RlcXVldWUoKX1zZW5kKHQpe2xldHttZXRob2Q6bixoZWFkZXJzOmksdXJpOm99PXQ7aWYobj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJtaXNzaW5nIG1ldGhvZCB3aGVuIHNlbmQgcmVxdWVzdFwiKTtpZih0aGlzLl93YWl0aW5nPSEwLHRoaXMucmV0cnk9dGhpcy5zZW5kLmJpbmQodGhpcyx0KSx0aGlzLl9zZXF1ZW5jZT09PXZvaWQgMHx8dGhpcy5oZWFkZXJzPT09dm9pZCAwfHx0aGlzLl9jYWxsSGlzdG9yeT09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTtsZXQgcz1PYmplY3QuYXNzaWduKHt0eXBlOjQsdXJpOm98fHRoaXMuX3Nlc3Npb25Db250cm9sVVJMLGRhdGE6QnVmZmVyLmFsbG9jKDApfSx7bWV0aG9kOm4saGVhZGVyczppfSx7aGVhZGVyczpPYmplY3QuYXNzaWduKHtDU2VxOnRoaXMuX3NlcXVlbmNlKyt9LHRoaXMuZGVmYXVsdEhlYWRlcnMsdGhpcy5oZWFkZXJzW25dLGkpfSk7dGhpcy5fc2Vzc2lvbklkJiYocy5oZWFkZXJzLlNlc3Npb249dGhpcy5fc2Vzc2lvbklkKSx0aGlzLl9jYWxsSGlzdG9yeS5wdXNoKG4pLHRoaXMuX291dGdvaW5nQ2xvc2VkPygwLGtyLmRlZmF1bHQpKFwibXNsOnJ0c3A6b3V0Z29pbmdcIikoYFVuYWJsZSB0byBzZW5kICR7bn0sIGNvbm5lY3Rpb24gY2xvc2VkYCk6dGhpcy5vdXRnb2luZy5wdXNoKHMpfV9lbnF1ZXVlKHQpe2lmKHRoaXMuX2NhbGxTdGFjaz09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTt0aGlzLl9jYWxsU3RhY2sucHVzaCh0KX1fZGVxdWV1ZSgpe2lmKHRoaXMuX2NhbGxTdGFjaz09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJydHNwOiBpbnRlcm5hbCBlcnJvclwiKTtpZighdGhpcy5fd2FpdGluZyYmdGhpcy5fY2FsbFN0YWNrLmxlbmd0aD4wKXtsZXQgdD10aGlzLl9jYWxsU3RhY2suc2hpZnQoKTt0IT09dm9pZCAwJiZ0aGlzLnNlbmQodCl9fX07YygpO3ZhciBVcj1DKGxlKCkpO3ZhciBEcj1DKE4oKSk7YygpO3ZhciBRYz0xMDAwNyxaYz0ocj13aW5kb3cubG9jYXRpb24uaG9zdCxlPXdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCk9Pih7dXJpOmAke2U9PT1cImh0dHBzOlwiP1wid3NzOlwiOlwid3M6XCJ9Ly8ke3J9L3J0c3Atb3Zlci13ZWJzb2NrZXRgLHRva2VuVXJpOmAke2V9Ly8ke3J9L2F4aXMtY2dpL3J0c3B3c3Nlc3Npb24uY2dpYCxwcm90b2NvbDpcImJpbmFyeVwiLHRpbWVvdXQ6UWN9KSx0YT1hc3luYyhyPXt9KT0+e2xldHt1cmk6ZSx0b2tlblVyaTp0LHByb3RvY29sOm4sdGltZW91dDppfT1ndChaYyhyLmhvc3Qsci5zY2hlbWUpLHIpO2lmKGU9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwid3M6IGludGVybmFsIGVycm9yXCIpO3JldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgobyxzKT0+e3RyeXtsZXQgYT1uZXcgV2ViU29ja2V0KGUsbiksdT1zZXRUaW1lb3V0KCgpPT57Y2xlYXJUaW1lb3V0KHUpLGEucmVhZHlTdGF0ZT09PVdlYlNvY2tldC5DT05ORUNUSU5HJiYoYS5vbmVycm9yPW51bGwscyhuZXcgRXJyb3IoXCJ3ZWJzb2NrZXQgY29ubmVjdGlvbiB0aW1lZCBvdXRcIikpKX0saSk7YS5iaW5hcnlUeXBlPVwiYXJyYXlidWZmZXJcIixhLm9uZXJyb3I9Zj0+e2NsZWFyVGltZW91dCh1KTtmdW5jdGlvbiBsKCl7aWYodGhpcy5zdGF0dXM+PTQwMCl7Y29uc29sZS53YXJuKFwiZmFpbGVkIHRvIGxvYWQgdG9rZW5cIix0aGlzLnN0YXR1cyx0aGlzLnJlc3BvbnNlVGV4dCkscyhmKTtyZXR1cm59bGV0IGg9dGhpcy5yZXNwb25zZVRleHQudHJpbSgpLG09YCR7ZX0/cnRzcHdzc2Vzc2lvbj0ke2h9YCxiPW5ldyBXZWJTb2NrZXQobSxuKTtiLmJpbmFyeVR5cGU9XCJhcnJheWJ1ZmZlclwiLGIub25lcnJvcj15PT57cyh5KX0sYi5vbm9wZW49KCk9Pm8oYil9bGV0IGQ9bmV3IFhNTEh0dHBSZXF1ZXN0O2QuYWRkRXZlbnRMaXN0ZW5lcihcImxvYWRcIixsKSxkLmFkZEV2ZW50TGlzdGVuZXIoXCJlcnJvclwiLGg9Pntjb25zb2xlLndhcm4oXCJmYWlsZWQgdG8gZ2V0IHRva2VuXCIpLHMoaCl9KSxkLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCgpPT5zKGYpKSxkLm9wZW4oXCJHRVRcIixgJHt0fT8ke0RhdGUubm93KCl9YCk7dHJ5e2Quc2VuZCgpfWNhdGNoe3MoZil9fSxhLm9ub3Blbj0oKT0+e2NsZWFyVGltZW91dCh1KSxvKGEpfX1jYXRjaChhKXtzKGEpfX0pfTt2YXIgZWw9MTAwMSxHPWNsYXNzIGV4dGVuZHMgVntjb25zdHJ1Y3Rvcih0KXtpZih0PT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcInNvY2tldCBhcmd1bWVudCBtaXNzaW5nXCIpO2xldCBuPW5ldyBEci5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkOmZ1bmN0aW9uKCl7fX0pO3Qub25tZXNzYWdlPW89PntsZXQgcz1CdWZmZXIuZnJvbShvLmRhdGEpO24ucHVzaCh7ZGF0YTpzLHR5cGU6MX0pfHx0LnJlYWR5U3RhdGU9PT1XZWJTb2NrZXQuT1BFTiYmKCgwLFVyLmRlZmF1bHQpKFwibXNsOndlYnNvY2tldDppbmNvbWluZ1wiKShcImRvd25zdHJlYW0gZnJvemVuXCIpLHQuY2xvc2UoKSl9LG4ub24oXCJlcnJvclwiLG89Pntjb25zb2xlLndhcm4oXCJjbG9zaW5nIHNvY2tldCBkdWUgdG8gaW5jb21pbmcgZXJyb3JcIixvKSx0LmNsb3NlKCl9KTtsZXQgaT1uZXcgRHIuV3JpdGFibGUoe29iamVjdE1vZGU6ITAsd3JpdGU6ZnVuY3Rpb24obyxzLGEpe3RyeXt0LnNlbmQoby5kYXRhKX1jYXRjaHtjb25zb2xlLndhcm4oXCJtZXNzYWdlIGxvc3QgZHVyaW5nIHNlbmQ6XCIsbyl9YSgpfX0pO2kub24oXCJlcnJvclwiLG89Pntjb25zb2xlLndhcm4oXCJlcnJvciBkdXJpbmcgd2Vic29ja2V0IHNlbmQsIGlnbm9yaW5nOlwiLG8pfSksaS5vbihcImZpbmlzaFwiLCgpPT57KDAsVXIuZGVmYXVsdCkoXCJtc2w6d2Vic29ja2V0Om91dGdvaW5nXCIpKFwiZmluaXNoXCIpLHQucmVhZHlTdGF0ZSE9PVdlYlNvY2tldC5DTE9TRUQmJnQuY2xvc2UoKX0pLHQub25jbG9zZT1vPT57KDAsVXIuZGVmYXVsdCkoXCJtc2w6d2Vic29ja2V0OmNsb3NlXCIpKGAke28uY29kZX1gKSxvLmNvZGU9PT1lbCYmdGhpcy5vblNlcnZlckNsb3NlJiZ0aGlzLm9uU2VydmVyQ2xvc2UoKSxuLnB1c2gobnVsbCksaS5lbmQoKX07c3VwZXIobixpKX1zdGF0aWMgYXN5bmMgb3Blbih0KXtyZXR1cm4gYXdhaXQgdGEodCkudGhlbihuPT5uZXcgRyhuKSl9fTt2YXIgbmk9e307UHQobmkse0h0bWw1Q2FudmFzUGlwZWxpbmU6KCk9PkhyLEh0bWw1VmlkZW9NZXRhZGF0YVBpcGVsaW5lOigpPT5xcixIdG1sNVZpZGVvUGlwZWxpbmU6KCk9Pl90LEh0dHBNc2VQaXBlbGluZTooKT0+R3IsTWV0YWRhdGFQaXBlbGluZTooKT0+anIsUGlwZWxpbmU6KCk9PkJlLFJ0c3BNanBlZ1BpcGVsaW5lOigpPT54dCxSdHNwTXA0UGlwZWxpbmU6KCk9PmJ0LFJ0c3BQaXBlbGluZTooKT0+ZWUsV3NTZHBQaXBlbGluZTooKT0+V3J9KTtjKCk7YygpO3ZhciBCZT1jbGFzc3tjb25zdHJ1Y3RvciguLi5lKXtsZXRbdCwuLi5uXT1lO3RoaXMuX3NldD1uZXcgU2V0KGUpLHRoaXMuZmlyc3RDb21wb25lbnQ9dCx0aGlzLmxhc3RDb21wb25lbnQ9bi5yZWR1Y2UoKGksbyk9PmkuY29ubmVjdChvKSx0KX1pbml0KC4uLmUpe2xldFt0LC4uLm5dPWU7dGhpcy5fc2V0PW5ldyBTZXQoZSksdGhpcy5maXJzdENvbXBvbmVudD10LHRoaXMubGFzdENvbXBvbmVudD1uLnJlZHVjZSgoaSxvKT0+aS5jb25uZWN0KG8pLHQpfWluc2VydEFmdGVyKGUsdCl7aWYoIXRoaXMuX3NldC5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKFwiaW5zZXJ0aW9uIHBvaW50IG5vdCBwYXJ0IG9mIHBpcGVsaW5lXCIpO2lmKHRoaXMuX3NldC5oYXModCkpdGhyb3cgbmV3IEVycm9yKFwibmV3IGNvbXBvbmVudCBhbHJlYWR5IGluIHRoZSBwaXBlbGluZVwiKTtsZXQgbj1lLm5leHQ7cmV0dXJuIG49PT1udWxsPyhlLmNvbm5lY3QodCksdGhpcy5sYXN0Q29tcG9uZW50PXQpOihlLmRpc2Nvbm5lY3QoKSxlLmNvbm5lY3QodCkuY29ubmVjdChuKSksdGhpcy5fc2V0LmFkZCh0KSx0aGlzfWluc2VydEJlZm9yZShlLHQpe2lmKCF0aGlzLl9zZXQuaGFzKGUpKXRocm93IG5ldyBFcnJvcihcImluc2VydGlvbiBwb2ludCBub3QgcGFydCBvZiBwaXBlbGluZVwiKTtpZih0aGlzLl9zZXQuaGFzKHQpKXRocm93IG5ldyBFcnJvcihcIm5ldyBjb21wb25lbnQgYWxyZWFkeSBpbiB0aGUgcGlwZWxpbmVcIik7bGV0IG49ZS5wcmV2O3JldHVybiBuPT09bnVsbD8odC5jb25uZWN0KGUpLHRoaXMuZmlyc3RDb21wb25lbnQ9dCk6KG4uZGlzY29ubmVjdCgpLG4uY29ubmVjdCh0KS5jb25uZWN0KGUpKSx0aGlzLl9zZXQuYWRkKHQpLHRoaXN9cmVtb3ZlKGUpe2lmKCF0aGlzLl9zZXQuaGFzKGUpKXRocm93IG5ldyBFcnJvcihcImNvbXBvbmVudCBub3QgcGFydCBvZiBwaXBlbGluZVwiKTtsZXQgdD1lLnByZXYsbj1lLm5leHQ7aWYodD09PW51bGwmJm49PT1udWxsKXRocm93IG5ldyBFcnJvcihcImNhbm5vdCByZW1vdmUgbGFzdCBjb21wb25lbnRcIik7cmV0dXJuIHQ9PT1udWxsJiZuIT09bnVsbD8oZS5kaXNjb25uZWN0KCksdGhpcy5maXJzdENvbXBvbmVudD1uKTp0IT09bnVsbCYmbj09PW51bGw/KHQuZGlzY29ubmVjdCgpLHRoaXMubGFzdENvbXBvbmVudD10KTp0IT09bnVsbCYmbiE9PW51bGwmJih0LmRpc2Nvbm5lY3QoKSxlLmRpc2Nvbm5lY3QoKSx0LmNvbm5lY3QobikpLHRoaXMuX3NldC5kZWxldGUoZSksdGhpc31hcHBlbmQoLi4uZSl7cmV0dXJuIGUuZm9yRWFjaCh0PT57dGhpcy5pbnNlcnRBZnRlcih0aGlzLmxhc3RDb21wb25lbnQsdCl9KSx0aGlzfXByZXBlbmQoLi4uZSl7cmV0dXJuIGUuZm9yRWFjaCh0PT57dGhpcy5pbnNlcnRCZWZvcmUodGhpcy5maXJzdENvbXBvbmVudCx0KX0pLHRoaXN9fTtjKCk7dmFyIGVlPWNsYXNzIGV4dGVuZHMgQmV7Y29uc3RydWN0b3IodCl7bGV0IG49bmV3IG10LGk9bmV3IHl0KHQpO2kub25TZHA9bz0+e3RoaXMub25TZHAmJnRoaXMub25TZHAobyl9LGkub25QbGF5PW89Pnt0aGlzLm9uUGxheSYmdGhpcy5vblBsYXkobyl9O3N1cGVyKG4saSk7dGhpcy5ydHNwPWl9fTtjKCk7dmFyIGJ0PWNsYXNzIGV4dGVuZHMgZWV7Y29uc3RydWN0b3IodCl7c3VwZXIodCk7bGV0IG49bmV3IGN0LGk9bmV3IG90LG89bmV3IHB0O28ub25TeW5jPXM9Pnt0aGlzLm9uU3luYyYmdGhpcy5vblN5bmMocyl9LHRoaXMuYXBwZW5kKG4saSxvKSx0aGlzLl9tcDRNdXhlcj1vfWdldCBiaXRyYXRlKCl7cmV0dXJuIHRoaXMuX21wNE11eGVyLmJpdHJhdGV9Z2V0IGZyYW1lcmF0ZSgpe3JldHVybiB0aGlzLl9tcDRNdXhlci5mcmFtZXJhdGV9fTtjKCk7dmFyIHh0PWNsYXNzIGV4dGVuZHMgZWV7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSk7bGV0IHQ9bmV3IGx0O3RoaXMuYXBwZW5kKHQpfX07YygpO2MoKTtjKCk7dmFyIE1lPUMobmEoKSksTnI9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMubmM9KCk9PigrK3RoaXMuY291bnQsdGhpcy5jb3VudC50b1N0cmluZygxNikucGFkU3RhcnQoOCxcIjBcIikpO3RoaXMuY25vbmNlPSgpPT5uZXcgQXJyYXkoNCkuZmlsbCgwKS5tYXAoKCk9Pk1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoyNTYpKS5tYXAoZT0+ZS50b1N0cmluZygxNikpLmpvaW4oXCJcIik7dGhpcy5oYTE9ZT0+e2xldCB0PXRoaXMuaGExQmFzZTtyZXR1cm4gdGhpcy5hbGdvcml0aG09PT1cIm1kNS1zZXNzXCImJih0PW5ldyBNZS5NZDUoKS5hcHBlbmRTdHIoYCR7dH06JHt0aGlzLm5vbmNlfToke2V9YCkuZW5kKCkudG9TdHJpbmcoKSksdH07dGhpcy5oYTI9KGUsdCxuPVwiXCIpPT57bGV0IGk9bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihgJHtlfToke3R9YCkuZW5kKCkudG9TdHJpbmcoKTtpZih0aGlzLmFsZ29yaXRobT09PVwibWQ1LXNlc3NcIil7bGV0IG89bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihuKS5lbmQoKS50b1N0cmluZygpO2k9bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihgJHtlfToke3R9OiR7b31gKS5lbmQoKS50b1N0cmluZygpfXJldHVybiBpfTt0aGlzLmF1dGhvcml6YXRpb249KGU9XCJHRVRcIix0PVwiXCIsbik9PntsZXQgaT10aGlzLm5jKCksbz10aGlzLmNub25jZSgpLHM9dGhpcy5oYTEobyksYT10aGlzLmhhMihlLHQsbiksdT10aGlzLnFvcD09PXZvaWQgMD9uZXcgTWUuTWQ1KCkuYXBwZW5kU3RyKGAke3N9OiR7dGhpcy5ub25jZX06JHthfWApLmVuZCgpLnRvU3RyaW5nKCk6bmV3IE1lLk1kNSgpLmFwcGVuZFN0cihgJHtzfToke3RoaXMubm9uY2V9OiR7aX06JHtvfToke3RoaXMucW9wfToke2F9YCkuZW5kKCkudG9TdHJpbmcoKSxmPVtdO3JldHVybiBmLnB1c2goYHVzZXJuYW1lPVwiJHt0aGlzLnVzZXJuYW1lfVwiYCksZi5wdXNoKGByZWFsbT1cIiR7dGhpcy5yZWFsbX1cImApLGYucHVzaChgbm9uY2U9XCIke3RoaXMubm9uY2V9XCJgKSxmLnB1c2goYHVyaT1cIiR7dH1cImApLHRoaXMucW9wIT09dm9pZCAwJiYoZi5wdXNoKGBxb3A9JHt0aGlzLnFvcH1gKSxmLnB1c2goYG5jPSR7aX1gKSxmLnB1c2goYGNub25jZT1cIiR7b31cImApKSxmLnB1c2goYHJlc3BvbnNlPVwiJHt1fVwiYCksdGhpcy5vcGFxdWUhPT12b2lkIDAmJmYucHVzaChgb3BhcXVlPVwiJHt0aGlzLm9wYXF1ZX1cImApLGBEaWdlc3QgJHtmLmpvaW4oXCIsIFwiKX1gfTtsZXQgaT1lLmdldChcInJlYWxtXCIpO2lmKGk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwibm8gcmVhbG0gaW4gZGlnZXN0IGNoYWxsZW5nZVwiKTt0aGlzLnJlYWxtPWksdGhpcy5oYTFCYXNlPW5ldyBNZS5NZDUoKS5hcHBlbmRTdHIoYCR7dH06JHtpfToke259YCkuZW5kKCkudG9TdHJpbmcoKTtsZXQgbz1lLmdldChcIm5vbmNlXCIpO2lmKG89PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwibm8gbm9uY2UgaW4gZGlnZXN0IGNoYWxsZW5nZVwiKTt0aGlzLm5vbmNlPW8sdGhpcy5vcGFxdWU9ZS5nZXQoXCJvcGFxdWVcIik7bGV0IHM9ZS5nZXQoXCJhbGdvcml0aG1cIik7cyE9PXZvaWQgMD9zPT09XCJtZDVcIj90aGlzLmFsZ29yaXRobT1cIm1kNVwiOnM9PT1cIm1kNS1zZXNzXCImJih0aGlzLmFsZ29yaXRobT1cIm1kNS1zZXNzXCIpOnRoaXMuYWxnb3JpdGhtPVwibWQ1XCI7bGV0IGE9ZS5nZXQoXCJxb3BcIik7aWYoYSE9PXZvaWQgMCl7bGV0IHU9YS5zcGxpdChcIixcIikubWFwKGY9PmYudHJpbSgpKTt1LnNvbWUoZj0+Zj09PVwiYXV0aFwiKT90aGlzLnFvcD1cImF1dGhcIjp1LnNvbWUoZj0+Zj09PVwiYXV0aC1pbnRcIikmJih0aGlzLnFvcD1cImF1dGgtaW50XCIpfXRoaXMuY291bnQ9MCx0aGlzLnVzZXJuYW1lPXR9fTtjKCk7dmFyIGlhPXI9PntsZXRbLGUsLi4udF09ci5zcGxpdChcIiBcIiksbj1bXSxpPS9cXHMqKFtePV0rKT1cIihbXlwiXSopXCIsPy9nbSxvO2RvIGlmKG89aS5leGVjKHQuam9pbihcIiBcIikpLG8hPT1udWxsKXtsZXRbLGEsdV09bztuLnB1c2goW2EsdV0pfXdoaWxlKG8hPT1udWxsKTtsZXQgcz1uZXcgTWFwKG4pO3JldHVybnt0eXBlOmUudG9Mb3dlckNhc2UoKSxwYXJhbXM6c319O3ZhciB0bD00MDEscmw9e3VzZXJuYW1lOlwicm9vdFwiLHBhc3N3b3JkOlwicGFzc1wifSxMZT1jbGFzcyBleHRlbmRzIFJ7Y29uc3RydWN0b3IoZT17fSl7bGV0e3VzZXJuYW1lOnQscGFzc3dvcmQ6bn09Z3QocmwsZSk7aWYodD09PXZvaWQgMHx8bj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoXCJuZWVkIHVzZXJuYW1lIGFuZCBwYXNzd29yZFwiKTtsZXQgaSxvLHM9eWUoZnVuY3Rpb24odSxmLGwpe3UudHlwZT09PTQmJihpPXUsbyYmdS5oZWFkZXJzJiYodS5oZWFkZXJzLkF1dGhvcml6YXRpb249bykpLGwodm9pZCAwLHUpfSksYT15ZShmdW5jdGlvbih1LGYsbCl7aWYodS50eXBlPT09NCYmaHQodS5kYXRhKT09PXRsKXtsZXQgaD11LmRhdGEudG9TdHJpbmcoKS5zcGxpdChgXG5gKS5maW5kKGI9Pi9XV1ctQXV0aC9pLnRlc3QoYikpO2lmKGg9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IGZpbmQgV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXJcIik7bGV0IG09aWEoaCk7aWYobS50eXBlPT09XCJiYXNpY1wiKW89XCJCYXNpYyBcIitCdWZmZXIuZnJvbSh0K1wiOlwiK24pLnRvU3RyaW5nKFwiYmFzZTY0XCIpO2Vsc2UgaWYobS50eXBlPT09XCJkaWdlc3RcIilvPW5ldyBOcihtLnBhcmFtcyx0LG4pLmF1dGhvcml6YXRpb24oaS5tZXRob2QsaS51cmkpO2Vsc2UgcmV0dXJuO3Mud3JpdGUoaSwoKT0+bCgpKX1lbHNlIGwodm9pZCAwLHUpfSk7c3VwZXIoYSxzKX19O3ZhciBIcj1jbGFzcyBleHRlbmRzIHh0e2NvbnN0cnVjdG9yKHQpe2xldHt3czpuLHJ0c3A6aSxtZWRpYUVsZW1lbnQ6byxhdXRoOnN9PXQ7c3VwZXIoaSk7aWYocyl7bGV0IGY9bmV3IExlKHMpO3RoaXMuaW5zZXJ0QmVmb3JlKHRoaXMucnRzcCxmKX1sZXQgYT1uZXcgc3Qobyk7YS5vbkNhbnBsYXk9KCk9PnthLnBsYXkoKSx0aGlzLm9uQ2FucGxheSYmdGhpcy5vbkNhbnBsYXkoKX0sYS5vblN5bmM9Zj0+e3RoaXMub25TeW5jJiZ0aGlzLm9uU3luYyhmKX0sdGhpcy5hcHBlbmQoYSksdGhpcy5fc2luaz1hO2xldCB1PUcub3BlbihuKTt0aGlzLnJlYWR5PXUudGhlbihmPT57Zi5vblNlcnZlckNsb3NlPSgpPT57dGhpcy5vblNlcnZlckNsb3NlJiZ0aGlzLm9uU2VydmVyQ2xvc2UoKX0sdGhpcy5wcmVwZW5kKGYpLHRoaXMuX3NyYz1mfSl9Y2xvc2UoKXt0aGlzLl9zcmMmJnRoaXMuX3NyYy5vdXRnb2luZy5lbmQoKX1nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5fc2luay5jdXJyZW50VGltZX1wbGF5KCl7cmV0dXJuIHRoaXMuX3NpbmsucGxheSgpfXBhdXNlKCl7cmV0dXJuIHRoaXMuX3NpbmsucGF1c2UoKX1nZXQgYml0cmF0ZSgpe3JldHVybiB0aGlzLl9zaW5rLmJpdHJhdGV9Z2V0IGZyYW1lcmF0ZSgpe3JldHVybiB0aGlzLl9zaW5rLmZyYW1lcmF0ZX19O2MoKTt2YXIgX3Q9Y2xhc3MgZXh0ZW5kcyBidHtjb25zdHJ1Y3Rvcih0KXtsZXR7d3M6bixydHNwOmksbWVkaWFFbGVtZW50Om8sYXV0aDpzfT10O3N1cGVyKGkpO2lmKHMpe2xldCBmPW5ldyBMZShzKTt0aGlzLmluc2VydEJlZm9yZSh0aGlzLnJ0c3AsZil9bGV0IGE9bmV3IFRlKG8pO2Eub25Tb3VyY2VPcGVuPShmLGwpPT57dGhpcy50cmFja3M9bCx0aGlzLm9uU291cmNlT3BlbiYmdGhpcy5vblNvdXJjZU9wZW4oZixsKX0sdGhpcy5hcHBlbmQoYSksdGhpcy5fc2luaz1hO2xldCB1PUcub3BlbihuKTt0aGlzLnJlYWR5PXUudGhlbihmPT57Zi5vblNlcnZlckNsb3NlPSgpPT57dGhpcy5vblNlcnZlckNsb3NlJiZ0aGlzLm9uU2VydmVyQ2xvc2UoKX0sdGhpcy5wcmVwZW5kKGYpLHRoaXMuX3NyYz1mfSl9Y2xvc2UoKXt0aGlzLl9zcmMmJnRoaXMuX3NyYy5vdXRnb2luZy5lbmQoKX1nZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5fc2luay5jdXJyZW50VGltZX1hc3luYyBwbGF5KCl7cmV0dXJuIGF3YWl0IHRoaXMuX3NpbmsucGxheSgpfXBhdXNlKCl7cmV0dXJuIHRoaXMuX3NpbmsucGF1c2UoKX19O2MoKTt2YXIgcXI9Y2xhc3MgZXh0ZW5kcyBfdHtjb25zdHJ1Y3RvcihlKXtsZXR7bWV0YWRhdGFIYW5kbGVyOnR9PWU7c3VwZXIoZSk7bGV0IG49bmV3IENlO3RoaXMuaW5zZXJ0QWZ0ZXIodGhpcy5ydHNwLG4pO2xldCBpPVIuZnJvbUhhbmRsZXJzKG89PntvLnR5cGU9PT05JiZ0KG8pfSx2b2lkIDApO3RoaXMuaW5zZXJ0QWZ0ZXIobixpKX19O2MoKTt2YXIgbmw9e3BhcmFtZXRlcnM6W1wiYXVkaW89MFwiLFwidmlkZW89MFwiLFwiZXZlbnQ9b25cIixcInB0ej1hbGxcIl19LGpyPWNsYXNzIGV4dGVuZHMgZWV7Y29uc3RydWN0b3IodCl7bGV0e3dzOm4scnRzcDppLG1ldGFkYXRhSGFuZGxlcjpvfT10O3N1cGVyKE9iamVjdC5hc3NpZ24oe30sbmwsaSkpO2xldCBzPW5ldyBDZTt0aGlzLmFwcGVuZChzKTtsZXQgYT1RLmZyb21IYW5kbGVyKGY9PntmLnR5cGU9PT05JiZvKGYpfSk7dGhpcy5hcHBlbmQoYSk7bGV0IHU9Ry5vcGVuKG4pO3RoaXMucmVhZHk9dS50aGVuKGY9PntmLm9uU2VydmVyQ2xvc2U9KCk9Pnt0aGlzLm9uU2VydmVyQ2xvc2UmJnRoaXMub25TZXJ2ZXJDbG9zZSgpfSx0aGlzLnByZXBlbmQoZiksdGhpcy5fc3JjPWZ9KX1jbG9zZSgpe3RoaXMuX3NyYyYmdGhpcy5fc3JjLm91dGdvaW5nLmVuZCgpfX07YygpO3ZhciBXcj1jbGFzcyBleHRlbmRzIGVle2NvbnN0cnVjdG9yKHQpe2xldHt3czpuLHJ0c3A6aSxhdXRoOm99PXQ7c3VwZXIoaSk7aWYobyl7bGV0IGE9bmV3IExlKG8pO3RoaXMuaW5zZXJ0QmVmb3JlKHRoaXMucnRzcCxhKX1sZXQgcz1HLm9wZW4obik7dGhpcy5yZWFkeT1zLnRoZW4oYT0+e2Eub25TZXJ2ZXJDbG9zZT0oKT0+e3RoaXMub25TZXJ2ZXJDbG9zZSYmdGhpcy5vblNlcnZlckNsb3NlKCl9LHRoaXMucHJlcGVuZChhKSx0aGlzLl9zcmM9YX0pfWNsb3NlKCl7dGhpcy5fc3JjJiZ0aGlzLl9zcmMub3V0Z29pbmcuZW5kKCl9Z2V0IHNkcCgpe3JldHVybiB0aGlzLnJlYWR5LnRoZW4oYXN5bmMoKT0+e2xldCB0PW5ldyBQcm9taXNlKG49Pnt0aGlzLnJ0c3Aub25TZHA9bn0pO3JldHVybiB0aGlzLnJ0c3Auc2VuZCh7bWV0aG9kOlwiREVTQ1JJQkVcIn0pLHRoaXMucnRzcC5zZW5kKHttZXRob2Q6XCJURUFSRE9XTlwifSksYXdhaXQgdH0pfX07YygpO2MoKTt2YXIgb2E9QyhsZSgpKTt2YXIgc2E9QyhOKCkpO3ZhciByaT0oMCxvYS5kZWZhdWx0KShcIm1zbDpodHRwLW1wNFwiKSwkcj1jbGFzcyBleHRlbmRzIFZ7Y29uc3RydWN0b3IodCl7bGV0e3VyaTpuLG9wdGlvbnM6aX09dCxvPW5ldyBzYS5SZWFkYWJsZSh7b2JqZWN0TW9kZTohMCxyZWFkOmZ1bmN0aW9uKCl7fX0pO28ub24oXCJlcnJvclwiLHM9Pntjb25zb2xlLndhcm4oXCJjbG9zaW5nIHNvY2tldCBkdWUgdG8gaW5jb21pbmcgZXJyb3JcIixzKSx0aGlzLl9yZWFkZXImJnRoaXMuX3JlYWRlci5jYW5jZWwoKX0pO3N1cGVyKG8pO28uX3JlYWQ9KCk9Pnt0aGlzLl9wdWxsKCl9LHRoaXMudXJpPW4sdGhpcy5vcHRpb25zPWksdGhpcy5fYWxsRG9uZT0hMX1wbGF5KCl7aWYodGhpcy51cmk9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IHN0YXJ0IHBsYXlpbmcgd2hlbiB0aGVyZSBpcyBubyBVUklcIik7dGhpcy5fYWJvcnRDb250cm9sbGVyPW5ldyBBYm9ydENvbnRyb2xsZXIsdGhpcy5sZW5ndGg9MCxmZXRjaCh0aGlzLnVyaSx7Y3JlZGVudGlhbHM6XCJpbmNsdWRlXCIsc2lnbmFsOnRoaXMuX2Fib3J0Q29udHJvbGxlci5zaWduYWwsLi4udGhpcy5vcHRpb25zfSkudGhlbih0PT57aWYodC5ib2R5PT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoXCJlbXB0eSByZXNwb25zZSBib2R5XCIpO2xldCBuPXQuaGVhZGVycy5nZXQoXCJDb250ZW50LVR5cGVcIik7dGhpcy5pbmNvbWluZy5wdXNoKHtkYXRhOkJ1ZmZlci5hbGxvYygwKSx0eXBlOjgsbWltZTpufSksdGhpcy5vbkhlYWRlcnMmJnRoaXMub25IZWFkZXJzKHQuaGVhZGVycyksdGhpcy5fcmVhZGVyPXQuYm9keS5nZXRSZWFkZXIoKSx0aGlzLl9wdWxsKCl9KS5jYXRjaCh0PT57Y29uc29sZS5lcnJvcihcImh0dHAtc291cmNlOiBmZXRjaCBmYWlsZWQ6IFwiLHQpfSl9YWJvcnQoKXt0aGlzLl9yZWFkZXImJnRoaXMuX3JlYWRlci5jYW5jZWwoKS5jYXRjaCh0PT57Y29uc29sZS5sb2coXCJodHRwLXNvdXJjZTogY2FuY2VsIHJlYWRlciBmYWlsZWQ6IFwiLHQpfSksdGhpcy5fYWJvcnRDb250cm9sbGVyJiZ0aGlzLl9hYm9ydENvbnRyb2xsZXIuYWJvcnQoKX1faXNDbG9zZWQoKXtyZXR1cm4gdGhpcy5fYWxsRG9uZX1fY2xvc2UoKXt0aGlzLl9yZWFkZXI9dm9pZCAwLHRoaXMuX2FsbERvbmU9ITAsdGhpcy5pbmNvbWluZy5wdXNoKG51bGwpLHRoaXMub25TZXJ2ZXJDbG9zZT8uKCl9X3B1bGwoKXt0aGlzLl9yZWFkZXIhPT12b2lkIDAmJnRoaXMuX3JlYWRlci5yZWFkKCkudGhlbigoe2RvbmU6dCx2YWx1ZTpufSk9PntpZih0KXt0aGlzLl9pc0Nsb3NlZCgpfHwocmkoXCJmZXRjaCBjb21wbGV0ZWQsIHRvdGFsIGRvd25sb2FkZWQ6IFwiLHRoaXMubGVuZ3RoLFwiIGJ5dGVzXCIpLHRoaXMuX2Nsb3NlKCkpO3JldHVybn1pZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIHZhbHVlIHRvIGJlIGRlZmluZWRcIik7aWYodGhpcy5sZW5ndGg9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKFwiZXhwZWN0ZWQgbGVuZ3RoIHRvIGJlIGRlZmluZWRcIik7dGhpcy5sZW5ndGgrPW4ubGVuZ3RoO2xldCBpPUJ1ZmZlci5mcm9tKG4pO3RoaXMuaW5jb21pbmcucHVzaCh7ZGF0YTppLHR5cGU6OH0pP3RoaXMuX3B1bGwoKTpyaShcImRvd25zdHJlYW0gYmFjayBwcmVzc3VyZTogcGF1c2luZyByZWFkXCIpfSkuY2F0Y2godD0+e3JpKFwiaHR0cC1zb3VyY2U6IHJlYWQgZmFpbGVkOiBcIix0KSx0aGlzLl9pc0Nsb3NlZCgpfHx0aGlzLl9jbG9zZSgpfSl9fTt2YXIgR3I9Y2xhc3MgZXh0ZW5kcyBCZXtjb25zdHJ1Y3Rvcih0KXtsZXR7aHR0cDpuLG1lZGlhRWxlbWVudDppfT10LG89bmV3ICRyKG4pLHM9bmV3IFRlKGkpO28ub25IZWFkZXJzPWE9Pnt0aGlzLm9uSGVhZGVycyYmdGhpcy5vbkhlYWRlcnMoYSl9LG8ub25TZXJ2ZXJDbG9zZT0oKT0+dGhpcy5vblNlcnZlckNsb3NlPy4oKTtzdXBlcihvLHMpO3RoaXMuX3NyYz1vLHRoaXMuX3Npbms9cyx0aGlzLmh0dHA9b31jbG9zZSgpe3RoaXMuX3NyYyYmdGhpcy5fc3JjLmFib3J0KCl9Z2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX3NpbmsuY3VycmVudFRpbWV9YXN5bmMgcGxheSgpe3JldHVybiBhd2FpdCB0aGlzLl9zaW5rLnBsYXkoKX1wYXVzZSgpe3JldHVybiB0aGlzLl9zaW5rLnBhdXNlKCl9fTt2YXIgaWk9e307UHQoaWkse1JUQ1BQYWNrZXRUeXBlOigpPT5LbixTREVTSXRlbTooKT0+Sm4sU1I6KCk9PkhzLFNjaGVkdWxlcjooKT0+V2UsYWRkUlRTUFJldHJ5OigpPT5hYSxib2R5T2Zmc2V0OigpPT5BcixjU3JjOigpPT5ucyxjU3JjQ291bnQ6KCk9PlNlLGNvbm5lY3Rpb25FbmRlZDooKT0+THIsY29udGVudEJhc2U6KCk9PkJyLGNvbnRlbnRMb2NhdGlvbjooKT0+TXIsZXh0SGVhZGVyOigpPT5pcyxleHRIZWFkZXJMZW5ndGg6KCk9Pk10LGV4dGVuc2lvbjooKT0+b3IsZXh0cmFjdEhlYWRlclZhbHVlOigpPT5yZSxleHRyYWN0VVJJczooKT0+SnMsZ2V0VGltZTooKT0+UHIsaXNSdGNwQXBwOigpPT4kcyxpc1J0Y3BCeWU6KCk9PndyLGlzUnRjcFJSOigpPT5qcyxpc1J0Y3BTREVTOigpPT5Xcyxpc1J0Y3BTUjooKT0+X3IsbWFya2VyOigpPT5jZSxtZXNzYWdlRnJvbUJ1ZmZlcjooKT0+U3IscGFkZGluZzooKT0+ZXMscGFyc2U6KCk9PlFuLHBhcnNlUnRjcDooKT0+WG4scGF5bG9hZDooKT0+WixwYXlsb2FkVHlwZTooKT0+TyxyYW5nZTooKT0+SXIscnRjcE1lc3NhZ2VGcm9tQnVmZmVyOigpPT54cixzU3JjOigpPT5ycyxzZXF1ZW5jZTooKT0+UnIsc2VxdWVuY2VOdW1iZXI6KCk9PnRzLHNlc3Npb25JZDooKT0+VHIsc2Vzc2lvblRpbWVvdXQ6KCk9PkNyLHN0YXR1c0NvZGU6KCk9Pmh0LHRpbWVzdGFtcDooKT0+SCx2ZXJzaW9uOigpPT5ab30pO2MoKTtjKCk7YygpO3ZhciBhYT0ocix7bWF4UmV0cmllczplLGVycm9yczp0fT17bWF4UmV0cmllczoyMCxlcnJvcnM6WzUwM119KT0+e2xldCBuPTAsaT1yLm9uRXJyb3I7ci5vbkVycm9yPW89PntpZihpPy4obyksISF0LmluY2x1ZGVzKG8uY29kZSkpe2lmKChuKz0xKT5lKXtjb25zb2xlLmxvZyhcInJldHJ5LCB0b28gbWFueVwiLG4sZSk7cmV0dXJufXNldFRpbWVvdXQoKCk9PnIucmV0cnk/LigpLG4qMTAwKX19fTtcbi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyohIGllZWU3NTQuIEJTRC0zLUNsYXVzZSBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbi8qISBzYWZlLWJ1ZmZlci4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguY2pzLmpzLm1hcFxuIiwiJ3VzZSBzdHJpY3QnXG5cbmV4cG9ydHMuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcbmV4cG9ydHMudG9CeXRlQXJyYXkgPSB0b0J5dGVBcnJheVxuZXhwb3J0cy5mcm9tQnl0ZUFycmF5ID0gZnJvbUJ5dGVBcnJheVxuXG52YXIgbG9va3VwID0gW11cbnZhciByZXZMb29rdXAgPSBbXVxudmFyIEFyciA9IHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJyA/IFVpbnQ4QXJyYXkgOiBBcnJheVxuXG52YXIgY29kZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJ1xuZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNvZGUubGVuZ3RoOyBpIDwgbGVuOyArK2kpIHtcbiAgbG9va3VwW2ldID0gY29kZVtpXVxuICByZXZMb29rdXBbY29kZS5jaGFyQ29kZUF0KGkpXSA9IGlcbn1cblxuLy8gU3VwcG9ydCBkZWNvZGluZyBVUkwtc2FmZSBiYXNlNjQgc3RyaW5ncywgYXMgTm9kZS5qcyBkb2VzLlxuLy8gU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYXNlNjQjVVJMX2FwcGxpY2F0aW9uc1xucmV2TG9va3VwWyctJy5jaGFyQ29kZUF0KDApXSA9IDYyXG5yZXZMb29rdXBbJ18nLmNoYXJDb2RlQXQoMCldID0gNjNcblxuZnVuY3Rpb24gZ2V0TGVucyAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG5cbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIFRyaW0gb2ZmIGV4dHJhIGJ5dGVzIGFmdGVyIHBsYWNlaG9sZGVyIGJ5dGVzIGFyZSBmb3VuZFxuICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9iZWF0Z2FtbWl0L2Jhc2U2NC1qcy9pc3N1ZXMvNDJcbiAgdmFyIHZhbGlkTGVuID0gYjY0LmluZGV4T2YoJz0nKVxuICBpZiAodmFsaWRMZW4gPT09IC0xKSB2YWxpZExlbiA9IGxlblxuXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSB2YWxpZExlbiA9PT0gbGVuXG4gICAgPyAwXG4gICAgOiA0IC0gKHZhbGlkTGVuICUgNClcblxuICByZXR1cm4gW3ZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW5dXG59XG5cbi8vIGJhc2U2NCBpcyA0LzMgKyB1cCB0byB0d28gY2hhcmFjdGVycyBvZiB0aGUgb3JpZ2luYWwgZGF0YVxuZnVuY3Rpb24gYnl0ZUxlbmd0aCAoYjY0KSB7XG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIF9ieXRlTGVuZ3RoIChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pIHtcbiAgcmV0dXJuICgodmFsaWRMZW4gKyBwbGFjZUhvbGRlcnNMZW4pICogMyAvIDQpIC0gcGxhY2VIb2xkZXJzTGVuXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVucyA9IGdldExlbnMoYjY0KVxuICB2YXIgdmFsaWRMZW4gPSBsZW5zWzBdXG4gIHZhciBwbGFjZUhvbGRlcnNMZW4gPSBsZW5zWzFdXG5cbiAgdmFyIGFyciA9IG5ldyBBcnIoX2J5dGVMZW5ndGgoYjY0LCB2YWxpZExlbiwgcGxhY2VIb2xkZXJzTGVuKSlcblxuICB2YXIgY3VyQnl0ZSA9IDBcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIHZhciBsZW4gPSBwbGFjZUhvbGRlcnNMZW4gPiAwXG4gICAgPyB2YWxpZExlbiAtIDRcbiAgICA6IHZhbGlkTGVuXG5cbiAgdmFyIGlcbiAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDE4KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8XG4gICAgICByZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDMpXVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiAxNikgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDgpICYgMHhGRlxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMikge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnNMZW4gPT09IDEpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTApIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiA2ICYgMHgzRl0gK1xuICAgIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPVxuICAgICAgKCh1aW50OFtpXSA8PCAxNikgJiAweEZGMDAwMCkgK1xuICAgICAgKCh1aW50OFtpICsgMV0gPDwgOCkgJiAweEZGMDApICtcbiAgICAgICh1aW50OFtpICsgMl0gJiAweEZGKVxuICAgIG91dHB1dC5wdXNoKHRyaXBsZXRUb0Jhc2U2NCh0bXApKVxuICB9XG4gIHJldHVybiBvdXRwdXQuam9pbignJylcbn1cblxuZnVuY3Rpb24gZnJvbUJ5dGVBcnJheSAodWludDgpIHtcbiAgdmFyIHRtcFxuICB2YXIgbGVuID0gdWludDgubGVuZ3RoXG4gIHZhciBleHRyYUJ5dGVzID0gbGVuICUgMyAvLyBpZiB3ZSBoYXZlIDEgYnl0ZSBsZWZ0LCBwYWQgMiBieXRlc1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXSArXG4gICAgICAnPT0nXG4gICAgKVxuICB9IGVsc2UgaWYgKGV4dHJhQnl0ZXMgPT09IDIpIHtcbiAgICB0bXAgPSAodWludDhbbGVuIC0gMl0gPDwgOCkgKyB1aW50OFtsZW4gLSAxXVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBsb29rdXBbdG1wID4+IDEwXSArXG4gICAgICBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdICtcbiAgICAgIGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl0gK1xuICAgICAgJz0nXG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxudmFyIEtfTUFYX0xFTkdUSCA9IDB4N2ZmZmZmZmZcbmV4cG9ydHMua01heExlbmd0aCA9IEtfTUFYX0xFTkdUSFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBQcmludCB3YXJuaW5nIGFuZCByZWNvbW1lbmQgdXNpbmcgYGJ1ZmZlcmAgdjQueCB3aGljaCBoYXMgYW4gT2JqZWN0XG4gKiAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBXZSByZXBvcnQgdGhhdCB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBpZiB0aGUgYXJlIG5vdCBzdWJjbGFzc2FibGVcbiAqIHVzaW5nIF9fcHJvdG9fXy4gRmlyZWZveCA0LTI5IGxhY2tzIHN1cHBvcnQgZm9yIGFkZGluZyBuZXcgcHJvcGVydGllcyB0byBgVWludDhBcnJheWBcbiAqIChTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOCkuIElFIDEwIGxhY2tzIHN1cHBvcnRcbiAqIGZvciBfX3Byb3RvX18gYW5kIGhhcyBhIGJ1Z2d5IHR5cGVkIGFycmF5IGltcGxlbWVudGF0aW9uLlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICBjb25zb2xlLmVycm9yKFxuICAgICdUaGlzIGJyb3dzZXIgbGFja3MgdHlwZWQgYXJyYXkgKFVpbnQ4QXJyYXkpIHN1cHBvcnQgd2hpY2ggaXMgcmVxdWlyZWQgYnkgJyArXG4gICAgJ2BidWZmZXJgIHY1LnguIFVzZSBgYnVmZmVyYCB2NC54IGlmIHlvdSByZXF1aXJlIG9sZCBicm93c2VyIHN1cHBvcnQuJ1xuICApXG59XG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgLy8gQ2FuIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkP1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5fX3Byb3RvX18gPSB7IF9fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfSB9XG4gICAgcmV0dXJuIGFyci5mb28oKSA9PT0gNDJcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIucHJvdG90eXBlLCAncGFyZW50Jywge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0aGlzKSkgcmV0dXJuIHVuZGVmaW5lZFxuICAgIHJldHVybiB0aGlzLmJ1ZmZlclxuICB9XG59KVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ29mZnNldCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5ieXRlT2Zmc2V0XG4gIH1cbn0pXG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAobGVuZ3RoKSB7XG4gIGlmIChsZW5ndGggPiBLX01BWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIGxlbmd0aCArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKVxuICB9XG4gIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlXG4gIHZhciBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gIGJ1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBidWZcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZShhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20oYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbi8vIEZpeCBzdWJhcnJheSgpIGluIEVTMjAxNi4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzk3XG5pZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnNwZWNpZXMgIT0gbnVsbCAmJlxuICAgIEJ1ZmZlcltTeW1ib2wuc3BlY2llc10gPT09IEJ1ZmZlcikge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgIHZhbHVlOiBudWxsLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB3cml0YWJsZTogZmFsc2VcbiAgfSlcbn1cblxuQnVmZmVyLnBvb2xTaXplID0gODE5MiAvLyBub3QgdXNlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uXG5cbmZ1bmN0aW9uIGZyb20gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUxpa2UodmFsdWUpXG4gIH1cblxuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcbiAgICAgICdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICtcbiAgICAgICdvciBBcnJheS1saWtlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgKHR5cGVvZiB2YWx1ZSlcbiAgICApXG4gIH1cblxuICBpZiAoaXNJbnN0YW5jZSh2YWx1ZSwgQXJyYXlCdWZmZXIpIHx8XG4gICAgICAodmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIEFycmF5QnVmZmVyKSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwidmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBvZiB0eXBlIG51bWJlci4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgKVxuICB9XG5cbiAgdmFyIHZhbHVlT2YgPSB2YWx1ZS52YWx1ZU9mICYmIHZhbHVlLnZhbHVlT2YoKVxuICBpZiAodmFsdWVPZiAhPSBudWxsICYmIHZhbHVlT2YgIT09IHZhbHVlKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlT2YsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIHZhciBiID0gZnJvbU9iamVjdCh2YWx1ZSlcbiAgaWYgKGIpIHJldHVybiBiXG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1ByaW1pdGl2ZSAhPSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWVbU3ltYm9sLnRvUHJpbWl0aXZlXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShcbiAgICAgIHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0oJ3N0cmluZycpLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGhcbiAgICApXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICtcbiAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gIClcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBOb3RlOiBDaGFuZ2UgcHJvdG90eXBlICphZnRlciogQnVmZmVyLmZyb20gaXMgZGVmaW5lZCB0byB3b3JrYXJvdW5kIENocm9tZSBidWc6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzE0OFxuQnVmZmVyLnByb3RvdHlwZS5fX3Byb3RvX18gPSBVaW50OEFycmF5LnByb3RvdHlwZVxuQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIHNpemUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcihzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2Moc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlIChzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIEJ1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKVxufVxuLyoqXG4gKiBFcXVpdmFsZW50IHRvIFNsb3dCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIHJldHVybiBhbGxvY1Vuc2FmZShzaXplKVxufVxuXG5mdW5jdGlvbiBmcm9tU3RyaW5nIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnIHx8IGVuY29kaW5nID09PSAnJykge1xuICAgIGVuY29kaW5nID0gJ3V0ZjgnXG4gIH1cblxuICBpZiAoIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgfVxuXG4gIHZhciBsZW5ndGggPSBieXRlTGVuZ3RoKHN0cmluZywgZW5jb2RpbmcpIHwgMFxuICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcblxuICB2YXIgYWN0dWFsID0gYnVmLndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICBidWYgPSBidWYuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlIChhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHZhciBidWYgPSBjcmVhdGVCdWZmZXIobGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgYnVmW2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUJ1ZmZlciAoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAoYnl0ZU9mZnNldCA8IDAgfHwgYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJvZmZzZXRcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0ICsgKGxlbmd0aCB8fCAwKSkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcImxlbmd0aFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICB2YXIgYnVmXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSlcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBidWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICB2YXIgbGVuID0gY2hlY2tlZChvYmoubGVuZ3RoKSB8IDBcbiAgICB2YXIgYnVmID0gY3JlYXRlQnVmZmVyKGxlbilcblxuICAgIGlmIChidWYubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYnVmXG4gICAgfVxuXG4gICAgb2JqLmNvcHkoYnVmLCAwLCAwLCBsZW4pXG4gICAgcmV0dXJuIGJ1ZlxuICB9XG5cbiAgaWYgKG9iai5sZW5ndGggIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2Ygb2JqLmxlbmd0aCAhPT0gJ251bWJlcicgfHwgbnVtYmVySXNOYU4ob2JqLmxlbmd0aCkpIHtcbiAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIoMClcbiAgICB9XG4gICAgcmV0dXJuIGZyb21BcnJheUxpa2Uob2JqKVxuICB9XG5cbiAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBBcnJheS5pc0FycmF5KG9iai5kYXRhKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iai5kYXRhKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBLX01BWF9MRU5HVEhgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIEtfTUFYX0xFTkdUSC50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuIGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlciA9PT0gdHJ1ZSAmJlxuICAgIGIgIT09IEJ1ZmZlci5wcm90b3R5cGUgLy8gc28gQnVmZmVyLmlzQnVmZmVyKEJ1ZmZlci5wcm90b3R5cGUpIHdpbGwgYmUgZmFsc2Vcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmIChpc0luc3RhbmNlKGEsIFVpbnQ4QXJyYXkpKSBhID0gQnVmZmVyLmZyb20oYSwgYS5vZmZzZXQsIGEuYnl0ZUxlbmd0aClcbiAgaWYgKGlzSW5zdGFuY2UoYiwgVWludDhBcnJheSkpIGIgPSBCdWZmZXIuZnJvbShiLCBiLm9mZnNldCwgYi5ieXRlTGVuZ3RoKVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihhKSB8fCAhQnVmZmVyLmlzQnVmZmVyKGIpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJidWYxXCIsIFwiYnVmMlwiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5J1xuICAgIClcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmIChpc0luc3RhbmNlKGJ1ZiwgVWludDhBcnJheSkpIHtcbiAgICAgIGJ1ZiA9IEJ1ZmZlci5mcm9tKGJ1ZilcbiAgICB9XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgaXNJbnN0YW5jZShzdHJpbmcsIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgb3IgQXJyYXlCdWZmZXIuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzdHJpbmdcbiAgICApXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbXVzdE1hdGNoID0gKGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSA9PT0gdHJ1ZSlcbiAgaWYgKCFtdXN0TWF0Y2ggJiYgbGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiBsZW4gKiAyXG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gbGVuID4+PiAxXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB7XG4gICAgICAgICAgcmV0dXJuIG11c3RNYXRjaCA/IC0xIDogdXRmOFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGggLy8gYXNzdW1lIHV0ZjhcbiAgICAgICAgfVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoaXMgcHJvcGVydHkgaXMgdXNlZCBieSBgQnVmZmVyLmlzQnVmZmVyYCAoYW5kIHRoZSBgaXMtYnVmZmVyYCBucG0gcGFja2FnZSlcbi8vIHRvIGRldGVjdCBhIEJ1ZmZlciBpbnN0YW5jZS4gSXQncyBub3QgcG9zc2libGUgdG8gdXNlIGBpbnN0YW5jZW9mIEJ1ZmZlcmBcbi8vIHJlbGlhYmx5IGluIGEgYnJvd3NlcmlmeSBjb250ZXh0IGJlY2F1c2UgdGhlcmUgY291bGQgYmUgbXVsdGlwbGUgZGlmZmVyZW50XG4vLyBjb3BpZXMgb2YgdGhlICdidWZmZXInIHBhY2thZ2UgaW4gdXNlLiBUaGlzIG1ldGhvZCB3b3JrcyBldmVuIGZvciBCdWZmZXJcbi8vIGluc3RhbmNlcyB0aGF0IHdlcmUgY3JlYXRlZCBmcm9tIGFub3RoZXIgY29weSBvZiB0aGUgYGJ1ZmZlcmAgcGFja2FnZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzE1NFxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0xvY2FsZVN0cmluZyA9IEJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmdcblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgc3RyID0gdGhpcy50b1N0cmluZygnaGV4JywgMCwgbWF4KS5yZXBsYWNlKC8oLnsyfSkvZywgJyQxICcpLnRyaW0oKVxuICBpZiAodGhpcy5sZW5ndGggPiBtYXgpIHN0ciArPSAnIC4uLiAnXG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmIChpc0luc3RhbmNlKHRhcmdldCwgVWludDhBcnJheSkpIHtcbiAgICB0YXJnZXQgPSBCdWZmZXIuZnJvbSh0YXJnZXQsIHRhcmdldC5vZmZzZXQsIHRhcmdldC5ieXRlTGVuZ3RoKVxuICB9XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInRhcmdldFwiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdGFyZ2V0KVxuICAgIClcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgLy8gQ29lcmNlIHRvIE51bWJlci5cbiAgaWYgKG51bWJlcklzTmFOKGJ5dGVPZmZzZXQpKSB7XG4gICAgLy8gYnl0ZU9mZnNldDogaXQgaXQncyB1bmRlZmluZWQsIG51bGwsIE5hTiwgXCJmb29cIiwgZXRjLCBzZWFyY2ggd2hvbGUgYnVmZmVyXG4gICAgYnl0ZU9mZnNldCA9IGRpciA/IDAgOiAoYnVmZmVyLmxlbmd0aCAtIDEpXG4gIH1cblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldDogbmVnYXRpdmUgb2Zmc2V0cyBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlclxuICBpZiAoYnl0ZU9mZnNldCA8IDApIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoICsgYnl0ZU9mZnNldFxuICBpZiAoYnl0ZU9mZnNldCA+PSBidWZmZXIubGVuZ3RoKSB7XG4gICAgaWYgKGRpcikgcmV0dXJuIC0xXG4gICAgZWxzZSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCAtIDFcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgMCkge1xuICAgIGlmIChkaXIpIGJ5dGVPZmZzZXQgPSAwXG4gICAgZWxzZSByZXR1cm4gLTFcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSB2YWxcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsID0gQnVmZmVyLmZyb20odmFsLCBlbmNvZGluZylcbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNlYXJjaCBlaXRoZXIgaW5kZXhPZiAoaWYgZGlyIGlzIHRydWUpIG9yIGxhc3RJbmRleE9mXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsKSkge1xuICAgIC8vIFNwZWNpYWwgY2FzZTogbG9va2luZyBmb3IgZW1wdHkgc3RyaW5nL2J1ZmZlciBhbHdheXMgZmFpbHNcbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAweEZGIC8vIFNlYXJjaCBmb3IgYSBieXRlIHZhbHVlIFswLTI1NV1cbiAgICBpZiAodHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmIChkaXIpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgWyB2YWwgXSwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfVxuXG4gIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlcicpXG59XG5cbmZ1bmN0aW9uIGFycmF5SW5kZXhPZiAoYXJyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgdmFyIGluZGV4U2l6ZSA9IDFcbiAgdmFyIGFyckxlbmd0aCA9IGFyci5sZW5ndGhcbiAgdmFyIHZhbExlbmd0aCA9IHZhbC5sZW5ndGhcblxuICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIGVuY29kaW5nID0gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgaWYgKGVuY29kaW5nID09PSAndWNzMicgfHwgZW5jb2RpbmcgPT09ICd1Y3MtMicgfHxcbiAgICAgICAgZW5jb2RpbmcgPT09ICd1dGYxNmxlJyB8fCBlbmNvZGluZyA9PT0gJ3V0Zi0xNmxlJykge1xuICAgICAgaWYgKGFyci5sZW5ndGggPCAyIHx8IHZhbC5sZW5ndGggPCAyKSB7XG4gICAgICAgIHJldHVybiAtMVxuICAgICAgfVxuICAgICAgaW5kZXhTaXplID0gMlxuICAgICAgYXJyTGVuZ3RoIC89IDJcbiAgICAgIHZhbExlbmd0aCAvPSAyXG4gICAgICBieXRlT2Zmc2V0IC89IDJcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZWFkIChidWYsIGkpIHtcbiAgICBpZiAoaW5kZXhTaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gYnVmW2ldXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBidWYucmVhZFVJbnQxNkJFKGkgKiBpbmRleFNpemUpXG4gICAgfVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGRpcikge1xuICAgIHZhciBmb3VuZEluZGV4ID0gLTFcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpIDwgYXJyTGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChyZWFkKGFyciwgaSkgPT09IHJlYWQodmFsLCBmb3VuZEluZGV4ID09PSAtMSA/IDAgOiBpIC0gZm91bmRJbmRleCkpIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IC0xKSBmb3VuZEluZGV4ID0gaVxuICAgICAgICBpZiAoaSAtIGZvdW5kSW5kZXggKyAxID09PSB2YWxMZW5ndGgpIHJldHVybiBmb3VuZEluZGV4ICogaW5kZXhTaXplXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZm91bmRJbmRleCAhPT0gLTEpIGkgLT0gaSAtIGZvdW5kSW5kZXhcbiAgICAgICAgZm91bmRJbmRleCA9IC0xXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChieXRlT2Zmc2V0ICsgdmFsTGVuZ3RoID4gYXJyTGVuZ3RoKSBieXRlT2Zmc2V0ID0gYXJyTGVuZ3RoIC0gdmFsTGVuZ3RoXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciBmb3VuZCA9IHRydWVcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdmFsTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKHJlYWQoYXJyLCBpICsgaikgIT09IHJlYWQodmFsLCBqKSkge1xuICAgICAgICAgIGZvdW5kID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbiBpbmNsdWRlcyAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gdGhpcy5pbmRleE9mKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpICE9PSAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCB0cnVlKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24gbGFzdEluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGZhbHNlKVxufVxuXG5mdW5jdGlvbiBoZXhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIG9mZnNldCA9IE51bWJlcihvZmZzZXQpIHx8IDBcbiAgdmFyIHJlbWFpbmluZyA9IGJ1Zi5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKCFsZW5ndGgpIHtcbiAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPSBOdW1iZXIobGVuZ3RoKVxuICAgIGlmIChsZW5ndGggPiByZW1haW5pbmcpIHtcbiAgICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICAgIH1cbiAgfVxuXG4gIHZhciBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKG51bWJlcklzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgICAgOiAoZmlyc3RCeXRlID4gMHhCRikgPyAyXG4gICAgICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgKGJ5dGVzW2kgKyAxXSAqIDI1NikpXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24gc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgdmFyIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgbmV3QnVmLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludExFID0gZnVuY3Rpb24gcmVhZEludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICBpZiAoISh0aGlzW29mZnNldF0gJiAweDgwKSkgcmV0dXJuICh0aGlzW29mZnNldF0pXG4gIHJldHVybiAoKDB4ZmYgLSB0aGlzW29mZnNldF0gKyAxKSAqIC0xKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkxFID0gZnVuY3Rpb24gcmVhZEludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdKSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10gPDwgMjQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDMyQkUgPSBmdW5jdGlvbiByZWFkSW50MzJCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVMRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBtYXhCeXRlcyA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKSAtIDFcbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBtYXhCeXRlcywgMClcbiAgfVxuXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB0aGlzW29mZnNldCArIGldID0gKHZhbHVlIC8gbXVsKSAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHhmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbGltaXQgPSBNYXRoLnBvdygyLCAoOCAqIGJ5dGVMZW5ndGgpIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgOCwgMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgsIC0xLjc5NzY5MzEzNDg2MjMxNTdFKzMwOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCA1MiwgOClcbiAgcmV0dXJuIG9mZnNldCArIDhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlQkUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG4vLyBjb3B5KHRhcmdldEJ1ZmZlciwgdGFyZ2V0U3RhcnQ9MCwgc291cmNlU3RhcnQ9MCwgc291cmNlRW5kPWJ1ZmZlci5sZW5ndGgpXG5CdWZmZXIucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5ICh0YXJnZXQsIHRhcmdldFN0YXJ0LCBzdGFydCwgZW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHNob3VsZCBiZSBhIEJ1ZmZlcicpXG4gIGlmICghc3RhcnQpIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCAmJiBlbmQgIT09IDApIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXRTdGFydCA+PSB0YXJnZXQubGVuZ3RoKSB0YXJnZXRTdGFydCA9IHRhcmdldC5sZW5ndGhcbiAgaWYgKCF0YXJnZXRTdGFydCkgdGFyZ2V0U3RhcnQgPSAwXG4gIGlmIChlbmQgPiAwICYmIGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIC8vIENvcHkgMCBieXRlczsgd2UncmUgZG9uZVxuICBpZiAoZW5kID09PSBzdGFydCkgcmV0dXJuIDBcbiAgaWYgKHRhcmdldC5sZW5ndGggPT09IDAgfHwgdGhpcy5sZW5ndGggPT09IDApIHJldHVybiAwXG5cbiAgLy8gRmF0YWwgZXJyb3IgY29uZGl0aW9uc1xuICBpZiAodGFyZ2V0U3RhcnQgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3RhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICB9XG4gIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVXNlIGJ1aWx0LWluIHdoZW4gYXZhaWxhYmxlLCBtaXNzaW5nIGZyb20gSUUxMVxuICAgIHRoaXMuY29weVdpdGhpbih0YXJnZXRTdGFydCwgc3RhcnQsIGVuZClcbiAgfSBlbHNlIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAodmFyIGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICB0YXJnZXQsXG4gICAgICB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKChlbmNvZGluZyA9PT0gJ3V0ZjgnICYmIGNvZGUgPCAxMjgpIHx8XG4gICAgICAgICAgZW5jb2RpbmcgPT09ICdsYXRpbjEnKSB7XG4gICAgICAgIC8vIEZhc3QgcGF0aDogSWYgYHZhbGAgZml0cyBpbnRvIGEgc2luZ2xlIGJ5dGUsIHVzZSB0aGF0IG51bWVyaWMgdmFsdWUuXG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICAgIHZhciBsZW4gPSBieXRlcy5sZW5ndGhcbiAgICBpZiAobGVuID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgXCInICsgdmFsICtcbiAgICAgICAgJ1wiIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50IFwidmFsdWVcIicpXG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teKy8wLTlBLVphLXotX10vZ1xuXG5mdW5jdGlvbiBiYXNlNjRjbGVhbiAoc3RyKSB7XG4gIC8vIE5vZGUgdGFrZXMgZXF1YWwgc2lnbnMgYXMgZW5kIG9mIHRoZSBCYXNlNjQgZW5jb2RpbmdcbiAgc3RyID0gc3RyLnNwbGl0KCc9JylbMF1cbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0ci50cmltKCkucmVwbGFjZShJTlZBTElEX0JBU0U2NF9SRSwgJycpXG4gIC8vIE5vZGUgY29udmVydHMgc3RyaW5ncyB3aXRoIGxlbmd0aCA8IDIgdG8gJydcbiAgaWYgKHN0ci5sZW5ndGggPCAyKSByZXR1cm4gJydcbiAgLy8gTm9kZSBhbGxvd3MgZm9yIG5vbi1wYWRkZWQgYmFzZTY0IHN0cmluZ3MgKG1pc3NpbmcgdHJhaWxpbmcgPT09KSwgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHdoaWxlIChzdHIubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgIHN0ciA9IHN0ciArICc9J1xuICB9XG4gIHJldHVybiBzdHJcbn1cblxuZnVuY3Rpb24gdG9IZXggKG4pIHtcbiAgaWYgKG4gPCAxNikgcmV0dXJuICcwJyArIG4udG9TdHJpbmcoMTYpXG4gIHJldHVybiBuLnRvU3RyaW5nKDE2KVxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIHZhciBjb2RlUG9pbnRcbiAgdmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGhcbiAgdmFyIGxlYWRTdXJyb2dhdGUgPSBudWxsXG4gIHZhciBieXRlcyA9IFtdXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGNvZGVQb2ludCA9IHN0cmluZy5jaGFyQ29kZUF0KGkpXG5cbiAgICAvLyBpcyBzdXJyb2dhdGUgY29tcG9uZW50XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4RDdGRiAmJiBjb2RlUG9pbnQgPCAweEUwMDApIHtcbiAgICAgIC8vIGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoIWxlYWRTdXJyb2dhdGUpIHtcbiAgICAgICAgLy8gbm8gbGVhZCB5ZXRcbiAgICAgICAgaWYgKGNvZGVQb2ludCA+IDB4REJGRikge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgdHJhaWxcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9IGVsc2UgaWYgKGkgKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICAvLyB1bnBhaXJlZCBsZWFkXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHZhbGlkIGxlYWRcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIDIgbGVhZHMgaW4gYSByb3dcbiAgICAgIGlmIChjb2RlUG9pbnQgPCAweERDMDApIHtcbiAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gdmFsaWQgc3Vycm9nYXRlIHBhaXJcbiAgICAgIGNvZGVQb2ludCA9IChsZWFkU3Vycm9nYXRlIC0gMHhEODAwIDw8IDEwIHwgY29kZVBvaW50IC0gMHhEQzAwKSArIDB4MTAwMDBcbiAgICB9IGVsc2UgaWYgKGxlYWRTdXJyb2dhdGUpIHtcbiAgICAgIC8vIHZhbGlkIGJtcCBjaGFyLCBidXQgbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgIH1cblxuICAgIGxlYWRTdXJyb2dhdGUgPSBudWxsXG5cbiAgICAvLyBlbmNvZGUgdXRmOFxuICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDEpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goY29kZVBvaW50KVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHg4MDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiB8IDB4QzAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDMpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgfCAweEUwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDExMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSA0KSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHgxMiB8IDB4RjAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweEMgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY29kZSBwb2ludCcpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVzXG59XG5cbmZ1bmN0aW9uIGFzY2lpVG9CeXRlcyAoc3RyKSB7XG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIHZhciBjLCBoaSwgbG9cbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG5cbiAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSlcbiAgICBoaSA9IGMgPj4gOFxuICAgIGxvID0gYyAlIDI1NlxuICAgIGJ5dGVBcnJheS5wdXNoKGxvKVxuICAgIGJ5dGVBcnJheS5wdXNoKGhpKVxuICB9XG5cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiBiYXNlNjRUb0J5dGVzIChzdHIpIHtcbiAgcmV0dXJuIGJhc2U2NC50b0J5dGVBcnJheShiYXNlNjRjbGVhbihzdHIpKVxufVxuXG5mdW5jdGlvbiBibGl0QnVmZmVyIChzcmMsIGRzdCwgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIGlmICgoaSArIG9mZnNldCA+PSBkc3QubGVuZ3RoKSB8fCAoaSA+PSBzcmMubGVuZ3RoKSkgYnJlYWtcbiAgICBkc3RbaSArIG9mZnNldF0gPSBzcmNbaV1cbiAgfVxuICByZXR1cm4gaVxufVxuXG4vLyBBcnJheUJ1ZmZlciBvciBVaW50OEFycmF5IG9iamVjdHMgZnJvbSBvdGhlciBjb250ZXh0cyAoaS5lLiBpZnJhbWVzKSBkbyBub3QgcGFzc1xuLy8gdGhlIGBpbnN0YW5jZW9mYCBjaGVjayBidXQgdGhleSBzaG91bGQgYmUgdHJlYXRlZCBhcyBvZiB0aGF0IHR5cGUuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNjZcbmZ1bmN0aW9uIGlzSW5zdGFuY2UgKG9iaiwgdHlwZSkge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgdHlwZSB8fFxuICAgIChvYmogIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IgIT0gbnVsbCAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPSBudWxsICYmXG4gICAgICBvYmouY29uc3RydWN0b3IubmFtZSA9PT0gdHlwZS5uYW1lKVxufVxuZnVuY3Rpb24gbnVtYmVySXNOYU4gKG9iaikge1xuICAvLyBGb3IgSUUxMSBzdXBwb3J0XG4gIHJldHVybiBvYmogIT09IG9iaiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtY29tcGFyZVxufVxuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcbiAgICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBmYWN0b3J5KGdsb2JhbC5jb21wYXJlVmVyc2lvbnMgPSB7fSkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAgIGNvbnN0IHNlbXZlciA9IC9eW3Zefjw+PV0qPyhcXGQrKSg/OlxcLihbeCpdfFxcZCspKD86XFwuKFt4Kl18XFxkKykoPzpcXC4oW3gqXXxcXGQrKSk/KD86LShbXFxkYS16XFwtXSsoPzpcXC5bXFxkYS16XFwtXSspKikpPyg/OlxcK1tcXGRhLXpcXC1dKyg/OlxcLltcXGRhLXpcXC1dKykqKT8pPyk/JC9pO1xuICAgIGNvbnN0IHZhbGlkYXRlQW5kUGFyc2UgPSAodmVyc2lvbikgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IGV4cGVjdGVkIHN0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1hdGNoID0gdmVyc2lvbi5tYXRjaChzZW12ZXIpO1xuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYXJndW1lbnQgbm90IHZhbGlkIHNlbXZlciAoJyR7dmVyc2lvbn0nIHJlY2VpdmVkKWApO1xuICAgICAgICB9XG4gICAgICAgIG1hdGNoLnNoaWZ0KCk7XG4gICAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9O1xuICAgIGNvbnN0IGlzV2lsZGNhcmQgPSAocykgPT4gcyA9PT0gJyonIHx8IHMgPT09ICd4JyB8fCBzID09PSAnWCc7XG4gICAgY29uc3QgdHJ5UGFyc2UgPSAodikgPT4ge1xuICAgICAgICBjb25zdCBuID0gcGFyc2VJbnQodiwgMTApO1xuICAgICAgICByZXR1cm4gaXNOYU4obikgPyB2IDogbjtcbiAgICB9O1xuICAgIGNvbnN0IGZvcmNlVHlwZSA9IChhLCBiKSA9PiB0eXBlb2YgYSAhPT0gdHlwZW9mIGIgPyBbU3RyaW5nKGEpLCBTdHJpbmcoYildIDogW2EsIGJdO1xuICAgIGNvbnN0IGNvbXBhcmVTdHJpbmdzID0gKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGlzV2lsZGNhcmQoYSkgfHwgaXNXaWxkY2FyZChiKSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICBjb25zdCBbYXAsIGJwXSA9IGZvcmNlVHlwZSh0cnlQYXJzZShhKSwgdHJ5UGFyc2UoYikpO1xuICAgICAgICBpZiAoYXAgPiBicClcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICBpZiAoYXAgPCBicClcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfTtcbiAgICBjb25zdCBjb21wYXJlU2VnbWVudHMgPSAoYSwgYikgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWF4KGEubGVuZ3RoLCBiLmxlbmd0aCk7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgciA9IGNvbXBhcmVTdHJpbmdzKGFbaV0gfHwgJzAnLCBiW2ldIHx8ICcwJyk7XG4gICAgICAgICAgICBpZiAociAhPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZSBbc2VtdmVyXShodHRwczovL3NlbXZlci5vcmcvKSB2ZXJzaW9uIHN0cmluZ3MgdG8gZmluZCBncmVhdGVyLCBlcXVhbCBvciBsZXNzZXIuXG4gICAgICogVGhpcyBsaWJyYXJ5IHN1cHBvcnRzIHRoZSBmdWxsIHNlbXZlciBzcGVjaWZpY2F0aW9uLCBpbmNsdWRpbmcgY29tcGFyaW5nIHZlcnNpb25zIHdpdGggZGlmZmVyZW50IG51bWJlciBvZiBkaWdpdHMgbGlrZSBgMS4wLjBgLCBgMS4wYCwgYDFgLCBhbmQgcHJlLXJlbGVhc2UgdmVyc2lvbnMgbGlrZSBgMS4wLjAtYWxwaGFgLlxuICAgICAqIEBwYXJhbSB2MSAtIEZpcnN0IHZlcnNpb24gdG8gY29tcGFyZVxuICAgICAqIEBwYXJhbSB2MiAtIFNlY29uZCB2ZXJzaW9uIHRvIGNvbXBhcmVcbiAgICAgKiBAcmV0dXJucyBOdW1lcmljIHZhbHVlIGNvbXBhdGlibGUgd2l0aCB0aGUgW0FycmF5LnNvcnQoZm4pIGludGVyZmFjZV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvc29ydCNQYXJhbWV0ZXJzKS5cbiAgICAgKi9cbiAgICBjb25zdCBjb21wYXJlVmVyc2lvbnMgPSAodjEsIHYyKSA9PiB7XG4gICAgICAgIC8vIHZhbGlkYXRlIGlucHV0IGFuZCBzcGxpdCBpbnRvIHNlZ21lbnRzXG4gICAgICAgIGNvbnN0IG4xID0gdmFsaWRhdGVBbmRQYXJzZSh2MSk7XG4gICAgICAgIGNvbnN0IG4yID0gdmFsaWRhdGVBbmRQYXJzZSh2Mik7XG4gICAgICAgIC8vIHBvcCBvZmYgdGhlIHBhdGNoXG4gICAgICAgIGNvbnN0IHAxID0gbjEucG9wKCk7XG4gICAgICAgIGNvbnN0IHAyID0gbjIucG9wKCk7XG4gICAgICAgIC8vIHZhbGlkYXRlIG51bWJlcnNcbiAgICAgICAgY29uc3QgciA9IGNvbXBhcmVTZWdtZW50cyhuMSwgbjIpO1xuICAgICAgICBpZiAociAhPT0gMClcbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAvLyB2YWxpZGF0ZSBwcmUtcmVsZWFzZVxuICAgICAgICBpZiAocDEgJiYgcDIpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wYXJlU2VnbWVudHMocDEuc3BsaXQoJy4nKSwgcDIuc3BsaXQoJy4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocDEgfHwgcDIpIHtcbiAgICAgICAgICAgIHJldHVybiBwMSA/IC0xIDogMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZSBbc2VtdmVyXShodHRwczovL3NlbXZlci5vcmcvKSB2ZXJzaW9uIHN0cmluZ3MgdXNpbmcgdGhlIHNwZWNpZmllZCBvcGVyYXRvci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2MSBGaXJzdCB2ZXJzaW9uIHRvIGNvbXBhcmVcbiAgICAgKiBAcGFyYW0gdjIgU2Vjb25kIHZlcnNpb24gdG8gY29tcGFyZVxuICAgICAqIEBwYXJhbSBvcGVyYXRvciBBbGxvd2VkIGFyaXRobWV0aWMgb3BlcmF0b3IgdG8gdXNlXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBjb21wYXJpc29uIGJldHdlZW4gdGhlIGZpcnN0VmVyc2lvbiBhbmQgdGhlIHNlY29uZFZlcnNpb24gc2F0aXNmaWVzIHRoZSBvcGVyYXRvciwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIGNvbXBhcmUoJzEwLjEuOCcsICcxMC4wLjQnLCAnPicpOyAvLyByZXR1cm4gdHJ1ZVxuICAgICAqIGNvbXBhcmUoJzEwLjAuMScsICcxMC4wLjEnLCAnPScpOyAvLyByZXR1cm4gdHJ1ZVxuICAgICAqIGNvbXBhcmUoJzEwLjEuMScsICcxMC4yLjInLCAnPCcpOyAvLyByZXR1cm4gdHJ1ZVxuICAgICAqIGNvbXBhcmUoJzEwLjEuMScsICcxMC4yLjInLCAnPD0nKTsgLy8gcmV0dXJuIHRydWVcbiAgICAgKiBjb21wYXJlKCcxMC4xLjEnLCAnMTAuMi4yJywgJz49Jyk7IC8vIHJldHVybiBmYWxzZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbnN0IGNvbXBhcmUgPSAodjEsIHYyLCBvcGVyYXRvcikgPT4ge1xuICAgICAgICAvLyB2YWxpZGF0ZSBpbnB1dCBvcGVyYXRvclxuICAgICAgICBhc3NlcnRWYWxpZE9wZXJhdG9yKG9wZXJhdG9yKTtcbiAgICAgICAgLy8gc2luY2UgcmVzdWx0IG9mIGNvbXBhcmVWZXJzaW9ucyBjYW4gb25seSBiZSAtMSBvciAwIG9yIDFcbiAgICAgICAgLy8gYSBzaW1wbGUgbWFwIGNhbiBiZSB1c2VkIHRvIHJlcGxhY2Ugc3dpdGNoXG4gICAgICAgIGNvbnN0IHJlcyA9IGNvbXBhcmVWZXJzaW9ucyh2MSwgdjIpO1xuICAgICAgICByZXR1cm4gb3BlcmF0b3JSZXNNYXBbb3BlcmF0b3JdLmluY2x1ZGVzKHJlcyk7XG4gICAgfTtcbiAgICBjb25zdCBvcGVyYXRvclJlc01hcCA9IHtcbiAgICAgICAgJz4nOiBbMV0sXG4gICAgICAgICc+PSc6IFswLCAxXSxcbiAgICAgICAgJz0nOiBbMF0sXG4gICAgICAgICc8PSc6IFstMSwgMF0sXG4gICAgICAgICc8JzogWy0xXSxcbiAgICAgICAgJyE9JzogWy0xLCAxXSxcbiAgICB9O1xuICAgIGNvbnN0IGFsbG93ZWRPcGVyYXRvcnMgPSBPYmplY3Qua2V5cyhvcGVyYXRvclJlc01hcCk7XG4gICAgY29uc3QgYXNzZXJ0VmFsaWRPcGVyYXRvciA9IChvcCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIG9wICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBvcGVyYXRvciB0eXBlLCBleHBlY3RlZCBzdHJpbmcgYnV0IGdvdCAke3R5cGVvZiBvcH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxsb3dlZE9wZXJhdG9ycy5pbmRleE9mKG9wKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvcGVyYXRvciwgZXhwZWN0ZWQgb25lIG9mICR7YWxsb3dlZE9wZXJhdG9ycy5qb2luKCd8Jyl9YCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTWF0Y2ggW25wbSBzZW12ZXJdKGh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3Y2L3VzaW5nLW5wbS9zZW12ZXIpIHZlcnNpb24gcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBWZXJzaW9uIG51bWJlciB0byBtYXRjaFxuICAgICAqIEBwYXJhbSByYW5nZSBSYW5nZSBwYXR0ZXJuIGZvciB2ZXJzaW9uXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2ZXJzaW9uIG51bWJlciBpcyB3aXRoaW4gdGhlIHJhbmdlLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogc2F0aXNmaWVzKCcxLjEuMCcsICdeMS4wLjAnKTsgLy8gcmV0dXJuIHRydWVcbiAgICAgKiBzYXRpc2ZpZXMoJzEuMS4wJywgJ34xLjAuMCcpOyAvLyByZXR1cm4gZmFsc2VcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb25zdCBzYXRpc2ZpZXMgPSAodmVyc2lvbiwgcmFuZ2UpID0+IHtcbiAgICAgICAgLy8gY2xlYW4gaW5wdXRcbiAgICAgICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKC8oWz48PV0rKVxccysvZywgJyQxJyk7XG4gICAgICAgIC8vIGhhbmRsZSBtdWx0aXBsZSBjb21wYXJhdG9yc1xuICAgICAgICBpZiAocmFuZ2UuaW5jbHVkZXMoJ3x8JykpIHtcbiAgICAgICAgICAgIHJldHVybiByYW5nZS5zcGxpdCgnfHwnKS5zb21lKChyKSA9PiBzYXRpc2ZpZXModmVyc2lvbiwgcikpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJhbmdlLmluY2x1ZGVzKCcgLSAnKSkge1xuICAgICAgICAgICAgY29uc3QgW2EsIGJdID0gcmFuZ2Uuc3BsaXQoJyAtICcsIDIpO1xuICAgICAgICAgICAgcmV0dXJuIHNhdGlzZmllcyh2ZXJzaW9uLCBgPj0ke2F9IDw9JHtifWApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJhbmdlLmluY2x1ZGVzKCcgJykpIHtcbiAgICAgICAgICAgIHJldHVybiByYW5nZVxuICAgICAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxzezIsfS9nLCAnICcpXG4gICAgICAgICAgICAgICAgLnNwbGl0KCcgJylcbiAgICAgICAgICAgICAgICAuZXZlcnkoKHIpID0+IHNhdGlzZmllcyh2ZXJzaW9uLCByKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgbm8gcmFuZ2Ugb3BlcmF0b3IgdGhlbiBcIj1cIlxuICAgICAgICBjb25zdCBtID0gcmFuZ2UubWF0Y2goL14oWzw+PX5eXSspLyk7XG4gICAgICAgIGNvbnN0IG9wID0gbSA/IG1bMV0gOiAnPSc7XG4gICAgICAgIC8vIGlmIGd0L2x0L2VxIHRoZW4gb3BlcmF0b3IgY29tcGFyZVxuICAgICAgICBpZiAob3AgIT09ICdeJyAmJiBvcCAhPT0gJ34nKVxuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmUodmVyc2lvbiwgcmFuZ2UsIG9wKTtcbiAgICAgICAgLy8gZWxzZSByYW5nZSBvZiBlaXRoZXIgXCJ+XCIgb3IgXCJeXCIgaXMgYXNzdW1lZFxuICAgICAgICBjb25zdCBbdjEsIHYyLCB2MywgLCB2cF0gPSB2YWxpZGF0ZUFuZFBhcnNlKHZlcnNpb24pO1xuICAgICAgICBjb25zdCBbcjEsIHIyLCByMywgLCBycF0gPSB2YWxpZGF0ZUFuZFBhcnNlKHJhbmdlKTtcbiAgICAgICAgY29uc3QgdiA9IFt2MSwgdjIsIHYzXTtcbiAgICAgICAgY29uc3QgciA9IFtyMSwgcjIgIT09IG51bGwgJiYgcjIgIT09IHZvaWQgMCA/IHIyIDogJ3gnLCByMyAhPT0gbnVsbCAmJiByMyAhPT0gdm9pZCAwID8gcjMgOiAneCddO1xuICAgICAgICAvLyB2YWxpZGF0ZSBwcmUtcmVsZWFzZVxuICAgICAgICBpZiAocnApIHtcbiAgICAgICAgICAgIGlmICghdnApXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKGNvbXBhcmVTZWdtZW50cyh2LCByKSAhPT0gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoY29tcGFyZVNlZ21lbnRzKHZwLnNwbGl0KCcuJyksIHJwLnNwbGl0KCcuJykpID09PSAtMSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZmlyc3Qgbm9uLXplcm8gbnVtYmVyXG4gICAgICAgIGNvbnN0IG5vblplcm8gPSByLmZpbmRJbmRleCgodikgPT4gdiAhPT0gJzAnKSArIDE7XG4gICAgICAgIC8vIHBvaW50ZXIgdG8gd2hlcmUgc2VnbWVudHMgY2FuIGJlID49XG4gICAgICAgIGNvbnN0IGkgPSBvcCA9PT0gJ34nID8gMiA6IG5vblplcm8gPiAxID8gbm9uWmVybyA6IDE7XG4gICAgICAgIC8vIGJlZm9yZSBwb2ludGVyIG11c3QgYmUgZXF1YWxcbiAgICAgICAgaWYgKGNvbXBhcmVTZWdtZW50cyh2LnNsaWNlKDAsIGkpLCByLnNsaWNlKDAsIGkpKSAhPT0gMClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gYWZ0ZXIgcG9pbnRlciBtdXN0IGJlID49XG4gICAgICAgIGlmIChjb21wYXJlU2VnbWVudHModi5zbGljZShpKSwgci5zbGljZShpKSkgPT09IC0xKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgW3NlbXZlcl0oaHR0cHM6Ly9zZW12ZXIub3JnLykgdmVyc2lvbiBzdHJpbmdzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZlcnNpb24gVmVyc2lvbiBudW1iZXIgdG8gdmFsaWRhdGVcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZlcnNpb24gbnVtYmVyIGlzIGEgdmFsaWQgc2VtdmVyIHZlcnNpb24gbnVtYmVyLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogdmFsaWRhdGUoJzEuMC4wLXJjLjEnKTsgLy8gcmV0dXJuIHRydWVcbiAgICAgKiB2YWxpZGF0ZSgnMS4wLXJjLjEnKTsgLy8gcmV0dXJuIGZhbHNlXG4gICAgICogdmFsaWRhdGUoJ2ZvbycpOyAvLyByZXR1cm4gZmFsc2VcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBjb25zdCB2YWxpZGF0ZSA9ICh2ZXJzaW9uKSA9PiB0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycgJiYgL15bdlxcZF0vLnRlc3QodmVyc2lvbikgJiYgc2VtdmVyLnRlc3QodmVyc2lvbik7XG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgW3NlbXZlcl0oaHR0cHM6Ly9zZW12ZXIub3JnLykgdmVyc2lvbiBzdHJpbmdzIHN0cmljdGx5LiBXaWxsIG5vdCBhY2NlcHQgd2lsZGNhcmRzIGFuZCB2ZXJzaW9uIHJhbmdlcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFZlcnNpb24gbnVtYmVyIHRvIHZhbGlkYXRlXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2ZXJzaW9uIG51bWJlciBpcyBhIHZhbGlkIHNlbXZlciB2ZXJzaW9uIG51bWJlciBgZmFsc2VgIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiB2YWxpZGF0ZSgnMS4wLjAtcmMuMScpOyAvLyByZXR1cm4gdHJ1ZVxuICAgICAqIHZhbGlkYXRlKCcxLjAtcmMuMScpOyAvLyByZXR1cm4gZmFsc2VcbiAgICAgKiB2YWxpZGF0ZSgnZm9vJyk7IC8vIHJldHVybiBmYWxzZVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGNvbnN0IHZhbGlkYXRlU3RyaWN0ID0gKHZlcnNpb24pID0+IHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAvXigwfFsxLTldXFxkKilcXC4oMHxbMS05XVxcZCopXFwuKDB8WzEtOV1cXGQqKSg/Oi0oKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKD86XFwuKD86MHxbMS05XVxcZCp8XFxkKlthLXpBLVotXVswLTlhLXpBLVotXSopKSopKT8oPzpcXCsoWzAtOWEtekEtWi1dKyg/OlxcLlswLTlhLXpBLVotXSspKikpPyQvLnRlc3QodmVyc2lvbik7XG5cbiAgICBleHBvcnRzLmNvbXBhcmUgPSBjb21wYXJlO1xuICAgIGV4cG9ydHMuY29tcGFyZVZlcnNpb25zID0gY29tcGFyZVZlcnNpb25zO1xuICAgIGV4cG9ydHMuc2F0aXNmaWVzID0gc2F0aXNmaWVzO1xuICAgIGV4cG9ydHMudmFsaWRhdGUgPSB2YWxpZGF0ZTtcbiAgICBleHBvcnRzLnZhbGlkYXRlU3RyaWN0ID0gdmFsaWRhdGVTdHJpY3Q7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcFxuIiwiLyohXG4gKiAgaG93bGVyLmpzIHYyLjIuMVxuICogIGhvd2xlcmpzLmNvbVxuICpcbiAqICAoYykgMjAxMy0yMDIwLCBKYW1lcyBTaW1wc29uIG9mIEdvbGRGaXJlIFN0dWRpb3NcbiAqICBnb2xkZmlyZXN0dWRpb3MuY29tXG4gKlxuICogIE1JVCBMaWNlbnNlXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuXG4gICd1c2Ugc3RyaWN0JztcblxuICAvKiogR2xvYmFsIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgZ2xvYmFsIGNvbnRyb2xsZXIuIEFsbCBjb250YWluZWQgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBhcHBseVxuICAgKiB0byBhbGwgc291bmRzIHRoYXQgYXJlIGN1cnJlbnRseSBwbGF5aW5nIG9yIHdpbGwgYmUgaW4gdGhlIGZ1dHVyZS5cbiAgICovXG4gIHZhciBIb3dsZXJHbG9iYWwgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmluaXQoKTtcbiAgfTtcbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIHRoZSBnbG9iYWwgSG93bGVyIG9iamVjdC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgaW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBDcmVhdGUgYSBnbG9iYWwgSUQgY291bnRlci5cbiAgICAgIHNlbGYuX2NvdW50ZXIgPSAxMDAwO1xuXG4gICAgICAvLyBQb29sIG9mIHVubG9ja2VkIEhUTUw1IEF1ZGlvIG9iamVjdHMuXG4gICAgICBzZWxmLl9odG1sNUF1ZGlvUG9vbCA9IFtdO1xuICAgICAgc2VsZi5odG1sNVBvb2xTaXplID0gMTA7XG5cbiAgICAgIC8vIEludGVybmFsIHByb3BlcnRpZXMuXG4gICAgICBzZWxmLl9jb2RlY3MgPSB7fTtcbiAgICAgIHNlbGYuX2hvd2xzID0gW107XG4gICAgICBzZWxmLl9tdXRlZCA9IGZhbHNlO1xuICAgICAgc2VsZi5fdm9sdW1lID0gMTtcbiAgICAgIHNlbGYuX2NhblBsYXlFdmVudCA9ICdjYW5wbGF5dGhyb3VnaCc7XG4gICAgICBzZWxmLl9uYXZpZ2F0b3IgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lm5hdmlnYXRvcikgPyB3aW5kb3cubmF2aWdhdG9yIDogbnVsbDtcblxuICAgICAgLy8gUHVibGljIHByb3BlcnRpZXMuXG4gICAgICBzZWxmLm1hc3RlckdhaW4gPSBudWxsO1xuICAgICAgc2VsZi5ub0F1ZGlvID0gZmFsc2U7XG4gICAgICBzZWxmLnVzaW5nV2ViQXVkaW8gPSB0cnVlO1xuICAgICAgc2VsZi5hdXRvU3VzcGVuZCA9IHRydWU7XG4gICAgICBzZWxmLmN0eCA9IG51bGw7XG5cbiAgICAgIC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHRoZSBhdXRvIGF1ZGlvIHVubG9ja2VyLlxuICAgICAgc2VsZi5hdXRvVW5sb2NrID0gdHJ1ZTtcblxuICAgICAgLy8gU2V0dXAgdGhlIHZhcmlvdXMgc3RhdGUgdmFsdWVzIGZvciBnbG9iYWwgdHJhY2tpbmcuXG4gICAgICBzZWxmLl9zZXR1cCgpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgZ2xvYmFsIHZvbHVtZSBmb3IgYWxsIHNvdW5kcy5cbiAgICAgKiBAcGFyYW0gIHtGbG9hdH0gdm9sIFZvbHVtZSBmcm9tIDAuMCB0byAxLjAuXG4gICAgICogQHJldHVybiB7SG93bGVyL0Zsb2F0fSAgICAgUmV0dXJucyBzZWxmIG9yIGN1cnJlbnQgdm9sdW1lLlxuICAgICAqL1xuICAgIHZvbHVtZTogZnVuY3Rpb24odm9sKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuICAgICAgdm9sID0gcGFyc2VGbG9hdCh2b2wpO1xuXG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIEF1ZGlvQ29udGV4dCBjcmVhdGVkIHlldCwgcnVuIHRoZSBzZXR1cC5cbiAgICAgIGlmICghc2VsZi5jdHgpIHtcbiAgICAgICAgc2V0dXBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2b2wgIT09ICd1bmRlZmluZWQnICYmIHZvbCA+PSAwICYmIHZvbCA8PSAxKSB7XG4gICAgICAgIHNlbGYuX3ZvbHVtZSA9IHZvbDtcblxuICAgICAgICAvLyBEb24ndCB1cGRhdGUgYW55IG9mIHRoZSBub2RlcyBpZiB3ZSBhcmUgbXV0ZWQuXG4gICAgICAgIGlmIChzZWxmLl9tdXRlZCkge1xuICAgICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiB1c2luZyBXZWIgQXVkaW8sIHdlIGp1c3QgbmVlZCB0byBhZGp1c3QgdGhlIG1hc3RlciBnYWluLlxuICAgICAgICBpZiAoc2VsZi51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICAgICAgc2VsZi5tYXN0ZXJHYWluLmdhaW4uc2V0VmFsdWVBdFRpbWUodm9sLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbmQgY2hhbmdlIHZvbHVtZSBmb3IgYWxsIEhUTUw1IGF1ZGlvIG5vZGVzLlxuICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIXNlbGYuX2hvd2xzW2ldLl93ZWJBdWRpbykge1xuICAgICAgICAgICAgLy8gR2V0IGFsbCBvZiB0aGUgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICAgICAgICAgIHZhciBpZHMgPSBzZWxmLl9ob3dsc1tpXS5fZ2V0U291bmRJZHMoKTtcblxuICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBzb3VuZHMgYW5kIGNoYW5nZSB0aGUgdm9sdW1lcy5cbiAgICAgICAgICAgIGZvciAodmFyIGo9MDsgajxpZHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5faG93bHNbaV0uX3NvdW5kQnlJZChpZHNbal0pO1xuXG4gICAgICAgICAgICAgIGlmIChzb3VuZCAmJiBzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgICAgIHNvdW5kLl9ub2RlLnZvbHVtZSA9IHNvdW5kLl92b2x1bWUgKiB2b2w7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGYuX3ZvbHVtZTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIG11dGluZyBhbmQgdW5tdXRpbmcgZ2xvYmFsbHkuXG4gICAgICogQHBhcmFtICB7Qm9vbGVhbn0gbXV0ZWQgSXMgbXV0ZWQgb3Igbm90LlxuICAgICAqL1xuICAgIG11dGU6IGZ1bmN0aW9uKG11dGVkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGFuIEF1ZGlvQ29udGV4dCBjcmVhdGVkIHlldCwgcnVuIHRoZSBzZXR1cC5cbiAgICAgIGlmICghc2VsZi5jdHgpIHtcbiAgICAgICAgc2V0dXBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgc2VsZi5fbXV0ZWQgPSBtdXRlZDtcblxuICAgICAgLy8gV2l0aCBXZWIgQXVkaW8sIHdlIGp1c3QgbmVlZCB0byBtdXRlIHRoZSBtYXN0ZXIgZ2Fpbi5cbiAgICAgIGlmIChzZWxmLnVzaW5nV2ViQXVkaW8pIHtcbiAgICAgICAgc2VsZi5tYXN0ZXJHYWluLmdhaW4uc2V0VmFsdWVBdFRpbWUobXV0ZWQgPyAwIDogc2VsZi5fdm9sdW1lLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIGFuZCBtdXRlIGFsbCBIVE1MNSBBdWRpbyBub2Rlcy5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXNlbGYuX2hvd2xzW2ldLl93ZWJBdWRpbykge1xuICAgICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2hvd2xzW2ldLl9nZXRTb3VuZElkcygpO1xuXG4gICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBzb3VuZHMgYW5kIG1hcmsgdGhlIGF1ZGlvIG5vZGUgYXMgbXV0ZWQuXG4gICAgICAgICAgZm9yICh2YXIgaj0wOyBqPGlkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5faG93bHNbaV0uX3NvdW5kQnlJZChpZHNbal0pO1xuXG4gICAgICAgICAgICBpZiAoc291bmQgJiYgc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUubXV0ZWQgPSAobXV0ZWQpID8gdHJ1ZSA6IHNvdW5kLl9tdXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBzdG9wcGluZyBhbGwgc291bmRzIGdsb2JhbGx5LlxuICAgICAqL1xuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBIb3dscyBhbmQgc3RvcCB0aGVtLlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHNlbGYuX2hvd2xzW2ldLnN0b3AoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVubG9hZCBhbmQgZGVzdHJveSBhbGwgY3VycmVudGx5IGxvYWRlZCBIb3dsIG9iamVjdHMuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIHVubG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICBmb3IgKHZhciBpPXNlbGYuX2hvd2xzLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHtcbiAgICAgICAgc2VsZi5faG93bHNbaV0udW5sb2FkKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBBdWRpb0NvbnRleHQgdG8gbWFrZSBzdXJlIGl0IGlzIGZ1bGx5IHJlc2V0LlxuICAgICAgaWYgKHNlbGYudXNpbmdXZWJBdWRpbyAmJiBzZWxmLmN0eCAmJiB0eXBlb2Ygc2VsZi5jdHguY2xvc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNlbGYuY3R4LmNsb3NlKCk7XG4gICAgICAgIHNlbGYuY3R4ID0gbnVsbDtcbiAgICAgICAgc2V0dXBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGZvciBjb2RlYyBzdXBwb3J0IG9mIHNwZWNpZmljIGV4dGVuc2lvbi5cbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9IGV4dCBBdWRpbyBmaWxlIGV4dGVudGlvbi5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgICAqL1xuICAgIGNvZGVjczogZnVuY3Rpb24oZXh0KSB7XG4gICAgICByZXR1cm4gKHRoaXMgfHwgSG93bGVyKS5fY29kZWNzW2V4dC5yZXBsYWNlKC9eeC0vLCAnJyldO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXR1cCB2YXJpb3VzIHN0YXRlIHZhbHVlcyBmb3IgZ2xvYmFsIHRyYWNraW5nLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfc2V0dXA6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzIHx8IEhvd2xlcjtcblxuICAgICAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHN1c3BlbmQvcmVzdW1lIHN0YXRlIG9mIHRoZSBBdWRpb0NvbnRleHQuXG4gICAgICBzZWxmLnN0YXRlID0gc2VsZi5jdHggPyBzZWxmLmN0eC5zdGF0ZSB8fCAnc3VzcGVuZGVkJyA6ICdzdXNwZW5kZWQnO1xuXG4gICAgICAvLyBBdXRvbWF0aWNhbGx5IGJlZ2luIHRoZSAzMC1zZWNvbmQgc3VzcGVuZCBwcm9jZXNzXG4gICAgICBzZWxmLl9hdXRvU3VzcGVuZCgpO1xuXG4gICAgICAvLyBDaGVjayBpZiBhdWRpbyBpcyBhdmFpbGFibGUuXG4gICAgICBpZiAoIXNlbGYudXNpbmdXZWJBdWRpbykge1xuICAgICAgICAvLyBObyBhdWRpbyBpcyBhdmFpbGFibGUgb24gdGhpcyBzeXN0ZW0gaWYgbm9BdWRpbyBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgICAgaWYgKHR5cGVvZiBBdWRpbyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIHRlc3QgPSBuZXcgQXVkaW8oKTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNhbnBsYXl0aHJvdWdoIGV2ZW50IGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGVzdC5vbmNhbnBsYXl0aHJvdWdoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBzZWxmLl9jYW5QbGF5RXZlbnQgPSAnY2FucGxheSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICBzZWxmLm5vQXVkaW8gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWxmLm5vQXVkaW8gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRlc3QgdG8gbWFrZSBzdXJlIGF1ZGlvIGlzbid0IGRpc2FibGVkIGluIEludGVybmV0IEV4cGxvcmVyLlxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHRlc3QgPSBuZXcgQXVkaW8oKTtcbiAgICAgICAgaWYgKHRlc3QubXV0ZWQpIHtcbiAgICAgICAgICBzZWxmLm5vQXVkaW8gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7fVxuXG4gICAgICAvLyBDaGVjayBmb3Igc3VwcG9ydGVkIGNvZGVjcy5cbiAgICAgIGlmICghc2VsZi5ub0F1ZGlvKSB7XG4gICAgICAgIHNlbGYuX3NldHVwQ29kZWNzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBmb3IgYnJvd3NlciBzdXBwb3J0IGZvciB2YXJpb3VzIGNvZGVjcyBhbmQgY2FjaGUgdGhlIHJlc3VsdHMuXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIF9zZXR1cENvZGVjczogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuICAgICAgdmFyIGF1ZGlvVGVzdCA9IG51bGw7XG5cbiAgICAgIC8vIE11c3Qgd3JhcCBpbiBhIHRyeS9jYXRjaCBiZWNhdXNlIElFMTEgaW4gc2VydmVyIG1vZGUgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgdHJ5IHtcbiAgICAgICAgYXVkaW9UZXN0ID0gKHR5cGVvZiBBdWRpbyAhPT0gJ3VuZGVmaW5lZCcpID8gbmV3IEF1ZGlvKCkgOiBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWF1ZGlvVGVzdCB8fCB0eXBlb2YgYXVkaW9UZXN0LmNhblBsYXlUeXBlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICB2YXIgbXBlZ1Rlc3QgPSBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL21wZWc7JykucmVwbGFjZSgvXm5vJC8sICcnKTtcblxuICAgICAgLy8gT3BlcmEgdmVyc2lvbiA8MzMgaGFzIG1peGVkIE1QMyBzdXBwb3J0LCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGZvciBhbmQgYmxvY2sgaXQuXG4gICAgICB2YXIgY2hlY2tPcGVyYSA9IHNlbGYuX25hdmlnYXRvciAmJiBzZWxmLl9uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PUFJcXC8oWzAtNl0uKS9nKTtcbiAgICAgIHZhciBpc09sZE9wZXJhID0gKGNoZWNrT3BlcmEgJiYgcGFyc2VJbnQoY2hlY2tPcGVyYVswXS5zcGxpdCgnLycpWzFdLCAxMCkgPCAzMyk7XG5cbiAgICAgIHNlbGYuX2NvZGVjcyA9IHtcbiAgICAgICAgbXAzOiAhISghaXNPbGRPcGVyYSAmJiAobXBlZ1Rlc3QgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9tcDM7JykucmVwbGFjZSgvXm5vJC8sICcnKSkpLFxuICAgICAgICBtcGVnOiAhIW1wZWdUZXN0LFxuICAgICAgICBvcHVzOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vb2dnOyBjb2RlY3M9XCJvcHVzXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBvZ2c6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9vZ2c7IGNvZGVjcz1cInZvcmJpc1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgb2dhOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vb2dnOyBjb2RlY3M9XCJ2b3JiaXNcIicpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIHdhdjogISEoYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby93YXY7IGNvZGVjcz1cIjFcIicpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vd2F2JykpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIGFhYzogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL2FhYzsnKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBjYWY6ICEhYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby94LWNhZjsnKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBtNGE6ICEhKGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8veC1tNGE7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9tNGE7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9hYWM7JykpLnJlcGxhY2UoL15ubyQvLCAnJyksXG4gICAgICAgIG00YjogISEoYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby94LW00YjsnKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL200YjsnKSB8fCBhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL2FhYzsnKSkucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgbXA0OiAhIShhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL3gtbXA0OycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vbXA0OycpIHx8IGF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vYWFjOycpKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICB3ZWJhOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vd2VibTsgY29kZWNzPVwidm9yYmlzXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICB3ZWJtOiAhIWF1ZGlvVGVzdC5jYW5QbGF5VHlwZSgnYXVkaW8vd2VibTsgY29kZWNzPVwidm9yYmlzXCInKS5yZXBsYWNlKC9ebm8kLywgJycpLFxuICAgICAgICBkb2xieTogISFhdWRpb1Rlc3QuY2FuUGxheVR5cGUoJ2F1ZGlvL21wNDsgY29kZWNzPVwiZWMtM1wiJykucmVwbGFjZSgvXm5vJC8sICcnKSxcbiAgICAgICAgZmxhYzogISEoYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby94LWZsYWM7JykgfHwgYXVkaW9UZXN0LmNhblBsYXlUeXBlKCdhdWRpby9mbGFjOycpKS5yZXBsYWNlKC9ebm8kLywgJycpXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU29tZSBicm93c2Vycy9kZXZpY2VzIHdpbGwgb25seSBhbGxvdyBhdWRpbyB0byBiZSBwbGF5ZWQgYWZ0ZXIgYSB1c2VyIGludGVyYWN0aW9uLlxuICAgICAqIEF0dGVtcHQgdG8gYXV0b21hdGljYWxseSB1bmxvY2sgYXVkaW8gb24gdGhlIGZpcnN0IHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICogQ29uY2VwdCBmcm9tOiBodHRwOi8vcGF1bGJha2F1cy5jb20vdHV0b3JpYWxzL2h0bWw1L3dlYi1hdWRpby1vbi1pb3MvXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIF91bmxvY2tBdWRpbzogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBPbmx5IHJ1biB0aGlzIGlmIFdlYiBBdWRpbyBpcyBzdXBwb3J0ZWQgYW5kIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gdW5sb2NrZWQuXG4gICAgICBpZiAoc2VsZi5fYXVkaW9VbmxvY2tlZCB8fCAhc2VsZi5jdHgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZWxmLl9hdWRpb1VubG9ja2VkID0gZmFsc2U7XG4gICAgICBzZWxmLmF1dG9VbmxvY2sgPSBmYWxzZTtcblxuICAgICAgLy8gU29tZSBtb2JpbGUgZGV2aWNlcy9wbGF0Zm9ybXMgaGF2ZSBkaXN0b3J0aW9uIGlzc3VlcyB3aGVuIG9wZW5pbmcvY2xvc2luZyB0YWJzIGFuZC9vciB3ZWIgdmlld3MuXG4gICAgICAvLyBCdWdzIGluIHRoZSBicm93c2VyIChlc3BlY2lhbGx5IE1vYmlsZSBTYWZhcmkpIGNhbiBjYXVzZSB0aGUgc2FtcGxlUmF0ZSB0byBjaGFuZ2UgZnJvbSA0NDEwMCB0byA0ODAwMC5cbiAgICAgIC8vIEJ5IGNhbGxpbmcgSG93bGVyLnVubG9hZCgpLCB3ZSBjcmVhdGUgYSBuZXcgQXVkaW9Db250ZXh0IHdpdGggdGhlIGNvcnJlY3Qgc2FtcGxlUmF0ZS5cbiAgICAgIGlmICghc2VsZi5fbW9iaWxlVW5sb2FkZWQgJiYgc2VsZi5jdHguc2FtcGxlUmF0ZSAhPT0gNDQxMDApIHtcbiAgICAgICAgc2VsZi5fbW9iaWxlVW5sb2FkZWQgPSB0cnVlO1xuICAgICAgICBzZWxmLnVubG9hZCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBTY3JhdGNoIGJ1ZmZlciBmb3IgZW5hYmxpbmcgaU9TIHRvIGRpc3Bvc2Ugb2Ygd2ViIGF1ZGlvIGJ1ZmZlcnMgY29ycmVjdGx5LCBhcyBwZXI6XG4gICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI0MTE5Njg0XG4gICAgICBzZWxmLl9zY3JhdGNoQnVmZmVyID0gc2VsZi5jdHguY3JlYXRlQnVmZmVyKDEsIDEsIDIyMDUwKTtcblxuICAgICAgLy8gQ2FsbCB0aGlzIG1ldGhvZCBvbiB0b3VjaCBzdGFydCB0byBjcmVhdGUgYW5kIHBsYXkgYSBidWZmZXIsXG4gICAgICAvLyB0aGVuIGNoZWNrIGlmIHRoZSBhdWRpbyBhY3R1YWxseSBwbGF5ZWQgdG8gZGV0ZXJtaW5lIGlmXG4gICAgICAvLyBhdWRpbyBoYXMgbm93IGJlZW4gdW5sb2NrZWQgb24gaU9TLCBBbmRyb2lkLCBldGMuXG4gICAgICB2YXIgdW5sb2NrID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBwb29sIG9mIHVubG9ja2VkIEhUTUw1IEF1ZGlvIG9iamVjdHMgdGhhdCBjYW5cbiAgICAgICAgLy8gYmUgdXNlZCBmb3IgcGxheWluZyBzb3VuZHMgd2l0aG91dCB1c2VyIGludGVyYWN0aW9uLiBIVE1MNVxuICAgICAgICAvLyBBdWRpbyBvYmplY3RzIG11c3QgYmUgaW5kaXZpZHVhbGx5IHVubG9ja2VkLCBhcyBvcHBvc2VkXG4gICAgICAgIC8vIHRvIHRoZSBXZWJBdWRpbyBBUEkgd2hpY2ggb25seSBuZWVkcyBhIHNpbmdsZSBhY3RpdmF0aW9uLlxuICAgICAgICAvLyBUaGlzIG11c3Qgb2NjdXIgYmVmb3JlIFdlYkF1ZGlvIHNldHVwIG9yIHRoZSBzb3VyY2Uub25lbmRlZFxuICAgICAgICAvLyBldmVudCB3aWxsIG5vdCBmaXJlLlxuICAgICAgICB3aGlsZSAoc2VsZi5faHRtbDVBdWRpb1Bvb2wubGVuZ3RoIDwgc2VsZi5odG1sNVBvb2xTaXplKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBhdWRpb05vZGUgPSBuZXcgQXVkaW8oKTtcblxuICAgICAgICAgICAgLy8gTWFyayB0aGlzIEF1ZGlvIG9iamVjdCBhcyB1bmxvY2tlZCB0byBlbnN1cmUgaXQgY2FuIGdldCByZXR1cm5lZFxuICAgICAgICAgICAgLy8gdG8gdGhlIHVubG9ja2VkIHBvb2wgd2hlbiByZWxlYXNlZC5cbiAgICAgICAgICAgIGF1ZGlvTm9kZS5fdW5sb2NrZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIGF1ZGlvIG5vZGUgdG8gdGhlIHBvb2wuXG4gICAgICAgICAgICBzZWxmLl9yZWxlYXNlSHRtbDVBdWRpbyhhdWRpb05vZGUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHNlbGYubm9BdWRpbyA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb29wIHRocm91Z2ggYW55IGFzc2lnbmVkIGF1ZGlvIG5vZGVzIGFuZCB1bmxvY2sgdGhlbS5cbiAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKCFzZWxmLl9ob3dsc1tpXS5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgIC8vIEdldCBhbGwgb2YgdGhlIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICAgICAgICB2YXIgaWRzID0gc2VsZi5faG93bHNbaV0uX2dldFNvdW5kSWRzKCk7XG5cbiAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgc291bmRzIGFuZCB1bmxvY2sgdGhlIGF1ZGlvIG5vZGVzLlxuICAgICAgICAgICAgZm9yICh2YXIgaj0wOyBqPGlkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9ob3dsc1tpXS5fc291bmRCeUlkKGlkc1tqXSk7XG5cbiAgICAgICAgICAgICAgaWYgKHNvdW5kICYmIHNvdW5kLl9ub2RlICYmICFzb3VuZC5fbm9kZS5fdW5sb2NrZWQpIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5fdW5sb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmxvYWQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpeCBBbmRyb2lkIGNhbiBub3QgcGxheSBpbiBzdXNwZW5kIHN0YXRlLlxuICAgICAgICBzZWxmLl9hdXRvUmVzdW1lKCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGJ1ZmZlci5cbiAgICAgICAgdmFyIHNvdXJjZSA9IHNlbGYuY3R4LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xuICAgICAgICBzb3VyY2UuYnVmZmVyID0gc2VsZi5fc2NyYXRjaEJ1ZmZlcjtcbiAgICAgICAgc291cmNlLmNvbm5lY3Qoc2VsZi5jdHguZGVzdGluYXRpb24pO1xuXG4gICAgICAgIC8vIFBsYXkgdGhlIGVtcHR5IGJ1ZmZlci5cbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2Uuc3RhcnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgc291cmNlLm5vdGVPbigwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb3VyY2Uuc3RhcnQoMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsaW5nIHJlc3VtZSgpIG9uIGEgc3RhY2sgaW5pdGlhdGVkIGJ5IHVzZXIgZ2VzdHVyZSBpcyB3aGF0IGFjdHVhbGx5IHVubG9ja3MgdGhlIGF1ZGlvIG9uIEFuZHJvaWQgQ2hyb21lID49IDU1LlxuICAgICAgICBpZiAodHlwZW9mIHNlbGYuY3R4LnJlc3VtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNlbGYuY3R4LnJlc3VtZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0dXAgYSB0aW1lb3V0IHRvIGNoZWNrIHRoYXQgd2UgYXJlIHVubG9ja2VkIG9uIHRoZSBuZXh0IGV2ZW50IGxvb3AuXG4gICAgICAgIHNvdXJjZS5vbmVuZGVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc291cmNlLmRpc2Nvbm5lY3QoMCk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgdGhlIHVubG9ja2VkIHN0YXRlIGFuZCBwcmV2ZW50IHRoaXMgY2hlY2sgZnJvbSBoYXBwZW5pbmcgYWdhaW4uXG4gICAgICAgICAgc2VsZi5fYXVkaW9VbmxvY2tlZCA9IHRydWU7XG5cbiAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRvdWNoIHN0YXJ0IGxpc3RlbmVyLlxuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB1bmxvY2ssIHRydWUpO1xuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdW5sb2NrLCB0cnVlKTtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHVubG9jaywgdHJ1ZSk7XG5cbiAgICAgICAgICAvLyBMZXQgYWxsIHNvdW5kcyBrbm93IHRoYXQgYXVkaW8gaGFzIGJlZW4gdW5sb2NrZWQuXG4gICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzZWxmLl9ob3dsc1tpXS5fZW1pdCgndW5sb2NrJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfTtcblxuICAgICAgLy8gU2V0dXAgYSB0b3VjaCBzdGFydCBsaXN0ZW5lciB0byBhdHRlbXB0IGFuIHVubG9jayBpbi5cbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB1bmxvY2ssIHRydWUpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB1bmxvY2ssIHRydWUpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1bmxvY2ssIHRydWUpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IGFuIHVubG9ja2VkIEhUTUw1IEF1ZGlvIG9iamVjdCBmcm9tIHRoZSBwb29sLiBJZiBub25lIGFyZSBsZWZ0LFxuICAgICAqIHJldHVybiBhIG5ldyBBdWRpbyBvYmplY3QgYW5kIHRocm93IGEgd2FybmluZy5cbiAgICAgKiBAcmV0dXJuIHtBdWRpb30gSFRNTDUgQXVkaW8gb2JqZWN0LlxuICAgICAqL1xuICAgIF9vYnRhaW5IdG1sNUF1ZGlvOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcyB8fCBIb3dsZXI7XG5cbiAgICAgIC8vIFJldHVybiB0aGUgbmV4dCBvYmplY3QgZnJvbSB0aGUgcG9vbCBpZiBvbmUgZXhpc3RzLlxuICAgICAgaWYgKHNlbGYuX2h0bWw1QXVkaW9Qb29sLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc2VsZi5faHRtbDVBdWRpb1Bvb2wucG9wKCk7XG4gICAgICB9XG5cbiAgICAgIC8vLkNoZWNrIGlmIHRoZSBhdWRpbyBpcyBsb2NrZWQgYW5kIHRocm93IGEgd2FybmluZy5cbiAgICAgIHZhciB0ZXN0UGxheSA9IG5ldyBBdWRpbygpLnBsYXkoKTtcbiAgICAgIGlmICh0ZXN0UGxheSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgKHRlc3RQbGF5IGluc3RhbmNlb2YgUHJvbWlzZSB8fCB0eXBlb2YgdGVzdFBsYXkudGhlbiA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICAgICAgdGVzdFBsYXkuY2F0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdIVE1MNSBBdWRpbyBwb29sIGV4aGF1c3RlZCwgcmV0dXJuaW5nIHBvdGVudGlhbGx5IGxvY2tlZCBhdWRpbyBvYmplY3QuJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEF1ZGlvKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBhY3RpdmF0ZWQgSFRNTDUgQXVkaW8gb2JqZWN0IHRvIHRoZSBwb29sLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBfcmVsZWFzZUh0bWw1QXVkaW86IGZ1bmN0aW9uKGF1ZGlvKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXMgfHwgSG93bGVyO1xuXG4gICAgICAvLyBEb24ndCBhZGQgYXVkaW8gdG8gdGhlIHBvb2wgaWYgd2UgZG9uJ3Qga25vdyBpZiBpdCBoYXMgYmVlbiB1bmxvY2tlZC5cbiAgICAgIGlmIChhdWRpby5fdW5sb2NrZWQpIHtcbiAgICAgICAgc2VsZi5faHRtbDVBdWRpb1Bvb2wucHVzaChhdWRpbyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBdXRvbWF0aWNhbGx5IHN1c3BlbmQgdGhlIFdlYiBBdWRpbyBBdWRpb0NvbnRleHQgYWZ0ZXIgbm8gc291bmQgaGFzIHBsYXllZCBmb3IgMzAgc2Vjb25kcy5cbiAgICAgKiBUaGlzIHNhdmVzIHByb2Nlc3NpbmcvZW5lcmd5IGFuZCBmaXhlcyB2YXJpb3VzIGJyb3dzZXItc3BlY2lmaWMgYnVncyB3aXRoIGF1ZGlvIGdldHRpbmcgc3R1Y2suXG4gICAgICogQHJldHVybiB7SG93bGVyfVxuICAgICAqL1xuICAgIF9hdXRvU3VzcGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmICghc2VsZi5hdXRvU3VzcGVuZCB8fCAhc2VsZi5jdHggfHwgdHlwZW9mIHNlbGYuY3R4LnN1c3BlbmQgPT09ICd1bmRlZmluZWQnIHx8ICFIb3dsZXIudXNpbmdXZWJBdWRpbykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFueSBzb3VuZHMgYXJlIHBsYXlpbmcuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5faG93bHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNlbGYuX2hvd2xzW2ldLl93ZWJBdWRpbykge1xuICAgICAgICAgIGZvciAodmFyIGo9MDsgajxzZWxmLl9ob3dsc1tpXS5fc291bmRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoIXNlbGYuX2hvd2xzW2ldLl9zb3VuZHNbal0uX3BhdXNlZCkge1xuICAgICAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGYuX3N1c3BlbmRUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi5fc3VzcGVuZFRpbWVyKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gc291bmQgaGFzIHBsYXllZCBhZnRlciAzMCBzZWNvbmRzLCBzdXNwZW5kIHRoZSBjb250ZXh0LlxuICAgICAgc2VsZi5fc3VzcGVuZFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKCFzZWxmLmF1dG9TdXNwZW5kKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZi5fc3VzcGVuZFRpbWVyID0gbnVsbDtcbiAgICAgICAgc2VsZi5zdGF0ZSA9ICdzdXNwZW5kaW5nJztcblxuICAgICAgICAvLyBIYW5kbGUgdXBkYXRpbmcgdGhlIHN0YXRlIG9mIHRoZSBhdWRpbyBjb250ZXh0IGFmdGVyIHN1c3BlbmRpbmcuXG4gICAgICAgIHZhciBoYW5kbGVTdXNwZW5zaW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5zdGF0ZSA9ICdzdXNwZW5kZWQnO1xuXG4gICAgICAgICAgaWYgKHNlbGYuX3Jlc3VtZUFmdGVyU3VzcGVuZCkge1xuICAgICAgICAgICAgZGVsZXRlIHNlbGYuX3Jlc3VtZUFmdGVyU3VzcGVuZDtcbiAgICAgICAgICAgIHNlbGYuX2F1dG9SZXN1bWUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRWl0aGVyIHRoZSBzdGF0ZSBnZXRzIHN1c3BlbmRlZCBvciBpdCBpcyBpbnRlcnJ1cHRlZC5cbiAgICAgICAgLy8gRWl0aGVyIHdheSwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN0YXRlIHRvIHN1c3BlbmRlZC5cbiAgICAgICAgc2VsZi5jdHguc3VzcGVuZCgpLnRoZW4oaGFuZGxlU3VzcGVuc2lvbiwgaGFuZGxlU3VzcGVuc2lvbik7XG4gICAgICB9LCAzMDAwMCk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBdXRvbWF0aWNhbGx5IHJlc3VtZSB0aGUgV2ViIEF1ZGlvIEF1ZGlvQ29udGV4dCB3aGVuIGEgbmV3IHNvdW5kIGlzIHBsYXllZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsZXJ9XG4gICAgICovXG4gICAgX2F1dG9SZXN1bWU6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICBpZiAoIXNlbGYuY3R4IHx8IHR5cGVvZiBzZWxmLmN0eC5yZXN1bWUgPT09ICd1bmRlZmluZWQnIHx8ICFIb3dsZXIudXNpbmdXZWJBdWRpbykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxmLnN0YXRlID09PSAncnVubmluZycgJiYgc2VsZi5jdHguc3RhdGUgIT09ICdpbnRlcnJ1cHRlZCcgJiYgc2VsZi5fc3VzcGVuZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChzZWxmLl9zdXNwZW5kVGltZXIpO1xuICAgICAgICBzZWxmLl9zdXNwZW5kVGltZXIgPSBudWxsO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLnN0YXRlID09PSAnc3VzcGVuZGVkJyB8fCBzZWxmLnN0YXRlID09PSAncnVubmluZycgJiYgc2VsZi5jdHguc3RhdGUgPT09ICdpbnRlcnJ1cHRlZCcpIHtcbiAgICAgICAgc2VsZi5jdHgucmVzdW1lKCkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgICBzZWxmLnN0YXRlID0gJ3J1bm5pbmcnO1xuXG4gICAgICAgICAgLy8gRW1pdCB0byBhbGwgSG93bHMgdGhhdCB0aGUgYXVkaW8gaGFzIHJlc3VtZWQuXG4gICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX2hvd2xzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzZWxmLl9ob3dsc1tpXS5fZW1pdCgncmVzdW1lJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoc2VsZi5fc3VzcGVuZFRpbWVyKSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHNlbGYuX3N1c3BlbmRUaW1lcik7XG4gICAgICAgICAgc2VsZi5fc3VzcGVuZFRpbWVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxmLnN0YXRlID09PSAnc3VzcGVuZGluZycpIHtcbiAgICAgICAgc2VsZi5fcmVzdW1lQWZ0ZXJTdXNwZW5kID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuICB9O1xuXG4gIC8vIFNldHVwIHRoZSBnbG9iYWwgYXVkaW8gY29udHJvbGxlci5cbiAgdmFyIEhvd2xlciA9IG5ldyBIb3dsZXJHbG9iYWwoKTtcblxuICAvKiogR3JvdXAgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGF1ZGlvIGdyb3VwIGNvbnRyb2xsZXIuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvIFBhc3NlZCBpbiBwcm9wZXJ0aWVzIGZvciB0aGlzIGdyb3VwLlxuICAgKi9cbiAgdmFyIEhvd2wgPSBmdW5jdGlvbihvKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gVGhyb3cgYW4gZXJyb3IgaWYgbm8gc291cmNlIGlzIHByb3ZpZGVkLlxuICAgIGlmICghby5zcmMgfHwgby5zcmMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdBbiBhcnJheSBvZiBzb3VyY2UgZmlsZXMgbXVzdCBiZSBwYXNzZWQgd2l0aCBhbnkgbmV3IEhvd2wuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VsZi5pbml0KG8pO1xuICB9O1xuICBIb3dsLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGEgbmV3IEhvd2wgZ3JvdXAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gbyBQYXNzZWQgaW4gcHJvcGVydGllcyBmb3IgdGhpcyBncm91cC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIGluaXQ6IGZ1bmN0aW9uKG8pIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBBdWRpb0NvbnRleHQgY3JlYXRlZCB5ZXQsIHJ1biB0aGUgc2V0dXAuXG4gICAgICBpZiAoIUhvd2xlci5jdHgpIHtcbiAgICAgICAgc2V0dXBBdWRpb0NvbnRleHQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0dXAgdXNlci1kZWZpbmVkIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgIHNlbGYuX2F1dG9wbGF5ID0gby5hdXRvcGxheSB8fCBmYWxzZTtcbiAgICAgIHNlbGYuX2Zvcm1hdCA9ICh0eXBlb2Ygby5mb3JtYXQgIT09ICdzdHJpbmcnKSA/IG8uZm9ybWF0IDogW28uZm9ybWF0XTtcbiAgICAgIHNlbGYuX2h0bWw1ID0gby5odG1sNSB8fCBmYWxzZTtcbiAgICAgIHNlbGYuX211dGVkID0gby5tdXRlIHx8IGZhbHNlO1xuICAgICAgc2VsZi5fbG9vcCA9IG8ubG9vcCB8fCBmYWxzZTtcbiAgICAgIHNlbGYuX3Bvb2wgPSBvLnBvb2wgfHwgNTtcbiAgICAgIHNlbGYuX3ByZWxvYWQgPSAodHlwZW9mIG8ucHJlbG9hZCA9PT0gJ2Jvb2xlYW4nIHx8IG8ucHJlbG9hZCA9PT0gJ21ldGFkYXRhJykgPyBvLnByZWxvYWQgOiB0cnVlO1xuICAgICAgc2VsZi5fcmF0ZSA9IG8ucmF0ZSB8fCAxO1xuICAgICAgc2VsZi5fc3ByaXRlID0gby5zcHJpdGUgfHwge307XG4gICAgICBzZWxmLl9zcmMgPSAodHlwZW9mIG8uc3JjICE9PSAnc3RyaW5nJykgPyBvLnNyYyA6IFtvLnNyY107XG4gICAgICBzZWxmLl92b2x1bWUgPSBvLnZvbHVtZSAhPT0gdW5kZWZpbmVkID8gby52b2x1bWUgOiAxO1xuICAgICAgc2VsZi5feGhyID0ge1xuICAgICAgICBtZXRob2Q6IG8ueGhyICYmIG8ueGhyLm1ldGhvZCA/IG8ueGhyLm1ldGhvZCA6ICdHRVQnLFxuICAgICAgICBoZWFkZXJzOiBvLnhociAmJiBvLnhoci5oZWFkZXJzID8gby54aHIuaGVhZGVycyA6IG51bGwsXG4gICAgICAgIHdpdGhDcmVkZW50aWFsczogby54aHIgJiYgby54aHIud2l0aENyZWRlbnRpYWxzID8gby54aHIud2l0aENyZWRlbnRpYWxzIDogZmFsc2UsXG4gICAgICB9O1xuXG4gICAgICAvLyBTZXR1cCBhbGwgb3RoZXIgZGVmYXVsdCBwcm9wZXJ0aWVzLlxuICAgICAgc2VsZi5fZHVyYXRpb24gPSAwO1xuICAgICAgc2VsZi5fc3RhdGUgPSAndW5sb2FkZWQnO1xuICAgICAgc2VsZi5fc291bmRzID0gW107XG4gICAgICBzZWxmLl9lbmRUaW1lcnMgPSB7fTtcbiAgICAgIHNlbGYuX3F1ZXVlID0gW107XG4gICAgICBzZWxmLl9wbGF5TG9jayA9IGZhbHNlO1xuXG4gICAgICAvLyBTZXR1cCBldmVudCBsaXN0ZW5lcnMuXG4gICAgICBzZWxmLl9vbmVuZCA9IG8ub25lbmQgPyBbe2ZuOiBvLm9uZW5kfV0gOiBbXTtcbiAgICAgIHNlbGYuX29uZmFkZSA9IG8ub25mYWRlID8gW3tmbjogby5vbmZhZGV9XSA6IFtdO1xuICAgICAgc2VsZi5fb25sb2FkID0gby5vbmxvYWQgPyBbe2ZuOiBvLm9ubG9hZH1dIDogW107XG4gICAgICBzZWxmLl9vbmxvYWRlcnJvciA9IG8ub25sb2FkZXJyb3IgPyBbe2ZuOiBvLm9ubG9hZGVycm9yfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucGxheWVycm9yID0gby5vbnBsYXllcnJvciA/IFt7Zm46IG8ub25wbGF5ZXJyb3J9XSA6IFtdO1xuICAgICAgc2VsZi5fb25wYXVzZSA9IG8ub25wYXVzZSA/IFt7Zm46IG8ub25wYXVzZX1dIDogW107XG4gICAgICBzZWxmLl9vbnBsYXkgPSBvLm9ucGxheSA/IFt7Zm46IG8ub25wbGF5fV0gOiBbXTtcbiAgICAgIHNlbGYuX29uc3RvcCA9IG8ub25zdG9wID8gW3tmbjogby5vbnN0b3B9XSA6IFtdO1xuICAgICAgc2VsZi5fb25tdXRlID0gby5vbm11dGUgPyBbe2ZuOiBvLm9ubXV0ZX1dIDogW107XG4gICAgICBzZWxmLl9vbnZvbHVtZSA9IG8ub252b2x1bWUgPyBbe2ZuOiBvLm9udm9sdW1lfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucmF0ZSA9IG8ub25yYXRlID8gW3tmbjogby5vbnJhdGV9XSA6IFtdO1xuICAgICAgc2VsZi5fb25zZWVrID0gby5vbnNlZWsgPyBbe2ZuOiBvLm9uc2Vla31dIDogW107XG4gICAgICBzZWxmLl9vbnVubG9jayA9IG8ub251bmxvY2sgPyBbe2ZuOiBvLm9udW5sb2NrfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucmVzdW1lID0gW107XG5cbiAgICAgIC8vIFdlYiBBdWRpbyBvciBIVE1MNSBBdWRpbz9cbiAgICAgIHNlbGYuX3dlYkF1ZGlvID0gSG93bGVyLnVzaW5nV2ViQXVkaW8gJiYgIXNlbGYuX2h0bWw1O1xuXG4gICAgICAvLyBBdXRvbWF0aWNhbGx5IHRyeSB0byBlbmFibGUgYXVkaW8uXG4gICAgICBpZiAodHlwZW9mIEhvd2xlci5jdHggIT09ICd1bmRlZmluZWQnICYmIEhvd2xlci5jdHggJiYgSG93bGVyLmF1dG9VbmxvY2spIHtcbiAgICAgICAgSG93bGVyLl91bmxvY2tBdWRpbygpO1xuICAgICAgfVxuXG4gICAgICAvLyBLZWVwIHRyYWNrIG9mIHRoaXMgSG93bCBncm91cCBpbiB0aGUgZ2xvYmFsIGNvbnRyb2xsZXIuXG4gICAgICBIb3dsZXIuX2hvd2xzLnB1c2goc2VsZik7XG5cbiAgICAgIC8vIElmIHRoZXkgc2VsZWN0ZWQgYXV0b3BsYXksIGFkZCBhIHBsYXkgZXZlbnQgdG8gdGhlIGxvYWQgcXVldWUuXG4gICAgICBpZiAoc2VsZi5fYXV0b3BsYXkpIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdwbGF5JyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5wbGF5KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gTG9hZCB0aGUgc291cmNlIGZpbGUgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQuXG4gICAgICBpZiAoc2VsZi5fcHJlbG9hZCAmJiBzZWxmLl9wcmVsb2FkICE9PSAnbm9uZScpIHtcbiAgICAgICAgc2VsZi5sb2FkKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSBhdWRpbyBmaWxlLlxuICAgICAqIEByZXR1cm4ge0hvd2xlcn1cbiAgICAgKi9cbiAgICBsb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciB1cmwgPSBudWxsO1xuXG4gICAgICAvLyBJZiBubyBhdWRpbyBpcyBhdmFpbGFibGUsIHF1aXQgaW1tZWRpYXRlbHkuXG4gICAgICBpZiAoSG93bGVyLm5vQXVkaW8pIHtcbiAgICAgICAgc2VsZi5fZW1pdCgnbG9hZGVycm9yJywgbnVsbCwgJ05vIGF1ZGlvIHN1cHBvcnQuJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIG91ciBzb3VyY2UgaXMgaW4gYW4gYXJyYXkuXG4gICAgICBpZiAodHlwZW9mIHNlbGYuX3NyYyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgc2VsZi5fc3JjID0gW3NlbGYuX3NyY107XG4gICAgICB9XG5cbiAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgc291cmNlcyBhbmQgcGljayB0aGUgZmlyc3Qgb25lIHRoYXQgaXMgY29tcGF0aWJsZS5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9zcmMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGV4dCwgc3RyO1xuXG4gICAgICAgIGlmIChzZWxmLl9mb3JtYXQgJiYgc2VsZi5fZm9ybWF0W2ldKSB7XG4gICAgICAgICAgLy8gSWYgYW4gZXh0ZW5zaW9uIHdhcyBzcGVjaWZpZWQsIHVzZSB0aGF0IGluc3RlYWQuXG4gICAgICAgICAgZXh0ID0gc2VsZi5fZm9ybWF0W2ldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgc291cmNlIGlzIGEgc3RyaW5nLlxuICAgICAgICAgIHN0ciA9IHNlbGYuX3NyY1tpXTtcbiAgICAgICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHNlbGYuX2VtaXQoJ2xvYWRlcnJvcicsIG51bGwsICdOb24tc3RyaW5nIGZvdW5kIGluIHNlbGVjdGVkIGF1ZGlvIHNvdXJjZXMgLSBpZ25vcmluZy4nKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEV4dHJhY3QgdGhlIGZpbGUgZXh0ZW5zaW9uIGZyb20gdGhlIFVSTCBvciBiYXNlNjQgZGF0YSBVUkkuXG4gICAgICAgICAgZXh0ID0gL15kYXRhOmF1ZGlvXFwvKFteOyxdKyk7L2kuZXhlYyhzdHIpO1xuICAgICAgICAgIGlmICghZXh0KSB7XG4gICAgICAgICAgICBleHQgPSAvXFwuKFteLl0rKSQvLmV4ZWMoc3RyLnNwbGl0KCc/JywgMSlbMF0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgIGV4dCA9IGV4dFsxXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExvZyBhIHdhcm5pbmcgaWYgbm8gZXh0ZW5zaW9uIHdhcyBmb3VuZC5cbiAgICAgICAgaWYgKCFleHQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ05vIGZpbGUgZXh0ZW5zaW9uIHdhcyBmb3VuZC4gQ29uc2lkZXIgdXNpbmcgdGhlIFwiZm9ybWF0XCIgcHJvcGVydHkgb3Igc3BlY2lmeSBhbiBleHRlbnNpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGV4dGVuc2lvbiBpcyBhdmFpbGFibGUuXG4gICAgICAgIGlmIChleHQgJiYgSG93bGVyLmNvZGVjcyhleHQpKSB7XG4gICAgICAgICAgdXJsID0gc2VsZi5fc3JjW2ldO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdXJsKSB7XG4gICAgICAgIHNlbGYuX2VtaXQoJ2xvYWRlcnJvcicsIG51bGwsICdObyBjb2RlYyBzdXBwb3J0IGZvciBzZWxlY3RlZCBhdWRpbyBzb3VyY2VzLicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNlbGYuX3NyYyA9IHVybDtcbiAgICAgIHNlbGYuX3N0YXRlID0gJ2xvYWRpbmcnO1xuXG4gICAgICAvLyBJZiB0aGUgaG9zdGluZyBwYWdlIGlzIEhUVFBTIGFuZCB0aGUgc291cmNlIGlzbid0LFxuICAgICAgLy8gZHJvcCBkb3duIHRvIEhUTUw1IEF1ZGlvIHRvIGF2b2lkIE1peGVkIENvbnRlbnQgZXJyb3JzLlxuICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgJiYgdXJsLnNsaWNlKDAsIDUpID09PSAnaHR0cDonKSB7XG4gICAgICAgIHNlbGYuX2h0bWw1ID0gdHJ1ZTtcbiAgICAgICAgc2VsZi5fd2ViQXVkaW8gPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IHNvdW5kIG9iamVjdCBhbmQgYWRkIGl0IHRvIHRoZSBwb29sLlxuICAgICAgbmV3IFNvdW5kKHNlbGYpO1xuXG4gICAgICAvLyBMb2FkIGFuZCBkZWNvZGUgdGhlIGF1ZGlvIGRhdGEgZm9yIHBsYXliYWNrLlxuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgIGxvYWRCdWZmZXIoc2VsZik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQbGF5IGEgc291bmQgb3IgcmVzdW1lIHByZXZpb3VzIHBsYXliYWNrLlxuICAgICAqIEBwYXJhbSAge1N0cmluZy9OdW1iZXJ9IHNwcml0ZSAgIFNwcml0ZSBuYW1lIGZvciBzcHJpdGUgcGxheWJhY2sgb3Igc291bmQgaWQgdG8gY29udGludWUgcHJldmlvdXMuXG4gICAgICogQHBhcmFtICB7Qm9vbGVhbn0gaW50ZXJuYWwgSW50ZXJuYWwgVXNlOiB0cnVlIHByZXZlbnRzIGV2ZW50IGZpcmluZy5cbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgIFNvdW5kIElELlxuICAgICAqL1xuICAgIHBsYXk6IGZ1bmN0aW9uKHNwcml0ZSwgaW50ZXJuYWwpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBpZCA9IG51bGw7XG5cbiAgICAgIC8vIERldGVybWluZSBpZiBhIHNwcml0ZSwgc291bmQgaWQgb3Igbm90aGluZyB3YXMgcGFzc2VkXG4gICAgICBpZiAodHlwZW9mIHNwcml0ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWQgPSBzcHJpdGU7XG4gICAgICAgIHNwcml0ZSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcHJpdGUgPT09ICdzdHJpbmcnICYmIHNlbGYuX3N0YXRlID09PSAnbG9hZGVkJyAmJiAhc2VsZi5fc3ByaXRlW3Nwcml0ZV0pIHtcbiAgICAgICAgLy8gSWYgdGhlIHBhc3NlZCBzcHJpdGUgZG9lc24ndCBleGlzdCwgZG8gbm90aGluZy5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcHJpdGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBzb3VuZCBzcHJpdGUgKHBsYXlzIHRoZSBmdWxsIGF1ZGlvIGxlbmd0aCkuXG4gICAgICAgIHNwcml0ZSA9ICdfX2RlZmF1bHQnO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgc2luZ2xlIHBhdXNlZCBzb3VuZCB0aGF0IGlzbid0IGVuZGVkLlxuICAgICAgICAvLyBJZiB0aGVyZSBpcywgcGxheSB0aGF0IHNvdW5kLiBJZiBub3QsIGNvbnRpbnVlIGFzIHVzdWFsLlxuICAgICAgICBpZiAoIXNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgICAgdmFyIG51bSA9IDA7XG4gICAgICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHNlbGYuX3NvdW5kc1tpXS5fcGF1c2VkICYmICFzZWxmLl9zb3VuZHNbaV0uX2VuZGVkKSB7XG4gICAgICAgICAgICAgIG51bSsrO1xuICAgICAgICAgICAgICBpZCA9IHNlbGYuX3NvdW5kc1tpXS5faWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKG51bSA9PT0gMSkge1xuICAgICAgICAgICAgc3ByaXRlID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGhlIHNlbGVjdGVkIG5vZGUsIG9yIGdldCBvbmUgZnJvbSB0aGUgcG9vbC5cbiAgICAgIHZhciBzb3VuZCA9IGlkID8gc2VsZi5fc291bmRCeUlkKGlkKSA6IHNlbGYuX2luYWN0aXZlU291bmQoKTtcblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGRvZXNuJ3QgZXhpc3QsIGRvIG5vdGhpbmcuXG4gICAgICBpZiAoIXNvdW5kKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBTZWxlY3QgdGhlIHNwcml0ZSBkZWZpbml0aW9uLlxuICAgICAgaWYgKGlkICYmICFzcHJpdGUpIHtcbiAgICAgICAgc3ByaXRlID0gc291bmQuX3Nwcml0ZSB8fCAnX19kZWZhdWx0JztcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIHdlIG11c3Qgd2FpdCB0byBnZXQgdGhlIGF1ZGlvJ3MgZHVyYXRpb24uXG4gICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gd2FpdCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgcnVuIGludG8gcmFjZSBjb25kaXRpb25zIHdpdGhcbiAgICAgIC8vIHRoZSBvcmRlciBvZiBmdW5jdGlvbiBjYWxscy5cbiAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgLy8gU2V0IHRoZSBzcHJpdGUgdmFsdWUgb24gdGhpcyBzb3VuZC5cbiAgICAgICAgc291bmQuX3Nwcml0ZSA9IHNwcml0ZTtcblxuICAgICAgICAvLyBNYXJrIHRoaXMgc291bmQgYXMgbm90IGVuZGVkIGluIGNhc2UgYW5vdGhlciBzb3VuZCBpcyBwbGF5ZWQgYmVmb3JlIHRoaXMgb25lIGxvYWRzLlxuICAgICAgICBzb3VuZC5fZW5kZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBBZGQgdGhlIHNvdW5kIHRvIHRoZSBxdWV1ZSB0byBiZSBwbGF5ZWQgb24gbG9hZC5cbiAgICAgICAgdmFyIHNvdW5kSWQgPSBzb3VuZC5faWQ7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAncGxheScsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYucGxheShzb3VuZElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzb3VuZElkO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBwbGF5IHRoZSBzb3VuZCBpZiBhbiBpZCB3YXMgcGFzc2VkIGFuZCBpdCBpcyBhbHJlYWR5IHBsYXlpbmcuXG4gICAgICBpZiAoaWQgJiYgIXNvdW5kLl9wYXVzZWQpIHtcbiAgICAgICAgLy8gVHJpZ2dlciB0aGUgcGxheSBldmVudCwgaW4gb3JkZXIgdG8ga2VlcCBpdGVyYXRpbmcgdGhyb3VnaCBxdWV1ZS5cbiAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgIHNlbGYuX2xvYWRRdWV1ZSgncGxheScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNvdW5kLl9pZDtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIHRoZSBBdWRpb0NvbnRleHQgaXNuJ3Qgc3VzcGVuZGVkLCBhbmQgcmVzdW1lIGl0IGlmIGl0IGlzLlxuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgIEhvd2xlci5fYXV0b1Jlc3VtZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBEZXRlcm1pbmUgaG93IGxvbmcgdG8gcGxheSBmb3IgYW5kIHdoZXJlIHRvIHN0YXJ0IHBsYXlpbmcuXG4gICAgICB2YXIgc2VlayA9IE1hdGgubWF4KDAsIHNvdW5kLl9zZWVrID4gMCA/IHNvdW5kLl9zZWVrIDogc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMF0gLyAxMDAwKTtcbiAgICAgIHZhciBkdXJhdGlvbiA9IE1hdGgubWF4KDAsICgoc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMF0gKyBzZWxmLl9zcHJpdGVbc3ByaXRlXVsxXSkgLyAxMDAwKSAtIHNlZWspO1xuICAgICAgdmFyIHRpbWVvdXQgPSAoZHVyYXRpb24gKiAxMDAwKSAvIE1hdGguYWJzKHNvdW5kLl9yYXRlKTtcbiAgICAgIHZhciBzdGFydCA9IHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzBdIC8gMTAwMDtcbiAgICAgIHZhciBzdG9wID0gKHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzBdICsgc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMV0pIC8gMTAwMDtcbiAgICAgIHNvdW5kLl9zcHJpdGUgPSBzcHJpdGU7XG5cbiAgICAgIC8vIE1hcmsgdGhlIHNvdW5kIGFzIGVuZGVkIGluc3RhbnRseSBzbyB0aGF0IHRoaXMgYXN5bmMgcGxheWJhY2tcbiAgICAgIC8vIGRvZXNuJ3QgZ2V0IGdyYWJiZWQgYnkgYW5vdGhlciBjYWxsIHRvIHBsYXkgd2hpbGUgdGhpcyBvbmUgd2FpdHMgdG8gc3RhcnQuXG4gICAgICBzb3VuZC5fZW5kZWQgPSBmYWxzZTtcblxuICAgICAgLy8gVXBkYXRlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBzb3VuZC5cbiAgICAgIHZhciBzZXRQYXJhbXMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgc291bmQuX3BhdXNlZCA9IGZhbHNlO1xuICAgICAgICBzb3VuZC5fc2VlayA9IHNlZWs7XG4gICAgICAgIHNvdW5kLl9zdGFydCA9IHN0YXJ0O1xuICAgICAgICBzb3VuZC5fc3RvcCA9IHN0b3A7XG4gICAgICAgIHNvdW5kLl9sb29wID0gISEoc291bmQuX2xvb3AgfHwgc2VsZi5fc3ByaXRlW3Nwcml0ZV1bMl0pO1xuICAgICAgfTtcblxuICAgICAgLy8gRW5kIHRoZSBzb3VuZCBpbnN0YW50bHkgaWYgc2VlayBpcyBhdCB0aGUgZW5kLlxuICAgICAgaWYgKHNlZWsgPj0gc3RvcCkge1xuICAgICAgICBzZWxmLl9lbmRlZChzb3VuZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQmVnaW4gdGhlIGFjdHVhbCBwbGF5YmFjay5cbiAgICAgIHZhciBub2RlID0gc291bmQuX25vZGU7XG4gICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgLy8gRmlyZSB0aGlzIHdoZW4gdGhlIHNvdW5kIGlzIHJlYWR5IHRvIHBsYXkgdG8gYmVnaW4gV2ViIEF1ZGlvIHBsYXliYWNrLlxuICAgICAgICB2YXIgcGxheVdlYkF1ZGlvID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSBmYWxzZTtcbiAgICAgICAgICBzZXRQYXJhbXMoKTtcbiAgICAgICAgICBzZWxmLl9yZWZyZXNoQnVmZmVyKHNvdW5kKTtcblxuICAgICAgICAgIC8vIFNldHVwIHRoZSBwbGF5YmFjayBwYXJhbXMuXG4gICAgICAgICAgdmFyIHZvbCA9IChzb3VuZC5fbXV0ZWQgfHwgc2VsZi5fbXV0ZWQpID8gMCA6IHNvdW5kLl92b2x1bWU7XG4gICAgICAgICAgbm9kZS5nYWluLnNldFZhbHVlQXRUaW1lKHZvbCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgc291bmQuX3BsYXlTdGFydCA9IEhvd2xlci5jdHguY3VycmVudFRpbWU7XG5cbiAgICAgICAgICAvLyBQbGF5IHRoZSBzb3VuZCB1c2luZyB0aGUgc3VwcG9ydGVkIG1ldGhvZC5cbiAgICAgICAgICBpZiAodHlwZW9mIG5vZGUuYnVmZmVyU291cmNlLnN0YXJ0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgc291bmQuX2xvb3AgPyBub2RlLmJ1ZmZlclNvdXJjZS5ub3RlR3JhaW5PbigwLCBzZWVrLCA4NjQwMCkgOiBub2RlLmJ1ZmZlclNvdXJjZS5ub3RlR3JhaW5PbigwLCBzZWVrLCBkdXJhdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNvdW5kLl9sb29wID8gbm9kZS5idWZmZXJTb3VyY2Uuc3RhcnQoMCwgc2VlaywgODY0MDApIDogbm9kZS5idWZmZXJTb3VyY2Uuc3RhcnQoMCwgc2VlaywgZHVyYXRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFN0YXJ0IGEgbmV3IHRpbWVyIGlmIG5vbmUgaXMgcHJlc2VudC5cbiAgICAgICAgICBpZiAodGltZW91dCAhPT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdID0gc2V0VGltZW91dChzZWxmLl9lbmRlZC5iaW5kKHNlbGYsIHNvdW5kKSwgdGltZW91dCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgc2VsZi5fZW1pdCgncGxheScsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgICAgIHNlbGYuX2xvYWRRdWV1ZSgpO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChIb3dsZXIuc3RhdGUgPT09ICdydW5uaW5nJyAmJiBIb3dsZXIuY3R4LnN0YXRlICE9PSAnaW50ZXJydXB0ZWQnKSB7XG4gICAgICAgICAgcGxheVdlYkF1ZGlvKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIGF1ZGlvIGNvbnRleHQgdG8gcmVzdW1lIGJlZm9yZSBwbGF5aW5nLlxuICAgICAgICAgIHNlbGYub25jZSgncmVzdW1lJywgcGxheVdlYkF1ZGlvKTtcblxuICAgICAgICAgIC8vIENhbmNlbCB0aGUgZW5kIHRpbWVyLlxuICAgICAgICAgIHNlbGYuX2NsZWFyVGltZXIoc291bmQuX2lkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmlyZSB0aGlzIHdoZW4gdGhlIHNvdW5kIGlzIHJlYWR5IHRvIHBsYXkgdG8gYmVnaW4gSFRNTDUgQXVkaW8gcGxheWJhY2suXG4gICAgICAgIHZhciBwbGF5SHRtbDUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICBub2RlLmN1cnJlbnRUaW1lID0gc2VlaztcbiAgICAgICAgICBub2RlLm11dGVkID0gc291bmQuX211dGVkIHx8IHNlbGYuX211dGVkIHx8IEhvd2xlci5fbXV0ZWQgfHwgbm9kZS5tdXRlZDtcbiAgICAgICAgICBub2RlLnZvbHVtZSA9IHNvdW5kLl92b2x1bWUgKiBIb3dsZXIudm9sdW1lKCk7XG4gICAgICAgICAgbm9kZS5wbGF5YmFja1JhdGUgPSBzb3VuZC5fcmF0ZTtcblxuICAgICAgICAgIC8vIFNvbWUgYnJvd3NlcnMgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGlzIGlzIGNhbGxlZCB3aXRob3V0IHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBwbGF5ID0gbm9kZS5wbGF5KCk7XG5cbiAgICAgICAgICAgIC8vIFN1cHBvcnQgb2xkZXIgYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHByb21pc2VzLCBhbmQgdGh1cyBkb24ndCBoYXZlIHRoaXMgaXNzdWUuXG4gICAgICAgICAgICBpZiAocGxheSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgKHBsYXkgaW5zdGFuY2VvZiBQcm9taXNlIHx8IHR5cGVvZiBwbGF5LnRoZW4gPT09ICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgICAgIC8vIEltcGxlbWVudHMgYSBsb2NrIHRvIHByZXZlbnQgRE9NRXhjZXB0aW9uOiBUaGUgcGxheSgpIHJlcXVlc3Qgd2FzIGludGVycnVwdGVkIGJ5IGEgY2FsbCB0byBwYXVzZSgpLlxuICAgICAgICAgICAgICBzZWxmLl9wbGF5TG9jayA9IHRydWU7XG5cbiAgICAgICAgICAgICAgLy8gU2V0IHBhcmFtIHZhbHVlcyBpbW1lZGlhdGVseS5cbiAgICAgICAgICAgICAgc2V0UGFyYW1zKCk7XG5cbiAgICAgICAgICAgICAgLy8gUmVsZWFzZXMgdGhlIGxvY2sgYW5kIGV4ZWN1dGVzIHF1ZXVlZCBhY3Rpb25zLlxuICAgICAgICAgICAgICBwbGF5XG4gICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLl9wbGF5TG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgbm9kZS5fdW5sb2NrZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbWl0KCdwbGF5Jywgc291bmQuX2lkKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9hZFF1ZXVlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICBzZWxmLl9wbGF5TG9jayA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgc2VsZi5fZW1pdCgncGxheWVycm9yJywgc291bmQuX2lkLCAnUGxheWJhY2sgd2FzIHVuYWJsZSB0byBzdGFydC4gVGhpcyBpcyBtb3N0IGNvbW1vbmx5IGFuIGlzc3VlICcgK1xuICAgICAgICAgICAgICAgICAgICAnb24gbW9iaWxlIGRldmljZXMgYW5kIENocm9tZSB3aGVyZSBwbGF5YmFjayB3YXMgbm90IHdpdGhpbiBhIHVzZXIgaW50ZXJhY3Rpb24uJyk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBlbmRlZCBhbmQgcGF1c2VkIHZhbHVlcy5cbiAgICAgICAgICAgICAgICAgIHNvdW5kLl9lbmRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBzb3VuZC5fcGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWludGVybmFsKSB7XG4gICAgICAgICAgICAgIHNlbGYuX3BsYXlMb2NrID0gZmFsc2U7XG4gICAgICAgICAgICAgIHNldFBhcmFtcygpO1xuICAgICAgICAgICAgICBzZWxmLl9lbWl0KCdwbGF5Jywgc291bmQuX2lkKTtcbiAgICAgICAgICAgICAgc2VsZi5fbG9hZFF1ZXVlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldHRpbmcgcmF0ZSBiZWZvcmUgcGxheWluZyB3b24ndCB3b3JrIGluIElFLCBzbyB3ZSBzZXQgaXQgYWdhaW4gaGVyZS5cbiAgICAgICAgICAgIG5vZGUucGxheWJhY2tSYXRlID0gc291bmQuX3JhdGU7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIHN0aWxsIHBhdXNlZCwgdGhlbiB3ZSBjYW4gYXNzdW1lIHRoZXJlIHdhcyBhIHBsYXliYWNrIGlzc3VlLlxuICAgICAgICAgICAgaWYgKG5vZGUucGF1c2VkKSB7XG4gICAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3BsYXllcnJvcicsIHNvdW5kLl9pZCwgJ1BsYXliYWNrIHdhcyB1bmFibGUgdG8gc3RhcnQuIFRoaXMgaXMgbW9zdCBjb21tb25seSBhbiBpc3N1ZSAnICtcbiAgICAgICAgICAgICAgICAnb24gbW9iaWxlIGRldmljZXMgYW5kIENocm9tZSB3aGVyZSBwbGF5YmFjayB3YXMgbm90IHdpdGhpbiBhIHVzZXIgaW50ZXJhY3Rpb24uJyk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2V0dXAgdGhlIGVuZCB0aW1lciBvbiBzcHJpdGVzIG9yIGxpc3RlbiBmb3IgdGhlIGVuZGVkIGV2ZW50LlxuICAgICAgICAgICAgaWYgKHNwcml0ZSAhPT0gJ19fZGVmYXVsdCcgfHwgc291bmQuX2xvb3ApIHtcbiAgICAgICAgICAgICAgc2VsZi5fZW5kVGltZXJzW3NvdW5kLl9pZF0gPSBzZXRUaW1lb3V0KHNlbGYuX2VuZGVkLmJpbmQoc2VsZiwgc291bmQpLCB0aW1lb3V0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZSBlbmRlZCBvbiB0aGlzIGF1ZGlvIG5vZGUuXG4gICAgICAgICAgICAgICAgc2VsZi5fZW5kZWQoc291bmQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhpcyBsaXN0ZW5lci5cbiAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc2VsZi5fZW5kVGltZXJzW3NvdW5kLl9pZF0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdlbmRlZCcsIHNlbGYuX2VuZFRpbWVyc1tzb3VuZC5faWRdLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBzZWxmLl9lbWl0KCdwbGF5ZXJyb3InLCBzb3VuZC5faWQsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgc3RyZWFtaW5nIGF1ZGlvLCBtYWtlIHN1cmUgdGhlIHNyYyBpcyBzZXQgYW5kIGxvYWQgYWdhaW4uXG4gICAgICAgIGlmIChub2RlLnNyYyA9PT0gJ2RhdGE6YXVkaW8vd2F2O2Jhc2U2NCxVa2xHUmlnQUFBQlhRVlpGWm0xMElCSUFBQUFCQUFFQVJLd0FBSWhZQVFBQ0FCQUFBQUJrWVhSaEFnQUFBQUVBJykge1xuICAgICAgICAgIG5vZGUuc3JjID0gc2VsZi5fc3JjO1xuICAgICAgICAgIG5vZGUubG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGxheSBpbW1lZGlhdGVseSBpZiByZWFkeSwgb3Igd2FpdCBmb3IgdGhlICdjYW5wbGF5dGhyb3VnaCdlIHZlbnQuXG4gICAgICAgIHZhciBsb2FkZWROb1JlYWR5U3RhdGUgPSAod2luZG93ICYmIHdpbmRvdy5lamVjdGEpIHx8ICghbm9kZS5yZWFkeVN0YXRlICYmIEhvd2xlci5fbmF2aWdhdG9yLmlzQ29jb29uSlMpO1xuICAgICAgICBpZiAobm9kZS5yZWFkeVN0YXRlID49IDMgfHwgbG9hZGVkTm9SZWFkeVN0YXRlKSB7XG4gICAgICAgICAgcGxheUh0bWw1KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi5fcGxheUxvY2sgPSB0cnVlO1xuXG4gICAgICAgICAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBCZWdpbiBwbGF5YmFjay5cbiAgICAgICAgICAgIHBsYXlIdG1sNSgpO1xuXG4gICAgICAgICAgICAvLyBDbGVhciB0aGlzIGxpc3RlbmVyLlxuICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBsaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBsaXN0ZW5lciwgZmFsc2UpO1xuXG4gICAgICAgICAgLy8gQ2FuY2VsIHRoZSBlbmQgdGltZXIuXG4gICAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihzb3VuZC5faWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzb3VuZC5faWQ7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFBhdXNlIHBsYXliYWNrIGFuZCBzYXZlIGN1cnJlbnQgcG9zaXRpb24uXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBUaGUgc291bmQgSUQgKGVtcHR5IHRvIHBhdXNlIGFsbCBpbiBncm91cCkuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBwYXVzZTogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQgb3IgYSBwbGF5KCkgcHJvbWlzZSBpcyBwZW5kaW5nLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gcGF1c2Ugd2hlbiBjYXBhYmxlLlxuICAgICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJyB8fCBzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogJ3BhdXNlJyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5wYXVzZShpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gaWQgaXMgcGFzc2VkLCBnZXQgYWxsIElEJ3MgdG8gYmUgcGF1c2VkLlxuICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcblxuICAgICAgZm9yICh2YXIgaT0wOyBpPGlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBDbGVhciB0aGUgZW5kIHRpbWVyLlxuICAgICAgICBzZWxmLl9jbGVhclRpbWVyKGlkc1tpXSk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgICAgaWYgKHNvdW5kICYmICFzb3VuZC5fcGF1c2VkKSB7XG4gICAgICAgICAgLy8gUmVzZXQgdGhlIHNlZWsgcG9zaXRpb24uXG4gICAgICAgICAgc291bmQuX3NlZWsgPSBzZWxmLnNlZWsoaWRzW2ldKTtcbiAgICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSAwO1xuICAgICAgICAgIHNvdW5kLl9wYXVzZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gU3RvcCBjdXJyZW50bHkgcnVubmluZyBmYWRlcy5cbiAgICAgICAgICBzZWxmLl9zdG9wRmFkZShpZHNbaV0pO1xuXG4gICAgICAgICAgaWYgKHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzb3VuZCBoYXMgYmVlbiBjcmVhdGVkLlxuICAgICAgICAgICAgICBpZiAoIXNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uuc3RvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uubm90ZU9mZigwKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uuc3RvcCgwKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSBidWZmZXIgc291cmNlLlxuICAgICAgICAgICAgICBzZWxmLl9jbGVhbkJ1ZmZlcihzb3VuZC5fbm9kZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc05hTihzb3VuZC5fbm9kZS5kdXJhdGlvbikgfHwgc291bmQuX25vZGUuZHVyYXRpb24gPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLnBhdXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyZSB0aGUgcGF1c2UgZXZlbnQsIHVubGVzcyBgdHJ1ZWAgaXMgcGFzc2VkIGFzIHRoZSAybmQgYXJndW1lbnQuXG4gICAgICAgIGlmICghYXJndW1lbnRzWzFdKSB7XG4gICAgICAgICAgc2VsZi5fZW1pdCgncGF1c2UnLCBzb3VuZCA/IHNvdW5kLl9pZCA6IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTdG9wIHBsYXliYWNrIGFuZCByZXNldCB0byBzdGFydC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIFRoZSBzb3VuZCBJRCAoZW1wdHkgdG8gc3RvcCBhbGwgaW4gZ3JvdXApLlxuICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IGludGVybmFsIEludGVybmFsIFVzZTogdHJ1ZSBwcmV2ZW50cyBldmVudCBmaXJpbmcuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBzdG9wOiBmdW5jdGlvbihpZCwgaW50ZXJuYWwpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBzdG9wIHdoZW4gY2FwYWJsZS5cbiAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcgfHwgc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdzdG9wJyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5zdG9wKGlkLCBpbnRlcm5hbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gaWQgaXMgcGFzc2VkLCBnZXQgYWxsIElEJ3MgdG8gYmUgc3RvcHBlZC5cbiAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGVuZCB0aW1lci5cbiAgICAgICAgc2VsZi5fY2xlYXJUaW1lcihpZHNbaV0pO1xuXG4gICAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAgIC8vIFJlc2V0IHRoZSBzZWVrIHBvc2l0aW9uLlxuICAgICAgICAgIHNvdW5kLl9zZWVrID0gc291bmQuX3N0YXJ0IHx8IDA7XG4gICAgICAgICAgc291bmQuX3JhdGVTZWVrID0gMDtcbiAgICAgICAgICBzb3VuZC5fcGF1c2VkID0gdHJ1ZTtcbiAgICAgICAgICBzb3VuZC5fZW5kZWQgPSB0cnVlO1xuXG4gICAgICAgICAgLy8gU3RvcCBjdXJyZW50bHkgcnVubmluZyBmYWRlcy5cbiAgICAgICAgICBzZWxmLl9zdG9wRmFkZShpZHNbaV0pO1xuXG4gICAgICAgICAgaWYgKHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBzb3VuZCdzIEF1ZGlvQnVmZmVyU291cmNlTm9kZSBoYXMgYmVlbiBjcmVhdGVkLlxuICAgICAgICAgICAgICBpZiAoc291bmQuX25vZGUuYnVmZmVyU291cmNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uuc3RvcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5ub3RlT2ZmKDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2Uuc3RvcCgwKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCB0aGUgYnVmZmVyIHNvdXJjZS5cbiAgICAgICAgICAgICAgICBzZWxmLl9jbGVhbkJ1ZmZlcihzb3VuZC5fbm9kZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzTmFOKHNvdW5kLl9ub2RlLmR1cmF0aW9uKSB8fCBzb3VuZC5fbm9kZS5kdXJhdGlvbiA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUuY3VycmVudFRpbWUgPSBzb3VuZC5fc3RhcnQgfHwgMDtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUucGF1c2UoKTtcblxuICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGl2ZSBzdHJlYW0sIHN0b3AgZG93bmxvYWQgb25jZSB0aGUgYXVkaW8gaXMgc3RvcHBlZC5cbiAgICAgICAgICAgICAgaWYgKHNvdW5kLl9ub2RlLmR1cmF0aW9uID09PSBJbmZpbml0eSkge1xuICAgICAgICAgICAgICAgIHNlbGYuX2NsZWFyU291bmQoc291bmQuX25vZGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFpbnRlcm5hbCkge1xuICAgICAgICAgICAgc2VsZi5fZW1pdCgnc3RvcCcsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBNdXRlL3VubXV0ZSBhIHNpbmdsZSBzb3VuZCBvciBhbGwgc291bmRzIGluIHRoaXMgSG93bCBncm91cC5cbiAgICAgKiBAcGFyYW0gIHtCb29sZWFufSBtdXRlZCBTZXQgdG8gdHJ1ZSB0byBtdXRlIGFuZCBmYWxzZSB0byB1bm11dGUuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAgICBUaGUgc291bmQgSUQgdG8gdXBkYXRlIChvbWl0IHRvIG11dGUvdW5tdXRlIGFsbCkuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBtdXRlOiBmdW5jdGlvbihtdXRlZCwgaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBtdXRlIHdoZW4gY2FwYWJsZS5cbiAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCd8fCBzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICBldmVudDogJ211dGUnLFxuICAgICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBzZWxmLm11dGUobXV0ZWQsIGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBzZWxmO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBhcHBseWluZyBtdXRlL3VubXV0ZSB0byBhbGwgc291bmRzLCB1cGRhdGUgdGhlIGdyb3VwJ3MgdmFsdWUuXG4gICAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAodHlwZW9mIG11dGVkID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBzZWxmLl9tdXRlZCA9IG11dGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzZWxmLl9tdXRlZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBpZCBpcyBwYXNzZWQsIGdldCBhbGwgSUQncyB0byBiZSBtdXRlZC5cbiAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gR2V0IHRoZSBzb3VuZC5cbiAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgICAgc291bmQuX211dGVkID0gbXV0ZWQ7XG5cbiAgICAgICAgICAvLyBDYW5jZWwgYWN0aXZlIGZhZGUgYW5kIHNldCB0aGUgdm9sdW1lIHRvIHRoZSBlbmQgdmFsdWUuXG4gICAgICAgICAgaWYgKHNvdW5kLl9pbnRlcnZhbCkge1xuICAgICAgICAgICAgc2VsZi5fc3RvcEZhZGUoc291bmQuX2lkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8gJiYgc291bmQuX25vZGUpIHtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUobXV0ZWQgPyAwIDogc291bmQuX3ZvbHVtZSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgc291bmQuX25vZGUubXV0ZWQgPSBIb3dsZXIuX211dGVkID8gdHJ1ZSA6IG11dGVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNlbGYuX2VtaXQoJ211dGUnLCBzb3VuZC5faWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQvc2V0IHRoZSB2b2x1bWUgb2YgdGhpcyBzb3VuZCBvciBvZiB0aGUgSG93bCBncm91cC4gVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbHkgdGFrZSAwLCAxIG9yIDIgYXJndW1lbnRzLlxuICAgICAqICAgdm9sdW1lKCkgLT4gUmV0dXJucyB0aGUgZ3JvdXAncyB2b2x1bWUgdmFsdWUuXG4gICAgICogICB2b2x1bWUoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgY3VycmVudCB2b2x1bWUuXG4gICAgICogICB2b2x1bWUodm9sKSAtPiBTZXRzIHRoZSB2b2x1bWUgb2YgYWxsIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICogICB2b2x1bWUodm9sLCBpZCkgLT4gU2V0cyB0aGUgdm9sdW1lIG9mIHBhc3NlZCBzb3VuZCBpZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsL051bWJlcn0gUmV0dXJucyBzZWxmIG9yIGN1cnJlbnQgdm9sdW1lLlxuICAgICAqL1xuICAgIHZvbHVtZTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIHZhciB2b2wsIGlkO1xuXG4gICAgICAvLyBEZXRlcm1pbmUgdGhlIHZhbHVlcyBiYXNlZCBvbiBhcmd1bWVudHMuXG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgZ3JvdXBzJyB2b2x1bWUuXG4gICAgICAgIHJldHVybiBzZWxmLl92b2x1bWU7XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxIHx8IGFyZ3MubGVuZ3RoID09PSAyICYmIHR5cGVvZiBhcmdzWzFdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGlzIGlzIGFuIElELCBhbmQgaWYgbm90LCBhc3N1bWUgaXQgaXMgYSBuZXcgdm9sdW1lLlxuICAgICAgICB2YXIgaWRzID0gc2VsZi5fZ2V0U291bmRJZHMoKTtcbiAgICAgICAgdmFyIGluZGV4ID0gaWRzLmluZGV4T2YoYXJnc1swXSk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgaWQgPSBwYXJzZUludChhcmdzWzBdLCAxMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdm9sID0gcGFyc2VGbG9hdChhcmdzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHZvbCA9IHBhcnNlRmxvYXQoYXJnc1swXSk7XG4gICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1sxXSwgMTApO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgdGhlIHZvbHVtZSBvciByZXR1cm4gdGhlIGN1cnJlbnQgdm9sdW1lLlxuICAgICAgdmFyIHNvdW5kO1xuICAgICAgaWYgKHR5cGVvZiB2b2wgIT09ICd1bmRlZmluZWQnICYmIHZvbCA+PSAwICYmIHZvbCA8PSAxKSB7XG4gICAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gY2hhbmdlIHZvbHVtZSB3aGVuIGNhcGFibGUuXG4gICAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCd8fCBzZWxmLl9wbGF5TG9jaykge1xuICAgICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgICAgZXZlbnQ6ICd2b2x1bWUnLFxuICAgICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgc2VsZi52b2x1bWUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgZ3JvdXAgdm9sdW1lLlxuICAgICAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHNlbGYuX3ZvbHVtZSA9IHZvbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBvbmUgb3IgYWxsIHZvbHVtZXMuXG4gICAgICAgIGlkID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgICAgICBmb3IgKHZhciBpPTA7IGk8aWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkW2ldKTtcblxuICAgICAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAgICAgc291bmQuX3ZvbHVtZSA9IHZvbDtcblxuICAgICAgICAgICAgLy8gU3RvcCBjdXJyZW50bHkgcnVubmluZyBmYWRlcy5cbiAgICAgICAgICAgIGlmICghYXJnc1syXSkge1xuICAgICAgICAgICAgICBzZWxmLl9zdG9wRmFkZShpZFtpXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSAmJiAhc291bmQuX211dGVkKSB7XG4gICAgICAgICAgICAgIHNvdW5kLl9ub2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUodm9sLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc291bmQuX25vZGUgJiYgIXNvdW5kLl9tdXRlZCkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS52b2x1bWUgPSB2b2wgKiBIb3dsZXIudm9sdW1lKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3ZvbHVtZScsIHNvdW5kLl9pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzb3VuZCA9IGlkID8gc2VsZi5fc291bmRCeUlkKGlkKSA6IHNlbGYuX3NvdW5kc1swXTtcbiAgICAgICAgcmV0dXJuIHNvdW5kID8gc291bmQuX3ZvbHVtZSA6IDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBGYWRlIGEgY3VycmVudGx5IHBsYXlpbmcgc291bmQgYmV0d2VlbiB0d28gdm9sdW1lcyAoaWYgbm8gaWQgaXMgcGFzc2VkLCBhbGwgc291bmRzIHdpbGwgZmFkZSkuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBmcm9tIFRoZSB2YWx1ZSB0byBmYWRlIGZyb20gKDAuMCB0byAxLjApLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gdG8gICBUaGUgdm9sdW1lIHRvIGZhZGUgdG8gKDAuMCB0byAxLjApLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gbGVuICBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byBmYWRlLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgICBUaGUgc291bmQgaWQgKG9taXQgdG8gZmFkZSBhbGwgc291bmRzKS5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIGZhZGU6IGZ1bmN0aW9uKGZyb20sIHRvLCBsZW4sIGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gZmFkZSB3aGVuIGNhcGFibGUuXG4gICAgICBpZiAoc2VsZi5fc3RhdGUgIT09ICdsb2FkZWQnIHx8IHNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICAgIGV2ZW50OiAnZmFkZScsXG4gICAgICAgICAgYWN0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHNlbGYuZmFkZShmcm9tLCB0bywgbGVuLCBpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIHRoZSB0by9mcm9tL2xlbiB2YWx1ZXMgYXJlIG51bWJlcnMuXG4gICAgICBmcm9tID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgcGFyc2VGbG9hdChmcm9tKSksIDEpO1xuICAgICAgdG8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCBwYXJzZUZsb2F0KHRvKSksIDEpO1xuICAgICAgbGVuID0gcGFyc2VGbG9hdChsZW4pO1xuXG4gICAgICAvLyBTZXQgdGhlIHZvbHVtZSB0byB0aGUgc3RhcnQgcG9zaXRpb24uXG4gICAgICBzZWxmLnZvbHVtZShmcm9tLCBpZCk7XG5cbiAgICAgIC8vIEZhZGUgdGhlIHZvbHVtZSBvZiBvbmUgb3IgYWxsIHNvdW5kcy5cbiAgICAgIHZhciBpZHMgPSBzZWxmLl9nZXRTb3VuZElkcyhpZCk7XG4gICAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICAgIHZhciBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIGxpbmVhciBmYWRlIG9yIGZhbGwgYmFjayB0byB0aW1lb3V0cyB3aXRoIEhUTUw1IEF1ZGlvLlxuICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICAvLyBTdG9wIHRoZSBwcmV2aW91cyBmYWRlIGlmIG5vIHNwcml0ZSBpcyBiZWluZyB1c2VkIChvdGhlcndpc2UsIHZvbHVtZSBoYW5kbGVzIHRoaXMpLlxuICAgICAgICAgIGlmICghaWQpIHtcbiAgICAgICAgICAgIHNlbGYuX3N0b3BGYWRlKGlkc1tpXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIFdlYiBBdWRpbywgbGV0IHRoZSBuYXRpdmUgbWV0aG9kcyBkbyB0aGUgYWN0dWFsIGZhZGUuXG4gICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmICFzb3VuZC5fbXV0ZWQpIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50VGltZSA9IEhvd2xlci5jdHguY3VycmVudFRpbWU7XG4gICAgICAgICAgICB2YXIgZW5kID0gY3VycmVudFRpbWUgKyAobGVuIC8gMTAwMCk7XG4gICAgICAgICAgICBzb3VuZC5fdm9sdW1lID0gZnJvbTtcbiAgICAgICAgICAgIHNvdW5kLl9ub2RlLmdhaW4uc2V0VmFsdWVBdFRpbWUoZnJvbSwgY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgc291bmQuX25vZGUuZ2Fpbi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSh0bywgZW5kKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLl9zdGFydEZhZGVJbnRlcnZhbChzb3VuZCwgZnJvbSwgdG8sIGxlbiwgaWRzW2ldLCB0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRoZSBpbnRlcm5hbCBpbnRlcnZhbCB0byBmYWRlIGEgc291bmQuXG4gICAgICogQHBhcmFtICB7T2JqZWN0fSBzb3VuZCBSZWZlcmVuY2UgdG8gc291bmQgdG8gZmFkZS5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGZyb20gVGhlIHZhbHVlIHRvIGZhZGUgZnJvbSAoMC4wIHRvIDEuMCkuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSB0byAgIFRoZSB2b2x1bWUgdG8gZmFkZSB0byAoMC4wIHRvIDEuMCkuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBsZW4gIFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGZhZGUuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCAgIFRoZSBzb3VuZCBpZCB0byBmYWRlLlxuICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IGlzR3JvdXAgICBJZiB0cnVlLCBzZXQgdGhlIHZvbHVtZSBvbiB0aGUgZ3JvdXAuXG4gICAgICovXG4gICAgX3N0YXJ0RmFkZUludGVydmFsOiBmdW5jdGlvbihzb3VuZCwgZnJvbSwgdG8sIGxlbiwgaWQsIGlzR3JvdXApIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciB2b2wgPSBmcm9tO1xuICAgICAgdmFyIGRpZmYgPSB0byAtIGZyb207XG4gICAgICB2YXIgc3RlcHMgPSBNYXRoLmFicyhkaWZmIC8gMC4wMSk7XG4gICAgICB2YXIgc3RlcExlbiA9IE1hdGgubWF4KDQsIChzdGVwcyA+IDApID8gbGVuIC8gc3RlcHMgOiBsZW4pO1xuICAgICAgdmFyIGxhc3RUaWNrID0gRGF0ZS5ub3coKTtcblxuICAgICAgLy8gU3RvcmUgdGhlIHZhbHVlIGJlaW5nIGZhZGVkIHRvLlxuICAgICAgc291bmQuX2ZhZGVUbyA9IHRvO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIHZvbHVtZSB2YWx1ZSBvbiBlYWNoIGludGVydmFsIHRpY2suXG4gICAgICBzb3VuZC5faW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSB2b2x1bWUgYmFzZWQgb24gdGhlIHRpbWUgc2luY2UgdGhlIGxhc3QgdGljay5cbiAgICAgICAgdmFyIHRpY2sgPSAoRGF0ZS5ub3coKSAtIGxhc3RUaWNrKSAvIGxlbjtcbiAgICAgICAgbGFzdFRpY2sgPSBEYXRlLm5vdygpO1xuICAgICAgICB2b2wgKz0gZGlmZiAqIHRpY2s7XG5cbiAgICAgICAgLy8gUm91bmQgdG8gd2l0aGluIDIgZGVjaW1hbCBwb2ludHMuXG4gICAgICAgIHZvbCA9IE1hdGgucm91bmQodm9sICogMTAwKSAvIDEwMDtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHZvbHVtZSBpcyBpbiB0aGUgcmlnaHQgYm91bmRzLlxuICAgICAgICBpZiAoZGlmZiA8IDApIHtcbiAgICAgICAgICB2b2wgPSBNYXRoLm1heCh0bywgdm9sKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2b2wgPSBNYXRoLm1pbih0bywgdm9sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoYW5nZSB0aGUgdm9sdW1lLlxuICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICBzb3VuZC5fdm9sdW1lID0gdm9sO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYudm9sdW1lKHZvbCwgc291bmQuX2lkLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgZ3JvdXAncyB2b2x1bWUuXG4gICAgICAgIGlmIChpc0dyb3VwKSB7XG4gICAgICAgICAgc2VsZi5fdm9sdW1lID0gdm9sO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiB0aGUgZmFkZSBpcyBjb21wbGV0ZSwgc3RvcCBpdCBhbmQgZmlyZSBldmVudC5cbiAgICAgICAgaWYgKCh0byA8IGZyb20gJiYgdm9sIDw9IHRvKSB8fCAodG8gPiBmcm9tICYmIHZvbCA+PSB0bykpIHtcbiAgICAgICAgICBjbGVhckludGVydmFsKHNvdW5kLl9pbnRlcnZhbCk7XG4gICAgICAgICAgc291bmQuX2ludGVydmFsID0gbnVsbDtcbiAgICAgICAgICBzb3VuZC5fZmFkZVRvID0gbnVsbDtcbiAgICAgICAgICBzZWxmLnZvbHVtZSh0bywgc291bmQuX2lkKTtcbiAgICAgICAgICBzZWxmLl9lbWl0KCdmYWRlJywgc291bmQuX2lkKTtcbiAgICAgICAgfVxuICAgICAgfSwgc3RlcExlbik7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIG1ldGhvZCB0aGF0IHN0b3BzIHRoZSBjdXJyZW50bHkgcGxheWluZyBmYWRlIHdoZW5cbiAgICAgKiBhIG5ldyBmYWRlIHN0YXJ0cywgdm9sdW1lIGlzIGNoYW5nZWQgb3IgdGhlIHNvdW5kIGlzIHN0b3BwZWQuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBUaGUgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfc3RvcEZhZGU6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWQpO1xuXG4gICAgICBpZiAoc291bmQgJiYgc291bmQuX2ludGVydmFsKSB7XG4gICAgICAgIGlmIChzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgIHNvdW5kLl9ub2RlLmdhaW4uY2FuY2VsU2NoZWR1bGVkVmFsdWVzKEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xlYXJJbnRlcnZhbChzb3VuZC5faW50ZXJ2YWwpO1xuICAgICAgICBzb3VuZC5faW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICBzZWxmLnZvbHVtZShzb3VuZC5fZmFkZVRvLCBpZCk7XG4gICAgICAgIHNvdW5kLl9mYWRlVG8gPSBudWxsO1xuICAgICAgICBzZWxmLl9lbWl0KCdmYWRlJywgaWQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgbG9vcCBwYXJhbWV0ZXIgb24gYSBzb3VuZC4gVGhpcyBtZXRob2QgY2FuIG9wdGlvbmFsbHkgdGFrZSAwLCAxIG9yIDIgYXJndW1lbnRzLlxuICAgICAqICAgbG9vcCgpIC0+IFJldHVybnMgdGhlIGdyb3VwJ3MgbG9vcCB2YWx1ZS5cbiAgICAgKiAgIGxvb3AoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgbG9vcCB2YWx1ZS5cbiAgICAgKiAgIGxvb3AobG9vcCkgLT4gU2V0cyB0aGUgbG9vcCB2YWx1ZSBmb3IgYWxsIHNvdW5kcyBpbiB0aGlzIEhvd2wgZ3JvdXAuXG4gICAgICogICBsb29wKGxvb3AsIGlkKSAtPiBTZXRzIHRoZSBsb29wIHZhbHVlIG9mIHBhc3NlZCBzb3VuZCBpZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsL0Jvb2xlYW59IFJldHVybnMgc2VsZiBvciBjdXJyZW50IGxvb3AgdmFsdWUuXG4gICAgICovXG4gICAgbG9vcDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIHZhciBsb29wLCBpZCwgc291bmQ7XG5cbiAgICAgIC8vIERldGVybWluZSB0aGUgdmFsdWVzIGZvciBsb29wIGFuZCBpZC5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIGdyb3UncyBsb29wIHZhbHVlLlxuICAgICAgICByZXR1cm4gc2VsZi5fbG9vcDtcbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICBsb29wID0gYXJnc1swXTtcbiAgICAgICAgICBzZWxmLl9sb29wID0gbG9vcDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBSZXR1cm4gdGhpcyBzb3VuZCdzIGxvb3AgdmFsdWUuXG4gICAgICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQocGFyc2VJbnQoYXJnc1swXSwgMTApKTtcbiAgICAgICAgICByZXR1cm4gc291bmQgPyBzb3VuZC5fbG9vcCA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGxvb3AgPSBhcmdzWzBdO1xuICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gaWQgaXMgcGFzc2VkLCBnZXQgYWxsIElEJ3MgdG8gYmUgbG9vcGVkLlxuICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICAgIGZvciAodmFyIGk9MDsgaTxpZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWRzW2ldKTtcblxuICAgICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgICBzb3VuZC5fbG9vcCA9IGxvb3A7XG4gICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmIHNvdW5kLl9ub2RlICYmIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSkge1xuICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3AgPSBsb29wO1xuICAgICAgICAgICAgaWYgKGxvb3ApIHtcbiAgICAgICAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3BTdGFydCA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UubG9vcEVuZCA9IHNvdW5kLl9zdG9wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0L3NldCB0aGUgcGxheWJhY2sgcmF0ZSBvZiBhIHNvdW5kLiBUaGlzIG1ldGhvZCBjYW4gb3B0aW9uYWxseSB0YWtlIDAsIDEgb3IgMiBhcmd1bWVudHMuXG4gICAgICogICByYXRlKCkgLT4gUmV0dXJucyB0aGUgZmlyc3Qgc291bmQgbm9kZSdzIGN1cnJlbnQgcGxheWJhY2sgcmF0ZS5cbiAgICAgKiAgIHJhdGUoaWQpIC0+IFJldHVybnMgdGhlIHNvdW5kIGlkJ3MgY3VycmVudCBwbGF5YmFjayByYXRlLlxuICAgICAqICAgcmF0ZShyYXRlKSAtPiBTZXRzIHRoZSBwbGF5YmFjayByYXRlIG9mIGFsbCBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgICAqICAgcmF0ZShyYXRlLCBpZCkgLT4gU2V0cyB0aGUgcGxheWJhY2sgcmF0ZSBvZiBwYXNzZWQgc291bmQgaWQuXG4gICAgICogQHJldHVybiB7SG93bC9OdW1iZXJ9IFJldHVybnMgc2VsZiBvciB0aGUgY3VycmVudCBwbGF5YmFjayByYXRlLlxuICAgICAqL1xuICAgIHJhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICB2YXIgcmF0ZSwgaWQ7XG5cbiAgICAgIC8vIERldGVybWluZSB0aGUgdmFsdWVzIGJhc2VkIG9uIGFyZ3VtZW50cy5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBXZSB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgcmF0ZSBvZiB0aGUgZmlyc3Qgbm9kZS5cbiAgICAgICAgaWQgPSBzZWxmLl9zb3VuZHNbMF0uX2lkO1xuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGlzIGlzIGFuIElELCBhbmQgaWYgbm90LCBhc3N1bWUgaXQgaXMgYSBuZXcgcmF0ZSB2YWx1ZS5cbiAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKCk7XG4gICAgICAgIHZhciBpbmRleCA9IGlkcy5pbmRleE9mKGFyZ3NbMF0pO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1swXSwgMTApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJhdGUgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIHJhdGUgPSBwYXJzZUZsb2F0KGFyZ3NbMF0pO1xuICAgICAgICBpZCA9IHBhcnNlSW50KGFyZ3NbMV0sIDEwKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHRoZSBwbGF5YmFjayByYXRlIG9yIHJldHVybiB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgIHZhciBzb3VuZDtcbiAgICAgIGlmICh0eXBlb2YgcmF0ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBjaGFuZ2UgcGxheWJhY2sgcmF0ZSB3aGVuIGNhcGFibGUuXG4gICAgICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcgfHwgc2VsZi5fcGxheUxvY2spIHtcbiAgICAgICAgICBzZWxmLl9xdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgIGV2ZW50OiAncmF0ZScsXG4gICAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBzZWxmLnJhdGUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgZ3JvdXAgcmF0ZS5cbiAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBzZWxmLl9yYXRlID0gcmF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBvbmUgb3IgYWxsIHZvbHVtZXMuXG4gICAgICAgIGlkID0gc2VsZi5fZ2V0U291bmRJZHMoaWQpO1xuICAgICAgICBmb3IgKHZhciBpPTA7IGk8aWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgICAgIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkW2ldKTtcblxuICAgICAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBvdXIgcG9zaXRpb24gd2hlbiB0aGUgcmF0ZSBjaGFuZ2VkIGFuZCB1cGRhdGUgdGhlIHBsYXliYWNrXG4gICAgICAgICAgICAvLyBzdGFydCBwb3NpdGlvbiBzbyB3ZSBjYW4gcHJvcGVybHkgYWRqdXN0IHRoZSBzZWVrIHBvc2l0aW9uIGZvciB0aW1lIGVsYXBzZWQuXG4gICAgICAgICAgICBpZiAoc2VsZi5wbGF5aW5nKGlkW2ldKSkge1xuICAgICAgICAgICAgICBzb3VuZC5fcmF0ZVNlZWsgPSBzZWxmLnNlZWsoaWRbaV0pO1xuICAgICAgICAgICAgICBzb3VuZC5fcGxheVN0YXJ0ID0gc2VsZi5fd2ViQXVkaW8gPyBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lIDogc291bmQuX3BsYXlTdGFydDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNvdW5kLl9yYXRlID0gcmF0ZTtcblxuICAgICAgICAgICAgLy8gQ2hhbmdlIHRoZSBwbGF5YmFjayByYXRlLlxuICAgICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmIHNvdW5kLl9ub2RlICYmIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZSkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UucGxheWJhY2tSYXRlLnNldFZhbHVlQXRUaW1lKHJhdGUsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgICBzb3VuZC5fbm9kZS5wbGF5YmFja1JhdGUgPSByYXRlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBSZXNldCB0aGUgdGltZXJzLlxuICAgICAgICAgICAgdmFyIHNlZWsgPSBzZWxmLnNlZWsoaWRbaV0pO1xuICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gKChzZWxmLl9zcHJpdGVbc291bmQuX3Nwcml0ZV1bMF0gKyBzZWxmLl9zcHJpdGVbc291bmQuX3Nwcml0ZV1bMV0pIC8gMTAwMCkgLSBzZWVrO1xuICAgICAgICAgICAgdmFyIHRpbWVvdXQgPSAoZHVyYXRpb24gKiAxMDAwKSAvIE1hdGguYWJzKHNvdW5kLl9yYXRlKTtcblxuICAgICAgICAgICAgLy8gU3RhcnQgYSBuZXcgZW5kIHRpbWVyIGlmIHNvdW5kIGlzIGFscmVhZHkgcGxheWluZy5cbiAgICAgICAgICAgIGlmIChzZWxmLl9lbmRUaW1lcnNbaWRbaV1dIHx8ICFzb3VuZC5fcGF1c2VkKSB7XG4gICAgICAgICAgICAgIHNlbGYuX2NsZWFyVGltZXIoaWRbaV0pO1xuICAgICAgICAgICAgICBzZWxmLl9lbmRUaW1lcnNbaWRbaV1dID0gc2V0VGltZW91dChzZWxmLl9lbmRlZC5iaW5kKHNlbGYsIHNvdW5kKSwgdGltZW91dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbGYuX2VtaXQoJ3JhdGUnLCBzb3VuZC5faWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWQpO1xuICAgICAgICByZXR1cm4gc291bmQgPyBzb3VuZC5fcmF0ZSA6IHNlbGYuX3JhdGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQvc2V0IHRoZSBzZWVrIHBvc2l0aW9uIG9mIGEgc291bmQuIFRoaXMgbWV0aG9kIGNhbiBvcHRpb25hbGx5IHRha2UgMCwgMSBvciAyIGFyZ3VtZW50cy5cbiAgICAgKiAgIHNlZWsoKSAtPiBSZXR1cm5zIHRoZSBmaXJzdCBzb3VuZCBub2RlJ3MgY3VycmVudCBzZWVrIHBvc2l0aW9uLlxuICAgICAqICAgc2VlayhpZCkgLT4gUmV0dXJucyB0aGUgc291bmQgaWQncyBjdXJyZW50IHNlZWsgcG9zaXRpb24uXG4gICAgICogICBzZWVrKHNlZWspIC0+IFNldHMgdGhlIHNlZWsgcG9zaXRpb24gb2YgdGhlIGZpcnN0IHNvdW5kIG5vZGUuXG4gICAgICogICBzZWVrKHNlZWssIGlkKSAtPiBTZXRzIHRoZSBzZWVrIHBvc2l0aW9uIG9mIHBhc3NlZCBzb3VuZCBpZC5cbiAgICAgKiBAcmV0dXJuIHtIb3dsL051bWJlcn0gUmV0dXJucyBzZWxmIG9yIHRoZSBjdXJyZW50IHNlZWsgcG9zaXRpb24uXG4gICAgICovXG4gICAgc2VlazogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIHZhciBzZWVrLCBpZDtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB2YWx1ZXMgYmFzZWQgb24gYXJndW1lbnRzLlxuICAgICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIFdlIHdpbGwgc2ltcGx5IHJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgbm9kZS5cbiAgICAgICAgaWQgPSBzZWxmLl9zb3VuZHNbMF0uX2lkO1xuICAgICAgfSBlbHNlIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGlzIGlzIGFuIElELCBhbmQgaWYgbm90LCBhc3N1bWUgaXQgaXMgYSBuZXcgc2VlayBwb3NpdGlvbi5cbiAgICAgICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKCk7XG4gICAgICAgIHZhciBpbmRleCA9IGlkcy5pbmRleE9mKGFyZ3NbMF0pO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1swXSwgMTApO1xuICAgICAgICB9IGVsc2UgaWYgKHNlbGYuX3NvdW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICBpZCA9IHNlbGYuX3NvdW5kc1swXS5faWQ7XG4gICAgICAgICAgc2VlayA9IHBhcnNlRmxvYXQoYXJnc1swXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgc2VlayA9IHBhcnNlRmxvYXQoYXJnc1swXSk7XG4gICAgICAgIGlkID0gcGFyc2VJbnQoYXJnc1sxXSwgMTApO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGVyZSBpcyBubyBJRCwgYmFpbCBvdXQuXG4gICAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gc2VsZjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBzZWVrIHdoZW4gY2FwYWJsZS5cbiAgICAgIGlmICh0eXBlb2Ygc2VlayA9PT0gJ251bWJlcicgJiYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJyB8fCBzZWxmLl9wbGF5TG9jaykpIHtcbiAgICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgICAgZXZlbnQ6ICdzZWVrJyxcbiAgICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5zZWVrLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgc291bmQuXG4gICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWQpO1xuXG4gICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZWVrID09PSAnbnVtYmVyJyAmJiBzZWVrID49IDApIHtcbiAgICAgICAgICAvLyBQYXVzZSB0aGUgc291bmQgYW5kIHVwZGF0ZSBwb3NpdGlvbiBmb3IgcmVzdGFydGluZyBwbGF5YmFjay5cbiAgICAgICAgICB2YXIgcGxheWluZyA9IHNlbGYucGxheWluZyhpZCk7XG4gICAgICAgICAgaWYgKHBsYXlpbmcpIHtcbiAgICAgICAgICAgIHNlbGYucGF1c2UoaWQsIHRydWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE1vdmUgdGhlIHBvc2l0aW9uIG9mIHRoZSB0cmFjayBhbmQgY2FuY2VsIHRpbWVyLlxuICAgICAgICAgIHNvdW5kLl9zZWVrID0gc2VlaztcbiAgICAgICAgICBzb3VuZC5fZW5kZWQgPSBmYWxzZTtcbiAgICAgICAgICBzZWxmLl9jbGVhclRpbWVyKGlkKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2VlayBwb3NpdGlvbiBmb3IgSFRNTDUgQXVkaW8uXG4gICAgICAgICAgaWYgKCFzZWxmLl93ZWJBdWRpbyAmJiBzb3VuZC5fbm9kZSAmJiAhaXNOYU4oc291bmQuX25vZGUuZHVyYXRpb24pKSB7XG4gICAgICAgICAgICBzb3VuZC5fbm9kZS5jdXJyZW50VGltZSA9IHNlZWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2VlayBhbmQgZW1pdCB3aGVuIHJlYWR5LlxuICAgICAgICAgIHZhciBzZWVrQW5kRW1pdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgc2VsZi5fZW1pdCgnc2VlaycsIGlkKTtcblxuICAgICAgICAgICAgLy8gUmVzdGFydCB0aGUgcGxheWJhY2sgaWYgdGhlIHNvdW5kIHdhcyBwbGF5aW5nLlxuICAgICAgICAgICAgaWYgKHBsYXlpbmcpIHtcbiAgICAgICAgICAgICAgc2VsZi5wbGF5KGlkLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHBsYXkgbG9jayB0byBiZSB1bnNldCBiZWZvcmUgZW1pdHRpbmcgKEhUTUw1IEF1ZGlvKS5cbiAgICAgICAgICBpZiAocGxheWluZyAmJiAhc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgIHZhciBlbWl0U2VlayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoIXNlbGYuX3BsYXlMb2NrKSB7XG4gICAgICAgICAgICAgICAgc2Vla0FuZEVtaXQoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGVtaXRTZWVrLCAwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZW1pdFNlZWssIDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWVrQW5kRW1pdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgICAgICAgIHZhciByZWFsVGltZSA9IHNlbGYucGxheWluZyhpZCkgPyBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lIC0gc291bmQuX3BsYXlTdGFydCA6IDA7XG4gICAgICAgICAgICB2YXIgcmF0ZVNlZWsgPSBzb3VuZC5fcmF0ZVNlZWsgPyBzb3VuZC5fcmF0ZVNlZWsgLSBzb3VuZC5fc2VlayA6IDA7XG4gICAgICAgICAgICByZXR1cm4gc291bmQuX3NlZWsgKyAocmF0ZVNlZWsgKyByZWFsVGltZSAqIE1hdGguYWJzKHNvdW5kLl9yYXRlKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VuZC5fbm9kZS5jdXJyZW50VGltZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgc3BlY2lmaWMgc291bmQgaXMgY3VycmVudGx5IHBsYXlpbmcgb3Igbm90IChpZiBpZCBpcyBwcm92aWRlZCksIG9yIGNoZWNrIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgc291bmRzIGluIHRoZSBncm91cCBpcyBwbGF5aW5nIG9yIG5vdC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9ICBpZCBUaGUgc291bmQgaWQgdG8gY2hlY2suIElmIG5vbmUgaXMgcGFzc2VkLCB0aGUgd2hvbGUgc291bmQgZ3JvdXAgaXMgY2hlY2tlZC5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBUcnVlIGlmIHBsYXlpbmcgYW5kIGZhbHNlIGlmIG5vdC5cbiAgICAgKi9cbiAgICBwbGF5aW5nOiBmdW5jdGlvbihpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBDaGVjayB0aGUgcGFzc2VkIHNvdW5kIElEIChpZiBhbnkpLlxuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkKTtcbiAgICAgICAgcmV0dXJuIHNvdW5kID8gIXNvdW5kLl9wYXVzZWQgOiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gT3RoZXJ3aXNlLCBsb29wIHRocm91Z2ggYWxsIHNvdW5kcyBhbmQgY2hlY2sgaWYgYW55IGFyZSBwbGF5aW5nLlxuICAgICAgZm9yICh2YXIgaT0wOyBpPHNlbGYuX3NvdW5kcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIXNlbGYuX3NvdW5kc1tpXS5fcGF1c2VkKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoaXMgc291bmQuIFBhc3NpbmcgYSBzb3VuZCBpZCB3aWxsIHJldHVybiB0aGUgc3ByaXRlIGR1cmF0aW9uLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgVGhlIHNvdW5kIGlkIHRvIGNoZWNrLiBJZiBub25lIGlzIHBhc3NlZCwgcmV0dXJuIGZ1bGwgc291cmNlIGR1cmF0aW9uLlxuICAgICAqIEByZXR1cm4ge051bWJlcn0gQXVkaW8gZHVyYXRpb24gaW4gc2Vjb25kcy5cbiAgICAgKi9cbiAgICBkdXJhdGlvbjogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBkdXJhdGlvbiA9IHNlbGYuX2R1cmF0aW9uO1xuXG4gICAgICAvLyBJZiB3ZSBwYXNzIGFuIElELCBnZXQgdGhlIHNvdW5kIGFuZCByZXR1cm4gdGhlIHNwcml0ZSBsZW5ndGguXG4gICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWQpO1xuICAgICAgaWYgKHNvdW5kKSB7XG4gICAgICAgIGR1cmF0aW9uID0gc2VsZi5fc3ByaXRlW3NvdW5kLl9zcHJpdGVdWzFdIC8gMTAwMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGR1cmF0aW9uO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxvYWRlZCBzdGF0ZSBvZiB0aGlzIEhvd2wuXG4gICAgICogQHJldHVybiB7U3RyaW5nfSAndW5sb2FkZWQnLCAnbG9hZGluZycsICdsb2FkZWQnXG4gICAgICovXG4gICAgc3RhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVbmxvYWQgYW5kIGRlc3Ryb3kgdGhlIGN1cnJlbnQgSG93bCBvYmplY3QuXG4gICAgICogVGhpcyB3aWxsIGltbWVkaWF0ZWx5IHN0b3AgYWxsIHNvdW5kIGluc3RhbmNlcyBhdHRhY2hlZCB0byB0aGlzIGdyb3VwLlxuICAgICAqL1xuICAgIHVubG9hZDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIFN0b3AgcGxheWluZyBhbnkgYWN0aXZlIHNvdW5kcy5cbiAgICAgIHZhciBzb3VuZHMgPSBzZWxmLl9zb3VuZHM7XG4gICAgICBmb3IgKHZhciBpPTA7IGk8c291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIFN0b3AgdGhlIHNvdW5kIGlmIGl0IGlzIGN1cnJlbnRseSBwbGF5aW5nLlxuICAgICAgICBpZiAoIXNvdW5kc1tpXS5fcGF1c2VkKSB7XG4gICAgICAgICAgc2VsZi5zdG9wKHNvdW5kc1tpXS5faWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBzb3VyY2Ugb3IgZGlzY29ubmVjdC5cbiAgICAgICAgaWYgKCFzZWxmLl93ZWJBdWRpbykge1xuICAgICAgICAgIC8vIFNldCB0aGUgc291cmNlIHRvIDAtc2Vjb25kIHNpbGVuY2UgdG8gc3RvcCBhbnkgZG93bmxvYWRpbmcgKGV4Y2VwdCBpbiBJRSkuXG4gICAgICAgICAgc2VsZi5fY2xlYXJTb3VuZChzb3VuZHNbaV0uX25vZGUpO1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIGFueSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICAgICAgc291bmRzW2ldLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgc291bmRzW2ldLl9lcnJvckZuLCBmYWxzZSk7XG4gICAgICAgICAgc291bmRzW2ldLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoSG93bGVyLl9jYW5QbGF5RXZlbnQsIHNvdW5kc1tpXS5fbG9hZEZuLCBmYWxzZSk7XG4gICAgICAgICAgc291bmRzW2ldLl9ub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZGVkJywgc291bmRzW2ldLl9lbmRGbiwgZmFsc2UpO1xuXG4gICAgICAgICAgLy8gUmVsZWFzZSB0aGUgQXVkaW8gb2JqZWN0IGJhY2sgdG8gdGhlIHBvb2wuXG4gICAgICAgICAgSG93bGVyLl9yZWxlYXNlSHRtbDVBdWRpbyhzb3VuZHNbaV0uX25vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1wdHkgb3V0IGFsbCBvZiB0aGUgbm9kZXMuXG4gICAgICAgIGRlbGV0ZSBzb3VuZHNbaV0uX25vZGU7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIGFsbCB0aW1lcnMgYXJlIGNsZWFyZWQgb3V0LlxuICAgICAgICBzZWxmLl9jbGVhclRpbWVyKHNvdW5kc1tpXS5faWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgdGhlIHJlZmVyZW5jZXMgaW4gdGhlIGdsb2JhbCBIb3dsZXIgb2JqZWN0LlxuICAgICAgdmFyIGluZGV4ID0gSG93bGVyLl9ob3dscy5pbmRleE9mKHNlbGYpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgSG93bGVyLl9ob3dscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuXG4gICAgICAvLyBEZWxldGUgdGhpcyBzb3VuZCBmcm9tIHRoZSBjYWNoZSAoaWYgbm8gb3RoZXIgSG93bCBpcyB1c2luZyBpdCkuXG4gICAgICB2YXIgcmVtQ2FjaGUgPSB0cnVlO1xuICAgICAgZm9yIChpPTA7IGk8SG93bGVyLl9ob3dscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoSG93bGVyLl9ob3dsc1tpXS5fc3JjID09PSBzZWxmLl9zcmMgfHwgc2VsZi5fc3JjLmluZGV4T2YoSG93bGVyLl9ob3dsc1tpXS5fc3JjKSA+PSAwKSB7XG4gICAgICAgICAgcmVtQ2FjaGUgPSBmYWxzZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2FjaGUgJiYgcmVtQ2FjaGUpIHtcbiAgICAgICAgZGVsZXRlIGNhY2hlW3NlbGYuX3NyY107XG4gICAgICB9XG5cbiAgICAgIC8vIENsZWFyIGdsb2JhbCBlcnJvcnMuXG4gICAgICBIb3dsZXIubm9BdWRpbyA9IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBvdXQgYHNlbGZgLlxuICAgICAgc2VsZi5fc3RhdGUgPSAndW5sb2FkZWQnO1xuICAgICAgc2VsZi5fc291bmRzID0gW107XG4gICAgICBzZWxmID0gbnVsbDtcblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiB0byBhIGN1c3RvbSBldmVudC5cbiAgICAgKiBAcGFyYW0gIHtTdHJpbmd9ICAgZXZlbnQgRXZlbnQgbmFtZS5cbiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gZm4gICAgTGlzdGVuZXIgdG8gY2FsbC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9ICAgaWQgICAgKG9wdGlvbmFsKSBPbmx5IGxpc3RlbiB0byBldmVudHMgZm9yIHRoaXMgc291bmQuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgIG9uY2UgIChJTlRFUk5BTCkgTWFya3MgZXZlbnQgdG8gZmlyZSBvbmx5IG9uY2UuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBvbjogZnVuY3Rpb24oZXZlbnQsIGZuLCBpZCwgb25jZSkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGV2ZW50cyA9IHNlbGZbJ19vbicgKyBldmVudF07XG5cbiAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXZlbnRzLnB1c2gob25jZSA/IHtpZDogaWQsIGZuOiBmbiwgb25jZTogb25jZX0gOiB7aWQ6IGlkLCBmbjogZm59KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGN1c3RvbSBldmVudC4gQ2FsbCB3aXRob3V0IHBhcmFtZXRlcnMgdG8gcmVtb3ZlIGFsbCBldmVudHMuXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgIGV2ZW50IEV2ZW50IG5hbWUuXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGZuICAgIExpc3RlbmVyIHRvIHJlbW92ZS4gTGVhdmUgZW1wdHkgdG8gcmVtb3ZlIGFsbC5cbiAgICAgKiBAcGFyYW0gIHtOdW1iZXJ9ICAgaWQgICAgKG9wdGlvbmFsKSBPbmx5IHJlbW92ZSBldmVudHMgZm9yIHRoaXMgc291bmQuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBvZmY6IGZ1bmN0aW9uKGV2ZW50LCBmbiwgaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBldmVudHMgPSBzZWxmWydfb24nICsgZXZlbnRdO1xuICAgICAgdmFyIGkgPSAwO1xuXG4gICAgICAvLyBBbGxvdyBwYXNzaW5nIGp1c3QgYW4gZXZlbnQgYW5kIElELlxuICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaWQgPSBmbjtcbiAgICAgICAgZm4gPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoZm4gfHwgaWQpIHtcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGV2ZW50IHN0b3JlIGFuZCByZW1vdmUgdGhlIHBhc3NlZCBmdW5jdGlvbi5cbiAgICAgICAgZm9yIChpPTA7IGk8ZXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGlzSWQgPSAoaWQgPT09IGV2ZW50c1tpXS5pZCk7XG4gICAgICAgICAgaWYgKGZuID09PSBldmVudHNbaV0uZm4gJiYgaXNJZCB8fCAhZm4gJiYgaXNJZCkge1xuICAgICAgICAgICAgZXZlbnRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldmVudCkge1xuICAgICAgICAvLyBDbGVhciBvdXQgYWxsIGV2ZW50cyBvZiB0aGlzIHR5cGUuXG4gICAgICAgIHNlbGZbJ19vbicgKyBldmVudF0gPSBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENsZWFyIG91dCBhbGwgZXZlbnRzIG9mIGV2ZXJ5IHR5cGUuXG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc2VsZik7XG4gICAgICAgIGZvciAoaT0wOyBpPGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoKGtleXNbaV0uaW5kZXhPZignX29uJykgPT09IDApICYmIEFycmF5LmlzQXJyYXkoc2VsZltrZXlzW2ldXSkpIHtcbiAgICAgICAgICAgIHNlbGZba2V5c1tpXV0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiB0byBhIGN1c3RvbSBldmVudCBhbmQgcmVtb3ZlIGl0IG9uY2UgZmlyZWQuXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSAgIGV2ZW50IEV2ZW50IG5hbWUuXG4gICAgICogQHBhcmFtICB7RnVuY3Rpb259IGZuICAgIExpc3RlbmVyIHRvIGNhbGwuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSAgIGlkICAgIChvcHRpb25hbCkgT25seSBsaXN0ZW4gdG8gZXZlbnRzIGZvciB0aGlzIHNvdW5kLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgb25jZTogZnVuY3Rpb24oZXZlbnQsIGZuLCBpZCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAvLyBTZXR1cCB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAgICBzZWxmLm9uKGV2ZW50LCBmbiwgaWQsIDEpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRW1pdCBhbGwgZXZlbnRzIG9mIGEgc3BlY2lmaWMgdHlwZSBhbmQgcGFzcyB0aGUgc291bmQgaWQuXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSBldmVudCBFdmVudCBuYW1lLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgICAgU291bmQgSUQuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBtc2cgICBNZXNzYWdlIHRvIGdvIHdpdGggZXZlbnQuXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfZW1pdDogZnVuY3Rpb24oZXZlbnQsIGlkLCBtc2cpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBldmVudHMgPSBzZWxmWydfb24nICsgZXZlbnRdO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggZXZlbnQgc3RvcmUgYW5kIGZpcmUgYWxsIGZ1bmN0aW9ucy5cbiAgICAgIGZvciAodmFyIGk9ZXZlbnRzLmxlbmd0aC0xOyBpPj0wOyBpLS0pIHtcbiAgICAgICAgLy8gT25seSBmaXJlIHRoZSBsaXN0ZW5lciBpZiB0aGUgY29ycmVjdCBJRCBpcyB1c2VkLlxuICAgICAgICBpZiAoIWV2ZW50c1tpXS5pZCB8fCBldmVudHNbaV0uaWQgPT09IGlkIHx8IGV2ZW50ID09PSAnbG9hZCcpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICBmbi5jYWxsKHRoaXMsIGlkLCBtc2cpO1xuICAgICAgICAgIH0uYmluZChzZWxmLCBldmVudHNbaV0uZm4pLCAwKTtcblxuICAgICAgICAgIC8vIElmIHRoaXMgZXZlbnQgd2FzIHNldHVwIHdpdGggYG9uY2VgLCByZW1vdmUgaXQuXG4gICAgICAgICAgaWYgKGV2ZW50c1tpXS5vbmNlKSB7XG4gICAgICAgICAgICBzZWxmLm9mZihldmVudCwgZXZlbnRzW2ldLmZuLCBldmVudHNbaV0uaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQYXNzIHRoZSBldmVudCB0eXBlIGludG8gbG9hZCBxdWV1ZSBzbyB0aGF0IGl0IGNhbiBjb250aW51ZSBzdGVwcGluZy5cbiAgICAgIHNlbGYuX2xvYWRRdWV1ZShldmVudCk7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBRdWV1ZSBvZiBhY3Rpb25zIGluaXRpYXRlZCBiZWZvcmUgdGhlIHNvdW5kIGhhcyBsb2FkZWQuXG4gICAgICogVGhlc2Ugd2lsbCBiZSBjYWxsZWQgaW4gc2VxdWVuY2UsIHdpdGggdGhlIG5leHQgb25seSBmaXJpbmdcbiAgICAgKiBhZnRlciB0aGUgcHJldmlvdXMgaGFzIGZpbmlzaGVkIGV4ZWN1dGluZyAoZXZlbiBpZiBhc3luYyBsaWtlIHBsYXkpLlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX2xvYWRRdWV1ZTogZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgaWYgKHNlbGYuX3F1ZXVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIHRhc2sgPSBzZWxmLl9xdWV1ZVswXTtcblxuICAgICAgICAvLyBSZW1vdmUgdGhpcyB0YXNrIGlmIGEgbWF0Y2hpbmcgZXZlbnQgd2FzIHBhc3NlZC5cbiAgICAgICAgaWYgKHRhc2suZXZlbnQgPT09IGV2ZW50KSB7XG4gICAgICAgICAgc2VsZi5fcXVldWUuc2hpZnQoKTtcbiAgICAgICAgICBzZWxmLl9sb2FkUXVldWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJ1biB0aGUgdGFzayBpZiBubyBldmVudCB0eXBlIGlzIHBhc3NlZC5cbiAgICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICAgIHRhc2suYWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gcGxheWJhY2sgZW5kcyBhdCB0aGUgZW5kIG9mIHRoZSBkdXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gIHtTb3VuZH0gc291bmQgVGhlIHNvdW5kIG9iamVjdCB0byB3b3JrIHdpdGguXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfZW5kZWQ6IGZ1bmN0aW9uKHNvdW5kKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgc3ByaXRlID0gc291bmQuX3Nwcml0ZTtcblxuICAgICAgLy8gSWYgd2UgYXJlIHVzaW5nIElFIGFuZCB0aGVyZSB3YXMgbmV0d29yayBsYXRlbmN5IHdlIG1heSBiZSBjbGlwcGluZ1xuICAgICAgLy8gYXVkaW8gYmVmb3JlIGl0IGNvbXBsZXRlcyBwbGF5aW5nLiBMZXRzIGNoZWNrIHRoZSBub2RlIHRvIG1ha2Ugc3VyZSBpdFxuICAgICAgLy8gYmVsaWV2ZXMgaXQgaGFzIGNvbXBsZXRlZCwgYmVmb3JlIGVuZGluZyB0aGUgcGxheWJhY2suXG4gICAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvICYmIHNvdW5kLl9ub2RlICYmICFzb3VuZC5fbm9kZS5wYXVzZWQgJiYgIXNvdW5kLl9ub2RlLmVuZGVkICYmIHNvdW5kLl9ub2RlLmN1cnJlbnRUaW1lIDwgc291bmQuX3N0b3ApIHtcbiAgICAgICAgc2V0VGltZW91dChzZWxmLl9lbmRlZC5iaW5kKHNlbGYsIHNvdW5kKSwgMTAwKTtcbiAgICAgICAgcmV0dXJuIHNlbGY7XG4gICAgICB9XG5cbiAgICAgIC8vIFNob3VsZCB0aGlzIHNvdW5kIGxvb3A/XG4gICAgICB2YXIgbG9vcCA9ICEhKHNvdW5kLl9sb29wIHx8IHNlbGYuX3Nwcml0ZVtzcHJpdGVdWzJdKTtcblxuICAgICAgLy8gRmlyZSB0aGUgZW5kZWQgZXZlbnQuXG4gICAgICBzZWxmLl9lbWl0KCdlbmQnLCBzb3VuZC5faWQpO1xuXG4gICAgICAvLyBSZXN0YXJ0IHRoZSBwbGF5YmFjayBmb3IgSFRNTDUgQXVkaW8gbG9vcC5cbiAgICAgIGlmICghc2VsZi5fd2ViQXVkaW8gJiYgbG9vcCkge1xuICAgICAgICBzZWxmLnN0b3Aoc291bmQuX2lkLCB0cnVlKS5wbGF5KHNvdW5kLl9pZCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc3RhcnQgdGhpcyB0aW1lciBpZiBvbiBhIFdlYiBBdWRpbyBsb29wLlxuICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmIGxvb3ApIHtcbiAgICAgICAgc2VsZi5fZW1pdCgncGxheScsIHNvdW5kLl9pZCk7XG4gICAgICAgIHNvdW5kLl9zZWVrID0gc291bmQuX3N0YXJ0IHx8IDA7XG4gICAgICAgIHNvdW5kLl9yYXRlU2VlayA9IDA7XG4gICAgICAgIHNvdW5kLl9wbGF5U3RhcnQgPSBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lO1xuXG4gICAgICAgIHZhciB0aW1lb3V0ID0gKChzb3VuZC5fc3RvcCAtIHNvdW5kLl9zdGFydCkgKiAxMDAwKSAvIE1hdGguYWJzKHNvdW5kLl9yYXRlKTtcbiAgICAgICAgc2VsZi5fZW5kVGltZXJzW3NvdW5kLl9pZF0gPSBzZXRUaW1lb3V0KHNlbGYuX2VuZGVkLmJpbmQoc2VsZiwgc291bmQpLCB0aW1lb3V0KTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFyayB0aGUgbm9kZSBhcyBwYXVzZWQuXG4gICAgICBpZiAoc2VsZi5fd2ViQXVkaW8gJiYgIWxvb3ApIHtcbiAgICAgICAgc291bmQuX3BhdXNlZCA9IHRydWU7XG4gICAgICAgIHNvdW5kLl9lbmRlZCA9IHRydWU7XG4gICAgICAgIHNvdW5kLl9zZWVrID0gc291bmQuX3N0YXJ0IHx8IDA7XG4gICAgICAgIHNvdW5kLl9yYXRlU2VlayA9IDA7XG4gICAgICAgIHNlbGYuX2NsZWFyVGltZXIoc291bmQuX2lkKTtcblxuICAgICAgICAvLyBDbGVhbiB1cCB0aGUgYnVmZmVyIHNvdXJjZS5cbiAgICAgICAgc2VsZi5fY2xlYW5CdWZmZXIoc291bmQuX25vZGUpO1xuXG4gICAgICAgIC8vIEF0dGVtcHQgdG8gYXV0by1zdXNwZW5kIEF1ZGlvQ29udGV4dCBpZiBubyBzb3VuZHMgYXJlIHN0aWxsIHBsYXlpbmcuXG4gICAgICAgIEhvd2xlci5fYXV0b1N1c3BlbmQoKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2hlbiB1c2luZyBhIHNwcml0ZSwgZW5kIHRoZSB0cmFjay5cbiAgICAgIGlmICghc2VsZi5fd2ViQXVkaW8gJiYgIWxvb3ApIHtcbiAgICAgICAgc2VsZi5zdG9wKHNvdW5kLl9pZCwgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDbGVhciB0aGUgZW5kIHRpbWVyIGZvciBhIHNvdW5kIHBsYXliYWNrLlxuICAgICAqIEBwYXJhbSAge051bWJlcn0gaWQgVGhlIHNvdW5kIElELlxuICAgICAqIEByZXR1cm4ge0hvd2x9XG4gICAgICovXG4gICAgX2NsZWFyVGltZXI6IGZ1bmN0aW9uKGlkKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIGlmIChzZWxmLl9lbmRUaW1lcnNbaWRdKSB7XG4gICAgICAgIC8vIENsZWFyIHRoZSB0aW1lb3V0IG9yIHJlbW92ZSB0aGUgZW5kZWQgbGlzdGVuZXIuXG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZi5fZW5kVGltZXJzW2lkXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNsZWFyVGltZW91dChzZWxmLl9lbmRUaW1lcnNbaWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQoaWQpO1xuICAgICAgICAgIGlmIChzb3VuZCAmJiBzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgc291bmQuX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBzZWxmLl9lbmRUaW1lcnNbaWRdLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHNlbGYuX2VuZFRpbWVyc1tpZF07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIHNvdW5kIGlkZW50aWZpZWQgYnkgdGhpcyBJRCwgb3IgcmV0dXJuIG51bGwuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBTb3VuZCBJRFxuICAgICAqIEByZXR1cm4ge09iamVjdH0gICAgU291bmQgb2JqZWN0IG9yIG51bGwuXG4gICAgICovXG4gICAgX3NvdW5kQnlJZDogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBzb3VuZHMgYW5kIGZpbmQgdGhlIG9uZSB3aXRoIHRoaXMgSUQuXG4gICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5fc291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChpZCA9PT0gc2VsZi5fc291bmRzW2ldLl9pZCkge1xuICAgICAgICAgIHJldHVybiBzZWxmLl9zb3VuZHNbaV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhbiBpbmFjdGl2ZSBzb3VuZCBmcm9tIHRoZSBwb29sIG9yIGNyZWF0ZSBhIG5ldyBvbmUuXG4gICAgICogQHJldHVybiB7U291bmR9IFNvdW5kIHBsYXliYWNrIG9iamVjdC5cbiAgICAgKi9cbiAgICBfaW5hY3RpdmVTb3VuZDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIHNlbGYuX2RyYWluKCk7XG5cbiAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGluYWN0aXZlIG5vZGUgdG8gcmVjeWNsZS5cbiAgICAgIGZvciAodmFyIGk9MDsgaTxzZWxmLl9zb3VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNlbGYuX3NvdW5kc1tpXS5fZW5kZWQpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5fc291bmRzW2ldLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gaW5hY3RpdmUgbm9kZSB3YXMgZm91bmQsIGNyZWF0ZSBhIG5ldyBvbmUuXG4gICAgICByZXR1cm4gbmV3IFNvdW5kKHNlbGYpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBEcmFpbiBleGNlc3MgaW5hY3RpdmUgc291bmRzIGZyb20gdGhlIHBvb2wuXG4gICAgICovXG4gICAgX2RyYWluOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBsaW1pdCA9IHNlbGYuX3Bvb2w7XG4gICAgICB2YXIgY250ID0gMDtcbiAgICAgIHZhciBpID0gMDtcblxuICAgICAgLy8gSWYgdGhlcmUgYXJlIGxlc3Mgc291bmRzIHRoYW4gdGhlIG1heCBwb29sIHNpemUsIHdlIGFyZSBkb25lLlxuICAgICAgaWYgKHNlbGYuX3NvdW5kcy5sZW5ndGggPCBsaW1pdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgaW5hY3RpdmUgc291bmRzLlxuICAgICAgZm9yIChpPTA7IGk8c2VsZi5fc291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChzZWxmLl9zb3VuZHNbaV0uX2VuZGVkKSB7XG4gICAgICAgICAgY250Kys7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIGV4Y2VzcyBpbmFjdGl2ZSBzb3VuZHMsIGdvaW5nIGluIHJldmVyc2Ugb3JkZXIuXG4gICAgICBmb3IgKGk9c2VsZi5fc291bmRzLmxlbmd0aCAtIDE7IGk+PTA7IGktLSkge1xuICAgICAgICBpZiAoY250IDw9IGxpbWl0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlbGYuX3NvdW5kc1tpXS5fZW5kZWQpIHtcbiAgICAgICAgICAvLyBEaXNjb25uZWN0IHRoZSBhdWRpbyBzb3VyY2Ugd2hlbiB1c2luZyBXZWIgQXVkaW8uXG4gICAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvICYmIHNlbGYuX3NvdW5kc1tpXS5fbm9kZSkge1xuICAgICAgICAgICAgc2VsZi5fc291bmRzW2ldLl9ub2RlLmRpc2Nvbm5lY3QoMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmVtb3ZlIHNvdW5kcyB1bnRpbCB3ZSBoYXZlIHRoZSBwb29sIHNpemUuXG4gICAgICAgICAgc2VsZi5fc291bmRzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBjbnQtLTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIElEJ3MgZnJvbSB0aGUgc291bmRzIHBvb2wuXG4gICAgICogQHBhcmFtICB7TnVtYmVyfSBpZCBPbmx5IHJldHVybiBvbmUgSUQgaWYgb25lIGlzIHBhc3NlZC5cbiAgICAgKiBAcmV0dXJuIHtBcnJheX0gICAgQXJyYXkgb2YgSURzLlxuICAgICAqL1xuICAgIF9nZXRTb3VuZElkczogZnVuY3Rpb24oaWQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIGlkcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpPTA7IGk8c2VsZi5fc291bmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWRzLnB1c2goc2VsZi5fc291bmRzW2ldLl9pZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaWRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFtpZF07XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIExvYWQgdGhlIHNvdW5kIGJhY2sgaW50byB0aGUgYnVmZmVyIHNvdXJjZS5cbiAgICAgKiBAcGFyYW0gIHtTb3VuZH0gc291bmQgVGhlIHNvdW5kIG9iamVjdCB0byB3b3JrIHdpdGguXG4gICAgICogQHJldHVybiB7SG93bH1cbiAgICAgKi9cbiAgICBfcmVmcmVzaEJ1ZmZlcjogZnVuY3Rpb24oc291bmQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gU2V0dXAgdGhlIGJ1ZmZlciBzb3VyY2UgZm9yIHBsYXliYWNrLlxuICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlID0gSG93bGVyLmN0eC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtcbiAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5idWZmZXIgPSBjYWNoZVtzZWxmLl9zcmNdO1xuXG4gICAgICAvLyBDb25uZWN0IHRvIHRoZSBjb3JyZWN0IG5vZGUuXG4gICAgICBpZiAoc291bmQuX3Bhbm5lcikge1xuICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UuY29ubmVjdChzb3VuZC5fcGFubmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5jb25uZWN0KHNvdW5kLl9ub2RlKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0dXAgbG9vcGluZyBhbmQgcGxheWJhY2sgcmF0ZS5cbiAgICAgIHNvdW5kLl9ub2RlLmJ1ZmZlclNvdXJjZS5sb29wID0gc291bmQuX2xvb3A7XG4gICAgICBpZiAoc291bmQuX2xvb3ApIHtcbiAgICAgICAgc291bmQuX25vZGUuYnVmZmVyU291cmNlLmxvb3BTdGFydCA9IHNvdW5kLl9zdGFydCB8fCAwO1xuICAgICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UubG9vcEVuZCA9IHNvdW5kLl9zdG9wIHx8IDA7XG4gICAgICB9XG4gICAgICBzb3VuZC5fbm9kZS5idWZmZXJTb3VyY2UucGxheWJhY2tSYXRlLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9yYXRlLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFByZXZlbnQgbWVtb3J5IGxlYWtzIGJ5IGNsZWFuaW5nIHVwIHRoZSBidWZmZXIgc291cmNlIGFmdGVyIHBsYXliYWNrLlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gbm9kZSBTb3VuZCdzIGF1ZGlvIG5vZGUgY29udGFpbmluZyB0aGUgYnVmZmVyIHNvdXJjZS5cbiAgICAgKiBAcmV0dXJuIHtIb3dsfVxuICAgICAqL1xuICAgIF9jbGVhbkJ1ZmZlcjogZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIGlzSU9TID0gSG93bGVyLl9uYXZpZ2F0b3IgJiYgSG93bGVyLl9uYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoJ0FwcGxlJykgPj0gMDtcblxuICAgICAgaWYgKEhvd2xlci5fc2NyYXRjaEJ1ZmZlciAmJiBub2RlLmJ1ZmZlclNvdXJjZSkge1xuICAgICAgICBub2RlLmJ1ZmZlclNvdXJjZS5vbmVuZGVkID0gbnVsbDtcbiAgICAgICAgbm9kZS5idWZmZXJTb3VyY2UuZGlzY29ubmVjdCgwKTtcbiAgICAgICAgaWYgKGlzSU9TKSB7XG4gICAgICAgICAgdHJ5IHsgbm9kZS5idWZmZXJTb3VyY2UuYnVmZmVyID0gSG93bGVyLl9zY3JhdGNoQnVmZmVyOyB9IGNhdGNoKGUpIHt9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5vZGUuYnVmZmVyU291cmNlID0gbnVsbDtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgc291cmNlIHRvIGEgMC1zZWNvbmQgc2lsZW5jZSB0byBzdG9wIGFueSBkb3dubG9hZGluZyAoZXhjZXB0IGluIElFKS5cbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IG5vZGUgQXVkaW8gbm9kZSB0byBjbGVhci5cbiAgICAgKi9cbiAgICBfY2xlYXJTb3VuZDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgdmFyIGNoZWNrSUUgPSAvTVNJRSB8VHJpZGVudFxcLy8udGVzdChIb3dsZXIuX25hdmlnYXRvciAmJiBIb3dsZXIuX25hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgICAgaWYgKCFjaGVja0lFKSB7XG4gICAgICAgIG5vZGUuc3JjID0gJ2RhdGE6YXVkaW8vd2F2O2Jhc2U2NCxVa2xHUmlnQUFBQlhRVlpGWm0xMElCSUFBQUFCQUFFQVJLd0FBSWhZQVFBQ0FCQUFBQUJrWVhSaEFnQUFBQUVBJztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqIFNpbmdsZSBTb3VuZCBNZXRob2RzICoqL1xuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8qKlxuICAgKiBTZXR1cCB0aGUgc291bmQgb2JqZWN0LCB3aGljaCBlYWNoIG5vZGUgYXR0YWNoZWQgdG8gYSBIb3dsIGdyb3VwIGlzIGNvbnRhaW5lZCBpbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IGhvd2wgVGhlIEhvd2wgcGFyZW50IGdyb3VwLlxuICAgKi9cbiAgdmFyIFNvdW5kID0gZnVuY3Rpb24oaG93bCkge1xuICAgIHRoaXMuX3BhcmVudCA9IGhvd2w7XG4gICAgdGhpcy5pbml0KCk7XG4gIH07XG4gIFNvdW5kLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBJbml0aWFsaXplIGEgbmV3IFNvdW5kIG9iamVjdC5cbiAgICAgKiBAcmV0dXJuIHtTb3VuZH1cbiAgICAgKi9cbiAgICBpbml0OiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBwYXJlbnQgPSBzZWxmLl9wYXJlbnQ7XG5cbiAgICAgIC8vIFNldHVwIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuXG4gICAgICBzZWxmLl9tdXRlZCA9IHBhcmVudC5fbXV0ZWQ7XG4gICAgICBzZWxmLl9sb29wID0gcGFyZW50Ll9sb29wO1xuICAgICAgc2VsZi5fdm9sdW1lID0gcGFyZW50Ll92b2x1bWU7XG4gICAgICBzZWxmLl9yYXRlID0gcGFyZW50Ll9yYXRlO1xuICAgICAgc2VsZi5fc2VlayA9IDA7XG4gICAgICBzZWxmLl9wYXVzZWQgPSB0cnVlO1xuICAgICAgc2VsZi5fZW5kZWQgPSB0cnVlO1xuICAgICAgc2VsZi5fc3ByaXRlID0gJ19fZGVmYXVsdCc7XG5cbiAgICAgIC8vIEdlbmVyYXRlIGEgdW5pcXVlIElEIGZvciB0aGlzIHNvdW5kLlxuICAgICAgc2VsZi5faWQgPSArK0hvd2xlci5fY291bnRlcjtcblxuICAgICAgLy8gQWRkIGl0c2VsZiB0byB0aGUgcGFyZW50J3MgcG9vbC5cbiAgICAgIHBhcmVudC5fc291bmRzLnB1c2goc2VsZik7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgbmV3IG5vZGUuXG4gICAgICBzZWxmLmNyZWF0ZSgpO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuZCBzZXR1cCBhIG5ldyBzb3VuZCBvYmplY3QsIHdoZXRoZXIgSFRNTDUgQXVkaW8gb3IgV2ViIEF1ZGlvLlxuICAgICAqIEByZXR1cm4ge1NvdW5kfVxuICAgICAqL1xuICAgIGNyZWF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuICAgICAgdmFyIHZvbHVtZSA9IChIb3dsZXIuX211dGVkIHx8IHNlbGYuX211dGVkIHx8IHNlbGYuX3BhcmVudC5fbXV0ZWQpID8gMCA6IHNlbGYuX3ZvbHVtZTtcblxuICAgICAgaWYgKHBhcmVudC5fd2ViQXVkaW8pIHtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBnYWluIG5vZGUgZm9yIGNvbnRyb2xsaW5nIHZvbHVtZSAodGhlIHNvdXJjZSB3aWxsIGNvbm5lY3QgdG8gdGhpcykuXG4gICAgICAgIHNlbGYuX25vZGUgPSAodHlwZW9mIEhvd2xlci5jdHguY3JlYXRlR2FpbiA9PT0gJ3VuZGVmaW5lZCcpID8gSG93bGVyLmN0eC5jcmVhdGVHYWluTm9kZSgpIDogSG93bGVyLmN0eC5jcmVhdGVHYWluKCk7XG4gICAgICAgIHNlbGYuX25vZGUuZ2Fpbi5zZXRWYWx1ZUF0VGltZSh2b2x1bWUsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICBzZWxmLl9ub2RlLnBhdXNlZCA9IHRydWU7XG4gICAgICAgIHNlbGYuX25vZGUuY29ubmVjdChIb3dsZXIubWFzdGVyR2Fpbik7XG4gICAgICB9IGVsc2UgaWYgKCFIb3dsZXIubm9BdWRpbykge1xuICAgICAgICAvLyBHZXQgYW4gdW5sb2NrZWQgQXVkaW8gb2JqZWN0IGZyb20gdGhlIHBvb2wuXG4gICAgICAgIHNlbGYuX25vZGUgPSBIb3dsZXIuX29idGFpbkh0bWw1QXVkaW8oKTtcblxuICAgICAgICAvLyBMaXN0ZW4gZm9yIGVycm9ycyAoaHR0cDovL2Rldi53My5vcmcvaHRtbDUvc3BlYy1hdXRob3Itdmlldy9zcGVjLmh0bWwjbWVkaWFlcnJvcikuXG4gICAgICAgIHNlbGYuX2Vycm9yRm4gPSBzZWxmLl9lcnJvckxpc3RlbmVyLmJpbmQoc2VsZik7XG4gICAgICAgIHNlbGYuX25vZGUuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBzZWxmLl9lcnJvckZuLCBmYWxzZSk7XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciAnY2FucGxheXRocm91Z2gnIGV2ZW50IHRvIGxldCB1cyBrbm93IHRoZSBzb3VuZCBpcyByZWFkeS5cbiAgICAgICAgc2VsZi5fbG9hZEZuID0gc2VsZi5fbG9hZExpc3RlbmVyLmJpbmQoc2VsZik7XG4gICAgICAgIHNlbGYuX25vZGUuYWRkRXZlbnRMaXN0ZW5lcihIb3dsZXIuX2NhblBsYXlFdmVudCwgc2VsZi5fbG9hZEZuLCBmYWxzZSk7XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciB0aGUgJ2VuZGVkJyBldmVudCBvbiB0aGUgc291bmQgdG8gYWNjb3VudCBmb3IgZWRnZS1jYXNlIHdoZXJlXG4gICAgICAgIC8vIGEgZmluaXRlIHNvdW5kIGhhcyBhIGR1cmF0aW9uIG9mIEluZmluaXR5LlxuICAgICAgICBzZWxmLl9lbmRGbiA9IHNlbGYuX2VuZExpc3RlbmVyLmJpbmQoc2VsZik7XG4gICAgICAgIHNlbGYuX25vZGUuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBzZWxmLl9lbmRGbiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIFNldHVwIHRoZSBuZXcgYXVkaW8gbm9kZS5cbiAgICAgICAgc2VsZi5fbm9kZS5zcmMgPSBwYXJlbnQuX3NyYztcbiAgICAgICAgc2VsZi5fbm9kZS5wcmVsb2FkID0gcGFyZW50Ll9wcmVsb2FkID09PSB0cnVlID8gJ2F1dG8nIDogcGFyZW50Ll9wcmVsb2FkO1xuICAgICAgICBzZWxmLl9ub2RlLnZvbHVtZSA9IHZvbHVtZSAqIEhvd2xlci52b2x1bWUoKTtcblxuICAgICAgICAvLyBCZWdpbiBsb2FkaW5nIHRoZSBzb3VyY2UuXG4gICAgICAgIHNlbGYuX25vZGUubG9hZCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVzZXQgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBzb3VuZCB0byB0aGUgb3JpZ2luYWwgc3RhdGUgKGZvciByZWN5Y2xlKS5cbiAgICAgKiBAcmV0dXJuIHtTb3VuZH1cbiAgICAgKi9cbiAgICByZXNldDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBSZXNldCBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBzb3VuZC5cbiAgICAgIHNlbGYuX211dGVkID0gcGFyZW50Ll9tdXRlZDtcbiAgICAgIHNlbGYuX2xvb3AgPSBwYXJlbnQuX2xvb3A7XG4gICAgICBzZWxmLl92b2x1bWUgPSBwYXJlbnQuX3ZvbHVtZTtcbiAgICAgIHNlbGYuX3JhdGUgPSBwYXJlbnQuX3JhdGU7XG4gICAgICBzZWxmLl9zZWVrID0gMDtcbiAgICAgIHNlbGYuX3JhdGVTZWVrID0gMDtcbiAgICAgIHNlbGYuX3BhdXNlZCA9IHRydWU7XG4gICAgICBzZWxmLl9lbmRlZCA9IHRydWU7XG4gICAgICBzZWxmLl9zcHJpdGUgPSAnX19kZWZhdWx0JztcblxuICAgICAgLy8gR2VuZXJhdGUgYSBuZXcgSUQgc28gdGhhdCBpdCBpc24ndCBjb25mdXNlZCB3aXRoIHRoZSBwcmV2aW91cyBzb3VuZC5cbiAgICAgIHNlbGYuX2lkID0gKytIb3dsZXIuX2NvdW50ZXI7XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBIVE1MNSBBdWRpbyBlcnJvciBsaXN0ZW5lciBjYWxsYmFjay5cbiAgICAgKi9cbiAgICBfZXJyb3JMaXN0ZW5lcjogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIEZpcmUgYW4gZXJyb3IgZXZlbnQgYW5kIHBhc3MgYmFjayB0aGUgY29kZS5cbiAgICAgIHNlbGYuX3BhcmVudC5fZW1pdCgnbG9hZGVycm9yJywgc2VsZi5faWQsIHNlbGYuX25vZGUuZXJyb3IgPyBzZWxmLl9ub2RlLmVycm9yLmNvZGUgOiAwKTtcblxuICAgICAgLy8gQ2xlYXIgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgc2VsZi5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHNlbGYuX2Vycm9yRm4sIGZhbHNlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSFRNTDUgQXVkaW8gY2FucGxheXRocm91Z2ggbGlzdGVuZXIgY2FsbGJhY2suXG4gICAgICovXG4gICAgX2xvYWRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBSb3VuZCB1cCB0aGUgZHVyYXRpb24gdG8gYWNjb3VudCBmb3IgdGhlIGxvd2VyIHByZWNpc2lvbiBpbiBIVE1MNSBBdWRpby5cbiAgICAgIHBhcmVudC5fZHVyYXRpb24gPSBNYXRoLmNlaWwoc2VsZi5fbm9kZS5kdXJhdGlvbiAqIDEwKSAvIDEwO1xuXG4gICAgICAvLyBTZXR1cCBhIHNwcml0ZSBpZiBub25lIGlzIGRlZmluZWQuXG4gICAgICBpZiAoT2JqZWN0LmtleXMocGFyZW50Ll9zcHJpdGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwYXJlbnQuX3Nwcml0ZSA9IHtfX2RlZmF1bHQ6IFswLCBwYXJlbnQuX2R1cmF0aW9uICogMTAwMF19O1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyZW50Ll9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgICAgcGFyZW50Ll9zdGF0ZSA9ICdsb2FkZWQnO1xuICAgICAgICBwYXJlbnQuX2VtaXQoJ2xvYWQnKTtcbiAgICAgICAgcGFyZW50Ll9sb2FkUXVldWUoKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgc2VsZi5fbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKEhvd2xlci5fY2FuUGxheUV2ZW50LCBzZWxmLl9sb2FkRm4sIGZhbHNlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogSFRNTDUgQXVkaW8gZW5kZWQgbGlzdGVuZXIgY2FsbGJhY2suXG4gICAgICovXG4gICAgX2VuZExpc3RlbmVyOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBwYXJlbnQgPSBzZWxmLl9wYXJlbnQ7XG5cbiAgICAgIC8vIE9ubHkgaGFuZGxlIHRoZSBgZW5kZWRgYCBldmVudCBpZiB0aGUgZHVyYXRpb24gaXMgSW5maW5pdHkuXG4gICAgICBpZiAocGFyZW50Ll9kdXJhdGlvbiA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBwYXJlbnQgZHVyYXRpb24gdG8gbWF0Y2ggdGhlIHJlYWwgYXVkaW8gZHVyYXRpb24uXG4gICAgICAgIC8vIFJvdW5kIHVwIHRoZSBkdXJhdGlvbiB0byBhY2NvdW50IGZvciB0aGUgbG93ZXIgcHJlY2lzaW9uIGluIEhUTUw1IEF1ZGlvLlxuICAgICAgICBwYXJlbnQuX2R1cmF0aW9uID0gTWF0aC5jZWlsKHNlbGYuX25vZGUuZHVyYXRpb24gKiAxMCkgLyAxMDtcblxuICAgICAgICAvLyBVcGRhdGUgdGhlIHNwcml0ZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSByZWFsIGR1cmF0aW9uLlxuICAgICAgICBpZiAocGFyZW50Ll9zcHJpdGUuX19kZWZhdWx0WzFdID09PSBJbmZpbml0eSkge1xuICAgICAgICAgIHBhcmVudC5fc3ByaXRlLl9fZGVmYXVsdFsxXSA9IHBhcmVudC5fZHVyYXRpb24gKiAxMDAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVuIHRoZSByZWd1bGFyIGVuZGVkIG1ldGhvZC5cbiAgICAgICAgcGFyZW50Ll9lbmRlZChzZWxmKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGhlIGV2ZW50IGxpc3RlbmVyIHNpbmNlIHRoZSBkdXJhdGlvbiBpcyBub3cgY29ycmVjdC5cbiAgICAgIHNlbGYuX25vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZW5kZWQnLCBzZWxmLl9lbmRGbiwgZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICAvKiogSGVscGVyIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgdmFyIGNhY2hlID0ge307XG5cbiAgLyoqXG4gICAqIEJ1ZmZlciBhIHNvdW5kIGZyb20gVVJMLCBEYXRhIFVSSSBvciBjYWNoZSBhbmQgZGVjb2RlIHRvIGF1ZGlvIHNvdXJjZSAoV2ViIEF1ZGlvIEFQSSkuXG4gICAqIEBwYXJhbSAge0hvd2x9IHNlbGZcbiAgICovXG4gIHZhciBsb2FkQnVmZmVyID0gZnVuY3Rpb24oc2VsZikge1xuICAgIHZhciB1cmwgPSBzZWxmLl9zcmM7XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gY2FjaGVkIGFuZCB1c2UgaXQgaW5zdGVhZC5cbiAgICBpZiAoY2FjaGVbdXJsXSkge1xuICAgICAgLy8gU2V0IHRoZSBkdXJhdGlvbiBmcm9tIHRoZSBjYWNoZS5cbiAgICAgIHNlbGYuX2R1cmF0aW9uID0gY2FjaGVbdXJsXS5kdXJhdGlvbjtcblxuICAgICAgLy8gTG9hZCB0aGUgc291bmQgaW50byB0aGlzIEhvd2wuXG4gICAgICBsb2FkU291bmQoc2VsZik7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoL15kYXRhOlteO10rO2Jhc2U2NCwvLnRlc3QodXJsKSkge1xuICAgICAgLy8gRGVjb2RlIHRoZSBiYXNlNjQgZGF0YSBVUkkgd2l0aG91dCBYSFIsIHNpbmNlIHNvbWUgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCBpdC5cbiAgICAgIHZhciBkYXRhID0gYXRvYih1cmwuc3BsaXQoJywnKVsxXSk7XG4gICAgICB2YXIgZGF0YVZpZXcgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpPTA7IGk8ZGF0YS5sZW5ndGg7ICsraSkge1xuICAgICAgICBkYXRhVmlld1tpXSA9IGRhdGEuY2hhckNvZGVBdChpKTtcbiAgICAgIH1cblxuICAgICAgZGVjb2RlQXVkaW9EYXRhKGRhdGFWaWV3LmJ1ZmZlciwgc2VsZik7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIExvYWQgdGhlIGJ1ZmZlciBmcm9tIHRoZSBVUkwuXG4gICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICB4aHIub3BlbihzZWxmLl94aHIubWV0aG9kLCB1cmwsIHRydWUpO1xuICAgICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHNlbGYuX3hoci53aXRoQ3JlZGVudGlhbHM7XG4gICAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJztcblxuICAgICAgLy8gQXBwbHkgYW55IGN1c3RvbSBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0LlxuICAgICAgaWYgKHNlbGYuX3hoci5oZWFkZXJzKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHNlbGYuX3hoci5oZWFkZXJzKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGtleSwgc2VsZi5feGhyLmhlYWRlcnNba2V5XSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBnZXQgYSBzdWNjZXNzZnVsIHJlc3BvbnNlIGJhY2suXG4gICAgICAgIHZhciBjb2RlID0gKHhoci5zdGF0dXMgKyAnJylbMF07XG4gICAgICAgIGlmIChjb2RlICE9PSAnMCcgJiYgY29kZSAhPT0gJzInICYmIGNvZGUgIT09ICczJykge1xuICAgICAgICAgIHNlbGYuX2VtaXQoJ2xvYWRlcnJvcicsIG51bGwsICdGYWlsZWQgbG9hZGluZyBhdWRpbyBmaWxlIHdpdGggc3RhdHVzOiAnICsgeGhyLnN0YXR1cyArICcuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVjb2RlQXVkaW9EYXRhKHhoci5yZXNwb25zZSwgc2VsZik7XG4gICAgICB9O1xuICAgICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHN3aXRjaCB0byBIVE1MNSBBdWRpby5cbiAgICAgICAgaWYgKHNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICAgICAgc2VsZi5faHRtbDUgPSB0cnVlO1xuICAgICAgICAgIHNlbGYuX3dlYkF1ZGlvID0gZmFsc2U7XG4gICAgICAgICAgc2VsZi5fc291bmRzID0gW107XG4gICAgICAgICAgZGVsZXRlIGNhY2hlW3VybF07XG4gICAgICAgICAgc2VsZi5sb2FkKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBzYWZlWGhyU2VuZCh4aHIpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU2VuZCB0aGUgWEhSIHJlcXVlc3Qgd3JhcHBlZCBpbiBhIHRyeS9jYXRjaC5cbiAgICogQHBhcmFtICB7T2JqZWN0fSB4aHIgWEhSIHRvIHNlbmQuXG4gICAqL1xuICB2YXIgc2FmZVhoclNlbmQgPSBmdW5jdGlvbih4aHIpIHtcbiAgICB0cnkge1xuICAgICAgeGhyLnNlbmQoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB4aHIub25lcnJvcigpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRGVjb2RlIGF1ZGlvIGRhdGEgZnJvbSBhbiBhcnJheSBidWZmZXIuXG4gICAqIEBwYXJhbSAge0FycmF5QnVmZmVyfSBhcnJheWJ1ZmZlciBUaGUgYXVkaW8gZGF0YS5cbiAgICogQHBhcmFtICB7SG93bH0gICAgICAgIHNlbGZcbiAgICovXG4gIHZhciBkZWNvZGVBdWRpb0RhdGEgPSBmdW5jdGlvbihhcnJheWJ1ZmZlciwgc2VsZikge1xuICAgIC8vIEZpcmUgYSBsb2FkIGVycm9yIGlmIHNvbWV0aGluZyBicm9rZS5cbiAgICB2YXIgZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuX2VtaXQoJ2xvYWRlcnJvcicsIG51bGwsICdEZWNvZGluZyBhdWRpbyBkYXRhIGZhaWxlZC4nKTtcbiAgICB9O1xuXG4gICAgLy8gTG9hZCB0aGUgc291bmQgb24gc3VjY2Vzcy5cbiAgICB2YXIgc3VjY2VzcyA9IGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAgICAgaWYgKGJ1ZmZlciAmJiBzZWxmLl9zb3VuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjYWNoZVtzZWxmLl9zcmNdID0gYnVmZmVyO1xuICAgICAgICBsb2FkU291bmQoc2VsZiwgYnVmZmVyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVycm9yKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIERlY29kZSB0aGUgYnVmZmVyIGludG8gYW4gYXVkaW8gc291cmNlLlxuICAgIGlmICh0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgSG93bGVyLmN0eC5kZWNvZGVBdWRpb0RhdGEubGVuZ3RoID09PSAxKSB7XG4gICAgICBIb3dsZXIuY3R4LmRlY29kZUF1ZGlvRGF0YShhcnJheWJ1ZmZlcikudGhlbihzdWNjZXNzKS5jYXRjaChlcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIEhvd2xlci5jdHguZGVjb2RlQXVkaW9EYXRhKGFycmF5YnVmZmVyLCBzdWNjZXNzLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvdW5kIGlzIG5vdyBsb2FkZWQsIHNvIGZpbmlzaCBzZXR0aW5nIGV2ZXJ5dGhpbmcgdXAgYW5kIGZpcmUgdGhlIGxvYWRlZCBldmVudC5cbiAgICogQHBhcmFtICB7SG93bH0gc2VsZlxuICAgKiBAcGFyYW0gIHtPYmplY3R9IGJ1ZmZlciBUaGUgZGVjb2RlZCBidWZmZXIgc291bmQgc291cmNlLlxuICAgKi9cbiAgdmFyIGxvYWRTb3VuZCA9IGZ1bmN0aW9uKHNlbGYsIGJ1ZmZlcikge1xuICAgIC8vIFNldCB0aGUgZHVyYXRpb24uXG4gICAgaWYgKGJ1ZmZlciAmJiAhc2VsZi5fZHVyYXRpb24pIHtcbiAgICAgIHNlbGYuX2R1cmF0aW9uID0gYnVmZmVyLmR1cmF0aW9uO1xuICAgIH1cblxuICAgIC8vIFNldHVwIGEgc3ByaXRlIGlmIG5vbmUgaXMgZGVmaW5lZC5cbiAgICBpZiAoT2JqZWN0LmtleXMoc2VsZi5fc3ByaXRlKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHNlbGYuX3Nwcml0ZSA9IHtfX2RlZmF1bHQ6IFswLCBzZWxmLl9kdXJhdGlvbiAqIDEwMDBdfTtcbiAgICB9XG5cbiAgICAvLyBGaXJlIHRoZSBsb2FkZWQgZXZlbnQuXG4gICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgc2VsZi5fc3RhdGUgPSAnbG9hZGVkJztcbiAgICAgIHNlbGYuX2VtaXQoJ2xvYWQnKTtcbiAgICAgIHNlbGYuX2xvYWRRdWV1ZSgpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogU2V0dXAgdGhlIGF1ZGlvIGNvbnRleHQgd2hlbiBhdmFpbGFibGUsIG9yIHN3aXRjaCB0byBIVE1MNSBBdWRpbyBtb2RlLlxuICAgKi9cbiAgdmFyIHNldHVwQXVkaW9Db250ZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IGRldGVjdGVkIHRoYXQgV2ViIEF1ZGlvIGlzbid0IHN1cHBvcnRlZCwgZG9uJ3QgcnVuIHRoaXMgc3RlcCBhZ2Fpbi5cbiAgICBpZiAoIUhvd2xlci51c2luZ1dlYkF1ZGlvKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgd2UgYXJlIHVzaW5nIFdlYiBBdWRpbyBhbmQgc2V0dXAgdGhlIEF1ZGlvQ29udGV4dCBpZiB3ZSBhcmUuXG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgQXVkaW9Db250ZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBIb3dsZXIuY3R4ID0gbmV3IEF1ZGlvQ29udGV4dCgpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygd2Via2l0QXVkaW9Db250ZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBIb3dsZXIuY3R4ID0gbmV3IHdlYmtpdEF1ZGlvQ29udGV4dCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgSG93bGVyLnVzaW5nV2ViQXVkaW8gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgIEhvd2xlci51c2luZ1dlYkF1ZGlvID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGF1ZGlvIGNvbnRleHQgY3JlYXRpb24gc3RpbGwgZmFpbGVkLCBzZXQgdXNpbmcgd2ViIGF1ZGlvIHRvIGZhbHNlLlxuICAgIGlmICghSG93bGVyLmN0eCkge1xuICAgICAgSG93bGVyLnVzaW5nV2ViQXVkaW8gPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBhIHdlYnZpZXcgaXMgYmVpbmcgdXNlZCBvbiBpT1M4IG9yIGVhcmxpZXIgKHJhdGhlciB0aGFuIHRoZSBicm93c2VyKS5cbiAgICAvLyBJZiBpdCBpcywgZGlzYWJsZSBXZWIgQXVkaW8gYXMgaXQgY2F1c2VzIGNyYXNoaW5nLlxuICAgIHZhciBpT1MgPSAoL2lQKGhvbmV8b2R8YWQpLy50ZXN0KEhvd2xlci5fbmF2aWdhdG9yICYmIEhvd2xlci5fbmF2aWdhdG9yLnBsYXRmb3JtKSk7XG4gICAgdmFyIGFwcFZlcnNpb24gPSBIb3dsZXIuX25hdmlnYXRvciAmJiBIb3dsZXIuX25hdmlnYXRvci5hcHBWZXJzaW9uLm1hdGNoKC9PUyAoXFxkKylfKFxcZCspXz8oXFxkKyk/Lyk7XG4gICAgdmFyIHZlcnNpb24gPSBhcHBWZXJzaW9uID8gcGFyc2VJbnQoYXBwVmVyc2lvblsxXSwgMTApIDogbnVsbDtcbiAgICBpZiAoaU9TICYmIHZlcnNpb24gJiYgdmVyc2lvbiA8IDkpIHtcbiAgICAgIHZhciBzYWZhcmkgPSAvc2FmYXJpLy50ZXN0KEhvd2xlci5fbmF2aWdhdG9yICYmIEhvd2xlci5fbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIGlmIChIb3dsZXIuX25hdmlnYXRvciAmJiAhc2FmYXJpKSB7XG4gICAgICAgIEhvd2xlci51c2luZ1dlYkF1ZGlvID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGFuZCBleHBvc2UgdGhlIG1hc3RlciBHYWluTm9kZSB3aGVuIHVzaW5nIFdlYiBBdWRpbyAodXNlZnVsIGZvciBwbHVnaW5zIG9yIGFkdmFuY2VkIHVzYWdlKS5cbiAgICBpZiAoSG93bGVyLnVzaW5nV2ViQXVkaW8pIHtcbiAgICAgIEhvd2xlci5tYXN0ZXJHYWluID0gKHR5cGVvZiBIb3dsZXIuY3R4LmNyZWF0ZUdhaW4gPT09ICd1bmRlZmluZWQnKSA/IEhvd2xlci5jdHguY3JlYXRlR2Fpbk5vZGUoKSA6IEhvd2xlci5jdHguY3JlYXRlR2FpbigpO1xuICAgICAgSG93bGVyLm1hc3RlckdhaW4uZ2Fpbi5zZXRWYWx1ZUF0VGltZShIb3dsZXIuX211dGVkID8gMCA6IEhvd2xlci5fdm9sdW1lLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgIEhvd2xlci5tYXN0ZXJHYWluLmNvbm5lY3QoSG93bGVyLmN0eC5kZXN0aW5hdGlvbik7XG4gICAgfVxuXG4gICAgLy8gUmUtcnVuIHRoZSBzZXR1cCBvbiBIb3dsZXIuXG4gICAgSG93bGVyLl9zZXR1cCgpO1xuICB9O1xuXG4gIC8vIEFkZCBzdXBwb3J0IGZvciBBTUQgKEFzeW5jaHJvbm91cyBNb2R1bGUgRGVmaW5pdGlvbikgbGlicmFyaWVzIHN1Y2ggYXMgcmVxdWlyZS5qcy5cbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShbXSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBIb3dsZXI6IEhvd2xlcixcbiAgICAgICAgSG93bDogSG93bFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEFkZCBzdXBwb3J0IGZvciBDb21tb25KUyBsaWJyYXJpZXMgc3VjaCBhcyBicm93c2VyaWZ5LlxuICBpZiAodHlwZW9mIGV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgZXhwb3J0cy5Ib3dsZXIgPSBIb3dsZXI7XG4gICAgZXhwb3J0cy5Ib3dsID0gSG93bDtcbiAgfVxuXG4gIC8vIEFkZCB0byBnbG9iYWwgaW4gTm9kZS5qcyAoZm9yIHRlc3RpbmcsIGV0YykuXG4gIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIGdsb2JhbC5Ib3dsZXJHbG9iYWwgPSBIb3dsZXJHbG9iYWw7XG4gICAgZ2xvYmFsLkhvd2xlciA9IEhvd2xlcjtcbiAgICBnbG9iYWwuSG93bCA9IEhvd2w7XG4gICAgZ2xvYmFsLlNvdW5kID0gU291bmQ7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHsgIC8vIERlZmluZSBnbG9iYWxseSBpbiBjYXNlIEFNRCBpcyBub3QgYXZhaWxhYmxlIG9yIHVudXNlZC5cbiAgICB3aW5kb3cuSG93bGVyR2xvYmFsID0gSG93bGVyR2xvYmFsO1xuICAgIHdpbmRvdy5Ib3dsZXIgPSBIb3dsZXI7XG4gICAgd2luZG93Lkhvd2wgPSBIb3dsO1xuICAgIHdpbmRvdy5Tb3VuZCA9IFNvdW5kO1xuICB9XG59KSgpO1xuXG5cbi8qIVxuICogIFNwYXRpYWwgUGx1Z2luIC0gQWRkcyBzdXBwb3J0IGZvciBzdGVyZW8gYW5kIDNEIGF1ZGlvIHdoZXJlIFdlYiBBdWRpbyBpcyBzdXBwb3J0ZWQuXG4gKiAgXG4gKiAgaG93bGVyLmpzIHYyLjIuMVxuICogIGhvd2xlcmpzLmNvbVxuICpcbiAqICAoYykgMjAxMy0yMDIwLCBKYW1lcyBTaW1wc29uIG9mIEdvbGRGaXJlIFN0dWRpb3NcbiAqICBnb2xkZmlyZXN0dWRpb3MuY29tXG4gKlxuICogIE1JVCBMaWNlbnNlXG4gKi9cblxuKGZ1bmN0aW9uKCkge1xuXG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBTZXR1cCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gIEhvd2xlckdsb2JhbC5wcm90b3R5cGUuX3BvcyA9IFswLCAwLCAwXTtcbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZS5fb3JpZW50YXRpb24gPSBbMCwgMCwgLTEsIDAsIDEsIDBdO1xuXG4gIC8qKiBHbG9iYWwgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byB1cGRhdGUgdGhlIHN0ZXJlbyBwYW5uaW5nIHBvc2l0aW9uIG9mIGFsbCBjdXJyZW50IEhvd2xzLlxuICAgKiBGdXR1cmUgSG93bHMgd2lsbCBub3QgdXNlIHRoaXMgdmFsdWUgdW5sZXNzIGV4cGxpY2l0bHkgc2V0LlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHBhbiBBIHZhbHVlIG9mIC0xLjAgaXMgYWxsIHRoZSB3YXkgbGVmdCBhbmQgMS4wIGlzIGFsbCB0aGUgd2F5IHJpZ2h0LlxuICAgKiBAcmV0dXJuIHtIb3dsZXIvTnVtYmVyfSAgICAgU2VsZiBvciBjdXJyZW50IHN0ZXJlbyBwYW5uaW5nIHZhbHVlLlxuICAgKi9cbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZS5zdGVyZW8gPSBmdW5jdGlvbihwYW4pIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuY3R4IHx8ICFzZWxmLmN0eC5saXN0ZW5lcikge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBIb3dscyBhbmQgdXBkYXRlIHRoZWlyIHN0ZXJlbyBwYW5uaW5nLlxuICAgIGZvciAodmFyIGk9c2VsZi5faG93bHMubGVuZ3RoLTE7IGk+PTA7IGktLSkge1xuICAgICAgc2VsZi5faG93bHNbaV0uc3RlcmVvKHBhbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBsaXN0ZW5lciBpbiAzRCBjYXJ0ZXNpYW4gc3BhY2UuIFNvdW5kcyB1c2luZ1xuICAgKiAzRCBwb3NpdGlvbiB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsaXN0ZW5lcidzIHBvc2l0aW9uLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHggVGhlIHgtcG9zaXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHkgVGhlIHktcG9zaXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHogVGhlIHotcG9zaXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcmV0dXJuIHtIb3dsZXIvQXJyYXl9ICAgU2VsZiBvciBjdXJyZW50IGxpc3RlbmVyIHBvc2l0aW9uLlxuICAgKi9cbiAgSG93bGVyR2xvYmFsLnByb3RvdHlwZS5wb3MgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLmN0eCB8fCAhc2VsZi5jdHgubGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgZGVmYXVsdHMgZm9yIG9wdGlvbmFsICd5JyAmICd6Jy5cbiAgICB5ID0gKHR5cGVvZiB5ICE9PSAnbnVtYmVyJykgPyBzZWxmLl9wb3NbMV0gOiB5O1xuICAgIHogPSAodHlwZW9mIHogIT09ICdudW1iZXInKSA/IHNlbGYuX3Bvc1syXSA6IHo7XG5cbiAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICBzZWxmLl9wb3MgPSBbeCwgeSwgel07XG5cbiAgICAgIGlmICh0eXBlb2Ygc2VsZi5jdHgubGlzdGVuZXIucG9zaXRpb25YICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci5wb3NpdGlvblguc2V0VGFyZ2V0QXRUaW1lKHNlbGYuX3Bvc1swXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIucG9zaXRpb25ZLnNldFRhcmdldEF0VGltZShzZWxmLl9wb3NbMV0sIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnBvc2l0aW9uWi5zZXRUYXJnZXRBdFRpbWUoc2VsZi5fcG9zWzJdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIuc2V0UG9zaXRpb24oc2VsZi5fcG9zWzBdLCBzZWxmLl9wb3NbMV0sIHNlbGYuX3Bvc1syXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzZWxmLl9wb3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIGRpcmVjdGlvbiB0aGUgbGlzdGVuZXIgaXMgcG9pbnRpbmcgaW4gdGhlIDNEIGNhcnRlc2lhbiBzcGFjZS5cbiAgICogQSBmcm9udCBhbmQgdXAgdmVjdG9yIG11c3QgYmUgcHJvdmlkZWQuIFRoZSBmcm9udCBpcyB0aGUgZGlyZWN0aW9uIHRoZVxuICAgKiBmYWNlIG9mIHRoZSBsaXN0ZW5lciBpcyBwb2ludGluZywgYW5kIHVwIGlzIHRoZSBkaXJlY3Rpb24gdGhlIHRvcCBvZiB0aGVcbiAgICogbGlzdGVuZXIgaXMgcG9pbnRpbmcuIFRodXMsIHRoZXNlIHZhbHVlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgYXQgcmlnaHQgYW5nbGVzXG4gICAqIGZyb20gZWFjaCBvdGhlci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB4ICAgVGhlIHgtb3JpZW50YXRpb24gb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHkgICBUaGUgeS1vcmllbnRhdGlvbiBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geiAgIFRoZSB6LW9yaWVudGF0aW9uIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB4VXAgVGhlIHgtb3JpZW50YXRpb24gb2YgdGhlIHRvcCBvZiB0aGUgbGlzdGVuZXIuXG4gICAqIEBwYXJhbSAge051bWJlcn0geVVwIFRoZSB5LW9yaWVudGF0aW9uIG9mIHRoZSB0b3Agb2YgdGhlIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHpVcCBUaGUgei1vcmllbnRhdGlvbiBvZiB0aGUgdG9wIG9mIHRoZSBsaXN0ZW5lci5cbiAgICogQHJldHVybiB7SG93bGVyL0FycmF5fSAgICAgUmV0dXJucyBzZWxmIG9yIHRoZSBjdXJyZW50IG9yaWVudGF0aW9uIHZlY3RvcnMuXG4gICAqL1xuICBIb3dsZXJHbG9iYWwucHJvdG90eXBlLm9yaWVudGF0aW9uID0gZnVuY3Rpb24oeCwgeSwgeiwgeFVwLCB5VXAsIHpVcCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5jdHggfHwgIXNlbGYuY3R4Lmxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIGRlZmF1bHRzIGZvciBvcHRpb25hbCAneScgJiAneicuXG4gICAgdmFyIG9yID0gc2VsZi5fb3JpZW50YXRpb247XG4gICAgeSA9ICh0eXBlb2YgeSAhPT0gJ251bWJlcicpID8gb3JbMV0gOiB5O1xuICAgIHogPSAodHlwZW9mIHogIT09ICdudW1iZXInKSA/IG9yWzJdIDogejtcbiAgICB4VXAgPSAodHlwZW9mIHhVcCAhPT0gJ251bWJlcicpID8gb3JbM10gOiB4VXA7XG4gICAgeVVwID0gKHR5cGVvZiB5VXAgIT09ICdudW1iZXInKSA/IG9yWzRdIDogeVVwO1xuICAgIHpVcCA9ICh0eXBlb2YgelVwICE9PSAnbnVtYmVyJykgPyBvcls1XSA6IHpVcDtcblxuICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHNlbGYuX29yaWVudGF0aW9uID0gW3gsIHksIHosIHhVcCwgeVVwLCB6VXBdO1xuXG4gICAgICBpZiAodHlwZW9mIHNlbGYuY3R4Lmxpc3RlbmVyLmZvcndhcmRYICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci5mb3J3YXJkWC5zZXRUYXJnZXRBdFRpbWUoeCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIuZm9yd2FyZFkuc2V0VGFyZ2V0QXRUaW1lKHksIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLmZvcndhcmRaLnNldFRhcmdldEF0VGltZSh6LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgICBzZWxmLmN0eC5saXN0ZW5lci51cFguc2V0VGFyZ2V0QXRUaW1lKHhVcCwgSG93bGVyLmN0eC5jdXJyZW50VGltZSwgMC4xKTtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIudXBZLnNldFRhcmdldEF0VGltZSh5VXAsIEhvd2xlci5jdHguY3VycmVudFRpbWUsIDAuMSk7XG4gICAgICAgIHNlbGYuY3R4Lmxpc3RlbmVyLnVwWi5zZXRUYXJnZXRBdFRpbWUoelVwLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lLCAwLjEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZi5jdHgubGlzdGVuZXIuc2V0T3JpZW50YXRpb24oeCwgeSwgeiwgeFVwLCB5VXAsIHpVcCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKiogR3JvdXAgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogQWRkIG5ldyBwcm9wZXJ0aWVzIHRvIHRoZSBjb3JlIGluaXQuXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBfc3VwZXIgQ29yZSBpbml0IG1ldGhvZC5cbiAgICogQHJldHVybiB7SG93bH1cbiAgICovXG4gIEhvd2wucHJvdG90eXBlLmluaXQgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG8pIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgLy8gU2V0dXAgdXNlci1kZWZpbmVkIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgIHNlbGYuX29yaWVudGF0aW9uID0gby5vcmllbnRhdGlvbiB8fCBbMSwgMCwgMF07XG4gICAgICBzZWxmLl9zdGVyZW8gPSBvLnN0ZXJlbyB8fCBudWxsO1xuICAgICAgc2VsZi5fcG9zID0gby5wb3MgfHwgbnVsbDtcbiAgICAgIHNlbGYuX3Bhbm5lckF0dHIgPSB7XG4gICAgICAgIGNvbmVJbm5lckFuZ2xlOiB0eXBlb2Ygby5jb25lSW5uZXJBbmdsZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLmNvbmVJbm5lckFuZ2xlIDogMzYwLFxuICAgICAgICBjb25lT3V0ZXJBbmdsZTogdHlwZW9mIG8uY29uZU91dGVyQW5nbGUgIT09ICd1bmRlZmluZWQnID8gby5jb25lT3V0ZXJBbmdsZSA6IDM2MCxcbiAgICAgICAgY29uZU91dGVyR2FpbjogdHlwZW9mIG8uY29uZU91dGVyR2FpbiAhPT0gJ3VuZGVmaW5lZCcgPyBvLmNvbmVPdXRlckdhaW4gOiAwLFxuICAgICAgICBkaXN0YW5jZU1vZGVsOiB0eXBlb2Ygby5kaXN0YW5jZU1vZGVsICE9PSAndW5kZWZpbmVkJyA/IG8uZGlzdGFuY2VNb2RlbCA6ICdpbnZlcnNlJyxcbiAgICAgICAgbWF4RGlzdGFuY2U6IHR5cGVvZiBvLm1heERpc3RhbmNlICE9PSAndW5kZWZpbmVkJyA/IG8ubWF4RGlzdGFuY2UgOiAxMDAwMCxcbiAgICAgICAgcGFubmluZ01vZGVsOiB0eXBlb2Ygby5wYW5uaW5nTW9kZWwgIT09ICd1bmRlZmluZWQnID8gby5wYW5uaW5nTW9kZWwgOiAnSFJURicsXG4gICAgICAgIHJlZkRpc3RhbmNlOiB0eXBlb2Ygby5yZWZEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLnJlZkRpc3RhbmNlIDogMSxcbiAgICAgICAgcm9sbG9mZkZhY3RvcjogdHlwZW9mIG8ucm9sbG9mZkZhY3RvciAhPT0gJ3VuZGVmaW5lZCcgPyBvLnJvbGxvZmZGYWN0b3IgOiAxXG4gICAgICB9O1xuXG4gICAgICAvLyBTZXR1cCBldmVudCBsaXN0ZW5lcnMuXG4gICAgICBzZWxmLl9vbnN0ZXJlbyA9IG8ub25zdGVyZW8gPyBbe2ZuOiBvLm9uc3RlcmVvfV0gOiBbXTtcbiAgICAgIHNlbGYuX29ucG9zID0gby5vbnBvcyA/IFt7Zm46IG8ub25wb3N9XSA6IFtdO1xuICAgICAgc2VsZi5fb25vcmllbnRhdGlvbiA9IG8ub25vcmllbnRhdGlvbiA/IFt7Zm46IG8ub25vcmllbnRhdGlvbn1dIDogW107XG5cbiAgICAgIC8vIENvbXBsZXRlIGluaXRpbGl6YXRpb24gd2l0aCBob3dsZXIuanMgY29yZSdzIGluaXQgZnVuY3Rpb24uXG4gICAgICByZXR1cm4gX3N1cGVyLmNhbGwodGhpcywgbyk7XG4gICAgfTtcbiAgfSkoSG93bC5wcm90b3R5cGUuaW5pdCk7XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIHN0ZXJlbyBwYW5uaW5nIG9mIHRoZSBhdWRpbyBzb3VyY2UgZm9yIHRoaXMgc291bmQgb3IgYWxsIGluIHRoZSBncm91cC5cbiAgICogQHBhcmFtICB7TnVtYmVyfSBwYW4gIEEgdmFsdWUgb2YgLTEuMCBpcyBhbGwgdGhlIHdheSBsZWZ0IGFuZCAxLjAgaXMgYWxsIHRoZSB3YXkgcmlnaHQuXG4gICAqIEBwYXJhbSAge051bWJlcn0gaWQgKG9wdGlvbmFsKSBUaGUgc291bmQgSUQuIElmIG5vbmUgaXMgcGFzc2VkLCBhbGwgaW4gZ3JvdXAgd2lsbCBiZSB1cGRhdGVkLlxuICAgKiBAcmV0dXJuIHtIb3dsL051bWJlcn0gICAgUmV0dXJucyBzZWxmIG9yIHRoZSBjdXJyZW50IHN0ZXJlbyBwYW5uaW5nIHZhbHVlLlxuICAgKi9cbiAgSG93bC5wcm90b3R5cGUuc3RlcmVvID0gZnVuY3Rpb24ocGFuLCBpZCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzb3VuZCBoYXNuJ3QgbG9hZGVkLCBhZGQgaXQgdG8gdGhlIGxvYWQgcXVldWUgdG8gY2hhbmdlIHN0ZXJlbyBwYW4gd2hlbiBjYXBhYmxlLlxuICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogJ3N0ZXJlbycsXG4gICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5zdGVyZW8ocGFuLCBpZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgUGFubmVyU3RlcmVvTm9kZSBzdXBwb3J0IGFuZCBmYWxsYmFjayB0byBQYW5uZXJOb2RlIGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgdmFyIHBhbm5lclR5cGUgPSAodHlwZW9mIEhvd2xlci5jdHguY3JlYXRlU3RlcmVvUGFubmVyID09PSAndW5kZWZpbmVkJykgPyAnc3BhdGlhbCcgOiAnc3RlcmVvJztcblxuICAgIC8vIFNldHVwIHRoZSBncm91cCdzIHN0ZXJlbyBwYW5uaW5nIGlmIG5vIElEIGlzIHBhc3NlZC5cbiAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gUmV0dXJuIHRoZSBncm91cCdzIHN0ZXJlbyBwYW5uaW5nIGlmIG5vIHBhcmFtZXRlcnMgYXJlIHBhc3NlZC5cbiAgICAgIGlmICh0eXBlb2YgcGFuID09PSAnbnVtYmVyJykge1xuICAgICAgICBzZWxmLl9zdGVyZW8gPSBwYW47XG4gICAgICAgIHNlbGYuX3BvcyA9IFtwYW4sIDAsIDBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX3N0ZXJlbztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGFuZ2UgdGhlIHN0cmVvIHBhbm5pbmcgb2Ygb25lIG9yIGFsbCBzb3VuZHMgaW4gZ3JvdXAuXG4gICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICBpZiAodHlwZW9mIHBhbiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBzb3VuZC5fc3RlcmVvID0gcGFuO1xuICAgICAgICAgIHNvdW5kLl9wb3MgPSBbcGFuLCAwLCAwXTtcblxuICAgICAgICAgIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGZhbGxpbmcgYmFjaywgbWFrZSBzdXJlIHRoZSBwYW5uaW5nTW9kZWwgaXMgZXF1YWxwb3dlci5cbiAgICAgICAgICAgIHNvdW5kLl9wYW5uZXJBdHRyLnBhbm5pbmdNb2RlbCA9ICdlcXVhbHBvd2VyJztcblxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBwYW5uZXIgc2V0dXAgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbm90LlxuICAgICAgICAgICAgaWYgKCFzb3VuZC5fcGFubmVyIHx8ICFzb3VuZC5fcGFubmVyLnBhbikge1xuICAgICAgICAgICAgICBzZXR1cFBhbm5lcihzb3VuZCwgcGFubmVyVHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwYW5uZXJUeXBlID09PSAnc3BhdGlhbCcpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWC5zZXRWYWx1ZUF0VGltZShwYW4sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25ZLnNldFZhbHVlQXRUaW1lKDAsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25aLnNldFZhbHVlQXRUaW1lKDAsIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIuc2V0UG9zaXRpb24ocGFuLCAwLCAwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5wYW4uc2V0VmFsdWVBdFRpbWUocGFuLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLl9lbWl0KCdzdGVyZW8nLCBzb3VuZC5faWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzb3VuZC5fc3RlcmVvO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIDNEIHNwYXRpYWwgcG9zaXRpb24gb2YgdGhlIGF1ZGlvIHNvdXJjZSBmb3IgdGhpcyBzb3VuZCBvciBncm91cCByZWxhdGl2ZSB0byB0aGUgZ2xvYmFsIGxpc3RlbmVyLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHggIFRoZSB4LXBvc2l0aW9uIG9mIHRoZSBhdWRpbyBzb3VyY2UuXG4gICAqIEBwYXJhbSAge051bWJlcn0geSAgVGhlIHktcG9zaXRpb24gb2YgdGhlIGF1ZGlvIHNvdXJjZS5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB6ICBUaGUgei1wb3NpdGlvbiBvZiB0aGUgYXVkaW8gc291cmNlLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIChvcHRpb25hbCkgVGhlIHNvdW5kIElELiBJZiBub25lIGlzIHBhc3NlZCwgYWxsIGluIGdyb3VwIHdpbGwgYmUgdXBkYXRlZC5cbiAgICogQHJldHVybiB7SG93bC9BcnJheX0gICAgUmV0dXJucyBzZWxmIG9yIHRoZSBjdXJyZW50IDNEIHNwYXRpYWwgcG9zaXRpb246IFt4LCB5LCB6XS5cbiAgICovXG4gIEhvd2wucHJvdG90eXBlLnBvcyA9IGZ1bmN0aW9uKHgsIHksIHosIGlkKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgLy8gU3RvcCByaWdodCBoZXJlIGlmIG5vdCB1c2luZyBXZWIgQXVkaW8uXG4gICAgaWYgKCFzZWxmLl93ZWJBdWRpbykge1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHNvdW5kIGhhc24ndCBsb2FkZWQsIGFkZCBpdCB0byB0aGUgbG9hZCBxdWV1ZSB0byBjaGFuZ2UgcG9zaXRpb24gd2hlbiBjYXBhYmxlLlxuICAgIGlmIChzZWxmLl9zdGF0ZSAhPT0gJ2xvYWRlZCcpIHtcbiAgICAgIHNlbGYuX3F1ZXVlLnB1c2goe1xuICAgICAgICBldmVudDogJ3BvcycsXG4gICAgICAgIGFjdGlvbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgc2VsZi5wb3MoeCwgeSwgeiwgaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0cyBmb3Igb3B0aW9uYWwgJ3knICYgJ3onLlxuICAgIHkgPSAodHlwZW9mIHkgIT09ICdudW1iZXInKSA/IDAgOiB5O1xuICAgIHogPSAodHlwZW9mIHogIT09ICdudW1iZXInKSA/IC0wLjUgOiB6O1xuXG4gICAgLy8gU2V0dXAgdGhlIGdyb3VwJ3Mgc3BhdGlhbCBwb3NpdGlvbiBpZiBubyBJRCBpcyBwYXNzZWQuXG4gICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIFJldHVybiB0aGUgZ3JvdXAncyBzcGF0aWFsIHBvc2l0aW9uIGlmIG5vIHBhcmFtZXRlcnMgYXJlIHBhc3NlZC5cbiAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgc2VsZi5fcG9zID0gW3gsIHksIHpdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuX3BvcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGFuZ2UgdGhlIHNwYXRpYWwgcG9zaXRpb24gb2Ygb25lIG9yIGFsbCBzb3VuZHMgaW4gZ3JvdXAuXG4gICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgc291bmQuX3BvcyA9IFt4LCB5LCB6XTtcblxuICAgICAgICAgIGlmIChzb3VuZC5fbm9kZSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYSBwYW5uZXIgc2V0dXAgYW5kIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbm90LlxuICAgICAgICAgICAgaWYgKCFzb3VuZC5fcGFubmVyIHx8IHNvdW5kLl9wYW5uZXIucGFuKSB7XG4gICAgICAgICAgICAgIHNldHVwUGFubmVyKHNvdW5kLCAnc3BhdGlhbCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdW5kLl9wYW5uZXIucG9zaXRpb25YICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWC5zZXRWYWx1ZUF0VGltZSh4LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblkuc2V0VmFsdWVBdFRpbWUoeSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25aLnNldFZhbHVlQXRUaW1lKHosIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5zZXRQb3NpdGlvbih4LCB5LCB6KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLl9lbWl0KCdwb3MnLCBzb3VuZC5faWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzb3VuZC5fcG9zO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGY7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgdGhlIGRpcmVjdGlvbiB0aGUgYXVkaW8gc291cmNlIGlzIHBvaW50aW5nIGluIHRoZSAzRCBjYXJ0ZXNpYW4gY29vcmRpbmF0ZVxuICAgKiBzcGFjZS4gRGVwZW5kaW5nIG9uIGhvdyBkaXJlY3Rpb24gdGhlIHNvdW5kIGlzLCBiYXNlZCBvbiB0aGUgYGNvbmVgIGF0dHJpYnV0ZXMsXG4gICAqIGEgc291bmQgcG9pbnRpbmcgYXdheSBmcm9tIHRoZSBsaXN0ZW5lciBjYW4gYmUgcXVpZXQgb3Igc2lsZW50LlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHggIFRoZSB4LW9yaWVudGF0aW9uIG9mIHRoZSBzb3VyY2UuXG4gICAqIEBwYXJhbSAge051bWJlcn0geSAgVGhlIHktb3JpZW50YXRpb24gb2YgdGhlIHNvdXJjZS5cbiAgICogQHBhcmFtICB7TnVtYmVyfSB6ICBUaGUgei1vcmllbnRhdGlvbiBvZiB0aGUgc291cmNlLlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IGlkIChvcHRpb25hbCkgVGhlIHNvdW5kIElELiBJZiBub25lIGlzIHBhc3NlZCwgYWxsIGluIGdyb3VwIHdpbGwgYmUgdXBkYXRlZC5cbiAgICogQHJldHVybiB7SG93bC9BcnJheX0gICAgUmV0dXJucyBzZWxmIG9yIHRoZSBjdXJyZW50IDNEIHNwYXRpYWwgb3JpZW50YXRpb246IFt4LCB5LCB6XS5cbiAgICovXG4gIEhvd2wucHJvdG90eXBlLm9yaWVudGF0aW9uID0gZnVuY3Rpb24oeCwgeSwgeiwgaWQpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAvLyBTdG9wIHJpZ2h0IGhlcmUgaWYgbm90IHVzaW5nIFdlYiBBdWRpby5cbiAgICBpZiAoIXNlbGYuX3dlYkF1ZGlvKSB7XG4gICAgICByZXR1cm4gc2VsZjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgc291bmQgaGFzbid0IGxvYWRlZCwgYWRkIGl0IHRvIHRoZSBsb2FkIHF1ZXVlIHRvIGNoYW5nZSBvcmllbnRhdGlvbiB3aGVuIGNhcGFibGUuXG4gICAgaWYgKHNlbGYuX3N0YXRlICE9PSAnbG9hZGVkJykge1xuICAgICAgc2VsZi5fcXVldWUucHVzaCh7XG4gICAgICAgIGV2ZW50OiAnb3JpZW50YXRpb24nLFxuICAgICAgICBhY3Rpb246IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHNlbGYub3JpZW50YXRpb24oeCwgeSwgeiwgaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBkZWZhdWx0cyBmb3Igb3B0aW9uYWwgJ3knICYgJ3onLlxuICAgIHkgPSAodHlwZW9mIHkgIT09ICdudW1iZXInKSA/IHNlbGYuX29yaWVudGF0aW9uWzFdIDogeTtcbiAgICB6ID0gKHR5cGVvZiB6ICE9PSAnbnVtYmVyJykgPyBzZWxmLl9vcmllbnRhdGlvblsyXSA6IHo7XG5cbiAgICAvLyBTZXR1cCB0aGUgZ3JvdXAncyBzcGF0aWFsIG9yaWVudGF0aW9uIGlmIG5vIElEIGlzIHBhc3NlZC5cbiAgICBpZiAodHlwZW9mIGlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gUmV0dXJuIHRoZSBncm91cCdzIHNwYXRpYWwgb3JpZW50YXRpb24gaWYgbm8gcGFyYW1ldGVycyBhcmUgcGFzc2VkLlxuICAgICAgaWYgKHR5cGVvZiB4ID09PSAnbnVtYmVyJykge1xuICAgICAgICBzZWxmLl9vcmllbnRhdGlvbiA9IFt4LCB5LCB6XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzZWxmLl9vcmllbnRhdGlvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGFuZ2UgdGhlIHNwYXRpYWwgb3JpZW50YXRpb24gb2Ygb25lIG9yIGFsbCBzb3VuZHMgaW4gZ3JvdXAuXG4gICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBHZXQgdGhlIHNvdW5kLlxuICAgICAgdmFyIHNvdW5kID0gc2VsZi5fc291bmRCeUlkKGlkc1tpXSk7XG5cbiAgICAgIGlmIChzb3VuZCkge1xuICAgICAgICBpZiAodHlwZW9mIHggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgc291bmQuX29yaWVudGF0aW9uID0gW3gsIHksIHpdO1xuXG4gICAgICAgICAgaWYgKHNvdW5kLl9ub2RlKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhIHBhbm5lciBzZXR1cCBhbmQgY3JlYXRlIGEgbmV3IG9uZSBpZiBub3QuXG4gICAgICAgICAgICBpZiAoIXNvdW5kLl9wYW5uZXIpIHtcbiAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBwb3NpdGlvbiB0byBzZXR1cCB0aGUgbm9kZSB3aXRoLlxuICAgICAgICAgICAgICBpZiAoIXNvdW5kLl9wb3MpIHtcbiAgICAgICAgICAgICAgICBzb3VuZC5fcG9zID0gc2VsZi5fcG9zIHx8IFswLCAwLCAtMC41XTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNldHVwUGFubmVyKHNvdW5kLCAnc3BhdGlhbCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25YICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBzb3VuZC5fcGFubmVyLm9yaWVudGF0aW9uWC5zZXRWYWx1ZUF0VGltZSh4LCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblkuc2V0VmFsdWVBdFRpbWUoeSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgICAgICAgIHNvdW5kLl9wYW5uZXIub3JpZW50YXRpb25aLnNldFZhbHVlQXRUaW1lKHosIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc291bmQuX3Bhbm5lci5zZXRPcmllbnRhdGlvbih4LCB5LCB6KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWxmLl9lbWl0KCdvcmllbnRhdGlvbicsIHNvdW5kLl9pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNvdW5kLl9vcmllbnRhdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHRoZSBwYW5uZXIgbm9kZSdzIGF0dHJpYnV0ZXMgZm9yIGEgc291bmQgb3IgZ3JvdXAgb2Ygc291bmRzLlxuICAgKiBUaGlzIG1ldGhvZCBjYW4gb3B0aW9uYWxsIHRha2UgMCwgMSBvciAyIGFyZ3VtZW50cy5cbiAgICogICBwYW5uZXJBdHRyKCkgLT4gUmV0dXJucyB0aGUgZ3JvdXAncyB2YWx1ZXMuXG4gICAqICAgcGFubmVyQXR0cihpZCkgLT4gUmV0dXJucyB0aGUgc291bmQgaWQncyB2YWx1ZXMuXG4gICAqICAgcGFubmVyQXR0cihvKSAtPiBTZXQncyB0aGUgdmFsdWVzIG9mIGFsbCBzb3VuZHMgaW4gdGhpcyBIb3dsIGdyb3VwLlxuICAgKiAgIHBhbm5lckF0dHIobywgaWQpIC0+IFNldCdzIHRoZSB2YWx1ZXMgb2YgcGFzc2VkIHNvdW5kIGlkLlxuICAgKlxuICAgKiAgIEF0dHJpYnV0ZXM6XG4gICAqICAgICBjb25lSW5uZXJBbmdsZSAtICgzNjAgYnkgZGVmYXVsdCkgQSBwYXJhbWV0ZXIgZm9yIGRpcmVjdGlvbmFsIGF1ZGlvIHNvdXJjZXMsIHRoaXMgaXMgYW4gYW5nbGUsIGluIGRlZ3JlZXMsXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGluc2lkZSBvZiB3aGljaCB0aGVyZSB3aWxsIGJlIG5vIHZvbHVtZSByZWR1Y3Rpb24uXG4gICAqICAgICBjb25lT3V0ZXJBbmdsZSAtICgzNjAgYnkgZGVmYXVsdCkgQSBwYXJhbWV0ZXIgZm9yIGRpcmVjdGlvbmFsIGF1ZGlvIHNvdXJjZXMsIHRoaXMgaXMgYW4gYW5nbGUsIGluIGRlZ3JlZXMsXG4gICAqICAgICAgICAgICAgICAgICAgICAgIG91dHNpZGUgb2Ygd2hpY2ggdGhlIHZvbHVtZSB3aWxsIGJlIHJlZHVjZWQgdG8gYSBjb25zdGFudCB2YWx1ZSBvZiBgY29uZU91dGVyR2FpbmAuXG4gICAqICAgICBjb25lT3V0ZXJHYWluIC0gKDAgYnkgZGVmYXVsdCkgQSBwYXJhbWV0ZXIgZm9yIGRpcmVjdGlvbmFsIGF1ZGlvIHNvdXJjZXMsIHRoaXMgaXMgdGhlIGdhaW4gb3V0c2lkZSBvZiB0aGVcbiAgICogICAgICAgICAgICAgICAgICAgICBgY29uZU91dGVyQW5nbGVgLiBJdCBpcyBhIGxpbmVhciB2YWx1ZSBpbiB0aGUgcmFuZ2UgYFswLCAxXWAuXG4gICAqICAgICBkaXN0YW5jZU1vZGVsIC0gKCdpbnZlcnNlJyBieSBkZWZhdWx0KSBEZXRlcm1pbmVzIGFsZ29yaXRobSB1c2VkIHRvIHJlZHVjZSB2b2x1bWUgYXMgYXVkaW8gbW92ZXMgYXdheSBmcm9tXG4gICAqICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuIENhbiBiZSBgbGluZWFyYCwgYGludmVyc2VgIG9yIGBleHBvbmVudGlhbC5cbiAgICogICAgIG1heERpc3RhbmNlIC0gKDEwMDAwIGJ5IGRlZmF1bHQpIFRoZSBtYXhpbXVtIGRpc3RhbmNlIGJldHdlZW4gc291cmNlIGFuZCBsaXN0ZW5lciwgYWZ0ZXIgd2hpY2ggdGhlIHZvbHVtZVxuICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIG5vdCBiZSByZWR1Y2VkIGFueSBmdXJ0aGVyLlxuICAgKiAgICAgcmVmRGlzdGFuY2UgLSAoMSBieSBkZWZhdWx0KSBBIHJlZmVyZW5jZSBkaXN0YW5jZSBmb3IgcmVkdWNpbmcgdm9sdW1lIGFzIHNvdXJjZSBtb3ZlcyBmdXJ0aGVyIGZyb20gdGhlIGxpc3RlbmVyLlxuICAgKiAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHNpbXBseSBhIHZhcmlhYmxlIG9mIHRoZSBkaXN0YW5jZSBtb2RlbCBhbmQgaGFzIGEgZGlmZmVyZW50IGVmZmVjdCBkZXBlbmRpbmcgb24gd2hpY2ggbW9kZWxcbiAgICogICAgICAgICAgICAgICAgICAgaXMgdXNlZCBhbmQgdGhlIHNjYWxlIG9mIHlvdXIgY29vcmRpbmF0ZXMuIEdlbmVyYWxseSwgdm9sdW1lIHdpbGwgYmUgZXF1YWwgdG8gMSBhdCB0aGlzIGRpc3RhbmNlLlxuICAgKiAgICAgcm9sbG9mZkZhY3RvciAtICgxIGJ5IGRlZmF1bHQpIEhvdyBxdWlja2x5IHRoZSB2b2x1bWUgcmVkdWNlcyBhcyBzb3VyY2UgbW92ZXMgZnJvbSBsaXN0ZW5lci4gVGhpcyBpcyBzaW1wbHkgYVxuICAgKiAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9mIHRoZSBkaXN0YW5jZSBtb2RlbCBhbmQgY2FuIGJlIGluIHRoZSByYW5nZSBvZiBgWzAsIDFdYCB3aXRoIGBsaW5lYXJgIGFuZCBgWzAsIOKInl1gXG4gICAqICAgICAgICAgICAgICAgICAgICAgd2l0aCBgaW52ZXJzZWAgYW5kIGBleHBvbmVudGlhbGAuXG4gICAqICAgICBwYW5uaW5nTW9kZWwgLSAoJ0hSVEYnIGJ5IGRlZmF1bHQpIERldGVybWluZXMgd2hpY2ggc3BhdGlhbGl6YXRpb24gYWxnb3JpdGhtIGlzIHVzZWQgdG8gcG9zaXRpb24gYXVkaW8uXG4gICAqICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIGBIUlRGYCBvciBgZXF1YWxwb3dlcmAuXG4gICAqXG4gICAqIEByZXR1cm4ge0hvd2wvT2JqZWN0fSBSZXR1cm5zIHNlbGYgb3IgY3VycmVudCBwYW5uZXIgYXR0cmlidXRlcy5cbiAgICovXG4gIEhvd2wucHJvdG90eXBlLnBhbm5lckF0dHIgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIG8sIGlkLCBzb3VuZDtcblxuICAgIC8vIFN0b3AgcmlnaHQgaGVyZSBpZiBub3QgdXNpbmcgV2ViIEF1ZGlvLlxuICAgIGlmICghc2VsZi5fd2ViQXVkaW8pIHtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSB0aGUgdmFsdWVzIGJhc2VkIG9uIGFyZ3VtZW50cy5cbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFJldHVybiB0aGUgZ3JvdXAncyBwYW5uZXIgYXR0cmlidXRlIHZhbHVlcy5cbiAgICAgIHJldHVybiBzZWxmLl9wYW5uZXJBdHRyO1xuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgbyA9IGFyZ3NbMF07XG5cbiAgICAgICAgLy8gU2V0IHRoZSBncm91J3MgcGFubmVyIGF0dHJpYnV0ZSB2YWx1ZXMuXG4gICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKCFvLnBhbm5lckF0dHIpIHtcbiAgICAgICAgICAgIG8ucGFubmVyQXR0ciA9IHtcbiAgICAgICAgICAgICAgY29uZUlubmVyQW5nbGU6IG8uY29uZUlubmVyQW5nbGUsXG4gICAgICAgICAgICAgIGNvbmVPdXRlckFuZ2xlOiBvLmNvbmVPdXRlckFuZ2xlLFxuICAgICAgICAgICAgICBjb25lT3V0ZXJHYWluOiBvLmNvbmVPdXRlckdhaW4sXG4gICAgICAgICAgICAgIGRpc3RhbmNlTW9kZWw6IG8uZGlzdGFuY2VNb2RlbCxcbiAgICAgICAgICAgICAgbWF4RGlzdGFuY2U6IG8ubWF4RGlzdGFuY2UsXG4gICAgICAgICAgICAgIHJlZkRpc3RhbmNlOiBvLnJlZkRpc3RhbmNlLFxuICAgICAgICAgICAgICByb2xsb2ZmRmFjdG9yOiBvLnJvbGxvZmZGYWN0b3IsXG4gICAgICAgICAgICAgIHBhbm5pbmdNb2RlbDogby5wYW5uaW5nTW9kZWxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc2VsZi5fcGFubmVyQXR0ciA9IHtcbiAgICAgICAgICAgIGNvbmVJbm5lckFuZ2xlOiB0eXBlb2Ygby5wYW5uZXJBdHRyLmNvbmVJbm5lckFuZ2xlICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5jb25lSW5uZXJBbmdsZSA6IHNlbGYuX2NvbmVJbm5lckFuZ2xlLFxuICAgICAgICAgICAgY29uZU91dGVyQW5nbGU6IHR5cGVvZiBvLnBhbm5lckF0dHIuY29uZU91dGVyQW5nbGUgIT09ICd1bmRlZmluZWQnID8gby5wYW5uZXJBdHRyLmNvbmVPdXRlckFuZ2xlIDogc2VsZi5fY29uZU91dGVyQW5nbGUsXG4gICAgICAgICAgICBjb25lT3V0ZXJHYWluOiB0eXBlb2Ygby5wYW5uZXJBdHRyLmNvbmVPdXRlckdhaW4gIT09ICd1bmRlZmluZWQnID8gby5wYW5uZXJBdHRyLmNvbmVPdXRlckdhaW4gOiBzZWxmLl9jb25lT3V0ZXJHYWluLFxuICAgICAgICAgICAgZGlzdGFuY2VNb2RlbDogdHlwZW9mIG8ucGFubmVyQXR0ci5kaXN0YW5jZU1vZGVsICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5kaXN0YW5jZU1vZGVsIDogc2VsZi5fZGlzdGFuY2VNb2RlbCxcbiAgICAgICAgICAgIG1heERpc3RhbmNlOiB0eXBlb2Ygby5wYW5uZXJBdHRyLm1heERpc3RhbmNlICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmVyQXR0ci5tYXhEaXN0YW5jZSA6IHNlbGYuX21heERpc3RhbmNlLFxuICAgICAgICAgICAgcmVmRGlzdGFuY2U6IHR5cGVvZiBvLnBhbm5lckF0dHIucmVmRGlzdGFuY2UgIT09ICd1bmRlZmluZWQnID8gby5wYW5uZXJBdHRyLnJlZkRpc3RhbmNlIDogc2VsZi5fcmVmRGlzdGFuY2UsXG4gICAgICAgICAgICByb2xsb2ZmRmFjdG9yOiB0eXBlb2Ygby5wYW5uZXJBdHRyLnJvbGxvZmZGYWN0b3IgIT09ICd1bmRlZmluZWQnID8gby5wYW5uZXJBdHRyLnJvbGxvZmZGYWN0b3IgOiBzZWxmLl9yb2xsb2ZmRmFjdG9yLFxuICAgICAgICAgICAgcGFubmluZ01vZGVsOiB0eXBlb2Ygby5wYW5uZXJBdHRyLnBhbm5pbmdNb2RlbCAhPT0gJ3VuZGVmaW5lZCcgPyBvLnBhbm5lckF0dHIucGFubmluZ01vZGVsIDogc2VsZi5fcGFubmluZ01vZGVsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmV0dXJuIHRoaXMgc291bmQncyBwYW5uZXIgYXR0cmlidXRlIHZhbHVlcy5cbiAgICAgICAgc291bmQgPSBzZWxmLl9zb3VuZEJ5SWQocGFyc2VJbnQoYXJnc1swXSwgMTApKTtcbiAgICAgICAgcmV0dXJuIHNvdW5kID8gc291bmQuX3Bhbm5lckF0dHIgOiBzZWxmLl9wYW5uZXJBdHRyO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoYXJncy5sZW5ndGggPT09IDIpIHtcbiAgICAgIG8gPSBhcmdzWzBdO1xuICAgICAgaWQgPSBwYXJzZUludChhcmdzWzFdLCAxMCk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIHRoZSB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBzb3VuZHMuXG4gICAgdmFyIGlkcyA9IHNlbGYuX2dldFNvdW5kSWRzKGlkKTtcbiAgICBmb3IgKHZhciBpPTA7IGk8aWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzb3VuZCA9IHNlbGYuX3NvdW5kQnlJZChpZHNbaV0pO1xuXG4gICAgICBpZiAoc291bmQpIHtcbiAgICAgICAgLy8gTWVyZ2UgdGhlIG5ldyB2YWx1ZXMgaW50byB0aGUgc291bmQuXG4gICAgICAgIHZhciBwYSA9IHNvdW5kLl9wYW5uZXJBdHRyO1xuICAgICAgICBwYSA9IHtcbiAgICAgICAgICBjb25lSW5uZXJBbmdsZTogdHlwZW9mIG8uY29uZUlubmVyQW5nbGUgIT09ICd1bmRlZmluZWQnID8gby5jb25lSW5uZXJBbmdsZSA6IHBhLmNvbmVJbm5lckFuZ2xlLFxuICAgICAgICAgIGNvbmVPdXRlckFuZ2xlOiB0eXBlb2Ygby5jb25lT3V0ZXJBbmdsZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLmNvbmVPdXRlckFuZ2xlIDogcGEuY29uZU91dGVyQW5nbGUsXG4gICAgICAgICAgY29uZU91dGVyR2FpbjogdHlwZW9mIG8uY29uZU91dGVyR2FpbiAhPT0gJ3VuZGVmaW5lZCcgPyBvLmNvbmVPdXRlckdhaW4gOiBwYS5jb25lT3V0ZXJHYWluLFxuICAgICAgICAgIGRpc3RhbmNlTW9kZWw6IHR5cGVvZiBvLmRpc3RhbmNlTW9kZWwgIT09ICd1bmRlZmluZWQnID8gby5kaXN0YW5jZU1vZGVsIDogcGEuZGlzdGFuY2VNb2RlbCxcbiAgICAgICAgICBtYXhEaXN0YW5jZTogdHlwZW9mIG8ubWF4RGlzdGFuY2UgIT09ICd1bmRlZmluZWQnID8gby5tYXhEaXN0YW5jZSA6IHBhLm1heERpc3RhbmNlLFxuICAgICAgICAgIHJlZkRpc3RhbmNlOiB0eXBlb2Ygby5yZWZEaXN0YW5jZSAhPT0gJ3VuZGVmaW5lZCcgPyBvLnJlZkRpc3RhbmNlIDogcGEucmVmRGlzdGFuY2UsXG4gICAgICAgICAgcm9sbG9mZkZhY3RvcjogdHlwZW9mIG8ucm9sbG9mZkZhY3RvciAhPT0gJ3VuZGVmaW5lZCcgPyBvLnJvbGxvZmZGYWN0b3IgOiBwYS5yb2xsb2ZmRmFjdG9yLFxuICAgICAgICAgIHBhbm5pbmdNb2RlbDogdHlwZW9mIG8ucGFubmluZ01vZGVsICE9PSAndW5kZWZpbmVkJyA/IG8ucGFubmluZ01vZGVsIDogcGEucGFubmluZ01vZGVsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVXBkYXRlIHRoZSBwYW5uZXIgdmFsdWVzIG9yIGNyZWF0ZSBhIG5ldyBwYW5uZXIgaWYgbm9uZSBleGlzdHMuXG4gICAgICAgIHZhciBwYW5uZXIgPSBzb3VuZC5fcGFubmVyO1xuICAgICAgICBpZiAocGFubmVyKSB7XG4gICAgICAgICAgcGFubmVyLmNvbmVJbm5lckFuZ2xlID0gcGEuY29uZUlubmVyQW5nbGU7XG4gICAgICAgICAgcGFubmVyLmNvbmVPdXRlckFuZ2xlID0gcGEuY29uZU91dGVyQW5nbGU7XG4gICAgICAgICAgcGFubmVyLmNvbmVPdXRlckdhaW4gPSBwYS5jb25lT3V0ZXJHYWluO1xuICAgICAgICAgIHBhbm5lci5kaXN0YW5jZU1vZGVsID0gcGEuZGlzdGFuY2VNb2RlbDtcbiAgICAgICAgICBwYW5uZXIubWF4RGlzdGFuY2UgPSBwYS5tYXhEaXN0YW5jZTtcbiAgICAgICAgICBwYW5uZXIucmVmRGlzdGFuY2UgPSBwYS5yZWZEaXN0YW5jZTtcbiAgICAgICAgICBwYW5uZXIucm9sbG9mZkZhY3RvciA9IHBhLnJvbGxvZmZGYWN0b3I7XG4gICAgICAgICAgcGFubmVyLnBhbm5pbmdNb2RlbCA9IHBhLnBhbm5pbmdNb2RlbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHBvc2l0aW9uIHRvIHNldHVwIHRoZSBub2RlIHdpdGguXG4gICAgICAgICAgaWYgKCFzb3VuZC5fcG9zKSB7XG4gICAgICAgICAgICBzb3VuZC5fcG9zID0gc2VsZi5fcG9zIHx8IFswLCAwLCAtMC41XTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGFubmVyIG5vZGUuXG4gICAgICAgICAgc2V0dXBQYW5uZXIoc291bmQsICdzcGF0aWFsJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZjtcbiAgfTtcblxuICAvKiogU2luZ2xlIFNvdW5kIE1ldGhvZHMgKiovXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgLyoqXG4gICAqIEFkZCBuZXcgcHJvcGVydGllcyB0byB0aGUgY29yZSBTb3VuZCBpbml0LlxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gX3N1cGVyIENvcmUgU291bmQgaW5pdCBtZXRob2QuXG4gICAqIEByZXR1cm4ge1NvdW5kfVxuICAgKi9cbiAgU291bmQucHJvdG90eXBlLmluaXQgPSAoZnVuY3Rpb24oX3N1cGVyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgdmFyIHBhcmVudCA9IHNlbGYuX3BhcmVudDtcblxuICAgICAgLy8gU2V0dXAgdXNlci1kZWZpbmVkIGRlZmF1bHQgcHJvcGVydGllcy5cbiAgICAgIHNlbGYuX29yaWVudGF0aW9uID0gcGFyZW50Ll9vcmllbnRhdGlvbjtcbiAgICAgIHNlbGYuX3N0ZXJlbyA9IHBhcmVudC5fc3RlcmVvO1xuICAgICAgc2VsZi5fcG9zID0gcGFyZW50Ll9wb3M7XG4gICAgICBzZWxmLl9wYW5uZXJBdHRyID0gcGFyZW50Ll9wYW5uZXJBdHRyO1xuXG4gICAgICAvLyBDb21wbGV0ZSBpbml0aWxpemF0aW9uIHdpdGggaG93bGVyLmpzIGNvcmUgU291bmQncyBpbml0IGZ1bmN0aW9uLlxuICAgICAgX3N1cGVyLmNhbGwodGhpcyk7XG5cbiAgICAgIC8vIElmIGEgc3RlcmVvIG9yIHBvc2l0aW9uIHdhcyBzcGVjaWZpZWQsIHNldCBpdCB1cC5cbiAgICAgIGlmIChzZWxmLl9zdGVyZW8pIHtcbiAgICAgICAgcGFyZW50LnN0ZXJlbyhzZWxmLl9zdGVyZW8pO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLl9wb3MpIHtcbiAgICAgICAgcGFyZW50LnBvcyhzZWxmLl9wb3NbMF0sIHNlbGYuX3Bvc1sxXSwgc2VsZi5fcG9zWzJdLCBzZWxmLl9pZCk7XG4gICAgICB9XG4gICAgfTtcbiAgfSkoU291bmQucHJvdG90eXBlLmluaXQpO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgU291bmQucmVzZXQgbWV0aG9kIHRvIGNsZWFuIHVwIHByb3BlcnRpZXMgZnJvbSB0aGUgc3BhdGlhbCBwbHVnaW4uXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBfc3VwZXIgU291bmQgcmVzZXQgbWV0aG9kLlxuICAgKiBAcmV0dXJuIHtTb3VuZH1cbiAgICovXG4gIFNvdW5kLnByb3RvdHlwZS5yZXNldCA9IChmdW5jdGlvbihfc3VwZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuXG4gICAgICAvLyBSZXNldCBhbGwgc3BhdGlhbCBwbHVnaW4gcHJvcGVydGllcyBvbiB0aGlzIHNvdW5kLlxuICAgICAgc2VsZi5fb3JpZW50YXRpb24gPSBwYXJlbnQuX29yaWVudGF0aW9uO1xuICAgICAgc2VsZi5fc3RlcmVvID0gcGFyZW50Ll9zdGVyZW87XG4gICAgICBzZWxmLl9wb3MgPSBwYXJlbnQuX3BvcztcbiAgICAgIHNlbGYuX3Bhbm5lckF0dHIgPSBwYXJlbnQuX3Bhbm5lckF0dHI7XG5cbiAgICAgIC8vIElmIGEgc3RlcmVvIG9yIHBvc2l0aW9uIHdhcyBzcGVjaWZpZWQsIHNldCBpdCB1cC5cbiAgICAgIGlmIChzZWxmLl9zdGVyZW8pIHtcbiAgICAgICAgcGFyZW50LnN0ZXJlbyhzZWxmLl9zdGVyZW8pO1xuICAgICAgfSBlbHNlIGlmIChzZWxmLl9wb3MpIHtcbiAgICAgICAgcGFyZW50LnBvcyhzZWxmLl9wb3NbMF0sIHNlbGYuX3Bvc1sxXSwgc2VsZi5fcG9zWzJdLCBzZWxmLl9pZCk7XG4gICAgICB9IGVsc2UgaWYgKHNlbGYuX3Bhbm5lcikge1xuICAgICAgICAvLyBEaXNjb25uZWN0IHRoZSBwYW5uZXIuXG4gICAgICAgIHNlbGYuX3Bhbm5lci5kaXNjb25uZWN0KDApO1xuICAgICAgICBzZWxmLl9wYW5uZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHBhcmVudC5fcmVmcmVzaEJ1ZmZlcihzZWxmKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29tcGxldGUgcmVzZXR0aW5nIG9mIHRoZSBzb3VuZC5cbiAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzKTtcbiAgICB9O1xuICB9KShTb3VuZC5wcm90b3R5cGUucmVzZXQpO1xuXG4gIC8qKiBIZWxwZXIgTWV0aG9kcyAqKi9cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHBhbm5lciBub2RlIGFuZCBzYXZlIGl0IG9uIHRoZSBzb3VuZC5cbiAgICogQHBhcmFtICB7U291bmR9IHNvdW5kIFNwZWNpZmljIHNvdW5kIHRvIHNldHVwIHBhbm5pbmcgb24uXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFR5cGUgb2YgcGFubmVyIHRvIGNyZWF0ZTogJ3N0ZXJlbycgb3IgJ3NwYXRpYWwnLlxuICAgKi9cbiAgdmFyIHNldHVwUGFubmVyID0gZnVuY3Rpb24oc291bmQsIHR5cGUpIHtcbiAgICB0eXBlID0gdHlwZSB8fCAnc3BhdGlhbCc7XG5cbiAgICAvLyBDcmVhdGUgdGhlIG5ldyBwYW5uZXIgbm9kZS5cbiAgICBpZiAodHlwZSA9PT0gJ3NwYXRpYWwnKSB7XG4gICAgICBzb3VuZC5fcGFubmVyID0gSG93bGVyLmN0eC5jcmVhdGVQYW5uZXIoKTtcbiAgICAgIHNvdW5kLl9wYW5uZXIuY29uZUlubmVyQW5nbGUgPSBzb3VuZC5fcGFubmVyQXR0ci5jb25lSW5uZXJBbmdsZTtcbiAgICAgIHNvdW5kLl9wYW5uZXIuY29uZU91dGVyQW5nbGUgPSBzb3VuZC5fcGFubmVyQXR0ci5jb25lT3V0ZXJBbmdsZTtcbiAgICAgIHNvdW5kLl9wYW5uZXIuY29uZU91dGVyR2FpbiA9IHNvdW5kLl9wYW5uZXJBdHRyLmNvbmVPdXRlckdhaW47XG4gICAgICBzb3VuZC5fcGFubmVyLmRpc3RhbmNlTW9kZWwgPSBzb3VuZC5fcGFubmVyQXR0ci5kaXN0YW5jZU1vZGVsO1xuICAgICAgc291bmQuX3Bhbm5lci5tYXhEaXN0YW5jZSA9IHNvdW5kLl9wYW5uZXJBdHRyLm1heERpc3RhbmNlO1xuICAgICAgc291bmQuX3Bhbm5lci5yZWZEaXN0YW5jZSA9IHNvdW5kLl9wYW5uZXJBdHRyLnJlZkRpc3RhbmNlO1xuICAgICAgc291bmQuX3Bhbm5lci5yb2xsb2ZmRmFjdG9yID0gc291bmQuX3Bhbm5lckF0dHIucm9sbG9mZkZhY3RvcjtcbiAgICAgIHNvdW5kLl9wYW5uZXIucGFubmluZ01vZGVsID0gc291bmQuX3Bhbm5lckF0dHIucGFubmluZ01vZGVsO1xuXG4gICAgICBpZiAodHlwZW9mIHNvdW5kLl9wYW5uZXIucG9zaXRpb25YICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBzb3VuZC5fcGFubmVyLnBvc2l0aW9uWC5zZXRWYWx1ZUF0VGltZShzb3VuZC5fcG9zWzBdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgc291bmQuX3Bhbm5lci5wb3NpdGlvblkuc2V0VmFsdWVBdFRpbWUoc291bmQuX3Bvc1sxXSwgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIucG9zaXRpb25aLnNldFZhbHVlQXRUaW1lKHNvdW5kLl9wb3NbMl0sIEhvd2xlci5jdHguY3VycmVudFRpbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc291bmQuX3Bhbm5lci5zZXRQb3NpdGlvbihzb3VuZC5fcG9zWzBdLCBzb3VuZC5fcG9zWzFdLCBzb3VuZC5fcG9zWzJdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBzb3VuZC5fcGFubmVyLm9yaWVudGF0aW9uWCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblguc2V0VmFsdWVBdFRpbWUoc291bmQuX29yaWVudGF0aW9uWzBdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblkuc2V0VmFsdWVBdFRpbWUoc291bmQuX29yaWVudGF0aW9uWzFdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgICAgc291bmQuX3Bhbm5lci5vcmllbnRhdGlvblouc2V0VmFsdWVBdFRpbWUoc291bmQuX29yaWVudGF0aW9uWzJdLCBIb3dsZXIuY3R4LmN1cnJlbnRUaW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdW5kLl9wYW5uZXIuc2V0T3JpZW50YXRpb24oc291bmQuX29yaWVudGF0aW9uWzBdLCBzb3VuZC5fb3JpZW50YXRpb25bMV0sIHNvdW5kLl9vcmllbnRhdGlvblsyXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdW5kLl9wYW5uZXIgPSBIb3dsZXIuY3R4LmNyZWF0ZVN0ZXJlb1Bhbm5lcigpO1xuICAgICAgc291bmQuX3Bhbm5lci5wYW4uc2V0VmFsdWVBdFRpbWUoc291bmQuX3N0ZXJlbywgSG93bGVyLmN0eC5jdXJyZW50VGltZSk7XG4gICAgfVxuXG4gICAgc291bmQuX3Bhbm5lci5jb25uZWN0KHNvdW5kLl9ub2RlKTtcblxuICAgIC8vIFVwZGF0ZSB0aGUgY29ubmVjdGlvbnMuXG4gICAgaWYgKCFzb3VuZC5fcGF1c2VkKSB7XG4gICAgICBzb3VuZC5fcGFyZW50LnBhdXNlKHNvdW5kLl9pZCwgdHJ1ZSkucGxheShzb3VuZC5faWQsIHRydWUpO1xuICAgIH1cbiAgfTtcbn0pKCk7XG4iLCIvKiEgaWVlZTc1NC4gQlNELTMtQ2xhdXNlIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqL1xuZXhwb3J0cy5yZWFkID0gZnVuY3Rpb24gKGJ1ZmZlciwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG1cbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSAoZSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSAobSAqIDI1NikgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBpZiAoZSA9PT0gMCkge1xuICAgIGUgPSAxIC0gZUJpYXNcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiAoKHMgPyAtMSA6IDEpICogSW5maW5pdHkpXG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBNYXRoLnBvdygyLCBtTGVuKVxuICAgIGUgPSBlIC0gZUJpYXNcbiAgfVxuICByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIE1hdGgucG93KDIsIGUgLSBtTGVuKVxufVxuXG5leHBvcnRzLndyaXRlID0gZnVuY3Rpb24gKGJ1ZmZlciwgdmFsdWUsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtLCBjXG4gIHZhciBlTGVuID0gKG5CeXRlcyAqIDgpIC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICgodmFsdWUgKiBjKSAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2VcclxudGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGVcclxuTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcclxuXHJcblRISVMgQ09ERSBJUyBQUk9WSURFRCBPTiBBTiAqQVMgSVMqIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTllcclxuS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBBTlkgSU1QTElFRFxyXG5XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLFxyXG5NRVJDSEFOVEFCTElUWSBPUiBOT04tSU5GUklOR0VNRU5ULlxyXG5cclxuU2VlIHRoZSBBcGFjaGUgVmVyc2lvbiAyLjAgTGljZW5zZSBmb3Igc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zXHJcbmFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG5mdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxuXG52YXIgRXZlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBFdmVudCh0eXBlLCB0YXJnZXQpIHtcclxuICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEV2ZW50O1xyXG59KCkpO1xyXG52YXIgRXJyb3JFdmVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHtcclxuICAgIF9fZXh0ZW5kcyhFcnJvckV2ZW50LCBfc3VwZXIpO1xyXG4gICAgZnVuY3Rpb24gRXJyb3JFdmVudChlcnJvciwgdGFyZ2V0KSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgJ2Vycm9yJywgdGFyZ2V0KSB8fCB0aGlzO1xyXG4gICAgICAgIF90aGlzLm1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlO1xyXG4gICAgICAgIF90aGlzLmVycm9yID0gZXJyb3I7XHJcbiAgICAgICAgcmV0dXJuIF90aGlzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEVycm9yRXZlbnQ7XHJcbn0oRXZlbnQpKTtcclxudmFyIENsb3NlRXZlbnQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XHJcbiAgICBfX2V4dGVuZHMoQ2xvc2VFdmVudCwgX3N1cGVyKTtcclxuICAgIGZ1bmN0aW9uIENsb3NlRXZlbnQoY29kZSwgcmVhc29uLCB0YXJnZXQpIHtcclxuICAgICAgICBpZiAoY29kZSA9PT0gdm9pZCAwKSB7IGNvZGUgPSAxMDAwOyB9XHJcbiAgICAgICAgaWYgKHJlYXNvbiA9PT0gdm9pZCAwKSB7IHJlYXNvbiA9ICcnOyB9XHJcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgJ2Nsb3NlJywgdGFyZ2V0KSB8fCB0aGlzO1xyXG4gICAgICAgIF90aGlzLndhc0NsZWFuID0gdHJ1ZTtcclxuICAgICAgICBfdGhpcy5jb2RlID0gY29kZTtcclxuICAgICAgICBfdGhpcy5yZWFzb24gPSByZWFzb247XHJcbiAgICAgICAgcmV0dXJuIF90aGlzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIENsb3NlRXZlbnQ7XHJcbn0oRXZlbnQpKTtcblxuLyohXHJcbiAqIFJlY29ubmVjdGluZyBXZWJTb2NrZXRcclxuICogYnkgUGVkcm8gTGFkYXJpYSA8cGVkcm8ubGFkYXJpYUBnbWFpbC5jb20+XHJcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9wbGFkYXJpYS9yZWNvbm5lY3Rpbmctd2Vic29ja2V0XHJcbiAqIExpY2Vuc2UgTUlUXHJcbiAqL1xyXG52YXIgZ2V0R2xvYmFsV2ViU29ja2V0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgaWYgKHR5cGVvZiBXZWJTb2NrZXQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgIHJldHVybiBXZWJTb2NrZXQ7XHJcbiAgICB9XHJcbn07XHJcbi8qKlxyXG4gKiBSZXR1cm5zIHRydWUgaWYgZ2l2ZW4gYXJndW1lbnQgbG9va3MgbGlrZSBhIFdlYlNvY2tldCBjbGFzc1xyXG4gKi9cclxudmFyIGlzV2ViU29ja2V0ID0gZnVuY3Rpb24gKHcpIHsgcmV0dXJuIHR5cGVvZiB3ICE9PSAndW5kZWZpbmVkJyAmJiAhIXcgJiYgdy5DTE9TSU5HID09PSAyOyB9O1xyXG52YXIgREVGQVVMVCA9IHtcclxuICAgIG1heFJlY29ubmVjdGlvbkRlbGF5OiAxMDAwMCxcclxuICAgIG1pblJlY29ubmVjdGlvbkRlbGF5OiAxMDAwICsgTWF0aC5yYW5kb20oKSAqIDQwMDAsXHJcbiAgICBtaW5VcHRpbWU6IDUwMDAsXHJcbiAgICByZWNvbm5lY3Rpb25EZWxheUdyb3dGYWN0b3I6IDEuMyxcclxuICAgIGNvbm5lY3Rpb25UaW1lb3V0OiA0MDAwLFxyXG4gICAgbWF4UmV0cmllczogSW5maW5pdHksXHJcbiAgICBtYXhFbnF1ZXVlZE1lc3NhZ2VzOiBJbmZpbml0eSxcclxuICAgIHN0YXJ0Q2xvc2VkOiBmYWxzZSxcclxuICAgIGRlYnVnOiBmYWxzZSxcclxufTtcclxudmFyIFJlY29ubmVjdGluZ1dlYlNvY2tldCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIFJlY29ubmVjdGluZ1dlYlNvY2tldCh1cmwsIHByb3RvY29scywgb3B0aW9ucykge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cclxuICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSB7XHJcbiAgICAgICAgICAgIGVycm9yOiBbXSxcclxuICAgICAgICAgICAgbWVzc2FnZTogW10sXHJcbiAgICAgICAgICAgIG9wZW46IFtdLFxyXG4gICAgICAgICAgICBjbG9zZTogW10sXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9yZXRyeUNvdW50ID0gLTE7XHJcbiAgICAgICAgdGhpcy5fc2hvdWxkUmVjb25uZWN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9jb25uZWN0TG9jayA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2JpbmFyeVR5cGUgPSAnYmxvYic7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VDYWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlUXVldWUgPSBbXTtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBldmVudCBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24ncyByZWFkeVN0YXRlIGNoYW5nZXMgdG8gQ0xPU0VEXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgdGhpcy5vbmNsb3NlID0gbnVsbDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBbiBldmVudCBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiBhbiBlcnJvciBvY2N1cnNcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9uZXJyb3IgPSBudWxsO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEFuIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGNhbGxlZCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9ubWVzc2FnZSA9IG51bGw7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogQW4gZXZlbnQgbGlzdGVuZXIgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uJ3MgcmVhZHlTdGF0ZSBjaGFuZ2VzIHRvIE9QRU47XHJcbiAgICAgICAgICogdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyByZWFkeSB0byBzZW5kIGFuZCByZWNlaXZlIGRhdGFcclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLm9ub3BlbiA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5faGFuZGxlT3BlbiA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBfdGhpcy5fZGVidWcoJ29wZW4gZXZlbnQnKTtcclxuICAgICAgICAgICAgdmFyIF9hID0gX3RoaXMuX29wdGlvbnMubWluVXB0aW1lLCBtaW5VcHRpbWUgPSBfYSA9PT0gdm9pZCAwID8gREVGQVVMVC5taW5VcHRpbWUgOiBfYTtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLl9jb25uZWN0VGltZW91dCk7XHJcbiAgICAgICAgICAgIF90aGlzLl91cHRpbWVUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fYWNjZXB0T3BlbigpOyB9LCBtaW5VcHRpbWUpO1xyXG4gICAgICAgICAgICBfdGhpcy5fd3MuYmluYXJ5VHlwZSA9IF90aGlzLl9iaW5hcnlUeXBlO1xyXG4gICAgICAgICAgICAvLyBzZW5kIGVucXVldWVkIG1lc3NhZ2VzIChtZXNzYWdlcyBzZW50IGJlZm9yZSB3ZWJzb2NrZXQgb3BlbiBldmVudClcclxuICAgICAgICAgICAgX3RoaXMuX21lc3NhZ2VRdWV1ZS5mb3JFYWNoKGZ1bmN0aW9uIChtZXNzYWdlKSB7IHJldHVybiBfdGhpcy5fd3Muc2VuZChtZXNzYWdlKTsgfSk7XHJcbiAgICAgICAgICAgIF90aGlzLl9tZXNzYWdlUXVldWUgPSBbXTtcclxuICAgICAgICAgICAgaWYgKF90aGlzLm9ub3Blbikge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25vcGVuKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBfdGhpcy5fbGlzdGVuZXJzLm9wZW4uZm9yRWFjaChmdW5jdGlvbiAobGlzdGVuZXIpIHsgcmV0dXJuIF90aGlzLl9jYWxsRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIpOyB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuX2hhbmRsZU1lc3NhZ2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMuX2RlYnVnKCdtZXNzYWdlIGV2ZW50Jyk7XHJcbiAgICAgICAgICAgIGlmIChfdGhpcy5vbm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9ubWVzc2FnZShldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX3RoaXMuX2xpc3RlbmVycy5tZXNzYWdlLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7IHJldHVybiBfdGhpcy5fY2FsbEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTsgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9oYW5kbGVFcnJvciA9IGZ1bmN0aW9uIChldmVudCkge1xyXG4gICAgICAgICAgICBfdGhpcy5fZGVidWcoJ2Vycm9yIGV2ZW50JywgZXZlbnQubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIF90aGlzLl9kaXNjb25uZWN0KHVuZGVmaW5lZCwgZXZlbnQubWVzc2FnZSA9PT0gJ1RJTUVPVVQnID8gJ3RpbWVvdXQnIDogdW5kZWZpbmVkKTtcclxuICAgICAgICAgICAgaWYgKF90aGlzLm9uZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLm9uZXJyb3IoZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLl9kZWJ1ZygnZXhlYyBlcnJvciBsaXN0ZW5lcnMnKTtcclxuICAgICAgICAgICAgX3RoaXMuX2xpc3RlbmVycy5lcnJvci5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gX3RoaXMuX2NhbGxFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7IH0pO1xyXG4gICAgICAgICAgICBfdGhpcy5fY29ubmVjdCgpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5faGFuZGxlQ2xvc2UgPSBmdW5jdGlvbiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgX3RoaXMuX2RlYnVnKCdjbG9zZSBldmVudCcpO1xyXG4gICAgICAgICAgICBfdGhpcy5fY2xlYXJUaW1lb3V0cygpO1xyXG4gICAgICAgICAgICBpZiAoX3RoaXMuX3Nob3VsZFJlY29ubmVjdCkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoX3RoaXMub25jbG9zZSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMub25jbG9zZShldmVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgX3RoaXMuX2xpc3RlbmVycy5jbG9zZS5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lcikgeyByZXR1cm4gX3RoaXMuX2NhbGxFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7IH0pO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fdXJsID0gdXJsO1xyXG4gICAgICAgIHRoaXMuX3Byb3RvY29scyA9IHByb3RvY29scztcclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5zdGFydENsb3NlZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zaG91bGRSZWNvbm5lY3QgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY29ubmVjdCgpO1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldCwgXCJDT05ORUNUSU5HXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LCBcIk9QRU5cIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQsIFwiQ0xPU0lOR1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAyO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldCwgXCJDTE9TRURcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gMztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcIkNPTk5FQ1RJTkdcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUmVjb25uZWN0aW5nV2ViU29ja2V0LkNPTk5FQ1RJTkc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJPUEVOXCIsIHtcclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFJlY29ubmVjdGluZ1dlYlNvY2tldC5PUEVOO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiQ0xPU0lOR1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQuQ0xPU0lORztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcIkNMT1NFRFwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQuQ0xPU0VEO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwiYmluYXJ5VHlwZVwiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93cyA/IHRoaXMuX3dzLmJpbmFyeVR5cGUgOiB0aGlzLl9iaW5hcnlUeXBlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fYmluYXJ5VHlwZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fd3MpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3dzLmJpbmFyeVR5cGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcclxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcclxuICAgIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUsIFwicmV0cnlDb3VudFwiLCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9yIGNvbm5lY3Rpb24gcmV0cmllc1xyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5fcmV0cnlDb3VudCwgMCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJidWZmZXJlZEFtb3VudFwiLCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIHRoYXQgaGF2ZSBiZWVuIHF1ZXVlZCB1c2luZyBjYWxscyB0byBzZW5kKCkgYnV0IG5vdCB5ZXRcclxuICAgICAgICAgKiB0cmFuc21pdHRlZCB0byB0aGUgbmV0d29yay4gVGhpcyB2YWx1ZSByZXNldHMgdG8gemVybyBvbmNlIGFsbCBxdWV1ZWQgZGF0YSBoYXMgYmVlbiBzZW50LlxyXG4gICAgICAgICAqIFRoaXMgdmFsdWUgZG9lcyBub3QgcmVzZXQgdG8gemVybyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZDsgaWYgeW91IGtlZXAgY2FsbGluZyBzZW5kKCksXHJcbiAgICAgICAgICogdGhpcyB3aWxsIGNvbnRpbnVlIHRvIGNsaW1iLiBSZWFkIG9ubHlcclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgdmFyIGJ5dGVzID0gdGhpcy5fbWVzc2FnZVF1ZXVlLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWNjICs9IG1lc3NhZ2UubGVuZ3RoOyAvLyBub3QgYnl0ZSBzaXplXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgQmxvYikge1xyXG4gICAgICAgICAgICAgICAgICAgIGFjYyArPSBtZXNzYWdlLnNpemU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBhY2MgKz0gbWVzc2FnZS5ieXRlTGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcclxuICAgICAgICAgICAgfSwgMCk7XHJcbiAgICAgICAgICAgIHJldHVybiBieXRlcyArICh0aGlzLl93cyA/IHRoaXMuX3dzLmJ1ZmZlcmVkQW1vdW50IDogMCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZSwgXCJleHRlbnNpb25zXCIsIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBUaGUgZXh0ZW5zaW9ucyBzZWxlY3RlZCBieSB0aGUgc2VydmVyLiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHRoZSBlbXB0eSBzdHJpbmcgb3IgYSBsaXN0IG9mXHJcbiAgICAgICAgICogZXh0ZW5zaW9ucyBhcyBuZWdvdGlhdGVkIGJ5IHRoZSBjb25uZWN0aW9uXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93cyA/IHRoaXMuX3dzLmV4dGVuc2lvbnMgOiAnJztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcInByb3RvY29sXCIsIHtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBuYW1lIG9mIHRoZSBzdWItcHJvdG9jb2wgdGhlIHNlcnZlciBzZWxlY3RlZDtcclxuICAgICAgICAgKiB0aGlzIHdpbGwgYmUgb25lIG9mIHRoZSBzdHJpbmdzIHNwZWNpZmllZCBpbiB0aGUgcHJvdG9jb2xzIHBhcmFtZXRlciB3aGVuIGNyZWF0aW5nIHRoZVxyXG4gICAgICAgICAqIFdlYlNvY2tldCBvYmplY3RcclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dzID8gdGhpcy5fd3MucHJvdG9jb2wgOiAnJztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcInJlYWR5U3RhdGVcIiwge1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb25uZWN0aW9uOyB0aGlzIGlzIG9uZSBvZiB0aGUgUmVhZHkgc3RhdGUgY29uc3RhbnRzXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl93cykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dzLnJlYWR5U3RhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnMuc3RhcnRDbG9zZWRcclxuICAgICAgICAgICAgICAgID8gUmVjb25uZWN0aW5nV2ViU29ja2V0LkNMT1NFRFxyXG4gICAgICAgICAgICAgICAgOiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQuQ09OTkVDVElORztcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXHJcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXHJcbiAgICB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLCBcInVybFwiLCB7XHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgICogVGhlIFVSTCBhcyByZXNvbHZlZCBieSB0aGUgY29uc3RydWN0b3JcclxuICAgICAgICAgKi9cclxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dzID8gdGhpcy5fd3MudXJsIDogJyc7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxyXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICAvKipcclxuICAgICAqIENsb3NlcyB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb24gb3IgY29ubmVjdGlvbiBhdHRlbXB0LCBpZiBhbnkuIElmIHRoZSBjb25uZWN0aW9uIGlzIGFscmVhZHlcclxuICAgICAqIENMT1NFRCwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nXHJcbiAgICAgKi9cclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbiAoY29kZSwgcmVhc29uKSB7XHJcbiAgICAgICAgaWYgKGNvZGUgPT09IHZvaWQgMCkgeyBjb2RlID0gMTAwMDsgfVxyXG4gICAgICAgIHRoaXMuX2Nsb3NlQ2FsbGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9zaG91bGRSZWNvbm5lY3QgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9jbGVhclRpbWVvdXRzKCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93cykge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJ1ZygnY2xvc2UgZW5xdWV1ZWQ6IG5vIHdzIGluc3RhbmNlJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX3dzLnJlYWR5U3RhdGUgPT09IHRoaXMuQ0xPU0VEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdjbG9zZTogYWxyZWFkeSBjbG9zZWQnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl93cy5jbG9zZShjb2RlLCByZWFzb24pO1xyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogQ2xvc2VzIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvbiBvciBjb25uZWN0aW9uIGF0dGVtcHQgYW5kIGNvbm5lY3RzIGFnYWluLlxyXG4gICAgICogUmVzZXRzIHJldHJ5IGNvdW50ZXI7XHJcbiAgICAgKi9cclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUucmVjb25uZWN0ID0gZnVuY3Rpb24gKGNvZGUsIHJlYXNvbikge1xyXG4gICAgICAgIHRoaXMuX3Nob3VsZFJlY29ubmVjdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fY2xvc2VDYWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9yZXRyeUNvdW50ID0gLTE7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93cyB8fCB0aGlzLl93cy5yZWFkeVN0YXRlID09PSB0aGlzLkNMT1NFRCkge1xyXG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9kaXNjb25uZWN0KGNvZGUsIHJlYXNvbik7XHJcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3QoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBFbnF1ZXVlIHNwZWNpZmllZCBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkIHRvIHRoZSBzZXJ2ZXIgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cclxuICAgICAqL1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcclxuICAgICAgICBpZiAodGhpcy5fd3MgJiYgdGhpcy5fd3MucmVhZHlTdGF0ZSA9PT0gdGhpcy5PUEVOKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RlYnVnKCdzZW5kJywgZGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3dzLnNlbmQoZGF0YSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICB2YXIgX2EgPSB0aGlzLl9vcHRpb25zLm1heEVucXVldWVkTWVzc2FnZXMsIG1heEVucXVldWVkTWVzc2FnZXMgPSBfYSA9PT0gdm9pZCAwID8gREVGQVVMVC5tYXhFbnF1ZXVlZE1lc3NhZ2VzIDogX2E7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tZXNzYWdlUXVldWUubGVuZ3RoIDwgbWF4RW5xdWV1ZWRNZXNzYWdlcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVidWcoJ2VucXVldWUnLCBkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VRdWV1ZS5wdXNoKGRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIC8qKlxyXG4gICAgICogUmVnaXN0ZXIgYW4gZXZlbnQgaGFuZGxlciBvZiBhIHNwZWNpZmljIGV2ZW50IHR5cGVcclxuICAgICAqL1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyc1t0eXBlXSkge1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyc1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XHJcbiAgICAgICAgdmFyIGVfMSwgX2E7XHJcbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyc1tldmVudC50eXBlXTtcclxuICAgICAgICBpZiAobGlzdGVuZXJzKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBsaXN0ZW5lcnNfMSA9IF9fdmFsdWVzKGxpc3RlbmVycyksIGxpc3RlbmVyc18xXzEgPSBsaXN0ZW5lcnNfMS5uZXh0KCk7ICFsaXN0ZW5lcnNfMV8xLmRvbmU7IGxpc3RlbmVyc18xXzEgPSBsaXN0ZW5lcnNfMS5uZXh0KCkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNfMV8xLnZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH1cclxuICAgICAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNfMV8xICYmICFsaXN0ZW5lcnNfMV8xLmRvbmUgJiYgKF9hID0gbGlzdGVuZXJzXzEucmV0dXJuKSkgX2EuY2FsbChsaXN0ZW5lcnNfMSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGVfMSkgdGhyb3cgZV8xLmVycm9yOyB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9O1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xyXG4gICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcnNbdHlwZV0pIHtcclxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnNbdHlwZV0gPSB0aGlzLl9saXN0ZW5lcnNbdHlwZV0uZmlsdGVyKGZ1bmN0aW9uIChsKSB7IHJldHVybiBsICE9PSBsaXN0ZW5lcjsgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2RlYnVnID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBhcmdzID0gW107XHJcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcclxuICAgICAgICAgICAgYXJnc1tfaV0gPSBhcmd1bWVudHNbX2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5kZWJ1Zykge1xyXG4gICAgICAgICAgICAvLyBub3QgdXNpbmcgc3ByZWFkIGJlY2F1c2UgY29tcGlsZWQgdmVyc2lvbiB1c2VzIFN5bWJvbHNcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIF9fc3ByZWFkKFsnUldTPiddLCBhcmdzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2dldE5leHREZWxheSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB2YXIgX2EgPSB0aGlzLl9vcHRpb25zLCBfYiA9IF9hLnJlY29ubmVjdGlvbkRlbGF5R3Jvd0ZhY3RvciwgcmVjb25uZWN0aW9uRGVsYXlHcm93RmFjdG9yID0gX2IgPT09IHZvaWQgMCA/IERFRkFVTFQucmVjb25uZWN0aW9uRGVsYXlHcm93RmFjdG9yIDogX2IsIF9jID0gX2EubWluUmVjb25uZWN0aW9uRGVsYXksIG1pblJlY29ubmVjdGlvbkRlbGF5ID0gX2MgPT09IHZvaWQgMCA/IERFRkFVTFQubWluUmVjb25uZWN0aW9uRGVsYXkgOiBfYywgX2QgPSBfYS5tYXhSZWNvbm5lY3Rpb25EZWxheSwgbWF4UmVjb25uZWN0aW9uRGVsYXkgPSBfZCA9PT0gdm9pZCAwID8gREVGQVVMVC5tYXhSZWNvbm5lY3Rpb25EZWxheSA6IF9kO1xyXG4gICAgICAgIHZhciBkZWxheSA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuX3JldHJ5Q291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGRlbGF5ID1cclxuICAgICAgICAgICAgICAgIG1pblJlY29ubmVjdGlvbkRlbGF5ICogTWF0aC5wb3cocmVjb25uZWN0aW9uRGVsYXlHcm93RmFjdG9yLCB0aGlzLl9yZXRyeUNvdW50IC0gMSk7XHJcbiAgICAgICAgICAgIGlmIChkZWxheSA+IG1heFJlY29ubmVjdGlvbkRlbGF5KSB7XHJcbiAgICAgICAgICAgICAgICBkZWxheSA9IG1heFJlY29ubmVjdGlvbkRlbGF5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RlYnVnKCduZXh0IGRlbGF5JywgZGVsYXkpO1xyXG4gICAgICAgIHJldHVybiBkZWxheTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl93YWl0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgX3RoaXMuX2dldE5leHREZWxheSgpKTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9nZXROZXh0VXJsID0gZnVuY3Rpb24gKHVybFByb3ZpZGVyKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB1cmxQcm92aWRlciA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1cmxQcm92aWRlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgdXJsUHJvdmlkZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdmFyIHVybCA9IHVybFByb3ZpZGVyKCk7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1cmwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghIXVybC50aGVuKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIFVSTCcpO1xyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2Nvbm5lY3QgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcclxuICAgICAgICBpZiAodGhpcy5fY29ubmVjdExvY2sgfHwgIXRoaXMuX3Nob3VsZFJlY29ubmVjdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2Nvbm5lY3RMb2NrID0gdHJ1ZTtcclxuICAgICAgICB2YXIgX2EgPSB0aGlzLl9vcHRpb25zLCBfYiA9IF9hLm1heFJldHJpZXMsIG1heFJldHJpZXMgPSBfYiA9PT0gdm9pZCAwID8gREVGQVVMVC5tYXhSZXRyaWVzIDogX2IsIF9jID0gX2EuY29ubmVjdGlvblRpbWVvdXQsIGNvbm5lY3Rpb25UaW1lb3V0ID0gX2MgPT09IHZvaWQgMCA/IERFRkFVTFQuY29ubmVjdGlvblRpbWVvdXQgOiBfYywgX2QgPSBfYS5XZWJTb2NrZXQsIFdlYlNvY2tldCA9IF9kID09PSB2b2lkIDAgPyBnZXRHbG9iYWxXZWJTb2NrZXQoKSA6IF9kO1xyXG4gICAgICAgIGlmICh0aGlzLl9yZXRyeUNvdW50ID49IG1heFJldHJpZXMpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVidWcoJ21heCByZXRyaWVzIHJlYWNoZWQnLCB0aGlzLl9yZXRyeUNvdW50LCAnPj0nLCBtYXhSZXRyaWVzKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9yZXRyeUNvdW50Kys7XHJcbiAgICAgICAgdGhpcy5fZGVidWcoJ2Nvbm5lY3QnLCB0aGlzLl9yZXRyeUNvdW50KTtcclxuICAgICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTtcclxuICAgICAgICBpZiAoIWlzV2ViU29ja2V0KFdlYlNvY2tldCkpIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ05vIHZhbGlkIFdlYlNvY2tldCBjbGFzcyBwcm92aWRlZCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl93YWl0KClcclxuICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX2dldE5leHRVcmwoX3RoaXMuX3VybCk7IH0pXHJcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICh1cmwpIHtcclxuICAgICAgICAgICAgLy8gY2xvc2UgY291bGQgYmUgY2FsbGVkIGJlZm9yZSBjcmVhdGluZyB0aGUgd3NcclxuICAgICAgICAgICAgaWYgKF90aGlzLl9jbG9zZUNhbGxlZCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF90aGlzLl9kZWJ1ZygnY29ubmVjdCcsIHsgdXJsOiB1cmwsIHByb3RvY29sczogX3RoaXMuX3Byb3RvY29scyB9KTtcclxuICAgICAgICAgICAgX3RoaXMuX3dzID0gX3RoaXMuX3Byb3RvY29sc1xyXG4gICAgICAgICAgICAgICAgPyBuZXcgV2ViU29ja2V0KHVybCwgX3RoaXMuX3Byb3RvY29scylcclxuICAgICAgICAgICAgICAgIDogbmV3IFdlYlNvY2tldCh1cmwpO1xyXG4gICAgICAgICAgICBfdGhpcy5fd3MuYmluYXJ5VHlwZSA9IF90aGlzLl9iaW5hcnlUeXBlO1xyXG4gICAgICAgICAgICBfdGhpcy5fY29ubmVjdExvY2sgPSBmYWxzZTtcclxuICAgICAgICAgICAgX3RoaXMuX2FkZExpc3RlbmVycygpO1xyXG4gICAgICAgICAgICBfdGhpcy5fY29ubmVjdFRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9oYW5kbGVUaW1lb3V0KCk7IH0sIGNvbm5lY3Rpb25UaW1lb3V0KTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9oYW5kbGVUaW1lb3V0ID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuX2RlYnVnKCd0aW1lb3V0IGV2ZW50Jyk7XHJcbiAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IobmV3IEVycm9yRXZlbnQoRXJyb3IoJ1RJTUVPVVQnKSwgdGhpcykpO1xyXG4gICAgfTtcclxuICAgIFJlY29ubmVjdGluZ1dlYlNvY2tldC5wcm90b3R5cGUuX2Rpc2Nvbm5lY3QgPSBmdW5jdGlvbiAoY29kZSwgcmVhc29uKSB7XHJcbiAgICAgICAgaWYgKGNvZGUgPT09IHZvaWQgMCkgeyBjb2RlID0gMTAwMDsgfVxyXG4gICAgICAgIHRoaXMuX2NsZWFyVGltZW91dHMoKTtcclxuICAgICAgICBpZiAoIXRoaXMuX3dzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5fd3MuY2xvc2UoY29kZSwgcmVhc29uKTtcclxuICAgICAgICAgICAgdGhpcy5faGFuZGxlQ2xvc2UobmV3IENsb3NlRXZlbnQoY29kZSwgcmVhc29uLCB0aGlzKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgUmVjb25uZWN0aW5nV2ViU29ja2V0LnByb3RvdHlwZS5fYWNjZXB0T3BlbiA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICB0aGlzLl9kZWJ1ZygnYWNjZXB0IG9wZW4nKTtcclxuICAgICAgICB0aGlzLl9yZXRyeUNvdW50ID0gMDtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9jYWxsRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCwgbGlzdGVuZXIpIHtcclxuICAgICAgICBpZiAoJ2hhbmRsZUV2ZW50JyBpbiBsaXN0ZW5lcikge1xyXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgICAgIGxpc3RlbmVyLmhhbmRsZUV2ZW50KGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgbGlzdGVuZXIoZXZlbnQpO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9yZW1vdmVMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RlYnVnKCdyZW1vdmVMaXN0ZW5lcnMnKTtcclxuICAgICAgICB0aGlzLl93cy5yZW1vdmVFdmVudExpc3RlbmVyKCdvcGVuJywgdGhpcy5faGFuZGxlT3Blbik7XHJcbiAgICAgICAgdGhpcy5fd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCB0aGlzLl9oYW5kbGVDbG9zZSk7XHJcbiAgICAgICAgdGhpcy5fd3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuX2hhbmRsZU1lc3NhZ2UpO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLl93cy5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMuX2hhbmRsZUVycm9yKTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9hZGRMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RlYnVnKCdhZGRMaXN0ZW5lcnMnKTtcclxuICAgICAgICB0aGlzLl93cy5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgdGhpcy5faGFuZGxlT3Blbik7XHJcbiAgICAgICAgdGhpcy5fd3MuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCB0aGlzLl9oYW5kbGVDbG9zZSk7XHJcbiAgICAgICAgdGhpcy5fd3MuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuX2hhbmRsZU1lc3NhZ2UpO1xyXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICB0aGlzLl93cy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMuX2hhbmRsZUVycm9yKTtcclxuICAgIH07XHJcbiAgICBSZWNvbm5lY3RpbmdXZWJTb2NrZXQucHJvdG90eXBlLl9jbGVhclRpbWVvdXRzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jb25uZWN0VGltZW91dCk7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3VwdGltZVRpbWVvdXQpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBSZWNvbm5lY3RpbmdXZWJTb2NrZXQ7XHJcbn0oKSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVjb25uZWN0aW5nV2ViU29ja2V0O1xuIl19
|