@arcware-cloud/pixelstreaming-websdk 1.2.13 → 1.2.15

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.
Files changed (41) hide show
  1. package/index.cjs.js +344 -4
  2. package/index.esm.js +364 -22
  3. package/index.umd.js +344 -4
  4. package/package.json +1 -1
  5. package/types/index.d.ts +0 -3
  6. package/types/lib/ApplyUrlHack.d.ts +0 -2
  7. package/types/lib/ArcwareApplication.d.ts +0 -48
  8. package/types/lib/ArcwareConfig.d.ts +0 -35
  9. package/types/lib/ArcwareInit.d.ts +0 -15
  10. package/types/lib/ArcwarePixelStreaming.d.ts +0 -97
  11. package/types/lib/MessageTypes.d.ts +0 -4
  12. package/types/lib/domain/ArcwareSettingsSchema.d.ts +0 -209
  13. package/types/lib/domain/ConnectionIdentifier.d.ts +0 -27
  14. package/types/lib/domain/EventHandler.d.ts +0 -11
  15. package/types/lib/domain/Session.d.ts +0 -29
  16. package/types/lib/domain/Stats.d.ts +0 -36
  17. package/types/lib/domain/debounce.d.ts +0 -1
  18. package/types/lib/index.d.ts +0 -6
  19. package/types/lib/styles/ArcwarePixelStreamingApplicationStyles.d.ts +0 -478
  20. package/types/lib/ui/ArcwareLogoLoader/index.d.ts +0 -6
  21. package/types/lib/ui/AudioButton/AudioIcon.d.ts +0 -7
  22. package/types/lib/ui/AudioButton/index.d.ts +0 -15
  23. package/types/lib/ui/LoveLetters/index.d.ts +0 -6
  24. package/types/lib/ui/MicButton/index.d.ts +0 -14
  25. package/types/lib/ui/MicIcon/index.d.ts +0 -7
  26. package/types/lib/ui/MicrophoneOverlay/index.d.ts +0 -11
  27. package/types/lib/ui/PlayIcon/index.d.ts +0 -5
  28. package/types/lib/ui/StopButton/index.d.ts +0 -16
  29. package/types/lib/ui/StopIcon/index.d.ts +0 -5
  30. package/types/shared/index.d.ts +0 -1
  31. package/types/shared/lib/Messages/ErrorMessage.d.ts +0 -18
  32. package/types/shared/lib/Messages/LoveLetter.d.ts +0 -18
  33. package/types/shared/lib/Messages/Ping.d.ts +0 -15
  34. package/types/shared/lib/Messages/Queue.d.ts +0 -58
  35. package/types/shared/lib/Messages/SessionId.d.ts +0 -12
  36. package/types/shared/lib/Messages/Stats.d.ts +0 -182
  37. package/types/shared/lib/Messages/StreamInfo.d.ts +0 -338
  38. package/types/shared/lib/Messages/Version.d.ts +0 -12
  39. package/types/shared/lib/Messages/WebSdkSettings.d.ts +0 -96
  40. package/types/shared/lib/Messages/index.d.ts +0 -192
  41. package/types/shared/lib/index.d.ts +0 -1
package/index.umd.js CHANGED
@@ -23361,7 +23361,7 @@ class ArcwareConfig extends lib_pixelstreamingfrontend_ue5_5_1.Config {
23361
23361
  if (!config.initialSettings.ss)
23362
23362
  config.initialSettings.ss = exports.DefaultUrl;
23363
23363
  super(config);
23364
- this.VERSION = "1.2.13";
23364
+ this.VERSION = "1.2.15";
23365
23365
  this.settings = settings;
23366
23366
  this.session = new Session_1.Session();
23367
23367
  this._initialSettings = config.initialSettings;
@@ -23502,6 +23502,7 @@ exports.ArcwareInit = ArcwareInit;
23502
23502
 
23503
23503
  Object.defineProperty(exports, "__esModule", ({ value: true }));
23504
23504
  exports.ArcwarePixelStreaming = void 0;
23505
+ const tslib_1 = __webpack_require__(655);
23505
23506
  const shared_pixelstreaming_websdk_1 = __webpack_require__(7910);
23506
23507
  const lib_pixelstreamingfrontend_ue5_5_1 = __webpack_require__(693);
23507
23508
  const ApplyUrlHack_1 = __webpack_require__(4790);
@@ -23512,6 +23513,7 @@ const LoveLetters_1 = __webpack_require__(4572);
23512
23513
  const ArcwareLogoLoader_1 = __webpack_require__(6469);
23513
23514
  const MicrophoneOverlay_1 = __webpack_require__(3613);
23514
23515
  const ConnectionIdentifier_1 = __webpack_require__(5999);
23516
+ const DiagnosticsCollector_1 = __webpack_require__(6478);
23515
23517
  class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStreaming {
23516
23518
  /** Returns a list of WebSocketStates of all PixelStreaming Instances generated. */
23517
23519
  get WebsocketStates() {
@@ -23559,6 +23561,9 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
23559
23561
  this.config = config;
23560
23562
  this.loveLettersList = [];
23561
23563
  this.microphoneOverlay = new MicrophoneOverlay_1.MicrophoneOverlay(this);
23564
+ this.diagnosticsCollector = new DiagnosticsCollector_1.DiagnosticsCollector({
23565
+ enableBandwidthProbe: false,
23566
+ });
23562
23567
  // this.loveLettersContainer = null;
23563
23568
  this.wrapWebSocketOnCloseHandler();
23564
23569
  // Bind the event listener function to the class instance
@@ -23617,7 +23622,10 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
23617
23622
  */
23618
23623
  /** On version requested, the version of the WebSDK would be returned. */
23619
23624
  onVersion(message) {
23620
- this.send({ type: "version", version: this.config.VERSION });
23625
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
23626
+ const diagnostics = yield this.diagnosticsCollector.collect();
23627
+ this.send({ type: "version", version: this.config.VERSION, diagnostics });
23628
+ });
23621
23629
  }
23622
23630
  /** On ping the session creation timestamp will be updated. */
23623
23631
  onPing(message) {
@@ -23949,6 +23957,339 @@ class ArcwarePixelStreaming extends lib_pixelstreamingfrontend_ue5_5_1.PixelStre
23949
23957
  exports.ArcwarePixelStreaming = ArcwarePixelStreaming;
23950
23958
 
23951
23959
 
23960
+ /***/ }),
23961
+
23962
+ /***/ 6478:
23963
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
23964
+
23965
+
23966
+ /**
23967
+ * DiagnosticsCollector.ts
23968
+ * Lightweight, privacy-aware client diagnostics for troubleshooting + analytics.
23969
+ * WebRTC collection intentionally omitted (to add later).
23970
+ *
23971
+ * Notes:
23972
+ * - Some fields are best-effort due to browser restrictions; they're nullable.
23973
+ * - Bandwidth probe requires a small binary served with:
23974
+ * Content-Type: application/octet-stream
23975
+ * Content-Encoding: identity
23976
+ * Cache-Control: no-store
23977
+ * Default location: /diag/probe.bin
23978
+ */
23979
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
23980
+ exports.DiagnosticsCollector = void 0;
23981
+ const tslib_1 = __webpack_require__(655);
23982
+ /**
23983
+ * DiagnosticsCollector
23984
+ */
23985
+ class DiagnosticsCollector {
23986
+ constructor(opts = {}) {
23987
+ var _a, _b, _c, _d;
23988
+ this.opts = {
23989
+ enableBandwidthProbe: (_a = opts.enableBandwidthProbe) !== null && _a !== void 0 ? _a : true,
23990
+ probeUrl: (_b = opts.probeUrl) !== null && _b !== void 0 ? _b : '/diag/probe.bin',
23991
+ respectSaveData: (_c = opts.respectSaveData) !== null && _c !== void 0 ? _c : true,
23992
+ sampleRate: Math.max(0, Math.min(1, (_d = opts.sampleRate) !== null && _d !== void 0 ? _d : 1))
23993
+ };
23994
+ }
23995
+ /**
23996
+ * Collect the diagnostics payload.
23997
+ */
23998
+ collect() {
23999
+ var _a, _b;
24000
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
24001
+ if (!this.shouldSample()) {
24002
+ return {
24003
+ device: { type: 'desktop', touchSupport: false },
24004
+ runtime: { browser: { family: 'Unknown', version: null }, os: { family: 'Unknown', version: null } },
24005
+ powerHints: { saveData: null, prefersReducedData: null, prefersReducedMotion: null },
24006
+ network: { type: null, effectiveType: null, downlinkMbps: null, rttMs: null, measuredDownlinkMbps: null },
24007
+ timestamps: { collectedAt: Date.now() }
24008
+ };
24009
+ }
24010
+ const collectedAt = Date.now();
24011
+ const [uaInfo, codecSupport, measuredDownlinkMbps] = yield Promise.all([
24012
+ this.getUAInfo(),
24013
+ this.getCodecSupport(),
24014
+ this.maybeMeasureBandwidth()
24015
+ ]);
24016
+ return {
24017
+ device: {
24018
+ type: this.inferDeviceType(),
24019
+ vendor: null,
24020
+ model: uaInfo.model,
24021
+ architecture: uaInfo.architecture,
24022
+ bitness: uaInfo.bitness,
24023
+ touchSupport: this.hasTouch(),
24024
+ hardwareConcurrency: (_a = navigator.hardwareConcurrency) !== null && _a !== void 0 ? _a : null,
24025
+ deviceMemory: (_b = navigator.deviceMemory) !== null && _b !== void 0 ? _b : null,
24026
+ orientation: this.getOrientation(),
24027
+ webgl: this.hasWebGL(),
24028
+ codecs: codecSupport
24029
+ },
24030
+ runtime: {
24031
+ browser: { family: uaInfo.browserFamily, version: uaInfo.browserVersion },
24032
+ os: { family: uaInfo.osFamily, version: uaInfo.osVersion }
24033
+ },
24034
+ powerHints: this.getPowerHints(),
24035
+ network: this.getNetworkInfo(measuredDownlinkMbps),
24036
+ timestamps: { collectedAt }
24037
+ };
24038
+ });
24039
+ }
24040
+ /**
24041
+ * Collect a safe subset of WebRTC stats once PC is connected.
24042
+ */
24043
+ collectWebRTC(pc) {
24044
+ var _a, _b, _c, _d, _e, _f;
24045
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
24046
+ try {
24047
+ const stats = yield pc.getStats();
24048
+ let selected, transport, local, remote;
24049
+ stats.forEach((r) => {
24050
+ if (r.type === 'transport' && r.selectedCandidatePairId)
24051
+ transport = r;
24052
+ if (r.type === 'candidate-pair' && (r.selected || r.nominated))
24053
+ selected = r;
24054
+ });
24055
+ if (selected) {
24056
+ local = stats.get(selected.localCandidateId);
24057
+ remote = stats.get(selected.remoteCandidateId);
24058
+ }
24059
+ return {
24060
+ candidatePairId: (_a = selected === null || selected === void 0 ? void 0 : selected.id) !== null && _a !== void 0 ? _a : null,
24061
+ localCandidateType: (_b = local === null || local === void 0 ? void 0 : local.candidateType) !== null && _b !== void 0 ? _b : null,
24062
+ remoteCandidateType: (_c = remote === null || remote === void 0 ? void 0 : remote.candidateType) !== null && _c !== void 0 ? _c : null,
24063
+ protocol: (_d = local === null || local === void 0 ? void 0 : local.protocol) !== null && _d !== void 0 ? _d : null,
24064
+ networkType: (_e = local === null || local === void 0 ? void 0 : local.networkType) !== null && _e !== void 0 ? _e : null,
24065
+ dtlsCipher: (_f = transport === null || transport === void 0 ? void 0 : transport.dtlsCipher) !== null && _f !== void 0 ? _f : null
24066
+ };
24067
+ }
24068
+ catch (_g) {
24069
+ return {};
24070
+ }
24071
+ });
24072
+ }
24073
+ /**
24074
+ * Helper to embed diagnostics in a hello envelope.
24075
+ */
24076
+ buildHelloEnvelope(base, pc) {
24077
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
24078
+ const diag = yield this.collect();
24079
+ const webrtc = pc ? yield this.collectWebRTC(pc) : undefined;
24080
+ const ext = webrtc ? { diag: Object.assign(Object.assign({}, diag), { webrtc }) } : { diag };
24081
+ return Object.assign(Object.assign({}, base), { ext });
24082
+ });
24083
+ }
24084
+ // ---------- Internals ----------
24085
+ shouldSample() {
24086
+ if (this.opts.sampleRate >= 1)
24087
+ return true;
24088
+ return Math.random() < this.opts.sampleRate;
24089
+ }
24090
+ hasTouch() {
24091
+ var _a;
24092
+ const nav = navigator;
24093
+ return 'ontouchstart' in window || ((_a = nav.maxTouchPoints) !== null && _a !== void 0 ? _a : 0) > 0;
24094
+ }
24095
+ getOrientation() {
24096
+ var _a;
24097
+ try {
24098
+ if ((_a = screen.orientation) === null || _a === void 0 ? void 0 : _a.type) {
24099
+ return screen.orientation.type.startsWith('portrait') ? 'portrait' : 'landscape';
24100
+ }
24101
+ if (window.matchMedia) {
24102
+ return window.matchMedia('(orientation: portrait)').matches ? 'portrait' : 'landscape';
24103
+ }
24104
+ }
24105
+ catch (_b) { }
24106
+ return null;
24107
+ }
24108
+ hasWebGL() {
24109
+ try {
24110
+ const canvas = document.createElement('canvas');
24111
+ return !!(canvas.getContext('webgl') || canvas.getContext('experimental-webgl'));
24112
+ }
24113
+ catch (_a) {
24114
+ return false;
24115
+ }
24116
+ }
24117
+ /**
24118
+ * Heuristic device type: best-effort only.
24119
+ */
24120
+ inferDeviceType() {
24121
+ const uaData = navigator.userAgentData;
24122
+ const isMobileCH = (uaData === null || uaData === void 0 ? void 0 : uaData.mobile) === true;
24123
+ const minDim = Math.min(screen.width, screen.height);
24124
+ if (isMobileCH && minDim >= 600)
24125
+ return 'tablet';
24126
+ if (isMobileCH)
24127
+ return 'mobile';
24128
+ if (/\b(iPad|Tablet)\b/i.test(navigator.userAgent))
24129
+ return 'tablet';
24130
+ if (('ontouchstart' in window) && minDim >= 600 && minDim <= 1100)
24131
+ return 'tablet';
24132
+ return 'desktop';
24133
+ }
24134
+ getPowerHints() {
24135
+ const conn = navigator.connection;
24136
+ const saveData = typeof (conn === null || conn === void 0 ? void 0 : conn.saveData) === 'boolean' ? conn.saveData : null;
24137
+ let prefersReducedData = null;
24138
+ let prefersReducedMotion = null;
24139
+ if (typeof window.matchMedia === 'function') {
24140
+ try {
24141
+ const mqData = window.matchMedia('(prefers-reduced-data: reduce)');
24142
+ if (typeof mqData.matches === 'boolean') {
24143
+ prefersReducedData = mqData.matches;
24144
+ }
24145
+ }
24146
+ catch (_a) { }
24147
+ try {
24148
+ const mqMotion = window.matchMedia('(prefers-reduced-motion: reduce)');
24149
+ if (typeof mqMotion.matches === 'boolean') {
24150
+ prefersReducedMotion = mqMotion.matches;
24151
+ }
24152
+ }
24153
+ catch (_b) { }
24154
+ }
24155
+ return { saveData, prefersReducedData, prefersReducedMotion };
24156
+ }
24157
+ getNetworkInfo(measuredDownlinkMbps) {
24158
+ const conn = navigator.connection;
24159
+ return {
24160
+ type: (typeof (conn === null || conn === void 0 ? void 0 : conn.type) === 'string') ? conn.type : null,
24161
+ effectiveType: (typeof (conn === null || conn === void 0 ? void 0 : conn.effectiveType) === 'string') ? conn.effectiveType : null,
24162
+ downlinkMbps: (typeof (conn === null || conn === void 0 ? void 0 : conn.downlink) === 'number') ? conn.downlink : null,
24163
+ rttMs: (typeof (conn === null || conn === void 0 ? void 0 : conn.rtt) === 'number') ? conn.rtt : null,
24164
+ measuredDownlinkMbps
24165
+ };
24166
+ }
24167
+ maybeMeasureBandwidth() {
24168
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
24169
+ const conn = navigator.connection;
24170
+ const saveData = (conn === null || conn === void 0 ? void 0 : conn.saveData) === true;
24171
+ if (!this.opts.enableBandwidthProbe)
24172
+ return null;
24173
+ if (this.opts.respectSaveData && saveData)
24174
+ return null;
24175
+ try {
24176
+ const t0 = performance.now();
24177
+ const res = yield fetch(this.withCacheBuster(this.opts.probeUrl), {
24178
+ cache: 'no-store',
24179
+ credentials: 'omit'
24180
+ });
24181
+ const buf = yield res.arrayBuffer();
24182
+ const t1 = performance.now();
24183
+ const bits = buf.byteLength * 8;
24184
+ const seconds = (t1 - t0) / 1000;
24185
+ if (seconds <= 0.05)
24186
+ return null; // ignore unstable samples
24187
+ return +((bits / seconds) / 1000000).toFixed(2);
24188
+ }
24189
+ catch (_a) {
24190
+ return null;
24191
+ }
24192
+ });
24193
+ }
24194
+ withCacheBuster(url) {
24195
+ var _a, _b;
24196
+ const u = new URL(url, location.origin);
24197
+ const token = (_b = (_a = crypto === null || crypto === void 0 ? void 0 : crypto.randomUUID) === null || _a === void 0 ? void 0 : _a.call(crypto)) !== null && _b !== void 0 ? _b : String(Date.now());
24198
+ u.searchParams.set('cb', token);
24199
+ return u.toString();
24200
+ }
24201
+ getCodecSupport() {
24202
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
24203
+ const [h264, hevc] = yield Promise.all([
24204
+ this.supportsCodec('video/mp4; codecs="avc1.42E01E"'),
24205
+ this.supportsCodec('video/mp4; codecs="hvc1.1.6.L93.B0"')
24206
+ ]);
24207
+ return { h264, hevc };
24208
+ });
24209
+ }
24210
+ supportsCodec(mime) {
24211
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
24212
+ try {
24213
+ if ('mediaCapabilities' in navigator) {
24214
+ // @ts-ignore
24215
+ const res = yield navigator.mediaCapabilities.decodingInfo({
24216
+ type: 'file',
24217
+ video: { contentType: mime, width: 1920, height: 1080, bitrate: 5000000, framerate: 30 }
24218
+ });
24219
+ return !!(res === null || res === void 0 ? void 0 : res.supported);
24220
+ }
24221
+ }
24222
+ catch (_a) { }
24223
+ try {
24224
+ const v = document.createElement('video');
24225
+ return v.canPlayType(mime) !== '';
24226
+ }
24227
+ catch (_b) {
24228
+ return false;
24229
+ }
24230
+ });
24231
+ }
24232
+ getUAInfo() {
24233
+ var _a, _b;
24234
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
24235
+ const nav = navigator;
24236
+ const uaData = nav.userAgentData;
24237
+ let browserFamily = 'Unknown', browserVersion = null;
24238
+ let osFamily = 'Unknown', osVersion = null;
24239
+ let model = null, architecture = null, bitness = null;
24240
+ if (uaData === null || uaData === void 0 ? void 0 : uaData.getHighEntropyValues) {
24241
+ try {
24242
+ const high = yield uaData.getHighEntropyValues([
24243
+ 'platform', 'platformVersion', 'model', 'architecture', 'bitness', 'fullVersionList'
24244
+ ]);
24245
+ osFamily = high.platform || 'Unknown';
24246
+ osVersion = high.platformVersion || null;
24247
+ model = high.model || null;
24248
+ architecture = high.architecture || null;
24249
+ bitness = high.bitness || null;
24250
+ const brands = high.fullVersionList || uaData.brands || [];
24251
+ const real = brands.find(b => b.brand && !/Chromium|Not:?A-?Brand/i.test(b.brand));
24252
+ browserFamily = (real === null || real === void 0 ? void 0 : real.brand) || ((_a = brands[0]) === null || _a === void 0 ? void 0 : _a.brand) || 'Unknown';
24253
+ browserVersion = (real === null || real === void 0 ? void 0 : real.version) || ((_b = brands[0]) === null || _b === void 0 ? void 0 : _b.version) || null;
24254
+ }
24255
+ catch (_c) { }
24256
+ }
24257
+ if (browserFamily === 'Unknown') {
24258
+ const ua = navigator.userAgent;
24259
+ if (/Firefox\/(\S+)/.test(ua)) {
24260
+ browserFamily = 'Firefox';
24261
+ browserVersion = RegExp.$1;
24262
+ }
24263
+ else if (/Edg\/(\S+)/.test(ua)) {
24264
+ browserFamily = 'Edge';
24265
+ browserVersion = RegExp.$1;
24266
+ }
24267
+ else if (/Chrome\/(\S+)/.test(ua)) {
24268
+ browserFamily = 'Chrome';
24269
+ browserVersion = RegExp.$1;
24270
+ }
24271
+ else if (/Version\/(\S+).*Safari/.test(ua)) {
24272
+ browserFamily = 'Safari';
24273
+ browserVersion = RegExp.$1;
24274
+ }
24275
+ if (/Windows/.test(ua))
24276
+ osFamily = 'Windows';
24277
+ else if (/Mac OS X/.test(ua))
24278
+ osFamily = 'macOS';
24279
+ else if (/Android/.test(ua))
24280
+ osFamily = 'Android';
24281
+ else if (/iPhone|iPad|iPod/.test(ua))
24282
+ osFamily = 'iOS';
24283
+ else if (/Linux/.test(ua))
24284
+ osFamily = 'Linux';
24285
+ }
24286
+ return { browserFamily, browserVersion, osFamily, osVersion, model, architecture, bitness };
24287
+ });
24288
+ }
24289
+ }
24290
+ exports.DiagnosticsCollector = DiagnosticsCollector;
24291
+
24292
+
23952
24293
  /***/ }),
23953
24294
 
23954
24295
  /***/ 5602:
@@ -30645,5 +30986,4 @@ function _typeof(o) {
30645
30986
  /******/ return __webpack_exports__;
30646
30987
  /******/ })()
30647
30988
  ;
30648
- });
30649
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPOzs7Ozs7Ozs7OztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksZUFBZTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixzQkFBc0I7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEVBQTRFLGdFQUFnRTtBQUM1STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEVBQTRFLGdFQUFnRTtBQUM1STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZUFBZTtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSw4Q0FBOEMsS0FBSyxJQUFJLE1BQU07QUFDN0QsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxZQUFZO0FBQzFELFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDaFBBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDRCQUE0QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUN6RkE7QUFDc0U7QUFDbEI7QUFDcEQ7QUFDQTtBQUNBO0FBQ08sb0NBQW9DLDZEQUFlO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFGQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBLFlBQVkscUZBQVc7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3RKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDZkE7QUFDc0U7QUFDdEU7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVkscUZBQVc7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isc0NBQXNDO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isc0NBQXNDO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0JBQW9CO0FBQzVDLGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQSxZQUFZLHFGQUFXLEtBQUsscUNBQXFDLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3ZIQTtBQUM2QztBQUM3QztBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMseURBQWE7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLHlEQUFhO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isc0ZBQVksMENBQTBDLFdBQVc7QUFDakY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ2xUQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7Ozs7Ozs7Ozs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0SUFBNEksS0FBSztBQUNqSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlIQUFpSCxLQUFLO0FBQ3RIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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VDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixxRkFBVyw4QkFBOEIsaUJBQWlCO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsQ0FBQyw0Q0FBNEM7QUFDN0M7Ozs7Ozs7Ozs7O0FDak5BO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUM3Q0E7QUFDc0U7QUFDL0Q7QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksd0ZBQWM7QUFDMUIsd0VBQXdFLHFCQUFxQjtBQUM3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFLHFCQUFxQjtBQUM3RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7OztBQ25ZQTtBQUNzRTtBQUN0RTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFGQUFXO0FBQ3ZCO0FBQ0E7QUFDQSxRQUFRLHFGQUFXO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxxRkFBVztBQUN2QjtBQUNBO0FBQ0EsUUFBUSxxRkFBVztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEscUZBQVcseUJBQXlCLGlCQUFpQixHQUFHLFlBQVk7QUFDNUU7QUFDQTtBQUNBO0FBQ0EsWUFBWSxxRkFBVztBQUN2QjtBQUNBO0FBQ0EsWUFBWSxxRkFBVyw4QkFBOEIsZ0JBQWdCLFlBQVkseUJBQXlCO0FBQzFHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxxQkFBcUI7QUFDeEU7QUFDQTtBQUNBLG1EQUFtRCxlQUFlO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksc0ZBQVksMENBQTBDLGlCQUFpQixHQUFHLFlBQVk7QUFDbEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUMzR0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUM3Q0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDckNBO0FBQ3NFO0FBQ3RFO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHFGQUFXO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxxRkFBVztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVkscUZBQVc7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVkscUZBQVc7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUMvREE7QUFDeUM7QUFDNkI7QUFDdEU7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTRELGlFQUFxQjtBQUNqRiwrREFBK0QsK0RBQW1CO0FBQ2xGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxlQUFlLGdCQUFnQjtBQUMvQjtBQUNBO0FBQ0EsdUNBQXVDLHlFQUE2QjtBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHFGQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hMQTtBQUMwSjtBQUN2RjtBQUNVO0FBQ3hCO0FBQ3dCO0FBQ21CO0FBQ2lCO0FBQ2hEO0FBQ007QUFDYjtBQUNVO0FBQ1g7QUFDZ0Q7QUFDNUI7QUFDTTtBQUNjO0FBQzVCO0FBQ0Q7QUFDc087QUFDOU87QUFDUjtBQUNwRDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLHFGQUFrQjtBQUN4RCx3QkFBd0Isd0RBQVk7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyw2REFBYTtBQUM5QztBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMscUZBQXFCO0FBQzlELCtCQUErQixpRUFBVztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQywyRUFBZ0I7QUFDcEQsdUNBQXVDLDRFQUFvQjtBQUMzRCxpREFBaUQscUZBQXFCO0FBQ3RFLDZDQUE2QyxxRkFBcUI7QUFDbEU7QUFDQTtBQUNBLHFDQUFxQyw2RUFBaUI7QUFDdEQ7QUFDQSwyQ0FBMkMsK0ZBQXVCO0FBQ2xFO0FBQ0EsNkJBQTZCLDZGQUFrQjtBQUMvQyw0QkFBNEIsNkZBQWtCO0FBQzlDLGtDQUFrQywwRkFBd0I7QUFDMUQsa0NBQWtDLHdGQUFzQjtBQUN4RCxrQ0FBa0MsZ0dBQThCO0FBQ2hFLGtDQUFrQyxtR0FBaUM7QUFDbkUsa0NBQWtDLHFHQUFtQztBQUNyRSxrQ0FBa0MsK0ZBQTZCO0FBQy9EO0FBQ0E7QUFDQSxTQUFTO0FBQ1Qsa0NBQWtDLDBGQUF3QjtBQUMxRCxrQ0FBa0MseUZBQXVCO0FBQ3pELGtDQUFrQyxvR0FBa0M7QUFDcEUsa0NBQWtDLGdHQUE4QjtBQUNoRTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsNEJBQTRCLHdGQUE0QixDQUFDLHdGQUFzQjtBQUMvRTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFlBQVksdUZBQVk7QUFDeEIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRFQUE0RSxtRkFBc0M7QUFDbEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qyw0RUFBK0I7QUFDeEUsZ0JBQWdCLHFGQUFvQztBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQSx5Q0FBeUMsNEZBQXFCO0FBQzlELGdEQUFnRCwwR0FBNEI7QUFDNUU7QUFDQTtBQUNBLHVDQUF1Qyw2RUFBbUI7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVEQUF1RCx3RUFBMkI7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsd0ZBQTRCLENBQUMsb0ZBQWtCLElBQUksd0JBQXdCO0FBQ3ZHO0FBQ0EsU0FBUztBQUNULHVEQUF1RCw4RUFBaUM7QUFDeEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHdGQUE0QixDQUFDLDBGQUF3QjtBQUMvRTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRSw4RUFBaUM7QUFDbkc7QUFDQSwwQkFBMEIsd0ZBQTRCLENBQUMsMEZBQXdCO0FBQy9FO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0Esd0VBQXdFLCtFQUFrQztBQUMxRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsc0ZBQVc7QUFDbkI7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaLHVOQUF1TixXQUFXO0FBQ2xPO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQscUdBQTZCO0FBQ3pGLDREQUE0RCxxR0FBNkI7QUFDekYsNERBQTRELHFHQUE2QjtBQUN6RjtBQUNBLFNBQVM7QUFDVCw0REFBNEQscUdBQTZCO0FBQ3pGLDREQUE0RCxxR0FBNkI7QUFDekYsNERBQTRELHFHQUE2QjtBQUN6Riw0REFBNEQscUdBQTZCO0FBQ3pGLDREQUE0RCxxR0FBNkI7QUFDekYsNERBQTRELHFHQUE2QjtBQUN6Riw0REFBNEQscUdBQTZCO0FBQ3pGLDREQUE0RCxxR0FBNkI7QUFDekYsNERBQTRELHFHQUE2QjtBQUN6Riw0REFBNEQscUdBQTZCO0FBQ3pGO0FBQ0EsU0FBUztBQUNULDREQUE0RCxxR0FBNkI7QUFDekYsNERBQTRELHFHQUE2QjtBQUN6Riw0REFBNEQscUdBQTZCO0FBQ3pGO0FBQ0EsU0FBUztBQUNULDREQUE0RCxxR0FBNkI7QUFDekY7QUFDQSw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2RjtBQUNBLFNBQVM7QUFDVCw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7QUFDdkYsNERBQTRELG1HQUEyQjtBQUN2Riw0REFBNEQsbUdBQTJCO0FBQ3ZGLDREQUE0RCxtR0FBMkI7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHFGQUFXO0FBQ25CO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELG1FQUF1QjtBQUM5RTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSx1Q0FBdUMsNERBQVksR0FBRyxhQUFhO0FBQ25FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLDZGQUFpQjtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvRUFBb0UsWUFBWTtBQUNoRjtBQUNBLDBDQUEwQyxnQkFBZ0I7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSx3RkFBVztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQ3pCQTtBQUNzQjtBQUNpQjtBQUNPO0FBQ3ZDO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYiw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0EsbUVBQW1FLG9CQUFvQjtBQUN2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDdEdBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQ3ZMQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7O0FDakRBO0FBQ3dFO0FBQ2pCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyw0RUFBeUI7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdUZBQVc7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUMvRkE7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwREE7QUFDNEM7QUFDNEI7QUFDMUI7QUFDb0I7QUFDTztBQUN6RTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixxREFBVztBQUMxQywwQ0FBMEMsMkVBQXNCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQix1RUFBZ0IsZUFBZSw2RUFBMEI7QUFDekU7QUFDQSw2Q0FBNkMsNkVBQTBCO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQix1RUFBZ0IsZUFBZSw2RUFBMEI7QUFDekU7QUFDQSw2Q0FBNkMsNkVBQTBCO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQix1RUFBZ0IsZUFBZSw0RUFBeUI7QUFDeEU7QUFDQTtBQUNBLGdCQUFnQix1RUFBZ0IsZUFBZSx1RkFBb0M7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHVGQUFXO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLDRCQUE0QixrRUFBcUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHVGQUFXLGdDQUFnQyxzQkFBc0I7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLDZFQUEwQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2Qiw2RUFBMEI7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQiw2RUFBMEI7QUFDcEQsYUFBYSx1RUFBZ0IsZUFBZSw2RUFBMEI7QUFDdEU7QUFDQTtBQUNBLDBCQUEwQiw2RUFBMEI7QUFDcEQsYUFBYSx1RUFBZ0IsZUFBZSw2RUFBMEI7QUFDdEU7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLDZFQUEwQixrQkFBa0IsNkVBQTBCO0FBQ2hHO0FBQ0E7QUFDQSx5Q0FBeUMsNkVBQTBCO0FBQ25FLDRCQUE0QixVQUFVLElBQUksS0FBSztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3V0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyxzREFBc0Q7QUFDaEQ7QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxXQUFXO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsV0FBVztBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELFdBQVc7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsV0FBVztBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDaExBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLDZEQUFlO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCwyREFBYTtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyw2REFBZTtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDBCQUEwQiwyQkFBMkI7QUFDckQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLDBCQUEwQiwyQkFBMkI7QUFDckQsc0RBQXNEO0FBQ3REO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwyQ0FBMkM7QUFDM0M7O0FBRUE7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQiw4RUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssZ0JBQWdCO0FBQ3JCO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxtQ0FBbUMsOEVBQVEsR0FBRztBQUM5QztBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNENBQTRDO0FBQzVDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDBCQUEwQiwyQkFBMkI7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esc0NBQXNDOztBQUV0QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtEQUFrRDs7QUFFbEQ7QUFDQTtBQUNBLHVEQUF1RDs7QUFFdkQ7QUFDQTtBQUNBLHFDQUFxQztBQUNyQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFROzs7QUFHUjtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsd0JBQXdCLDJCQUEyQjtBQUNuRDtBQUNBLHdDQUF3Qzs7QUFFeEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiw4RUFBUSxHQUFHO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsdUNBQXVDO0FBQ3ZDOztBQUVBLGtDQUFrQztBQUNsQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDBDQUEwQztBQUMxQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUNBQXVDO0FBQzNEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9CQUFvQix3Q0FBd0M7QUFDNUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQix5Q0FBeUM7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IseUNBQXlDO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLG1DQUFtQztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG9CQUFvQix3Q0FBd0M7QUFDNUQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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O0FBQ0E7QUFDQTs7QUFFQSx1Q0FBdUMsOEVBQVEsR0FBRztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsOEVBQVEsR0FBRztBQUNqQztBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLDJFQUEyRSxhQUFhO0FBQ3hGO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsSUFBSSx3REFBTztBQUNYO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLE1BQU0sd0RBQU87QUFDYjtBQUNBOztBQUVBLEVBQUUsa0ZBQVk7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsaUVBQWUsS0FBSyxFQUFDO0FBQ3lJOzs7Ozs7OztBQ2h2RTlKO0FBQ2E7O0FBRWI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQixvQkFBb0I7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CO0FBQ3BCLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQSw4REFBOEQ7QUFDOUQsa0JBQWtCLGtCQUFrQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCLE9BQU87QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxpREFBaUQ7QUFDdkY7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyx5QkFBeUI7QUFDL0Q7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyx1QkFBdUI7QUFDN0Q7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsZ0NBQWdDLDJEQUEyRDtBQUMzRjtBQUNBO0FBQ0EsZ0NBQWdDLHlEQUF5RDtBQUN6RjtBQUNBO0FBQ0EsZ0NBQWdDLDJEQUEyRDtBQUMzRjtBQUNBO0FBQ0EsZ0NBQWdDLDBEQUEwRDtBQUMxRjtBQUNBO0FBQ0EsZ0NBQWdDLDBEQUEwRDtBQUMxRjtBQUNBO0FBQ0EsZ0NBQWdDLDJEQUEyRDtBQUMzRjtBQUNBO0FBQ0EsZ0NBQWdDLDBEQUEwRDtBQUMxRjtBQUNBO0FBQ0EsZ0NBQWdDLHdEQUF3RDtBQUN4RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxjQUFjO0FBQzFELFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QyxxQkFBcUI7QUFDakUsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLHFCQUFxQjtBQUNqRSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBLG9CQUFvQjtBQUNwQixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZCxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLGVBQWU7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7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O0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsY0FBYztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixjQUFjO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsY0FBYztBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNWa0M7QUFDUztBQUMzQztBQUNBLFVBQVUsMkRBQVc7QUFDckIscUJBQXFCLHNEQUFPO0FBQzVCOzs7Ozs7Ozs7Ozs7QUNMQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxHQUFHO0FBQ0g7Ozs7Ozs7VUNSQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOzs7OztXQ3RCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsaUNBQWlDLFdBQVc7V0FDNUM7V0FDQTs7Ozs7V0NQQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBOzs7OztXQ1BBOzs7OztXQ0FBO1dBQ0E7V0FDQTtXQUNBLHVEQUF1RCxpQkFBaUI7V0FDeEU7V0FDQSxnREFBZ0QsYUFBYTtXQUM3RDs7Ozs7VUVOQTtVQUNBO1VBQ0E7VUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2FyY3dhcmUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUvZGlzdC9lc20vRXZlbnQvRXZlbnRFbWl0dGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUvZGlzdC9lc20vTG9nZ2VyL0xvZ2dlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41L2Rpc3QvZXNtL01lc3NhZ2VzL21lc3NhZ2VfaGVscGVycy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41L2Rpc3QvZXNtL01lc3NhZ2VzL21lc3NhZ2VfcmVnaXN0cnkuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNS9kaXN0L2VzbS9NZXNzYWdlcy9zaWduYWxsaW5nX21lc3NhZ2VzLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUvZGlzdC9lc20vUHJvdG9jb2wvS2VlcGFsaXZlTW9uaXRvci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41L2Rpc3QvZXNtL1Byb3RvY29sL1NpZ25hbGxpbmdQcm90b2NvbC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41L2Rpc3QvZXNtL1RyYW5zcG9ydC9XZWJTb2NrZXRUcmFuc3BvcnQuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNS9kaXN0L2VzbS9UcmFuc3BvcnQvV2ViU29ja2V0VHJhbnNwb3J0TkpTLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUvZGlzdC9lc20vVXRpbC9TZHBVdGlscy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41L2Rpc3QvZXNtL3BpeGVsc3RyZWFtaW5nY29tbW9uLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9BRksvQUZLQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vQ29uZmlnL0NvbmZpZy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vQ29uZmlnL1NldHRpbmdCYXNlLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9Db25maWcvU2V0dGluZ0ZsYWcuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0NvbmZpZy9TZXR0aW5nTnVtYmVyLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9Db25maWcvU2V0dGluZ09wdGlvbi5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vQ29uZmlnL1NldHRpbmdUZXh0LmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9EYXRhQ2hhbm5lbC9EYXRhQ2hhbm5lbENvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0RhdGFDaGFubmVsL0RhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9EYXRhQ2hhbm5lbC9EYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzdWx0cy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vRGF0YUNoYW5uZWwvRGF0YUNoYW5uZWxTZW5kZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0RhdGFDaGFubmVsL0luaXRpYWxTZXR0aW5ncy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vRGF0YUNoYW5uZWwvTGF0ZW5jeVRlc3RSZXN1bHRzLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9GcmVlemVGcmFtZS9GcmVlemVGcmFtZS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vRnJlZXplRnJhbWUvRnJlZXplRnJhbWVDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9JbnB1dHMvR2FtZXBhZENvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0lucHV0cy9HYW1lcGFkVHlwZXMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0lucHV0cy9JbnB1dENsYXNzZXNGYWN0b3J5LmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9JbnB1dHMvS2V5Q29kZXMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0lucHV0cy9LZXlib2FyZENvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0lucHV0cy9Nb3VzZUJ1dHRvbnMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0lucHV0cy9Nb3VzZUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0lucHV0cy9Nb3VzZUNvbnRyb2xsZXJIb3ZlcmluZy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL01vdXNlQ29udHJvbGxlckxvY2tlZC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL1NwZWNpYWxLZXlDb2Rlcy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL1RvdWNoQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vSW5wdXRzL1RvdWNoQ29udHJvbGxlckZha2UuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL0lucHV0cy9YUkdhbWVwYWRDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvQWdncmVnYXRlZFN0YXRzLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvQ2FuZGlkYXRlUGFpclN0YXRzLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvQ2FuZGlkYXRlU3RhdC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL0RhdGFDaGFubmVsU3RhdHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9JbmJvdW5kUlRQU3RhdHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9MYXRlbmN5Q2FsY3VsYXRvci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL091dEJvdW5kUlRQU3RhdHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9TZXNzaW9uU3RhdHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9TdHJlYW1TdGF0cy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vUGl4ZWxTdHJlYW1pbmcvUGl4ZWxTdHJlYW1pbmcuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1VlSW5zdGFuY2VNZXNzYWdlL1Jlc3BvbnNlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVWVJbnN0YW5jZU1lc3NhZ2UvU2VuZE1lc3NhZ2VDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9VZUluc3RhbmNlTWVzc2FnZS9TdHJlYW1NZXNzYWdlQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVWVJbnN0YW5jZU1lc3NhZ2UvVG9TdHJlYW1lck1lc3NhZ2VzQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vVXRpbC9Ccm93c2VyVXRpbHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1V0aWwvRXZlbnRFbWl0dGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9VdGlsL0ZpbGVVdGlsLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9VdGlsL0lVUkxTZWFyY2hQYXJhbXMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1V0aWwvSW5wdXRDb29yZFRyYW5zbGF0b3IuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1V0aWwvUlRDVXRpbHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1ZpZGVvUGxheWVyL1N0cmVhbUNvbnRyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41L2Rpc3QvZXNtL1ZpZGVvUGxheWVyL1ZpZGVvUGxheWVyLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9XZWJSdGNQbGF5ZXIvV2ViUnRjUGxheWVyQ29udHJvbGxlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUvZGlzdC9lc20vV2ViWFIvV2ViWFJDb250cm9sbGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNS9kaXN0L2VzbS9waXhlbHN0cmVhbWluZ2Zyb250ZW5kLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9BcHBsaWNhdGlvbi9BcHBsaWNhdGlvbi5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vQ29uZmlnL0NvbmZpZ1VJLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9Db25maWcvU2V0dGluZ1VJQmFzZS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vQ29uZmlnL1NldHRpbmdVSUZsYWcuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL0NvbmZpZy9TZXR0aW5nVUlOdW1iZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL0NvbmZpZy9TZXR0aW5nVUlPcHRpb24uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL0NvbmZpZy9TZXR0aW5nVUlUZXh0LmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9PdmVybGF5L0FGS092ZXJsYXkuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL092ZXJsYXkvQWN0aW9uT3ZlcmxheS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vT3ZlcmxheS9CYXNlT3ZlcmxheS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vT3ZlcmxheS9Db25uZWN0T3ZlcmxheS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vT3ZlcmxheS9EaXNjb25uZWN0T3ZlcmxheS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vT3ZlcmxheS9FcnJvck92ZXJsYXkuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL092ZXJsYXkvSW5mb092ZXJsYXkuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL092ZXJsYXkvUGxheU92ZXJsYXkuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL092ZXJsYXkvVGV4dE92ZXJsYXkuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1N0eWxlcy9QaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGVzLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9VSS9Db250cm9scy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vVUkvRGF0YUNoYW5uZWxMYXRlbmN5VGVzdC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vVUkvRWRpdFRleHRNb2RhbC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vVUkvRnVsbHNjcmVlbkljb24uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL0xhYmVsbGVkQnV0dG9uLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9VSS9MYXRlbmN5VGVzdC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWktdWU1LjUvZGlzdC9lc20vVUkvU2V0dGluZ3NJY29uLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9VSS9TZXR0aW5nc1BhbmVsLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9VSS9TdGF0c0ljb24uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL1N0YXRzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1VJL1VJQ29uZmlndXJhdGlvblR5cGVzLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9VSS9WaWRlb1FwSW5kaWNhdG9yLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9VSS9YUkljb24uanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41L2Rpc3QvZXNtL1V0aWwvTWF0aFV0aWxzLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNS9kaXN0L2VzbS9waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L2Fzc2VydC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9iYXNlNjQuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvYmluYXJ5LWZvcm1hdC1jb250cmFjdC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9iaW5hcnktcmVhZGVyLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L2JpbmFyeS13cml0ZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvZ29vZy12YXJpbnQuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvanNvbi1mb3JtYXQtY29udHJhY3QuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvanNvbi10eXBpbmdzLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L2xvd2VyLWNhbWVsLWNhc2UuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvbWVzc2FnZS10eXBlLWNvbnRyYWN0LmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L21lc3NhZ2UtdHlwZS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9vbmVvZi5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9wYi1sb25nLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tYmluYXJ5LXJlYWRlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWJpbmFyeS13cml0ZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1jcmVhdGUuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1lcXVhbHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1pbmZvLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQHByb3RvYnVmLXRzL3J1bnRpbWUvYnVpbGQvZXMyMDE1L3JlZmxlY3Rpb24tanNvbi1yZWFkZXIuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1qc29uLXdyaXRlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLWxvbmctY29udmVydC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLW1lcmdlLXBhcnRpYWwuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AcHJvdG9idWYtdHMvcnVudGltZS9idWlsZC9lczIwMTUvcmVmbGVjdGlvbi1zY2FsYXItZGVmYXVsdC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0Bwcm90b2J1Zi10cy9ydW50aW1lL2J1aWxkL2VzMjAxNS9yZWZsZWN0aW9uLXR5cGUtY2hlY2suanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vX2xpYi90b0ludGVnZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vYWRkTWlsbGlzZWNvbmRzL2luZGV4LmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvZGF0ZS1mbnMvZXNtL2FkZFNlY29uZHMvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vaXNCZWZvcmUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9kYXRlLWZucy9lc20vdG9EYXRlL2luZGV4LmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvaHlwaGVuYXRlLXN0eWxlLW5hbWUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9pcy1pbi1icm93c2VyL2Rpc3QvbW9kdWxlLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvanNzLXBsdWdpbi1jYW1lbC1jYXNlL2Rpc3QvanNzLXBsdWdpbi1jYW1lbC1jYXNlLmVzbS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL2pzcy1wbHVnaW4tZ2xvYmFsL2Rpc3QvanNzLXBsdWdpbi1nbG9iYWwuZXNtLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvanNzL2Rpc3QvanNzLmVzbS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL3NkcC9zZHAuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy90aW55LXdhcm5pbmcvZGlzdC90aW55LXdhcm5pbmcuZXNtLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvQXBwbHlVcmxIYWNrLnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL0FyY3dhcmVBcHBsaWNhdGlvbi50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi9BcmN3YXJlQ29uZmlnLnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL0FyY3dhcmVJbml0LnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL0FyY3dhcmVQaXhlbFN0cmVhbWluZy50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi9kb21haW4vQXJjd2FyZVNldHRpbmdzU2NoZW1hLnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL2RvbWFpbi9Db25uZWN0aW9uSWRlbnRpZmllci50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi9kb21haW4vRXZlbnRIYW5kbGVyLnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL2RvbWFpbi9TZXNzaW9uLnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL2RvbWFpbi9TdGF0cy50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi9kb21haW4vZGVib3VuY2UudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvc3R5bGVzL0FyY3dhcmVQaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGVzLnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL3VpL0FyY3dhcmVMb2dvTG9hZGVyL2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL3VpL0F1ZGlvQnV0dG9uL0F1ZGlvSWNvbi50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi91aS9BdWRpb0J1dHRvbi9pbmRleC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi91aS9Mb3ZlTGV0dGVycy9pbmRleC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi91aS9NaWNCdXR0b24vaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9saWIvdWkvTWljSWNvbi9pbmRleC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi91aS9NaWNyb3Bob25lT3ZlcmxheS9pbmRleC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi91aS9QbGF5SWNvbi9pbmRleC50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL2xpYi91aS9TdG9wQnV0dG9uL2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvbGliL3VpL1N0b3BJY29uL2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvc2hhcmVkL2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvc2hhcmVkL2xpYi9NZXNzYWdlcy9FcnJvck1lc3NhZ2UudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL01lc3NhZ2VzL0xvdmVMZXR0ZXIudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL01lc3NhZ2VzL1BpbmcudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL01lc3NhZ2VzL1F1ZXVlLnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvc2hhcmVkL2xpYi9NZXNzYWdlcy9TZXNzaW9uSWQudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL01lc3NhZ2VzL1N0YXRzLnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvc2hhcmVkL2xpYi9NZXNzYWdlcy9TdHJlYW1JbmZvLnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvc2hhcmVkL2xpYi9NZXNzYWdlcy9WZXJzaW9uLnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9saWJzL3BpeGVsc3RyZWFtaW5nLXdlYnNkay9zcmMvc2hhcmVkL2xpYi9NZXNzYWdlcy9XZWJTZGtTZXR0aW5ncy50cyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbGlicy9waXhlbHN0cmVhbWluZy13ZWJzZGsvc3JjL3NoYXJlZC9saWIvTWVzc2FnZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL2xpYnMvcGl4ZWxzdHJlYW1pbmctd2Vic2RrL3NyYy9zaGFyZWQvbGliL2luZGV4LnRzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvd3MvYnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL3pvZC9saWIvWm9kRXJyb3IuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy96b2QvbGliL2Vycm9ycy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL3pvZC9saWIvZXh0ZXJuYWwuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy96b2QvbGliL2hlbHBlcnMvZXJyb3JVdGlsLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvem9kL2xpYi9oZWxwZXJzL3BhcnNlVXRpbC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL3pvZC9saWIvaGVscGVycy90eXBlQWxpYXNlcy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL3pvZC9saWIvaGVscGVycy91dGlsLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvem9kL2xpYi9pbmRleC5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL3pvZC9saWIvbG9jYWxlcy9lbi5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL3pvZC9saWIvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9jcmVhdGVDbGFzcy5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9pbmhlcml0c0xvb3NlLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZS5qcyIsIndlYnBhY2s6Ly9hcmN3YXJlLy4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL3NldFByb3RvdHlwZU9mLmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9QcmltaXRpdmUuanMiLCJ3ZWJwYWNrOi8vYXJjd2FyZS8uL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b1Byb3BlcnR5S2V5LmpzIiwid2VicGFjazovL2FyY3dhcmUvLi9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mLmpzIiwid2VicGFjazovL2FyY3dhcmUvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vYXJjd2FyZS93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9hcmN3YXJlL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9hcmN3YXJlL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vYXJjd2FyZS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2FyY3dhcmUvd2VicGFjay9iZWZvcmUtc3RhcnR1cCIsIndlYnBhY2s6Ly9hcmN3YXJlL3dlYnBhY2svc3RhcnR1cCIsIndlYnBhY2s6Ly9hcmN3YXJlL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJhcmN3YXJlXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImFyY3dhcmVcIl0gPSBmYWN0b3J5KCk7XG59KSh0aGlzLCAoKSA9PiB7XG5yZXR1cm4gIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8vIFRvIG1hdGNoIE5vZGVKUycgRXZlbnRFbWl0dGVyIHN5bnRheCB3aXRob3V0IGRvd25zdHJlYW0gY29kZSBjaGFuZ2VzIHdlIG5lZWQgdG8gdXNlIGBhbnlgLlxuLy8gVGhpcyBtZWFucyB3ZSBuZWVkIHRvIGRpc2FibGUgbGludGluZyBgYW55YCBjaGVja3Mgb24gdGhpcyBmaWxlLlxuLy9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnQgKi9cbmNsYXNzIFBpeGVsU3RyZWFtaW5nRXZlbnRMaXN0ZW5lciB7XG4gICAgY29uc3RydWN0b3IoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fYXJncyA9IFtdO1xuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH1cbiAgICBoYW5kbGVFdmVudChfZXZ0KSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrKC4uLnRoaXMuX2FyZ3MpO1xuICAgICAgICAvLyBSZXNldCBzdG9yYWdlIG9mIGFyZ3MuXG4gICAgICAgIHRoaXMuX2FyZ3MgPSBbXTtcbiAgICB9XG4gICAgc2V0QXJncyguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMuX2FyZ3MgPSBhcmdzO1xuICAgIH1cbn1cbi8qKlxuICogQSBmZWF0dXJlLWxpbWl0ZWQsIGJ1dCBfbW9zdGx5XyBkcm9wLWluIHJlcGxhY2VtZW50IGZvciBOb2RlJ3MgRXZlbnRFbWl0dGVyIHR5cGUgdGhhdCBpcyBpbXBsZW1lbnRlZCB1c2luZyBFdmVudFRhcmdldC5cbiAqXG4gKiBGb3IgdGhvc2UgdW5mYW1pbGlhciB3aXRoIE5vZGUncyBFdmVudEVtaXR0ZXIsIGhlcmUgaXMgc29tZSBpbmZvIGZyb20gdGhlIG9mZmljaWFsIGRvY3M6XG4gKlxuICogW0luIE5vZGVKU10gYWxsIG9iamVjdHMgdGhhdCBlbWl0IGV2ZW50cyBhcmUgaW5zdGFuY2VzIG9mIHRoZSBgRXZlbnRFbWl0dGVyYCBjbGFzcy4gVGhlc2VcbiAqIG9iamVjdHMgZXhwb3NlIGFuIGBldmVudEVtaXR0ZXIub24oKWAgZnVuY3Rpb24gdGhhdCBhbGxvd3Mgb25lIG9yIG1vcmVcbiAqIGZ1bmN0aW9ucyB0byBiZSBhdHRhY2hlZCB0byBuYW1lZCBldmVudHMgZW1pdHRlZCBieSB0aGUgb2JqZWN0LiBUeXBpY2FsbHksXG4gKiBldmVudCBuYW1lcyBhcmUgY2FtZWwtY2FzZWQgc3RyaW5ncyBidXQgYW55IHZhbGlkIEphdmFTY3JpcHQgcHJvcGVydHkga2V5XG4gKiBjYW4gYmUgdXNlZC5cbiAqXG4gKiBXaGVuIHRoZSBgRXZlbnRFbWl0dGVyYCBvYmplY3QgZW1pdHMgYW4gZXZlbnQsIGFsbCBvZiB0aGUgZnVuY3Rpb25zIGF0dGFjaGVkXG4gKiB0byB0aGF0IHNwZWNpZmljIGV2ZW50IGFyZSBjYWxsZWQgX3N5bmNocm9ub3VzbHlfLiBBbnkgdmFsdWVzIHJldHVybmVkIGJ5IHRoZVxuICogY2FsbGVkIGxpc3RlbmVycyBhcmUgX2lnbm9yZWRfIGFuZCBkaXNjYXJkZWQuXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGEgc2ltcGxlIGBFdmVudEVtaXR0ZXJgIGluc3RhbmNlIHdpdGggYSBzaW5nbGVcbiAqIGxpc3RlbmVyLiBUaGUgYGV2ZW50RW1pdHRlci5vbigpYCBtZXRob2QgaXMgdXNlZCB0byByZWdpc3RlciBsaXN0ZW5lcnMsIHdoaWxlXG4gKiB0aGUgYGV2ZW50RW1pdHRlci5lbWl0KClgIG1ldGhvZCBpcyB1c2VkIHRvIHRyaWdnZXIgdGhlIGV2ZW50LlxuICpcbiAqIGBgYGpzXG4gKiBpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdub2RlOmV2ZW50cyc7XG4gKlxuICogY2xhc3MgTXlFbWl0dGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHt9XG4gKlxuICogY29uc3QgbXlFbWl0dGVyID0gbmV3IE15RW1pdHRlcigpO1xuICogbXlFbWl0dGVyLm9uKCdldmVudCcsICgpID0+IHtcbiAqICAgY29uc29sZS5sb2coJ2FuIGV2ZW50IG9jY3VycmVkIScpO1xuICogfSk7XG4gKiBteUVtaXR0ZXIuZW1pdCgnZXZlbnQnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyIGV4dGVuZHMgRXZlbnRUYXJnZXQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9ldmVudExpc3RlbmVycyA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgcmVtb3ZlTGlzdGVuZXJJbnRlcm5hbChldmVudE5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9ldmVudExpc3RlbmVycy5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRQYWlyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChldmVudFBhaXIuY2FsbGJhY2sgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBmcm9tIGV2ZW50IHRhcmdldFxuICAgICAgICAgICAgICAgICAgICBzdXBlci5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRQYWlyLmV2ZW50TGlzdGVuZXJXcmFwcGVyKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGZyb20gb3VyIGludGVybmFsIG1hcFxuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFsaWFzIGZvciBgZW1pdHRlci5vbihldmVudE5hbWUsIGxpc3RlbmVyKWAuXG4gICAgICovXG4gICAgYWRkTGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gdGhpcy5vbihldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYGxpc3RlbmVyYCBmdW5jdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBsaXN0ZW5lcnMgYXJyYXkgZm9yIHRoZSBldmVudFxuICAgICAqIG5hbWVkIGBldmVudE5hbWVgLlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBzZXJ2ZXIub24oJ2Nvbm5lY3Rpb24nLCAoc3RyZWFtKSA9PiB7XG4gICAgICogICBjb25zb2xlLmxvZygnc29tZW9uZSBjb25uZWN0ZWQhJyk7XG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBgRXZlbnRFbWl0dGVyYCwgc28gdGhhdCBjYWxscyBjYW4gYmUgY2hhaW5lZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBldmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAgICovXG4gICAgb24oZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIC8vIFdyYXAgb3VyIG5vcm1hbCBKUyBmdW5jdGlvbiBpbiBhIGV2ZW50IGxpc3RlbmVyIGludGVyZmFjZVxuICAgICAgICAvLyBzbyB3ZSBjYW4gdXNlIGl0IHdpdGggZXZlbnQgdGFyZ2V0LlxuICAgICAgICBjb25zdCBldmVudExpc3RlbmVyV3JhcHBlciA9IG5ldyBQaXhlbFN0cmVhbWluZ0V2ZW50TGlzdGVuZXIobGlzdGVuZXIpO1xuICAgICAgICBzdXBlci5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRMaXN0ZW5lcldyYXBwZXIpO1xuICAgICAgICAvLyBTdG9yZSB0aGUgZXZlbnQgbGlzdGVuZXIvZnVuY3Rpb24gcGFpciBmb3IgbGF0ZXIgcmVtb3ZhbC5cbiAgICAgICAgaWYgKCF0aGlzLl9ldmVudExpc3RlbmVycy5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbmV3IEFycmF5KCkpO1xuICAgICAgICB9XG4gICAgICAgIChfYSA9IHRoaXMuX2V2ZW50TGlzdGVuZXJzXG4gICAgICAgICAgICAuZ2V0KGV2ZW50TmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wdXNoKHsgY2FsbGJhY2s6IGxpc3RlbmVyLCBldmVudExpc3RlbmVyV3JhcHBlcjogZXZlbnRMaXN0ZW5lcldyYXBwZXIgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgKipvbmUtdGltZSoqIGBsaXN0ZW5lcmAgZnVuY3Rpb24gZm9yIHRoZSBldmVudCBuYW1lZCBgZXZlbnROYW1lYC4gVGhlXG4gICAgICogbmV4dCB0aW1lIGBldmVudE5hbWVgIGlzIHRyaWdnZXJlZCwgdGhpcyBsaXN0ZW5lciBpcyByZW1vdmVkIGFuZCB0aGVuIGludm9rZWQuXG4gICAgICpcbiAgICAgKiBgYGBqc1xuICAgICAqIHNlcnZlci5vbmNlKCdjb25uZWN0aW9uJywgKHN0cmVhbSkgPT4ge1xuICAgICAqICAgY29uc29sZS5sb2coJ0FoLCB3ZSBoYXZlIG91ciBmaXJzdCB1c2VyIScpO1xuICAgICAqIH0pO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAsIHNvIHRoYXQgY2FsbHMgY2FuIGJlIGNoYWluZWQuXG4gICAgICogQHBhcmFtIGV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgKiBAcGFyYW0gbGlzdGVuZXIgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBvbmNlKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvLyBQYXNzIG9wdGlvbnMgc28gdGhpcyBldmVudCBjYWxsYmFjayBpcyBvbmx5IGNhbGxlZCBvbmNlXG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJPcHRzID0geyBvbmNlOiB0cnVlIH07XG4gICAgICAgIC8vIFdyYXAgb3VyIG5vcm1hbCBKUyBmdW5jdGlvbiBpbiBhIGV2ZW50IGxpc3RlbmVyIGludGVyZmFjZVxuICAgICAgICAvLyBzbyB3ZSBjYW4gdXNlIGl0IHdpdGggZXZlbnQgdGFyZ2V0IGFuZCByZW1vdmUgaXQgZnJvbSBldmVudCB0YXJnZXQgd2hlbiB0aGlzIGZ1bmN0aW9uIGNvbXBsZXRlcy5cbiAgICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lcldyYXBwZXIgPSBuZXcgUGl4ZWxTdHJlYW1pbmdFdmVudExpc3RlbmVyKCguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICBsaXN0ZW5lcihhcmdzKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXJJbnRlcm5hbChldmVudE5hbWUsIGxpc3RlbmVyKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN1cGVyLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudExpc3RlbmVyV3JhcHBlciwgZXZlbnRMaXN0ZW5lck9wdHMpO1xuICAgICAgICAvLyBTdG9yZSB0aGUgZXZlbnQgbGlzdGVuZXIvZnVuY3Rpb24gcGFpciBmb3IgbGF0ZXIgcmVtb3ZhbC5cbiAgICAgICAgaWYgKCF0aGlzLl9ldmVudExpc3RlbmVycy5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMuc2V0KGV2ZW50TmFtZSwgbmV3IEFycmF5KCkpO1xuICAgICAgICB9XG4gICAgICAgIChfYSA9IHRoaXMuX2V2ZW50TGlzdGVuZXJzXG4gICAgICAgICAgICAuZ2V0KGV2ZW50TmFtZSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wdXNoKHsgY2FsbGJhY2s6IGxpc3RlbmVyLCBldmVudExpc3RlbmVyV3JhcHBlcjogZXZlbnRMaXN0ZW5lcldyYXBwZXIgfSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgYGxpc3RlbmVyYCBmcm9tIHRoaXMgRXZlbnRFbWl0dGVyLlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBjb25zdCBjYWxsYmFjayA9IChzdHJlYW0pID0+IHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdzb21lb25lIGNvbm5lY3RlZCEnKTtcbiAgICAgKiB9O1xuICAgICAqIHNlcnZlci5vbignY29ubmVjdGlvbicsIGNhbGxiYWNrKTtcbiAgICAgKiAvLyAuLi5cbiAgICAgKiBzZXJ2ZXIucmVtb3ZlTGlzdGVuZXIoJ2Nvbm5lY3Rpb24nLCBjYWxsYmFjayk7XG4gICAgICogYGBgXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAsIHNvIHRoYXQgY2FsbHMgY2FuIGJlIGNoYWluZWQuXG4gICAgICovXG4gICAgcmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnJlbW92ZUxpc3RlbmVySW50ZXJuYWwoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbGlhcyBmb3IgYGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoKWAuXG4gICAgICovXG4gICAgb2ZmKGV2ZW50TmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYWxsIGxpc3RlbmVycywgb3IgdGhvc2Ugb2YgdGhlIHNwZWNpZmllZCBgZXZlbnROYW1lYC5cbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBgRXZlbnRFbWl0dGVyYCwgc28gdGhhdCBjYWxscyBjYW4gYmUgY2hhaW5lZC5cbiAgICAgKi9cbiAgICByZW1vdmVBbGxMaXN0ZW5lcnMoZXZlbnROYW1lKSB7XG4gICAgICAgIGlmICh0aGlzLl9ldmVudExpc3RlbmVycy5oYXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRMaXN0ZW5lcnMuZ2V0KGV2ZW50TmFtZSk7XG4gICAgICAgICAgICBpZiAobGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlbW92ZSBlYWNoIGV2ZW50IGxpc3RlbmVyIGZyb20gdGhlIGV2ZW50IHRhcmdldFxuICAgICAgICAgICAgZm9yIChjb25zdCBsaXN0ZW5lclBhaXIgb2YgbGlzdGVuZXJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXJQYWlyLmV2ZW50TGlzdGVuZXJXcmFwcGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgZXZlbnQgbGlzdGVuZXJzIG1hcHBlZCB0byB0aGlzIGV2ZW50IGZyb20gb3VyIGludGVybmFsIG1hcFxuICAgICAgICAgICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMuZGVsZXRlKGV2ZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN5bmNocm9ub3VzbHkgY2FsbHMgZWFjaCBvZiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIHRoZSBldmVudCBuYW1lZCBgZXZlbnROYW1lYCwgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSByZWdpc3RlcmVkLCBwYXNzaW5nIHRoZSBzdXBwbGllZCBhcmd1bWVudHNcbiAgICAgKiB0byBlYWNoLlxuICAgICAqXG4gICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGV2ZW50IGhhZCBsaXN0ZW5lcnMsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqXG4gICAgICogYGBganNcbiAgICAgKiBpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdub2RlOmV2ZW50cyc7XG4gICAgICogY29uc3QgbXlFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgICAqXG4gICAgICogLy8gRmlyc3QgbGlzdGVuZXJcbiAgICAgKiBteUVtaXR0ZXIub24oJ2V2ZW50JywgZnVuY3Rpb24gZmlyc3RMaXN0ZW5lcigpIHtcbiAgICAgKiAgIGNvbnNvbGUubG9nKCdIZWxsb29vbyEgZmlyc3QgbGlzdGVuZXInKTtcbiAgICAgKiB9KTtcbiAgICAgKiAvLyBTZWNvbmQgbGlzdGVuZXJcbiAgICAgKiBteUVtaXR0ZXIub24oJ2V2ZW50JywgZnVuY3Rpb24gc2Vjb25kTGlzdGVuZXIoYXJnMSwgYXJnMikge1xuICAgICAqICAgY29uc29sZS5sb2coYGV2ZW50IHdpdGggcGFyYW1ldGVycyAke2FyZzF9LCAke2FyZzJ9IGluIHNlY29uZCBsaXN0ZW5lcmApO1xuICAgICAqIH0pO1xuICAgICAqIC8vIFRoaXJkIGxpc3RlbmVyXG4gICAgICogbXlFbWl0dGVyLm9uKCdldmVudCcsIGZ1bmN0aW9uIHRoaXJkTGlzdGVuZXIoLi4uYXJncykge1xuICAgICAqICAgY29uc3QgcGFyYW1ldGVycyA9IGFyZ3Muam9pbignLCAnKTtcbiAgICAgKiAgIGNvbnNvbGUubG9nKGBldmVudCB3aXRoIHBhcmFtZXRlcnMgJHtwYXJhbWV0ZXJzfSBpbiB0aGlyZCBsaXN0ZW5lcmApO1xuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogY29uc29sZS5sb2cobXlFbWl0dGVyLmxpc3RlbmVycygnZXZlbnQnKSk7XG4gICAgICpcbiAgICAgKiBteUVtaXR0ZXIuZW1pdCgnZXZlbnQnLCAxLCAyLCAzLCA0LCA1KTtcbiAgICAgKlxuICAgICAqIC8vIFByaW50czpcbiAgICAgKiAvLyBbXG4gICAgICogLy8gICBbRnVuY3Rpb246IGZpcnN0TGlzdGVuZXJdLFxuICAgICAqIC8vICAgW0Z1bmN0aW9uOiBzZWNvbmRMaXN0ZW5lcl0sXG4gICAgICogLy8gICBbRnVuY3Rpb246IHRoaXJkTGlzdGVuZXJdXG4gICAgICogLy8gXVxuICAgICAqIC8vIEhlbGxvb29vISBmaXJzdCBsaXN0ZW5lclxuICAgICAqIC8vIGV2ZW50IHdpdGggcGFyYW1ldGVycyAxLCAyIGluIHNlY29uZCBsaXN0ZW5lclxuICAgICAqIC8vIGV2ZW50IHdpdGggcGFyYW1ldGVycyAxLCAyLCAzLCA0LCA1IGluIHRoaXJkIGxpc3RlbmVyXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZW1pdChldmVudE5hbWUsIC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKHRoaXMuX2V2ZW50TGlzdGVuZXJzLmhhcyhldmVudE5hbWUpKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudExpc3RlbmVycy5nZXQoZXZlbnROYW1lKTtcbiAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEVuc3VyZSBlYWNoIG9mIG91ciBsaXN0ZW5lcnMgaGF2ZSB0aGUgYXJncyB0aGUgY2FsbGJhY2sgaW5qZWN0ZWRcbiAgICAgICAgICAgIGZvciAoY29uc3QgbGlzdGVuZXJQYWlyIG9mIGxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyUGFpci5ldmVudExpc3RlbmVyV3JhcHBlci5zZXRBcmdzKC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRmlyZSBvZmYgdGhlIGFjdHVhbCBldmVudFxuICAgICAgICAgICAgc3VwZXIuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoZXZlbnROYW1lKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRFbWl0dGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5leHBvcnQgdmFyIExvZ0xldmVsO1xuKGZ1bmN0aW9uIChMb2dMZXZlbCkge1xuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiRGlzYWJsZWRcIl0gPSAwXSA9IFwiRGlzYWJsZWRcIjtcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIkVycm9yXCJdID0gMV0gPSBcIkVycm9yXCI7XG4gICAgTG9nTGV2ZWxbTG9nTGV2ZWxbXCJXYXJuaW5nXCJdID0gMl0gPSBcIldhcm5pbmdcIjtcbiAgICBMb2dMZXZlbFtMb2dMZXZlbFtcIkluZm9cIl0gPSAzXSA9IFwiSW5mb1wiO1xuICAgIExvZ0xldmVsW0xvZ0xldmVsW1wiRGVidWdcIl0gPSA0XSA9IFwiRGVidWdcIjtcbn0pKExvZ0xldmVsIHx8IChMb2dMZXZlbCA9IHt9KSk7XG4vKipcbiAqIFRoZSBnbG9iYWwgY29udGV4dCBmb3IgdGhlIGxvZ2dlciBjb25maWd1cmF0aW9uLlxuICogVGhpcyBjYW5ub3QgYmUgc3RvcmVkIHN0YXRpY2FsbHkgaW4gdGhlIExvZ2dlciBjbGFzcyBiZWNhdXNlIHdlIHNvbWV0aW1lcyBoYXZlIG11bHRpcGxlIGV4ZWN1dGlvblxuICogY29udGV4dHMsIHN1Y2ggYXMgc3RhdHMgcmVwb3J0aW5nLiBJbnN0ZWFkIHdlIHN0b3JlIHRoZSBsb2dnZXIgY29uZmlnIGNvbnRleHQgb24gdGhlIHdpbmRvdyBvYmplY3RcbiAqIHRvIGJlIHNoYXJlZCB3aXRoIGFueSBMb2dnZXIgaW5zdGFuY2VzLlxuICovXG5leHBvcnQgY2xhc3MgTG9nZ2VyQ29udGV4dCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubG9nTGV2ZWwgPSBMb2dMZXZlbC5EZWJ1ZztcbiAgICAgICAgdGhpcy5pbmNsdWRlU3RhY2sgPSB0cnVlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBvdmVycmlkZUxvZ2dlcihsb2dnZXIpIHtcbiAgICBMb2dnZXIgPSBsb2dnZXI7XG59XG4vKipcbiAqIEEgYmFzaWMgY29uc29sZSBsb2dnZXIgdXRpbGl6ZWQgYnkgdGhlIFBpeGVsIFN0cmVhbWluZyBmcm9udGVuZCB0byBhbGxvd1xuICogbG9nZ2luZyB0byB0aGUgYnJvd3NlciBjb25zb2xlLlxuICovXG5leHBvcnQgY2xhc3MgTG9nZ2VyVHlwZSB7XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsb2cgdmVyYm9zaXR5IGxldmVsXG4gICAgICovXG4gICAgSW5pdExvZ2dpbmcobG9nTGV2ZWwsIGluY2x1ZGVTdGFjaykge1xuICAgICAgICB0aGlzLlZhbGlkYXRlQ29udGV4dCgpO1xuICAgICAgICB0aGlzLmNvbnRleHQubG9nTGV2ZWwgPSBsb2dMZXZlbDtcbiAgICAgICAgdGhpcy5jb250ZXh0LmluY2x1ZGVTdGFjayA9IGluY2x1ZGVTdGFjaztcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nZ2luZyBvdXRwdXQgZm9yIGRlYnVnZ2luZ1xuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkXG4gICAgICovXG4gICAgRGVidWcobWVzc2FnZSkge1xuICAgICAgICB0aGlzLlZhbGlkYXRlQ29udGV4dCgpO1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmxvZ0xldmVsID49IExvZ0xldmVsLkRlYnVnKSB7XG4gICAgICAgICAgICB0aGlzLkNvbW1vbkxvZygnRGVidWcnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBCYXNpYyBsb2dnaW5nIG91dHB1dCBmb3Igc3RhbmRhcmQgbWVzc2FnZXNcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZFxuICAgICAqL1xuICAgIEluZm8obWVzc2FnZSkge1xuICAgICAgICB0aGlzLlZhbGlkYXRlQ29udGV4dCgpO1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmxvZ0xldmVsID49IExvZ0xldmVsLkluZm8pIHtcbiAgICAgICAgICAgIHRoaXMuQ29tbW9uTG9nKCdJbmZvJywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nZ2luZyBmb3Igd2FybmluZ3NcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIHRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZFxuICAgICAqL1xuICAgIFdhcm5pbmcobWVzc2FnZSkge1xuICAgICAgICB0aGlzLlZhbGlkYXRlQ29udGV4dCgpO1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmxvZ0xldmVsID49IExvZ0xldmVsLldhcm5pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuQ29tbW9uTG9nKCdXYXJuaW5nJywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogRXJyb3IgbG9nZ2luZ1xuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gdGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkXG4gICAgICovXG4gICAgRXJyb3IobWVzc2FnZSkge1xuICAgICAgICB0aGlzLlZhbGlkYXRlQ29udGV4dCgpO1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmxvZ0xldmVsID49IExvZ0xldmVsLkVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLkNvbW1vbkxvZygnRXJyb3InLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29tbW9uIGxvZyBmdW5jdGlvbiB0aGF0IGFsbCBvdGhlciBsb2cgZnVuY3Rpb25zIGNhbGwgdG8uXG4gICAgICogQHBhcmFtIGxldmVsIC0gdGhlIGxldmVsIG9mIHRoaXMgbG9nIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIHN0YWNrIC0gYW4gb3B0aW9uYWwgc3RhY2sgdHJhY2Ugc3RyaW5nIGZyb20gd2hlcmUgdGhlIGxvZyBtZXNzYWdlIHdhcyBjYWxsZWQuXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSB0aGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAgICovXG4gICAgQ29tbW9uTG9nKGxldmVsLCBtZXNzYWdlKSB7XG4gICAgICAgIGxldCBsb2dNZXNzYWdlID0gYFske2xldmVsfV0gLSAke21lc3NhZ2V9YDtcbiAgICAgICAgaWYgKHRoaXMuY29udGV4dC5pbmNsdWRlU3RhY2spIHtcbiAgICAgICAgICAgIGxvZ01lc3NhZ2UgKz0gYFxcblN0YWNrOiAke3RoaXMuR2V0U3RhY2tUcmFjZSgpfWA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxldmVsID09PSAnRXJyb3InKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGxvZ01lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGxldmVsID09PSAnV2FybmluZycpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2Fybihsb2dNZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGxvZ01lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhcHR1cmVzIHRoZSBzdGFjayBhbmQgcmV0dXJucyBpdFxuICAgICAqIEByZXR1cm5zIHRoZSBjdXJyZW50IHN0YWNrXG4gICAgICovXG4gICAgR2V0U3RhY2tUcmFjZSgpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICAgICAgbGV0IGZvcm1hdHRlZFN0YWNrID0gJ05vIFN0YWNrIEF2YWlsYWJsZSBmb3IgdGhpcyBicm93c2VyJztcbiAgICAgICAgLy8gZm9ybWF0IHRoZSBlcnJvclxuICAgICAgICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICAgICAgICAgIGZvcm1hdHRlZFN0YWNrID0gZXJyb3Iuc3RhY2sudG9TdHJpbmcoKS5yZXBsYWNlKC9FcnJvci9nLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZFN0YWNrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaW5jZSB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgZXhlY3V0aW9uIGNvbnRleHRzLCAoc3RhdHMgcmVwb3J0aW5nIGFuZCBzb21lIHdlYnhyIGxvZ2dpbmcgY29tZXMgZnJvbVxuICAgICAqIGRpZmZlcmVudCBleGVjdXRpb24gY29udGV4dHMgd2UgY2FuIGVuZCB1cCB3aXRoIG11bHRpcGxlIHN0YXRpYyBMb2dnZXIgaW5zdGFuY2VzLiBIZXJlIHdlIHRyeSB0b1xuICAgICAqIHdvcmsgYXJvdW5kIGl0IGJ5IHN0b3JpbmcgdGhlIGNvbnRleHQgb24gdGhlIHdpbmRvdyBvYmplY3QuXG4gICAgICovXG4gICAgVmFsaWRhdGVDb250ZXh0KCkge1xuICAgICAgICBpZiAoIXRoaXMuY29udGV4dCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT0gJ3VuZGVmaW5lZCcgfHwgIXdpbmRvdykge1xuICAgICAgICAgICAgICAgIC8vIG5vIHdpbmRvdyBvYmplY3Qgc28gd2UgY2FuIG9ubHkgc3RvcmUgYSBsb2NhbCBjb250ZXh0LlxuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IG5ldyBMb2dnZXJDb250ZXh0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghd2luZG93LmxvZ2dlckNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBuZXcgTG9nZ2VyQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2dnZXJDb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gd2luZG93LmxvZ2dlckNvbnRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnQgbGV0IExvZ2dlciA9IG5ldyBMb2dnZXJUeXBlKCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Mb2dnZXIuanMubWFwIiwiaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vTG9nZ2VyL0xvZ2dlcic7XG5pbXBvcnQgeyBNZXNzYWdlUmVnaXN0cnkgfSBmcm9tICcuL21lc3NhZ2VfcmVnaXN0cnknO1xuLyoqXG4gKiBBIGhlbHBlciBmb3IgY3JlYXRpbmcgc2lnbmFsbGluZyBtZXNzYWdlcy4gVGFrZXMgaW4gb3B0aW9uYWwgZ2l2ZW4gcGFyYW1ldGVycyBhbmRcbiAqIGluY2x1ZGVzIHRoZW0gaW4gYSBtZXNzYWdlIG9iamVjdCB3aXRoIHRoZSAndHlwZScgZmllbGQgc2V0IHByb3Blcmx5IGZvciB0aGUgbWVzc2FnZVxuICogdHlwZSBzdXBwbGllZC5cbiAqIEBwYXJhbSBtZXNzYWdlVHlwZSAtIEEgbWVzc2FnZSB0eXBlIGZyb20gTWVzc2FnZVJlZ2lzdHJ5IHRoYXQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIG1lc3NhZ2UgdG8gY3JlYXRlLlxuICogQHBhcmFtIHBhcmFtcyAtIEFuIG9wdGlvbmFsIG9iamVjdCB3aG9zZSBmaWVsZHMgYXJlIGFkZGVkIHRvIHRoZSBuZXdseSBjcmVhdGVkIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0aW5nIG1lc3NhZ2Ugb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTWVzc2FnZShtZXNzYWdlVHlwZSwgcGFyYW1zKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VUeXBlLmNyZWF0ZSgpO1xuICAgIG1lc3NhZ2UudHlwZSA9IG1lc3NhZ2VUeXBlLnR5cGVOYW1lO1xuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgbWVzc2FnZVR5cGUubWVyZ2VQYXJ0aWFsKG1lc3NhZ2UsIHBhcmFtcyk7XG4gICAgfVxuICAgIHJldHVybiBtZXNzYWdlO1xufVxuLyoqXG4gKiBUZXN0cyB0aGF0IHRoZSBzdXBwbGllZCBtZXNzYWdlIGlzIHZhbGlkLiBUaGF0IGlzIGNvbnRhaW5zIGFsbCBleHBlY3RlZCBmaWVsZHMgYW5kXG4gKiBkb2Vzbid0IGNvbnRhaW4gYW55IHVua25vd24gZmllbGRzLlxuICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIG9iamVjdCB0byB0ZXN0LlxuICogQHJldHVybnMgVGhlIG1lc3NhZ2UgdHlwZSBmcm9tIE1lc3NhZ2VSZWdpc3RyeSBvZiB0aGUgc3VwcGxpZWQgbWVzc2FnZSBvYmplY3QgaWYgaXQncyB2YWxpZCwgb3IgbnVsbCBpZiBpbnZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNZXNzYWdlKG1zZykge1xuICAgIGxldCB2YWxpZCA9IHRydWU7XG4gICAgaWYgKCFtc2cudHlwZSkge1xuICAgICAgICBMb2dnZXIuRXJyb3IoYFBhcnNlZCBtZXNzYWdlIGhhcyBubyB0eXBlLiBSZWplY3RlZC4gJHtKU09OLnN0cmluZ2lmeShtc2cpfWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZVR5cGUgPSBNZXNzYWdlUmVnaXN0cnlbbXNnLnR5cGVdO1xuICAgIGlmICghbWVzc2FnZVR5cGUpIHtcbiAgICAgICAgTG9nZ2VyLkVycm9yKGBNZXNzYWdlIGlzIG9mIGFuIHVua25vd24gdHlwZTogXCIke21zZy50eXBlfVwiLiBSZWplY3RlZC5gKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChtZXNzYWdlVHlwZS5maWVsZHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBtZXNzYWdlVHlwZS5maWVsZHMpIHtcbiAgICAgICAgICAgIGlmICghZmllbGQub3B0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobXNnLCBmaWVsZC5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoYE1lc3NhZ2UgXCIke21zZy50eXBlfVwiXCIgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZCBcIiR7ZmllbGQubmFtZX1cIi4gUmVqZWN0ZWQuYCk7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgZmllbGROYW1lIGluIG1zZykge1xuICAgICAgICBjb25zdCBmb3VuZCA9IG1lc3NhZ2VUeXBlLmZpZWxkcy5maW5kKChmaWVsZCkgPT4gZmllbGQubmFtZSA9PT0gZmllbGROYW1lKTtcbiAgICAgICAgaWYgKCFmb3VuZCkge1xuICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBNZXNzYWdlIFwiJHttc2cudHlwZX1cIiBjb250YWlucyB1bmtub3duIGZpZWxkIFwiJHtmaWVsZE5hbWV9XCIuIFJlamVjdGVkLmApO1xuICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsaWQgPyBtZXNzYWdlVHlwZSA6IG51bGw7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXNzYWdlX2hlbHBlcnMuanMubWFwIiwiaW1wb3J0ICogYXMgTWVzc2FnZXMgZnJvbSAnLi9zaWduYWxsaW5nX21lc3NhZ2VzJztcbi8qKlxuICogQSBtYXAgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgc2lnbmFsbGluZyBtZXNzYWdlcyBpbiB0aGUgUGl4ZWwgU3RyZWFtaW5nXG4gKiBzaWduYWxsaW5nIHByb3RvY29sLiBUaGlzIGFsbG93cyBtYXBwaW5nIG9mIHNpZ25hbGxpbmcgbWVzc2FnZSBuYW1lc1xuICogdG8gYWN0dWFsIG1lc3NhZ2UgdHlwZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdlUmVnaXN0cnkgPSB7XG4gICAgYW5zd2VyOiBNZXNzYWdlcy5hbnN3ZXIsXG4gICAgY29uZmlnOiBNZXNzYWdlcy5jb25maWcsXG4gICAgZGlzY29ubmVjdFBsYXllcjogTWVzc2FnZXMuZGlzY29ubmVjdFBsYXllcixcbiAgICBlbmRwb2ludElkOiBNZXNzYWdlcy5lbmRwb2ludElkLFxuICAgIGVuZHBvaW50SWRDb25maXJtOiBNZXNzYWdlcy5lbmRwb2ludElkQ29uZmlybSxcbiAgICBpY2VDYW5kaWRhdGU6IE1lc3NhZ2VzLmljZUNhbmRpZGF0ZSxcbiAgICBpZGVudGlmeTogTWVzc2FnZXMuaWRlbnRpZnksXG4gICAgbGlzdFN0cmVhbWVyczogTWVzc2FnZXMubGlzdFN0cmVhbWVycyxcbiAgICBvZmZlcjogTWVzc2FnZXMub2ZmZXIsXG4gICAgcGluZzogTWVzc2FnZXMucGluZyxcbiAgICBwbGF5ZXJDb25uZWN0ZWQ6IE1lc3NhZ2VzLnBsYXllckNvbm5lY3RlZCxcbiAgICBwbGF5ZXJDb3VudDogTWVzc2FnZXMucGxheWVyQ291bnQsXG4gICAgcGxheWVyRGlzY29ubmVjdGVkOiBNZXNzYWdlcy5wbGF5ZXJEaXNjb25uZWN0ZWQsXG4gICAgcG9uZzogTWVzc2FnZXMucG9uZyxcbiAgICBzdGF0czogTWVzc2FnZXMuc3RhdHMsXG4gICAgc3RyZWFtZXJEaXNjb25uZWN0ZWQ6IE1lc3NhZ2VzLnN0cmVhbWVyRGlzY29ubmVjdGVkLFxuICAgIHN0cmVhbWVyTGlzdDogTWVzc2FnZXMuc3RyZWFtZXJMaXN0LFxuICAgIHN1YnNjcmliZTogTWVzc2FnZXMuc3Vic2NyaWJlLFxuICAgIHVuc3Vic2NyaWJlOiBNZXNzYWdlcy51bnN1YnNjcmliZSxcbiAgICBsYXllclByZWZlcmVuY2U6IE1lc3NhZ2VzLmxheWVyUHJlZmVyZW5jZSxcbiAgICBkYXRhQ2hhbm5lbFJlcXVlc3Q6IE1lc3NhZ2VzLmRhdGFDaGFubmVsUmVxdWVzdCxcbiAgICBwZWVyRGF0YUNoYW5uZWxzOiBNZXNzYWdlcy5wZWVyRGF0YUNoYW5uZWxzLFxuICAgIHBlZXJEYXRhQ2hhbm5lbHNSZWFkeTogTWVzc2FnZXMucGVlckRhdGFDaGFubmVsc1JlYWR5LFxuICAgIHN0cmVhbWVyRGF0YUNoYW5uZWxzOiBNZXNzYWdlcy5zdHJlYW1lckRhdGFDaGFubmVscyxcbiAgICBzdGFydFN0cmVhbWluZzogTWVzc2FnZXMuc3RhcnRTdHJlYW1pbmcsXG4gICAgc3RvcFN0cmVhbWluZzogTWVzc2FnZXMuc3RvcFN0cmVhbWluZ1xufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lc3NhZ2VfcmVnaXN0cnkuanMubWFwIiwiaW1wb3J0IHsgV2lyZVR5cGUgfSBmcm9tIFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIjtcbmltcG9ydCB7IFVua25vd25GaWVsZEhhbmRsZXIgfSBmcm9tIFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIjtcbmltcG9ydCB7IHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwgfSBmcm9tIFwiQHByb3RvYnVmLXRzL3J1bnRpbWVcIjtcbmltcG9ydCB7IE1lc3NhZ2VUeXBlIH0gZnJvbSBcIkBwcm90b2J1Zi10cy9ydW50aW1lXCI7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBiYXNlX21lc3NhZ2UkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJiYXNlX21lc3NhZ2VcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgYmFzZV9tZXNzYWdlXG4gKi9cbmV4cG9ydCBjb25zdCBiYXNlX21lc3NhZ2UgPSBuZXcgYmFzZV9tZXNzYWdlJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHBlZXJDb25uZWN0aW9uT3B0aW9ucyRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInBlZXJDb25uZWN0aW9uT3B0aW9uc1wiLCBbXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgcGVlckNvbm5lY3Rpb25PcHRpb25zXG4gKi9cbmV4cG9ydCBjb25zdCBwZWVyQ29ubmVjdGlvbk9wdGlvbnMgPSBuZXcgcGVlckNvbm5lY3Rpb25PcHRpb25zJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIGNvbmZpZyRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImNvbmZpZ1wiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwicGVlckNvbm5lY3Rpb25PcHRpb25zXCIsIGtpbmQ6IFwibWVzc2FnZVwiLCBUOiAoKSA9PiBwZWVyQ29ubmVjdGlvbk9wdGlvbnMgfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwicHJvdG9jb2xWZXJzaW9uXCIsIGtpbmQ6IFwic2NhbGFyXCIsIG9wdDogdHJ1ZSwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBwZWVyQ29ubmVjdGlvbk9wdGlvbnMgcGVlckNvbm5lY3Rpb25PcHRpb25zICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGVlckNvbm5lY3Rpb25PcHRpb25zID0gcGVlckNvbm5lY3Rpb25PcHRpb25zLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucywgbWVzc2FnZS5wZWVyQ29ubmVjdGlvbk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIG9wdGlvbmFsIHN0cmluZyBwcm90b2NvbFZlcnNpb24gKi8gMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wcm90b2NvbFZlcnNpb24gPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBwZWVyQ29ubmVjdGlvbk9wdGlvbnMgcGVlckNvbm5lY3Rpb25PcHRpb25zID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UucGVlckNvbm5lY3Rpb25PcHRpb25zKVxuICAgICAgICAgICAgcGVlckNvbm5lY3Rpb25PcHRpb25zLmludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZS5wZWVyQ29ubmVjdGlvbk9wdGlvbnMsIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5mb3JrKCksIG9wdGlvbnMpLmpvaW4oKTtcbiAgICAgICAgLyogb3B0aW9uYWwgc3RyaW5nIHByb3RvY29sVmVyc2lvbiA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnByb3RvY29sVmVyc2lvbiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygzLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnByb3RvY29sVmVyc2lvbik7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBjb25maWdcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbmZpZyA9IG5ldyBjb25maWckVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgaWRlbnRpZnkkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJpZGVudGlmeVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBpZGVudGlmeVxuICovXG5leHBvcnQgY29uc3QgaWRlbnRpZnkgPSBuZXcgaWRlbnRpZnkkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgZW5kcG9pbnRJZCRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImVuZHBvaW50SWRcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcImlkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAzLCBuYW1lOiBcInByb3RvY29sVmVyc2lvblwiLCBraW5kOiBcInNjYWxhclwiLCBvcHQ6IHRydWUsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5pZCA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBpZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIG9wdGlvbmFsIHN0cmluZyBwcm90b2NvbFZlcnNpb24gKi8gMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wcm90b2NvbFZlcnNpb24gPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBzdHJpbmcgaWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5pZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5pZCk7XG4gICAgICAgIC8qIG9wdGlvbmFsIHN0cmluZyBwcm90b2NvbFZlcnNpb24gPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5wcm90b2NvbFZlcnNpb24gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5wcm90b2NvbFZlcnNpb24pO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZW5kcG9pbnRJZFxuICovXG5leHBvcnQgY29uc3QgZW5kcG9pbnRJZCA9IG5ldyBlbmRwb2ludElkJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIGVuZHBvaW50SWRDb25maXJtJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiZW5kcG9pbnRJZENvbmZpcm1cIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcImNvbW1pdHRlZElkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5jb21taXR0ZWRJZCA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBjb21taXR0ZWRJZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbW1pdHRlZElkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIGNvbW1pdHRlZElkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuY29tbWl0dGVkSWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UuY29tbWl0dGVkSWQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZW5kcG9pbnRJZENvbmZpcm1cbiAqL1xuZXhwb3J0IGNvbnN0IGVuZHBvaW50SWRDb25maXJtID0gbmV3IGVuZHBvaW50SWRDb25maXJtJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHN0cmVhbWVySWRDaGFuZ2VkJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwic3RyZWFtZXJJZENoYW5nZWRcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcIm5ld0lEXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5uZXdJRCA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBuZXdJRCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm5ld0lEID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIG5ld0lEID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UubmV3SUQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UubmV3SUQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2Ugc3RyZWFtZXJJZENoYW5nZWRcbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmVhbWVySWRDaGFuZ2VkID0gbmV3IHN0cmVhbWVySWRDaGFuZ2VkJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIGxpc3RTdHJlYW1lcnMkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJsaXN0U3RyZWFtZXJzXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGxpc3RTdHJlYW1lcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGxpc3RTdHJlYW1lcnMgPSBuZXcgbGlzdFN0cmVhbWVycyRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBzdHJlYW1lckxpc3QkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJzdHJlYW1lckxpc3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcImlkc1wiLCBraW5kOiBcInNjYWxhclwiLCByZXBlYXQ6IDIgLypSZXBlYXRUeXBlLlVOUEFDS0VEKi8sIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5pZHMgPSBbXTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogcmVwZWF0ZWQgc3RyaW5nIGlkcyAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkcy5wdXNoKHJlYWRlci5zdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiByZXBlYXRlZCBzdHJpbmcgaWRzID0gMjsgKi9cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXNzYWdlLmlkcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5pZHNbaV0pO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2Ugc3RyZWFtZXJMaXN0XG4gKi9cbmV4cG9ydCBjb25zdCBzdHJlYW1lckxpc3QgPSBuZXcgc3RyZWFtZXJMaXN0JFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHN1YnNjcmliZSRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInN1YnNjcmliZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwic3RyZWFtZXJJZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2Uuc3RyZWFtZXJJZCA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBzdHJlYW1lcklkICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RyZWFtZXJJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIHN0cmluZyBzdHJlYW1lcklkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc3RyZWFtZXJJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5zdHJlYW1lcklkKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHN1YnNjcmliZVxuICovXG5leHBvcnQgY29uc3Qgc3Vic2NyaWJlID0gbmV3IHN1YnNjcmliZSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyB1bnN1YnNjcmliZSRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInVuc3Vic2NyaWJlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHVuc3Vic2NyaWJlXG4gKi9cbmV4cG9ydCBjb25zdCB1bnN1YnNjcmliZSA9IG5ldyB1bnN1YnNjcmliZSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBzdWJzY3JpYmVGYWlsZWQkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJzdWJzY3JpYmVGYWlsZWRcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcIm1lc3NhZ2VcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLm1lc3NhZ2UgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgbWVzc2FnZSAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm1lc3NhZ2UgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBzdHJpbmcgbWVzc2FnZSA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2UgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UubWVzc2FnZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBzdWJzY3JpYmVGYWlsZWRcbiAqL1xuZXhwb3J0IGNvbnN0IHN1YnNjcmliZUZhaWxlZCA9IG5ldyBzdWJzY3JpYmVGYWlsZWQkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgcGxheWVyQ29ubmVjdGVkJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwicGxheWVyQ29ubmVjdGVkXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJkYXRhQ2hhbm5lbFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA4IC8qU2NhbGFyVHlwZS5CT09MKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwic2Z1XCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDggLypTY2FsYXJUeXBlLkJPT0wqLyB9LFxuICAgICAgICAgICAgeyBubzogNSwgbmFtZTogXCJwbGF5ZXJJZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UuZGF0YUNoYW5uZWwgPSBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5zZnUgPSBmYWxzZTtcbiAgICAgICAgbWVzc2FnZS5wbGF5ZXJJZCA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGJvb2wgZGF0YUNoYW5uZWwgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhQ2hhbm5lbCA9IHJlYWRlci5ib29sKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogYm9vbCBzZnUgKi8gMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZnUgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBwbGF5ZXJJZCAqLyA1OlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllcklkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogYm9vbCBkYXRhQ2hhbm5lbCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLmRhdGFDaGFubmVsICE9PSBmYWxzZSlcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuVmFyaW50KS5ib29sKG1lc3NhZ2UuZGF0YUNoYW5uZWwpO1xuICAgICAgICAvKiBib29sIHNmdSA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNmdSAhPT0gZmFsc2UpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIFdpcmVUeXBlLlZhcmludCkuYm9vbChtZXNzYWdlLnNmdSk7XG4gICAgICAgIC8qIHN0cmluZyBwbGF5ZXJJZCA9IDU7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnBsYXllcklkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyg1LCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnBsYXllcklkKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHBsYXllckNvbm5lY3RlZFxuICovXG5leHBvcnQgY29uc3QgcGxheWVyQ29ubmVjdGVkID0gbmV3IHBsYXllckNvbm5lY3RlZCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBwbGF5ZXJEaXNjb25uZWN0ZWQkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJwbGF5ZXJEaXNjb25uZWN0ZWRcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcInBsYXllcklkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5wbGF5ZXJJZCA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBwbGF5ZXJJZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBsYXllcklkID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIHBsYXllcklkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVySWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UucGxheWVySWQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgcGxheWVyRGlzY29ubmVjdGVkXG4gKi9cbmV4cG9ydCBjb25zdCBwbGF5ZXJEaXNjb25uZWN0ZWQgPSBuZXcgcGxheWVyRGlzY29ubmVjdGVkJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIG9mZmVyJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwib2ZmZXJcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcInNkcFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMywgbmFtZTogXCJwbGF5ZXJJZFwiLCBraW5kOiBcInNjYWxhclwiLCBvcHQ6IHRydWUsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiA0LCBuYW1lOiBcInNmdVwiLCBraW5kOiBcInNjYWxhclwiLCBvcHQ6IHRydWUsIFQ6IDggLypTY2FsYXJUeXBlLkJPT0wqLyB9LFxuICAgICAgICAgICAgeyBubzogNSwgbmFtZTogXCJtdWx0aXBsZXhcIiwga2luZDogXCJzY2FsYXJcIiwgb3B0OiB0cnVlLCBUOiA4IC8qU2NhbGFyVHlwZS5CT09MKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDYsIG5hbWU6IFwic2NhbGFiaWxpdHlNb2RlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIG9wdDogdHJ1ZSwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnNkcCA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBzZHAgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZHAgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogb3B0aW9uYWwgc3RyaW5nIHBsYXllcklkICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogb3B0aW9uYWwgYm9vbCBzZnUgKi8gNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZnUgPSByZWFkZXIuYm9vbCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIG9wdGlvbmFsIGJvb2wgbXVsdGlwbGV4ICovIDU6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubXVsdGlwbGV4ID0gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBzdHJpbmcgc2NhbGFiaWxpdHlNb2RlICovIDY6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2NhbGFiaWxpdHlNb2RlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIHNkcCA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNkcCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5zZHApO1xuICAgICAgICAvKiBvcHRpb25hbCBzdHJpbmcgcGxheWVySWQgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJJZCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygzLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnBsYXllcklkKTtcbiAgICAgICAgLyogb3B0aW9uYWwgYm9vbCBzZnUgPSA0OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zZnUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHdyaXRlci50YWcoNCwgV2lyZVR5cGUuVmFyaW50KS5ib29sKG1lc3NhZ2Uuc2Z1KTtcbiAgICAgICAgLyogb3B0aW9uYWwgYm9vbCBtdWx0aXBsZXggPSA1OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5tdWx0aXBsZXggIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHdyaXRlci50YWcoNSwgV2lyZVR5cGUuVmFyaW50KS5ib29sKG1lc3NhZ2UubXVsdGlwbGV4KTtcbiAgICAgICAgLyogb3B0aW9uYWwgc3RyaW5nIHNjYWxhYmlsaXR5TW9kZSA9IDY7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNjYWxhYmlsaXR5TW9kZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyg2LCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnNjYWxhYmlsaXR5TW9kZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBvZmZlclxuICovXG5leHBvcnQgY29uc3Qgb2ZmZXIgPSBuZXcgb2ZmZXIkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgYW5zd2VyJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiYW5zd2VyXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJzZHBcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwicGxheWVySWRcIiwga2luZDogXCJzY2FsYXJcIiwgb3B0OiB0cnVlLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJtaW5CaXRyYXRlQnBzXCIsIGtpbmQ6IFwic2NhbGFyXCIsIG9wdDogdHJ1ZSwgVDogNSAvKlNjYWxhclR5cGUuSU5UMzIqLyB9LFxuICAgICAgICAgICAgeyBubzogNSwgbmFtZTogXCJtYXhCaXRyYXRlQnBzXCIsIGtpbmQ6IFwic2NhbGFyXCIsIG9wdDogdHJ1ZSwgVDogNSAvKlNjYWxhclR5cGUuSU5UMzIqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2Uuc2RwID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHNkcCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNkcCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBzdHJpbmcgcGxheWVySWQgKi8gMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBpbnQzMiBtaW5CaXRyYXRlQnBzICovIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubWluQml0cmF0ZUJwcyA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIG9wdGlvbmFsIGludDMyIG1heEJpdHJhdGVCcHMgKi8gNTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5tYXhCaXRyYXRlQnBzID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBzdHJpbmcgc2RwID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2Uuc2RwICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnNkcCk7XG4gICAgICAgIC8qIG9wdGlvbmFsIHN0cmluZyBwbGF5ZXJJZCA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnBsYXllcklkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UucGxheWVySWQpO1xuICAgICAgICAvKiBvcHRpb25hbCBpbnQzMiBtaW5CaXRyYXRlQnBzID0gNDsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UubWluQml0cmF0ZUJwcyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyg0LCBXaXJlVHlwZS5WYXJpbnQpLmludDMyKG1lc3NhZ2UubWluQml0cmF0ZUJwcyk7XG4gICAgICAgIC8qIG9wdGlvbmFsIGludDMyIG1heEJpdHJhdGVCcHMgPSA1OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5tYXhCaXRyYXRlQnBzICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDUsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5tYXhCaXRyYXRlQnBzKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGFuc3dlclxuICovXG5leHBvcnQgY29uc3QgYW5zd2VyID0gbmV3IGFuc3dlciRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBpY2VDYW5kaWRhdGVEYXRhJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiaWNlQ2FuZGlkYXRlRGF0YVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcImNhbmRpZGF0ZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJzZHBNaWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwic2RwTUxpbmVJbmRleFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA1IC8qU2NhbGFyVHlwZS5JTlQzMiovIH0sXG4gICAgICAgICAgICB7IG5vOiA0LCBuYW1lOiBcInVzZXJuYW1lRnJhZ21lbnRcIiwga2luZDogXCJzY2FsYXJcIiwgb3B0OiB0cnVlLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UuY2FuZGlkYXRlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5zZHBNaWQgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnNkcE1MaW5lSW5kZXggPSAwO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyBjYW5kaWRhdGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jYW5kaWRhdGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHNkcE1pZCAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNkcE1pZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBpbnQzMiBzZHBNTGluZUluZGV4ICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2RwTUxpbmVJbmRleCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIG9wdGlvbmFsIHN0cmluZyB1c2VybmFtZUZyYWdtZW50ICovIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudXNlcm5hbWVGcmFnbWVudCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgY2FuZGlkYXRlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuY2FuZGlkYXRlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLmNhbmRpZGF0ZSk7XG4gICAgICAgIC8qIHN0cmluZyBzZHBNaWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zZHBNaWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2Uuc2RwTWlkKTtcbiAgICAgICAgLyogaW50MzIgc2RwTUxpbmVJbmRleCA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNkcE1MaW5lSW5kZXggIT09IDApXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIFdpcmVUeXBlLlZhcmludCkuaW50MzIobWVzc2FnZS5zZHBNTGluZUluZGV4KTtcbiAgICAgICAgLyogb3B0aW9uYWwgc3RyaW5nIHVzZXJuYW1lRnJhZ21lbnQgPSA0OyAqL1xuICAgICAgICBpZiAobWVzc2FnZS51c2VybmFtZUZyYWdtZW50ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDQsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudXNlcm5hbWVGcmFnbWVudCk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBpY2VDYW5kaWRhdGVEYXRhXG4gKi9cbmV4cG9ydCBjb25zdCBpY2VDYW5kaWRhdGVEYXRhID0gbmV3IGljZUNhbmRpZGF0ZURhdGEkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgaWNlQ2FuZGlkYXRlJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwiaWNlQ2FuZGlkYXRlXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJjYW5kaWRhdGVcIiwga2luZDogXCJtZXNzYWdlXCIsIFQ6ICgpID0+IGljZUNhbmRpZGF0ZURhdGEgfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwicGxheWVySWRcIiwga2luZDogXCJzY2FsYXJcIiwgb3B0OiB0cnVlLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGljZUNhbmRpZGF0ZURhdGEgY2FuZGlkYXRlICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuY2FuZGlkYXRlID0gaWNlQ2FuZGlkYXRlRGF0YS5pbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCByZWFkZXIudWludDMyKCksIG9wdGlvbnMsIG1lc3NhZ2UuY2FuZGlkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBzdHJpbmcgcGxheWVySWQgKi8gMzpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIGljZUNhbmRpZGF0ZURhdGEgY2FuZGlkYXRlID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UuY2FuZGlkYXRlKVxuICAgICAgICAgICAgaWNlQ2FuZGlkYXRlRGF0YS5pbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UuY2FuZGlkYXRlLCB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuZm9yaygpLCBvcHRpb25zKS5qb2luKCk7XG4gICAgICAgIC8qIG9wdGlvbmFsIHN0cmluZyBwbGF5ZXJJZCA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnBsYXllcklkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UucGxheWVySWQpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgaWNlQ2FuZGlkYXRlXG4gKi9cbmV4cG9ydCBjb25zdCBpY2VDYW5kaWRhdGUgPSBuZXcgaWNlQ2FuZGlkYXRlJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIGRpc2Nvbm5lY3RQbGF5ZXIkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJkaXNjb25uZWN0UGxheWVyXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJwbGF5ZXJJZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMywgbmFtZTogXCJyZWFzb25cIiwga2luZDogXCJzY2FsYXJcIiwgb3B0OiB0cnVlLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgcGxheWVySWQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBvcHRpb25hbCBzdHJpbmcgcmVhc29uICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVhc29uID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIHBsYXllcklkID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UucGxheWVySWQgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDIsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UucGxheWVySWQpO1xuICAgICAgICAvKiBvcHRpb25hbCBzdHJpbmcgcmVhc29uID0gMzsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UucmVhc29uICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDMsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UucmVhc29uKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGRpc2Nvbm5lY3RQbGF5ZXJcbiAqL1xuZXhwb3J0IGNvbnN0IGRpc2Nvbm5lY3RQbGF5ZXIgPSBuZXcgZGlzY29ubmVjdFBsYXllciRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBwaW5nJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwicGluZ1wiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwidGltZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA1IC8qU2NhbGFyVHlwZS5JTlQzMiovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS50aW1lID0gMDtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50MzIgdGltZSAqLyAyOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRpbWUgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIGludDMyIHRpbWUgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50aW1lICE9PSAwKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5WYXJpbnQpLmludDMyKG1lc3NhZ2UudGltZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBwaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBwaW5nID0gbmV3IHBpbmckVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgcG9uZyRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInBvbmdcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcInRpbWVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogNSAvKlNjYWxhclR5cGUuSU5UMzIqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UudGltZSA9IDA7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIC8qIGludDMyIHRpbWUgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50aW1lID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBpbnQzMiB0aW1lID0gMjsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudGltZSAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLnRpbWUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgcG9uZ1xuICovXG5leHBvcnQgY29uc3QgcG9uZyA9IG5ldyBwb25nJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHN0cmVhbWVyRGlzY29ubmVjdGVkJFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwic3RyZWFtZXJEaXNjb25uZWN0ZWRcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2Ugc3RyZWFtZXJEaXNjb25uZWN0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IHN0cmVhbWVyRGlzY29ubmVjdGVkID0gbmV3IHN0cmVhbWVyRGlzY29ubmVjdGVkJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIGxheWVyUHJlZmVyZW5jZSRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcImxheWVyUHJlZmVyZW5jZVwiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDIsIG5hbWU6IFwic3BhdGlhbExheWVyXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfSxcbiAgICAgICAgICAgIHsgbm86IDMsIG5hbWU6IFwidGVtcG9yYWxMYXllclwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA1IC8qU2NhbGFyVHlwZS5JTlQzMiovIH0sXG4gICAgICAgICAgICB7IG5vOiA0LCBuYW1lOiBcInBsYXllcklkXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5zcGF0aWFsTGF5ZXIgPSAwO1xuICAgICAgICBtZXNzYWdlLnRlbXBvcmFsTGF5ZXIgPSAwO1xuICAgICAgICBtZXNzYWdlLnBsYXllcklkID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50MzIgc3BhdGlhbExheWVyICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3BhdGlhbExheWVyID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50MzIgdGVtcG9yYWxMYXllciAqLyAzOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRlbXBvcmFsTGF5ZXIgPSByZWFkZXIuaW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgcGxheWVySWQgKi8gNDpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wbGF5ZXJJZCA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIC8qIGludDMyIHNwYXRpYWxMYXllciA9IDI7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNwYXRpYWxMYXllciAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLnNwYXRpYWxMYXllcik7XG4gICAgICAgIC8qIGludDMyIHRlbXBvcmFsTGF5ZXIgPSAzOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50ZW1wb3JhbExheWVyICE9PSAwKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygzLCBXaXJlVHlwZS5WYXJpbnQpLmludDMyKG1lc3NhZ2UudGVtcG9yYWxMYXllcik7XG4gICAgICAgIC8qIHN0cmluZyBwbGF5ZXJJZCA9IDQ7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnBsYXllcklkICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyg0LCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnBsYXllcklkKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIGxheWVyUHJlZmVyZW5jZVxuICovXG5leHBvcnQgY29uc3QgbGF5ZXJQcmVmZXJlbmNlID0gbmV3IGxheWVyUHJlZmVyZW5jZSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBkYXRhQ2hhbm5lbFJlcXVlc3QkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJkYXRhQ2hhbm5lbFJlcXVlc3RcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2UgZGF0YUNoYW5uZWxSZXF1ZXN0XG4gKi9cbmV4cG9ydCBjb25zdCBkYXRhQ2hhbm5lbFJlcXVlc3QgPSBuZXcgZGF0YUNoYW5uZWxSZXF1ZXN0JFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHBlZXJEYXRhQ2hhbm5lbHMkVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJwZWVyRGF0YUNoYW5uZWxzXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJwbGF5ZXJJZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMywgbmFtZTogXCJzZW5kU3RyZWFtSWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogNSAvKlNjYWxhclR5cGUuSU5UMzIqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJyZWN2U3RyZWFtSWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogNSAvKlNjYWxhclR5cGUuSU5UMzIqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnNlbmRTdHJlYW1JZCA9IDA7XG4gICAgICAgIG1lc3NhZ2UucmVjdlN0cmVhbUlkID0gMDtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHBsYXllcklkICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucGxheWVySWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50MzIgc2VuZFN0cmVhbUlkICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VuZFN0cmVhbUlkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50MzIgcmVjdlN0cmVhbUlkICovIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVjdlN0cmVhbUlkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBzdHJpbmcgcGxheWVySWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5wbGF5ZXJJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5wbGF5ZXJJZCk7XG4gICAgICAgIC8qIGludDMyIHNlbmRTdHJlYW1JZCA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNlbmRTdHJlYW1JZCAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLnNlbmRTdHJlYW1JZCk7XG4gICAgICAgIC8qIGludDMyIHJlY3ZTdHJlYW1JZCA9IDQ7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnJlY3ZTdHJlYW1JZCAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoNCwgV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLnJlY3ZTdHJlYW1JZCk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBwZWVyRGF0YUNoYW5uZWxzXG4gKi9cbmV4cG9ydCBjb25zdCBwZWVyRGF0YUNoYW5uZWxzID0gbmV3IHBlZXJEYXRhQ2hhbm5lbHMkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3MgcGVlckRhdGFDaGFubmVsc1JlYWR5JFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwicGVlckRhdGFDaGFubmVsc1JlYWR5XCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVJlYWQocmVhZGVyLCBsZW5ndGgsIG9wdGlvbnMsIHRhcmdldCkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IHRhcmdldCAhPT0gbnVsbCAmJiB0YXJnZXQgIT09IHZvaWQgMCA/IHRhcmdldCA6IHRoaXMuY3JlYXRlKCksIGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICBsZXQgW2ZpZWxkTm8sIHdpcmVUeXBlXSA9IHJlYWRlci50YWcoKTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGRObykge1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHR5cGUgKi8gMTpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50eXBlID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHBlZXJEYXRhQ2hhbm5lbHNSZWFkeVxuICovXG5leHBvcnQgY29uc3QgcGVlckRhdGFDaGFubmVsc1JlYWR5ID0gbmV3IHBlZXJEYXRhQ2hhbm5lbHNSZWFkeSRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBzdHJlYW1lckRhdGFDaGFubmVscyRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInN0cmVhbWVyRGF0YUNoYW5uZWxzXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJzZnVJZFwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMywgbmFtZTogXCJzZW5kU3RyZWFtSWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogNSAvKlNjYWxhclR5cGUuSU5UMzIqLyB9LFxuICAgICAgICAgICAgeyBubzogNCwgbmFtZTogXCJyZWN2U3RyZWFtSWRcIiwga2luZDogXCJzY2FsYXJcIiwgVDogNSAvKlNjYWxhclR5cGUuSU5UMzIqLyB9XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdsb2JhbFRoaXMuT2JqZWN0LmNyZWF0ZSgodGhpcy5tZXNzYWdlUHJvdG90eXBlKSk7XG4gICAgICAgIG1lc3NhZ2UudHlwZSA9IFwiXCI7XG4gICAgICAgIG1lc3NhZ2Uuc2Z1SWQgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLnNlbmRTdHJlYW1JZCA9IDA7XG4gICAgICAgIG1lc3NhZ2UucmVjdlN0cmVhbUlkID0gMDtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIHNmdUlkICovIDI6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2Z1SWQgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50MzIgc2VuZFN0cmVhbUlkICovIDM6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VuZFN0cmVhbUlkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50MzIgcmVjdlN0cmVhbUlkICovIDQ6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVjdlN0cmVhbUlkID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICAvKiBzdHJpbmcgc2Z1SWQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5zZnVJZCAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS5zZnVJZCk7XG4gICAgICAgIC8qIGludDMyIHNlbmRTdHJlYW1JZCA9IDM7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnNlbmRTdHJlYW1JZCAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMywgV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLnNlbmRTdHJlYW1JZCk7XG4gICAgICAgIC8qIGludDMyIHJlY3ZTdHJlYW1JZCA9IDQ7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnJlY3ZTdHJlYW1JZCAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoNCwgV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLnJlY3ZTdHJlYW1JZCk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBzdHJlYW1lckRhdGFDaGFubmVsc1xuICovXG5leHBvcnQgY29uc3Qgc3RyZWFtZXJEYXRhQ2hhbm5lbHMgPSBuZXcgc3RyZWFtZXJEYXRhQ2hhbm5lbHMkVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3Mgc3RhcnRTdHJlYW1pbmckVHlwZSBleHRlbmRzIE1lc3NhZ2VUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJzdGFydFN0cmVhbWluZ1wiLCBbXG4gICAgICAgICAgICB7IG5vOiAxLCBuYW1lOiBcInR5cGVcIiwga2luZDogXCJzY2FsYXJcIiwgVDogOSAvKlNjYWxhclR5cGUuU1RSSU5HKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwodGhpcywgbWVzc2FnZSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpLCBlbmQgPSByZWFkZXIucG9zICsgbGVuZ3RoO1xuICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgbGV0IFtmaWVsZE5vLCB3aXJlVHlwZV0gPSByZWFkZXIudGFnKCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkTm8pIHtcbiAgICAgICAgICAgICAgICBjYXNlIC8qIHN0cmluZyB0eXBlICovIDE6XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHlwZSA9IHJlYWRlci5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbGV0IHUgPSBvcHRpb25zLnJlYWRVbmtub3duRmllbGQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ID09PSBcInRocm93XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgZ2xvYmFsVGhpcy5FcnJvcihgVW5rbm93biBmaWVsZCAke2ZpZWxkTm99ICh3aXJlIHR5cGUgJHt3aXJlVHlwZX0pIGZvciAke3RoaXMudHlwZU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAodSA9PT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25SZWFkIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICBpbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucykge1xuICAgICAgICAvKiBzdHJpbmcgdHlwZSA9IDE7ICovXG4gICAgICAgIGlmIChtZXNzYWdlLnR5cGUgIT09IFwiXCIpXG4gICAgICAgICAgICB3cml0ZXIudGFnKDEsIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCkuc3RyaW5nKG1lc3NhZ2UudHlwZSk7XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uV3JpdGUgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgICAgICByZXR1cm4gd3JpdGVyO1xuICAgIH1cbn1cbi8qKlxuICogQGdlbmVyYXRlZCBNZXNzYWdlVHlwZSBmb3IgcHJvdG9idWYgbWVzc2FnZSBzdGFydFN0cmVhbWluZ1xuICovXG5leHBvcnQgY29uc3Qgc3RhcnRTdHJlYW1pbmcgPSBuZXcgc3RhcnRTdHJlYW1pbmckVHlwZSgpO1xuLy8gQGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgd2l0aCByZWZsZWN0aW9uIGluZm9ybWF0aW9uLCBtYXkgcHJvdmlkZSBzcGVlZCBvcHRpbWl6ZWQgbWV0aG9kc1xuY2xhc3Mgc3RvcFN0cmVhbWluZyRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInN0b3BTdHJlYW1pbmdcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgICAgICBpZiAodSA9PT0gXCJ0aHJvd1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGdsb2JhbFRoaXMuRXJyb3IoYFVua25vd24gZmllbGQgJHtmaWVsZE5vfSAod2lyZSB0eXBlICR7d2lyZVR5cGV9KSBmb3IgJHt0aGlzLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZCA9IHJlYWRlci5za2lwKHdpcmVUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIGZpZWxkTm8sIHdpcmVUeXBlLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9XG4gICAgaW50ZXJuYWxCaW5hcnlXcml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgLyogc3RyaW5nIHR5cGUgPSAxOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS50eXBlICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygxLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLnR5cGUpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2Ugc3RvcFN0cmVhbWluZ1xuICovXG5leHBvcnQgY29uc3Qgc3RvcFN0cmVhbWluZyA9IG5ldyBzdG9wU3RyZWFtaW5nJFR5cGUoKTtcbi8vIEBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIHdpdGggcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiwgbWF5IHByb3ZpZGUgc3BlZWQgb3B0aW1pemVkIG1ldGhvZHNcbmNsYXNzIHBsYXllckNvdW50JFR5cGUgZXh0ZW5kcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFwicGxheWVyQ291bnRcIiwgW1xuICAgICAgICAgICAgeyBubzogMSwgbmFtZTogXCJ0eXBlXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH0sXG4gICAgICAgICAgICB7IG5vOiAyLCBuYW1lOiBcImNvdW50XCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDUgLypTY2FsYXJUeXBlLklOVDMyKi8gfVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnbG9iYWxUaGlzLk9iamVjdC5jcmVhdGUoKHRoaXMubWVzc2FnZVByb3RvdHlwZSkpO1xuICAgICAgICBtZXNzYWdlLnR5cGUgPSBcIlwiO1xuICAgICAgICBtZXNzYWdlLmNvdW50ID0gMDtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogaW50MzIgY291bnQgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb3VudCA9IHJlYWRlci5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogaW50MzIgY291bnQgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5jb3VudCAhPT0gMClcbiAgICAgICAgICAgIHdyaXRlci50YWcoMiwgV2lyZVR5cGUuVmFyaW50KS5pbnQzMihtZXNzYWdlLmNvdW50KTtcbiAgICAgICAgbGV0IHUgPSBvcHRpb25zLndyaXRlVW5rbm93bkZpZWxkcztcbiAgICAgICAgaWYgKHUgIT09IGZhbHNlKVxuICAgICAgICAgICAgKHUgPT0gdHJ1ZSA/IFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA6IHUpKHRoaXMudHlwZU5hbWUsIG1lc3NhZ2UsIHdyaXRlcik7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxufVxuLyoqXG4gKiBAZ2VuZXJhdGVkIE1lc3NhZ2VUeXBlIGZvciBwcm90b2J1ZiBtZXNzYWdlIHBsYXllckNvdW50XG4gKi9cbmV4cG9ydCBjb25zdCBwbGF5ZXJDb3VudCA9IG5ldyBwbGF5ZXJDb3VudCRUeXBlKCk7XG4vLyBAZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB3aXRoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24sIG1heSBwcm92aWRlIHNwZWVkIG9wdGltaXplZCBtZXRob2RzXG5jbGFzcyBzdGF0cyRUeXBlIGV4dGVuZHMgTWVzc2FnZVR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihcInN0YXRzXCIsIFtcbiAgICAgICAgICAgIHsgbm86IDEsIG5hbWU6IFwidHlwZVwiLCBraW5kOiBcInNjYWxhclwiLCBUOiA5IC8qU2NhbGFyVHlwZS5TVFJJTkcqLyB9LFxuICAgICAgICAgICAgeyBubzogMiwgbmFtZTogXCJkYXRhXCIsIGtpbmQ6IFwic2NhbGFyXCIsIFQ6IDkgLypTY2FsYXJUeXBlLlNUUklORyovIH1cbiAgICAgICAgXSk7XG4gICAgfVxuICAgIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZ2xvYmFsVGhpcy5PYmplY3QuY3JlYXRlKCh0aGlzLm1lc3NhZ2VQcm90b3R5cGUpKTtcbiAgICAgICAgbWVzc2FnZS50eXBlID0gXCJcIjtcbiAgICAgICAgbWVzc2FnZS5kYXRhID0gXCJcIjtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIG1lc3NhZ2UsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIGxlbmd0aCwgb3B0aW9ucywgdGFyZ2V0KSB7XG4gICAgICAgIGxldCBtZXNzYWdlID0gdGFyZ2V0ICE9PSBudWxsICYmIHRhcmdldCAhPT0gdm9pZCAwID8gdGFyZ2V0IDogdGhpcy5jcmVhdGUoKSwgZW5kID0gcmVhZGVyLnBvcyArIGxlbmd0aDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAvKiBzdHJpbmcgdHlwZSAqLyAxOlxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnR5cGUgPSByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgLyogc3RyaW5nIGRhdGEgKi8gMjpcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhID0gcmVhZGVyLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IG9wdGlvbnMucmVhZFVua25vd25GaWVsZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHUgPT09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBnbG9iYWxUaGlzLkVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy50eXBlTmFtZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGQgPSByZWFkZXIuc2tpcCh3aXJlVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vblJlYWQgOiB1KSh0aGlzLnR5cGVOYW1lLCBtZXNzYWdlLCBmaWVsZE5vLCB3aXJlVHlwZSwgZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIC8qIHN0cmluZyB0eXBlID0gMTsgKi9cbiAgICAgICAgaWYgKG1lc3NhZ2UudHlwZSAhPT0gXCJcIilcbiAgICAgICAgICAgIHdyaXRlci50YWcoMSwgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5zdHJpbmcobWVzc2FnZS50eXBlKTtcbiAgICAgICAgLyogc3RyaW5nIGRhdGEgPSAyOyAqL1xuICAgICAgICBpZiAobWVzc2FnZS5kYXRhICE9PSBcIlwiKVxuICAgICAgICAgICAgd3JpdGVyLnRhZygyLCBXaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLnN0cmluZyhtZXNzYWdlLmRhdGEpO1xuICAgICAgICBsZXQgdSA9IG9wdGlvbnMud3JpdGVVbmtub3duRmllbGRzO1xuICAgICAgICBpZiAodSAhPT0gZmFsc2UpXG4gICAgICAgICAgICAodSA9PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy50eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKTtcbiAgICAgICAgcmV0dXJuIHdyaXRlcjtcbiAgICB9XG59XG4vKipcbiAqIEBnZW5lcmF0ZWQgTWVzc2FnZVR5cGUgZm9yIHByb3RvYnVmIG1lc3NhZ2Ugc3RhdHNcbiAqL1xuZXhwb3J0IGNvbnN0IHN0YXRzID0gbmV3IHN0YXRzJFR5cGUoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNpZ25hbGxpbmdfbWVzc2FnZXMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCAqIGFzIE1lc3NhZ2VzIGZyb20gJy4uL01lc3NhZ2VzL3NpZ25hbGxpbmdfbWVzc2FnZXMnO1xuaW1wb3J0ICogYXMgTWVzc2FnZUhlbHBlcnMgZnJvbSAnLi4vTWVzc2FnZXMvbWVzc2FnZV9oZWxwZXJzJztcbi8qKlxuICogVXNlZCB0byByZWd1bGFybHkgcGluZyBhIHByb3RvY29sIGNvbm5lY3Rpb24gdG8gbWFrZSBzdXJlIHRoZSBjb25uZWN0aW9uIGlzIHN0aWxsIGdvb2QgYW5kIG9wZW4uXG4gKiBXaGVuIHRoZSBwb25nIGRvZXNuJ3QgY29tZSBpbiByZXNwb25zZSB0byBhIHBpbmcgaW4gdGltZSBhIGNhbGxiYWNrIGlzIGZpcmVkIHRoYXQgY2FuIGJlIGhhbmRlZFxuICogYnkgdGhlIG93bmVyLlxuICovXG5leHBvcnQgY2xhc3MgS2VlcGFsaXZlTW9uaXRvciB7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgUm91bmQgVHJpcCBUaW1lIG9mIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gaW4gbWlsbGlzZWNvbmRzLlxuICAgICAqL1xuICAgIGdldCBSVFQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJ0dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBtb25pdG9yIGFuZCBzdGFydHMgdGhlIHBpbmcgdGltZXIuIElmIGEgcG9uZyBkb2VzIG5vdCBjb21lIGJhY2sgYnkgdGhlIHRpbWUgd2Ugd2FudFxuICAgICAqIHRvIHNlbmQgYSBzZWNvbmQgcGluZyB0aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNvbnNpZGVyZWQgZGVhZCBhbmQgdGhlIG9uVGltZW91dCBjYWxsYmFjayBpcyBmaXJlZC5cbiAgICAgKiBAcGFyYW0gcHJvdG9jb2wgLSBUaGUgY29ubmVjdGlvbiB0aGF0IHdlIHdhbnQgdG8gbW9uaXRvci5cbiAgICAgKiBAcGFyYW0gdGltZW91dCAtIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHBpbmcgbWVzc2FnZXMuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJvdG9jb2wsIHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5hbGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJ0dCA9IDA7XG4gICAgICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbDtcbiAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgICAgICAgdGhpcy5vblJlc3BvbnNlID0gdGhpcy5vbkhlYXJ0YmVhdFJlc3BvbnNlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wudHJhbnNwb3J0Lm9uKCdjbG9zZScsIHRoaXMuc3RvcC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5zdGFydCgpO1xuICAgIH1cbiAgICBzdGFydCgpIHtcbiAgICAgICAgdGhpcy5hbGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMucHJvdG9jb2wub24oJ3BvbmcnLCB0aGlzLm9uUmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmtlZXBhbGl2ZSA9IHNldEludGVydmFsKHRoaXMuc2VuZEhlYXJ0YmVhdC5iaW5kKHRoaXMpLCB0aGlzLnRpbWVvdXQpO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMua2VlcGFsaXZlKTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5vZmYoJ3BvbmcnLCB0aGlzLm9uUmVzcG9uc2UpO1xuICAgIH1cbiAgICBzZW5kSGVhcnRiZWF0KCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIC8vIGlmIHdlIG5ldmVyIGdvdCBhIHJlc3BvbnNlIGZyb20gdGhlIGxhc3QgaGVhcnRiZWF0LCBhc3N1bWUgdGhlIGNvbm5lY3Rpb24gaXMgZGVhZCBhbmQgdGltZW91dFxuICAgICAgICBpZiAodGhpcy5hbGl2ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIChfYSA9IHRoaXMub25UaW1lb3V0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBtYXJrIHRoZSBjb25uZWN0aW9uIGFzIHRlbXBvcmFyaWx5IGRlYWQgdW50aWwgd2UgZ2V0IGEgcmVzcG9uc2UgZnJvbSB0aGUgcGluZ1xuICAgICAgICB0aGlzLmFsaXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJvdG9jb2wuc2VuZE1lc3NhZ2UoTWVzc2FnZUhlbHBlcnMuY3JlYXRlTWVzc2FnZShNZXNzYWdlcy5waW5nLCB7IHRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpIH0pKTtcbiAgICB9XG4gICAgb25IZWFydGJlYXRSZXNwb25zZShwb25nTXNnKSB7XG4gICAgICAgIC8vIHdlIGdvdCBhIHBvbmcgcmVzcG9uc2UgZnJvbSB0aGUgb3RoZXIgc2lkZSwgdGhlIGNvbm5lY3Rpb24gaXMgZ29vZC5cbiAgICAgICAgLy8gd2UgYWxzbyBzdG9yZSB0aGUgcm91bmQgdHJpcCB0aW1lIGlmIGFueW9uZSBpcyBjdXJpb3VzXG4gICAgICAgIHRoaXMucnR0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBwb25nTXNnLnRpbWU7XG4gICAgICAgIHRoaXMuYWxpdmUgPSB0cnVlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUtlZXBhbGl2ZU1vbml0b3IuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJy4uL0V2ZW50L0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICcuLi9Mb2dnZXIvTG9nZ2VyJztcbi8qKlxuICogU2lnbmFsbGluZyBwcm90b2NvbCBmb3IgaGFuZGxpbmcgbWVzc2FnZXMgZnJvbSB0aGUgc2lnbmFsbGluZyBzZXJ2ZXIuXG4gKlxuICogTGlzdGVuIG9uIHRoaXMgZW1pdHRlciBmb3IgbWVzc2FnZXMuIE1lc3NhZ2UgdHlwZSBpcyB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gbGlzdGVuIGZvci5cbiAqIEV4YW1wbGU6XG4gKiAgICAgIHNpZ25hbGxpbmdQcm90b2NvbC5vbignY29uZmlnJywgKG1lc3NhZ2U6IE1lc3NhZ2VzLmNvbmZpZykgPVxcPiBjb25zb2xlLmxvZyhgR290IGEgY29uZmlnIG1lc3NhZ2U6ICR7bWVzc2FnZX1gKSkpO1xuICpcbiAqIFRoZSB0cmFuc3BvcnQgaW4gdGhpcyBjbGFzcyB3aWxsIGFsc28gZW1pdCBvbiBtZXNzYWdlIGV2ZW50cy5cbiAqXG4gKiBFdmVudHMgZW1pdHRlZCBvbiB0cmFuc3BvcnQ6XG4gKiAgIG1lc3NhZ2U6XG4gKiAgICAgIEVtaXR0ZWQgYW55IHRpbWUgYSBtZXNzYWdlIGlzIHJlY2VpdmVkIGJ5IHRoZSB0cmFuc3BvcnQuIExpc3RlbiBvbiB0aGlzIGlmXG4gKiAgICAgIHlvdSB3aXNoIHRvIGNhcHR1cmUgYWxsIG1lc3NhZ2VzLCByYXRoZXIgdGhhbiBzcGVjaWZpYyBtZXNzYWdlcyBvblxuICogICAgICAnbWVzc2FnZUhhbmRsZXJzJy5cbiAqXG4gKiAgIG91dDpcbiAqICAgICAgRW1pdHRlZCB3aGVuIHNlbmRpbmcgYSBtZXNzYWdlIG91dCBvbiB0aGUgdHJhbnNwb3J0LiBTaW1pbGFyIHRvICdtZXNzYWdlJyBidXRcbiAqICAgICAgb25seSBmb3Igd2hlbiBtZXNzYWdlcyBhcmUgc2VudCBmcm9tIHRoaXMgZW5kcG9pbnQuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICovXG5leHBvcnQgY2xhc3MgU2lnbmFsbGluZ1Byb3RvY29sIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICBzdGF0aWMgZ2V0IFNJR05BTExJTkdfVkVSU0lPTigpIHtcbiAgICAgICAgcmV0dXJuICcxLjMuMCc7XG4gICAgfVxuICAgIGNvbnN0cnVjdG9yKHRyYW5zcG9ydCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IHRyYW5zcG9ydDtcbiAgICAgICAgdHJhbnNwb3J0Lm9uTWVzc2FnZSA9IChtc2cpID0+IHtcbiAgICAgICAgICAgIGxldCBwYXJzZWRNZXNzYWdlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hc3NpZ25tZW50XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UobXNnKTtcbiAgICAgICAgICAgICAgICBMb2dnZXIuRGVidWcoJ1Byb3RvY29sIHJlY2VpdmVkID0+IFxcbicgKyBKU09OLnN0cmluZ2lmeShwYXJzZWREYXRhLCB1bmRlZmluZWQsIDQpKTtcbiAgICAgICAgICAgICAgICBwYXJzZWRNZXNzYWdlID0gcGFyc2VkRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoYEVycm9yIHBhcnNpbmcgbWVzc2FnZSBzdHJpbmcgJHttc2d9LlxcbiR7ZS5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBVbmtub3duIGVycm9yIHdoaWxlIHBhcnNpbmcgbWVzc2FnZSBkYXRhIGluIGhhbmRsZU9uTWVzc2FnZWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjYWxsIHRoZSBoYW5kbGVyc1xuICAgICAgICAgICAgdHJhbnNwb3J0LmVtaXQoJ21lc3NhZ2UnLCBwYXJzZWRNZXNzYWdlKTsgLy8gZW1pdCB0aGlzIGZvciBsaXN0ZW5lcnMgbGlzdGVuaW5nIHRvIGFueSBtZXNzYWdlXG4gICAgICAgICAgICBpZiAoIXRoaXMuZW1pdChwYXJzZWRNZXNzYWdlLnR5cGUsIHBhcnNlZE1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgLy8gZW1pdCB0aGlzIGZvciBsaXN0ZW5lcnMgbGlzdGVuaW5nIGZvciBzcGVjaWZpYyBtZXNzYWdlc1xuICAgICAgICAgICAgICAgIC8vIG5vIGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgndW5oYW5kbGVkJywgcGFyc2VkTWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFza3MgdGhlIHRyYW5zcG9ydCB0byBjb25uZWN0IHRvIHRoZSBnaXZlbiBVUkwuXG4gICAgICogQHBhcmFtIHVybCAtIFRoZSB1cmwgdG8gY29ubmVjdCB0by5cbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBjb25uZWN0aW9uIGNhbGwgc3VjY2VlZGVkLlxuICAgICAqL1xuICAgIGNvbm5lY3QodXJsKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5jb25uZWN0KHVybCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFza3MgdGhlIHRyYW5zcG9ydCB0byBkaXNjb25uZWN0IGZyb20gYW55IGNvbm5lY3Rpb24gaXQgbWlnaHQgaGF2ZS5cbiAgICAgKiBAcGFyYW0gY29kZSAtIEFuIG9wdGlvbmFsIGRpc2Nvbm5lY3Rpb24gY29kZS5cbiAgICAgKiBAcGFyYW0gcmVhc29uIC0gQW4gb3B0aW9uYWwgZGVzY3JpcHRpdmUgc3RyaW5nIGZvciB0aGUgZGlzY29ubmVjdCByZWFzb24uXG4gICAgICovXG4gICAgZGlzY29ubmVjdChjb2RlLCByZWFzb24pIHtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQuZGlzY29ubmVjdChjb2RlLCByZWFzb24pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRyYW5zcG9ydCBpcyBjb25uZWN0ZWQgYW5kIHJlYWR5IHRvIHNlbmQvcmVjZWl2ZSBtZXNzYWdlcy5cbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBwcm90b2NvbCBpcyBjb25uZWN0ZWQuXG4gICAgICovXG4gICAgaXNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zcG9ydC5pc0Nvbm5lY3RlZCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXNzZXMgYSBtZXNzYWdlIHRvIHRoZSB0cmFuc3BvcnQgdG8gc2VuZCB0byB0aGUgb3RoZXIgZW5kLlxuICAgICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBzZW5kLlxuICAgICAqL1xuICAgIHNlbmRNZXNzYWdlKG1zZykge1xuICAgICAgICB0aGlzLnRyYW5zcG9ydC5zZW5kTWVzc2FnZShKU09OLnN0cmluZ2lmeShtc2cpKTtcbiAgICAgICAgdGhpcy50cmFuc3BvcnQuZW1pdCgnb3V0JywgbXNnKTsgLy8gZW1pdCB0aGlzIGZvciBsaXN0ZW5lcnMgbGlzdGVuaW5nIHRvIG91dGdvaW5nIG1lc3NhZ2VzXG4gICAgICAgIExvZ2dlci5EZWJ1ZygnUHJvdG9jb2wgc2VudCA9PiBcXG4nICsgSlNPTi5zdHJpbmdpZnkobXNnLCB1bmRlZmluZWQsIDQpKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaWduYWxsaW5nUHJvdG9jb2wuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL0xvZ2dlci9Mb2dnZXInO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vRXZlbnQvRXZlbnRFbWl0dGVyJztcbi8qKlxuICogVGhlIGNvbnRyb2xsZXIgZm9yIHRoZSBXZWJTb2NrZXQgYW5kIGFsbCBhc3NvY2lhdGVkIG1ldGhvZHNcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlNvY2tldFRyYW5zcG9ydCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyBXZWJTb2NrZXRUcmFuc3BvcnQgZm9yIGJyb3dzZXIgY29udGV4dHMuXG4gICAgICogQHBhcmFtIHByb3RvY29scyAtIEFuIG9wdGlvbmFsIHN0cmluZyBvciBsaXN0IG9mIHN0cmluZ3MgdG8gcGFzcyB0byB0aGUgbmV3IHdlYnNvY2tldCBwcm90b2NvbHMgcGFyYW1cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm90b2NvbHMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5XU19PUEVOX1NUQVRFID0gMTtcbiAgICAgICAgdGhpcy5wcm90b2NvbHMgPSBwcm90b2NvbHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZSBvdmVyIHRoZSB3ZWJzb2NrZXQuXG4gICAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIHNlbmQuXG4gICAgICovXG4gICAgc2VuZE1lc3NhZ2UobXNnKSB7XG4gICAgICAgIGlmICh0aGlzLndlYlNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQuc2VuZChtc2cpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbm5lY3QgdG8gdGhlIHNpZ25hbGluZyBzZXJ2ZXJcbiAgICAgKiBAcGFyYW0gY29ubmVjdGlvblVSTCAtIFRoZSBBZGRyZXNzIG9mIHRoZSBzaWduYWxpbmcgc2VydmVyXG4gICAgICogQHJldHVybnMgSWYgdGhlcmUgaXMgYSBjb25uZWN0aW9uXG4gICAgICovXG4gICAgY29ubmVjdChjb25uZWN0aW9uVVJMKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKGNvbm5lY3Rpb25VUkwpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQgPSBuZXcgV2ViU29ja2V0KGNvbm5lY3Rpb25VUkwsIHRoaXMucHJvdG9jb2xzKTtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0Lm9ub3BlbiA9IChfKSA9PiB0aGlzLmhhbmRsZU9uT3BlbigpO1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQub25lcnJvciA9IChfKSA9PiB0aGlzLmhhbmRsZU9uRXJyb3IoKTtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0Lm9uY2xvc2UgPSAoZXZlbnQpID0+IHRoaXMuaGFuZGxlT25DbG9zZShldmVudCk7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5vbm1lc3NhZ2UgPSAoZXZlbnQpID0+IHRoaXMuaGFuZGxlT25NZXNzYWdlKGV2ZW50KTtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0Lm9ubWVzc2FnZWJpbmFyeSA9IChldmVudCkgPT4gdGhpcy5oYW5kbGVPbk1lc3NhZ2VCaW5hcnkoZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBMb2dnZXIuRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERpc2Nvbm5lY3QgdGhpcyB0cmFuc3BvcnQuXG4gICAgICogQHBhcmFtIGNvZGUgLSBBbiBvcHRpb25hbCBkaXNjb25uZWN0IGNvZGUuXG4gICAgICogQHBhcmFtIHJlYXNvbiAtIEEgZGVzY3JpcHRpdmUgc3RyaW5nIGZvciB0aGUgZGlzY29ubmVjdCByZWFzb24uXG4gICAgICovXG4gICAgZGlzY29ubmVjdChjb2RlLCByZWFzb24pIHtcbiAgICAgICAgaWYgKHRoaXMud2ViU29ja2V0KSB7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5jbG9zZShjb2RlLCByZWFzb24pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3VsZCByZXR1cm4gdHJ1ZSB3aGVuIHRoZSB0cmFuc3BvcnQgaXMgY29ubmVjdGVkIGFuZCByZWFkeSB0byBzZW5kL3JlY2VpdmUgbWVzc2FnZXMuXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdHJhbnNwb3J0IGlzIGNvbm5lY3RlZC5cbiAgICAgKi9cbiAgICBpc0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy53ZWJTb2NrZXQgJiYgdGhpcy53ZWJTb2NrZXQucmVhZHlTdGF0ZSAhPSBXZWJTb2NrZXQuQ0xPU0VEO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoYXQgaGFwcGVucyB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZCBpbiBiaW5hcnkgZm9ybVxuICAgICAqIEBwYXJhbSBldmVudCAtIE1lc3NhZ2UgUmVjZWl2ZWRcbiAgICAgKi9cbiAgICBoYW5kbGVPbk1lc3NhZ2VCaW5hcnkoZXZlbnQpIHtcbiAgICAgICAgLy8gaWYgdGhlIGV2ZW50IGlzIGVtcHR5IHJldHVyblxuICAgICAgICBpZiAoIWV2ZW50IHx8ICFldmVudC5kYXRhKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gaGFuZGxlIHRoZSBiaW5hcnkgYW5kIHRoZW4gaGFuZGxlIHRoZSBtZXNzYWdlXG4gICAgICAgIGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC50ZXh0KClcbiAgICAgICAgICAgIC50aGVuKChtZXNzYWdlU3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAvLyBidWlsZCBhIG5ldyBtZXNzYWdlXG4gICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RlZE1lc3NhZ2UgPSBuZXcgTWVzc2FnZUV2ZW50KCdtZXNzYWdlRnJvbUJpbmFyeScsIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBtZXNzYWdlU3RyaW5nXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIHNlbmQgdGhlIG5ldyBzdHJpbmdpZmllZCBldmVudCBiYWNrIGludG8gYG9ubWVzc2FnZWBcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlT25NZXNzYWdlKGNvbnN0cnVjdGVkTWVzc2FnZSk7XG4gICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBMb2dnZXIuRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBiaW5hcnkgYmxvYiBmcm9tIHdlYnNvY2tldCwgcmVhc29uOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoYXQgaGFwcGVucyB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZFxuICAgICAqIEBwYXJhbSBldmVudCAtIE1lc3NhZ2UgUmVjZWl2ZWRcbiAgICAgKi9cbiAgICBoYW5kbGVPbk1lc3NhZ2UoZXZlbnQpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2Vic29ja2V0IG1lc3NhZ2UgaXMgYmluYXJ5LCBpZiBzbywgc3RyaW5naWZ5IGl0LlxuICAgICAgICBpZiAoZXZlbnQuZGF0YSAmJiBldmVudC5kYXRhIGluc3RhbmNlb2YgQmxvYikge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVPbk1lc3NhZ2VCaW5hcnkoZXZlbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm9uTWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5vbk1lc3NhZ2UoZXZlbnQuZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZSBXZWJzb2NrZXQgaXMgb3BlbmVkXG4gICAgICovXG4gICAgaGFuZGxlT25PcGVuKCkge1xuICAgICAgICBMb2dnZXIuSW5mbygnQ29ubmVjdGVkIHRvIHRoZSBzaWduYWxsaW5nIHNlcnZlciB2aWEgV2ViU29ja2V0Jyk7XG4gICAgICAgIHRoaXMuZW1pdCgnb3BlbicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3Igb24gdGhlIHdlYnNvY2tldFxuICAgICAqL1xuICAgIGhhbmRsZU9uRXJyb3IoKSB7XG4gICAgICAgIC8vTG9nZ2VyLkVycm9yKExvZ2dlci5HZXRTdGFja1RyYWNlKCksICdXZWJTb2NrZXQgZXJyb3InKTtcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gdGhlIFdlYnNvY2tldCBpcyBjbG9zZWRcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBDbG9zZSBFdmVudFxuICAgICAqL1xuICAgIGhhbmRsZU9uQ2xvc2UoZXZlbnQpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0Rpc2Nvbm5lY3RlZCB0byB0aGUgc2lnbmFsbGluZyBzZXJ2ZXIgdmlhIFdlYlNvY2tldDogJyArXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShldmVudC5jb2RlKSArXG4gICAgICAgICAgICAnIC0gJyArXG4gICAgICAgICAgICBldmVudC5yZWFzb24pO1xuICAgICAgICB0aGlzLmVtaXQoJ2Nsb3NlJywgZXZlbnQpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdlYlNvY2tldFRyYW5zcG9ydC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi4vRXZlbnQvRXZlbnRFbWl0dGVyJztcbmltcG9ydCBXZWJTb2NrZXQgZnJvbSAnd3MnO1xuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBXZWJTb2NrZXRUcmFuc3BvcnQgZnJvbSBwaXhlbHN0cmVhbWluZ2NvbW1vbiB0aGF0IHN1cHBvcnRzIG5vZGUuanMgd2Vic29ja2V0c1xuICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgc2xpZ2h0IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlICd3cycgbm9kZS5qcyBwYWNrYWdlIGFuZCB0aGUgd2Vic29ja2V0c1xuICogc3VwcG9ydGVkIGluIHRoZSBicm93c2Vycy5cbiAqIERvIG5vdCB1c2UgdGhpcyBjb2RlIGluIGEgYnJvd3NlciB1c2UgJ1dlYlNvY2tldFRyYW5zcG9ydCcgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlNvY2tldFRyYW5zcG9ydE5KUyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoYXJndW1lbnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5XU19PUEVOX1NUQVRFID0gMTtcbiAgICAgICAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgV2ViU29ja2V0KSB7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldCA9IGFyZ3VtZW50O1xuICAgICAgICAgICAgdGhpcy5zZXR1cFNvY2tldEhhbmRsZXJzKCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ29wZW4nKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhcmd1bWVudCkge1xuICAgICAgICAgICAgdGhpcy5wcm90b2NvbHMgPSBhcmd1bWVudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyBhIG1lc3NhZ2Ugb3ZlciB0aGUgd2Vic29ja2V0LlxuICAgICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBzZW5kLlxuICAgICAqL1xuICAgIHNlbmRNZXNzYWdlKG1zZykge1xuICAgICAgICBpZiAodGhpcy53ZWJTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0LnNlbmQobXNnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25uZWN0IHRvIHRoZSBzaWduYWxpbmcgc2VydmVyXG4gICAgICogQHBhcmFtIGNvbm5lY3Rpb25VUkwgLSBUaGUgQWRkcmVzcyBvZiB0aGUgc2lnbmFsaW5nIHNlcnZlclxuICAgICAqIEBwYXJhbSBwcm90b2NvbHMgLSBBbiBvcHRpb25hbCBzdHJpbmcgb3IgbGlzdCBvZiBzdHJpbmdzIHRvIHBhc3MgdG8gdGhlIG5ldyB3ZWJzb2NrZXQgcHJvdG9jb2xzIHBhcmFtXG4gICAgICogQHJldHVybnMgSWYgdGhlcmUgaXMgYSBjb25uZWN0aW9uXG4gICAgICovXG4gICAgY29ubmVjdChjb25uZWN0aW9uVVJMKSB7XG4gICAgICAgIHRoaXMud2ViU29ja2V0ID0gbmV3IFdlYlNvY2tldChjb25uZWN0aW9uVVJMLCB0aGlzLnByb3RvY29scyk7XG4gICAgICAgIHRoaXMuc2V0dXBTb2NrZXRIYW5kbGVycygpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdCB0aGlzIHRyYW5zcG9ydC5cbiAgICAgKiBAcGFyYW0gY29kZSAtIEFuIG9wdGlvbmFsIGRpc2Nvbm5lY3QgY29kZS5cbiAgICAgKiBAcGFyYW0gcmVhc29uIC0gQSBkZXNjcmlwdGl2ZSBzdHJpbmcgZm9yIHRoZSBkaXNjb25uZWN0IHJlYXNvbi5cbiAgICAgKi9cbiAgICBkaXNjb25uZWN0KGNvZGUsIHJlYXNvbikge1xuICAgICAgICBpZiAodGhpcy53ZWJTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0LmNsb3NlKGNvZGUsIHJlYXNvbik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvdWxkIHJldHVybiB0cnVlIHdoZW4gdGhlIHRyYW5zcG9ydCBpcyBjb25uZWN0ZWQgYW5kIHJlYWR5IHRvIHNlbmQvcmVjZWl2ZSBtZXNzYWdlcy5cbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB0cmFuc3BvcnQgaXMgY29ubmVjdGVkLlxuICAgICAqL1xuICAgIGlzQ29ubmVjdGVkKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLndlYlNvY2tldCAmJiB0aGlzLndlYlNvY2tldC5yZWFkeVN0YXRlICE9IFdlYlNvY2tldC5DTE9TRUQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hhdCBoYXBwZW5zIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkXG4gICAgICogQHBhcmFtIGV2ZW50IC0gTWVzc2FnZSBSZWNlaXZlZFxuICAgICAqL1xuICAgIGhhbmRsZU9uTWVzc2FnZShldmVudCkge1xuICAgICAgICBpZiAodGhpcy5vbk1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMub25NZXNzYWdlKGV2ZW50LmRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiB0aGUgV2Vic29ja2V0IGlzIG9wZW5lZFxuICAgICAqIEBwYXJhbSBldmVudCAtIE5vdCBVc2VkXG4gICAgICovXG4gICAgaGFuZGxlT25PcGVuKGV2ZW50KSB7XG4gICAgICAgIHRoaXMuZW1pdCgnb3BlbicsIGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIG9uIHRoZSB3ZWJzb2NrZXRcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBFcnJvciBQYXlsb2FkXG4gICAgICovXG4gICAgaGFuZGxlT25FcnJvcihldmVudCkge1xuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXZlbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gdGhlIFdlYnNvY2tldCBpcyBjbG9zZWRcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBDbG9zZSBFdmVudFxuICAgICAqL1xuICAgIGhhbmRsZU9uQ2xvc2UoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdjbG9zZScsIGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBXZWJzb2NrZXQgY29ubmVjdGlvblxuICAgICAqL1xuICAgIGNsb3NlKCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMud2ViU29ja2V0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2xvc2UoKTtcbiAgICB9XG4gICAgc2V0dXBTb2NrZXRIYW5kbGVycygpIHtcbiAgICAgICAgaWYgKHRoaXMud2ViU29ja2V0KSB7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdvcGVuJywgdGhpcy5oYW5kbGVPbk9wZW4uYmluZCh0aGlzKSk7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIHRoaXMuaGFuZGxlT25FcnJvci5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhpcy5oYW5kbGVPbkNsb3NlLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRoaXMuaGFuZGxlT25NZXNzYWdlLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViU29ja2V0VHJhbnNwb3J0TkpTLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5leHBvcnQgY2xhc3MgU0RQVXRpbHMge1xuICAgIHN0YXRpYyBhZGRWaWRlb0hlYWRlckV4dGVuc2lvblRvU2RwKHNkcCwgdXJpKSB7XG4gICAgICAgIC8vIEZpbmQgdGhlIGhpZ2hlc3QgdXNlZCBoZWFkZXIgZXh0ZW5zaW9uIGlkIGJ5IHNvcnRpbmcgdGhlIGV4dGVuc2lvbiBpZHMgdXNlZCxcbiAgICAgICAgLy8gZWxpbWluYXRpbmcgZHVwbGljYXRlcyBhbmQgYWRkaW5nIG9uZS5cbiAgICAgICAgLy8gVG9kbzogVXBkYXRlIHRoaXMgd2hlbiBXZWJSVEMgaW4gQ2hyb21lIHN1cHBvcnRzIHRoZSBoZWFkZXIgZXh0ZW5zaW9uIEFQSS5cbiAgICAgICAgY29uc3QgdXNlZElkcyA9IHNkcFxuICAgICAgICAgICAgLnNwbGl0KCdcXG4nKVxuICAgICAgICAgICAgLmZpbHRlcigobGluZSkgPT4gbGluZS5zdGFydHNXaXRoKCdhPWV4dG1hcDonKSlcbiAgICAgICAgICAgIC5tYXAoKGxpbmUpID0+IHBhcnNlSW50KGxpbmUuc3BsaXQoJyAnKVswXS5zdWJzdHJpbmcoOSksIDEwKSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhIC0gYilcbiAgICAgICAgICAgIC5maWx0ZXIoKGl0ZW0sIGluZGV4LCBhcnJheSkgPT4gYXJyYXkuaW5kZXhPZihpdGVtKSA9PT0gaW5kZXgpO1xuICAgICAgICBjb25zdCBuZXh0SWQgPSB1c2VkSWRzW3VzZWRJZHMubGVuZ3RoIC0gMV0gKyAxO1xuICAgICAgICBjb25zdCBleHRtYXBMaW5lID0gJ2E9ZXh0bWFwOicgKyBuZXh0SWQgKyAnICcgKyB1cmkgKyAnXFxyXFxuJztcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBzZHAuc3BsaXQoJ1xcbm09JykubWFwKChwYXJ0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChpbmRleCA+IDAgPyAnbT0nICsgcGFydCA6IHBhcnQpLnRyaW0oKSArICdcXHJcXG4nO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc2Vzc2lvblBhcnQgPSBzZWN0aW9ucy5zaGlmdCgpO1xuICAgICAgICAvLyBPbmx5IGFkZCBleHRlbnNpb24gdG8gbT12aWRlbyBtZWRpYSBzZWN0aW9uXG4gICAgICAgIHJldHVybiAoc2Vzc2lvblBhcnQgK1xuICAgICAgICAgICAgc2VjdGlvbnNcbiAgICAgICAgICAgICAgICAubWFwKChtZWRpYVNlY3Rpb24pID0+IG1lZGlhU2VjdGlvbi5zdGFydHNXaXRoKCdtPXZpZGVvJykgPyBtZWRpYVNlY3Rpb24gKyBleHRtYXBMaW5lIDogbWVkaWFTZWN0aW9uKVxuICAgICAgICAgICAgICAgIC5qb2luKCcnKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2RwVXRpbHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmV4cG9ydCB7IExvZ2dlciwgTG9nTGV2ZWwsIG92ZXJyaWRlTG9nZ2VyIH0gZnJvbSAnLi9Mb2dnZXIvTG9nZ2VyJztcbmV4cG9ydCB7IFdlYlNvY2tldFRyYW5zcG9ydCB9IGZyb20gJy4vVHJhbnNwb3J0L1dlYlNvY2tldFRyYW5zcG9ydCc7XG5leHBvcnQgeyBXZWJTb2NrZXRUcmFuc3BvcnROSlMgfSBmcm9tICcuL1RyYW5zcG9ydC9XZWJTb2NrZXRUcmFuc3BvcnROSlMnO1xuZXhwb3J0IHsgU2lnbmFsbGluZ1Byb3RvY29sIH0gZnJvbSAnLi9Qcm90b2NvbC9TaWduYWxsaW5nUHJvdG9jb2wnO1xuZXhwb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi9FdmVudC9FdmVudEVtaXR0ZXInO1xuZXhwb3J0IHsgTWVzc2FnZVJlZ2lzdHJ5IH0gZnJvbSAnLi9NZXNzYWdlcy9tZXNzYWdlX3JlZ2lzdHJ5JztcbmltcG9ydCAqIGFzIE1lc3NhZ2VzXzEgZnJvbSAnLi9NZXNzYWdlcy9zaWduYWxsaW5nX21lc3NhZ2VzJztcbmV4cG9ydCB7IE1lc3NhZ2VzXzEgYXMgTWVzc2FnZXMgfTtcbmltcG9ydCAqIGFzIE1lc3NhZ2VIZWxwZXJzXzEgZnJvbSAnLi9NZXNzYWdlcy9tZXNzYWdlX2hlbHBlcnMnO1xuZXhwb3J0IHsgTWVzc2FnZUhlbHBlcnNfMSBhcyBNZXNzYWdlSGVscGVycyB9O1xuZXhwb3J0IHsgS2VlcGFsaXZlTW9uaXRvciB9IGZyb20gJy4vUHJvdG9jb2wvS2VlcGFsaXZlTW9uaXRvcic7XG5leHBvcnQgKiBmcm9tICcuL1V0aWwvU2RwVXRpbHMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGl4ZWxzdHJlYW1pbmdjb21tb24uanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IEZsYWdzLCBOdW1lcmljUGFyYW1ldGVycyB9IGZyb20gJy4uL0NvbmZpZy9Db25maWcnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuaW1wb3J0IHsgQWZrVGltZWRPdXRFdmVudCwgQWZrV2FybmluZ0FjdGl2YXRlRXZlbnQsIEFma1dhcm5pbmdEZWFjdGl2YXRlRXZlbnQsIEFma1dhcm5pbmdVcGRhdGVFdmVudCB9IGZyb20gJy4uL1V0aWwvRXZlbnRFbWl0dGVyJztcbmV4cG9ydCBjbGFzcyBBRktDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihjb25maWcsIHBpeGVsU3RyZWFtaW5nLCBvbkRpc21pc3NBZmspIHtcbiAgICAgICAgLy8gdGltZSBvdXQgbG9naWMgZGV0YWlsc1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvdW50ZG93bkFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLndhcm5UaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jb3VudERvd24gPSAwO1xuICAgICAgICB0aGlzLmNvdW50RG93blRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZyA9IHBpeGVsU3RyZWFtaW5nO1xuICAgICAgICB0aGlzLm9uRGlzbWlzc0FmayA9IG9uRGlzbWlzc0FmaztcbiAgICAgICAgdGhpcy5vbkFGS1RpbWVkT3V0Q2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQUZLIHRpbWVkIG91dCwgZGlkIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoaXMgY2FsbGJhY2s/Jyk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBtZXRob2RzIHRoYXQgb2NjdXIgd2hlbiBhbiBhZmsgZXZlbnQgbGlzdGVuZXIgaXMgY2xpY2tlZFxuICAgICAqL1xuICAgIG9uQWZrQ2xpY2soKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jb3VudERvd25UaW1lcik7XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZSB8fCB0aGlzLmNvdW50ZG93bkFjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5zdGFydEFma1dhcm5pbmdUaW1lcigpO1xuICAgICAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5kaXNwYXRjaEV2ZW50KG5ldyBBZmtXYXJuaW5nRGVhY3RpdmF0ZUV2ZW50KCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0YXJ0IHRoZSB3YXJuaW5nIHRpbWVyIGlmIGEgdGltZW91dCBpcyBzZXQgZ3JlYXRlciB0aGF0IDAgc2Vjb25kc1xuICAgICAqL1xuICAgIHN0YXJ0QWZrV2FybmluZ1RpbWVyKCkge1xuICAgICAgICBpZiAodGhpcy5jb25maWcuZ2V0TnVtZXJpY1NldHRpbmdWYWx1ZShOdW1lcmljUGFyYW1ldGVycy5BRktUaW1lb3V0U2VjcykgPiAwICYmXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkFGS0RldGVjdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldEFma1dhcm5pbmdUaW1lcigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9wIHRoZSBhZmsgd2FybmluZyB0aW1lclxuICAgICAqL1xuICAgIHN0b3BBZmtXYXJuaW5nVGltZXIoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY291bnRkb3duQWN0aXZlID0gZmFsc2U7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLndhcm5UaW1lcik7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jb3VudERvd25UaW1lcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBhdXNlIHRoZSB0aW1lciB3aGljaCB3aGVuIGVsYXBzZWQgd2lsbCB3YXJuIHRoZSB1c2VyIHRoZXkgYXJlIGluYWN0aXZlLlxuICAgICAqL1xuICAgIHBhdXNlQWZrV2FybmluZ1RpbWVyKCkge1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB0aGUgdXNlciBpbnRlcmFjdHMgdGhlbiByZXNldCB0aGUgd2FybmluZyB0aW1lci5cbiAgICAgKi9cbiAgICByZXNldEFma1dhcm5pbmdUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlICYmIHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuQUZLRGV0ZWN0aW9uKSkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMud2FyblRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMud2FyblRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmFjdGl2YXRlQWZrRXZlbnQoKSwgdGhpcy5jb25maWcuZ2V0TnVtZXJpY1NldHRpbmdWYWx1ZShOdW1lcmljUGFyYW1ldGVycy5BRktUaW1lb3V0U2VjcykgKiAxMDAwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93IHRoZSBBRksgb3ZlcmxheSBhbmQgYmVnaW4gdGhlIGNvdW50RG93blxuICAgICAqL1xuICAgIGFjdGl2YXRlQWZrRXZlbnQoKSB7XG4gICAgICAgIC8vIFBhdXNlIHRoZSB0aW1lciB3aGlsZSB0aGUgdXNlciBpcyBsb29raW5nIGF0IHRoZSBpbmFjdGl2aXR5IHdhcm5pbmcgb3ZlcmxheVxuICAgICAgICB0aGlzLnBhdXNlQWZrV2FybmluZ1RpbWVyKCk7XG4gICAgICAgIC8vIGluc3RhbnRpYXRlIGEgbmV3IG92ZXJsYXlcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5kaXNwYXRjaEV2ZW50KG5ldyBBZmtXYXJuaW5nQWN0aXZhdGVFdmVudCh7XG4gICAgICAgICAgICBjb3VudERvd246IHRoaXMuY291bnREb3duLFxuICAgICAgICAgICAgZGlzbWlzc0FmazogdGhpcy5vbkRpc21pc3NBZmtcbiAgICAgICAgfSkpO1xuICAgICAgICAvLyB1cGRhdGUgb3VyIGNvdW50RG93biB0aW1lciBhbmQgb3ZlcmxheSBjb250ZW50c1xuICAgICAgICB0aGlzLmNvdW50RG93biA9IHRoaXMuY29uZmlnLmdldE51bWVyaWNTZXR0aW5nVmFsdWUoTnVtZXJpY1BhcmFtZXRlcnMuQUZLQ291bnRkb3duU2Vjcyk7XG4gICAgICAgIHRoaXMuY291bnRkb3duQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5kaXNwYXRjaEV2ZW50KG5ldyBBZmtXYXJuaW5nVXBkYXRlRXZlbnQoeyBjb3VudERvd246IHRoaXMuY291bnREb3duIH0pKTtcbiAgICAgICAgLy8gaWYgd2UgYXJlIGluIGxvY2tlZCBtb3VzZSBleGl0IHBvaW50ZXJsb2NrXG4gICAgICAgIGlmICghdGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Ib3ZlcmluZ01vdXNlTW9kZSkpIHtcbiAgICAgICAgICAgIC8vIG1pbm9yIGhhY2sgdG8gYWxsZXZpYXRlIGlvcyBub3Qgc3VwcG9ydGluZyBwb2ludGVybG9ja1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmV4aXRQb2ludGVyTG9jaykge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmV4aXRQb2ludGVyTG9jaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHJlc2V0IG91ciBjb3VudERvd24gaW50ZXJ2YWwgYWNjb3JkaW5nbHlcbiAgICAgICAgdGhpcy5jb3VudERvd25UaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY291bnREb3duLS07XG4gICAgICAgICAgICBpZiAodGhpcy5jb3VudERvd24gPT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSB1c2VyIGZhaWxlZCB0byBjbGljayBzbyBoaWRlIHRoZSBvdmVybGF5IGFuZCBkaXNjb25uZWN0IHRoZW0uXG4gICAgICAgICAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5kaXNwYXRjaEV2ZW50KG5ldyBBZmtUaW1lZE91dEV2ZW50KCkpO1xuICAgICAgICAgICAgICAgIHRoaXMub25BRktUaW1lZE91dENhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ1lvdSBoYXZlIGJlZW4gZGlzY29ubmVjdGVkIGR1ZSB0byBpbmFjdGl2aXR5Jyk7XG4gICAgICAgICAgICAgICAgLy8gc3dpdGNoIG9mZiB0aGUgYWZrIGZlYXR1cmUgYXMgc3RyZWFtIGhhcyBjbG9zZWRcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3BBZmtXYXJuaW5nVGltZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgQWZrV2FybmluZ1VwZGF0ZUV2ZW50KHsgY291bnREb3duOiB0aGlzLmNvdW50RG93biB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMDApO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFGS0NvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IFNldHRpbmdGbGFnIH0gZnJvbSAnLi9TZXR0aW5nRmxhZyc7XG5pbXBvcnQgeyBTZXR0aW5nTnVtYmVyIH0gZnJvbSAnLi9TZXR0aW5nTnVtYmVyJztcbmltcG9ydCB7IFNldHRpbmdUZXh0IH0gZnJvbSAnLi9TZXR0aW5nVGV4dCc7XG5pbXBvcnQgeyBTZXR0aW5nT3B0aW9uIH0gZnJvbSAnLi9TZXR0aW5nT3B0aW9uJztcbmltcG9ydCB7IFNldHRpbmdzQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vVXRpbC9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgQnJvd3NlclV0aWxzIH0gZnJvbSAnLi4vVXRpbC9Ccm93c2VyVXRpbHMnO1xuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgZmxhZ3MgdGhhdCBjYW4gYmUgdG9nZ2xlZCBhbmQgYXJlIGNvcmUgdG8gYWxsIFBpeGVsIFN0cmVhbWluZyBleHBlcmllbmNlcy5cbiAqIFRoZXNlIGFyZSB1c2VkIGluIHRoZSBgQ29uZmlnLkZsYWdzYCBtYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBGbGFncyB7XG59XG5GbGFncy5BdXRvQ29ubmVjdCA9ICdBdXRvQ29ubmVjdCc7XG5GbGFncy5BdXRvUGxheVZpZGVvID0gJ0F1dG9QbGF5VmlkZW8nO1xuRmxhZ3MuQUZLRGV0ZWN0aW9uID0gJ1RpbWVvdXRJZklkbGUnO1xuRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUgPSAnSG92ZXJpbmdNb3VzZSc7XG5GbGFncy5Gb3JjZU1vbm9BdWRpbyA9ICdGb3JjZU1vbm9BdWRpbyc7XG5GbGFncy5Gb3JjZVRVUk4gPSAnRm9yY2VUVVJOJztcbkZsYWdzLkZha2VNb3VzZVdpdGhUb3VjaGVzID0gJ0Zha2VNb3VzZVdpdGhUb3VjaGVzJztcbkZsYWdzLklzUXVhbGl0eUNvbnRyb2xsZXIgPSAnQ29udHJvbHNRdWFsaXR5JztcbkZsYWdzLk1hdGNoVmlld3BvcnRSZXNvbHV0aW9uID0gJ01hdGNoVmlld3BvcnRSZXMnO1xuRmxhZ3MuU3RhcnRWaWRlb011dGVkID0gJ1N0YXJ0VmlkZW9NdXRlZCc7XG5GbGFncy5TdXBwcmVzc0Jyb3dzZXJLZXlzID0gJ1N1cHByZXNzQnJvd3NlcktleXMnO1xuRmxhZ3MuVXNlTWljID0gJ1VzZU1pYyc7XG5GbGFncy5Vc2VNb2RhbEZvclRleHRJbnB1dCA9ICdVc2VNb2RhbEZvclRleHRJbnB1dCc7XG5GbGFncy5Vc2VDYW1lcmEgPSAnVXNlQ2FtZXJhJztcbkZsYWdzLktleWJvYXJkSW5wdXQgPSAnS2V5Ym9hcmRJbnB1dCc7XG5GbGFncy5Nb3VzZUlucHV0ID0gJ01vdXNlSW5wdXQnO1xuRmxhZ3MuVG91Y2hJbnB1dCA9ICdUb3VjaElucHV0JztcbkZsYWdzLkdhbWVwYWRJbnB1dCA9ICdHYW1lcGFkSW5wdXQnO1xuRmxhZ3MuWFJDb250cm9sbGVySW5wdXQgPSAnWFJDb250cm9sbGVySW5wdXQnO1xuRmxhZ3MuV2FpdEZvclN0cmVhbWVyID0gJ1dhaXRGb3JTdHJlYW1lcic7XG5GbGFncy5IaWRlVUkgPSAnSGlkZVVJJztcbkZsYWdzLkVuYWJsZUNhcHR1cmVUaW1lRXh0ID0gJ0VuYWJsZUNhcHR1cmVUaW1lRXh0JztcbmV4cG9ydCBjb25zdCBpc0ZsYWdJZCA9IChpZCkgPT4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoRmxhZ3MpLnNvbWUoKG5hbWUpID0+IEZsYWdzW25hbWVdID09PSBpZCk7XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBudW1lcmljIHBhcmFtZXRlcnMgdGhhdCBhcmUgY29yZSB0byBhbGwgUGl4ZWwgU3RyZWFtaW5nIGV4cGVyaWVuY2VzLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIE51bWVyaWNQYXJhbWV0ZXJzIHtcbn1cbk51bWVyaWNQYXJhbWV0ZXJzLkFGS1RpbWVvdXRTZWNzID0gJ0FGS1RpbWVvdXQnO1xuTnVtZXJpY1BhcmFtZXRlcnMuQUZLQ291bnRkb3duU2VjcyA9ICdBRktDb3VudGRvd24nO1xuTnVtZXJpY1BhcmFtZXRlcnMuTWluUVAgPSAnTWluUVAnO1xuTnVtZXJpY1BhcmFtZXRlcnMuTWF4UVAgPSAnTWF4UVAnO1xuTnVtZXJpY1BhcmFtZXRlcnMuTWluUXVhbGl0eSA9ICdNaW5RdWFsaXR5Jztcbk51bWVyaWNQYXJhbWV0ZXJzLk1heFF1YWxpdHkgPSAnTWF4UXVhbGl0eSc7XG5OdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWluID0gJ0NvbXBhdFF1YWxpdHlNaW4nO1xuTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heCA9ICdDb21wYXRRdWFsaXR5TWF4Jztcbk51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ0ZQUyA9ICdXZWJSVENGUFMnO1xuTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSA9ICdXZWJSVENNaW5CaXRyYXRlJztcbk51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUgPSAnV2ViUlRDTWF4Qml0cmF0ZSc7XG5OdW1lcmljUGFyYW1ldGVycy5NYXhSZWNvbm5lY3RBdHRlbXB0cyA9ICdNYXhSZWNvbm5lY3RBdHRlbXB0cyc7XG5OdW1lcmljUGFyYW1ldGVycy5TdHJlYW1lckF1dG9Kb2luSW50ZXJ2YWwgPSAnU3RyZWFtZXJBdXRvSm9pbkludGVydmFsJztcbk51bWVyaWNQYXJhbWV0ZXJzLktlZXBhbGl2ZURlbGF5ID0gJ0tlZXBhbGl2ZURlbGF5JztcbmV4cG9ydCBjb25zdCBpc051bWVyaWNJZCA9IChpZCkgPT4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTnVtZXJpY1BhcmFtZXRlcnMpLnNvbWUoKG5hbWUpID0+IE51bWVyaWNQYXJhbWV0ZXJzW25hbWVdID09PSBpZCk7XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiB0ZXh0dWFsIHBhcmFtZXRlcnMgdGhhdCBhcmUgY29yZSB0byBhbGwgUGl4ZWwgU3RyZWFtaW5nIGV4cGVyaWVuY2VzLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFRleHRQYXJhbWV0ZXJzIHtcbn1cblRleHRQYXJhbWV0ZXJzLlNpZ25hbGxpbmdTZXJ2ZXJVcmwgPSAnc3MnO1xuZXhwb3J0IGNvbnN0IGlzVGV4dElkID0gKGlkKSA9PiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhUZXh0UGFyYW1ldGVycykuc29tZSgobmFtZSkgPT4gVGV4dFBhcmFtZXRlcnNbbmFtZV0gPT09IGlkKTtcbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGVudW0gYmFzZWQgcGFyYW1ldGVycyB0aGF0IGFyZSBjb3JlIHRvIGFsbCBQaXhlbCBTdHJlYW1pbmcgZXhwZXJpZW5jZXMuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgT3B0aW9uUGFyYW1ldGVycyB7XG59XG5PcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjID0gJ1ByZWZlcnJlZENvZGVjJztcbk9wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZCA9ICdTdHJlYW1lcklkJztcbk9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSA9ICdQcmVmZXJyZWRRdWFsaXR5JztcbmV4cG9ydCBjb25zdCBpc09wdGlvbklkID0gKGlkKSA9PiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPcHRpb25QYXJhbWV0ZXJzKS5zb21lKChuYW1lKSA9PiBPcHRpb25QYXJhbWV0ZXJzW25hbWVdID09PSBpZCk7XG5leHBvcnQgY2xhc3MgQ29uZmlnIHtcbiAgICAvLyAtLS0tLS0tLS0tLS0gU2V0dGluZ3MgLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBjb25zdHJ1Y3Rvcihjb25maWcgPSB7fSkge1xuICAgICAgICAvKiBBIG1hcCBvZiBmbGFncyB0aGF0IGNhbiBiZSB0b2dnbGVkIC0gb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgaW4gdGhlIGFwcGxpY2F0aW9uIC0gZS5nLiBVc2UgTWljPyAqL1xuICAgICAgICB0aGlzLmZsYWdzID0gbmV3IE1hcCgpO1xuICAgICAgICAvKiBBIG1hcCBvZiBudW1lcmljYWwgc2V0dGluZ3MgLSBvcHRpb25zIHRoYXQgY2FuIGJlIGluIHRoZSBhcHBsaWNhdGlvbiAtIGUuZy4gTWluQml0cmF0ZSAqL1xuICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICAvKiBBIG1hcCBvZiB0ZXh0IHNldHRpbmdzIC0gZS5nLiBzaWduYWxsaW5nIHNlcnZlciB1cmwgKi9cbiAgICAgICAgdGhpcy50ZXh0UGFyYW1ldGVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgLyogQSBtYXAgb2YgZW51bSBiYXNlZCBzZXR0aW5ncyAtIGUuZy4gcHJlZmVycmVkIGNvZGVjICovXG4gICAgICAgIHRoaXMub3B0aW9uUGFyYW1ldGVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgY29uc3QgeyBpbml0aWFsU2V0dGluZ3MsIHVzZVVybFBhcmFtcywgd2ViU29ja2V0UHJvdG9jb2xzIH0gPSBjb25maWc7XG4gICAgICAgIHRoaXMuX3VzZVVybFBhcmFtcyA9ICEhdXNlVXJsUGFyYW1zO1xuICAgICAgICB0aGlzLl93ZWJTb2NrZXRQcm90b2NvbHMgPSB3ZWJTb2NrZXRQcm90b2NvbHM7XG4gICAgICAgIHRoaXMucG9wdWxhdGVEZWZhdWx0U2V0dGluZ3ModGhpcy5fdXNlVXJsUGFyYW1zLCBpbml0aWFsU2V0dGluZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUcnVlIGlmIHJlYWRpbmcgY29uZmlndXJhdGlvbiBpbml0aWFsIHZhbHVlcyBmcm9tIFVSTCBwYXJhbWV0ZXJzLCBhbmRcbiAgICAgKiBwZXJzaXN0aW5nIGNoYW5nZXMgaW4gVVJMIHdoZW4gY2hhbmdlZC5cbiAgICAgKi9cbiAgICBnZXQgdXNlVXJsUGFyYW1zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXNlVXJsUGFyYW1zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgcHJvdG9jb2wgb3IgbGlzdCBvZiBwcm90b2NvbHMgdG8gcGFzcyB0byB0aGUgd2Vic29ja2V0IGlmIHNldC5cbiAgICAgKi9cbiAgICBnZXQgd2ViU29ja2V0UHJvdG9jb2xzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2ViU29ja2V0UHJvdG9jb2xzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQb3B1bGF0ZSB0aGUgZGVmYXVsdCBzZXR0aW5ncyBmb3IgYSBQaXhlbCBTdHJlYW1pbmcgYXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBwb3B1bGF0ZURlZmF1bHRTZXR0aW5ncyh1c2VVcmxQYXJhbXMsIHNldHRpbmdzKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUZXh0IFBhcmFtZXRlcnNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudGV4dFBhcmFtZXRlcnMuc2V0KFRleHRQYXJhbWV0ZXJzLlNpZ25hbGxpbmdTZXJ2ZXJVcmwsIG5ldyBTZXR0aW5nVGV4dChUZXh0UGFyYW1ldGVycy5TaWduYWxsaW5nU2VydmVyVXJsLCAnU2lnbmFsbGluZyB1cmwnLCAnVXJsIG9mIHRoZSBzaWduYWxsaW5nIHNlcnZlcicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgVGV4dFBhcmFtZXRlcnMuU2lnbmFsbGluZ1NlcnZlclVybClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbVGV4dFBhcmFtZXRlcnMuU2lnbmFsbGluZ1NlcnZlclVybF1cbiAgICAgICAgICAgIDogKGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3M6Ly8nIDogJ3dzOi8vJykgK1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSArXG4gICAgICAgICAgICAgICAgLy8gZm9yIHJlYWRhYmlsaXR5LCB3ZSBvbWl0IHRoZSBwb3J0IGlmIGl0J3MgODBcbiAgICAgICAgICAgICAgICAod2luZG93LmxvY2F0aW9uLnBvcnQgPT09ICc4MCcgfHwgd2luZG93LmxvY2F0aW9uLnBvcnQgPT09ICcnXG4gICAgICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICAgICAgOiBgOiR7d2luZG93LmxvY2F0aW9uLnBvcnR9YCksIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLm9wdGlvblBhcmFtZXRlcnMuc2V0KE9wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZCwgbmV3IFNldHRpbmdPcHRpb24oT3B0aW9uUGFyYW1ldGVycy5TdHJlYW1lcklkLCAnU3RyZWFtZXIgSUQnLCAnVGhlIElEIG9mIHRoZSBzdHJlYW1lciB0byBzdHJlYW0uJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQpXG4gICAgICAgICAgICA/IHNldHRpbmdzW09wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZF1cbiAgICAgICAgICAgIDogJycsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgT3B0aW9uUGFyYW1ldGVycy5TdHJlYW1lcklkKVxuICAgICAgICAgICAgPyBbc2V0dGluZ3NbT3B0aW9uUGFyYW1ldGVycy5TdHJlYW1lcklkXV1cbiAgICAgICAgICAgIDogdW5kZWZpbmVkLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgY29uc3QgZ2V0RGVmYXVsdFZpZGVvQ29kZWMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCB2aWRlb0NvZGVjcyA9IEJyb3dzZXJVdGlscy5nZXRTdXBwb3J0ZWRWaWRlb0NvZGVjcygpO1xuICAgICAgICAgICAgLy8gSWYgb25seSBvbmUgb3B0aW9uLCB0aGVuIHNlbGVjdCB0aGF0LlxuICAgICAgICAgICAgaWYgKHZpZGVvQ29kZWNzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZpZGVvQ29kZWNzWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmlkZW9Db2RlY3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRDb2RlYyA9IHZpZGVvQ29kZWNzWzBdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29kZWMgb2YgdmlkZW9Db2RlY3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjLnN0YXJ0c1dpdGgoJ0gyNjQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVjO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0Q29kZWM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBMb2dnZXIuRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGFueSByZWFzb25hYmxlIHZpZGVvIGNvZGVjIHRvIGFzc2lnbiBhcyBhIGRlZmF1bHQuJyk7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG1hdGNoU3BlY2lmaWVkQ29kZWNUb0Nsb3Nlc3RTdXBwb3J0ZWQgPSBmdW5jdGlvbiAoc3BlY2lmaWVkQ29kZWMpIHtcbiAgICAgICAgICAgIGNvbnN0IGJyb3dzZXJTdXBwb3J0ZWRDb2RlY3MgPSBCcm93c2VyVXRpbHMuZ2V0U3VwcG9ydGVkVmlkZW9Db2RlY3MoKTtcbiAgICAgICAgICAgIC8vIENvZGVjIHN1cHBsaWVkIGluIHVybCBwYXJhbSBpcyBhbiBleGFjdCBtYXRjaCBmb3IgdGhlIGJyb3dzZXIgY29kZWMuXG4gICAgICAgICAgICAvLyAoZS5nLiBIMjY0IGxldmVsLWFzeW1tZXRyeS1hbGxvd2VkPTE7cGFja2V0aXphdGlvbi1tb2RlPTE7cHJvZmlsZS1sZXZlbC1pZD00MmUwMWYpXG4gICAgICAgICAgICBpZiAoYnJvd3NlclN1cHBvcnRlZENvZGVjcy5pbmNsdWRlcyhzcGVjaWZpZWRDb2RlYykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWVkQ29kZWM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggdGhlIHN0YXJ0IG9mIHdoYXRldmVyIGlzIHBhc3NlZCBpbnRvIHRoZSB1cmwgcGFyYW1ldGVyIHdpdGggd2hhdCB0aGUgYnJvd3NlciBzdXBwb3J0c1xuICAgICAgICAgICAgZm9yIChjb25zdCBicm93c2VyQ29kZWMgb2YgYnJvd3NlclN1cHBvcnRlZENvZGVjcykge1xuICAgICAgICAgICAgICAgIGlmIChicm93c2VyQ29kZWMuc3RhcnRzV2l0aChzcGVjaWZpZWRDb2RlYykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJyb3dzZXJDb2RlYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiB3ZSB3ZXJlbid0IGFibGUgdG8gbWF0Y2gsIGp1c3QgcmV0dXJuIHRoZSBjb2RlYyBhcyBmcm9tIHRoZSBVUkwgYXMtaXMuXG4gICAgICAgICAgICByZXR1cm4gc3BlY2lmaWVkQ29kZWM7XG4gICAgICAgIH07XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbnVtIFBhcmFtZXRlcnNcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMub3B0aW9uUGFyYW1ldGVycy5zZXQoT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYywgbmV3IFNldHRpbmdPcHRpb24oT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYywgJ1ByZWZlcnJlZCBDb2RlYycsICdUaGUgcHJlZmVycmVkIGNvZGVjIHRvIGJlIHVzZWQgZHVyaW5nIGNvZGVjIG5lZ290aWF0aW9uJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjKVxuICAgICAgICAgICAgPyBtYXRjaFNwZWNpZmllZENvZGVjVG9DbG9zZXN0U3VwcG9ydGVkKHNldHRpbmdzW09wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWNdKVxuICAgICAgICAgICAgOiBnZXREZWZhdWx0VmlkZW9Db2RlYygpLCBCcm93c2VyVXRpbHMuZ2V0U3VwcG9ydGVkVmlkZW9Db2RlY3MoKSwgdXNlVXJsUGFyYW1zLCBtYXRjaFNwZWNpZmllZENvZGVjVG9DbG9zZXN0U3VwcG9ydGVkKSk7XG4gICAgICAgIHRoaXMub3B0aW9uUGFyYW1ldGVycy5zZXQoT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRRdWFsaXR5LCBuZXcgU2V0dGluZ09wdGlvbihPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHksICdQcmVmZXJyZWQgUXVhbGl0eScsICdUaGUgcHJlZmVycmVkIHF1YWxpdHkgb2YgdGhlIHN0cmVhbSAob25seSBhcHBsaWNhYmxlIHdoZW4gdXNpbmcgdGhlIFNGVSknLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSlcbiAgICAgICAgICAgID8gc2V0dGluZ3NbT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRRdWFsaXR5XVxuICAgICAgICAgICAgOiAnRGVmYXVsdCcsIFsnRGVmYXVsdCddLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJvb2xlYW4gcGFyYW1ldGVyc1xuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuQXV0b0Nvbm5lY3QsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5BdXRvQ29ubmVjdCwgJ0F1dG8gY29ubmVjdCB0byBzdHJlYW0nLCAnV2hldGhlciB3ZSBzaG91bGQgYXR0ZW1wdCB0byBhdXRvIGNvbm5lY3QgdG8gdGhlIHNpZ25hbGxpbmcgc2VydmVyIG9yIHNob3cgYSBjbGljayB0byBzdGFydCBwcm9tcHQuJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5BdXRvQ29ubmVjdClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuQXV0b0Nvbm5lY3RdXG4gICAgICAgICAgICA6IGZhbHNlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuQXV0b1BsYXlWaWRlbywgbmV3IFNldHRpbmdGbGFnKEZsYWdzLkF1dG9QbGF5VmlkZW8sICdBdXRvIHBsYXkgdmlkZW8nLCAnV2hlbiB2aWRlbyBpcyByZWFkeSBhdXRvbWF0aWNhbGx5IHN0YXJ0IHBsYXlpbmcgaXQgYXMgb3Bwb3NlZCB0byBzaG93aW5nIGEgcGxheSBidXR0b24uJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5BdXRvUGxheVZpZGVvKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5BdXRvUGxheVZpZGVvXVxuICAgICAgICAgICAgOiB0cnVlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuVXNlTWljLCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuVXNlTWljLCAnVXNlIG1pY3JvcGhvbmUnLCAnTWFrZSBicm93c2VyIHJlcXVlc3QgbWljcm9waG9uZSBhY2Nlc3MgYW5kIG9wZW4gYW4gaW5wdXQgYXVkaW8gdHJhY2suJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5Vc2VNaWMpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLlVzZU1pY11cbiAgICAgICAgICAgIDogZmFsc2UsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5Vc2VNb2RhbEZvclRleHRJbnB1dCwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLlVzZU1vZGFsRm9yVGV4dElucHV0LCAnVXNlIG1vZGFsIGZvciB0ZXh0IGlucHV0JywgJ1doZW4gZW50ZXJpbmcgaW5wdXQgaW50byBhIHN0cmVhbWVkIFVFIHRleHQgd2lkZ2V0LCB1c2UgYW4gaW5wdXQgbW9kYWwuJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5Vc2VNb2RhbEZvclRleHRJbnB1dClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuVXNlTW9kYWxGb3JUZXh0SW5wdXRdXG4gICAgICAgICAgICA6IHRydWUsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5Vc2VDYW1lcmEsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5Vc2VDYW1lcmEsICdVc2Ugd2ViY2FtJywgJ01ha2UgYnJvd3NlciByZXF1ZXN0IHdlYmNhbSBhY2Nlc3MgYW5kIG9wZW4gYSBpbnB1dCB2aWRlbyB0cmFjay4nLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLlVzZUNhbWVyYSlcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuVXNlQ2FtZXJhXVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLlN0YXJ0VmlkZW9NdXRlZCwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLlN0YXJ0VmlkZW9NdXRlZCwgJ1N0YXJ0IHZpZGVvIG11dGVkJywgJ1ZpZGVvIHdpbGwgc3RhcnQgbXV0ZWQgaWYgdHJ1ZS4nLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLlN0YXJ0VmlkZW9NdXRlZClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuU3RhcnRWaWRlb011dGVkXVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLlN1cHByZXNzQnJvd3NlcktleXMsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5TdXBwcmVzc0Jyb3dzZXJLZXlzLCAnU3VwcHJlc3MgYnJvd3NlciBrZXlzJywgJ1N1cHByZXNzIGNlcnRhaW4gYnJvd3NlciBrZXlzIHRoYXQgd2UgdXNlIGluIFVFLCBmb3IgZXhhbXBsZSBGNSB0byBzaG93IHNoYWRlciBjb21wbGV4aXR5IGluc3RlYWQgb2YgcmVmcmVzaCB0aGUgcGFnZS4nLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLlN1cHByZXNzQnJvd3NlcktleXMpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLlN1cHByZXNzQnJvd3NlcktleXNdXG4gICAgICAgICAgICA6IHRydWUsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5Jc1F1YWxpdHlDb250cm9sbGVyLCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuSXNRdWFsaXR5Q29udHJvbGxlciwgJ0lzIHF1YWxpdHkgY29udHJvbGxlcj8nLCAnVHJ1ZSBpZiB0aGlzIHBlZXIgY29udHJvbHMgc3RyZWFtIHF1YWxpdHknLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLklzUXVhbGl0eUNvbnRyb2xsZXIpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLklzUXVhbGl0eUNvbnRyb2xsZXJdXG4gICAgICAgICAgICA6IHRydWUsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5Gb3JjZU1vbm9BdWRpbywgbmV3IFNldHRpbmdGbGFnKEZsYWdzLkZvcmNlTW9ub0F1ZGlvLCAnRm9yY2UgbW9ubyBhdWRpbycsICdGb3JjZSBicm93c2VyIHRvIHJlcXVlc3QgbW9ubyBhdWRpbyBpbiB0aGUgU0RQJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5Gb3JjZU1vbm9BdWRpbylcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuRm9yY2VNb25vQXVkaW9dXG4gICAgICAgICAgICA6IGZhbHNlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuRm9yY2VUVVJOLCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuRm9yY2VUVVJOLCAnRm9yY2UgVFVSTicsICdPbmx5IGdlbmVyYXRlIFRVUk4vUmVsYXllZCBJQ0UgY2FuZGlkYXRlcy4nLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLkZvcmNlVFVSTilcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuRm9yY2VUVVJOXVxuICAgICAgICAgICAgOiBmYWxzZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLkFGS0RldGVjdGlvbiwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLkFGS0RldGVjdGlvbiwgJ0FGSyBpZiBpZGxlJywgJ1RpbWVvdXQgdGhlIGV4cGVyaWVuY2UgaWYgdXNlciBpcyBBRksgZm9yIGEgcGVyaW9kLicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuQUZLRGV0ZWN0aW9uKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5BRktEZXRlY3Rpb25dXG4gICAgICAgICAgICA6IGZhbHNlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuTWF0Y2hWaWV3cG9ydFJlc29sdXRpb24sIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbiwgJ01hdGNoIHZpZXdwb3J0IHJlc29sdXRpb24nLCAnUGl4ZWwgU3RyZWFtaW5nIHdpbGwgYmUgaW5zdHJ1Y3RlZCB0byBkeW5hbWljYWxseSByZXNpemUgdGhlIHZpZGVvIHN0cmVhbSB0byBtYXRjaCB0aGUgc2l6ZSBvZiB0aGUgdmlkZW8gZWxlbWVudC4nLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLk1hdGNoVmlld3BvcnRSZXNvbHV0aW9uKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbl1cbiAgICAgICAgICAgIDogZmFsc2UsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5Ib3ZlcmluZ01vdXNlTW9kZSwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLkhvdmVyaW5nTW91c2VNb2RlLCAnQ29udHJvbCBTY2hlbWU6IExvY2tlZCBNb3VzZScsICdFaXRoZXIgbG9ja2VkIG1vdXNlLCB3aGVyZSB0aGUgcG9pbnRlciBpcyBjb25zdW1lZCBieSB0aGUgdmlkZW8gYW5kIGxvY2tlZCB0byBpdCwgb3IgaG92ZXJpbmcgbW91c2UsIHdoZXJlIHRoZSBtb3VzZSBpcyBub3QgY29uc3VtZWQuJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5Ib3ZlcmluZ01vdXNlTW9kZSlcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGVdXG4gICAgICAgICAgICA6IGZhbHNlLCB1c2VVcmxQYXJhbXMsIChpc0hvdmVyaW5nTW91c2UsIHNldHRpbmcpID0+IHtcbiAgICAgICAgICAgIHNldHRpbmcubGFiZWwgPSBgQ29udHJvbCBTY2hlbWU6ICR7aXNIb3ZlcmluZ01vdXNlID8gJ0hvdmVyaW5nJyA6ICdMb2NrZWQnfSBNb3VzZWA7XG4gICAgICAgIH0pKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuRmFrZU1vdXNlV2l0aFRvdWNoZXMsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5GYWtlTW91c2VXaXRoVG91Y2hlcywgJ0Zha2UgbW91c2Ugd2l0aCB0b3VjaGVzJywgJ0Egc2luZ2xlIGZpbmdlciB0b3VjaCBpcyBjb252ZXJ0ZWQgaW50byBhIG1vdXNlIGV2ZW50LiBUaGlzIGFsbG93cyBhIG5vbi10b3VjaCBhcHBsaWNhdGlvbiB0byBiZSBjb250cm9sbGVkIHBhcnRpYWxseSB2aWEgYSB0b3VjaCBkZXZpY2UuJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5GYWtlTW91c2VXaXRoVG91Y2hlcylcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuRmFrZU1vdXNlV2l0aFRvdWNoZXNdXG4gICAgICAgICAgICA6IGZhbHNlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuS2V5Ym9hcmRJbnB1dCwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLktleWJvYXJkSW5wdXQsICdLZXlib2FyZCBpbnB1dCcsICdJZiBlbmFibGVkLCBzZW5kIGtleWJvYXJkIGV2ZW50cyB0byBzdHJlYW1lcicsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuS2V5Ym9hcmRJbnB1dClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuS2V5Ym9hcmRJbnB1dF1cbiAgICAgICAgICAgIDogdHJ1ZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLk1vdXNlSW5wdXQsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5Nb3VzZUlucHV0LCAnTW91c2UgaW5wdXQnLCAnSWYgZW5hYmxlZCwgc2VuZCBtb3VzZSBldmVudHMgdG8gc3RyZWFtZXInLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLk1vdXNlSW5wdXQpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLk1vdXNlSW5wdXRdXG4gICAgICAgICAgICA6IHRydWUsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLmZsYWdzLnNldChGbGFncy5Ub3VjaElucHV0LCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuVG91Y2hJbnB1dCwgJ1RvdWNoIGlucHV0JywgJ0lmIGVuYWJsZWQsIHNlbmQgdG91Y2ggZXZlbnRzIHRvIHN0cmVhbWVyJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5Ub3VjaElucHV0KVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5Ub3VjaElucHV0XVxuICAgICAgICAgICAgOiB0cnVlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuR2FtZXBhZElucHV0LCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuR2FtZXBhZElucHV0LCAnR2FtZXBhZCBpbnB1dCcsICdJZiBlbmFibGVkLCBzZW5kIGdhbWVwYWQgZXZlbnRzIHRvIHN0cmVhbWVyJywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBGbGFncy5HYW1lcGFkSW5wdXQpXG4gICAgICAgICAgICA/IHNldHRpbmdzW0ZsYWdzLkdhbWVwYWRJbnB1dF1cbiAgICAgICAgICAgIDogdHJ1ZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLlhSQ29udHJvbGxlcklucHV0LCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuWFJDb250cm9sbGVySW5wdXQsICdYUiBjb250cm9sbGVyIGlucHV0JywgJ0lmIGVuYWJsZWQsIHNlbmQgWFIgY29udHJvbGxlciBldmVudHMgdG8gc3RyZWFtZXInLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLlhSQ29udHJvbGxlcklucHV0KVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5YUkNvbnRyb2xsZXJJbnB1dF1cbiAgICAgICAgICAgIDogdHJ1ZSwgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMuZmxhZ3Muc2V0KEZsYWdzLldhaXRGb3JTdHJlYW1lciwgbmV3IFNldHRpbmdGbGFnKEZsYWdzLldhaXRGb3JTdHJlYW1lciwgJ1dhaXQgZm9yIHN0cmVhbWVyJywgJ1dpbGwgY29udGludWUgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gdGhlIGZpcnN0IHN0cmVhbWVyIGF2YWlsYWJsZS4nLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLldhaXRGb3JTdHJlYW1lcilcbiAgICAgICAgICAgID8gc2V0dGluZ3NbRmxhZ3MuV2FpdEZvclN0cmVhbWVyXVxuICAgICAgICAgICAgOiB0cnVlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuSGlkZVVJLCBuZXcgU2V0dGluZ0ZsYWcoRmxhZ3MuSGlkZVVJLCAnSGlkZSB0aGUgVUkgb3ZlcmxheScsICdXaWxsIGhpZGUgYWxsIFVJIG92ZXJsYXkgZGV0YWlscycsIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgRmxhZ3MuSGlkZVVJKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5IaWRlVUldXG4gICAgICAgICAgICA6IGZhbHNlLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5mbGFncy5zZXQoRmxhZ3MuRW5hYmxlQ2FwdHVyZVRpbWVFeHQsIG5ldyBTZXR0aW5nRmxhZyhGbGFncy5FbmFibGVDYXB0dXJlVGltZUV4dCwgJ0VuYWJsZSBhYnMtY2FwdHVyZS10aW1lJywgJ0VuYWJsZXMgdGhlIGFicy1jYXB0dXJlLXRpbWUgUlRQIGhlYWRlciBleHRlbnNpb24nLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIEZsYWdzLkVuYWJsZUNhcHR1cmVUaW1lRXh0KVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tGbGFncy5FbmFibGVDYXB0dXJlVGltZUV4dF1cbiAgICAgICAgICAgIDogZmFsc2UsIHVzZVVybFBhcmFtcykpO1xuICAgICAgICAvKipcbiAgICAgICAgICogTnVtZXJpYyBwYXJhbWV0ZXJzXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLnNldChOdW1lcmljUGFyYW1ldGVycy5BRktUaW1lb3V0U2VjcywgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuQUZLVGltZW91dFNlY3MsICdBRksgdGltZW91dCcsICdUaGUgdGltZSAoaW4gc2Vjb25kcykgaXQgdGFrZXMgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byB0aW1lIG91dCBpZiBBRksgdGltZW91dCBpcyBlbmFibGVkLicsIDAgLyptaW4qLywgbnVsbCAvKm1heCovLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE51bWVyaWNQYXJhbWV0ZXJzLkFGS1RpbWVvdXRTZWNzKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tOdW1lcmljUGFyYW1ldGVycy5BRktUaW1lb3V0U2Vjc11cbiAgICAgICAgICAgIDogMTIwIC8qdmFsdWUqLywgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuc2V0KE51bWVyaWNQYXJhbWV0ZXJzLkFGS0NvdW50ZG93blNlY3MsIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLkFGS0NvdW50ZG93blNlY3MsICdBRksgY291bnRkb3duJywgJ1RoZSB0aW1lIChpbiBzZWNvbmRzKSBmb3IgYSB1c2VyIHRvIHJlc3BvbmQgYmVmb3JlIHRoZSBzdHJlYW0gaXMgZW5kZWQgYWZ0ZXIgYW4gQUZLIHRpbWVvdXQuJywgMTAgLyptaW4qLywgbnVsbCAvKm1heCovLCAxMCAvKnZhbHVlKi8sIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLnNldChOdW1lcmljUGFyYW1ldGVycy5NYXhSZWNvbm5lY3RBdHRlbXB0cywgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UmVjb25uZWN0QXR0ZW1wdHMsICdNYXggUmVjb25uZWN0cycsICdNYXhpbXVtIG51bWJlciBvZiByZWNvbm5lY3RzIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGF0dGVtcHQgd2hlbiBhIHN0cmVhbWVyIGRpc2Nvbm5lY3RzLicsIDAgLyptaW4qLywgOTk5IC8qbWF4Ki8sIHNldHRpbmdzICYmXG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE51bWVyaWNQYXJhbWV0ZXJzLk1heFJlY29ubmVjdEF0dGVtcHRzKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tOdW1lcmljUGFyYW1ldGVycy5NYXhSZWNvbm5lY3RBdHRlbXB0c11cbiAgICAgICAgICAgIDogMyAvKnZhbHVlKi8sIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLnNldChOdW1lcmljUGFyYW1ldGVycy5NaW5RUCwgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuTWluUVAsICdNaW4gUVAnLCAnVGhlIGxvd2VyIGJvdW5kIGZvciB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAoUVApIG9mIHRoZSBlbmNvZGVyLiAwID0gQmVzdCBxdWFsaXR5LCA1MSA9IHdvcnN0IHF1YWxpdHkuJywgMCAvKm1pbiovLCA1MSAvKm1heCovLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE51bWVyaWNQYXJhbWV0ZXJzLk1pblFQKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tOdW1lcmljUGFyYW1ldGVycy5NaW5RUF1cbiAgICAgICAgICAgIDogMCAvKnZhbHVlKi8sIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLnNldChOdW1lcmljUGFyYW1ldGVycy5NYXhRUCwgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UVAsICdNYXggUVAnLCAnVGhlIHVwcGVyIGJvdW5kIGZvciB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAoUVApIG9mIHRoZSBlbmNvZGVyLiAwID0gQmVzdCBxdWFsaXR5LCA1MSA9IHdvcnN0IHF1YWxpdHkuJywgMCAvKm1pbiovLCA1MSAvKm1heCovLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE51bWVyaWNQYXJhbWV0ZXJzLk1heFFQKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tOdW1lcmljUGFyYW1ldGVycy5NYXhRUF1cbiAgICAgICAgICAgIDogNTEgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuTWluUXVhbGl0eSwgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuTWluUXVhbGl0eSwgJ01pbiBRdWFsaXR5JywgJ1RoZSBsb3dlciBib3VuZCBmb3IgdGhlIHF1YWxpdHkgZmFjdG9yIG9mIHRoZSBlbmNvZGVyLiAwID0gV29yc3QgcXVhbGl0eSwgMTAwID0gQmVzdCBxdWFsaXR5LicsIDAgLyptaW4qLywgMTAwIC8qbWF4Ki8sIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgTnVtZXJpY1BhcmFtZXRlcnMuTWluUXVhbGl0eSlcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuTWluUXVhbGl0eV1cbiAgICAgICAgICAgIDogMCAvKnZhbHVlKi8sIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLnNldChOdW1lcmljUGFyYW1ldGVycy5NYXhRdWFsaXR5LCBuZXcgU2V0dGluZ051bWJlcihOdW1lcmljUGFyYW1ldGVycy5NYXhRdWFsaXR5LCAnTWF4IFF1YWxpdHknLCAnVGhlIHVwcGVyIGJvdW5kIGZvciB0aGUgcXVhbGl0eSBmYWN0b3Igb2YgdGhlIGVuY29kZXIuIDAgPSBXb3JzdCBxdWFsaXR5LCAxMDAgPSBCZXN0IHF1YWxpdHkuJywgMCAvKm1pbiovLCAxMDAgLyptYXgqLywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5NYXhRdWFsaXR5KVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tOdW1lcmljUGFyYW1ldGVycy5NYXhRdWFsaXR5XVxuICAgICAgICAgICAgOiAxMDAgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbiwgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbiwgJ01pbiBRdWFsaXR5JywgJ1RoZSBsb3dlciBib3VuZCBmb3IgZW5jb2RpbmcgcXVhbGl0eS4gMCA9IFdvcnN0LCAxMDAgPSBCZXN0LicsIDAgLyptaW4qLywgMTAwIC8qbWF4Ki8sIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbilcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbl1cbiAgICAgICAgICAgIDogMCAvKnZhbHVlKi8sIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLnNldChOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWF4LCBuZXcgU2V0dGluZ051bWJlcihOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWF4LCAnTWF4IFF1YWxpdHknLCAnVGhlIHVwcGVyIGJvdW5kIGZvciBlbmNvZGluZyBxdWFsaXR5LiAwID0gV29yc3QsIDEwMCA9IEJlc3QuJywgMCAvKm1pbiovLCAxMDAgLyptYXgqLywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWF4KVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWF4XVxuICAgICAgICAgICAgOiAxMDAgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDRlBTLCBuZXcgU2V0dGluZ051bWJlcihOdW1lcmljUGFyYW1ldGVycy5XZWJSVENGUFMsICdNYXggRlBTJywgJ1RoZSBtYXhpbXVtIEZQUyB0aGF0IFdlYlJUQyB3aWxsIHRyeSB0byB0cmFuc21pdCBmcmFtZXMgYXQuJywgMSAvKm1pbiovLCA5OTkgLyptYXgqLywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5XZWJSVENGUFMpXG4gICAgICAgICAgICA/IHNldHRpbmdzW051bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ0ZQU11cbiAgICAgICAgICAgIDogNjAgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVycy5zZXQoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSwgbmV3IFNldHRpbmdOdW1iZXIoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSwgJ01pbiBCaXRyYXRlIChrYnBzKScsICdUaGUgbWluaW11bSBiaXRyYXRlIHRoYXQgV2ViUlRDIHNob3VsZCB1c2UuJywgMCAvKm1pbiovLCA1MDAwMDAgLyptYXgqLywgc2V0dGluZ3MgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNldHRpbmdzLCBOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNaW5CaXRyYXRlKVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNaW5CaXRyYXRlXVxuICAgICAgICAgICAgOiAwIC8qdmFsdWUqLywgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuc2V0KE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUsIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUsICdNYXggQml0cmF0ZSAoa2JwcyknLCAnVGhlIG1heGltdW0gYml0cmF0ZSB0aGF0IFdlYlJUQyBzaG91bGQgdXNlLicsIDAgLyptaW4qLywgNTAwMDAwIC8qbWF4Ki8sIHNldHRpbmdzICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXR0aW5ncywgTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWF4Qml0cmF0ZSlcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWF4Qml0cmF0ZV1cbiAgICAgICAgICAgIDogMCAvKnZhbHVlKi8sIHVzZVVybFBhcmFtcykpO1xuICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLnNldChOdW1lcmljUGFyYW1ldGVycy5TdHJlYW1lckF1dG9Kb2luSW50ZXJ2YWwsIG5ldyBTZXR0aW5nTnVtYmVyKE51bWVyaWNQYXJhbWV0ZXJzLlN0cmVhbWVyQXV0b0pvaW5JbnRlcnZhbCwgJ1N0cmVhbWVyIEF1dG8gSm9pbiBJbnRlcnZhbCAobXMpJywgJ0RlbGF5IGJldHdlZW4gcmV0cmllcyB3aGVuIHdhaXRpbmcgZm9yIGFuIGF2YWlsYWJsZSBzdHJlYW1lci4nLCA1MDAgLyptaW4qLywgOTAwMDAwIC8qbWF4Ki8sIHNldHRpbmdzICYmXG4gICAgICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE51bWVyaWNQYXJhbWV0ZXJzLlN0cmVhbWVyQXV0b0pvaW5JbnRlcnZhbClcbiAgICAgICAgICAgID8gc2V0dGluZ3NbTnVtZXJpY1BhcmFtZXRlcnMuU3RyZWFtZXJBdXRvSm9pbkludGVydmFsXVxuICAgICAgICAgICAgOiAzMDAwIC8qdmFsdWUqLywgdXNlVXJsUGFyYW1zKSk7XG4gICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuc2V0KE51bWVyaWNQYXJhbWV0ZXJzLktlZXBhbGl2ZURlbGF5LCBuZXcgU2V0dGluZ051bWJlcihOdW1lcmljUGFyYW1ldGVycy5LZWVwYWxpdmVEZWxheSwgJ0Nvbm5lY3Rpb24gS2VlcGFsaXZlIGRlbGF5JywgJ0RlbGF5IGJldHdlZW4ga2VlcGFsaXZlIHBpbmdzIHRvIHRoZSBzaWduYWxsaW5nIHNlcnZlci4nLCAwIC8qbWluKi8sIDkwMDAwMCAvKm1heCovLCBzZXR0aW5ncyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2V0dGluZ3MsIE51bWVyaWNQYXJhbWV0ZXJzLktlZXBhbGl2ZURlbGF5KVxuICAgICAgICAgICAgPyBzZXR0aW5nc1tOdW1lcmljUGFyYW1ldGVycy5LZWVwYWxpdmVEZWxheV1cbiAgICAgICAgICAgIDogMzAwMDAgLyp2YWx1ZSovLCB1c2VVcmxQYXJhbXMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgY2FsbGJhY2sgdG8gZmlyZSB3aGVuIHRoZSBudW1lcmljIHNldHRpbmcgaXMgdG9nZ2xlZC5cbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBmbGFnLlxuICAgICAqIEBwYXJhbSBvbkNoYW5nZWRMaXN0ZW5lciBUaGUgY2FsbGJhY2sgdG8gZmlyZSB3aGVuIHRoZSBudW1lcmljIHZhbHVlIGNoYW5nZXMuXG4gICAgICovXG4gICAgX2FkZE9uTnVtZXJpY1NldHRpbmdDaGFuZ2VkTGlzdGVuZXIoaWQsIG9uQ2hhbmdlZExpc3RlbmVyKSB7XG4gICAgICAgIGlmICh0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuZ2V0KGlkKS5hZGRPbkNoYW5nZWRMaXN0ZW5lcihvbkNoYW5nZWRMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2FkZE9uT3B0aW9uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihpZCwgb25DaGFuZ2VkTGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uUGFyYW1ldGVycy5oYXMoaWQpKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvblBhcmFtZXRlcnMuZ2V0KGlkKS5hZGRPbkNoYW5nZWRMaXN0ZW5lcihvbkNoYW5nZWRMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgbnVtZXJpYyBzZXR0aW5nIHdlIGFyZSBpbnRlcmVzdGVkIGluIGdldHRpbmcgYSB2YWx1ZSBmb3IuXG4gICAgICogQHJldHVybnMgVGhlIG51bWVyaWMgdmFsdWUgc3RvcmVkIGluIHRoZSBwYXJhbWV0ZXIgd2l0aCB0aGUgcGFzc2VkIGlkLlxuICAgICAqL1xuICAgIGdldE51bWVyaWNTZXR0aW5nVmFsdWUoaWQpIHtcbiAgICAgICAgaWYgKHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuaGFzKGlkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuZ2V0KGlkKS5udW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIG5vIG51bWVyaWMgc2V0dGluZyB3aXRoIHRoZSBpZCBvZiAke2lkfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIHRleHQgc2V0dGluZyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBnZXR0aW5nIGEgdmFsdWUgZm9yLlxuICAgICAqIEByZXR1cm5zIFRoZSB0ZXh0IHZhbHVlIHN0b3JlZCBpbiB0aGUgcGFyYW1ldGVyIHdpdGggdGhlIHBhc3NlZCBpZC5cbiAgICAgKi9cbiAgICBnZXRUZXh0U2V0dGluZ1ZhbHVlKGlkKSB7XG4gICAgICAgIGlmICh0aGlzLnRleHRQYXJhbWV0ZXJzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRleHRQYXJhbWV0ZXJzLmdldChpZCkudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZXJlIGlzIG5vIG51bWVyaWMgc2V0dGluZyB3aXRoIHRoZSBpZCBvZiAke2lkfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBudW1iZXIgaW4gdGhlIHNldHRpbmcuXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgbnVtZXJpYyBzZXR0aW5nIHdlIGFyZSBpbnRlcmVzdGVkIGluLlxuICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgbnVtZXJpYyB2YWx1ZSB0byBzZXQuXG4gICAgICovXG4gICAgc2V0TnVtZXJpY1NldHRpbmcoaWQsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMuZ2V0KGlkKS5udW1iZXIgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlcmUgaXMgbm8gbnVtZXJpYyBzZXR0aW5nIHdpdGggdGhlIGlkIG9mICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgY2FsbGJhY2sgdG8gZmlyZSB3aGVuIHRoZSBmbGFnIGlzIHRvZ2dsZWQuXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgZmxhZy5cbiAgICAgKiBAcGFyYW0gb25DaGFuZ2VMaXN0ZW5lciBUaGUgY2FsbGJhY2sgdG8gZmlyZSB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VzLlxuICAgICAqL1xuICAgIF9hZGRPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoaWQsIG9uQ2hhbmdlTGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuZmxhZ3MuaGFzKGlkKSkge1xuICAgICAgICAgICAgdGhpcy5mbGFncy5nZXQoaWQpLm9uQ2hhbmdlID0gb25DaGFuZ2VMaXN0ZW5lcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBjYWxsYmFjayB0byBmaXJlIHdoZW4gdGhlIHRleHQgaXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBmbGFnLlxuICAgICAqIEBwYXJhbSBvbkNoYW5nZUxpc3RlbmVyIFRoZSBjYWxsYmFjayB0byBmaXJlIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuXG4gICAgICovXG4gICAgX2FkZE9uVGV4dFNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoaWQsIG9uQ2hhbmdlTGlzdGVuZXIpIHtcbiAgICAgICAgaWYgKHRoaXMudGV4dFBhcmFtZXRlcnMuaGFzKGlkKSkge1xuICAgICAgICAgICAgdGhpcy50ZXh0UGFyYW1ldGVycy5nZXQoaWQpLm9uQ2hhbmdlID0gb25DaGFuZ2VMaXN0ZW5lcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG9wdGlvbiB3aGljaCBoYXMgdGhlIGdpdmVuIGlkLlxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIG9wdGlvbi5cbiAgICAgKiBAcmV0dXJucyBUaGUgU2V0dGluZ09wdGlvbiBvYmplY3QgbWF0Y2hpbmcgaWRcbiAgICAgKi9cbiAgICBnZXRTZXR0aW5nT3B0aW9uKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvblBhcmFtZXRlcnMuZ2V0KGlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmbGFnIHdoaWNoIGhhcyB0aGUgZ2l2ZW4gaWQuXG4gICAgICogQHBhcmFtIGlkIFRoZSB1bmlxdWUgaWQgZm9yIHRoZSBmbGFnLlxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGZsYWcgaXMgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBpc0ZsYWdFbmFibGVkKGlkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsYWdzLmdldChpZCkuZmxhZztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IGZsYWcgdG8gYmUgZW5hYmxlZC9kaXNhYmxlZC5cbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBmbGFnIHRvIHRvZ2dsZS5cbiAgICAgKiBAcGFyYW0gZmxhZ0VuYWJsZWQgVHJ1ZSBpZiB0aGUgZmxhZyBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAgKi9cbiAgICBzZXRGbGFnRW5hYmxlZChpZCwgZmxhZ0VuYWJsZWQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZsYWdzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIExvZ2dlci5XYXJuaW5nKGBDYW5ub3QgdG9nZ2xlIGZsYWcgY2FsbGVkICR7aWR9IC0gaXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIENvbmZpZy5mbGFncyBtYXAuYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZsYWdzLmdldChpZCkuZmxhZyA9IGZsYWdFbmFibGVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgdGV4dCBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIHNldHRpbmdcbiAgICAgKiBAcGFyYW0gc2V0dGluZ1ZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgaW4gdGhlIHNldHRpbmcuXG4gICAgICovXG4gICAgc2V0VGV4dFNldHRpbmcoaWQsIHNldHRpbmdWYWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMudGV4dFBhcmFtZXRlcnMuaGFzKGlkKSkge1xuICAgICAgICAgICAgTG9nZ2VyLldhcm5pbmcoYENhbm5vdCBzZXQgdGV4dCBzZXR0aW5nIGNhbGxlZCAke2lkfSAtIGl0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBDb25maWcudGV4dFBhcmFtZXRlcnMgbWFwLmApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50ZXh0UGFyYW1ldGVycy5nZXQoaWQpLnRleHQgPSBzZXR0aW5nVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBvcHRpb24gc2V0dGluZyBsaXN0IG9mIG9wdGlvbnMuXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgc2V0dGluZ1xuICAgICAqIEBwYXJhbSBzZXR0aW5nT3B0aW9ucyBUaGUgdmFsdWVzIHRoZSBzZXR0aW5nIGNvdWxkIHRha2VcbiAgICAgKi9cbiAgICBzZXRPcHRpb25TZXR0aW5nT3B0aW9ucyhpZCwgc2V0dGluZ09wdGlvbnMpIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvblBhcmFtZXRlcnMuaGFzKGlkKSkge1xuICAgICAgICAgICAgTG9nZ2VyLldhcm5pbmcoYENhbm5vdCBzZXQgdGV4dCBzZXR0aW5nIGNhbGxlZCAke2lkfSAtIGl0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBDb25maWcub3B0aW9uUGFyYW1ldGVycyBtYXAuYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvblBhcmFtZXRlcnMuZ2V0KGlkKS5vcHRpb25zID0gc2V0dGluZ09wdGlvbnM7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IG9wdGlvbiBlbnVtIHNldHRpbmdzIHNlbGVjdGVkIG9wdGlvbi5cbiAgICAgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBzZXR0aW5nXG4gICAgICogQHBhcmFtIHNldHRpbmdPcHRpb25zIFRoZSB2YWx1ZSB0byBzZWxlY3Qgb3V0IG9mIGFsbCB0aGUgb3B0aW9uc1xuICAgICAqL1xuICAgIHNldE9wdGlvblNldHRpbmdWYWx1ZShpZCwgc2V0dGluZ1ZhbHVlKSB7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25QYXJhbWV0ZXJzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIExvZ2dlci5XYXJuaW5nKGBDYW5ub3Qgc2V0IHRleHQgc2V0dGluZyBjYWxsZWQgJHtpZH0gLSBpdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgQ29uZmlnLmVudW1QYXJhbWV0ZXJzIG1hcC5gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvblNldHRpbmcgPSB0aGlzLm9wdGlvblBhcmFtZXRlcnMuZ2V0KGlkKTtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nT3B0aW9ucyA9IG9wdGlvblNldHRpbmcub3B0aW9ucztcbiAgICAgICAgICAgIGlmICghZXhpc3RpbmdPcHRpb25zLmluY2x1ZGVzKHNldHRpbmdWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBleGlzdGluZ09wdGlvbnMucHVzaChzZXR0aW5nVmFsdWUpO1xuICAgICAgICAgICAgICAgIG9wdGlvblNldHRpbmcub3B0aW9ucyA9IGV4aXN0aW5nT3B0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvblNldHRpbmcuc2VsZWN0ZWQgPSBzZXR0aW5nVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsYWJlbCBmb3IgdGhlIGZsYWcuXG4gICAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgZmxhZy5cbiAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIG5ldyBsYWJlbCB0byB1c2UgZm9yIHRoZSBmbGFnLlxuICAgICAqL1xuICAgIHNldEZsYWdMYWJlbChpZCwgbGFiZWwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZsYWdzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIExvZ2dlci5XYXJuaW5nKGBDYW5ub3Qgc2V0IGxhYmVsIGZvciBmbGFnIGNhbGxlZCAke2lkfSAtIGl0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBDb25maWcuZmxhZ3MgbWFwLmApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mbGFncy5nZXQoaWQpLmxhYmVsID0gbGFiZWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IGEgc3Vic2V0IG9mIGFsbCBzZXR0aW5ncyBpbiBvbmUgZnVuY3Rpb24gY2FsbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyBBIChwYXJ0aWFsKSBsaXN0IG9mIHNldHRpbmdzIHRvIHNldFxuICAgICAqL1xuICAgIHNldFNldHRpbmdzKHNldHRpbmdzKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNldHRpbmdzKSkge1xuICAgICAgICAgICAgaWYgKGlzRmxhZ0lkKGtleSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEZsYWdFbmFibGVkKGtleSwgc2V0dGluZ3Nba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc051bWVyaWNJZChrZXkpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXROdW1lcmljU2V0dGluZyhrZXksIHNldHRpbmdzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNUZXh0SWQoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0VGV4dFNldHRpbmcoa2V5LCBzZXR0aW5nc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzT3B0aW9uSWQoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uU2V0dGluZ1ZhbHVlKGtleSwgc2V0dGluZ3Nba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBzZXR0aW5nc1xuICAgICAqIEByZXR1cm5zIEFsbCBzZXR0aW5nIHZhbHVlcyBhcyBhbiBvYmplY3Qgd2l0aCBzZXR0aW5nIGlkcyBhcyBrZXlzXG4gICAgICovXG4gICAgZ2V0U2V0dGluZ3MoKSB7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRoaXMuZmxhZ3MuZW50cmllcygpKSB7XG4gICAgICAgICAgICBzZXR0aW5nc1trZXldID0gdmFsdWUuZmxhZztcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgc2V0dGluZ3Nba2V5XSA9IHZhbHVlLm51bWJlcjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0aGlzLnRleHRQYXJhbWV0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgc2V0dGluZ3Nba2V5XSA9IHZhbHVlLnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5vcHRpb25QYXJhbWV0ZXJzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgc2V0dGluZ3Nba2V5XSA9IHZhbHVlLnNlbGVjdGVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXR0aW5ncztcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBGbGFnIHNldHRpbmdzIGFzIGFuIGFycmF5LlxuICAgICAqIEByZXR1cm5zIEFsbCBTZXR0aW5nRmxhZyBvYmplY3RzXG4gICAgICovXG4gICAgZ2V0RmxhZ3MoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZmxhZ3MudmFsdWVzKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIFRleHQgc2V0dGluZ3MgYXMgYW4gYXJyYXkuXG4gICAgICogQHJldHVybnMgQWxsIFNldHRpbmdUZXh0IG9iamVjdHNcbiAgICAgKi9cbiAgICBnZXRUZXh0U2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudGV4dFBhcmFtZXRlcnMudmFsdWVzKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIE51bWJlciBzZXR0aW5ncyBhcyBhbiBhcnJheS5cbiAgICAgKiBAcmV0dXJucyBBbGwgU2V0dGluZ051bWJlciBvYmplY3RzXG4gICAgICovXG4gICAgZ2V0TnVtZXJpY1NldHRpbmdzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLnZhbHVlcygpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBPcHRpb24gc2V0dGluZ3MgYXMgYW4gYXJyYXkuXG4gICAgICogQHJldHVybnMgQWxsIFNldHRpbmdPcHRpb24gb2JqZWN0c1xuICAgICAqL1xuICAgIGdldE9wdGlvblNldHRpbmdzKCkge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLm9wdGlvblBhcmFtZXRlcnMudmFsdWVzKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbWl0IGV2ZW50cyB3aGVuIHNldHRpbmdzIGNoYW5nZS5cbiAgICAgKiBAcGFyYW0gZXZlbnRFbWl0dGVyXG4gICAgICovXG4gICAgX3JlZ2lzdGVyT25DaGFuZ2VFdmVudHMoZXZlbnRFbWl0dGVyKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuZmxhZ3Mua2V5cygpKSB7XG4gICAgICAgICAgICBjb25zdCBmbGFnID0gdGhpcy5mbGFncy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChmbGFnKSB7XG4gICAgICAgICAgICAgICAgZmxhZy5vbkNoYW5nZUVtaXQgPSAobmV3VmFsdWUpID0+IGV2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBTZXR0aW5nc0NoYW5nZWRFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBmbGFnLmlkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmxhZycsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBmbGFnXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMubnVtZXJpY1BhcmFtZXRlcnMua2V5cygpKSB7XG4gICAgICAgICAgICBjb25zdCBudW1iZXIgPSB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKG51bWJlcikge1xuICAgICAgICAgICAgICAgIG51bWJlci5vbkNoYW5nZUVtaXQgPSAobmV3VmFsdWUpID0+IGV2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBTZXR0aW5nc0NoYW5nZWRFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBudW1iZXIuaWQsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbmV3VmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogbnVtYmVyXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMudGV4dFBhcmFtZXRlcnMua2V5cygpKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0UGFyYW1ldGVycy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGV4dC5vbkNoYW5nZUVtaXQgPSAobmV3VmFsdWUpID0+IGV2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBTZXR0aW5nc0NoYW5nZWRFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgIGlkOiB0ZXh0LmlkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBuZXdWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiB0ZXh0XG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMub3B0aW9uUGFyYW1ldGVycy5rZXlzKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMub3B0aW9uUGFyYW1ldGVycy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChvcHRpb24pIHtcbiAgICAgICAgICAgICAgICBvcHRpb24ub25DaGFuZ2VFbWl0ID0gKG5ld1ZhbHVlKSA9PiBldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgU2V0dGluZ3NDaGFuZ2VkRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICBpZDogb3B0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnb3B0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5ld1ZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9wdGlvblxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogVGhlIGVudW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBtb3VzZSBiZWluZyBsb2NrZWQgb3IgaG92ZXJpbmdcbiAqL1xuZXhwb3J0IHZhciBDb250cm9sU2NoZW1lVHlwZTtcbihmdW5jdGlvbiAoQ29udHJvbFNjaGVtZVR5cGUpIHtcbiAgICBDb250cm9sU2NoZW1lVHlwZVtDb250cm9sU2NoZW1lVHlwZVtcIkxvY2tlZE1vdXNlXCJdID0gMF0gPSBcIkxvY2tlZE1vdXNlXCI7XG4gICAgQ29udHJvbFNjaGVtZVR5cGVbQ29udHJvbFNjaGVtZVR5cGVbXCJIb3ZlcmluZ01vdXNlXCJdID0gMV0gPSBcIkhvdmVyaW5nTW91c2VcIjtcbn0pKENvbnRyb2xTY2hlbWVUeXBlIHx8IChDb250cm9sU2NoZW1lVHlwZSA9IHt9KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db25maWcuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYSBzZXR0aW5nIHRoYXQgaGFzIGEgdGV4dCBsYWJlbCBhbmQgYW4gYXJiaXRyYXJ5IHNldHRpbmcgdmFsdWUgaXQgc3RvcmVzLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ0Jhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGlkLCBsYWJlbCwgZGVzY3JpcHRpb24sIGRlZmF1bHRTZXR0aW5nVmFsdWUsIGRlZmF1bHRPbkNoYW5nZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAvKiBEbyBub3RoaW5nLCB0byBiZSBvdmVycmlkZGVuLiAqL1xuICAgIH0pIHtcbiAgICAgICAgdGhpcy5wYXJzZVVSTFBhcmFtcygpO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZGVmYXVsdE9uQ2hhbmdlTGlzdGVuZXI7XG4gICAgICAgIHRoaXMub25DaGFuZ2VFbWl0ID0gKCkgPT4ge1xuICAgICAgICAgICAgLyogRG8gbm90aGluZywgdG8gYmUgb3ZlcnJpZGRlbi4gKi9cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGRlZmF1bHRTZXR0aW5nVmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIHNldHRpbmcuXG4gICAgICogQHBhcmFtIGxhYmVsIHNldHRpbmcgbGFiZWwuXG4gICAgICovXG4gICAgc2V0IGxhYmVsKGluTGFiZWwpIHtcbiAgICAgICAgdGhpcy5fbGFiZWwgPSBpbkxhYmVsO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlRW1pdCh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgc2V0dGluZy5cbiAgICAgKi9cbiAgICBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYWJlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybiBUaGUgc2V0dGluZydzIHZhbHVlLlxuICAgICAqL1xuICAgIGdldCB2YWx1ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHNldHRpbmcncyBzdG9yZWQgdmFsdWUuXG4gICAgICogQHBhcmFtIGluVmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNldHRpbmcuXG4gICAgICovXG4gICAgc2V0IHZhbHVlKGluVmFsdWUpIHtcbiAgICAgICAgdGhpcy5fdmFsdWUgPSBpblZhbHVlO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMuX3ZhbHVlLCB0aGlzKTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZUVtaXQodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQZXJzaXN0IHRoZSBzZXR0aW5nIHZhbHVlIGluIFVSTC5cbiAgICAgKi9cbiAgICB1cGRhdGVVUkxQYXJhbXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnVzZVVybFBhcmFtcykge1xuICAgICAgICAgICAgLy8gc2V0IHVybCBwYXJhbXNcbiAgICAgICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZVN0cmluZyA9IHRoaXMuZ2V0VmFsdWVBc1N0cmluZygpO1xuICAgICAgICAgICAgbGV0IHNldCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgX3ZhbHVlXSBvZiB1cmxQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpID09IHRoaXMuaWQudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICB1cmxQYXJhbXMuc2V0KG5hbWUsIHZhbHVlU3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzZXQpIHtcbiAgICAgICAgICAgICAgICB1cmxQYXJhbXMuc2V0KHRoaXMuaWQsIHZhbHVlU3RyaW5nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgJycsIHVybFBhcmFtcy50b1N0cmluZygpICE9PSAnJyA/IGAke2xvY2F0aW9uLnBhdGhuYW1lfT8ke3VybFBhcmFtc31gIDogYCR7bG9jYXRpb24ucGF0aG5hbWV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWxsb3dzIHN1YiB0eXBlcyB0byBwcm92aWRlIHRoZWlyIHZhbHVlIGZvciB0aGUgdXJsIHNlYXJjaCBwYXJhbXMuXG4gICAgICovXG4gICAgZ2V0VmFsdWVBc1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBwYXJzZVVSTFBhcmFtcygpIHtcbiAgICAgICAgdGhpcy5fdXJsUGFyYW1zID0ge307XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBwYXJhbXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3VybFBhcmFtc1tuYW1lLnRvTG93ZXJDYXNlKCldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFzVVJMUGFyYW0obmFtZSkge1xuICAgICAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpIGluIHRoaXMuX3VybFBhcmFtcztcbiAgICB9XG4gICAgZ2V0VVJMUGFyYW0obmFtZSkge1xuICAgICAgICBpZiAodGhpcy5oYXNVUkxQYXJhbShuYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VybFBhcmFtc1tuYW1lLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXR0aW5nQmFzZS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgU2V0dGluZ0Jhc2UgfSBmcm9tICcuL1NldHRpbmdCYXNlJztcbi8qKlxuICogQSBib29sZWFuIGZsYWcgc2V0dGluZyBvYmplY3Qgd2l0aCBhIHRleHQgbGFiZWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nRmxhZyBleHRlbmRzIFNldHRpbmdCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihpZCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBkZWZhdWx0RmxhZ1ZhbHVlLCB1c2VVcmxQYXJhbXMsIGRlZmF1bHRPbkNoYW5nZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAvKiBEbyBub3RoaW5nLCB0byBiZSBvdmVycmlkZGVuLiAqL1xuICAgIH0pIHtcbiAgICAgICAgc3VwZXIoaWQsIGxhYmVsLCBkZXNjcmlwdGlvbiwgZGVmYXVsdEZsYWdWYWx1ZSwgZGVmYXVsdE9uQ2hhbmdlTGlzdGVuZXIpO1xuICAgICAgICBpZiAoIXVzZVVybFBhcmFtcyB8fCAhdGhpcy5oYXNVUkxQYXJhbSh0aGlzLmlkKSkge1xuICAgICAgICAgICAgdGhpcy5mbGFnID0gZGVmYXVsdEZsYWdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHBhcnNlIGZsYWcgZnJvbSB1cmwgcGFyYW1ldGVyc1xuICAgICAgICAgICAgY29uc3QgdXJsUGFyYW1GbGFnID0gdGhpcy5nZXRVUkxQYXJhbSh0aGlzLmlkKTtcbiAgICAgICAgICAgIHRoaXMuZmxhZyA9IHVybFBhcmFtRmxhZy50b0xvd2VyQ2FzZSgpICE9ICdmYWxzZSc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VVcmxQYXJhbXMgPSB1c2VVcmxQYXJhbXM7XG4gICAgfVxuICAgIGdldFZhbHVlQXNTdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsYWcgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoaXMgZmxhZy5cbiAgICAgKi9cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMuZmxhZyA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm4gVGhlIHNldHRpbmcncyB2YWx1ZS5cbiAgICAgKi9cbiAgICBnZXQgZmxhZygpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy52YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBzZXR0aW5nJ3Mgc3RvcmVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSBpblZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzZXR0aW5nLlxuICAgICAqL1xuICAgIHNldCBmbGFnKGluVmFsdWUpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGluVmFsdWU7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2V0dGluZ0ZsYWcuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IFNldHRpbmdCYXNlIH0gZnJvbSAnLi9TZXR0aW5nQmFzZSc7XG4vKipcbiAqIEEgbnVtYmVyIHNldHRpbmcgb2JqZWN0IHdpdGggYSB0ZXh0IGxhYmVsLiBNaW4gYW5kIG1heCBsaW1pdCB0aGUgcmFuZ2Ugb2YgYWxsb3dlZCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nTnVtYmVyIGV4dGVuZHMgU2V0dGluZ0Jhc2Uge1xuICAgIGNvbnN0cnVjdG9yKGlkLCBsYWJlbCwgZGVzY3JpcHRpb24sIG1pbiwgbWF4LCBkZWZhdWx0TnVtYmVyLCB1c2VVcmxQYXJhbXMsIGRlZmF1bHRPbkNoYW5nZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAvKiBEbyBub3RoaW5nLCB0byBiZSBvdmVycmlkZGVuLiAqL1xuICAgIH0pIHtcbiAgICAgICAgc3VwZXIoaWQsIGxhYmVsLCBkZXNjcmlwdGlvbiwgZGVmYXVsdE51bWJlciwgZGVmYXVsdE9uQ2hhbmdlTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLl9taW4gPSBtaW47XG4gICAgICAgIHRoaXMuX21heCA9IG1heDtcbiAgICAgICAgLy8gYXR0ZW1wdCB0byByZWFkIHRoZSBudW1iZXIgZnJvbSB0aGUgdXJsIHBhcmFtc1xuICAgICAgICBpZiAoIXVzZVVybFBhcmFtcyB8fCAhdGhpcy5oYXNVUkxQYXJhbSh0aGlzLmlkKSkge1xuICAgICAgICAgICAgdGhpcy5udW1iZXIgPSBkZWZhdWx0TnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSBOdW1iZXIucGFyc2VGbG9hdCh0aGlzLmdldFVSTFBhcmFtKHRoaXMuaWQpKTtcbiAgICAgICAgICAgIHRoaXMubnVtYmVyID0gTnVtYmVyLmlzTmFOKHBhcnNlZFZhbHVlKSA/IGRlZmF1bHROdW1iZXIgOiBwYXJzZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZVVybFBhcmFtcyA9IHVzZVVybFBhcmFtcztcbiAgICB9XG4gICAgZ2V0VmFsdWVBc1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubnVtYmVyLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbnVtYmVyIHZhbHVlICh3aWxsIGJlIGNsYW1wZWQgd2l0aGluIHJhbmdlKS5cbiAgICAgKi9cbiAgICBzZXQgbnVtYmVyKG5ld051bWJlcikge1xuICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5jbGFtcChuZXdOdW1iZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIHN0b3JlZC5cbiAgICAgKi9cbiAgICBnZXQgbnVtYmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xhbXBzIGEgbnVtYmVyIGJldHdlZW4gdGhlIG1pbiBhbmQgbWF4IHZhbHVlcyAoaW5jbHVzaXZlKS5cbiAgICAgKiBAcGFyYW0gaW5OdW1iZXIgVGhlIG51bWJlciB0byBjbGFtcC5cbiAgICAgKiBAcmV0dXJucyBUaGUgY2xhbXBlZCBudW1iZXIuXG4gICAgICovXG4gICAgY2xhbXAoaW5OdW1iZXIpIHtcbiAgICAgICAgaWYgKHRoaXMuX21pbiA9PSBudWxsICYmIHRoaXMuX21heCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5OdW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fbWluID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLl9tYXgsIGluTnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl9tYXggPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHRoaXMuX21pbiwgaW5OdW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKHRoaXMuX21heCwgaW5OdW1iZXIpLCB0aGlzLl9taW4pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1pbmltdW0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyBUaGUgbWluaW11bSB2YWx1ZVxuICAgICAqL1xuICAgIGdldCBtaW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9taW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gdmFsdWVcbiAgICAgKiBAcmV0dXJucyBUaGUgbWF4aW11bSB2YWx1ZVxuICAgICAqL1xuICAgIGdldCBtYXgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXg7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNoYW5nZSBsaXN0ZW5lciB0byB0aGUgbnVtYmVyIG9iamVjdC5cbiAgICAgKi9cbiAgICBhZGRPbkNoYW5nZWRMaXN0ZW5lcihvbkNoYW5nZWRGdW5jKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBvbkNoYW5nZWRGdW5jO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldHRpbmdOdW1iZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IFNldHRpbmdCYXNlIH0gZnJvbSAnLi9TZXR0aW5nQmFzZSc7XG4vKipcbiAqIEFuIE9wdGlvbiBzZXR0aW5nIG9iamVjdCB3aXRoIGEgdGV4dCBsYWJlbC4gQWxsb3dzIHlvdSB0byBzcGVjaWZ5IGFuIGFycmF5IG9mIG9wdGlvbnMgYW5kIHNlbGVjdCBvbmUgb2YgdGhlbS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdPcHRpb24gZXh0ZW5kcyBTZXR0aW5nQmFzZSB7XG4gICAgY29uc3RydWN0b3IoaWQsIGxhYmVsLCBkZXNjcmlwdGlvbiwgZGVmYXVsdFRleHRWYWx1ZSwgb3B0aW9ucywgdXNlVXJsUGFyYW1zLCBkZWZhdWx0VXJsUGFyYW1SZXNvbHZlciA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAvKiBSZXR1cm4gdGhlIHN0cmluZyBhcy1pcyBieSBkZWZhdWx0ICovXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LCBkZWZhdWx0T25DaGFuZ2VMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgLyogRG8gbm90aGluZywgdG8gYmUgb3ZlcnJpZGRlbi4gKi9cbiAgICB9KSB7XG4gICAgICAgIHN1cGVyKGlkLCBsYWJlbCwgZGVzY3JpcHRpb24sIGRlZmF1bHRUZXh0VmFsdWUsIGRlZmF1bHRPbkNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgdGhpcy5fdXJsUGFyYW1SZXNvbHZlciA9IGRlZmF1bHRVcmxQYXJhbVJlc29sdmVyO1xuICAgICAgICBjb25zdCBzdHJpbmdUb01hdGNoID0gdGhpcy5oYXNVUkxQYXJhbSh0aGlzLmlkKVxuICAgICAgICAgICAgPyB0aGlzLl91cmxQYXJhbVJlc29sdmVyKHRoaXMuZ2V0VVJMUGFyYW0odGhpcy5pZCkpXG4gICAgICAgICAgICA6IGRlZmF1bHRUZXh0VmFsdWU7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucyAhPT0gdm9pZCAwID8gb3B0aW9ucyA6IFtzdHJpbmdUb01hdGNoXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHN0cmluZ1RvTWF0Y2g7XG4gICAgICAgIHRoaXMudXNlVXJsUGFyYW1zID0gdXNlVXJsUGFyYW1zO1xuICAgIH1cbiAgICBnZXRWYWx1ZUFzU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgY2hhbmdlIGxpc3RlbmVyIHRvIHRoZSBzZWxlY3QgZWxlbWVudC5cbiAgICAgKi9cbiAgICBhZGRPbkNoYW5nZWRMaXN0ZW5lcihvbkNoYW5nZWRGdW5jKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBvbkNoYW5nZWRGdW5jO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBBbGwgYXZhaWxhYmxlIG9wdGlvbnMgYXMgYW4gYXJyYXlcbiAgICAgKi9cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBvcHRpb25zXG4gICAgICogQHBhcmFtIHZhbHVlcyBBcnJheSBvZiBvcHRpb25zXG4gICAgICovXG4gICAgc2V0IG9wdGlvbnModmFsdWVzKSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB2YWx1ZXM7XG4gICAgICAgIHRoaXMub25DaGFuZ2VFbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBTZWxlY3RlZCBvcHRpb24gYXMgYSBzdHJpbmdcbiAgICAgKi9cbiAgICBnZXQgc2VsZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgc2VsZWN0ZWQgb3B0aW9uIGlmIGl0IG1hdGNoZXMgb25lIG9mIHRoZSBhdmFpbGFibGUgb3B0aW9uc1xuICAgICAqIEBwYXJhbSB2YWx1ZSBTZWxlY3RlZCBvcHRpb25cbiAgICAgKi9cbiAgICBzZXQgc2VsZWN0ZWQodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBvcHRpb25zIGNvbnRhaW5zIHRoZSB2YWx1ZSwgdGhlbiBzZXQgdGhhdCBhcyBzZWxlY3RlZFxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmluY2x1ZGVzKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBDb3VsZCBub3Qgc2V0IFwiJHt2YWx1ZX1cIiBhcyB0aGUgc2VsZWN0ZWQgb3B0aW9uIGZvciAke3RoaXMuaWR9IGJlY2F1c2UgaXQgd2Fzbid0IG9uZSBvZiB0aGUgb3B0aW9ucy5gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHVybCBwYXJhbWV0ZXIgcmVzb2x2ZXIgdG8gZG8gc29tZSB0cmFuc2Zvcm1hdGlvbiB0byB0aGUgc3RyaW5nIHZhbHVlXG4gICAgICogdGhhdCBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgdXJsIHBhcmFtZXRlcnMuXG4gICAgICogQHBhcmFtIHVybFBhcmFtIEEgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBleHRyYWN0ZWQgdXJsIHBhcmFtZXRlciBzdHJpbmcgZm9yIHRoaXMgc2V0dGluZyB0byBzb21ldGhpbmcgZWxzZS5cbiAgICAgKi9cbiAgICBzZXQgdXJsUGFyYW1SZXNvbHZlcih2YWx1ZSkge1xuICAgICAgICB0aGlzLl91cmxQYXJhbVJlc29sdmVyID0gdmFsdWU7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2V0dGluZ09wdGlvbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgU2V0dGluZ0Jhc2UgfSBmcm9tICcuL1NldHRpbmdCYXNlJztcbi8qKlxuICogQSB0ZXh0IHNldHRpbmcgb2JqZWN0IHdpdGggYSB0ZXh0IGxhYmVsLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ1RleHQgZXh0ZW5kcyBTZXR0aW5nQmFzZSB7XG4gICAgY29uc3RydWN0b3IoaWQsIGxhYmVsLCBkZXNjcmlwdGlvbiwgZGVmYXVsdFRleHRWYWx1ZSwgdXNlVXJsUGFyYW1zLCBkZWZhdWx0T25DaGFuZ2VMaXN0ZW5lciA9ICgpID0+IHtcbiAgICAgICAgLyogRG8gbm90aGluZywgdG8gYmUgb3ZlcnJpZGRlbi4gKi9cbiAgICB9KSB7XG4gICAgICAgIHN1cGVyKGlkLCBsYWJlbCwgZGVzY3JpcHRpb24sIGRlZmF1bHRUZXh0VmFsdWUsIGRlZmF1bHRPbkNoYW5nZUxpc3RlbmVyKTtcbiAgICAgICAgaWYgKCF1c2VVcmxQYXJhbXMgfHwgIXRoaXMuaGFzVVJMUGFyYW0odGhpcy5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dCA9IGRlZmF1bHRUZXh0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXJzZSBmbGFnIGZyb20gdXJsIHBhcmFtZXRlcnNcbiAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMuZ2V0VVJMUGFyYW0odGhpcy5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51c2VVcmxQYXJhbXMgPSB1c2VVcmxQYXJhbXM7XG4gICAgfVxuICAgIGdldFZhbHVlQXNTdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm4gVGhlIHNldHRpbmcncyB2YWx1ZS5cbiAgICAgKi9cbiAgICBnZXQgdGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc2V0dGluZydzIHN0b3JlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gaW5WYWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgc2V0dGluZy5cbiAgICAgKi9cbiAgICBzZXQgdGV4dChpblZhbHVlKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSBpblZhbHVlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldHRpbmdUZXh0LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG4vKipcbiAqIEhhbmRsZXMgdGhlIFNlbmRpbmcgYW5kIFJlY2VpdmluZyBvZiBtZXNzYWdlcyB0byB0aGUgVUUgSW5zdGFuY2UgdmlhIHRoZSBEYXRhIENoYW5uZWxcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFDaGFubmVsQ29udHJvbGxlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuaXNSZWNlaXZpbmdGcmVlemVGcmFtZSA9IGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBkYXRhY2hhbm5lbCBjb250cm9sbGVyIGluc3RhbmNlXG4gICAgICogQHJldHVybnMgdGhlIGN1cnJlbnQgRGF0YUNoYW5uZWxDb250cm9sbGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgZ2V0RGF0YUNoYW5uZWxJbnN0YW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRvIENyZWF0ZSBhbmQgU2V0IHVwIGEgRGF0YSBDaGFubmVsXG4gICAgICogQHBhcmFtIHBlZXJDb25uZWN0aW9uIC0gVGhlIFJUQyBQZWVyIENvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0gbGFiZWwgLSBMYWJlbCBvZiB0aGUgRGF0YSBDaGFubmVsXG4gICAgICogQHBhcmFtIGRhdGFjaGFubmVsT3B0aW9ucyAtIE9wdGlvbmFsIFJUQyBEYXRhQ2hhbm5lbCBvcHRpb25zXG4gICAgICovXG4gICAgY3JlYXRlRGF0YUNoYW5uZWwocGVlckNvbm5lY3Rpb24sIGxhYmVsLCBkYXRhY2hhbm5lbE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbiA9IHBlZXJDb25uZWN0aW9uO1xuICAgICAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG4gICAgICAgIHRoaXMuZGF0YWNoYW5uZWxPcHRpb25zID0gZGF0YWNoYW5uZWxPcHRpb25zO1xuICAgICAgICBpZiAoZGF0YWNoYW5uZWxPcHRpb25zID09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YWNoYW5uZWxPcHRpb25zID0ge307XG4gICAgICAgICAgICB0aGlzLmRhdGFjaGFubmVsT3B0aW9ucy5vcmRlcmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFDaGFubmVsID0gdGhpcy5wZWVyQ29ubmVjdGlvbi5jcmVhdGVEYXRhQ2hhbm5lbCh0aGlzLmxhYmVsLCB0aGlzLmRhdGFjaGFubmVsT3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2V0dXBEYXRhQ2hhbm5lbCgpO1xuICAgIH1cbiAgICBzZXR1cERhdGFDaGFubmVsKCkge1xuICAgICAgICAvL1dlIFdhbnQgYW4gQXJyYXkgQnVmZmVyIG5vdCBhIGJsb2JcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbC5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJztcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbC5vbm9wZW4gPSAoZXYpID0+IHRoaXMuaGFuZGxlT25PcGVuKGV2KTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbC5vbmNsb3NlID0gKGV2KSA9PiB0aGlzLmhhbmRsZU9uQ2xvc2UoZXYpO1xuICAgICAgICB0aGlzLmRhdGFDaGFubmVsLm9ubWVzc2FnZSA9IChldikgPT4gdGhpcy5oYW5kbGVPbk1lc3NhZ2UoZXYpO1xuICAgICAgICB0aGlzLmRhdGFDaGFubmVsLm9uZXJyb3IgPSAoZXYpID0+IHRoaXMuaGFuZGxlT25FcnJvcihldik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiB0aGUgRGF0YSBDaGFubmVsIGlzIG9wZW5lZFxuICAgICAqL1xuICAgIGhhbmRsZU9uT3Blbihldikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIExvZ2dlci5JbmZvKGBEYXRhIENoYW5uZWwgKCR7dGhpcy5sYWJlbH0pIG9wZW5lZC5gKTtcbiAgICAgICAgdGhpcy5vbk9wZW4oKF9hID0gdGhpcy5kYXRhQ2hhbm5lbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxhYmVsLCBldik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiB0aGUgRGF0YSBDaGFubmVsIGlzIGNsb3NlZFxuICAgICAqL1xuICAgIGhhbmRsZU9uQ2xvc2UoZXYpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBMb2dnZXIuSW5mbyhgRGF0YSBDaGFubmVsICgke3RoaXMubGFiZWx9KSBjbG9zZWQuYCk7XG4gICAgICAgIHRoaXMub25DbG9zZSgoX2EgPSB0aGlzLmRhdGFDaGFubmVsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGFiZWwsIGV2KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZFxuICAgICAqIEBwYXJhbSBldmVudCAtIE1lc3NhZ2UgRXZlbnRcbiAgICAgKi9cbiAgICBoYW5kbGVPbk1lc3NhZ2UoZXZlbnQpIHtcbiAgICAgICAgLy8gSGlnaGVyIGxvZyBsZXZlbCB0byBwcmV2ZW50IGxvZyBzcGFtIHdpdGggbWVzc2FnZXMgcmVjZWl2ZWRcbiAgICAgICAgTG9nZ2VyLkluZm8oYERhdGEgQ2hhbm5lbCAoJHt0aGlzLmxhYmVsfSkgbWVzc2FnZTogJHtldmVudH1gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIGFuIGVycm9yIGlzIHRocm93blxuICAgICAqIEBwYXJhbSBldmVudCAtIEVycm9yIEV2ZW50XG4gICAgICovXG4gICAgaGFuZGxlT25FcnJvcihldmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIExvZ2dlci5JbmZvKGBEYXRhIENoYW5uZWwgKCR7dGhpcy5sYWJlbH0pIGVycm9yOiAke2V2ZW50fWApO1xuICAgICAgICB0aGlzLm9uRXJyb3IoKF9hID0gdGhpcy5kYXRhQ2hhbm5lbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxhYmVsLCBldmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRvIHJlZ2lzdGVyIG9uT3BlbiBoYW5kbGVyXG4gICAgICogQHBhcmFtIGxhYmVsIERhdGEgY2hhbm5lbCBsYWJlbCAoXCJkYXRhY2hhbm5lbFwiLCBcInNlbmQtZGF0YWNoYW5uZWxcIiwgXCJyZWN2LWRhdGFjaGFubmVsXCIpXG4gICAgICogQHBhcmFtIGV2IGV2ZW50XG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uT3BlbihsYWJlbCwgZXYpIHtcbiAgICAgICAgLy8gZW1wdHkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0byByZWdpc3RlciBvbkNsb3NlIGhhbmRsZXJcbiAgICAgKiBAcGFyYW0gbGFiZWwgRGF0YSBjaGFubmVsIGxhYmVsIChcImRhdGFjaGFubmVsXCIsIFwic2VuZC1kYXRhY2hhbm5lbFwiLCBcInJlY3YtZGF0YWNoYW5uZWxcIilcbiAgICAgKiBAcGFyYW0gZXYgZXZlbnRcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgb25DbG9zZShsYWJlbCwgZXYpIHtcbiAgICAgICAgLy8gZW1wdHkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0byByZWdpc3RlciBvbkVycm9yIGhhbmRsZXJcbiAgICAgKiBAcGFyYW0gbGFiZWwgRGF0YSBjaGFubmVsIGxhYmVsIChcImRhdGFjaGFubmVsXCIsIFwic2VuZC1kYXRhY2hhbm5lbFwiLCBcInJlY3YtZGF0YWNoYW5uZWxcIilcbiAgICAgKiBAcGFyYW0gZXYgZXZlbnRcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgb25FcnJvcihsYWJlbCwgZXYpIHtcbiAgICAgICAgLy8gZW1wdHkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvblxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURhdGFDaGFubmVsQ29udHJvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuaW1wb3J0IHsgRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlY29yZCB9IGZyb20gJy4vRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3VsdHMnO1xuZXhwb3J0IGNsYXNzIERhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzaW5rLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmludGVydmFsSGFuZGxlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnNpbmsgPSBzaW5rO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgIHRoaXMucmVjb3JkcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5zZXEgPSAwO1xuICAgIH1cbiAgICBzdGFydChjb25maWcpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNSdW5uaW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMucmVjb3Jkcy5jbGVhcigpO1xuICAgICAgICB0aGlzLmludGVydmFsSGFuZGxlID0gd2luZG93LnNldEludGVydmFsKCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHRoaXMuc3RhcnRUaW1lID49IGNvbmZpZy5kdXJhdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kUmVxdWVzdChjb25maWcucmVxdWVzdFNpemUsIGNvbmZpZy5yZXNwb25zZVNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KS5iaW5kKHRoaXMpLCBNYXRoLmZsb29yKDEwMDAgLyBjb25maWcucnBzKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBzdG9wKCkge1xuICAgICAgICBpZiAodGhpcy5pbnRlcnZhbEhhbmRsZSkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbEhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLmludGVydmFsSGFuZGxlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayh0aGlzLnByb2R1Y2VSZXN1bHQoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJvZHVjZVJlc3VsdCgpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0UmVjb3JkcyA9IG5ldyBNYXAodGhpcy5yZWNvcmRzKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlY29yZHM6IHJlc3VsdFJlY29yZHMsXG4gICAgICAgICAgICBkYXRhQ2hhbm5lbFJ0dDogTWF0aC5jZWlsKEFycmF5LmZyb20odGhpcy5yZWNvcmRzLnZhbHVlcygpKS5yZWR1Y2UoKGFjYywgbmV4dCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2MgKyAobmV4dC5wbGF5ZXJSZWNlaXZlZFRpbWVzdGFtcCAtIG5leHQucGxheWVyU2VudFRpbWVzdGFtcCk7XG4gICAgICAgICAgICB9LCAwKSAvIHRoaXMucmVjb3Jkcy5zaXplKSxcbiAgICAgICAgICAgIHBsYXllclRvU3RyZWFtZXJUaW1lOiBNYXRoLmNlaWwoQXJyYXkuZnJvbSh0aGlzLnJlY29yZHMudmFsdWVzKCkpLnJlZHVjZSgoYWNjLCBuZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYyArIChuZXh0LnN0cmVhbWVyUmVjZWl2ZWRUaW1lc3RhbXAgLSBuZXh0LnBsYXllclNlbnRUaW1lc3RhbXApO1xuICAgICAgICAgICAgfSwgMCkgLyB0aGlzLnJlY29yZHMuc2l6ZSksXG4gICAgICAgICAgICBzdHJlYW1lclRvUGxheWVyVGltZTogTWF0aC5jZWlsKEFycmF5LmZyb20odGhpcy5yZWNvcmRzLnZhbHVlcygpKS5yZWR1Y2UoKGFjYywgbmV4dCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2MgKyAobmV4dC5wbGF5ZXJSZWNlaXZlZFRpbWVzdGFtcCAtIG5leHQuc3RyZWFtZXJTZW50VGltZXN0YW1wKTtcbiAgICAgICAgICAgIH0sIDApIC8gdGhpcy5yZWNvcmRzLnNpemUpLFxuICAgICAgICAgICAgZXhwb3J0TGF0ZW5jeUFzQ1NWOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNzdiA9ICdUaW1lc3RhbXA7UlRUO1BsYXllclRvU3RyZWFtZXI7U3RyZWFtZXJUb1BsYXllcjtcXG4nO1xuICAgICAgICAgICAgICAgIHJlc3VsdFJlY29yZHMuZm9yRWFjaCgocmVjb3JkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNzdiArPSByZWNvcmQucGxheWVyU2VudFRpbWVzdGFtcCArICc7JztcbiAgICAgICAgICAgICAgICAgICAgY3N2ICs9IHJlY29yZC5wbGF5ZXJSZWNlaXZlZFRpbWVzdGFtcCAtIHJlY29yZC5wbGF5ZXJTZW50VGltZXN0YW1wICsgJzsnO1xuICAgICAgICAgICAgICAgICAgICBjc3YgKz0gcmVjb3JkLnN0cmVhbWVyUmVjZWl2ZWRUaW1lc3RhbXAgLSByZWNvcmQucGxheWVyU2VudFRpbWVzdGFtcCArICc7JztcbiAgICAgICAgICAgICAgICAgICAgY3N2ICs9IHJlY29yZC5wbGF5ZXJSZWNlaXZlZFRpbWVzdGFtcCAtIHJlY29yZC5zdHJlYW1lclNlbnRUaW1lc3RhbXAgKyAnOyc7XG4gICAgICAgICAgICAgICAgICAgIGNzdiArPSAnXFxuJztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3N2O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICBpc1J1bm5pbmcoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuaW50ZXJ2YWxIYW5kbGU7XG4gICAgfVxuICAgIHJlY2VpdmUocmVzcG9uc2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzUnVubmluZygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgICAgTG9nZ2VyLkVycm9yKCdVbmRlZmluZWQgcmVzcG9uc2UgZnJvbSBzZXJ2ZXInKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLnJlY29yZHMuZ2V0KHJlc3BvbnNlLlNlcSk7XG4gICAgICAgIGlmIChyZWNvcmQpIHtcbiAgICAgICAgICAgIHJlY29yZC51cGRhdGUocmVzcG9uc2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNlbmRSZXF1ZXN0KHJlcXVlc3RTaXplLCByZXNwb25zZVNpemUpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuY3JlYXRlUmVxdWVzdChyZXF1ZXN0U2l6ZSwgcmVzcG9uc2VTaXplKTtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gbmV3IERhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZWNvcmQocmVxdWVzdCk7XG4gICAgICAgIHRoaXMucmVjb3Jkcy5zZXQocmVjb3JkLnNlcSwgcmVjb3JkKTtcbiAgICAgICAgdGhpcy5zaW5rKHJlcXVlc3QpO1xuICAgIH1cbiAgICBjcmVhdGVSZXF1ZXN0KHJlcXVlc3RTaXplLCByZXNwb25zZVNpemUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIFNlcTogdGhpcy5zZXErKyxcbiAgICAgICAgICAgIEZpbGxSZXNwb25zZVNpemU6IHJlc3BvbnNlU2l6ZSxcbiAgICAgICAgICAgIEZpbGxlcjogcmVxdWVzdFNpemUgPyAnQScucmVwZWF0KHJlcXVlc3RTaXplKSA6ICcnXG4gICAgICAgIH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF0YUNoYW5uZWxMYXRlbmN5VGVzdENvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmV4cG9ydCBjbGFzcyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVjb3JkIHtcbiAgICBjb25zdHJ1Y3RvcihyZXF1ZXN0KSB7XG4gICAgICAgIHRoaXMuc2VxID0gcmVxdWVzdC5TZXE7XG4gICAgICAgIHRoaXMucGxheWVyU2VudFRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMucmVxdWVzdEZpbGxlclNpemUgPSByZXF1ZXN0LkZpbGxlciA/IHJlcXVlc3QuRmlsbGVyLmxlbmd0aCA6IDA7XG4gICAgfVxuICAgIHVwZGF0ZShyZXNwb25zZSkge1xuICAgICAgICB0aGlzLnBsYXllclJlY2VpdmVkVGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgICAgICAgdGhpcy5zdHJlYW1lclJlY2VpdmVkVGltZXN0YW1wID0gcmVzcG9uc2UuUmVjZWl2ZWRUaW1lc3RhbXA7XG4gICAgICAgIHRoaXMuc3RyZWFtZXJTZW50VGltZXN0YW1wID0gcmVzcG9uc2UuU2VudFRpbWVzdGFtcDtcbiAgICAgICAgdGhpcy5yZXNwb25zZUZpbGxlclNpemUgPSByZXNwb25zZS5GaWxsZXIgPyByZXNwb25zZS5GaWxsZXIubGVuZ3RoIDogMDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzdWx0cy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuLyoqXG4gKiBBIGNsYXNzIGZvciBzZW5kaW5nIGRhdGEgY2hhbm5lbCBtZXNzYWdlc1xuICovXG5leHBvcnQgY2xhc3MgRGF0YUNoYW5uZWxTZW5kZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBkYXRhQ2hhbm5lbFByb3ZpZGVyIC0gRGF0YSBjaGFubmVsIG9iamVjdCB0eXBlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZGF0YUNoYW5uZWxQcm92aWRlcikge1xuICAgICAgICB0aGlzLmRhdGFDaGFubmVsUHJvdmlkZXIgPSBkYXRhQ2hhbm5lbFByb3ZpZGVyO1xuICAgIH1cbiAgICBjYW5TZW5kKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZGF0YUNoYW5uZWxQcm92aWRlci5nZXREYXRhQ2hhbm5lbEluc3RhbmNlKCkuZGF0YUNoYW5uZWwgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbFByb3ZpZGVyLmdldERhdGFDaGFubmVsSW5zdGFuY2UoKS5kYXRhQ2hhbm5lbC5yZWFkeVN0YXRlID09ICdvcGVuJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgRGF0YSBvdmVyIHRoZSBEYXRhIGNoYW5uZWwgdG8gdGhlIFVFIEluc3RhbmNlXG4gICAgICogQHBhcmFtIGRhdGEgLSBNZXNzYWdlIERhdGEgQXJyYXkgQnVmZmVyXG4gICAgICovXG4gICAgc2VuZERhdGEoZGF0YSkge1xuICAgICAgICAvLyByZXNldCB0aGUgYWZrIGluYWN0aXZpdHlcbiAgICAgICAgY29uc3QgZGF0YUNoYW5uZWxJbnN0YW5jZSA9IHRoaXMuZGF0YUNoYW5uZWxQcm92aWRlci5nZXREYXRhQ2hhbm5lbEluc3RhbmNlKCk7XG4gICAgICAgIGlmIChkYXRhQ2hhbm5lbEluc3RhbmNlLmRhdGFDaGFubmVsLnJlYWR5U3RhdGUgPT0gJ29wZW4nKSB7XG4gICAgICAgICAgICBkYXRhQ2hhbm5lbEluc3RhbmNlLmRhdGFDaGFubmVsLnNlbmQoZGF0YSk7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbyhgTWVzc2FnZSBTZW50OiAke25ldyBVaW50OEFycmF5KGRhdGEpfWApO1xuICAgICAgICAgICAgdGhpcy5yZXNldEFma1dhcm5pbmdUaW1lck9uRGF0YVNlbmQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcihgTWVzc2FnZSBGYWlsZWQ6ICR7bmV3IFVpbnQ4QXJyYXkoZGF0YSl9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3ZlcnJpZGUgbWV0aG9kIGZvciByZXNldHRpbmcgdGhlIEFmayB3YXJuaW5nIHRpbWVyIHdoZW4gZGF0YSBpcyBzZW50IG92ZXIgdGhlIGRhdGEgY2hhbm5lbFxuICAgICAqL1xuICAgIHJlc2V0QWZrV2FybmluZ1RpbWVyT25EYXRhU2VuZCgpIHtcbiAgICAgICAgLy8gQmFzZSBGdW5jdGlvbmFsaXR5OiBEbyBOb3RoaW5nXG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGF0YUNoYW5uZWxTZW5kZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogTGF0ZW5jeSBUZXN0IFJlc3VsdHMgRGF0YVxuICovXG5leHBvcnQgY2xhc3MgSW5pdGlhbFNldHRpbmdzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5QaXhlbFN0cmVhbWluZ1NldHRpbmdzID0gbmV3IFBpeGVsU3RyZWFtaW5nU2V0dGluZ3MoKTtcbiAgICAgICAgdGhpcy5FbmNvZGVyU2V0dGluZ3MgPSBuZXcgRW5jb2RlclNldHRpbmdzKCk7XG4gICAgICAgIHRoaXMuV2ViUlRDU2V0dGluZ3MgPSBuZXcgV2ViUlRDU2V0dGluZ3MoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEZQUyBhbmQgTWF4RlBTIHN0YXRzIGJldHdlZW4gNC4yNyBhbmQgNVxuICAgICAqL1xuICAgIHVlQ29tcGF0aWJsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuV2ViUlRDU2V0dGluZ3MuTWF4RlBTICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuV2ViUlRDU2V0dGluZ3MuRlBTID0gdGhpcy5XZWJSVENTZXR0aW5ncy5NYXhGUFM7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEEgY2xhc3MgZm9yIGhhbmRsaW5nIFBpeGVsIFN0cmVhbWluZyBkZXRhaWxzXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXhlbFN0cmVhbWluZ1NldHRpbmdzIHtcbn1cbi8qKlxuICogQSBjbGFzcyBmb3IgaGFuZGxpbmcgZW5jb2RlciBzdGF0c1xuICovXG5leHBvcnQgY2xhc3MgRW5jb2RlclNldHRpbmdzIHtcbn1cbi8qKlxuICogQSBjbGFzcyBmb3IgaGFuZGxpbmcgd2ViIHJ0YyBzdGF0c1xuICovXG5leHBvcnQgY2xhc3MgV2ViUlRDU2V0dGluZ3Mge1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5pdGlhbFNldHRpbmdzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG4vKipcbiAqIExhdGVuY3kgVGVzdCBSZXN1bHRzIERhdGFcbiAqL1xuZXhwb3J0IGNsYXNzIExhdGVuY3lUZXN0UmVzdWx0cyB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vRmllbGRzIFNldCBmcm9tIHRoZSBsYXRlbmN5IHBheWxvYWQgcmVnYXJkbGVzcyBvZiB2ZXJzaW9uXG4gICAgICAgIHRoaXMuUmVjZWlwdFRpbWVNcyA9IG51bGw7XG4gICAgICAgIHRoaXMuVHJhbnNtaXNzaW9uVGltZU1zID0gbnVsbDtcbiAgICAgICAgLy9GaWVsZHMgU2V0IGZyb20gdGhlIGxhdGVuY3kgcGF5bG9hZCBmcm9tIDQuMjcuMlxuICAgICAgICB0aGlzLlByZUNhcHR1cmVUaW1lTXMgPSBudWxsO1xuICAgICAgICB0aGlzLlBvc3RDYXB0dXJlVGltZU1zID0gbnVsbDtcbiAgICAgICAgdGhpcy5QcmVFbmNvZGVUaW1lTXMgPSBudWxsO1xuICAgICAgICB0aGlzLlBvc3RFbmNvZGVUaW1lTXMgPSBudWxsO1xuICAgICAgICAvL0ZpZWxkcyBTZXQgZnJvbSB0aGUgbGF0ZW5jeSBwYXlsb2FkIGZyb20gNS4wXG4gICAgICAgIHRoaXMuRW5jb2RlTXMgPSBudWxsO1xuICAgICAgICB0aGlzLkNhcHR1cmVUb1NlbmRNcyA9IG51bGw7XG4gICAgICAgIC8vRmllbGRzIFNldCB3aGVuIHByb2Nlc3NlZFxuICAgICAgICB0aGlzLnRlc3RTdGFydFRpbWVNcyA9IDA7XG4gICAgICAgIHRoaXMuYnJvd3NlclJlY2VpcHRUaW1lTXMgPSAwO1xuICAgICAgICAvL0ZpZWxkcyBzZXQgZnJvbSBjYWxjdWxhdGlvbnNcbiAgICAgICAgdGhpcy5sYXRlbmN5RXhjbHVkaW5nRGVjb2RlID0gMDtcbiAgICAgICAgdGhpcy50ZXN0RHVyYXRpb24gPSAwO1xuICAgICAgICAvL3VlTGF0ZW5jeTogbnVtYmVyID0gMDtcbiAgICAgICAgdGhpcy5uZXR3b3JrTGF0ZW5jeSA9IDA7XG4gICAgICAgIHRoaXMuYnJvd3NlclNlbmRMYXRlbmN5ID0gMDtcbiAgICAgICAgdGhpcy5mcmFtZURpc3BsYXlEZWx0YVRpbWVNcyA9IDA7XG4gICAgICAgIHRoaXMuZW5kVG9FbmRMYXRlbmN5ID0gMDtcbiAgICAgICAgLy91ZVBpeGVsU3RyZWFtTGF0ZW5jeTogbnVtYmVyID0gMDtcbiAgICAgICAgdGhpcy5lbmNvZGVMYXRlbmN5ID0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgRGVsdGEgVGltZSBNaWxsaXNlY29uZHNcbiAgICAgKiBAcGFyYW0gRGVsdGFUaW1lTXMgLSBEZWx0YSBUaW1lIE1pbGxpc2Vjb25kc1xuICAgICAqL1xuICAgIHNldEZyYW1lRGlzcGxheURlbHRhVGltZShEZWx0YVRpbWVNcykge1xuICAgICAgICBpZiAodGhpcy5mcmFtZURpc3BsYXlEZWx0YVRpbWVNcyA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmZyYW1lRGlzcGxheURlbHRhVGltZU1zID0gTWF0aC5yb3VuZChEZWx0YVRpbWVNcyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgZW5jb2RlciB0aW1lcyBhbmQgc2V0IHRoZW1cbiAgICAgKi9cbiAgICBwcm9jZXNzRmllbGRzKCkge1xuICAgICAgICBpZiAodGhpcy5FbmNvZGVNcyA9PSBudWxsICYmICh0aGlzLlByZUVuY29kZVRpbWVNcyAhPSBudWxsIHx8IHRoaXMuUG9zdEVuY29kZVRpbWVNcyAhPSBudWxsKSkge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oYFNldHRpbmcgRW5jb2RlIE1zIFxcbiAke3RoaXMuUG9zdEVuY29kZVRpbWVNc30gXFxuICR7dGhpcy5QcmVFbmNvZGVUaW1lTXN9YCk7XG4gICAgICAgICAgICB0aGlzLkVuY29kZU1zID0gdGhpcy5Qb3N0RW5jb2RlVGltZU1zIC0gdGhpcy5QcmVFbmNvZGVUaW1lTXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuQ2FwdHVyZVRvU2VuZE1zID09IG51bGwgJiZcbiAgICAgICAgICAgICh0aGlzLlByZUNhcHR1cmVUaW1lTXMgIT0gbnVsbCB8fCB0aGlzLlBvc3RDYXB0dXJlVGltZU1zICE9IG51bGwpKSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbyhgU2V0dGluZyBDYXB0dXJlVG9TZW5kTXMgTXMgXFxuICR7dGhpcy5Qb3N0Q2FwdHVyZVRpbWVNc30gXFxuICR7dGhpcy5QcmVDYXB0dXJlVGltZU1zfWApO1xuICAgICAgICAgICAgdGhpcy5DYXB0dXJlVG9TZW5kTXMgPSB0aGlzLlBvc3RDYXB0dXJlVGltZU1zIC0gdGhpcy5QcmVDYXB0dXJlVGltZU1zO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TGF0ZW5jeVRlc3RSZXN1bHRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIEEgY2xhc3MgZm9yIG1hbmFnaW5nIHRoZSBmcmVlemUgZnJhbWUgb2JqZWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBGcmVlemVGcmFtZSB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgZnJlZXplIGZyYW1lXG4gICAgICogQHBhcmFtIHJvb3REaXYgdGhlIGRpdiB0aGF0IGEgZnJlZXplIGZyYW1lIGVsZW1lbnQgd2lsbCBiZSBpbmplY3RlZCBpbnRvXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iocm9vdERpdikge1xuICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lSGVpZ2h0ID0gMDtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZVdpZHRoID0gMDtcbiAgICAgICAgdGhpcy5yb290RGl2ID0gcm9vdERpdjtcbiAgICAgICAgLy8gY3JlYXRlIHRoZSBvdmVybGF5XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5pZCA9ICdmcmVlemVGcmFtZSc7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5zdHlsZS56SW5kZXggPSAnMjAnO1xuICAgICAgICAvLyBjcmVhdGUgdGhlIGltYWdlIHBsYWNlIGhvbGRlclxuICAgICAgICB0aGlzLmltYWdlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgICB0aGlzLmltYWdlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIC8vIGFwcGVuZCB0aGUgaW1hZ2UgaW50byB0aGUgcm9vdCBlbGVtZW50IGFuZCBhcHBlbmQgdGhlIGVsZW1lbnQgdG8gdGhlIHJvb3QgZGl2XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5pbWFnZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQodGhpcy5yb290RWxlbWVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZnJlZXplIGZyYW1lIGVsZW1lbnQgZm9yIHNob3dpbmdcbiAgICAgKi9cbiAgICBzZXRFbGVtZW50Rm9yU2hvdygpIHtcbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBmcmVlemUgZnJhbWUgZWxlbWVudCBmb3IgaGlkaW5nXG4gICAgICovXG4gICAgc2V0RWxlbWVudEZvckhpZGUoKSB7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBmcmVlemUgZnJhbWVzIGltYWdlIHNvdXJjZVxuICAgICAqIEBwYXJhbSBqcGVnIC0gdGhlIGZyZWV6ZSBmcmFtZSBpbWFnZSBhcyBhIGJ5dGUgYXJyYXkgZGF0YVxuICAgICAqL1xuICAgIHVwZGF0ZUltYWdlRWxlbWVudFNvdXJjZShqcGVnKSB7XG4gICAgICAgIGNvbnN0IGJhc2U2NCA9IGJ0b2EoanBlZy5yZWR1Y2UoKGRhdGEsIGJ5dGUpID0+IGRhdGEgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGUpLCAnJykpO1xuICAgICAgICB0aGlzLmltYWdlRWxlbWVudC5zcmMgPSAnZGF0YTppbWFnZS9qcGVnO2Jhc2U2NCwnICsgYmFzZTY0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRpbWVuc2lvbnMgZm9yIHRoZSBmcmVlemUgZnJhbWUgZnJvbSB0aGUgZWxlbWVudCBhbmQgcmVzaXplIGl0XG4gICAgICovXG4gICAgc2V0RGltZW5zaW9uc0Zyb21FbGVtZW50QW5kUmVzaXplKCkge1xuICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lSGVpZ2h0ID0gdGhpcy5pbWFnZUVsZW1lbnQubmF0dXJhbEhlaWdodDtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZVdpZHRoID0gdGhpcy5pbWFnZUVsZW1lbnQubmF0dXJhbFdpZHRoO1xuICAgICAgICB0aGlzLnJlc2l6ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemUgYSBmcmVlemUgZnJhbWUgZWxlbWVudFxuICAgICAqL1xuICAgIHJlc2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZnJlZXplRnJhbWVXaWR0aCAhPT0gMCAmJiB0aGlzLmZyZWV6ZUZyYW1lSGVpZ2h0ICE9PSAwKSB7XG4gICAgICAgICAgICBsZXQgZGlzcGxheVdpZHRoID0gMDtcbiAgICAgICAgICAgIGxldCBkaXNwbGF5SGVpZ2h0ID0gMDtcbiAgICAgICAgICAgIGxldCBkaXNwbGF5VG9wID0gMDtcbiAgICAgICAgICAgIGxldCBkaXNwbGF5TGVmdCA9IDA7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRBc3BlY3RSYXRpbyA9IHRoaXMucm9vdERpdi5jbGllbnRXaWR0aCAvIHRoaXMucm9vdERpdi5jbGllbnRIZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCB2aWRlb0FzcGVjdFJhdGlvID0gdGhpcy5mcmVlemVGcmFtZVdpZHRoIC8gdGhpcy5mcmVlemVGcmFtZUhlaWdodDtcbiAgICAgICAgICAgIGlmIChwYXJlbnRBc3BlY3RSYXRpbyA8IHZpZGVvQXNwZWN0UmF0aW8pIHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGggPSB0aGlzLnJvb3REaXYuY2xpZW50V2lkdGg7XG4gICAgICAgICAgICAgICAgZGlzcGxheUhlaWdodCA9IE1hdGguZmxvb3IodGhpcy5yb290RGl2LmNsaWVudFdpZHRoIC8gdmlkZW9Bc3BlY3RSYXRpbyk7XG4gICAgICAgICAgICAgICAgZGlzcGxheVRvcCA9IE1hdGguZmxvb3IoKHRoaXMucm9vdERpdi5jbGllbnRIZWlnaHQgLSBkaXNwbGF5SGVpZ2h0KSAqIDAuNSk7XG4gICAgICAgICAgICAgICAgZGlzcGxheUxlZnQgPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGlzcGxheVdpZHRoID0gTWF0aC5mbG9vcih0aGlzLnJvb3REaXYuY2xpZW50SGVpZ2h0ICogdmlkZW9Bc3BlY3RSYXRpbyk7XG4gICAgICAgICAgICAgICAgZGlzcGxheUhlaWdodCA9IHRoaXMucm9vdERpdi5jbGllbnRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgZGlzcGxheVRvcCA9IDA7XG4gICAgICAgICAgICAgICAgZGlzcGxheUxlZnQgPSBNYXRoLmZsb29yKCh0aGlzLnJvb3REaXYuY2xpZW50V2lkdGggLSBkaXNwbGF5V2lkdGgpICogMC41KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUud2lkdGggPSB0aGlzLnJvb3REaXYub2Zmc2V0V2lkdGggKyAncHgnO1xuICAgICAgICAgICAgdGhpcy5yb290RWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLnJvb3REaXYub2Zmc2V0SGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuc3R5bGUubGVmdCA9IDAgKyAncHgnO1xuICAgICAgICAgICAgdGhpcy5yb290RWxlbWVudC5zdHlsZS50b3AgPSAwICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VFbGVtZW50LnN0eWxlLndpZHRoID0gZGlzcGxheVdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VFbGVtZW50LnN0eWxlLmhlaWdodCA9IGRpc3BsYXlIZWlnaHQgKyAncHgnO1xuICAgICAgICAgICAgdGhpcy5pbWFnZUVsZW1lbnQuc3R5bGUubGVmdCA9IGRpc3BsYXlMZWZ0ICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VFbGVtZW50LnN0eWxlLnRvcCA9IGRpc3BsYXlUb3AgKyAncHgnO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RnJlZXplRnJhbWUuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IEZyZWV6ZUZyYW1lIH0gZnJvbSAnLi9GcmVlemVGcmFtZSc7XG4vKipcbiAqIEEgY2xhc3MgZm9yIGNvbnRyb2xsaW5nIGZyZWV6ZSBmcmFtZSBmdW5jdGlvbmFsaXR5XG4gKi9cbmV4cG9ydCBjbGFzcyBGcmVlemVGcmFtZUNvbnRyb2xsZXIge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIGZyZWV6ZSBmcmFtZSBjb250cm9sbGVyXG4gICAgICogQHBhcmFtIHJvb3REaXYgLSB0aGUgZGl2IHRoYXQgYSBmcmVlemUgZnJhbWUgZWxlbWVudCB3aWxsIGJlIGluamVjdGVkIGludG9cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihyb290RGl2KSB7XG4gICAgICAgIHRoaXMucmVjZWl2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuanBlZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lRGVsYXkgPSA1MDtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZSA9IG5ldyBGcmVlemVGcmFtZShyb290RGl2KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvdyB0aGUgZnJlZXplIGZyYW1lIGlmIGl0IGlzIHZhbGlkXG4gICAgICovXG4gICAgc2hvd0ZyZWV6ZUZyYW1lKCkge1xuICAgICAgICBpZiAodGhpcy52YWxpZCkge1xuICAgICAgICAgICAgdGhpcy5mcmVlemVGcmFtZS5zZXRFbGVtZW50Rm9yU2hvdygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhpZGUgdGhlIGZyZWV6ZSBmcmFtZSBhbmQgc2V0IHRoZSB2YWxpZGl0eSB0byBmYWxzZVxuICAgICAqL1xuICAgIGhpZGVGcmVlemVGcmFtZSgpIHtcbiAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lLnNldEVsZW1lbnRGb3JIaWRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgZnJlZXplIGZyYW1lcyBpbWFnZSBzb3VyY2UgYW5kIGxvYWQgaXRcbiAgICAgKiBAcGFyYW0ganBlZyAtIHRoZSBmcmVlemUgZnJhbWUgaW1hZ2UgYXMgYSBieXRlIGFycmF5IGRhdGFcbiAgICAgKiBAcGFyYW0gb25Mb2FkQ2FsbEJhY2sgLSBhIGNhbGwgYmFjayBmb3IgbWFuYWdpbmcgaWYgdGhlIHBsYXkgb3ZlcmxheSBuZWVkcyB0byBiZSBzaG93biBvciBub3RcbiAgICAgKi9cbiAgICB1cGRhdGVGcmVlemVGcmFtZUFuZFNob3coanBlZywgb25Mb2FkQ2FsbEJhY2spIHtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZS51cGRhdGVJbWFnZUVsZW1lbnRTb3VyY2UoanBlZyk7XG4gICAgICAgIHRoaXMuZnJlZXplRnJhbWUuaW1hZ2VFbGVtZW50Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZnJlZXplRnJhbWUuc2V0RGltZW5zaW9uc0Zyb21FbGVtZW50QW5kUmVzaXplKCk7XG4gICAgICAgICAgICBvbkxvYWRDYWxsQmFjaygpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSBuZXcgZnJlZXplIGZyYW1lIGltYWdlIGFuZCB1cGRhdGUgaXRcbiAgICAgKiBAcGFyYW0gdmlldyAtIHRoZSBmcmVlemUgZnJhbWUgaW1hZ2UgYXMgYSBieXRlIGFycmF5IGRhdGFcbiAgICAgKiBAcGFyYW0gb25Mb2FkQ2FsbEJhY2sgLSBhIGNhbGwgYmFjayBmb3IgbWFuYWdpbmcgaWYgdGhlIHBsYXkgb3ZlcmxheSBuZWVkcyB0byBiZSBzaG93biBvciBub3RcbiAgICAgKi9cbiAgICBwcm9jZXNzRnJlZXplRnJhbWVNZXNzYWdlKHZpZXcsIG9uTG9hZENhbGxCYWNrKSB7XG4gICAgICAgIC8vIFJlc2V0IGZyZWV6ZSBmcmFtZSBpZiB3ZSBnb3QgYSBmcmVlemUgZnJhbWUgbWVzc2FnZSBhbmQgd2UgYXJlIG5vdCBcInJlY2VpdmluZ1wiIHlldC5cbiAgICAgICAgaWYgKCF0aGlzLnJlY2VpdmluZykge1xuICAgICAgICAgICAgdGhpcy5yZWNlaXZpbmcgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zaXplID0gMDtcbiAgICAgICAgICAgIHRoaXMuanBlZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBFeHRyYWN0IHRvdGFsIHNpemUgb2YgZnJlZXplIGZyYW1lIChhY3Jvc3MgYWxsIGNodW5rcylcbiAgICAgICAgdGhpcy5zaXplID0gbmV3IERhdGFWaWV3KHZpZXcuc2xpY2UoMSwgNSkuYnVmZmVyKS5nZXRJbnQzMigwLCB0cnVlKTtcbiAgICAgICAgLy8gR2V0IHRoZSBqcGVnIHBhcnQgb2YgdGhlIHBheWxvYWRcbiAgICAgICAgY29uc3QganBlZ0J5dGVzID0gdmlldy5zbGljZSgxICsgNCk7XG4gICAgICAgIC8vIEFwcGVuZCB0byBleGlzdGluZyBqcGVnIHRoYXQgaG9sZHMgdGhlIGZyZWV6ZSBmcmFtZVxuICAgICAgICBpZiAodGhpcy5qcGVnKSB7XG4gICAgICAgICAgICBjb25zdCBqcGVnID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5qcGVnLmxlbmd0aCArIGpwZWdCeXRlcy5sZW5ndGgpO1xuICAgICAgICAgICAganBlZy5zZXQodGhpcy5qcGVnLCAwKTtcbiAgICAgICAgICAgIGpwZWcuc2V0KGpwZWdCeXRlcywgdGhpcy5qcGVnLmxlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLmpwZWcgPSBqcGVnO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGV4aXN0aW5nIGZyZWV6ZSBmcmFtZSBqcGVnLCBtYWtlIG9uZVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuanBlZyA9IGpwZWdCeXRlcztcbiAgICAgICAgICAgIHRoaXMucmVjZWl2aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKGByZWNlaXZlZCBmaXJzdCBjaHVuayBvZiBmcmVlemUgZnJhbWU6ICR7dGhpcy5qcGVnLmxlbmd0aH0vJHt0aGlzLnNpemV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmluaXNoZWQgcmVjZWl2aW5nIGZyZWV6ZSBmcmFtZSwgd2UgY2FuIHNob3cgaXQgbm93XG4gICAgICAgIGlmICh0aGlzLmpwZWcubGVuZ3RoID09PSB0aGlzLnNpemUpIHtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2aW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKGByZWNlaXZlZCBjb21wbGV0ZSBmcmVlemUgZnJhbWUgJHt0aGlzLnNpemV9YCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUZyZWV6ZUZyYW1lQW5kU2hvdyh0aGlzLmpwZWcsIG9uTG9hZENhbGxCYWNrKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSByZWNlaXZlZCBtb3JlIGRhdGEgdGhhbiB0aGUgZnJlZXplIGZyYW1lIHBheWxvYWQgbWVzc2FnZSBpbmRpY2F0ZSAodGhpcyBpcyBhbiBlcnJvcilcbiAgICAgICAgZWxzZSBpZiAodGhpcy5qcGVnLmxlbmd0aCA+IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGByZWNlaXZlZCBiaWdnZXIgZnJlZXplIGZyYW1lIHRoYW4gYWR2ZXJ0aXNlZDogJHt0aGlzLmpwZWcubGVuZ3RofS8ke3RoaXMuc2l6ZX1gKTtcbiAgICAgICAgICAgIHRoaXMuanBlZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMucmVjZWl2aW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GcmVlemVGcmFtZUNvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IGRlZXBDb3B5R2FtZXBhZCB9IGZyb20gJy4vR2FtZXBhZFR5cGVzJztcbi8qKlxuICogR2FtZXBhZCBsYXlvdXQgY29kZXMgZW51bVxuICovXG5leHBvcnQgdmFyIEdhbWVwYWRMYXlvdXQ7XG4oZnVuY3Rpb24gKEdhbWVwYWRMYXlvdXQpIHtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJSaWdodENsdXN0ZXJCb3R0b21CdXR0b25cIl0gPSAwXSA9IFwiUmlnaHRDbHVzdGVyQm90dG9tQnV0dG9uXCI7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiUmlnaHRDbHVzdGVyUmlnaHRCdXR0b25cIl0gPSAxXSA9IFwiUmlnaHRDbHVzdGVyUmlnaHRCdXR0b25cIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJSaWdodENsdXN0ZXJMZWZ0QnV0dG9uXCJdID0gMl0gPSBcIlJpZ2h0Q2x1c3RlckxlZnRCdXR0b25cIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJSaWdodENsdXN0ZXJUb3BCdXR0b25cIl0gPSAzXSA9IFwiUmlnaHRDbHVzdGVyVG9wQnV0dG9uXCI7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiTGVmdFNob3VsZGVyXCJdID0gNF0gPSBcIkxlZnRTaG91bGRlclwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIlJpZ2h0U2hvdWxkZXJcIl0gPSA1XSA9IFwiUmlnaHRTaG91bGRlclwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIkxlZnRUcmlnZ2VyXCJdID0gNl0gPSBcIkxlZnRUcmlnZ2VyXCI7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiUmlnaHRUcmlnZ2VyXCJdID0gN10gPSBcIlJpZ2h0VHJpZ2dlclwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIlNlbGVjdE9yQmFja1wiXSA9IDhdID0gXCJTZWxlY3RPckJhY2tcIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJTdGFydE9yRm9yd2FyZFwiXSA9IDldID0gXCJTdGFydE9yRm9yd2FyZFwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIkxlZnRBbmFsb2dQcmVzc1wiXSA9IDEwXSA9IFwiTGVmdEFuYWxvZ1ByZXNzXCI7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiUmlnaHRBbmFsb2dQcmVzc1wiXSA9IDExXSA9IFwiUmlnaHRBbmFsb2dQcmVzc1wiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIkxlZnRDbHVzdGVyVG9wQnV0dG9uXCJdID0gMTJdID0gXCJMZWZ0Q2x1c3RlclRvcEJ1dHRvblwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIkxlZnRDbHVzdGVyQm90dG9tQnV0dG9uXCJdID0gMTNdID0gXCJMZWZ0Q2x1c3RlckJvdHRvbUJ1dHRvblwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIkxlZnRDbHVzdGVyTGVmdEJ1dHRvblwiXSA9IDE0XSA9IFwiTGVmdENsdXN0ZXJMZWZ0QnV0dG9uXCI7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiTGVmdENsdXN0ZXJSaWdodEJ1dHRvblwiXSA9IDE1XSA9IFwiTGVmdENsdXN0ZXJSaWdodEJ1dHRvblwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIkNlbnRyZUJ1dHRvblwiXSA9IDE2XSA9IFwiQ2VudHJlQnV0dG9uXCI7XG4gICAgLy8gQXhlc1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIkxlZnRTdGlja0hvcml6b250YWxcIl0gPSAwXSA9IFwiTGVmdFN0aWNrSG9yaXpvbnRhbFwiO1xuICAgIEdhbWVwYWRMYXlvdXRbR2FtZXBhZExheW91dFtcIkxlZnRTdGlja1ZlcnRpY2FsXCJdID0gMV0gPSBcIkxlZnRTdGlja1ZlcnRpY2FsXCI7XG4gICAgR2FtZXBhZExheW91dFtHYW1lcGFkTGF5b3V0W1wiUmlnaHRTdGlja0hvcml6b250YWxcIl0gPSAyXSA9IFwiUmlnaHRTdGlja0hvcml6b250YWxcIjtcbiAgICBHYW1lcGFkTGF5b3V0W0dhbWVwYWRMYXlvdXRbXCJSaWdodFN0aWNrVmVydGljYWxcIl0gPSAzXSA9IFwiUmlnaHRTdGlja1ZlcnRpY2FsXCI7XG59KShHYW1lcGFkTGF5b3V0IHx8IChHYW1lcGFkTGF5b3V0ID0ge30pKTtcbi8qKlxuICogSGFuZGxlcyBnYW1lcGFkIGV2ZW50cyBmcm9tIHRoZSBkb2N1bWVudCB0byBzZW5kIHRvIHRoZSBzdHJlYW1lci5cbiAqL1xuZXhwb3J0IGNsYXNzIEdhbWVwYWRDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJlYW1NZXNzYWdlQ29udHJvbGxlcikge1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyID0gc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMub25HYW1lcGFkQ29ubmVjdGVkTGlzdGVuZXIgPSB0aGlzLm9uR2FtZXBhZENvbm5lY3RlZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uR2FtZXBhZERpc2Nvbm5lY3RlZExpc3RlbmVyID0gdGhpcy5vbkdhbWVwYWREaXNjb25uZWN0ZWQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5iZWZvcmVVbmxvYWRMaXN0ZW5lciA9IHRoaXMub25CZWZvcmVVbmxvYWQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSAod2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICAgICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSkuYmluZCh3aW5kb3cpO1xuICAgIH1cbiAgICByZWdpc3RlcigpIHtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIHRoaXMuYmVmb3JlVW5sb2FkTGlzdGVuZXIpO1xuICAgICAgICBjb25zdCBicm93c2VyV2luZG93ID0gd2luZG93O1xuICAgICAgICBpZiAoJ0dhbWVwYWRFdmVudCcgaW4gYnJvd3NlcldpbmRvdykge1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2dhbWVwYWRjb25uZWN0ZWQnLCB0aGlzLm9uR2FtZXBhZENvbm5lY3RlZExpc3RlbmVyKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdnYW1lcGFkZGlzY29ubmVjdGVkJywgdGhpcy5vbkdhbWVwYWREaXNjb25uZWN0ZWRMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoJ1dlYktpdEdhbWVwYWRFdmVudCcgaW4gYnJvd3NlcldpbmRvdykge1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3dlYmtpdGdhbWVwYWRjb25uZWN0ZWQnLCB0aGlzLm9uR2FtZXBhZENvbm5lY3RlZExpc3RlbmVyKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRnYW1lcGFkZGlzY29ubmVjdGVkJywgdGhpcy5vbkdhbWVwYWREaXNjb25uZWN0ZWRMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVycyA9IFtdO1xuICAgICAgICBpZiAobmF2aWdhdG9yLmdldEdhbWVwYWRzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGdhbWVwYWQgb2YgbmF2aWdhdG9yLmdldEdhbWVwYWRzKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2FtZXBhZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uR2FtZXBhZENvbm5lY3RlZChuZXcgR2FtZXBhZEV2ZW50KCdnYW1lcGFkY29ubmVjdGVkJywgeyBnYW1lcGFkIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdW5yZWdpc3RlcigpIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2dhbWVwYWRjb25uZWN0ZWQnLCB0aGlzLm9uR2FtZXBhZENvbm5lY3RlZExpc3RlbmVyKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2dhbWVwYWRkaXNjb25uZWN0ZWQnLCB0aGlzLm9uR2FtZXBhZERpc2Nvbm5lY3RlZExpc3RlbmVyKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmtpdGdhbWVwYWRjb25uZWN0ZWQnLCB0aGlzLm9uR2FtZXBhZENvbm5lY3RlZExpc3RlbmVyKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmtpdGdhbWVwYWRkaXNjb25uZWN0ZWQnLCB0aGlzLm9uR2FtZXBhZERpc2Nvbm5lY3RlZExpc3RlbmVyKTtcbiAgICAgICAgZm9yIChjb25zdCBjb250cm9sbGVyIG9mIHRoaXMuY29udHJvbGxlcnMpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sbGVyICYmIGNvbnRyb2xsZXIuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnR2FtZXBhZERpc2Nvbm5lY3RlZCcpKFtjb250cm9sbGVyLmlkXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250cm9sbGVycyA9IFtdO1xuICAgIH1cbiAgICBvbkdhbWVwYWRSZXNwb25zZVJlY2VpdmVkKGdhbWVwYWRJZCkge1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2YgdGhpcy5jb250cm9sbGVycykge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgJiYgY29udHJvbGxlci5pZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5pZCA9IGdhbWVwYWRJZDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBvbkdhbWVwYWRDb25uZWN0ZWQoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgZ2FtZXBhZCA9IGV2ZW50LmdhbWVwYWQ7XG4gICAgICAgIGNvbnN0IG5ld0NvbnRyb2xsZXIgPSB7XG4gICAgICAgICAgICBjdXJyZW50U3RhdGU6IGRlZXBDb3B5R2FtZXBhZChnYW1lcGFkKSxcbiAgICAgICAgICAgIHByZXZTdGF0ZTogZGVlcENvcHlHYW1lcGFkKGdhbWVwYWQpLFxuICAgICAgICAgICAgaWQ6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzW2dhbWVwYWQuaW5kZXhdID0gbmV3Q29udHJvbGxlcjtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnVwZGF0ZVN0YXR1cygpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdHYW1lcGFkQ29ubmVjdGVkJykoKTtcbiAgICB9XG4gICAgb25HYW1lcGFkRGlzY29ubmVjdGVkKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGdhbWVwYWQgPSBldmVudC5nYW1lcGFkO1xuICAgICAgICBjb25zdCBkZWxldGVkQ29udHJvbGxlciA9IHRoaXMuY29udHJvbGxlcnNbZ2FtZXBhZC5pbmRleF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLmNvbnRyb2xsZXJzW2dhbWVwYWQuaW5kZXhdO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzID0gdGhpcy5jb250cm9sbGVycy5maWx0ZXIoKGNvbnRyb2xsZXIpID0+IGNvbnRyb2xsZXIgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChkZWxldGVkQ29udHJvbGxlci5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0dhbWVwYWREaXNjb25uZWN0ZWQnKShbXG4gICAgICAgICAgICAgICAgZGVsZXRlZENvbnRyb2xsZXIuaWRcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNjYW5HYW1lcGFkcygpIHtcbiAgICAgICAgY29uc3QgZ2FtZXBhZHMgPSBuYXZpZ2F0b3IuZ2V0R2FtZXBhZHNcbiAgICAgICAgICAgID8gbmF2aWdhdG9yLmdldEdhbWVwYWRzKClcbiAgICAgICAgICAgIDogbmF2aWdhdG9yLndlYmtpdEdldEdhbWVwYWRzXG4gICAgICAgICAgICAgICAgPyBuYXZpZ2F0b3Iud2Via2l0R2V0R2FtZXBhZHMoKVxuICAgICAgICAgICAgICAgIDogW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2FtZXBhZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChnYW1lcGFkc1tpXSAmJiB0aGlzLmNvbnRyb2xsZXJzW2dhbWVwYWRzW2ldLmluZGV4XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc1tnYW1lcGFkc1tpXS5pbmRleF0uY3VycmVudFN0YXRlID0gZ2FtZXBhZHNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdXBkYXRlU3RhdHVzKCkge1xuICAgICAgICB0aGlzLnNjYW5HYW1lcGFkcygpO1xuICAgICAgICBjb25zdCB0b1N0cmVhbWVySGFuZGxlcnMgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycztcbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIG11bHRpcGxlIGNvbnRyb2xsZXJzIGluIHRoZSBjYXNlIHRoZSBtdWx0aXBsZSBnYW1lcGFkcyBhcmUgY29ubmVjdGVkXG4gICAgICAgIGZvciAoY29uc3QgY29udHJvbGxlciBvZiB0aGlzLmNvbnRyb2xsZXJzKSB7XG4gICAgICAgICAgICBpZiAoIWNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgcmVjZWl2ZWQgYW4gaWQgKHBvc3NpYmxlIGlmIHVzaW5nIGFuIG9sZGVyIHZlcnNpb24gb2YgVUUpLCByZXR1cm4gdG8gb3JpZ2luYWwgZnVuY3Rpb25hbGl0eVxuICAgICAgICAgICAgY29uc3QgY29udHJvbGxlcklkID0gY29udHJvbGxlci5pZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5jb250cm9sbGVycy5pbmRleE9mKGNvbnRyb2xsZXIpIDogY29udHJvbGxlci5pZDtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGNvbnRyb2xsZXIuY3VycmVudFN0YXRlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250cm9sbGVyLmN1cnJlbnRTdGF0ZS5idXR0b25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEJ1dHRvbiA9IGNvbnRyb2xsZXIuY3VycmVudFN0YXRlLmJ1dHRvbnNbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNCdXR0b24gPSBjb250cm9sbGVyLnByZXZTdGF0ZS5idXR0b25zW2ldO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50QnV0dG9uLnByZXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJlc3NcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gR2FtZXBhZExheW91dC5MZWZ0VHJpZ2dlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVUVzIGxlZnQgYW5hbG9nIGhhcyBhIGJ1dHRvbiBpbmRleCBvZiA1XG4gICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdHYW1lcGFkQW5hbG9nJykoW2NvbnRyb2xsZXJJZCwgNSwgY3VycmVudEJ1dHRvbi52YWx1ZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT0gR2FtZXBhZExheW91dC5SaWdodFRyaWdnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVFcyByaWdodCBhbmFsb2cgaGFzIGEgYnV0dG9uIGluZGV4IG9mIDZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0dhbWVwYWRBbmFsb2cnKShbY29udHJvbGxlcklkLCA2LCBjdXJyZW50QnV0dG9uLnZhbHVlXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdHYW1lcGFkQnV0dG9uUHJlc3NlZCcpKFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVySWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0J1dHRvbi5wcmVzc2VkID8gMSA6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFjdXJyZW50QnV0dG9uLnByZXNzZWQgJiYgcHJldmlvdXNCdXR0b24ucHJlc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlXG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IEdhbWVwYWRMYXlvdXQuTGVmdFRyaWdnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVFcyBsZWZ0IGFuYWxvZyBoYXMgYSBidXR0b24gaW5kZXggb2YgNVxuICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnR2FtZXBhZEFuYWxvZycpKFtjb250cm9sbGVySWQsIDUsIDBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09IEdhbWVwYWRMYXlvdXQuUmlnaHRUcmlnZ2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVRXMgcmlnaHQgYW5hbG9nIGhhcyBhIGJ1dHRvbiBpbmRleCBvZiA2XG4gICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdHYW1lcGFkQW5hbG9nJykoW2NvbnRyb2xsZXJJZCwgNiwgMF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnR2FtZXBhZEJ1dHRvblJlbGVhc2VkJykoW2NvbnRyb2xsZXJJZCwgaSwgMF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGdhbWVwYWQgYXhlcyAod2Ugd2lsbCBpbmNyZW1lbnQgaW4gbG90cyBvZiAyIGFzIHRoZXJlIGlzIDIgYXhlcyBwZXIgc3RpY2spXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJlbnRTdGF0ZS5heGVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgICAgICAgLy8gSG9yaXpvbnRhbCBheGVzIGFyZSBldmVuIG51bWJlcmVkXG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IHBhcnNlRmxvYXQoY3VycmVudFN0YXRlLmF4ZXNbaV0udG9GaXhlZCg0KSk7XG4gICAgICAgICAgICAgICAgLy8gVmVydGljYWwgYXhlcyBhcmUgb2RkIG51bWJlcmVkXG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2dhbWVwYWQvI3JlbWFwcGluZyBHYW1lcGFkIGJyb3dzZXIgc2lkZSBzdGFuZGFyZCBtYXBwaW5nIGhhcyBwb3NpdGl2ZSBkb3duLCBuZWdhdGl2ZSB1cC4gVGhpcyBpcyBkb3ducmlnaHQgZGlzZ3VzdGluZy4gU28gd2UgZml4IGl0LlxuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSAtcGFyc2VGbG9hdChjdXJyZW50U3RhdGUuYXhlc1tpICsgMV0udG9GaXhlZCg0KSk7XG4gICAgICAgICAgICAgICAgLy8gVUUncyBhbmFsb2cgYXhlcyBmb2xsb3cgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGJyb3dzZXJzLCBidXQgc3RhcnQgYXQgaW5kZXggMSBzbyB3ZSB3aWxsIG9mZnNldCBhcyBzdWNoXG4gICAgICAgICAgICAgICAgdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnR2FtZXBhZEFuYWxvZycpKFtjb250cm9sbGVySWQsIGkgKyAxLCB4XSk7IC8vIEhvcml6b250YWwgYXhlcywgb25seSBvZmZzZXQgYnkgMVxuICAgICAgICAgICAgICAgIHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0dhbWVwYWRBbmFsb2cnKShbY29udHJvbGxlcklkLCBpICsgMiwgeV0pOyAvLyBWZXJ0aWNhbCBheGVzLCBvZmZzZXQgYnkgdHdvICgxIHRvIG1hdGNoIFVFcyBheGVzIGNvbnZlbnRpb24gYW5kIHRoZW4gYW5vdGhlciAxIGZvciB0aGUgdmVydGljYWwgYXhlcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXJJbmRleCA9IHRoaXMuY29udHJvbGxlcnMuaW5kZXhPZihjb250cm9sbGVyKTtcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNbY29udHJvbGxlckluZGV4XS5wcmV2U3RhdGUgPSBkZWVwQ29weUdhbWVwYWQoY3VycmVudFN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jb250cm9sbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnVwZGF0ZVN0YXR1cygpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvbkJlZm9yZVVubG9hZChfKSB7XG4gICAgICAgIC8vIFdoZW4gYSB1c2VyIG5hdmlnYXRlcyBhd2F5IGZyb20gdGhlIHBhZ2UsIHdlIG5lZWQgdG8gaW5mb3JtIFVFIG9mIGFsbCB0aGUgZGlzY29ubmVjdGluZ1xuICAgICAgICAvLyBjb250cm9sbGVyc1xuICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2YgdGhpcy5jb250cm9sbGVycykge1xuICAgICAgICAgICAgaWYgKCFjb250cm9sbGVyIHx8IGNvbnRyb2xsZXIuaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdHYW1lcGFkRGlzY29ubmVjdGVkJykoW2NvbnRyb2xsZXIuaWRdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdhbWVwYWRDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIERlZXAgY29waWVzIHRoZSB2YWx1ZXMgZnJvbSBhIGdhbWVwYWQgYnkgZmlyc3QgY29udmVydGluZyBpdCB0byBhIEpTT04gb2JqZWN0IGFuZCB0aGVuIGJhY2sgdG8gYSBnYW1lcGFkXG4gKlxuICogQHBhcmFtIGdhbWVwYWQgdGhlIG9yaWdpbmFsIGdhbWVwYWRcbiAqIEByZXR1cm5zIGEgbmV3IGdhbWVwYWQgb2JqZWN0LCBwb3B1bGF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgZ2FtZXBhZHMgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ29weUdhbWVwYWQoZ2FtZXBhZCkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgYnV0dG9uczogZ2FtZXBhZC5idXR0b25zLm1hcCgoYikgPT4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBwcmVzc2VkOiBiLnByZXNzZWQsXG4gICAgICAgICAgICB0b3VjaGVkOiBiLnRvdWNoZWQsXG4gICAgICAgICAgICB2YWx1ZTogYi52YWx1ZVxuICAgICAgICB9KSkpLFxuICAgICAgICBheGVzOiBnYW1lcGFkLmF4ZXNcbiAgICB9KSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1HYW1lcGFkVHlwZXMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IEtleWJvYXJkQ29udHJvbGxlciB9IGZyb20gJy4vS2V5Ym9hcmRDb250cm9sbGVyJztcbmltcG9ydCB7IE1vdXNlQ29udHJvbGxlckxvY2tlZCB9IGZyb20gJy4vTW91c2VDb250cm9sbGVyTG9ja2VkJztcbmltcG9ydCB7IE1vdXNlQ29udHJvbGxlckhvdmVyaW5nIH0gZnJvbSAnLi9Nb3VzZUNvbnRyb2xsZXJIb3ZlcmluZyc7XG5pbXBvcnQgeyBUb3VjaENvbnRyb2xsZXIgfSBmcm9tICcuL1RvdWNoQ29udHJvbGxlcic7XG5pbXBvcnQgeyBUb3VjaENvbnRyb2xsZXJGYWtlIH0gZnJvbSAnLi9Ub3VjaENvbnRyb2xsZXJGYWtlJztcbmltcG9ydCB7IEdhbWVwYWRDb250cm9sbGVyIH0gZnJvbSAnLi9HYW1lcGFkQ29udHJvbGxlcic7XG5pbXBvcnQgeyBDb250cm9sU2NoZW1lVHlwZSB9IGZyb20gJy4uL0NvbmZpZy9Db25maWcnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuLyoqXG4gKiBDbGFzcyBmb3IgbWFraW5nIGFuZCBzZXR0aW5nIHVwIGlucHV0IGNsYXNzIHR5cGVzXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnB1dENsYXNzZXNGYWN0b3J5IHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXIgLSBTdHJlYW0gbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB2aWRlb0VsZW1lbnRQcm92aWRlciAtIFZpZGVvIFBsYXllciBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBjb29yZGluYXRlQ29udmVydGVyIC0gQSBjb29yZGluYXRlQ29udmVydGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXIsIHZpZGVvRWxlbWVudFByb3ZpZGVyLCBjb29yZGluYXRlQ29udmVydGVyKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlS2V5cyA9IG5ldyBBY3RpdmVLZXlzKCk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXIgPSB0b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlcjtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQcm92aWRlciA9IHZpZGVvRWxlbWVudFByb3ZpZGVyO1xuICAgICAgICB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIgPSBjb29yZGluYXRlQ29udmVydGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcnMgYnJvd3NlciBrZXkgZXZlbnRzLlxuICAgICAqL1xuICAgIHJlZ2lzdGVyS2V5Qm9hcmQoY29uZmlnKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdSZWdpc3RlciBLZXlib2FyZCBFdmVudHMnKTtcbiAgICAgICAgY29uc3Qga2V5Ym9hcmRDb250cm9sbGVyID0gbmV3IEtleWJvYXJkQ29udHJvbGxlcih0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLCBjb25maWcsIHRoaXMuYWN0aXZlS2V5cyk7XG4gICAgICAgIGtleWJvYXJkQ29udHJvbGxlci5yZWdpc3RlcigpO1xuICAgICAgICByZXR1cm4ga2V5Ym9hcmRDb250cm9sbGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiByZWdpc3RlciBtb3VzZSBldmVudHMgYmFzZWQgb24gYSBjb250cm9sIHR5cGVcbiAgICAgKiBAcGFyYW0gY29udHJvbFNjaGVtZSAtIGlmIHRoZSBtb3VzZSBpcyBlaXRoZXIgaG92ZXJpbmcgb3IgbG9ja2VkXG4gICAgICovXG4gICAgcmVnaXN0ZXJNb3VzZShjb250cm9sU2NoZW1lKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdSZWdpc3RlciBNb3VzZSBFdmVudHMnKTtcbiAgICAgICAgbGV0IG1vdXNlQ29udHJvbGxlcjtcbiAgICAgICAgaWYgKGNvbnRyb2xTY2hlbWUgPT0gQ29udHJvbFNjaGVtZVR5cGUuSG92ZXJpbmdNb3VzZSkge1xuICAgICAgICAgICAgbW91c2VDb250cm9sbGVyID0gbmV3IE1vdXNlQ29udHJvbGxlckhvdmVyaW5nKHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXIsIHRoaXMudmlkZW9FbGVtZW50UHJvdmlkZXIsIHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlciwgdGhpcy5hY3RpdmVLZXlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1vdXNlQ29udHJvbGxlciA9IG5ldyBNb3VzZUNvbnRyb2xsZXJMb2NrZWQodGhpcy50b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlciwgdGhpcy52aWRlb0VsZW1lbnRQcm92aWRlciwgdGhpcy5jb29yZGluYXRlQ29udmVydGVyLCB0aGlzLmFjdGl2ZUtleXMpO1xuICAgICAgICB9XG4gICAgICAgIG1vdXNlQ29udHJvbGxlci5yZWdpc3RlcigpO1xuICAgICAgICByZXR1cm4gbW91c2VDb250cm9sbGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiByZWdpc3RlciB0b3VjaCBldmVudHNcbiAgICAgKiBAcGFyYW0gZmFrZU1vdXNlVG91Y2ggLSB0aGUgZmFrZWQgbW91c2UgdG91Y2ggZXZlbnRcbiAgICAgKi9cbiAgICByZWdpc3RlclRvdWNoKGZha2VNb3VzZVRvdWNoKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdSZWdpc3RlcmluZyBUb3VjaCcpO1xuICAgICAgICBsZXQgdG91Y2hDb250cm9sbGVyO1xuICAgICAgICBpZiAoZmFrZU1vdXNlVG91Y2gpIHtcbiAgICAgICAgICAgIHRvdWNoQ29udHJvbGxlciA9IG5ldyBUb3VjaENvbnRyb2xsZXJGYWtlKHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXIsIHRoaXMudmlkZW9FbGVtZW50UHJvdmlkZXIsIHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0b3VjaENvbnRyb2xsZXIgPSBuZXcgVG91Y2hDb250cm9sbGVyKHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXIsIHRoaXMudmlkZW9FbGVtZW50UHJvdmlkZXIsIHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgdG91Y2hDb250cm9sbGVyLnJlZ2lzdGVyKCk7XG4gICAgICAgIHJldHVybiB0b3VjaENvbnRyb2xsZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHJlZ2lzdGVycyBhIGdhbWVwYWRcbiAgICAgKi9cbiAgICByZWdpc3RlckdhbWVQYWQoKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdSZWdpc3RlciBHYW1lIFBhZCcpO1xuICAgICAgICBjb25zdCBnYW1lcGFkQ29udHJvbGxlciA9IG5ldyBHYW1lcGFkQ29udHJvbGxlcih0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyKTtcbiAgICAgICAgZ2FtZXBhZENvbnRyb2xsZXIucmVnaXN0ZXIoKTtcbiAgICAgICAgcmV0dXJuIGdhbWVwYWRDb250cm9sbGVyO1xuICAgIH1cbn1cbi8qKlxuICogQSBjbGFzcyB0aGF0IGtlZXBzIHRyYWNrIG9mIGN1cnJlbnQgYWN0aXZlIGtleXNcbiAqL1xuZXhwb3J0IGNsYXNzIEFjdGl2ZUtleXMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmFjdGl2ZUtleXMgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmVLZXlzID0gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBhcnJheSBvZiBhY3RpdmUga2V5c1xuICAgICAqIEByZXR1cm5zIC0gYW4gYXJyYXkgb2YgYWN0aXZlIGtleXNcbiAgICAgKi9cbiAgICBnZXRBY3RpdmVLZXlzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVLZXlzO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlucHV0Q2xhc3Nlc0ZhY3RvcnkuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qXG4gKiBOZXcgYnJvd3NlciBBUElzIGhhdmUgbW92ZWQgYXdheSBmcm9tIEtleWJvYXJkRXZlbnQua2V5Q29kZSB0byBLZXlib2FyZEV2ZW50LkNvZGUuXG4gKiBGb3IgZGV0YWlscyBzZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleUNvZGUjY29uc3RhbnRzX2Zvcl9rZXljb2RlX3ZhbHVlXG4gKiBXZSBzdGlsbCB1c2Ugb2xkIEtleWJvYXJkRXZlbnQua2V5Q29kZSBpbnRlZ2VycyBpbiB0aGUgVUUgQysrIHNpZGUsIHNvIHdlIG5lZWQgYSB3YXkgdG8gbWFwIHRoZSBuZXdcbiAqIHN0cmluZy1iYXNlZCBLZXlib2FyZEV2ZW50LkNvZGUgdG8gdGhlIG9sZCBpbnRlZ2Vycy5cbiAqL1xuZXhwb3J0IGNvbnN0IENvZGVUb0tleUNvZGUgPSBPYmplY3QuZnJlZXplKHtcbiAgICBFc2NhcGU6IDI3LFxuICAgIERpZ2l0MDogNDgsXG4gICAgRGlnaXQxOiA0OSxcbiAgICBEaWdpdDI6IDUwLFxuICAgIERpZ2l0MzogNTEsXG4gICAgRGlnaXQ0OiA1MixcbiAgICBEaWdpdDU6IDUzLFxuICAgIERpZ2l0NjogNTQsXG4gICAgRGlnaXQ3OiA1NSxcbiAgICBEaWdpdDg6IDU2LFxuICAgIERpZ2l0OTogNTcsXG4gICAgTWludXM6IDE3MyxcbiAgICBFcXVhbDogMTg3LFxuICAgIEJhY2tzcGFjZTogOCxcbiAgICBUYWI6IDksXG4gICAgS2V5UTogODEsXG4gICAgS2V5VzogODcsXG4gICAgS2V5RTogNjksXG4gICAgS2V5UjogODIsXG4gICAgS2V5VDogODQsXG4gICAgS2V5WTogODksXG4gICAgS2V5VTogODUsXG4gICAgS2V5STogNzMsXG4gICAgS2V5TzogNzksXG4gICAgS2V5UDogODAsXG4gICAgQnJhY2tldExlZnQ6IDIxOSxcbiAgICBCcmFja2V0UmlnaHQ6IDIyMSxcbiAgICBFbnRlcjogMTMsXG4gICAgQ29udHJvbExlZnQ6IDE3LFxuICAgIEtleUE6IDY1LFxuICAgIEtleVM6IDgzLFxuICAgIEtleUQ6IDY4LFxuICAgIEtleUY6IDcwLFxuICAgIEtleUc6IDcxLFxuICAgIEtleUg6IDcyLFxuICAgIEtleUo6IDc0LFxuICAgIEtleUs6IDc1LFxuICAgIEtleUw6IDc2LFxuICAgIFNlbWljb2xvbjogMTg2LFxuICAgIFF1b3RlOiAyMjIsXG4gICAgQmFja3F1b3RlOiAxOTIsXG4gICAgU2hpZnRMZWZ0OiAxNixcbiAgICBCYWNrc2xhc2g6IDIyMCxcbiAgICBLZXlaOiA5MCxcbiAgICBLZXlYOiA4OCxcbiAgICBLZXlDOiA2NyxcbiAgICBLZXlWOiA4NixcbiAgICBLZXlCOiA2NixcbiAgICBLZXlOOiA3OCxcbiAgICBLZXlNOiA3NyxcbiAgICBDb21tYTogMTg4LFxuICAgIFBlcmlvZDogMTkwLFxuICAgIFNsYXNoOiAxOTEsXG4gICAgU2hpZnRSaWdodDogMjUzLFxuICAgIEFsdExlZnQ6IDE4LFxuICAgIFNwYWNlOiAzMixcbiAgICBDYXBzTG9jazogMjAsXG4gICAgRjE6IDExMixcbiAgICBGMjogMTEzLFxuICAgIEYzOiAxMTQsXG4gICAgRjQ6IDExNSxcbiAgICBGNTogMTE2LFxuICAgIEY2OiAxMTcsXG4gICAgRjc6IDExOCxcbiAgICBGODogMTE5LFxuICAgIEY5OiAxMjAsXG4gICAgRjEwOiAxMjEsXG4gICAgRjExOiAxMjIsXG4gICAgRjEyOiAxMjMsXG4gICAgUGF1c2U6IDE5LFxuICAgIFNjcm9sbExvY2s6IDE0NSxcbiAgICBOdW1wYWREaXZpZGU6IDExMSxcbiAgICBOdW1wYWRNdWx0aXBseTogMTA2LFxuICAgIE51bXBhZFN1YnRyYWN0OiAxMDksXG4gICAgTnVtcGFkQWRkOiAxMDcsXG4gICAgTnVtcGFkRGVjaW1hbDogMTEwLFxuICAgIE51bXBhZDk6IDEwNSxcbiAgICBOdW1wYWQ4OiAxMDQsXG4gICAgTnVtcGFkNzogMTAzLFxuICAgIE51bXBhZDY6IDEwMixcbiAgICBOdW1wYWQ1OiAxMDEsXG4gICAgTnVtcGFkNDogMTAwLFxuICAgIE51bXBhZDM6IDk5LFxuICAgIE51bXBhZDI6IDk4LFxuICAgIE51bXBhZDE6IDk3LFxuICAgIE51bXBhZDA6IDk2LFxuICAgIE51bUxvY2s6IDE0NCxcbiAgICBDb250cm9sUmlnaHQ6IDI1NCxcbiAgICBBbHRSaWdodDogMjU1LFxuICAgIEhvbWU6IDM2LFxuICAgIEVuZDogMzUsXG4gICAgQXJyb3dVcDogMzgsXG4gICAgQXJyb3dMZWZ0OiAzNyxcbiAgICBBcnJvd1JpZ2h0OiAzOSxcbiAgICBBcnJvd0Rvd246IDQwLFxuICAgIFBhZ2VVcDogMzMsXG4gICAgUGFnZURvd246IDM0LFxuICAgIEluc2VydDogNDUsXG4gICAgRGVsZXRlOiA0NixcbiAgICBDb250ZXh0TWVudTogOTNcbn0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9S2V5Q29kZXMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IFNwZWNpYWxLZXlDb2RlcyB9IGZyb20gJy4vU3BlY2lhbEtleUNvZGVzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IEZsYWdzIH0gZnJvbSAnLi4vQ29uZmlnL0NvbmZpZyc7XG5pbXBvcnQgeyBDb2RlVG9LZXlDb2RlIH0gZnJvbSAnLi9LZXlDb2Rlcyc7XG4vKipcbiAqIEhhbmRsZXMgdGhlIEtleWJvYXJkIElucHV0cyBmb3IgdGhlIGRvY3VtZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBLZXlib2FyZENvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLCBjb25maWcsIGFjdGl2ZUtleXMpIHtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlciA9IHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5hY3RpdmVLZXlzID0gYWN0aXZlS2V5cztcbiAgICAgICAgdGhpcy5vbktleURvd25MaXN0ZW5lciA9IHRoaXMuaGFuZGxlT25LZXlEb3duLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25LZXlVcExpc3RlbmVyID0gdGhpcy5oYW5kbGVPbktleVVwLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25LZXlQcmVzc0xpc3RlbmVyID0gdGhpcy5oYW5kbGVPbktleVByZXNzLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIHJlZ2lzdGVyKCkge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd25MaXN0ZW5lcik7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5vbktleVVwTGlzdGVuZXIpO1xuICAgICAgICAvL1RoaXMgaGFzIGJlZW4gZGVwcmVjYXRlZCBhcyBhdCBKdW4gMTMgMjAyMVxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIHRoaXMub25LZXlQcmVzc0xpc3RlbmVyKTtcbiAgICB9XG4gICAgdW5yZWdpc3RlcigpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duTGlzdGVuZXIpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMub25LZXlVcExpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCB0aGlzLm9uS2V5UHJlc3NMaXN0ZW5lcik7XG4gICAgfVxuICAgIGhhbmRsZU9uS2V5RG93bihrZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3Qga2V5Q29kZSA9IHRoaXMuZ2V0S2V5Y29kZShrZXlib2FyZEV2ZW50KTtcbiAgICAgICAgaWYgKCFrZXlDb2RlIHx8IGtleUNvZGUgPT09IDIyOSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvU3RyZWFtZXJIYW5kbGVycyA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzO1xuICAgICAgICAoX2EgPSB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdLZXlEb3duJykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYShbdGhpcy5nZXRLZXljb2RlKGtleWJvYXJkRXZlbnQpLCBrZXlib2FyZEV2ZW50LnJlcGVhdCA/IDEgOiAwXSk7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUtleXMgPSB0aGlzLmFjdGl2ZUtleXMuZ2V0QWN0aXZlS2V5cygpO1xuICAgICAgICBhY3RpdmVLZXlzLnB1c2goa2V5Q29kZSk7XG4gICAgICAgIC8vIEJhY2tzcGFjZSBpcyBub3QgY29uc2lkZXJlZCBhIGtleXByZXNzIGluIEphdmFTY3JpcHQgYnV0IHdlIG5lZWQgaXRcbiAgICAgICAgLy8gdG8gYmUgc28gY2hhcmFjdGVycyBtYXkgYmUgZGVsZXRlZCBpbiBhIFVFIHRleHQgZW50cnkgZmllbGQuXG4gICAgICAgIC8vIHNpbmNlIGtleXByZXNzIGlzIGRlcHJlY2F0ZWQgd2UgcmVhbGx5IHNob3VsZCBiZSBzZW5kaW5nIGFsbCBrZXlzIHRvIGtleXByZXNzXG4gICAgICAgIC8vIG9yIHdlIGNoYW5nZSBldmVyeXRoaW5nIHRvIGhhbmRsZSB0aGUgZGVwcmVjYXRpb24gb2YgdGhlc2UgcGFydHNcbiAgICAgICAgaWYgKGtleUNvZGUgPT09IFNwZWNpYWxLZXlDb2Rlcy5iYWNrU3BhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlT25LZXlQcmVzcyhuZXcgS2V5Ym9hcmRFdmVudCgna2V5cHJlc3MnLCB7XG4gICAgICAgICAgICAgICAgY2hhckNvZGU6IFNwZWNpYWxLZXlDb2Rlcy5iYWNrU3BhY2UsXG4gICAgICAgICAgICAgICAga2V5Q29kZTogU3BlY2lhbEtleUNvZGVzLmJhY2tTcGFjZVxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLlN1cHByZXNzQnJvd3NlcktleXMpICYmIHRoaXMuaXNLZXlDb2RlQnJvd3NlcktleShrZXlDb2RlKSkge1xuICAgICAgICAgICAga2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZU9uS2V5VXAoa2V5Ym9hcmRFdmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGtleUNvZGUgPSB0aGlzLmdldEtleWNvZGUoa2V5Ym9hcmRFdmVudCk7XG4gICAgICAgIGlmICgha2V5Q29kZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvU3RyZWFtZXJIYW5kbGVycyA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzO1xuICAgICAgICAoX2EgPSB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdLZXlVcCcpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EoW2tleUNvZGVdKTtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuU3VwcHJlc3NCcm93c2VyS2V5cykgJiYgdGhpcy5pc0tleUNvZGVCcm93c2VyS2V5KGtleUNvZGUpKSB7XG4gICAgICAgICAgICBrZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlT25LZXlQcmVzcyhrZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3Qga2V5Q29kZSA9IHRoaXMuZ2V0S2V5Y29kZShrZXlib2FyZEV2ZW50KTtcbiAgICAgICAgaWYgKCFrZXlDb2RlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9TdHJlYW1lckhhbmRsZXJzID0gdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnM7XG4gICAgICAgIChfYSA9IHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0tleVByZXNzJykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYShba2V5Q29kZV0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBLZXljb2RlIG9mIHRoZSBLZXkgcHJlc3NlZFxuICAgICAqIEBwYXJhbSBrZXlib2FyZEV2ZW50IC0gS2V5IGJvYXJkIEV2ZW50XG4gICAgICogQHJldHVybnMgLSB0aGUga2V5IGNvZGUgb2YgdGhlIEtleVxuICAgICAqL1xuICAgIGdldEtleWNvZGUoa2V5Ym9hcmRFdmVudCkge1xuICAgICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGtleUNvZGUgcHJvcGVydHkgYmVjYXVzZSBicm93c2VyIEFQSSBpcyBkZXByZWNhdGVkIHRoZW4gdXNlIEtleWJvYXJkRXZlbnQuY29kZSBpbnN0ZWFkLlxuICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleUNvZGUjY29uc3RhbnRzX2Zvcl9rZXljb2RlX3ZhbHVlXG4gICAgICAgIGlmICghKCdrZXlDb2RlJyBpbiBrZXlib2FyZEV2ZW50KSkge1xuICAgICAgICAgICAgLy8gdGhpcyB0eXBlIGFzc2VydGlvbiBoZXJlIGlzIHJlcXVpcmVkIGJlY2F1c2UgaWYgJ2tleUNvZGUnIGRvZXNudCBleGlzdCBpbiBrZXlib2FyZEV2ZW50IHRoZW5cbiAgICAgICAgICAgIC8vIGl0IGNhbm5vdCBiZSBhIEtleWJvYXJkRXZlbnQgYW5kIHNvIGl0IGdldHMgbmFycm93ZWQgdG8gJ25ldmVyJ1xuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBrZXlib2FyZEV2ZW50O1xuICAgICAgICAgICAgLy8gQ29udmVydCBLZXlib2FyZEV2ZW50LmNvZGUgc3RyaW5nIGludG8gaW50ZWdlci1iYXNlZCBrZXkgY29kZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucy5cbiAgICAgICAgICAgIGlmIChldmVudC5jb2RlIGluIENvZGVUb0tleUNvZGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ29kZVRvS2V5Q29kZVtldmVudC5jb2RlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIExvZ2dlci5XYXJuaW5nKGBLZXlib2FyZCBjb2RlIG9mICR7ZXZlbnQuY29kZX0gaXMgbm90IHN1cHBvcnRlZCBpbiBvdXIgbWFwcGluZywgaWdub3JpbmcgdGhpcyBrZXkuYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgd2UgbWFkZSBpdCBoZXJlIEtleWJvYXJkRXZlbnQua2V5Q29kZSBpcyBzdGlsbCBzdXBwb3J0ZWQgc28gd2UgY2FuIHNhZmVseSB1c2UgaXQuXG4gICAgICAgIGlmIChrZXlib2FyZEV2ZW50LmtleUNvZGUgPT09IFNwZWNpYWxLZXlDb2Rlcy5zaGlmdCAmJiBrZXlib2FyZEV2ZW50LmNvZGUgPT09ICdTaGlmdFJpZ2h0Jykge1xuICAgICAgICAgICAgcmV0dXJuIFNwZWNpYWxLZXlDb2Rlcy5yaWdodFNoaWZ0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleWJvYXJkRXZlbnQua2V5Q29kZSA9PT0gU3BlY2lhbEtleUNvZGVzLmNvbnRyb2wgJiZcbiAgICAgICAgICAgIGtleWJvYXJkRXZlbnQuY29kZSA9PT0gJ0NvbnRyb2xSaWdodCcpIHtcbiAgICAgICAgICAgIHJldHVybiBTcGVjaWFsS2V5Q29kZXMucmlnaHRDb250cm9sO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGtleWJvYXJkRXZlbnQua2V5Q29kZSA9PT0gU3BlY2lhbEtleUNvZGVzLmFsdCAmJiBrZXlib2FyZEV2ZW50LmNvZGUgPT09ICdBbHRSaWdodCcpIHtcbiAgICAgICAgICAgIHJldHVybiBTcGVjaWFsS2V5Q29kZXMucmlnaHRBbHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5Ym9hcmRFdmVudC5rZXlDb2RlO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEJyb3dzZXIga2V5cyBkbyBub3QgaGF2ZSBhIGNoYXJDb2RlIHNvIHdlIG9ubHkgbmVlZCB0byB0ZXN0IGtleUNvZGUuXG4gICAgICogQHBhcmFtIGtleUNvZGUgLSB0aGUgYnJvd3NlciBrZXljb2RlIG51bWJlclxuICAgICAqL1xuICAgIGlzS2V5Q29kZUJyb3dzZXJLZXkoa2V5Q29kZSkge1xuICAgICAgICAvLyBGdW5jdGlvbiBrZXlzIG9yIHRhYiBrZXkgYXJlIGNvbnNpZGVyZWQgXCJicm93c2VyIGtleXNcIiB0aGF0IHdlIG1heSB3aXNoIHRvIHN1cHByZXNzIGJ5IHByZXZlbnRpbmcgdGhlbSBiZWluZyBwcm9jZXNzIGJ5IGJyb3dzZXIuXG4gICAgICAgIHJldHVybiAoa2V5Q29kZSA+PSAxMTIgJiYga2V5Q29kZSA8PSAxMjMpIHx8IGtleUNvZGUgPT09IDk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9S2V5Ym9hcmRDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIE1vdXNlIEJ1dHRvbiBEYXRhXG4gKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL01vdXNlRXZlbnQvYnV0dG9ufVxuICovXG5leHBvcnQgY2xhc3MgTW91c2VCdXR0b24ge1xufVxuTW91c2VCdXR0b24ubWFpbkJ1dHRvbiA9IDA7IC8vIExlZnQgYnV0dG9uLlxuTW91c2VCdXR0b24uYXV4aWxpYXJ5QnV0dG9uID0gMTsgLy8gV2hlZWwgYnV0dG9uLlxuTW91c2VCdXR0b24uc2Vjb25kYXJ5QnV0dG9uID0gMjsgLy8gUmlnaHQgYnV0dG9uLlxuTW91c2VCdXR0b24uZm91cnRoQnV0dG9uID0gMzsgLy8gQnJvd3NlciBCYWNrIGJ1dHRvbi5cbk1vdXNlQnV0dG9uLmZpZnRoQnV0dG9uID0gNDsgLy8gQnJvd3NlciBGb3J3YXJkIGJ1dHRvbi5cbi8qKlxuICogTW91c2UgQnV0dG9uIE1hc2sgRGF0YVxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Nb3VzZUV2ZW50L2J1dHRvbnN9XG4gKi9cbmV4cG9ydCBjbGFzcyBNb3VzZUJ1dHRvbnNNYXNrIHtcbn1cbk1vdXNlQnV0dG9uc01hc2sucHJpbWFyeUJ1dHRvbiA9IDE7IC8vIExlZnQgYnV0dG9uLlxuTW91c2VCdXR0b25zTWFzay5zZWNvbmRhcnlCdXR0b24gPSAyOyAvLyBSaWdodCBidXR0b24uXG5Nb3VzZUJ1dHRvbnNNYXNrLmF1eGlsaWFyeUJ1dHRvbiA9IDQ7IC8vIFdoZWVsIGJ1dHRvbi5cbk1vdXNlQnV0dG9uc01hc2suZm91cnRoQnV0dG9uID0gODsgLy8gQnJvd3NlciBCYWNrIGJ1dHRvbi5cbk1vdXNlQnV0dG9uc01hc2suZmlmdGhCdXR0b24gPSAxNjsgLy8gQnJvd3NlciBGb3J3YXJkIGJ1dHRvbi5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1vdXNlQnV0dG9ucy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTW91c2VCdXR0b25zTWFzaywgTW91c2VCdXR0b24gfSBmcm9tICcuL01vdXNlQnV0dG9ucyc7XG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBtb3VzZSBjb250cm9sbGVycy4gU2luY2UgdGhlcmUgaXMgYSBidW5jaCBvZiBzaGFyZWQgYmVoYXZpb3VyIGJldHdlZW4gbG9ja2VkIGFuZFxuICogaG92ZXIgbW91c2UgY29udHJvbGxlcnMgdGhpcyBpcyB3aGVyZSB0aGF0IHNoYXJlZCBiZWhhdmlvdXIgbGl2ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb3VzZUNvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLCB2aWRlb1BsYXllciwgY29vcmRpbmF0ZUNvbnZlcnRlciwgYWN0aXZlS2V5cykge1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyID0gc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlciA9IGNvb3JkaW5hdGVDb252ZXJ0ZXI7XG4gICAgICAgIHRoaXMudmlkZW9QbGF5ZXIgPSB2aWRlb1BsYXllcjtcbiAgICAgICAgdGhpcy5hY3RpdmVLZXlzID0gYWN0aXZlS2V5cztcbiAgICAgICAgdGhpcy5vbkVudGVyTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VFbnRlci5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTGVhdmVMaXN0ZW5lciA9IHRoaXMub25Nb3VzZUxlYXZlLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIHJlZ2lzdGVyKCkge1xuICAgICAgICB0aGlzLnJlZ2lzdGVyTW91c2VFbnRlckFuZExlYXZlRXZlbnRzKCk7XG4gICAgfVxuICAgIHVucmVnaXN0ZXIoKSB7XG4gICAgICAgIHRoaXMudW5yZWdpc3Rlck1vdXNlRW50ZXJBbmRMZWF2ZUV2ZW50cygpO1xuICAgIH1cbiAgICByZWdpc3Rlck1vdXNlRW50ZXJBbmRMZWF2ZUV2ZW50cygpIHtcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcy52aWRlb1BsYXllci5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgdmlkZW9FbGVtZW50UGFyZW50ID09PSBudWxsIHx8IHZpZGVvRWxlbWVudFBhcmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmlkZW9FbGVtZW50UGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZW50ZXInLCB0aGlzLm9uRW50ZXJMaXN0ZW5lcik7XG4gICAgICAgIHZpZGVvRWxlbWVudFBhcmVudCA9PT0gbnVsbCB8fCB2aWRlb0VsZW1lbnRQYXJlbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgdGhpcy5vbkxlYXZlTGlzdGVuZXIpO1xuICAgIH1cbiAgICB1bnJlZ2lzdGVyTW91c2VFbnRlckFuZExlYXZlRXZlbnRzKCkge1xuICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnRQYXJlbnQgPSB0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvUGFyZW50RWxlbWVudCgpO1xuICAgICAgICB2aWRlb0VsZW1lbnRQYXJlbnQgPT09IG51bGwgfHwgdmlkZW9FbGVtZW50UGFyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiB2aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VlbnRlcicsIHRoaXMub25FbnRlckxpc3RlbmVyKTtcbiAgICAgICAgdmlkZW9FbGVtZW50UGFyZW50ID09PSBudWxsIHx8IHZpZGVvRWxlbWVudFBhcmVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmlkZW9FbGVtZW50UGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCB0aGlzLm9uTGVhdmVMaXN0ZW5lcik7XG4gICAgfVxuICAgIG9uTW91c2VFbnRlcihldmVudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIChfYSA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VFbnRlcicpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EoKTtcbiAgICAgICAgdGhpcy5wcmVzc01vdXNlQnV0dG9ucyhldmVudC5idXR0b25zLCBldmVudC54LCBldmVudC55KTtcbiAgICB9XG4gICAgb25Nb3VzZUxlYXZlKGV2ZW50KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgKF9hID0gdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZUxlYXZlJykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYSgpO1xuICAgICAgICB0aGlzLnJlbGVhc2VNb3VzZUJ1dHRvbnMoZXZlbnQuYnV0dG9ucywgZXZlbnQueCwgZXZlbnQueSk7XG4gICAgfVxuICAgIHJlbGVhc2VNb3VzZUJ1dHRvbnMoYnV0dG9ucywgWCwgWSkge1xuICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZChYLCBZKTtcbiAgICAgICAgaWYgKGJ1dHRvbnMgJiBNb3VzZUJ1dHRvbnNNYXNrLnByaW1hcnlCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZE1vdXNlVXAoTW91c2VCdXR0b24ubWFpbkJ1dHRvbiwgY29vcmQueCwgY29vcmQueSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1dHRvbnMgJiBNb3VzZUJ1dHRvbnNNYXNrLnNlY29uZGFyeUJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5zZW5kTW91c2VVcChNb3VzZUJ1dHRvbi5zZWNvbmRhcnlCdXR0b24sIGNvb3JkLngsIGNvb3JkLnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25zICYgTW91c2VCdXR0b25zTWFzay5hdXhpbGlhcnlCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZE1vdXNlVXAoTW91c2VCdXR0b24uYXV4aWxpYXJ5QnV0dG9uLCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnV0dG9ucyAmIE1vdXNlQnV0dG9uc01hc2suZm91cnRoQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRNb3VzZVVwKE1vdXNlQnV0dG9uLmZvdXJ0aEJ1dHRvbiwgY29vcmQueCwgY29vcmQueSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1dHRvbnMgJiBNb3VzZUJ1dHRvbnNNYXNrLmZpZnRoQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbmRNb3VzZVVwKE1vdXNlQnV0dG9uLmZpZnRoQnV0dG9uLCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcmVzc01vdXNlQnV0dG9ucyhidXR0b25zLCBYLCBZKSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvb3JkID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVVuc2lnbmVkKFgsIFkpO1xuICAgICAgICBpZiAoYnV0dG9ucyAmIE1vdXNlQnV0dG9uc01hc2sucHJpbWFyeUJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5zZW5kTW91c2VEb3duKE1vdXNlQnV0dG9uLm1haW5CdXR0b24sIGNvb3JkLngsIGNvb3JkLnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25zICYgTW91c2VCdXR0b25zTWFzay5zZWNvbmRhcnlCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZE1vdXNlRG93bihNb3VzZUJ1dHRvbi5zZWNvbmRhcnlCdXR0b24sIGNvb3JkLngsIGNvb3JkLnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25zICYgTW91c2VCdXR0b25zTWFzay5hdXhpbGlhcnlCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZE1vdXNlRG93bihNb3VzZUJ1dHRvbi5hdXhpbGlhcnlCdXR0b24sIGNvb3JkLngsIGNvb3JkLnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25zICYgTW91c2VCdXR0b25zTWFzay5mb3VydGhCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZE1vdXNlRG93bihNb3VzZUJ1dHRvbi5mb3VydGhCdXR0b24sIGNvb3JkLngsIGNvb3JkLnkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidXR0b25zICYgTW91c2VCdXR0b25zTWFzay5maWZ0aEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5zZW5kTW91c2VEb3duKE1vdXNlQnV0dG9uLmZpZnRoQnV0dG9uLCBjb29yZC54LCBjb29yZC55KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZW5kTW91c2VEb3duKGJ1dHRvbiwgWCwgWSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VEb3duJykpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYShbYnV0dG9uLCBYLCBZXSk7XG4gICAgfVxuICAgIHNlbmRNb3VzZVVwKGJ1dHRvbiwgWCwgWSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGNvb3JkID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVVuc2lnbmVkKFgsIFkpO1xuICAgICAgICAoX2EgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ01vdXNlVXAnKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hKFtidXR0b24sIGNvb3JkLngsIGNvb3JkLnldKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb3VzZUNvbnRyb2xsZXIuanMubWFwIiwiaW1wb3J0IHsgTW91c2VDb250cm9sbGVyIH0gZnJvbSAnLi9Nb3VzZUNvbnRyb2xsZXInO1xuLyoqXG4gKiBBIG1vdXNlIGNvbnRyb2xsZXIgdGhhdCBhbGxvd3MgdGhlIG1vdXNlIHRvIGZyZWVseSBmbG9hdCBvdmVyIHRoZSB2aWRlbyBkb2N1bWVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vdXNlQ29udHJvbGxlckhvdmVyaW5nIGV4dGVuZHMgTW91c2VDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJlYW1NZXNzYWdlQ29udHJvbGxlciwgdmlkZW9QbGF5ZXIsIGNvb3JkaW5hdGVDb252ZXJ0ZXIsIGFjdGl2ZUtleXMpIHtcbiAgICAgICAgc3VwZXIoc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIsIHZpZGVvUGxheWVyLCBjb29yZGluYXRlQ29udmVydGVyLCBhY3RpdmVLZXlzKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQgPSB2aWRlb1BsYXllci5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5vbk1vdXNlVXBMaXN0ZW5lciA9IHRoaXMub25Nb3VzZVVwLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Nb3VzZURvd25MaXN0ZW5lciA9IHRoaXMub25Nb3VzZURvd24uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbk1vdXNlRGJsQ2xpY2tMaXN0ZW5lciA9IHRoaXMub25Nb3VzZURibENsaWNrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Nb3VzZVdoZWVsTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VXaGVlbC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTW91c2VNb3ZlTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Db250ZXh0TWVudUxpc3RlbmVyID0gdGhpcy5vbkNvbnRleHRNZW51LmJpbmQodGhpcyk7XG4gICAgfVxuICAgIHJlZ2lzdGVyKCkge1xuICAgICAgICBzdXBlci5yZWdpc3RlcigpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uTW91c2VEb3duTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXBMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5vbkNvbnRleHRNZW51TGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMub25Nb3VzZVdoZWVsTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIHRoaXMub25Nb3VzZURibENsaWNrTGlzdGVuZXIpO1xuICAgIH1cbiAgICB1bnJlZ2lzdGVyKCkge1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLm9uTW91c2VEb3duTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXBMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5vbkNvbnRleHRNZW51TGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIHRoaXMub25Nb3VzZVdoZWVsTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkYmxjbGljaycsIHRoaXMub25Nb3VzZURibENsaWNrTGlzdGVuZXIpO1xuICAgICAgICBzdXBlci51bnJlZ2lzdGVyKCk7XG4gICAgfVxuICAgIG9uTW91c2VEb3duKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvb3JkID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVVuc2lnbmVkKGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ01vdXNlRG93bicpKFtldmVudC5idXR0b24sIGNvb3JkLngsIGNvb3JkLnldKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgb25Nb3VzZVVwKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvb3JkID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVVuc2lnbmVkKGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ01vdXNlVXAnKShbZXZlbnQuYnV0dG9uLCBjb29yZC54LCBjb29yZC55XSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIG9uQ29udGV4dE1lbnUoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgb25Nb3VzZU1vdmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29vcmQgPSB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIudHJhbnNsYXRlVW5zaWduZWQoZXZlbnQub2Zmc2V0WCwgZXZlbnQub2Zmc2V0WSk7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVNpZ25lZChldmVudC5tb3ZlbWVudFgsIGV2ZW50Lm1vdmVtZW50WSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VNb3ZlJykoW1xuICAgICAgICAgICAgY29vcmQueCxcbiAgICAgICAgICAgIGNvb3JkLnksXG4gICAgICAgICAgICBkZWx0YS54LFxuICAgICAgICAgICAgZGVsdGEueVxuICAgICAgICBdKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgb25Nb3VzZVdoZWVsKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvb3JkID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVVuc2lnbmVkKGV2ZW50Lm9mZnNldFgsIGV2ZW50Lm9mZnNldFkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ01vdXNlV2hlZWwnKShbXG4gICAgICAgICAgICBldmVudC53aGVlbERlbHRhLFxuICAgICAgICAgICAgY29vcmQueCxcbiAgICAgICAgICAgIGNvb3JkLnlcbiAgICAgICAgXSk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIG9uTW91c2VEYmxDbGljayhldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZChldmVudC5vZmZzZXRYLCBldmVudC5vZmZzZXRZKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZURvdWJsZScpKFtldmVudC5idXR0b24sIGNvb3JkLngsIGNvb3JkLnldKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Nb3VzZUNvbnRyb2xsZXJIb3ZlcmluZy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuaW1wb3J0IHsgTW91c2VDb250cm9sbGVyIH0gZnJvbSAnLi9Nb3VzZUNvbnRyb2xsZXInO1xuLyoqXG4gKiBBIG1vdXNlIGNvbnRyb2xsZXIgdGhhdCBsb2NrcyB0aGUgbW91c2UgdG8gdGhlIHZpZGVvIGRvY3VtZW50IGFuZCBwcmV2ZW50cyBpdCBmcm9tIGxlYXZpbmcgdGhlIHdpbmRvd1xuICovXG5leHBvcnQgY2xhc3MgTW91c2VDb250cm9sbGVyTG9ja2VkIGV4dGVuZHMgTW91c2VDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3RvcihzdHJlYW1NZXNzYWdlQ29udHJvbGxlciwgdmlkZW9QbGF5ZXIsIGNvb3JkaW5hdGVDb252ZXJ0ZXIsIGFjdGl2ZUtleXMpIHtcbiAgICAgICAgc3VwZXIoc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIsIHZpZGVvUGxheWVyLCBjb29yZGluYXRlQ29udmVydGVyLCBhY3RpdmVLZXlzKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQgPSB2aWRlb1BsYXllci5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy54ID0gdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggLyAyO1xuICAgICAgICB0aGlzLnkgPSB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLyAyO1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZCA9IHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlci50cmFuc2xhdGVVbnNpZ25lZCh0aGlzLngsIHRoaXMueSk7XG4gICAgICAgIHRoaXMub25SZXF1ZXN0TG9ja0xpc3RlbmVyID0gdGhpcy5vblJlcXVlc3RMb2NrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Mb2NrU3RhdGVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMub25Mb2NrU3RhdGVDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbk1vdXNlVXBMaXN0ZW5lciA9IHRoaXMub25Nb3VzZVVwLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Nb3VzZURvd25MaXN0ZW5lciA9IHRoaXMub25Nb3VzZURvd24uYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vbk1vdXNlRGJsQ2xpY2tMaXN0ZW5lciA9IHRoaXMub25Nb3VzZURibENsaWNrLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub25Nb3VzZVdoZWVsTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VXaGVlbC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uTW91c2VNb3ZlTGlzdGVuZXIgPSB0aGlzLm9uTW91c2VNb3ZlLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIHJlZ2lzdGVyKCkge1xuICAgICAgICBzdXBlci5yZWdpc3RlcigpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZXF1ZXN0UG9pbnRlckxvY2sgPVxuICAgICAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVxdWVzdFBvaW50ZXJMb2NrIHx8IHRoaXMudmlkZW9FbGVtZW50UGFyZW50Lm1velJlcXVlc3RQb2ludGVyTG9jaztcbiAgICAgICAgZG9jdW1lbnQuZXhpdFBvaW50ZXJMb2NrID0gZG9jdW1lbnQuZXhpdFBvaW50ZXJMb2NrIHx8IGRvY3VtZW50Lm1vekV4aXRQb2ludGVyTG9jaztcbiAgICAgICAgaWYgKHRoaXMudmlkZW9FbGVtZW50UGFyZW50LnJlcXVlc3RQb2ludGVyTG9jaykge1xuICAgICAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uUmVxdWVzdExvY2tMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxvY2tjaGFuZ2UnLCB0aGlzLm9uTG9ja1N0YXRlQ2hhbmdlTGlzdGVuZXIpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3pwb2ludGVybG9ja2NoYW5nZScsIHRoaXMub25Mb2NrU3RhdGVDaGFuZ2VMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd25MaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLm9uTW91c2VXaGVlbExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCB0aGlzLm9uTW91c2VEYmxDbGlja0xpc3RlbmVyKTtcbiAgICB9XG4gICAgdW5yZWdpc3RlcigpIHtcbiAgICAgICAgY29uc3QgcG9pbnRlckxvY2tFbGVtZW50ID0gZG9jdW1lbnQucG9pbnRlckxvY2tFbGVtZW50IHx8IGRvY3VtZW50Lm1velBvaW50ZXJMb2NrRWxlbWVudDtcbiAgICAgICAgaWYgKGRvY3VtZW50LmV4aXRQb2ludGVyTG9jayAmJiBwb2ludGVyTG9ja0VsZW1lbnQgPT09IHRoaXMudmlkZW9FbGVtZW50UGFyZW50KSB7XG4gICAgICAgICAgICBkb2N1bWVudC5leGl0UG9pbnRlckxvY2soKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25SZXF1ZXN0TG9ja0xpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncG9pbnRlcmxvY2tjaGFuZ2UnLCB0aGlzLm9uTG9ja1N0YXRlQ2hhbmdlTGlzdGVuZXIpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3pwb2ludGVybG9ja2NoYW5nZScsIHRoaXMub25Mb2NrU3RhdGVDaGFuZ2VMaXN0ZW5lcik7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmVMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMub25Nb3VzZURvd25MaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLm9uTW91c2VXaGVlbExpc3RlbmVyKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZGJsY2xpY2snLCB0aGlzLm9uTW91c2VEYmxDbGlja0xpc3RlbmVyKTtcbiAgICAgICAgc3VwZXIudW5yZWdpc3RlcigpO1xuICAgIH1cbiAgICBvblJlcXVlc3RMb2NrKCkge1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZXF1ZXN0UG9pbnRlckxvY2soKTtcbiAgICB9XG4gICAgb25Mb2NrU3RhdGVDaGFuZ2UoKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ZXJMb2NrRWxlbWVudCA9IGRvY3VtZW50LnBvaW50ZXJMb2NrRWxlbWVudCB8fCBkb2N1bWVudC5tb3pQb2ludGVyTG9ja0VsZW1lbnQ7XG4gICAgICAgIGlmIChwb2ludGVyTG9ja0VsZW1lbnQgPT09IHRoaXMudmlkZW9FbGVtZW50UGFyZW50KSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnUG9pbnRlciBsb2NrZWQnKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmVMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnVGhlIHBvaW50ZXIgbG9jayBzdGF0dXMgaXMgbm93IHVubG9ja2VkJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlTGlzdGVuZXIpO1xuICAgICAgICAgICAgLy8gSWYgbW91c2UgbG9zZXMgZm9jdXMsIHNlbmQgYSBrZXkgdXAgZm9yIGFsbCBvZiB0aGUgY3VycmVudGx5IGhlbGQtZG93biBrZXlzXG4gICAgICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBhcyB3aGVuIHRoZSBtb3VzZSBsb3NlcyBmb2N1cywgdGhlIHdpbmRvd3Mgc3RvcHMgbGlzdGVuaW5nIGZvciBldmVudHMgYW5kIGFzIHN1Y2hcbiAgICAgICAgICAgIC8vIHRoZSBrZXl1cCBsaXN0ZW5lciB3b24ndCBnZXQgZmlyZWRcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUtleXMgPSB0aGlzLmFjdGl2ZUtleXMuZ2V0QWN0aXZlS2V5cygpO1xuICAgICAgICAgICAgYWN0aXZlS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0tleVVwJykoW2tleV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25Nb3VzZURvd24oZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZURvd24nKShbXG4gICAgICAgICAgICBldmVudC5idXR0b24sXG4gICAgICAgICAgICAvLyBXZSB1c2UgdGhlIHN0b3JlIHZhbHVlIG9mIHRoaXMuY29vcmQgYXMgb3Bwb3NlZCB0byB0aGUgbW91c2VFdmVudC54L3kgYXMgdGhlIG1vdXNlRXZlbnQgbG9jYXRpb25cbiAgICAgICAgICAgIC8vIHVzZXMgdGhlIHN5c3RlbSBjdXJzb3IgbG9jYXRpb24gd2hpY2ggaGFzbid0IG1vdmVkXG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZC54LFxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29vcmQueVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgb25Nb3VzZVVwKGV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTW91c2VVcCcpKFtcbiAgICAgICAgICAgIGV2ZW50LmJ1dHRvbixcbiAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgc3RvcmUgdmFsdWUgb2YgdGhpcy5jb29yZCBhcyBvcHBvc2VkIHRvIHRoZSBtb3VzZUV2ZW50LngveSBhcyB0aGUgbW91c2VFdmVudCBsb2NhdGlvblxuICAgICAgICAgICAgLy8gdXNlcyB0aGUgc3lzdGVtIGN1cnNvciBsb2NhdGlvbiB3aGljaCBoYXNuJ3QgbW92ZWRcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZENvb3JkLngsXG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZC55XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBvbk1vdXNlTW92ZShldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHlsZVdpZHRoID0gdGhpcy52aWRlb1BsYXllci5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKS5jbGllbnRXaWR0aDtcbiAgICAgICAgY29uc3Qgc3R5bGVIZWlnaHQgPSB0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvUGFyZW50RWxlbWVudCgpLmNsaWVudEhlaWdodDtcbiAgICAgICAgdGhpcy54ICs9IGV2ZW50Lm1vdmVtZW50WDtcbiAgICAgICAgdGhpcy55ICs9IGV2ZW50Lm1vdmVtZW50WTtcbiAgICAgICAgd2hpbGUgKHRoaXMueCA+IHN0eWxlV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMueCAtPSBzdHlsZVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0aGlzLnkgPiBzdHlsZUhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy55IC09IHN0eWxlSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICh0aGlzLnggPCAwKSB7XG4gICAgICAgICAgICB0aGlzLnggKz0gc3R5bGVXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy55IDwgMCkge1xuICAgICAgICAgICAgdGhpcy55ICs9IHN0eWxlSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9ybWFsaXplZENvb3JkID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVVuc2lnbmVkKHRoaXMueCwgdGhpcy55KTtcbiAgICAgICAgY29uc3QgZGVsdGEgPSB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIudHJhbnNsYXRlU2lnbmVkKGV2ZW50Lm1vdmVtZW50WCwgZXZlbnQubW92ZW1lbnRZKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZU1vdmUnKShbXG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZC54LFxuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkQ29vcmQueSxcbiAgICAgICAgICAgIGRlbHRhLngsXG4gICAgICAgICAgICBkZWx0YS55XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBvbk1vdXNlV2hlZWwoZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZVdoZWVsJykoW1xuICAgICAgICAgICAgZXZlbnQud2hlZWxEZWx0YSxcbiAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgc3RvcmUgdmFsdWUgb2YgdGhpcy5jb29yZCBhcyBvcHBvc2VkIHRvIHRoZSBtb3VzZUV2ZW50LngveSBhcyB0aGUgbW91c2VFdmVudCBsb2NhdGlvblxuICAgICAgICAgICAgLy8gdXNlcyB0aGUgc3lzdGVtIGN1cnNvciBsb2NhdGlvbiB3aGljaCBoYXNuJ3QgbW92ZWRcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZENvb3JkLngsXG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZC55XG4gICAgICAgIF0pO1xuICAgIH1cbiAgICBvbk1vdXNlRGJsQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZURvdWJsZScpKFtcbiAgICAgICAgICAgIGV2ZW50LmJ1dHRvbixcbiAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgc3RvcmUgdmFsdWUgb2YgdGhpcy5jb29yZCBhcyBvcHBvc2VkIHRvIHRoZSBtb3VzZUV2ZW50LngveSBhcyB0aGUgbW91c2VFdmVudCBsb2NhdGlvblxuICAgICAgICAgICAgLy8gdXNlcyB0aGUgc3lzdGVtIGN1cnNvciBsb2NhdGlvbiB3aGljaCBoYXNuJ3QgbW92ZWRcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZENvb3JkLngsXG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRDb29yZC55XG4gICAgICAgIF0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1vdXNlQ29udHJvbGxlckxvY2tlZC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIFNwZWNpYWwgS2V5IGNvZGVzXG4gKiAgTXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBKYXZhU2NyaXB0S2V5Q29kZVRvRktleSBDKysgYXJyYXkuXG4gKiBUaGUgaW5kZXggb2YgdGhlIGVudHJ5IGluIHRoZSBhcnJheSBpcyB0aGUgc3BlY2lhbCBrZXkgY29kZSBnaXZlbiBiZWxvdy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNwZWNpYWxLZXlDb2RlcyB7XG59XG5TcGVjaWFsS2V5Q29kZXMuYmFja1NwYWNlID0gODtcblNwZWNpYWxLZXlDb2Rlcy5zaGlmdCA9IDE2O1xuU3BlY2lhbEtleUNvZGVzLmNvbnRyb2wgPSAxNztcblNwZWNpYWxLZXlDb2Rlcy5hbHQgPSAxODtcblNwZWNpYWxLZXlDb2Rlcy5yaWdodFNoaWZ0ID0gMjUzO1xuU3BlY2lhbEtleUNvZGVzLnJpZ2h0Q29udHJvbCA9IDI1NDtcblNwZWNpYWxLZXlDb2Rlcy5yaWdodEFsdCA9IDI1NTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNwZWNpYWxLZXlDb2Rlcy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuLyoqXG4gKiBUaGUgYmFzaWMgdG91Y2ggY29udHJvbGxlciB0aGF0IGhhbmRsZXMgdGhlIHRvdWNoIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBUb3VjaENvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLCB2aWRlb1BsYXllciwgY29vcmRpbmF0ZUNvbnZlcnRlcikge1xuICAgICAgICB0aGlzLmZpbmdlcnMgPSBbOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMF07XG4gICAgICAgIHRoaXMuZmluZ2VySWRzID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLm1heEJ5dGVWYWx1ZSA9IDI1NTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlciA9IHN0cmVhbU1lc3NhZ2VDb250cm9sbGVyO1xuICAgICAgICB0aGlzLnZpZGVvUGxheWVyID0gdmlkZW9QbGF5ZXI7XG4gICAgICAgIHRoaXMuY29vcmRpbmF0ZUNvbnZlcnRlciA9IGNvb3JkaW5hdGVDb252ZXJ0ZXI7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50ID0gdmlkZW9QbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCk7XG4gICAgICAgIHRoaXMub25Ub3VjaFN0YXJ0TGlzdGVuZXIgPSB0aGlzLm9uVG91Y2hTdGFydC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uVG91Y2hFbmRMaXN0ZW5lciA9IHRoaXMub25Ub3VjaEVuZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9uVG91Y2hNb3ZlTGlzdGVuZXIgPSB0aGlzLm9uVG91Y2hNb3ZlLmJpbmQodGhpcyk7XG4gICAgfVxuICAgIHJlZ2lzdGVyKCkge1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5vblRvdWNoU3RhcnRMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vblRvdWNoRW5kTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm9uVG91Y2hNb3ZlTGlzdGVuZXIpO1xuICAgIH1cbiAgICB1bnJlZ2lzdGVyKCkge1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5vblRvdWNoU3RhcnRMaXN0ZW5lcik7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vblRvdWNoRW5kTGlzdGVuZXIpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm9uVG91Y2hNb3ZlTGlzdGVuZXIpO1xuICAgIH1cbiAgICByZW1lbWJlclRvdWNoKHRvdWNoKSB7XG4gICAgICAgIGNvbnN0IGZpbmdlciA9IHRoaXMuZmluZ2Vycy5wb3AoKTtcbiAgICAgICAgaWYgKGZpbmdlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnZXhoYXVzdGVkIHRvdWNoIGlkZW50aWZpZXJzJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maW5nZXJJZHMuc2V0KHRvdWNoLmlkZW50aWZpZXIsIGZpbmdlcik7XG4gICAgfVxuICAgIGZvcmdldFRvdWNoKHRvdWNoKSB7XG4gICAgICAgIHRoaXMuZmluZ2Vycy5wdXNoKHRoaXMuZmluZ2VySWRzLmdldCh0b3VjaC5pZGVudGlmaWVyKSk7XG4gICAgICAgIC8vIFNvcnQgYXJyYXkgYmFjayBpbnRvIGRlc2NlbmRpbmcgb3JkZXIuIFRoaXMgbWVhbnMgaWYgZmluZ2VyICcxJyB3ZXJlIHRvIGxpZnQgYWZ0ZXIgZmluZ2VyICcwJywgd2Ugd291bGQgZW5zdXJlIHRoYXQgMCB3aWxsIGJlIHRoZSBmaXJzdCBpbmRleCB0byBwb3BcbiAgICAgICAgdGhpcy5maW5nZXJzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiIC0gYTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZmluZ2VySWRzLmRlbGV0ZSh0b3VjaC5pZGVudGlmaWVyKTtcbiAgICB9XG4gICAgb25Ub3VjaFN0YXJ0KHRvdWNoRXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b3VjaEV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgICAgICB0aGlzLnJlbWVtYmVyVG91Y2godG91Y2hFdmVudC5jaGFuZ2VkVG91Y2hlc1t0XSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0VG91Y2hEYXRhKCdUb3VjaFN0YXJ0JywgdG91Y2hFdmVudC5jaGFuZ2VkVG91Y2hlcyk7XG4gICAgICAgIHRvdWNoRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgb25Ub3VjaEVuZCh0b3VjaEV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdFRvdWNoRGF0YSgnVG91Y2hFbmQnLCB0b3VjaEV2ZW50LmNoYW5nZWRUb3VjaGVzKTtcbiAgICAgICAgLy8gUmUtY3ljbGUgdW5pcXVlIGlkZW50aWZpZXJzIHByZXZpb3VzbHkgYXNzaWduZWQgdG8gZWFjaCB0b3VjaC5cbiAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b3VjaEV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgICAgICB0aGlzLmZvcmdldFRvdWNoKHRvdWNoRXZlbnQuY2hhbmdlZFRvdWNoZXNbdF0pO1xuICAgICAgICB9XG4gICAgICAgIHRvdWNoRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgb25Ub3VjaE1vdmUodG91Y2hFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXRUb3VjaERhdGEoJ1RvdWNoTW92ZScsIHRvdWNoRXZlbnQudG91Y2hlcyk7XG4gICAgICAgIHRvdWNoRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgZW1pdFRvdWNoRGF0YSh0eXBlLCB0b3VjaGVzKSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IHRoaXMudmlkZW9QbGF5ZXIuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnN0IHRvU3RyZWFtZXJIYW5kbGVycyA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzO1xuICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRvdWNoZXMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgIGNvbnN0IG51bVRvdWNoZXMgPSAxOyAvLyB0aGUgbnVtYmVyIG9mIHRvdWNoZXMgdG8gYmUgc2VudCB0aGlzIG1lc3NhZ2VcbiAgICAgICAgICAgIGNvbnN0IHRvdWNoID0gdG91Y2hlc1t0XTtcbiAgICAgICAgICAgIGNvbnN0IHggPSB0b3VjaC5jbGllbnRYIC0gb2Zmc2V0LmxlZnQ7XG4gICAgICAgICAgICBjb25zdCB5ID0gdG91Y2guY2xpZW50WSAtIG9mZnNldC50b3A7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbyhgRiR7dGhpcy5maW5nZXJJZHMuZ2V0KHRvdWNoLmlkZW50aWZpZXIpfT0oJHt4fSwgJHt5fSlgKTtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVVuc2lnbmVkKHgsIHkpO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnVG91Y2hTdGFydCc6XG4gICAgICAgICAgICAgICAgICAgIHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1RvdWNoU3RhcnQnKShbXG4gICAgICAgICAgICAgICAgICAgICAgICBudW1Ub3VjaGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmQueCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkLnksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmdlcklkcy5nZXQodG91Y2guaWRlbnRpZmllciksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heEJ5dGVWYWx1ZSAqICh0b3VjaC5mb3JjZSA+IDAgPyB0b3VjaC5mb3JjZSA6IDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmQuaW5SYW5nZSA/IDEgOiAwXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdUb3VjaEVuZCc6XG4gICAgICAgICAgICAgICAgICAgIHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1RvdWNoRW5kJykoW1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtVG91Y2hlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkLngsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZC55LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5nZXJJZHMuZ2V0KHRvdWNoLmlkZW50aWZpZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhCeXRlVmFsdWUgKiB0b3VjaC5mb3JjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkLmluUmFuZ2UgPyAxIDogMFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnVG91Y2hNb3ZlJzpcbiAgICAgICAgICAgICAgICAgICAgdG9TdHJlYW1lckhhbmRsZXJzLmdldCgnVG91Y2hNb3ZlJykoW1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtVG91Y2hlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkLngsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZC55LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5nZXJJZHMuZ2V0KHRvdWNoLmlkZW50aWZpZXIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhCeXRlVmFsdWUgKiAodG91Y2guZm9yY2UgPiAwID8gdG91Y2guZm9yY2UgOiAxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkLmluUmFuZ2UgPyAxIDogMFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ub3VjaENvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IE1vdXNlQnV0dG9uIH0gZnJvbSAnLi9Nb3VzZUJ1dHRvbnMnO1xuLyoqXG4gKiBBbGxvd3MgZm9yIHRoZSB1c2FnZSBvZiBmYWtlIHRvdWNoIGV2ZW50c1xuICovXG5leHBvcnQgY2xhc3MgVG91Y2hDb250cm9sbGVyRmFrZSB7XG4gICAgY29uc3RydWN0b3Ioc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIsIHZpZGVvUGxheWVyLCBjb29yZGluYXRlQ29udmVydGVyKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIgPSBzdHJlYW1NZXNzYWdlQ29udHJvbGxlcjtcbiAgICAgICAgdGhpcy52aWRlb1BsYXllciA9IHZpZGVvUGxheWVyO1xuICAgICAgICB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIgPSBjb29yZGluYXRlQ29udmVydGVyO1xuICAgICAgICB0aGlzLm9uVG91Y2hTdGFydExpc3RlbmVyID0gdGhpcy5vblRvdWNoU3RhcnQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblRvdWNoRW5kTGlzdGVuZXIgPSB0aGlzLm9uVG91Y2hFbmQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vblRvdWNoTW92ZUxpc3RlbmVyID0gdGhpcy5vblRvdWNoTW92ZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFBhcmVudENsaWVudFJlY3QgPSB0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvUGFyZW50RWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIH1cbiAgICByZWdpc3RlcigpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25Ub3VjaFN0YXJ0TGlzdGVuZXIpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25Ub3VjaEVuZExpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vblRvdWNoTW92ZUxpc3RlbmVyKTtcbiAgICB9XG4gICAgdW5yZWdpc3RlcigpIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMub25Ub3VjaFN0YXJ0TGlzdGVuZXIpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMub25Ub3VjaEVuZExpc3RlbmVyKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5vblRvdWNoTW92ZUxpc3RlbmVyKTtcbiAgICB9XG4gICAgb25Ub3VjaFN0YXJ0KHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSB8fCB0b3VjaC50YXJnZXQgIT09IHRoaXMudmlkZW9QbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5mYWtlVG91Y2hGaW5nZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RfdG91Y2ggPSB0b3VjaC5jaGFuZ2VkVG91Y2hlc1swXTtcbiAgICAgICAgICAgIHRoaXMuZmFrZVRvdWNoRmluZ2VyID0ge1xuICAgICAgICAgICAgICAgIGlkOiBmaXJzdF90b3VjaC5pZGVudGlmaWVyLFxuICAgICAgICAgICAgICAgIHg6IGZpcnN0X3RvdWNoLmNsaWVudFggLSB0aGlzLnZpZGVvRWxlbWVudFBhcmVudENsaWVudFJlY3QubGVmdCxcbiAgICAgICAgICAgICAgICB5OiBmaXJzdF90b3VjaC5jbGllbnRZIC0gdGhpcy52aWRlb0VsZW1lbnRQYXJlbnRDbGllbnRSZWN0LnRvcFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHRoaXMudmlkZW9QbGF5ZXIuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCk7XG4gICAgICAgICAgICBjb25zdCBtb3VzZUV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoJ21vdXNlZW50ZXInLCBmaXJzdF90b3VjaCk7XG4gICAgICAgICAgICB2aWRlb0VsZW1lbnRQYXJlbnQuZGlzcGF0Y2hFdmVudChtb3VzZUV2ZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVVuc2lnbmVkKHRoaXMuZmFrZVRvdWNoRmluZ2VyLngsIHRoaXMuZmFrZVRvdWNoRmluZ2VyLnkpO1xuICAgICAgICAgICAgY29uc3QgdG9TdHJlYW1lckhhbmRsZXJzID0gdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnM7XG4gICAgICAgICAgICB0b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdNb3VzZURvd24nKShbTW91c2VCdXR0b24ubWFpbkJ1dHRvbiwgY29vcmQueCwgY29vcmQueV0pO1xuICAgICAgICB9XG4gICAgICAgIHRvdWNoLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIG9uVG91Y2hFbmQodG91Y2hFdmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkgfHwgdGhpcy5mYWtlVG91Y2hGaW5nZXIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHRoaXMudmlkZW9QbGF5ZXIuZ2V0VmlkZW9QYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIGNvbnN0IHRvU3RyZWFtZXJIYW5kbGVycyA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzO1xuICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRvdWNoRXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHRvdWNoID0gdG91Y2hFdmVudC5jaGFuZ2VkVG91Y2hlc1t0XTtcbiAgICAgICAgICAgIGlmICh0b3VjaC5pZGVudGlmaWVyID09PSB0aGlzLmZha2VUb3VjaEZpbmdlci5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSB0b3VjaC5jbGllbnRYIC0gdGhpcy52aWRlb0VsZW1lbnRQYXJlbnRDbGllbnRSZWN0LmxlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgeSA9IHRvdWNoLmNsaWVudFkgLSB0aGlzLnZpZGVvRWxlbWVudFBhcmVudENsaWVudFJlY3QudG9wO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvb3JkID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVVuc2lnbmVkKHgsIHkpO1xuICAgICAgICAgICAgICAgIHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ01vdXNlVXAnKShbTW91c2VCdXR0b24ubWFpbkJ1dHRvbiwgY29vcmQueCwgY29vcmQueV0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vdXNlRXZlbnQgPSBuZXcgTW91c2VFdmVudCgnbW91c2VsZWF2ZScsIHRvdWNoKTtcbiAgICAgICAgICAgICAgICB2aWRlb0VsZW1lbnRQYXJlbnQuZGlzcGF0Y2hFdmVudChtb3VzZUV2ZW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZha2VUb3VjaEZpbmdlciA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdG91Y2hFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBvblRvdWNoTW92ZSh0b3VjaEV2ZW50KSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSB8fCB0aGlzLmZha2VUb3VjaEZpbmdlciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdG9TdHJlYW1lckhhbmRsZXJzID0gdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnM7XG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdG91Y2hFdmVudC50b3VjaGVzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgICAgICBjb25zdCB0b3VjaCA9IHRvdWNoRXZlbnQudG91Y2hlc1t0XTtcbiAgICAgICAgICAgIGlmICh0b3VjaC5pZGVudGlmaWVyID09PSB0aGlzLmZha2VUb3VjaEZpbmdlci5pZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHggPSB0b3VjaC5jbGllbnRYIC0gdGhpcy52aWRlb0VsZW1lbnRQYXJlbnRDbGllbnRSZWN0LmxlZnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgeSA9IHRvdWNoLmNsaWVudFkgLSB0aGlzLnZpZGVvRWxlbWVudFBhcmVudENsaWVudFJlY3QudG9wO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvb3JkID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVVuc2lnbmVkKHgsIHkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gdGhpcy5jb29yZGluYXRlQ29udmVydGVyLnRyYW5zbGF0ZVNpZ25lZCh4IC0gdGhpcy5mYWtlVG91Y2hGaW5nZXIueCwgeSAtIHRoaXMuZmFrZVRvdWNoRmluZ2VyLnkpO1xuICAgICAgICAgICAgICAgIHRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ01vdXNlTW92ZScpKFtjb29yZC54LCBjb29yZC55LCBkZWx0YS54LCBkZWx0YS55XSk7XG4gICAgICAgICAgICAgICAgdGhpcy5mYWtlVG91Y2hGaW5nZXIueCA9IHg7XG4gICAgICAgICAgICAgICAgdGhpcy5mYWtlVG91Y2hGaW5nZXIueSA9IHk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdG91Y2hFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRvdWNoQ29udHJvbGxlckZha2UuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IGRlZXBDb3B5R2FtZXBhZCB9IGZyb20gJy4vR2FtZXBhZFR5cGVzJztcbi8qKlxuICogVGhlIGNsYXNzIHRoYXQgaGFuZGxlcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBYUiBnYW1lcGFkcyBhbmQgY29udHJvbGxlcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBYUkdhbWVwYWRDb250cm9sbGVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXIgLSBTdHJlYW0gbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyKSB7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXIgPSB0b1N0cmVhbWVyTWVzc2FnZXNQcm92aWRlcjtcbiAgICAgICAgdGhpcy5jb250cm9sbGVycyA9IFtdO1xuICAgIH1cbiAgICB1cGRhdGVTdGF0dXMoc291cmNlLCBmcmFtZSwgcmVmU3BhY2UpIHtcbiAgICAgICAgaWYgKHNvdXJjZS5nYW1lcGFkKSB7XG4gICAgICAgICAgICBjb25zdCBnYW1lcGFkUG9zZSA9IGZyYW1lLmdldFBvc2Uoc291cmNlLmdyaXBTcGFjZSwgcmVmU3BhY2UpO1xuICAgICAgICAgICAgaWYgKCFnYW1lcGFkUG9zZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBzeXN0ZW0gPSAwO1xuICAgICAgICAgICAgaWYgKHNvdXJjZS5wcm9maWxlcy5pbmNsdWRlcygnaHRjLXZpdmUnKSkge1xuICAgICAgICAgICAgICAgIHN5c3RlbSA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzb3VyY2UucHJvZmlsZXMuaW5jbHVkZXMoJ29jdWx1cy10b3VjaCcpKSB7XG4gICAgICAgICAgICAgICAgc3lzdGVtID0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE8gKHdpbGxpYW0uYmVsY2hlcik6IEFkZCBvdGhlciBwcm9maWxlcyAoUXVlc3QsIE1pY3Jvc29mdCBNaXhlZCBSZWFsaXR5LCBldGMpXG4gICAgICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1hSU3lzdGVtJykoW3N5c3RlbV0pO1xuICAgICAgICAgICAgLy8gRGVmYXVsdDogQW55SGFuZCAoMilcbiAgICAgICAgICAgIGxldCBoYW5kZWRuZXNzID0gMjtcbiAgICAgICAgICAgIHN3aXRjaCAoc291cmNlLmhhbmRlZG5lc3MpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICAgICAgICAgICAgaGFuZGVkbmVzcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICAgICAgICAgICAgaGFuZGVkbmVzcyA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2VuZCBjb250cm9sbGVyIHRyYW5zZm9ybVxuICAgICAgICAgICAgY29uc3QgbWF0cml4ID0gZ2FtZXBhZFBvc2UudHJhbnNmb3JtLm1hdHJpeDtcbiAgICAgICAgICAgIGNvbnN0IG1hdCA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbWF0W2ldID0gbmV3IEZsb2F0MzJBcnJheShbbWF0cml4W2ldXSlbMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnWFJDb250cm9sbGVyVHJhbnNmb3JtJykoW1xuICAgICAgICAgICAgICAgIG1hdFswXSwgbWF0WzRdLCBtYXRbOF0sIG1hdFsxMl0sXG4gICAgICAgICAgICAgICAgbWF0WzFdLCBtYXRbNV0sIG1hdFs5XSwgbWF0WzEzXSxcbiAgICAgICAgICAgICAgICBtYXRbMl0sIG1hdFs2XSwgbWF0WzEwXSwgbWF0WzE0XSxcbiAgICAgICAgICAgICAgICBtYXRbM10sIG1hdFs3XSwgbWF0WzExXSwgbWF0WzE1XSxcbiAgICAgICAgICAgICAgICBoYW5kZWRuZXNzXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBjb250cm9sbGVyIGJ1dHRvbnMgYW5kIGF4ZXNcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xsZXJzW2hhbmRlZG5lc3NdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzW2hhbmRlZG5lc3NdID0ge1xuICAgICAgICAgICAgICAgICAgICBwcmV2U3RhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGlkOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNbaGFuZGVkbmVzc10ucHJldlN0YXRlID0gZGVlcENvcHlHYW1lcGFkKHNvdXJjZS5nYW1lcGFkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnNbaGFuZGVkbmVzc10uY3VycmVudFN0YXRlID0gZGVlcENvcHlHYW1lcGFkKHNvdXJjZS5nYW1lcGFkKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSB0aGlzLmNvbnRyb2xsZXJzW2hhbmRlZG5lc3NdO1xuICAgICAgICAgICAgY29uc3QgY3VyclN0YXRlID0gY29udHJvbGxlci5jdXJyZW50U3RhdGU7XG4gICAgICAgICAgICBjb25zdCBwcmV2U3RhdGUgPSBjb250cm9sbGVyLnByZXZTdGF0ZTtcbiAgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBidXR0b25zXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJTdGF0ZS5idXR0b25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VyckJ1dHRvbiA9IGN1cnJTdGF0ZS5idXR0b25zW2ldO1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZCdXR0b24gPSBwcmV2U3RhdGUuYnV0dG9uc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoY3VyckJ1dHRvbi5wcmVzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHByZXNzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzUmVwZWF0ID0gcHJldkJ1dHRvbi5wcmVzc2VkID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzUHJvdmlkZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnWFJCdXR0b25QcmVzc2VkJykoW1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGVkbmVzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJCdXR0b24udmFsdWVcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByZXZCdXR0b24ucHJlc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1hSQnV0dG9uUmVsZWFzZWQnKShbXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kZWRuZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaSxcbiAgICAgICAgICAgICAgICAgICAgICAgIDBcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyQnV0dG9uLnRvdWNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdG91Y2hlZFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1JlcGVhdCA9IHByZXZCdXR0b24udG91Y2hlZCA/IDEgOiAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1hSQnV0dG9uVG91Y2hlZCcpKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRlZG5lc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByZXZCdXR0b24udG91Y2hlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1hSQnV0dG9uVG91Y2hSZWxlYXNlZCcpKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRlZG5lc3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJdGVyYXRlIG92ZXIgZ2FtZXBhZCBheGVzXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGN1cnJTdGF0ZS5heGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VyQXhpc1ZhbHVlID0gY3VyclN0YXRlLmF4ZXNbaV07XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldkF4aXNWYWx1ZSA9IHByZXZTdGF0ZS5heGVzW2ldO1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgc2VuZCBheGlzIHVwZGF0ZSBpZiB0aGVyZSBpcyBhIGNoYW5nZVxuICAgICAgICAgICAgICAgIGlmIChjdXJBeGlzVmFsdWUgIT0gcHJldkF4aXNWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlc1Byb3ZpZGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1hSQW5hbG9nJykoW1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGVkbmVzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGksXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJBeGlzVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc1toYW5kZWRuZXNzXS5wcmV2U3RhdGUgPSBjdXJyU3RhdGU7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1YUkdhbWVwYWRDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBJbmJvdW5kVmlkZW9TdGF0cywgSW5ib3VuZEF1ZGlvU3RhdHMgfSBmcm9tICcuL0luYm91bmRSVFBTdGF0cyc7XG5pbXBvcnQgeyBEYXRhQ2hhbm5lbFN0YXRzIH0gZnJvbSAnLi9EYXRhQ2hhbm5lbFN0YXRzJztcbmltcG9ydCB7IENhbmRpZGF0ZVN0YXQgfSBmcm9tICcuL0NhbmRpZGF0ZVN0YXQnO1xuaW1wb3J0IHsgUmVtb3RlT3V0Ym91bmRSVFBTdGF0cywgT3V0Ym91bmRSVFBTdGF0cyB9IGZyb20gJy4vT3V0Qm91bmRSVFBTdGF0cyc7XG5pbXBvcnQgeyBTZXNzaW9uU3RhdHMgfSBmcm9tICcuL1Nlc3Npb25TdGF0cyc7XG5pbXBvcnQgeyBTdHJlYW1TdGF0cyB9IGZyb20gJy4vU3RyZWFtU3RhdHMnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuLyoqXG4gKiBUaGUgQWdncmVnYXRlZCBTdGF0cyB0aGF0IGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBSVEMgU3RhdHMgUmVwb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBBZ2dyZWdhdGVkU3RhdHMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmluYm91bmRWaWRlb1N0YXRzID0gbmV3IEluYm91bmRWaWRlb1N0YXRzKCk7XG4gICAgICAgIHRoaXMuaW5ib3VuZEF1ZGlvU3RhdHMgPSBuZXcgSW5ib3VuZEF1ZGlvU3RhdHMoKTtcbiAgICAgICAgdGhpcy5kYXRhY2hhbm5lbFN0YXRzID0gbmV3IERhdGFDaGFubmVsU3RhdHMoKTtcbiAgICAgICAgdGhpcy5vdXRib3VuZFZpZGVvU3RhdHMgPSBuZXcgT3V0Ym91bmRSVFBTdGF0cygpO1xuICAgICAgICB0aGlzLm91dGJvdW5kQXVkaW9TdGF0cyA9IG5ldyBPdXRib3VuZFJUUFN0YXRzKCk7XG4gICAgICAgIHRoaXMucmVtb3RlT3V0Ym91bmRBdWRpb1N0YXRzID0gbmV3IFJlbW90ZU91dGJvdW5kUlRQU3RhdHMoKTtcbiAgICAgICAgdGhpcy5yZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMgPSBuZXcgUmVtb3RlT3V0Ym91bmRSVFBTdGF0cygpO1xuICAgICAgICB0aGlzLnNlc3Npb25TdGF0cyA9IG5ldyBTZXNzaW9uU3RhdHMoKTtcbiAgICAgICAgdGhpcy5zdHJlYW1TdGF0cyA9IG5ldyBTdHJlYW1TdGF0cygpO1xuICAgICAgICB0aGlzLmNvZGVjcyA9IG5ldyBNYXAoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2F0aGVyIGFsbCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgUlRDIFBlZXIgQ29ubmVjdGlvbiBSZXBvcnRcbiAgICAgKiBAcGFyYW0gcnRjU3RhdHNSZXBvcnQgLSBSVEMgU3RhdHMgUmVwb3J0XG4gICAgICovXG4gICAgcHJvY2Vzc1N0YXRzKHJ0Y1N0YXRzUmVwb3J0KSB7XG4gICAgICAgIHRoaXMubG9jYWxDYW5kaWRhdGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHRoaXMucmVtb3RlQ2FuZGlkYXRlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICB0aGlzLmNhbmRpZGF0ZVBhaXJzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJ0Y1N0YXRzUmVwb3J0LmZvckVhY2goKHN0YXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzdGF0LnR5cGU7XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjYW5kaWRhdGUtcGFpcic6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2FuZGlkYXRlUGFpcihzdGF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2VydGlmaWNhdGUnOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdjb2RlYyc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29kZWMoc3RhdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RhdGEtY2hhbm5lbCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRGF0YUNoYW5uZWwoc3RhdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2luYm91bmQtcnRwJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbmJvdW5kUlRQKHN0YXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdsb2NhbC1jYW5kaWRhdGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUxvY2FsQ2FuZGlkYXRlKHN0YXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtZWRpYS1zb3VyY2UnOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdtZWRpYS1wbGF5b3V0JzpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnb3V0Ym91bmQtcnRwJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVMb2NhbE91dGJvdW5kKHN0YXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdwZWVyLWNvbm5lY3Rpb24nOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdyZW1vdGUtY2FuZGlkYXRlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVSZW1vdGVDYW5kaWRhdGUoc3RhdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JlbW90ZS1pbmJvdW5kLXJ0cCc6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JlbW90ZS1vdXRib3VuZC1ydHAnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJlbW90ZU91dGJvdW5kKHN0YXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd0cmFjayc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJhY2soc3RhdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RyYW5zcG9ydCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlVHJhbnNwb3J0KHN0YXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzdHJlYW0nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN0cmVhbShzdGF0KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKCd1bmhhbmRsZWQgU3RhdCBUeXBlJyk7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5JbmZvKHN0YXQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3Mgc3RyZWFtIHN0YXRzIGRhdGEgZnJvbSB3ZWJydGNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGF0IC0gdGhlIHN0YXRzIGNvbWluZyBpbiBmcm9tIHdlYnJ0Y1xuICAgICAqL1xuICAgIGhhbmRsZVN0cmVhbShzdGF0KSB7XG4gICAgICAgIHRoaXMuc3RyZWFtU3RhdHMgPSBzdGF0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9jZXNzIHRoZSBJY2UgQ2FuZGlkYXRlIFBhaXIgRGF0YVxuICAgICAqIEBwYXJhbSBzdGF0IC0gdGhlIHN0YXRzIGNvbWluZyBpbiBmcm9tIGljZSBjYW5kaWRhdGVzXG4gICAgICovXG4gICAgaGFuZGxlQ2FuZGlkYXRlUGFpcihzdGF0KSB7XG4gICAgICAgIC8vIEFkZCB0aGUgY2FuZGlkYXRlIHBhaXIgdG8gdGhlIGNhbmRpZGF0ZSBwYWlyIGFycmF5XG4gICAgICAgIHRoaXMuY2FuZGlkYXRlUGFpcnMucHVzaChzdGF0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgRGF0YSBDaGFubmVsIERhdGFcbiAgICAgKiBAcGFyYW0gc3RhdCAtIHRoZSBzdGF0cyBjb21pbmcgaW4gZnJvbSB0aGUgZGF0YSBjaGFubmVsXG4gICAgICovXG4gICAgaGFuZGxlRGF0YUNoYW5uZWwoc3RhdCkge1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMuYnl0ZXNSZWNlaXZlZCA9IHN0YXQuYnl0ZXNSZWNlaXZlZDtcbiAgICAgICAgdGhpcy5kYXRhY2hhbm5lbFN0YXRzLmJ5dGVzU2VudCA9IHN0YXQuYnl0ZXNTZW50O1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMuZGF0YUNoYW5uZWxJZGVudGlmaWVyID0gc3RhdC5kYXRhQ2hhbm5lbElkZW50aWZpZXI7XG4gICAgICAgIHRoaXMuZGF0YWNoYW5uZWxTdGF0cy5pZCA9IHN0YXQuaWQ7XG4gICAgICAgIHRoaXMuZGF0YWNoYW5uZWxTdGF0cy5sYWJlbCA9IHN0YXQubGFiZWw7XG4gICAgICAgIHRoaXMuZGF0YWNoYW5uZWxTdGF0cy5tZXNzYWdlc1JlY2VpdmVkID0gc3RhdC5tZXNzYWdlc1JlY2VpdmVkO1xuICAgICAgICB0aGlzLmRhdGFjaGFubmVsU3RhdHMubWVzc2FnZXNTZW50ID0gc3RhdC5tZXNzYWdlc1NlbnQ7XG4gICAgICAgIHRoaXMuZGF0YWNoYW5uZWxTdGF0cy5wcm90b2NvbCA9IHN0YXQucHJvdG9jb2w7XG4gICAgICAgIHRoaXMuZGF0YWNoYW5uZWxTdGF0cy5zdGF0ZSA9IHN0YXQuc3RhdGU7XG4gICAgICAgIHRoaXMuZGF0YWNoYW5uZWxTdGF0cy50aW1lc3RhbXAgPSBzdGF0LnRpbWVzdGFtcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgTG9jYWwgSWNlIENhbmRpZGF0ZSBEYXRhXG4gICAgICogQHBhcmFtIHN0YXQgLSBsb2NhbCBzdGF0c1xuICAgICAqL1xuICAgIGhhbmRsZUxvY2FsQ2FuZGlkYXRlKHN0YXQpIHtcbiAgICAgICAgY29uc3QgbG9jYWxDYW5kaWRhdGUgPSBuZXcgQ2FuZGlkYXRlU3RhdCgpO1xuICAgICAgICBsb2NhbENhbmRpZGF0ZS5sYWJlbCA9ICdsb2NhbC1jYW5kaWRhdGUnO1xuICAgICAgICBsb2NhbENhbmRpZGF0ZS5hZGRyZXNzID0gc3RhdC5hZGRyZXNzO1xuICAgICAgICBsb2NhbENhbmRpZGF0ZS5wb3J0ID0gc3RhdC5wb3J0O1xuICAgICAgICBsb2NhbENhbmRpZGF0ZS5wcm90b2NvbCA9IHN0YXQucHJvdG9jb2w7XG4gICAgICAgIGxvY2FsQ2FuZGlkYXRlLmNhbmRpZGF0ZVR5cGUgPSBzdGF0LmNhbmRpZGF0ZVR5cGU7XG4gICAgICAgIGxvY2FsQ2FuZGlkYXRlLmlkID0gc3RhdC5pZDtcbiAgICAgICAgbG9jYWxDYW5kaWRhdGUucmVsYXlQcm90b2NvbCA9IHN0YXQucmVsYXlQcm90b2NvbDtcbiAgICAgICAgbG9jYWxDYW5kaWRhdGUudHJhbnNwb3J0SWQgPSBzdGF0LnRyYW5zcG9ydElkO1xuICAgICAgICB0aGlzLmxvY2FsQ2FuZGlkYXRlcy5wdXNoKGxvY2FsQ2FuZGlkYXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgUmVtb3RlIEljZSBDYW5kaWRhdGUgRGF0YVxuICAgICAqIEBwYXJhbSBzdGF0IC0gaWNlIGNhbmRpZGF0ZSBzdGF0c1xuICAgICAqL1xuICAgIGhhbmRsZVJlbW90ZUNhbmRpZGF0ZShzdGF0KSB7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNhbmRpZGF0ZSA9IG5ldyBDYW5kaWRhdGVTdGF0KCk7XG4gICAgICAgIHJlbW90ZUNhbmRpZGF0ZS5sYWJlbCA9ICdyZW1vdGUtY2FuZGlkYXRlJztcbiAgICAgICAgcmVtb3RlQ2FuZGlkYXRlLmFkZHJlc3MgPSBzdGF0LmFkZHJlc3M7XG4gICAgICAgIHJlbW90ZUNhbmRpZGF0ZS5wb3J0ID0gc3RhdC5wb3J0O1xuICAgICAgICByZW1vdGVDYW5kaWRhdGUucHJvdG9jb2wgPSBzdGF0LnByb3RvY29sO1xuICAgICAgICByZW1vdGVDYW5kaWRhdGUuaWQgPSBzdGF0LmlkO1xuICAgICAgICByZW1vdGVDYW5kaWRhdGUuY2FuZGlkYXRlVHlwZSA9IHN0YXQuY2FuZGlkYXRlVHlwZTtcbiAgICAgICAgcmVtb3RlQ2FuZGlkYXRlLnJlbGF5UHJvdG9jb2wgPSBzdGF0LnJlbGF5UHJvdG9jb2w7XG4gICAgICAgIHJlbW90ZUNhbmRpZGF0ZS50cmFuc3BvcnRJZCA9IHN0YXQudHJhbnNwb3J0SWQ7XG4gICAgICAgIHRoaXMucmVtb3RlQ2FuZGlkYXRlcy5wdXNoKHJlbW90ZUNhbmRpZGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgdGhlIEluYm91bmQgUlRQIEF1ZGlvIGFuZCBWaWRlbyBEYXRhXG4gICAgICogQHBhcmFtIHN0YXQgLSBpbmJvdW5kIHJ0cCBzdGF0c1xuICAgICAqL1xuICAgIGhhbmRsZUluYm91bmRSVFAoc3RhdCkge1xuICAgICAgICBzd2l0Y2ggKHN0YXQua2luZCkge1xuICAgICAgICAgICAgY2FzZSAndmlkZW8nOlxuICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBiaXRyYXRlIGJldHdlZW4gc3RhdCB1cGRhdGVzXG4gICAgICAgICAgICAgICAgaWYgKHN0YXQuYnl0ZXNSZWNlaXZlZCA+IHRoaXMuaW5ib3VuZFZpZGVvU3RhdHMuYnl0ZXNSZWNlaXZlZCAmJlxuICAgICAgICAgICAgICAgICAgICBzdGF0LnRpbWVzdGFtcCA+IHRoaXMuaW5ib3VuZFZpZGVvU3RhdHMudGltZXN0YW1wKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5ib3VuZFZpZGVvU3RhdHMuYml0cmF0ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAoOCAqIChzdGF0LmJ5dGVzUmVjZWl2ZWQgLSB0aGlzLmluYm91bmRWaWRlb1N0YXRzLmJ5dGVzUmVjZWl2ZWQpKSAvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXQudGltZXN0YW1wIC0gdGhpcy5pbmJvdW5kVmlkZW9TdGF0cy50aW1lc3RhbXApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluYm91bmRWaWRlb1N0YXRzLmJpdHJhdGUgPSBNYXRoLmZsb29yKHRoaXMuaW5ib3VuZFZpZGVvU3RhdHMuYml0cmF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENvcHkgbWVtYmVycyBmcm9tIHN0YXQgaW50byBgdGhpcy5pbmJvdW5kVmlkZW9TdGF0c2BcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzdGF0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5ib3VuZFZpZGVvU3RhdHNba2V5XSA9IHN0YXRba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdhdWRpbyc6XG4gICAgICAgICAgICAgICAgaWYgKHN0YXQuYnl0ZXNSZWNlaXZlZCA+IHRoaXMuaW5ib3VuZEF1ZGlvU3RhdHMuYnl0ZXNSZWNlaXZlZCAmJlxuICAgICAgICAgICAgICAgICAgICBzdGF0LnRpbWVzdGFtcCA+IHRoaXMuaW5ib3VuZEF1ZGlvU3RhdHMudGltZXN0YW1wKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5ib3VuZEF1ZGlvU3RhdHMuYml0cmF0ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAoOCAqIChzdGF0LmJ5dGVzUmVjZWl2ZWQgLSB0aGlzLmluYm91bmRBdWRpb1N0YXRzLmJ5dGVzUmVjZWl2ZWQpKSAvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXQudGltZXN0YW1wIC0gdGhpcy5pbmJvdW5kQXVkaW9TdGF0cy50aW1lc3RhbXApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluYm91bmRBdWRpb1N0YXRzLmJpdHJhdGUgPSBNYXRoLmZsb29yKHRoaXMuaW5ib3VuZEF1ZGlvU3RhdHMuYml0cmF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENvcHkgbWVtYmVycyBmcm9tIHN0YXQgaW50byBgdGhpcy5pbmJvdW5kQXVkaW9TdGF0c2BcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzdGF0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5ib3VuZEF1ZGlvU3RhdHNba2V5XSA9IHN0YXRba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcihgS2luZCBzaG91bGQgYmUgYXVkaW8gb3IgdmlkZW8sIHdlIGdvdCAke3N0YXQua2luZH0gLSB0aGF0J3MgdW5zdXBwb3J0ZWQuYCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgXCJsb2NhbFwiIG91dGJvdW5kIFJUUCBBdWRpbyBhbmQgVmlkZW8gc3RhdHMuXG4gICAgICogQHBhcmFtIHN0YXQgLSBsb2NhbCBvdXRib3VuZCBydHAgc3RhdHNcbiAgICAgKi9cbiAgICBoYW5kbGVMb2NhbE91dGJvdW5kKHN0YXQpIHtcbiAgICAgICAgY29uc3QgbG9jYWxPdXRib3VuZFN0YXRzID0gc3RhdC5raW5kID09PSAnYXVkaW8nID8gdGhpcy5vdXRib3VuZEF1ZGlvU3RhdHMgOiB0aGlzLm91dGJvdW5kVmlkZW9TdGF0cztcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmFjdGl2ZSA9IHN0YXQuYWN0aXZlO1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMuY29kZWNJZCA9IHN0YXQuY29kZWNJZDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmJ5dGVzU2VudCA9IHN0YXQuYnl0ZXNTZW50O1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMuZnJhbWVIZWlnaHQgPSBzdGF0LmZyYW1lSGVpZ2h0O1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMuZnJhbWVXaWR0aCA9IHN0YXQuZnJhbWVXaWR0aDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmZyYW1lc0VuY29kZWQgPSBzdGF0LmZyYW1lc0VuY29kZWQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5mcmFtZXNQZXJTZWNvbmQgPSBzdGF0LmZyYW1lc1BlclNlY29uZDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmhlYWRlckJ5dGVzU2VudCA9IHN0YXQuaGVhZGVyQnl0ZXNTZW50O1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMuaWQgPSBzdGF0LmlkO1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMua2V5RnJhbWVzRW5jb2RlZCA9IHN0YXQua2V5RnJhbWVzRW5jb2RlZDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLmtpbmQgPSBzdGF0LmtpbmQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5tZWRpYVNvdXJjZUlkID0gc3RhdC5tZWRpYVNvdXJjZUlkO1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMubWlkID0gc3RhdC5taWQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5uYWNrQ291bnQgPSBzdGF0Lm5hY2tDb3VudDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnBhY2tldHNTZW50ID0gc3RhdC5wYWNrZXRzU2VudDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnFwU3VtID0gc3RhdC5xcFN1bTtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnF1YWxpdHlMaW1pdGF0aW9uRHVyYXRpb25zID0gc3RhdC5xdWFsaXR5TGltaXRhdGlvbkR1cmF0aW9ucztcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnF1YWxpdHlMaW1pdGF0aW9uUmVhc29uID0gc3RhdC5xdWFsaXR5TGltaXRhdGlvblJlYXNvbjtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnJlbW90ZUlkID0gc3RhdC5yZW1vdGVJZDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQgPSBzdGF0LnJldHJhbnNtaXR0ZWRCeXRlc1NlbnQ7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy5yaWQgPSBzdGF0LnJpZDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnNjYWxhYmlsaXR5TW9kZSA9IHN0YXQuc2NhbGFiaWxpdHlNb2RlO1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMuc3NyYyA9IHN0YXQuc3NyYztcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnRhcmdldEJpdHJhdGUgPSBzdGF0LnRhcmdldEJpdHJhdGU7XG4gICAgICAgIGxvY2FsT3V0Ym91bmRTdGF0cy50aW1lc3RhbXAgPSBzdGF0LnRpbWVzdGFtcDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnRvdGFsRW5jb2RlVGltZSA9IHN0YXQudG90YWxFbmNvZGVUaW1lO1xuICAgICAgICBsb2NhbE91dGJvdW5kU3RhdHMudG90YWxFbmNvZGVCeXRlc1RhcmdldCA9IHN0YXQudG90YWxFbmNvZGVCeXRlc1RhcmdldDtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnRvdGFsUGFja2V0U2VuZERlbGF5ID0gc3RhdC50b3RhbFBhY2tldFNlbmREZWxheTtcbiAgICAgICAgbG9jYWxPdXRib3VuZFN0YXRzLnRyYW5zcG9ydElkID0gc3RhdC50cmFuc3BvcnRJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgXCJyZW1vdGVcIiBvdXRib3VuZCBSVFAgQXVkaW8gYW5kIFZpZGVvIHN0YXRzLlxuICAgICAqIEBwYXJhbSBzdGF0IC0gcmVtb3RlIG91dGJvdW5kIHJ0cCBzdGF0c1xuICAgICAqL1xuICAgIGhhbmRsZVJlbW90ZU91dGJvdW5kKHN0YXQpIHtcbiAgICAgICAgY29uc3QgcmVtb3RlT3V0Ym91bmRTdGF0cyA9IHN0YXQua2luZCA9PT0gJ2F1ZGlvJyA/IHRoaXMucmVtb3RlT3V0Ym91bmRBdWRpb1N0YXRzIDogdGhpcy5yZW1vdGVPdXRib3VuZFZpZGVvU3RhdHM7XG4gICAgICAgIHJlbW90ZU91dGJvdW5kU3RhdHMuYnl0ZXNTZW50ID0gc3RhdC5ieXRlc1NlbnQ7XG4gICAgICAgIHJlbW90ZU91dGJvdW5kU3RhdHMuY29kZWNJZCA9IHN0YXQuY29kZWNJZDtcbiAgICAgICAgcmVtb3RlT3V0Ym91bmRTdGF0cy5pZCA9IHN0YXQuaWQ7XG4gICAgICAgIHJlbW90ZU91dGJvdW5kU3RhdHMua2luZCA9IHN0YXQua2luZDtcbiAgICAgICAgcmVtb3RlT3V0Ym91bmRTdGF0cy5sb2NhbElkID0gc3RhdC5sb2NhbElkO1xuICAgICAgICByZW1vdGVPdXRib3VuZFN0YXRzLnBhY2tldHNTZW50ID0gc3RhdC5wYWNrZXRzU2VudDtcbiAgICAgICAgcmVtb3RlT3V0Ym91bmRTdGF0cy5yZW1vdGVUaW1lc3RhbXAgPSBzdGF0LnJlbW90ZVRpbWVzdGFtcDtcbiAgICAgICAgcmVtb3RlT3V0Ym91bmRTdGF0cy5yZXBvcnRzU2VudCA9IHN0YXQucmVwb3J0c1NlbnQ7XG4gICAgICAgIHJlbW90ZU91dGJvdW5kU3RhdHMucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cyA9IHN0YXQucm91bmRUcmlwVGltZU1lYXN1cmVtZW50cztcbiAgICAgICAgcmVtb3RlT3V0Ym91bmRTdGF0cy5zc3JjID0gc3RhdC5zc3JjO1xuICAgICAgICByZW1vdGVPdXRib3VuZFN0YXRzLnRpbWVzdGFtcCA9IHN0YXQudGltZXN0YW1wO1xuICAgICAgICByZW1vdGVPdXRib3VuZFN0YXRzLnRvdGFsUm91bmRUcmlwVGltZSA9IHN0YXQudG90YWxSb3VuZFRyaXBUaW1lO1xuICAgICAgICByZW1vdGVPdXRib3VuZFN0YXRzLnRyYW5zcG9ydElkID0gc3RhdC50cmFuc3BvcnRJZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgSW5ib3VuZCBWaWRlbyBUcmFjayBEYXRhXG4gICAgICogQHBhcmFtIHN0YXQgLSB2aWRlbyB0cmFjayBzdGF0c1xuICAgICAqL1xuICAgIGhhbmRsZVRyYWNrKHN0YXQpIHtcbiAgICAgICAgLy8gd2Ugb25seSB3YW50IHRvIGV4dHJhY3Qgc3RhdHMgZnJvbSB0aGUgdmlkZW8gdHJhY2tcbiAgICAgICAgaWYgKHN0YXQudHlwZSA9PT0gJ3RyYWNrJyAmJiAoc3RhdC50cmFja0lkZW50aWZpZXIgPT09ICd2aWRlb19sYWJlbCcgfHwgc3RhdC5raW5kID09PSAndmlkZW8nKSkge1xuICAgICAgICAgICAgdGhpcy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNEcm9wcGVkID0gc3RhdC5mcmFtZXNEcm9wcGVkO1xuICAgICAgICAgICAgdGhpcy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNSZWNlaXZlZCA9IHN0YXQuZnJhbWVzUmVjZWl2ZWQ7XG4gICAgICAgICAgICB0aGlzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lSGVpZ2h0ID0gc3RhdC5mcmFtZUhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVXaWR0aCA9IHN0YXQuZnJhbWVXaWR0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVUcmFuc3BvcnQoc3RhdCkge1xuICAgICAgICB0aGlzLnRyYW5zcG9ydFN0YXRzID0gc3RhdDtcbiAgICB9XG4gICAgaGFuZGxlQ29kZWMoc3RhdCkge1xuICAgICAgICBjb25zdCBjb2RlY0lkID0gc3RhdC5pZDtcbiAgICAgICAgdGhpcy5jb2RlY3Muc2V0KGNvZGVjSWQsIHN0YXQpO1xuICAgIH1cbiAgICBoYW5kbGVTZXNzaW9uU3RhdGlzdGljcyh2aWRlb1N0YXJ0VGltZSwgaW5wdXRDb250cm9sbGVyLCB2aWRlb0VuY29kZXJBdmdRUCkge1xuICAgICAgICBjb25zdCBkZWx0YVRpbWUgPSBEYXRlLm5vdygpIC0gdmlkZW9TdGFydFRpbWU7XG4gICAgICAgIHRoaXMuc2Vzc2lvblN0YXRzLnJ1blRpbWUgPSBuZXcgRGF0ZShkZWx0YVRpbWUpLnRvSVNPU3RyaW5nKCkuc3Vic3RyKDExLCA4KS50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBjb250cm9sc1N0cmVhbUlucHV0ID0gaW5wdXRDb250cm9sbGVyID09PSBudWxsID8gJ05vdCBzZW50IHlldCcgOiBpbnB1dENvbnRyb2xsZXIgPyAndHJ1ZScgOiAnZmFsc2UnO1xuICAgICAgICB0aGlzLnNlc3Npb25TdGF0cy5jb250cm9sc1N0cmVhbUlucHV0ID0gY29udHJvbHNTdHJlYW1JbnB1dDtcbiAgICAgICAgdGhpcy5zZXNzaW9uU3RhdHMudmlkZW9FbmNvZGVyQXZnUVAgPSB2aWRlb0VuY29kZXJBdmdRUDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSB2YWx1ZSBjb21pbmcgaW4gZnJvbSBvdXIgc3RhdHMgaXMgYWN0dWFsbHkgYSBudW1iZXJcbiAgICAgKiBAcGFyYW0gdmFsdWUgLSB0aGUgbnVtYmVyIHRvIGJlIGNoZWNrZWRcbiAgICAgKi9cbiAgICBpc051bWJlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWx1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGFjdGl2ZSBjYW5kaWRhdGUgcGFpclxuICAgICAqIEByZXR1cm5zIFRoZSBjYW5kaWRhdGUgcGFpciB0aGF0IGlzIGN1cnJlbnRseSByZWNlaXZpbmcgZGF0YVxuICAgICAqL1xuICAgIGdldEFjdGl2ZUNhbmRpZGF0ZVBhaXIoKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbmRpZGF0ZVBhaXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBSVENUcmFuc3BvcnQgc3RhdCBpcyBub3QgdW5kZWZpbmVkXG4gICAgICAgIGlmICh0aGlzLnRyYW5zcG9ydFN0YXRzKSB7XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGNhbmRpZGF0ZSBwYWlyIHRoYXQgbWF0Y2hlcyB0aGUgdHJhbnNwb3J0IGNhbmRpZGF0ZSBwYWlyIGlkXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBhaXIgPSB0aGlzLmNhbmRpZGF0ZVBhaXJzLmZpbmQoKGNhbmRpZGF0ZVBhaXIpID0+IGNhbmRpZGF0ZVBhaXIuaWQgPT09IHRoaXMudHJhbnNwb3J0U3RhdHMuc2VsZWN0ZWRDYW5kaWRhdGVQYWlySWQpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkUGFpciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRQYWlyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgYC5zZWxlY3RlZGAgbWVtYmVyIG9mIHRoZSBjYW5kaWRhdGUgcGFpclxuICAgICAgICBjb25zdCBzZWxlY3RlZFBhaXIgPSB0aGlzLmNhbmRpZGF0ZVBhaXJzLmZpbmQoKGNhbmRpZGF0ZVBhaXIpID0+IGNhbmRpZGF0ZVBhaXIuc2VsZWN0ZWQpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRQYWlyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkUGFpcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFnZ3JlZ2F0ZWRTdGF0cy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBJQ0UgQ2FuZGlkYXRlIFBhaXIgU3RhdHMgY29sbGVjdGVkIGZyb20gdGhlIFJUQyBTdGF0cyBSZXBvcnRcbiAqL1xuZXhwb3J0IGNsYXNzIENhbmRpZGF0ZVBhaXJTdGF0cyB7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1DYW5kaWRhdGVQYWlyU3RhdHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogSUNFIENhbmRpZGF0ZSBTdGF0IGNvbGxlY3RlZCBmcm9tIHRoZSBSVEMgU3RhdHMgUmVwb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBDYW5kaWRhdGVTdGF0IHtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNhbmRpZGF0ZVN0YXQuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogRGF0YSBDaGFubmVsIFN0YXRzIGNvbGxlY3RlZCBmcm9tIHRoZSBSVEMgU3RhdHMgUmVwb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhQ2hhbm5lbFN0YXRzIHtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPURhdGFDaGFubmVsU3RhdHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogSW5ib3VuZCBBdWRpbyBTdGF0cyBjb2xsZWN0ZWQgZnJvbSB0aGUgUlRDIFN0YXRzIFJlcG9ydFxuICovXG5leHBvcnQgY2xhc3MgSW5ib3VuZEF1ZGlvU3RhdHMge1xufVxuLyoqXG4gKiBJbmJvdW5kIFZpZGVvIFN0YXRzIGNvbGxlY3RlZCBmcm9tIHRoZSBSVEMgU3RhdHMgUmVwb3J0XG4gKi9cbmV4cG9ydCBjbGFzcyBJbmJvdW5kVmlkZW9TdGF0cyB7XG59XG4vKipcbiAqIEluYm91bmQgU3RhdHMgY29sbGVjdGVkIGZyb20gdGhlIFJUQyBTdGF0cyBSZXBvcnRcbiAqL1xuZXhwb3J0IGNsYXNzIEluYm91bmRSVFBTdGF0cyB7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbmJvdW5kUlRQU3RhdHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogUmVwcmVzZW50cyBlaXRoZXIgYTpcbiAqIC0gc3luY2hyb25pemF0aW9uIHNvdXJjZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1JUQ1J0cFJlY2VpdmVyL2dldFN5bmNocm9uaXphdGlvblNvdXJjZXNcbiAqIC0gY29udHJpYnV0aW5nIHNvdXJjZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1JUQ1J0cFJlY2VpdmVyL2dldENvbnRyaWJ1dGluZ1NvdXJjZXNcbiAqIFdoaWNoIGFsc28gKGlmIGJyb3dzZXIgc3VwcG9ydHMgaXQpIG1heSBvcHRpb25hbGwgY29udGFpbiBmaWVsZHMgZm9yIGNhcHR1cmVUaW1lc3RhbXAgKyBzZW5kZXJDYXB0dXJlVGltZU9mZnNldFxuICogaWYgdGhlIGFicy1jYXB0dXJlLXRpbWUgUlRQIGhlYWRlciBleHRlbnNpb24gaXMgZW5hYmxlZCAoY3VycmVudGx5IHRoaXMgb25seSB3b3JrcyBpbiBDaHJvbWl1bSBiYXNlZCBicm93c2VycykuXG4gKi9cbmNsYXNzIFJUQ1J0cENhcHR1cmVTb3VyY2Uge1xufVxuLyoqXG4gKiBGcmFtZVRpbWluZ0luZm8gaXMgYSBDaHJvbWl1bS1zcGVjaWZpYyBzZXQgb2YgV2ViUlRDIHN0YXRzIHVzZWZ1bCBmb3IgbGF0ZW5jeSBjYWxjdWxhdGlvbi4gSXQgaXMgc3RvcmVkIGluIFdlYlJUQyBzdGF0cyBhcyBgZ29vZ1RpbWluZ0ZyYW1lSW5mb2AuXG4gKiBJdCBpcyBkZWZpbmVkIGFzIGFuIFJUUCBoZWFkZXIgZXh0ZW5zaW9uIGhlcmU6IGh0dHBzOi8vd2VicnRjLmdvb2dsZXNvdXJjZS5jb20vc3JjLysvcmVmcy9oZWFkcy9tYWluL2RvY3MvbmF0aXZlLWNvZGUvcnRwLWhkcmV4dC92aWRlby10aW1pbmcvUkVBRE1FLm1kXG4gKiBJdCBpcyBkZWZpbmVkIGluIHNvdXJjZSBjb2RlIGhlcmU6IGh0dHBzOi8vc291cmNlLmNocm9taXVtLm9yZy9jaHJvbWl1bS9jaHJvbWl1bS9zcmMvKy9tYWluOnRoaXJkX3BhcnR5L3dlYnJ0Yy9hcGkvdmlkZW8vdmlkZW9fdGltaW5nLmNjO2w9ODI7ZHJjPThkMzk5ODE3MjgyZTNjMTJlZDU0ZWIyM2VjNDJhNWU0MTgyOThlYzZcbiAqIEl0IGlzIGRpc2N1c3NlZCBieSBpdHMgYXV0aG9yIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS93M2Mvd2VicnRjLXByb3Zpc2lvbmFsLXN0YXRzL2lzc3Vlcy80MCNpc3N1ZWNvbW1lbnQtMTI3MjkxNjY5MlxuICogSW4gc3VtbWFyeSBpdCBhIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcgdGhhdCBjb250YWlucyB0aGUgZm9sbG93aW5nIChpbiB0aGlzIG9yZGVyKTpcbiAqIDEpICBSVFAgdGltZXN0YW1wOiB0aGUgUlRQIHRpbWVzdGFtcCBvZiB0aGUgZnJhbWVcbiAqIDIpICBDYXB0dXJlIHRpbWU6IHRpbWVzdGFtcCB3aGVuIHRoaXMgZnJhbWUgd2FzIGNhcHR1cmVkXG4gKiAzKSAgRW5jb2RlIHN0YXJ0OiB0aW1lc3RhbXAgd2hlbiB0aGlzIGZyYW1lIHN0YXJ0ZWQgdG8gYmUgZW5jb2RlZFxuICogNCkgIEVuY29kZSBmaW5pc2g6IHRpbWVzdGFtcCB3aGVuIHRoaXMgZnJhbWUgZmluaXNoZWQgZW5jb2RpbmdcbiAqIDUpICBQYWNrZXRpemF0aW9uIGZpbmlzaDogdGltZXN0YW1wIHdoZW4gdGhpcyBmcmFtZSB3YXMgc3BsaXQgaW50byBwYWNrZXRzIGFuZCB3YXMgcmVhZHkgdG8gYmUgc2VudCBvdmVyIHRoZSBuZXR3b3JrXG4gKiA2KSAgUGFjZXIgZXhpdDogdGltZXN0YW1wIHdoZW4gbGFzdCBwYWNrZXQgb2YgdGhpcyBmcmFtZSB3YXMgc2VudCBvdmVyIHRoZSBuZXR3b3JrIGJ5IHRoZSBzZW5kZXIgYXQgdGhpcyB0aW1lc3RhbXBcbiAqIDcpICBOZXR3b3JrIHRpbWVzdGFtcDE6IHBsYWNlIGZvciB0aGUgU0ZVIHRvIG1hcmsgd2hlbiB0aGUgZnJhbWUgc3RhcnRlZCBiZWluZyBmb3J3YXJkZWQuIEFwcGxpY2F0aW9uIHNwZWNpZmljLlxuICogOCkgIE5ldHdvcmsgdGltZXN0YW1wMjogcGxhY2UgZm9yIHRoZSBTRlUgdG8gbWFyayB3aGVuIHRoZSBmcmFtZSBmaW5pc2hlZCBiZWluZyBmb3J3YXJkZWQuIEFwcGxpY2F0aW9uIHNwZWNpZmljLlxuICogOSkgIFJlY2VpdmUgc3RhcnQ6IHRpbWVzdGFtcCB3aGVuIHRoZSBmaXJzdCBwYWNrZXQgb2YgdGhpcyBmcmFtZSB3YXMgcmVjZWl2ZWRcbiAqIDEwKSBSZWNlaXZlIGZpbmlzaDogdGltZXN0YW1wIHdoZW4gdGhlIGxhc3QgcGFja2V0IG9mIHRoaXMgZnJhbWUgd2FzIHJlY2VpdmVkXG4gKiAxMSkgRGVjb2RlIHN0YXJ0OiAgdGltZXN0YW1wIHdoZW4gdGhlIGZyYW1lIHdhcyBwYXNzZWQgdG8gZGVjb2RlclxuICogMTIpIERlY29kZSBmaW5pc2g6ICB0aW1lc3RhbXAgd2hlbiB0aGUgZnJhbWUgd2FzIGRlY29kZWRcbiAqIDEzKSBSZW5kZXIgdGltZTogIHRpbWVzdGFtcCBvZiB0aGUgcHJvamVjdGVkIHJlbmRlciB0aW1lIGZvciB0aGlzIGZyYW1lXG4gKiAxNCkgXCJpcyBvdXRsaWVyXCI6IGEgZmxhZyBmb3IgaWYgdGhpcyBmcmFtZSBpcyBiaWdnZXIgaW4gZW5jb2RlZCBzaXplIHRoYW4gdGhlIGF2ZXJhZ2UgZnJhbWUgYnkgYXQgbGVhc3QgNXguXG4gKiAxNSkgXCJ0cmlnZ2VyZWQgYnkgdGltZXJcIjogYSBmbGFnIGZvciBpZiB0aGlzIHJlcG9ydCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB0aW1lciAoVGhlIHJlcG9ydCBpcyBzZW50IGV2ZXJ5IDIwMG1zKVxuICovXG5leHBvcnQgY2xhc3MgRnJhbWVUaW1pbmdJbmZvIHtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyBhIGNvbWJpbmF0aW9uIG9mIGxhdGVuY3kgc3RhdGlzdGljcyB1c2luZyBwdXJlbHkgV2ViUlRDIEFQSS5cbiAqL1xuZXhwb3J0IGNsYXNzIExhdGVuY3lDYWxjdWxhdG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLyogQ2xvY2sgb2Zmc2V0IGJldHdlZW4gcGVlciBjbG9ja3MgY2Fubm90IGFsd2F5cyBiZSBjYWxjdWxhdGVkIGFzIGl0IHJlbGllcyBvZiBsYXRlc3Qgc2VuZGVyIHJlcG9ydHMuXG4gICAgICAgICAqIHNvIHdlIHN0b3JlIHRoZSBsYXN0IHRpbWUgd2UgaGFkIGEgdmFsaWQgY2xvY2sgb2Zmc2V0IGluIHRoZSBhc3N1bXB0aW9uIHRoYXQgY2xvY2tzIGhhdmVuJ3QgZHJpZnRlZCB0b28gbXVjaCBzaW5jZSB0aGVuLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5sYXRlc3RTZW5kZXJSZWN2Q2xvY2tPZmZzZXQgPSBudWxsO1xuICAgIH1cbiAgICBjYWxjdWxhdGUoc3RhdHMsIHJlY2VpdmVycykge1xuICAgICAgICBjb25zdCBsYXRlbmN5SW5mbyA9IG5ldyBMYXRlbmN5SW5mbygpO1xuICAgICAgICBjb25zdCBydHRNUyA9IHRoaXMuZ2V0UlRUTXMoc3RhdHMpO1xuICAgICAgICBpZiAocnR0TVMgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGF0ZW5jeUluZm8ucnR0TXMgPSBydHRNUztcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBzZW5kZXIgbGF0ZW5jeSB1c2luZyB0aGUgZmlyc3QgdmFsaWQgdmlkZW8gc3NyYy9jc3JjXG4gICAgICAgICAgICBjb25zdCBjYXB0dXJlU291cmNlID0gdGhpcy5nZXRDYXB0dXJlU291cmNlKHJlY2VpdmVycyk7XG4gICAgICAgICAgICBpZiAoY2FwdHVyZVNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VuZGVyTGF0ZW5jeU1zID0gdGhpcy5jYWxjdWxhdGVTZW5kZXJMYXRlbmN5KHN0YXRzLCBjYXB0dXJlU291cmNlKTtcbiAgICAgICAgICAgICAgICBpZiAoc2VuZGVyTGF0ZW5jeU1zICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhdGVuY3lJbmZvLnNlbmRlckxhdGVuY3lNcyA9IHNlbmRlckxhdGVuY3lNcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYnJ0Yy1zdGF0cy8jZG9tLXJ0Y2luYm91bmRydHBzdHJlYW1zdGF0cy10b3RhbHByb2Nlc3NpbmdkZWxheVxuICAgICAgICBpZiAoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMudG90YWxQcm9jZXNzaW5nRGVsYXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzRGVjb2RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYXRlbmN5SW5mby5hdmVyYWdlUHJvY2Vzc2luZ0RlbGF5TXMgPVxuICAgICAgICAgICAgICAgIChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy50b3RhbFByb2Nlc3NpbmdEZWxheSAvIHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0RlY29kZWQpICogMTAwMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2VicnRjLXN0YXRzLyNkb20tcnRjaW5ib3VuZHJ0cHN0cmVhbXN0YXRzLWppdHRlcmJ1ZmZlcm1pbmltdW1kZWxheVxuICAgICAgICBpZiAoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuaml0dGVyQnVmZmVyRGVsYXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuaml0dGVyQnVmZmVyRW1pdHRlZENvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLmF2ZXJhZ2VKaXR0ZXJCdWZmZXJEZWxheU1zID1cbiAgICAgICAgICAgICAgICAoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuaml0dGVyQnVmZmVyRGVsYXkgL1xuICAgICAgICAgICAgICAgICAgICBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5qaXR0ZXJCdWZmZXJFbWl0dGVkQ291bnQpICpcbiAgICAgICAgICAgICAgICAgICAgMTAwMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2VicnRjLXN0YXRzLyNkb20tcnRjaW5ib3VuZHJ0cHN0cmVhbXN0YXRzLXRvdGFsZGVjb2RldGltZVxuICAgICAgICBpZiAoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzRGVjb2RlZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy50b3RhbERlY29kZVRpbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGF0ZW5jeUluZm8uYXZlcmFnZURlY29kZUxhdGVuY3lNcyA9XG4gICAgICAgICAgICAgICAgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLnRvdGFsRGVjb2RlVGltZSAvIHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0RlY29kZWQpICogMTAwMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2VicnRjLXN0YXRzLyNkb20tcnRjaW5ib3VuZHJ0cHN0cmVhbXN0YXRzLWZyYW1lc2Fzc2VtYmxlZGZyb21tdWx0aXBsZXBhY2tldHNcbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLnRvdGFsQXNzZW1ibHlUaW1lICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0Fzc2VtYmxlZEZyb21NdWx0aXBsZVBhY2tldHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGF0ZW5jeUluZm8uYXZlcmFnZUFzc2VtYmx5RGVsYXlNcyA9XG4gICAgICAgICAgICAgICAgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLnRvdGFsQXNzZW1ibHlUaW1lIC9cbiAgICAgICAgICAgICAgICAgICAgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzQXNzZW1ibGVkRnJvbU11bHRpcGxlUGFja2V0cykgKlxuICAgICAgICAgICAgICAgICAgICAxMDAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4dHJhY3QgZXh0cmEgQ2hyb21lLXNwZWNpZmljIHN0YXRzIGxpa2UgZW5jb2RpbmcgbGF0ZW5jeVxuICAgICAgICBpZiAoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZ29vZ1RpbWluZ0ZyYW1lSW5mbyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5nb29nVGltaW5nRnJhbWVJbmZvLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nID0gdGhpcy5leHRyYWN0RnJhbWVUaW1pbmdJbmZvKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmdvb2dUaW1pbmdGcmFtZUluZm8pO1xuICAgICAgICB9XG4gICAgICAgIC8vIENhbGN1bGF0ZSBFMkUgbGF0ZW5jeSB1c2luZyB2aWRlby10aW1pbmcgY2FwdHVyZSB0byBzZW5kIHRpbWUgKyBvbmUgd2F5IG5ldHdvcmsgbGF0ZW5jeSArIHJlY2VpdmVyLXNpZGUgbGF0ZW5jeVxuICAgICAgICBpZiAobGF0ZW5jeUluZm8uZnJhbWVUaW1pbmcgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbGF0ZW5jeUluZm8uZnJhbWVUaW1pbmcuY2FwdHVyZVRvU2VuZExhdGVuY3lNcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBsYXRlbmN5SW5mby5hdmVyYWdlUHJvY2Vzc2luZ0RlbGF5TXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbGF0ZW5jeUluZm8ucnR0TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGF0ZW5jeUluZm8uYXZlcmFnZUUyRUxhdGVuY3kgPVxuICAgICAgICAgICAgICAgIGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nLmNhcHR1cmVUb1NlbmRMYXRlbmN5TXMgK1xuICAgICAgICAgICAgICAgICAgICBsYXRlbmN5SW5mby5ydHRNcyAqIDAuNSArXG4gICAgICAgICAgICAgICAgICAgIGxhdGVuY3lJbmZvLmF2ZXJhZ2VQcm9jZXNzaW5nRGVsYXlNcztcbiAgICAgICAgfVxuICAgICAgICAvLyBDYWxjdWxhdGUgRTJFIGxhdGVuY3kgYXMgYWJzLWNhcHR1cmUtdGltZSBjYXB0dXJlIHRvIHNlbmQgbGF0ZW5jeSArIG9uZSB3YXkgbmV0d29yayBsYXRlbmN5ICsgcmVjZWl2ZXItc2lkZSBsYXRlbmN5XG4gICAgICAgIGlmIChsYXRlbmN5SW5mby5zZW5kZXJMYXRlbmN5TXMgIT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBsYXRlbmN5SW5mby5hdmVyYWdlUHJvY2Vzc2luZ0RlbGF5TXMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgbGF0ZW5jeUluZm8ucnR0TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGF0ZW5jeUluZm8uYXZlcmFnZUUyRUxhdGVuY3kgPVxuICAgICAgICAgICAgICAgIGxhdGVuY3lJbmZvLnNlbmRlckxhdGVuY3lNcyArIGxhdGVuY3lJbmZvLnJ0dE1zICogMC41ICsgbGF0ZW5jeUluZm8uYXZlcmFnZVByb2Nlc3NpbmdEZWxheU1zO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXRlbmN5SW5mbztcbiAgICB9XG4gICAgZXh0cmFjdEZyYW1lVGltaW5nSW5mbyhnb29nVGltaW5nRnJhbWVJbmZvKSB7XG4gICAgICAgIGNvbnN0IHRpbWluZ0luZm8gPSBuZXcgRnJhbWVUaW1pbmdJbmZvKCk7XG4gICAgICAgIGNvbnN0IHRpbWluZ0luZm9BcnIgPSBnb29nVGltaW5nRnJhbWVJbmZvLnNwbGl0KCcsJyk7XG4gICAgICAgIC8vIFNob3VsZCBoYXZlIGV4YWN0bHkgMTUgZWxlbWVudHMgYWNjb3JkaW5nIHRvOlxuICAgICAgICAvLyBodHRwczovL3NvdXJjZS5jaHJvbWl1bS5vcmcvY2hyb21pdW0vY2hyb21pdW0vc3JjLysvbWFpbjp0aGlyZF9wYXJ0eS93ZWJydGMvYXBpL3ZpZGVvL3ZpZGVvX3RpbWluZy5jYztsPTgyO2RyYz04ZDM5OTgxNzI4MmUzYzEyZWQ1NGViMjNlYzQyYTVlNDE4Mjk4ZWM2XG4gICAgICAgIGlmICh0aW1pbmdJbmZvQXJyLmxlbmd0aCA9PT0gMTUpIHtcbiAgICAgICAgICAgIHRpbWluZ0luZm8ucnRwVGltZXN0YW1wID0gTnVtYmVyLnBhcnNlSW50KHRpbWluZ0luZm9BcnJbMF0pO1xuICAgICAgICAgICAgdGltaW5nSW5mby5jYXB0dXJlVGltZXN0YW1wID0gTnVtYmVyLnBhcnNlSW50KHRpbWluZ0luZm9BcnJbMV0pO1xuICAgICAgICAgICAgdGltaW5nSW5mby5lbmNvZGVTdGFydFRpbWVzdGFtcCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzJdKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8uZW5jb2RlRmluaXNoVGltZXN0YW1wID0gTnVtYmVyLnBhcnNlSW50KHRpbWluZ0luZm9BcnJbM10pO1xuICAgICAgICAgICAgdGltaW5nSW5mby5wYWNrZXRpemVyRmluaXNoVGltZXN0YW1wID0gTnVtYmVyLnBhcnNlSW50KHRpbWluZ0luZm9BcnJbNF0pO1xuICAgICAgICAgICAgdGltaW5nSW5mby5wYWNlckV4aXRUaW1lc3RhbXAgPSBOdW1iZXIucGFyc2VJbnQodGltaW5nSW5mb0Fycls1XSk7XG4gICAgICAgICAgICB0aW1pbmdJbmZvLm5ldHdvcmtUaW1lc3RhbXAxID0gTnVtYmVyLnBhcnNlSW50KHRpbWluZ0luZm9BcnJbNl0pO1xuICAgICAgICAgICAgdGltaW5nSW5mby5uZXR3b3JrVGltZXN0YW1wMiA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzddKTtcbiAgICAgICAgICAgIHRpbWluZ0luZm8ucmVjZWl2ZVN0YXJ0ID0gTnVtYmVyLnBhcnNlSW50KHRpbWluZ0luZm9BcnJbOF0pO1xuICAgICAgICAgICAgdGltaW5nSW5mby5yZWNlaXZlRmluaXNoID0gTnVtYmVyLnBhcnNlSW50KHRpbWluZ0luZm9BcnJbOV0pO1xuICAgICAgICAgICAgdGltaW5nSW5mby5kZWNvZGVTdGFydCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzEwXSk7XG4gICAgICAgICAgICB0aW1pbmdJbmZvLmRlY29kZUZpbmlzaCA9IE51bWJlci5wYXJzZUludCh0aW1pbmdJbmZvQXJyWzExXSk7XG4gICAgICAgICAgICB0aW1pbmdJbmZvLnJlbmRlclRpbWUgPSBOdW1iZXIucGFyc2VJbnQodGltaW5nSW5mb0FyclsxMl0pO1xuICAgICAgICAgICAgdGltaW5nSW5mby5pc091dGxpZXIgPSBOdW1iZXIucGFyc2VJbnQodGltaW5nSW5mb0FyclsxM10pID4gMDtcbiAgICAgICAgICAgIHRpbWluZ0luZm8uaXNUcmlnZ2VyZWRCeVRpbWVyID0gTnVtYmVyLnBhcnNlSW50KHRpbWluZ0luZm9BcnJbMTRdKSA+IDA7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgc29tZSBsYXRlbmN5IHN0YXRzXG4gICAgICAgICAgICB0aW1pbmdJbmZvLmVuY29kZXJMYXRlbmN5TXMgPSB0aW1pbmdJbmZvLmVuY29kZUZpbmlzaFRpbWVzdGFtcCAtIHRpbWluZ0luZm8uZW5jb2RlU3RhcnRUaW1lc3RhbXA7XG4gICAgICAgICAgICB0aW1pbmdJbmZvLnBhY2tldGl6ZUxhdGVuY3lNcyA9XG4gICAgICAgICAgICAgICAgdGltaW5nSW5mby5wYWNrZXRpemVyRmluaXNoVGltZXN0YW1wIC0gdGltaW5nSW5mby5lbmNvZGVGaW5pc2hUaW1lc3RhbXA7XG4gICAgICAgICAgICB0aW1pbmdJbmZvLnBhY2VyTGF0ZW5jeU1zID0gdGltaW5nSW5mby5wYWNlckV4aXRUaW1lc3RhbXAgLSB0aW1pbmdJbmZvLnBhY2tldGl6ZXJGaW5pc2hUaW1lc3RhbXA7XG4gICAgICAgICAgICB0aW1pbmdJbmZvLmNhcHR1cmVUb1NlbmRMYXRlbmN5TXMgPSB0aW1pbmdJbmZvLnBhY2VyRXhpdFRpbWVzdGFtcCAtIHRpbWluZ0luZm8uY2FwdHVyZVRpbWVzdGFtcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGltaW5nSW5mbztcbiAgICB9XG4gICAgY2FsY3VsYXRlU2VuZGVyTGF0ZW5jeShzdGF0cywgY2FwdHVyZVNvdXJjZSkge1xuICAgICAgICAvLyBUaGUgY2FsY3VsYXRpb24gcGVyZm9ybWVkIGluIHRoaXMgZnVuY3Rpb24gaXMgYXMgcGVyIHRoZSBwcm9jZWR1cmUgZGVmaW5lZCBoZXJlOlxuICAgICAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2VicnRjLWV4dGVuc2lvbnMvI2RvbS1ydGNydHBjb250cmlidXRpbmdzb3VyY2Utc2VuZGVyY2FwdHVyZXRpbWVvZmZzZXRcbiAgICAgICAgLy8gR2V0IHRoZSBzZW5kZXIgY2FwdHVyZSBpbiB0aGUgc2VuZGVyJ3MgY2xvY2tcbiAgICAgICAgY29uc3Qgc2VuZGVyQ2FwdHVyZVRpbWVzdGFtcCA9IGNhcHR1cmVTb3VyY2UuY2FwdHVyZVRpbWVzdGFtcCArIGNhcHR1cmVTb3VyY2Uuc2VuZGVyQ2FwdHVyZVRpbWVPZmZzZXQ7XG4gICAgICAgIGxldCBzZW5kUmVjdkNsb2NrT2Zmc2V0ID0gdGhpcy5jYWxjdWxhdGVTZW5kZXJSZWNlaXZlckNsb2NrT2Zmc2V0KHN0YXRzKTtcbiAgICAgICAgLy8gVXNlIGxhdGVzdCBjbG9jayBvZmZzZXQgaWYgd2UgY291bGRuJ3QgY2FsY3VsYXRlIG9uZSBub3dcbiAgICAgICAgaWYgKHNlbmRSZWN2Q2xvY2tPZmZzZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubGF0ZXN0U2VuZGVyUmVjdkNsb2NrT2Zmc2V0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBzZW5kUmVjdkNsb2NrT2Zmc2V0ID0gdGhpcy5sYXRlc3RTZW5kZXJSZWN2Q2xvY2tPZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGF0ZXN0U2VuZGVyUmVjdkNsb2NrT2Zmc2V0ID0gc2VuZFJlY3ZDbG9ja09mZnNldDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGlzIGJyaW5ncyBzZW5kZXIgY2xvY2sgcm91Z2hseSBpbmxpbmUgd2l0aCByZWN2IGNsb2NrXG4gICAgICAgIGNvbnN0IHJlY3ZDYXB0dXJlVGltZXN0YW1wTlRQID0gc2VuZGVyQ2FwdHVyZVRpbWVzdGFtcCArIHNlbmRSZWN2Q2xvY2tPZmZzZXQ7XG4gICAgICAgIC8vIEFzIGRlZmluZWQgaW4gQ2hyb21lIHNvdXJjZTogaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2V4dGVybmFsL3dlYnJ0Yy8rL21hc3Rlci9zeXN0ZW1fd3JhcHBlcnMvaW5jbHVkZS9jbG9jay5oIzI2XG4gICAgICAgIGNvbnN0IG50cDE5NzAgPSAyMjA4OTg4ODAwMDAwO1xuICAgICAgICBjb25zdCByZWN2Q2FwdHVyZVRpbWVzdGFtcCA9IHJlY3ZDYXB0dXJlVGltZXN0YW1wTlRQIC0gbnRwMTk3MDtcbiAgICAgICAgY29uc3Qgc2VuZGVyTGF0ZW5jeSA9IGNhcHR1cmVTb3VyY2UudGltZXN0YW1wIC0gcmVjdkNhcHR1cmVUaW1lc3RhbXA7XG4gICAgICAgIHJldHVybiBzZW5kZXJMYXRlbmN5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSBmaXJzdCB2YWxpZCBzc3JjIG9yIGNzcmMgdGhhdCBoYXMgY2FwdHVyZSB0aW1lIGZpZWxkcyBwcmVzZW50IGZyb20gYWJzLWNhcHR1cmUtdGltZSBoZWFkZXIgZXh0ZW5zaW9uLlxuICAgICAqIEBwYXJhbSByZWNlaXZlcnMgVGhlIFJUUCByZWNldmllcnMgdGhpcyBwZWVyIGNvbm5lY3Rpb24gaGFzLlxuICAgICAqIEByZXR1cm5zIEEgc2luZ2xlIHZhbGlkIHNzcmMgb3IgY3NyYyB0aGF0IGhhcyBjYXB0dXJlIHRpbWUgZmllbGRzIG9yIG51bGwgaWYgdGhlcmUgaXMgbm9uZSAoZS5nLiBpbiBub24tY2hyb21pdW0gYnJvd3NlcnMgaXQgd2lsbCBiZSBudWxsKS5cbiAgICAgKi9cbiAgICBnZXRDYXB0dXJlU291cmNlKHJlY2VpdmVycykge1xuICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdmlkZW8gcmVjZWl2ZXJzXG4gICAgICAgIHJlY2VpdmVycyA9IHJlY2VpdmVycy5maWx0ZXIoKHJlY2VpdmVyKSA9PiByZWNlaXZlci50cmFjay5raW5kID09PSAndmlkZW8nKTtcbiAgICAgICAgZm9yIChjb25zdCByZWNlaXZlciBvZiByZWNlaXZlcnMpIHtcbiAgICAgICAgICAgIC8vIEdvIHRocm91Z2ggYWxsIHNzcmMgYW5kIGNzcmMgdG8gY2hlY2sgZm9yIGNhcHR1cmUgdGltZXN0YW1wXG4gICAgICAgICAgICAvLyBOb3RlOiBDb252ZXJzaW9uIHRvIGBhbnlgIGhlcmUgaXMgYmVjYXVzZSBUUyBkb2VzIG5vdCBoYXZlIGNhcHR1cmVUaW1lc3RhbXAgZXRjIGRlZmluZWQgaW4gdGhlIHR5cGVzXG4gICAgICAgICAgICAvLyB0aGVzZSBmaWVsZHMgb25seSBleGlzdCBpbiBDaHJvbWl1bSBjdXJyZW50bHkuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VzID0gcmVjZWl2ZXJcbiAgICAgICAgICAgICAgICAuZ2V0U3luY2hyb25pemF0aW9uU291cmNlcygpXG4gICAgICAgICAgICAgICAgLmNvbmNhdChyZWNlaXZlci5nZXRDb250cmlidXRpbmdTb3VyY2VzKCkpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzcmMgb2Ygc291cmNlcykge1xuICAgICAgICAgICAgICAgIGlmIChzcmMuY2FwdHVyZVRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgIHNyYy5zZW5kZXJDYXB0dXJlVGltZU9mZnNldCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgIHNyYy50aW1lc3RhbXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYXB0dXJlU3JjID0gbmV3IFJUQ1J0cENhcHR1cmVTb3VyY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVNyYy50aW1lc3RhbXAgPSBzcmMudGltZXN0YW1wO1xuICAgICAgICAgICAgICAgICAgICBjYXB0dXJlU3JjLmNhcHR1cmVUaW1lc3RhbXAgPSBzcmMuY2FwdHVyZVRpbWVzdGFtcDtcbiAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVNyYy5zZW5kZXJDYXB0dXJlVGltZU9mZnNldCA9IHNyYy5zZW5kZXJDYXB0dXJlVGltZU9mZnNldDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhcHR1cmVTcmM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjYWxjdWxhdGVTZW5kZXJSZWNlaXZlckNsb2NrT2Zmc2V0KHN0YXRzKSB7XG4gICAgICAgIC8vIFRoZSBjYWxjdWxhdGlvbiBwZXJmb3JtZWQgaW4gdGhpcyBmdW5jdGlvbiBpcyBhcyBwZXIgdGhlIHByb2NlZHVyZSBkZWZpbmVkIGhlcmU6XG4gICAgICAgIC8vIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJydGMtZXh0ZW5zaW9ucy8jZG9tLXJ0Y3J0cGNvbnRyaWJ1dGluZ3NvdXJjZS1zZW5kZXJjYXB0dXJldGltZW9mZnNldFxuICAgICAgICBjb25zdCBoYXNSZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMgPSBzdGF0cy5yZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgc3RhdHMucmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzLnRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMucmVtb3RlVGltZXN0YW1wICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIC8vIE5vdGU6IEFzIG9mIENocm9tZSAxMzIsIHJlbW90ZS1vdXRib3VuZC1ydHAgc3RhdHMgZm9yIHZpZGVvIGFyZSBub3QgeWV0IGltcGxlbWVudGVkIChhdWRpbyB3b3JrcykuXG4gICAgICAgIC8vIFRoaXMgY29kZXBhdGggc2hvdWxkIGFjdGl2YXRlIG9uY2UgdGhleSBkbyBiZWdpbiB0byB3b3JrLlxuICAgICAgICBpZiAoIWhhc1JlbW90ZU91dGJvdW5kVmlkZW9TdGF0cykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVtb3RlU3RhdHNBcnJpdmVkVGltZXN0YW1wID0gc3RhdHMucmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzLnRpbWVzdGFtcDtcbiAgICAgICAgY29uc3QgcmVtb3RlU3RhdHNTZW50VGltZXN0YW1wID0gc3RhdHMucmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzLnJlbW90ZVRpbWVzdGFtcDtcbiAgICAgICAgY29uc3QgcnR0TXMgPSB0aGlzLmdldFJUVE1zKHN0YXRzKTtcbiAgICAgICAgaWYgKHJlbW90ZVN0YXRzQXJyaXZlZFRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICByZW1vdGVTdGF0c1NlbnRUaW1lc3RhbXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgcnR0TXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IG9uZXdheURlbGF5ID0gcnR0TXMgKiAwLjU7XG4gICAgICAgICAgICByZXR1cm4gcmVtb3RlU3RhdHNBcnJpdmVkVGltZXN0YW1wIC0gKHJlbW90ZVN0YXRzU2VudFRpbWVzdGFtcCArIG9uZXdheURlbGF5KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDb3VsZCBub3QgZ2V0IHN0YXRzIHRvIGNhbGN1bGF0ZSBzZW5kZXIvcmVjZWl2ZXIgY2xvY2sgb2Zmc2V0XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0UlRUTXMoc3RhdHMpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGdldCBpdCBmcm9tIHRoZSBhY3RpdmUgY2FuZGlkYXRlIHBhaXJcbiAgICAgICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlUGFpciA9IHN0YXRzLmdldEFjdGl2ZUNhbmRpZGF0ZVBhaXIoKTtcbiAgICAgICAgaWYgKCEhYWN0aXZlQ2FuZGlkYXRlUGFpciAmJiBhY3RpdmVDYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1clJUVFNlY29uZHMgPSBhY3RpdmVDYW5kaWRhdGVQYWlyLmN1cnJlbnRSb3VuZFRyaXBUaW1lO1xuICAgICAgICAgICAgcmV0dXJuIGN1clJUVFNlY29uZHMgKiAxMDAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5leHQgdHJ5IHRvIGdldCBpdCBmcm9tIHJlbW90ZS1vdXRib3VuZC1ydHAgdmlkZW8gc3RhdHNcbiAgICAgICAgaWYgKCEhc3RhdHMucmVtb3RlT3V0Ym91bmRWaWRlb1N0YXRzICYmXG4gICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZFZpZGVvU3RhdHMudG90YWxSb3VuZFRyaXBUaW1lICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHN0YXRzLnJlbW90ZU91dGJvdW5kVmlkZW9TdGF0cy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHN0YXRzLnJlbW90ZU91dGJvdW5kVmlkZW9TdGF0cy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzID4gMCkge1xuICAgICAgICAgICAgY29uc3QgYXZnUnR0U2Vjb25kcyA9IHN0YXRzLnJlbW90ZU91dGJvdW5kVmlkZW9TdGF0cy50b3RhbFJvdW5kVHJpcFRpbWUgL1xuICAgICAgICAgICAgICAgIHN0YXRzLnJlbW90ZU91dGJvdW5kVmlkZW9TdGF0cy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzO1xuICAgICAgICAgICAgcmV0dXJuIGF2Z1J0dFNlY29uZHMgKiAxMDAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5leHQgdHJ5IHRvIGdldCBpdCBmcm9tIHJlbW90ZS1vdXRib3VuZC1ydHAgYXVkaW8gc3RhdHNcbiAgICAgICAgaWYgKCEhc3RhdHMucmVtb3RlT3V0Ym91bmRBdWRpb1N0YXRzICYmXG4gICAgICAgICAgICBzdGF0cy5yZW1vdGVPdXRib3VuZEF1ZGlvU3RhdHMudG90YWxSb3VuZFRyaXBUaW1lICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHN0YXRzLnJlbW90ZU91dGJvdW5kQXVkaW9TdGF0cy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHN0YXRzLnJlbW90ZU91dGJvdW5kQXVkaW9TdGF0cy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzID4gMCkge1xuICAgICAgICAgICAgY29uc3QgYXZnUnR0U2Vjb25kcyA9IHN0YXRzLnJlbW90ZU91dGJvdW5kQXVkaW9TdGF0cy50b3RhbFJvdW5kVHJpcFRpbWUgL1xuICAgICAgICAgICAgICAgIHN0YXRzLnJlbW90ZU91dGJvdW5kQXVkaW9TdGF0cy5yb3VuZFRyaXBUaW1lTWVhc3VyZW1lbnRzO1xuICAgICAgICAgICAgcmV0dXJuIGF2Z1J0dFNlY29uZHMgKiAxMDAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGxhdGVuY3kgaW5mb3JtYXRpb24gY2FsY3VsYXRlZCB1c2luZyB0aGUgV2ViUlRDIEFQSS5cbiAqIE1vc3Qgc3RhdHMgYXJlIGNhbGN1bGF0ZWQgZm9sbG93aW5nIHRoZSBzcGVjOlxuICogaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYnJ0Yy1zdGF0cy8jZGljdGlvbmFyeS1ydGNpbmJvdW5kcnRwc3RyZWFtc3RhdHMtbWVtYmVyc1xuICovXG5leHBvcnQgY2xhc3MgTGF0ZW5jeUluZm8ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRpbWUgdGFrZW4gZnJvbSB0aGUgbW9tZW50IGEgZnJhbWUgaXMgZG9uZSBjYXB0dXJpbmcgdG8gdGhlIG1vbWVudCBpdCBpcyBzZW50IG92ZXIgdGhlIG5ldHdvcmsuXG4gICAgICAgICAqIE5vdGU6IFRoaXMgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBpZiBib3RoIG9mZmVyIGFuZCBhbnN3ZXIgY29udGFpbiB0aGVcbiAgICAgICAgICogdGhlIFJUUCBoZWFkZXIgZXh0ZW5zaW9uIGZvciBgdmlkZW8tdGltaW5nYCAoQ2hyb21lIG9ubHkgZm9yIG5vdylcbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuc2VuZGVyTGF0ZW5jeU1zID0gdW5kZWZpbmVkO1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIHRpbWUgdGFrZW4gZnJvbSB0aGUgbW9tZW50IGEgZnJhbWUgaXMgZG9uZSBjYXB0dXJpbmcgdG8gdGhlIG1vbWVudCBpdCBpcyBzZW50IG92ZXIgdGhlIG5ldHdvcmsuXG4gICAgICAgICAqIE5vdGU6IFRoaXMgY2FuIG9ubHkgYmUgY2FsY3VsYXRlZCBpZiBib3RoIG9mZmVyIGFuZCBhbnN3ZXIgY29udGFpbiB0aGVcbiAgICAgICAgICogdGhlIFJUUCBoZWFkZXIgZXh0ZW5zaW9uIGZvciBgYWJzLWNhcHR1cmUtdGltZWAgKENocm9tZSBvbmx5IGZvciBub3cpXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnNlbmRlckxhdGVuY3lBYnNDYXB0dXJlVGltZU1zID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiBUaGUgcm91bmQgdHJpcCB0aW1lIChtaWxsaXNlY29uZHMpIGJldHdlZW4gZWFjaCBzZW5kZXItPnJlY2VpdmVyLT5zZW5kZXIgKi9cbiAgICAgICAgdGhpcy5ydHRNcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyogQXZlcmFnZSB0aW1lIHRha2VuIChtaWxsaXNlY29uZHMpIGZyb20gdmlkZW8gcGFja2V0IHJlY2VpcHQgdG8gcG9zdC1kZWNvZGUuICovXG4gICAgICAgIHRoaXMuYXZlcmFnZVByb2Nlc3NpbmdEZWxheU1zID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiBBdmVyYWdlIHRpbWUgdGFrZW4gKG1pbGxpc2Vjb25kcykgaW5zaWRlIHRoZSBqaXR0ZXIgYnVmZmVyICh3aGljaCBpcyBwb3N0LXJlY2VpcHQgYnV0IHByZS1kZWNvZGUpLiAqL1xuICAgICAgICB0aGlzLmF2ZXJhZ2VKaXR0ZXJCdWZmZXJEZWxheU1zID0gdW5kZWZpbmVkO1xuICAgICAgICAvKiBBdmVyYWdlIHRpbWUgdGFrZW4gKG1pbGxpc2Vjb25kcykgdG8gZGVjb2RlIGEgdmlkZW8gZnJhbWUuICovXG4gICAgICAgIHRoaXMuYXZlcmFnZURlY29kZUxhdGVuY3lNcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyogQXZlcmFnZSB0aW1lIHRha2VuIChtaWxsaXNlY29uZHMpIHRvIGJldHdlZW4gcmVjZWlwdCBvZiB0aGUgZmlyc3QgYW5kIGxhc3QgdmlkZW8gcGFja2V0IG9mIGEuICovXG4gICAgICAgIHRoaXMuYXZlcmFnZUFzc2VtYmx5RGVsYXlNcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgLyogVGhlIHNlbmRlciBsYXRlbmN5ICsgUlRULzIgKyBwcm9jZXNzaW5nIGRlbGF5ICovXG4gICAgICAgIHRoaXMuYXZlcmFnZUUyRUxhdGVuY3kgPSB1bmRlZmluZWQ7XG4gICAgICAgIC8qIFRpbWluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgd29yc3QgcGVyZm9ybWluZyBmcmFtZSBzaW5jZSB0aGUgbGFzdCBnZXRTdGF0cyBjYWxsIChvbmx5IHdvcmtzIG9uIENocm9tZSkgKi9cbiAgICAgICAgdGhpcy5mcmFtZVRpbWluZyA9IHVuZGVmaW5lZDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MYXRlbmN5Q2FsY3VsYXRvci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBPdXRib3VuZCBSVFAgc3RhdHMgY29sbGVjdGVkIGZyb20gdGhlIFJUQyBTdGF0cyBSZXBvcnQgdW5kZXIgYG91dGJvdW5kLXJ0cGAuXG4gKiBXcmFwcGVyIGFyb3VuZDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1JUQ091dGJvdW5kUnRwU3RyZWFtU3RhdHNcbiAqIFRoZXNlIGFyZSBzdGF0cyBmb3IgdmlkZW8gd2UgYXJlIHNlbmRpbmcgdG8gYSByZW1vdGUgcGVlci5cbiAqL1xuZXhwb3J0IGNsYXNzIE91dGJvdW5kUlRQU3RhdHMge1xufVxuLyoqXG4gKiBSZW1vdGUgb3V0Ym91bmQgc3RhdHMgY29sbGVjdGVkIGZyb20gdGhlIFJUQyBTdGF0cyBSZXBvcnQgdW5kZXIgYHJlbW90ZS1vdXRib3VuZC1ydHBgLlxuICogV3JhcHBlciBhcm91bmQ6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SVENSZW1vdGVPdXRib3VuZFJ0cFN0cmVhbVN0YXRzXG4gKiBUaGVzZSBhcmUgc3RhdHMgZm9yIG1lZGlhIHdlIGFyZSByZWNlaXZpbmcgZnJvbSBhIHJlbW90ZSBwZWVyLlxuICovXG5leHBvcnQgY2xhc3MgUmVtb3RlT3V0Ym91bmRSVFBTdGF0cyB7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1PdXRCb3VuZFJUUFN0YXRzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmltcG9ydCB7IE9wdGlvblBhcmFtZXRlcnMsIEZsYWdzIH0gZnJvbSAnLi4vQ29uZmlnL0NvbmZpZyc7XG5pbXBvcnQgeyBBZ2dyZWdhdGVkU3RhdHMgfSBmcm9tICcuL0FnZ3JlZ2F0ZWRTdGF0cyc7XG5pbXBvcnQgeyBwYXJzZVJ0cFBhcmFtZXRlcnMsIHNwbGl0U2VjdGlvbnMgfSBmcm9tICdzZHAnO1xuaW1wb3J0IHsgUlRDVXRpbHMgfSBmcm9tICcuLi9VdGlsL1JUQ1V0aWxzJztcbmltcG9ydCB7IFNEUFV0aWxzIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuaW1wb3J0IHsgTGF0ZW5jeUNhbGN1bGF0b3IgfSBmcm9tICcuL0xhdGVuY3lDYWxjdWxhdG9yJztcbmV4cG9ydCBjb25zdCBrQWJzQ2FwdHVyZVRpbWUgPSAnaHR0cDovL3d3dy53ZWJydGMub3JnL2V4cGVyaW1lbnRzL3J0cC1oZHJleHQvYWJzLWNhcHR1cmUtdGltZSc7XG4vKipcbiAqIEhhbmRsZXMgdGhlIFBlZXIgQ29ubmVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGVlckNvbm5lY3Rpb25Db250cm9sbGVyIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgUlRDIFBlZXIgQ29ubmVjdGlvbiBjbGllbnRcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFBlZXIgY29ubmVjdGlvbiBPcHRpb25zXG4gICAgICogQHBhcmFtIGNvbmZpZyAtIFRoZSBjb25maWcgZm9yIG91ciBQUyBleHBlcmllbmNlLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbmZpZywgcHJlZmVycmVkQ29kZWMpIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMuY3JlYXRlUGVlckNvbm5lY3Rpb24ob3B0aW9ucywgcHJlZmVycmVkQ29kZWMpO1xuICAgICAgICB0aGlzLmxhdGVuY3lDYWxjdWxhdG9yID0gbmV3IExhdGVuY3lDYWxjdWxhdG9yKCk7XG4gICAgfVxuICAgIGNyZWF0ZVBlZXJDb25uZWN0aW9uKG9wdGlvbnMsIHByZWZlcnJlZENvZGVjKSB7XG4gICAgICAgIC8vIFNldCB0aGUgSUNFIHRyYW5zcG9ydCB0byByZWxheSBpZiBUVVJOIGVuYWJsZWRcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuRm9yY2VUVVJOKSkge1xuICAgICAgICAgICAgb3B0aW9ucy5pY2VUcmFuc3BvcnRQb2xpY3kgPSAncmVsYXknO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ0ZvcmNpbmcgVFVSTiB1c2FnZSBieSBzZXR0aW5nIElDRSBUcmFuc3BvcnQgUG9saWN5IGluIHBlZXIgY29ubmVjdGlvbiBjb25maWcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYnVpbGQgYSBuZXcgcGVlciBjb25uZWN0aW9uIHdpdGggdGhlIG9wdGlvbnNcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbiA9IG5ldyBSVENQZWVyQ29ubmVjdGlvbihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbi5vbnNpZ25hbGluZ3N0YXRlY2hhbmdlID0gKGV2KSA9PiB0aGlzLmhhbmRsZVNpZ25hbFN0YXRlQ2hhbmdlKGV2KTtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbi5vbmljZWNvbm5lY3Rpb25zdGF0ZWNoYW5nZSA9IChldikgPT4gdGhpcy5oYW5kbGVJY2VDb25uZWN0aW9uU3RhdGVDaGFuZ2UoZXYpO1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uLm9uaWNlZ2F0aGVyaW5nc3RhdGVjaGFuZ2UgPSAoZXYpID0+IHRoaXMuaGFuZGxlSWNlR2F0aGVyaW5nU3RhdGVDaGFuZ2UoZXYpO1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uLm9udHJhY2sgPSAoZXYpID0+IHRoaXMuaGFuZGxlT25UcmFjayhldik7XG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb24ub25pY2VjYW5kaWRhdGUgPSAoZXYpID0+IHRoaXMuaGFuZGxlSWNlQ2FuZGlkYXRlKGV2KTtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbi5vbmRhdGFjaGFubmVsID0gKGV2KSA9PiB0aGlzLmhhbmRsZURhdGFDaGFubmVsKGV2KTtcbiAgICAgICAgdGhpcy5hZ2dyZWdhdGVkU3RhdHMgPSBuZXcgQWdncmVnYXRlZFN0YXRzKCk7XG4gICAgICAgIHRoaXMucHJlZmVycmVkQ29kZWMgPSBwcmVmZXJyZWRDb2RlYztcbiAgICAgICAgdGhpcy51cGRhdGVDb2RlY1NlbGVjdGlvbiA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbiBvZmZlciBmb3IgdGhlIFdlYiBSVEMgaGFuZHNoYWtlIGFuZCBzZW5kIHRoZSBvZmZlciB0byB0aGUgc2lnbmFsaW5nIHNlcnZlciB2aWEgd2Vic29ja2V0XG4gICAgICogQHBhcmFtIG9mZmVyT3B0aW9ucyAtIFJUQyBPZmZlciBPcHRpb25zXG4gICAgICovXG4gICAgY3JlYXRlT2ZmZXIob2ZmZXJPcHRpb25zLCBjb25maWcpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdDcmVhdGUgT2ZmZXInKTtcbiAgICAgICAgICAgIGNvbnN0IGlzTG9jYWxob3N0Q29ubmVjdGlvbiA9IGxvY2F0aW9uLmhvc3RuYW1lID09PSAnbG9jYWxob3N0JyB8fCBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gJzEyNy4wLjAuMSc7XG4gICAgICAgICAgICBjb25zdCBpc0h0dHBzQ29ubmVjdGlvbiA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgICAgICAgIGxldCB1c2VNaWMgPSBjb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Vc2VNaWMpO1xuICAgICAgICAgICAgbGV0IHVzZUNhbWVyYSA9IGNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLlVzZUNhbWVyYSk7XG4gICAgICAgICAgICBpZiAoKHVzZU1pYyB8fCB1c2VDYW1lcmEpICYmICEoaXNMb2NhbGhvc3RDb25uZWN0aW9uIHx8IGlzSHR0cHNDb25uZWN0aW9uKSkge1xuICAgICAgICAgICAgICAgIHVzZU1pYyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHVzZUNhbWVyYSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcignTWljcm9waG9uZSBhbmQgV2ViY2FtIGFjY2VzcyBpbiB0aGUgYnJvd3NlciB3aWxsIG5vdCB3b3JrIGlmIHlvdSBhcmUgbm90IG9uIEhUVFBTIG9yIGxvY2FsaG9zdC4gRGlzYWJsaW5nIG1pYyBhbmQgd2ViY2FtIGFjY2Vzcy4nKTtcbiAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoXCJGb3IgdGVzdGluZyB5b3UgY2FuIGVuYWJsZSBIVFRQIG1pY3JvcGhvbmUgYWNjZXNzIENocm9tZSBieSB2aXNpdGluZyBjaHJvbWU6Ly9mbGFncy8gYW5kIGVuYWJsaW5nICd1bnNhZmVseS10cmVhdC1pbnNlY3VyZS1vcmlnaW4tYXMtc2VjdXJlJ1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0dXBUcmFuc2NlaXZlcnNBc3luYyh1c2VNaWMsIHVzZUNhbWVyYSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgIChfYSA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jcmVhdGVPZmZlcihvZmZlck9wdGlvbnMpLnRoZW4oKG9mZmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93VGV4dE92ZXJsYXlDb25uZWN0aW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIG9mZmVyLnNkcCA9IHRoaXMubXVuZ2VTRFAob2ZmZXIuc2RwLCB1c2VNaWMpO1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc2V0TG9jYWxEZXNjcmlwdGlvbihvZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TZW5kV2ViUlRDT2ZmZXIob2ZmZXIpO1xuICAgICAgICAgICAgICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93VGV4dE92ZXJsYXlTZXR1cEZhaWx1cmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVjZWl2ZSBvZmZlciBmcm9tIFVFIHNpZGUgYW5kIHByb2Nlc3MgaXQgYXMgdGhlIHJlbW90ZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHBlZXIgY29ubmVjdGlvblxuICAgICAqL1xuICAgIHJlY2VpdmVPZmZlcihvZmZlciwgY29uZmlnKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnUmVjZWl2ZSBPZmZlcicpO1xuICAgICAgICAgICAgLy8gSWYgVUUgb3IgSlNTdHJlYW1lciBkaWQgc2VuZCBhYnMtY2FwdHVyZS10aW1lIFJUUCBoZWFkZXIgZXh0ZW5zaW9uIHRvIGEgbm9uLUNocm9tZSBicm93c2VyXG4gICAgICAgICAgICAvLyB0aGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBTRFAgYmVjYXVzZSBpZiBGaXJlZm94IGRldGVjdHMgaXQgaW4gb2ZmZXIgb3IgYW5zd2VyIGl0IHdpbGwgZmFpbCB0byBjb25uZWN0XG4gICAgICAgICAgICAvLyBkdWUgaGF2aW5nIDE1IG9yIG1vcmUgaGVhZGVyIGV4dGVuc2lvbnM6IGh0dHBzOi8vbWFpbGFyY2hpdmUuaWV0Zi5vcmcvYXJjaC9tc2cvcnRjd2ViL1FSbldOdVd6R3VMUm92V2RIa29kTlA2Vk9nZy9cbiAgICAgICAgICAgIGlmICh0aGlzLmlzRmlyZWZveCgpKSB7XG4gICAgICAgICAgICAgICAgLy8gZXhhbXBsZTogYT1leHRtYXA6MTUgaHR0cDovL3d3dy53ZWJydGMub3JnL2V4cGVyaW1lbnRzL3J0cC1oZHJleHQvYWJzLWNhcHR1cmUtdGltZVxuICAgICAgICAgICAgICAgIG9mZmVyLnNkcCA9IG9mZmVyLnNkcC5yZXBsYWNlKC9eYT1leHRtYXA6XFxkKyBodHRwOlxcL1xcL3d3d1xcLndlYnJ0Y1xcLm9yZ1xcL2V4cGVyaW1lbnRzXFwvcnRwLWhkcmV4dFxcL2Ficy1jYXB0dXJlLXRpbWVcXHJcXG4vZ20sICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIChfYSA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRSZW1vdGVEZXNjcmlwdGlvbihvZmZlcikudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRmlyZSBldmVudCBmb3Igd2hlbiByZW1vdGUgb2ZmZXIgZGVzY3JpcHRpb24gaXMgc2V0XG4gICAgICAgICAgICAgICAgdGhpcy5vblNldFJlbW90ZURlc2NyaXB0aW9uKG9mZmVyKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpc0xvY2FsaG9zdENvbm5lY3Rpb24gPSBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gJ2xvY2FsaG9zdCcgfHwgbG9jYXRpb24uaG9zdG5hbWUgPT09ICcxMjcuMC4wLjEnO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzSHR0cHNDb25uZWN0aW9uID0gbG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonO1xuICAgICAgICAgICAgICAgIGxldCB1c2VNaWMgPSBjb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Vc2VNaWMpO1xuICAgICAgICAgICAgICAgIGxldCB1c2VDYW1lcmEgPSBjb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Vc2VDYW1lcmEpO1xuICAgICAgICAgICAgICAgIGlmICgodXNlTWljIHx8IHVzZUNhbWVyYSkgJiYgIShpc0xvY2FsaG9zdENvbm5lY3Rpb24gfHwgaXNIdHRwc0Nvbm5lY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZU1pYyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB1c2VDYW1lcmEgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKCdNaWNyb3Bob25lIGFuZCBXZWJjYW0gYWNjZXNzIGluIHRoZSBicm93c2VyIHdpbGwgbm90IHdvcmsgaWYgeW91IGFyZSBub3Qgb24gSFRUUFMgb3IgbG9jYWxob3N0LiBEaXNhYmxpbmcgbWljIGFuZCB3ZWJjYW0gYWNjZXNzLicpO1xuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoXCJGb3IgdGVzdGluZyB5b3UgY2FuIGVuYWJsZSBIVFRQIG1pY3JvcGhvbmUgYWNjZXNzIENocm9tZSBieSB2aXNpdGluZyBjaHJvbWU6Ly9mbGFncy8gYW5kIGVuYWJsaW5nICd1bnNhZmVseS10cmVhdC1pbnNlY3VyZS1vcmlnaW4tYXMtc2VjdXJlJ1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWRkIG91ciBsaXN0IG9mIHByZWZlcnJlZCBjb2RlY3MsIGluIG9yZGVyIG9mIHByZWZlcmVuY2VcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXRPcHRpb25TZXR0aW5nT3B0aW9ucyhPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjLCB0aGlzLmZ1enp5SW50ZXJzZWN0VUVBbmRCcm93c2VyQ29kZWNzKG9mZmVyKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR1cFRyYW5zY2VpdmVyc0FzeW5jKHVzZU1pYywgdXNlQ2FtZXJhKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY3JlYXRlQW5zd2VyKCkudGhlbigoQW5zd2VyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgICAgICAgICAgICBBbnN3ZXIuc2RwID0gdGhpcy5tdW5nZVNEUChBbnN3ZXIuc2RwLCB1c2VNaWMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRMb2NhbERlc2NyaXB0aW9uKEFuc3dlcik7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblNldExvY2FsRGVzY3JpcHRpb24oKF9hID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmN1cnJlbnRMb2NhbERlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBjcmVhdGVBbnN3ZXIoKSBmYWlsZWQgLSAke2Vycn1gKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgUmVtb3RlIERlc2NyaXB0b3IgZnJvbSB0aGUgc2lnbmFsaW5nIHNlcnZlciB0byB0aGUgUlRDIFBlZXIgQ29ubmVjdGlvblxuICAgICAqIEBwYXJhbSBhbnN3ZXIgLSBSVEMgU2Vzc2lvbiBEZXNjcmlwdG9yIGZyb20gdGhlIFNpZ25hbGluZyBTZXJ2ZXJcbiAgICAgKi9cbiAgICByZWNlaXZlQW5zd2VyKGFuc3dlcikge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXRSZW1vdGVEZXNjcmlwdGlvbihhbnN3ZXIpO1xuICAgICAgICAvLyBBZGQgb3VyIGxpc3Qgb2YgcHJlZmVycmVkIGNvZGVjcywgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZVxuICAgICAgICB0aGlzLmNvbmZpZy5zZXRPcHRpb25TZXR0aW5nT3B0aW9ucyhPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjLCB0aGlzLmZ1enp5SW50ZXJzZWN0VUVBbmRCcm93c2VyQ29kZWNzKGFuc3dlcikpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBBZ2dyZWdhdGVkIFN0YXRzIGFuZCB0aGVuIGZpcmUgYSBvblZpZGVvIFN0YXRzIGV2ZW50XG4gICAgICovXG4gICAgZ2VuZXJhdGVTdGF0cygpIHtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbi5nZXRTdGF0cygpLnRoZW4oKHN0YXRzRGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZ2dyZWdhdGVkU3RhdHMucHJvY2Vzc1N0YXRzKHN0YXRzRGF0YSk7XG4gICAgICAgICAgICB0aGlzLm9uVmlkZW9TdGF0cyh0aGlzLmFnZ3JlZ2F0ZWRTdGF0cyk7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgbGF0ZW5jeSB1c2luZyBzdGF0cyBhbmQgdmlkZW8gcmVjZWl2ZXJzIGFuZCB0aGVuIGNhbGwgdGhlIGhhbmRsaW5nIGZ1bmN0aW9uXG4gICAgICAgICAgICBjb25zdCBsYXRlbmN5SW5mbyA9IHRoaXMubGF0ZW5jeUNhbGN1bGF0b3IuY2FsY3VsYXRlKHRoaXMuYWdncmVnYXRlZFN0YXRzLCB0aGlzLnBlZXJDb25uZWN0aW9uLmdldFJlY2VpdmVycygpKTtcbiAgICAgICAgICAgIHRoaXMub25MYXRlbmN5Q2FsY3VsYXRlZChsYXRlbmN5SW5mbyk7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHByZWZlcnJlZCBjb2RlYyBzZWxlY3Rpb24gYmFzZWQgb24gd2hhdCB3YXMgYWN0dWFsbHkgbmVnb3RpYXRlZFxuICAgICAgICAgICAgaWYgKHRoaXMudXBkYXRlQ29kZWNTZWxlY3Rpb24gJiYgISF0aGlzLmFnZ3JlZ2F0ZWRTdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5jb2RlY0lkKSB7XG4gICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBxdWFsaWZpZWQgY29kZWMgbmFtZSBmcm9tIHRoZSBtaW1ldHlwZSBhbmQgZm10cFxuICAgICAgICAgICAgICAgIGNvbnN0IGNvZGVjU3RhdHMgPSB0aGlzLmFnZ3JlZ2F0ZWRTdGF0cy5jb2RlY3MuZ2V0KHRoaXMuYWdncmVnYXRlZFN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmNvZGVjSWQpO1xuICAgICAgICAgICAgICAgIGlmIChjb2RlY1N0YXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBjb2RlY1Nob3J0bmFtZSA9IGNvZGVjU3RhdHMubWltZVR5cGUucmVwbGFjZSgndmlkZW8vJywgJycpO1xuICAgICAgICAgICAgICAgIGxldCBmdWxsQ29kZWNOYW1lID0gY29kZWNTaG9ydG5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKGNvZGVjU3RhdHMuc2RwRm10cExpbmUgJiYgY29kZWNTdGF0cy5zZHBGbXRwTGluZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bGxDb2RlY05hbWUgPSBgJHtjb2RlY1Nob3J0bmFtZX0gJHtjb2RlY1N0YXRzLnNkcEZtdHBMaW5lLnRyaW0oKX1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBhbGxCcm93c2VyQ29kZWNzID0gdGhpcy5jb25maWcuZ2V0U2V0dGluZ09wdGlvbihPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjKS5vcHRpb25zO1xuICAgICAgICAgICAgICAgIC8vIFRoZSBsaXN0IG9mIGNvZGVjcyBkaXJlY3RseSBjb250YWlucyB0aGUgb25lIHRoYXQgd2FzIG5lZ290aWF0ZWQsIHNlbGVjdCB0aGF0XG4gICAgICAgICAgICAgICAgaWYgKGFsbEJyb3dzZXJDb2RlY3MuaW5jbHVkZXMoZnVsbENvZGVjTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0T3B0aW9uU2V0dGluZ1ZhbHVlKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMsIGZ1bGxDb2RlY05hbWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIElmIHdlIGNvdWxkbid0IG1hdGNoIG9uIHRoZSBmdWxsIG5hbWUsIHRyeSB0byBtYXRjaCBvbiBqdXN0IHRoZSBjb2RlYyBzaG9ydG5hbWVcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZExpc3QgPSBhbGxCcm93c2VyQ29kZWNzLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24uaW5kZXhPZihjb2RlY1Nob3J0bmFtZSkgIT09IC0xKTtcbiAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0T3B0aW9uU2V0dGluZ1ZhbHVlKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMsIGZpbHRlcmVkTGlzdFswXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZSBUaGUgUGVlciBDb25uZWN0aW9uXG4gICAgICovXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLnBlZXJDb25uZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uLmNsb3NlKCk7XG4gICAgICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBNb2RpZnkgdGhlIFNlc3Npb24gRGVzY3JpcHRvclxuICAgICAqIEBwYXJhbSBzZHAgLSBTZXNzaW9uIERlc2NyaXB0b3IgYXMgYSBzdHJpbmdcbiAgICAgKiBAcGFyYW0gdXNlTWljIC0gSXMgdGhlIG1pY3JvcGhvbmUgaW4gdXNlXG4gICAgICogQHJldHVybnMgQSBtb2RpZmllZCBTZXNzaW9uIERlc2NyaXB0b3JcbiAgICAgKi9cbiAgICBtdW5nZVNEUChzZHAsIHVzZU1pYykge1xuICAgICAgICBsZXQgbXVuZ2VkU0RQID0gc2RwLnJlcGxhY2UoLyhhPWZtdHA6XFxkKyAuKmxldmVsLWFzeW1tZXRyeS1hbGxvd2VkPS4qKVxcclxcbi9nbSwgJyQxO3gtZ29vZ2xlLXN0YXJ0LWJpdHJhdGU9MTAwMDA7eC1nb29nbGUtbWF4LWJpdHJhdGU9MTAwMDAwXFxyXFxuJyk7XG4gICAgICAgIC8vIHNldCBtYXggYml0cmF0ZSB0byBoaWdoZXN0IGJpdHJhdGUgT3B1cyBzdXBwb3J0c1xuICAgICAgICBsZXQgYXVkaW9TRFAgPSAnbWF4YXZlcmFnZWJpdHJhdGU9NTEwMDAwOyc7XG4gICAgICAgIGlmICh1c2VNaWMpIHtcbiAgICAgICAgICAgIC8vIHNldCB0aGUgbWF4IGNhcHR1cmUgcmF0ZSB0byA0OGtoeiAoc28gd2UgY2FuIHNlbmQgaGlnaCBxdWFsaXR5IGF1ZGlvIGZyb20gbWljKVxuICAgICAgICAgICAgYXVkaW9TRFAgKz0gJ3Nwcm9wLW1heGNhcHR1cmVyYXRlPTQ4MDAwOyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yY2UgbW9ubyBvciBzdGVyZW8gYmFzZWQgb24gd2hldGhlciA/Zm9yY2VNb25vIHdhcyBwYXNzZWQgb3Igbm90XG4gICAgICAgIGF1ZGlvU0RQICs9IHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuRm9yY2VNb25vQXVkaW8pID8gJ3N0ZXJlbz0wOycgOiAnc3RlcmVvPTE7JztcbiAgICAgICAgLy8gZW5hYmxlIGluLWJhbmQgZm9yd2FyZCBlcnJvciBjb3JyZWN0aW9uIGZvciBvcHVzIGF1ZGlvXG4gICAgICAgIGF1ZGlvU0RQICs9ICd1c2VpbmJhbmRmZWM9MSc7XG4gICAgICAgIC8vIFdlIHVzZSB0aGUgbGluZSAndXNlaW5iYW5kZmVjPTEnICh3aGljaCBPcHVzIHVzZXMpIHRvIHNldCBvdXIgT3B1cyBzcGVjaWZpYyBhdWRpbyBwYXJhbWV0ZXJzLlxuICAgICAgICBtdW5nZWRTRFAgPSBtdW5nZWRTRFAucmVwbGFjZSgndXNlaW5iYW5kZmVjPTEnLCBhdWRpb1NEUCk7XG4gICAgICAgIC8vIEFkZCBhYnMtY2FwdHVyZS10aW1lIFJUUCBoZWFkZXIgZXh0ZW5zaW9uIGlmIHdlIGhhdmUgZW5hYmxlZCB0aGUgc2V0dGluZy5cbiAgICAgICAgLy8gTm90ZTogQXMgYXQgRmViIDIwMjUsIENocm9taXVtIGJhc2VkIGJyb3dzZXJzIGFyZSB0aGUgb25seSBvbmVzIHRoYXQgc3VwcG9ydCB0aGlzIGFuZFxuICAgICAgICAvLyBtdW5naW5nIGl0IGludG8gdGhlIGFuc3dlciBpbiBGaXJlZm94IHdpbGwgY2F1c2UgdGhlIGNvbm5lY3Rpb24gdG8gZmFpbC5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuRW5hYmxlQ2FwdHVyZVRpbWVFeHQpICYmICF0aGlzLmlzRmlyZWZveCgpKSB7XG4gICAgICAgICAgICBtdW5nZWRTRFAgPSBTRFBVdGlscy5hZGRWaWRlb0hlYWRlckV4dGVuc2lvblRvU2RwKG11bmdlZFNEUCwga0Fic0NhcHR1cmVUaW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbXVuZ2VkU0RQO1xuICAgIH1cbiAgICBpc0ZpcmVmb3goKSB7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gYSBJY2UgQ2FuZGlkYXRlIGlzIHJlY2VpdmVkIGFkZCB0byB0aGUgUlRDIFBlZXIgQ29ubmVjdGlvblxuICAgICAqIEBwYXJhbSBpY2VDYW5kaWRhdGUgLSBSVEMgSWNlIENhbmRpZGF0ZSBmcm9tIHRoZSBTaWduYWxpbmcgU2VydmVyXG4gICAgICovXG4gICAgaGFuZGxlT25JY2UoaWNlQ2FuZGlkYXRlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ3BlZXJjb25uZWN0aW9uIGhhbmRsZU9uSWNlJyk7XG4gICAgICAgIC8vIC8vIGlmIGZvcmNpbmcgVFVSTiwgcmVqZWN0IGFueSBjYW5kaWRhdGVzIG5vdCByZWxheVxuICAgICAgICBpZiAodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Gb3JjZVRVUk4pKSB7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBubyByZWxheSBhZGRyZXNzIGlzIGZvdW5kLCBpZiBzbywgd2UgYXJlIGFzc3VtaW5nIGl0IG1lYW5zIG5vIFRVUk4gc2VydmVyXG4gICAgICAgICAgICBpZiAoaWNlQ2FuZGlkYXRlLmNhbmRpZGF0ZS5pbmRleE9mKCdyZWxheScpIDwgMCkge1xuICAgICAgICAgICAgICAgIExvZ2dlci5JbmZvKGBEcm9wcGluZyBjYW5kaWRhdGUgYmVjYXVzZSBpdCB3YXMgbm90IFRVUk4gcmVsYXkuIHwgVHlwZT0gJHtpY2VDYW5kaWRhdGUudHlwZX0gfCBQcm90b2NvbD0gJHtpY2VDYW5kaWRhdGUucHJvdG9jb2x9IHwgQWRkcmVzcz0ke2ljZUNhbmRpZGF0ZS5hZGRyZXNzfSB8IFBvcnQ9JHtpY2VDYW5kaWRhdGUucG9ydH0gfGApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAoX2EgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWRkSWNlQ2FuZGlkYXRlKGljZUNhbmRpZGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhlIFJUQyBQZWVyIENvbm5lY3Rpb24gU2lnbmFsaW5nIHNlcnZlciBzdGF0ZSBDaGFuZ2VzXG4gICAgICogQHBhcmFtIHN0YXRlIC0gU2lnbmFsaW5nIFNlcnZlciBTdGF0ZSBDaGFuZ2UgRXZlbnRcbiAgICAgKi9cbiAgICBoYW5kbGVTaWduYWxTdGF0ZUNoYW5nZShzdGF0ZSkge1xuICAgICAgICBMb2dnZXIuSW5mbygnc2lnbmFsaW5nIHN0YXRlIGNoYW5nZTogJyArIHN0YXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlIHdoZW4gdGhlIEljZSBDb25uZWN0aW9uIFN0YXRlIENoYW5nZXNcbiAgICAgKiBAcGFyYW0gc3RhdGUgLSBJY2UgQ29ubmVjdGlvbiBTdGF0ZVxuICAgICAqL1xuICAgIGhhbmRsZUljZUNvbm5lY3Rpb25TdGF0ZUNoYW5nZShzdGF0ZSkge1xuICAgICAgICBMb2dnZXIuSW5mbygnaWNlIGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlOiAnICsgc3RhdGUpO1xuICAgICAgICB0aGlzLm9uSWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlKHN0YXRlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlIHdoZW4gdGhlIEljZSBHYXRoZXJpbmcgU3RhdGUgQ2hhbmdlc1xuICAgICAqIEBwYXJhbSBzdGF0ZSAtIEljZSBHYXRoZXJpbmcgU3RhdGUgQ2hhbmdlXG4gICAgICovXG4gICAgaGFuZGxlSWNlR2F0aGVyaW5nU3RhdGVDaGFuZ2Uoc3RhdGUpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ2ljZSBnYXRoZXJpbmcgc3RhdGUgY2hhbmdlOiAnICsgSlNPTi5zdHJpbmdpZnkoc3RhdGUpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWN0aXZhdGVzIHRoZSBvblRyYWNrIG1ldGhvZFxuICAgICAqIEBwYXJhbSBldmVudCAtIFRoZSB3ZWJSdGMgdHJhY2sgZXZlbnRcbiAgICAgKi9cbiAgICBoYW5kbGVPblRyYWNrKGV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC5zdHJlYW1zLmxlbmd0aCA8IDEgfHwgZXZlbnQuc3RyZWFtc1swXS5pZCA9PSAncHJvYmF0b3InKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnRyYWNrLmtpbmQgPT0gJ3ZpZGVvJykge1xuICAgICAgICAgICAgdGhpcy52aWRlb1RyYWNrID0gZXZlbnQudHJhY2s7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnRyYWNrLmtpbmQgPT0gJ2F1ZGlvJykge1xuICAgICAgICAgICAgdGhpcy5hdWRpb1RyYWNrID0gZXZlbnQudHJhY2s7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vblRyYWNrKGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWN0aXZhdGVzIHRoZSBvblBlZXJJY2VDYW5kaWRhdGVcbiAgICAgKiBAcGFyYW0gZXZlbnQgLSBUaGUgcGVlciBpY2UgY2FuZGlkYXRlXG4gICAgICovXG4gICAgaGFuZGxlSWNlQ2FuZGlkYXRlKGV2ZW50KSB7XG4gICAgICAgIHRoaXMub25QZWVySWNlQ2FuZGlkYXRlKGV2ZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWN0aXZhdGVzIHRoZSBvbkRhdGFDaGFubmVsXG4gICAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHBlZXIncyBkYXRhIGNoYW5uZWxcbiAgICAgKi9cbiAgICBoYW5kbGVEYXRhQ2hhbm5lbChldmVudCkge1xuICAgICAgICB0aGlzLm9uRGF0YUNoYW5uZWwoZXZlbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvdmVycmlkZSBtZXRob2QgZm9yIG9uVHJhY2sgZm9yIHVzZSBvdXRzaWRlIG9mIHRoZSBQZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXJcbiAgICAgKiBAcGFyYW0gdHJhY2tFdmVudCAtIFRoZSB3ZWJSdGMgdHJhY2sgZXZlbnRcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgb25UcmFjayh0cmFja0V2ZW50KSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvdmVycmlkZSBtZXRob2QgZm9yIG9uSWNlQ29ubmVjdGlvblN0YXRlQ2hhbmdlIGZvciB1c2Ugb3V0c2lkZSBvZiB0aGUgUGVlckNvbm5lY3Rpb25Db250cm9sbGVyXG4gICAgICogQHBhcmFtIGV2ZW50IC0gVGhlIHdlYlJ0YyBpY2Vjb25uZWN0aW9uc3RhdGVjaGFuZ2UgZXZlbnRcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgb25JY2VDb25uZWN0aW9uU3RhdGVDaGFuZ2UoZXZlbnQpIHtcbiAgICAgICAgLy8gRGVmYXVsdCBGdW5jdGlvbmFsaXR5OiBEbyBOb3RoaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG92ZXJyaWRlIG1ldGhvZCBmb3Igb25QZWVySWNlQ2FuZGlkYXRlIGZvciB1c2Ugb3V0c2lkZSBvZiB0aGUgUGVlckNvbm5lY3Rpb25Db250cm9sbGVyXG4gICAgICogQHBhcmFtIHBlZXJDb25uZWN0aW9uSWNlRXZlbnQgLSBUaGUgcGVlciBpY2UgY2FuZGlkYXRlXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uUGVlckljZUNhbmRpZGF0ZShwZWVyQ29ubmVjdGlvbkljZUV2ZW50KSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvdmVycmlkZSBtZXRob2QgZm9yIG9uRGF0YUNoYW5uZWwgZm9yIHVzZSBvdXRzaWRlIG9mIHRoZSBQZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXJcbiAgICAgKiBAcGFyYW0gZGF0YWNoYW5uZWxFdmVudCAtIFRoZSBwZWVyJ3MgZGF0YSBjaGFubmVsXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uRGF0YUNoYW5uZWwoZGF0YWNoYW5uZWxFdmVudCkge1xuICAgICAgICAvLyBEZWZhdWx0IEZ1bmN0aW9uYWxpdHk6IERvIE5vdGhpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gVUUgYW5kIGJyb3dzZXIgY29kZWNzLCB3aXRoIGZ1enp5IG1hdGNoaW5nIGlmIHNvbWUgcGFyYW1ldGVycyBhcmUgbWlzbWF0Y2hlZC5cbiAgICAgKiBAcGFyYW0gc2RwIFRoZSByZW1vdGUgc2RwXG4gICAgICogQHJldHVybnMgVGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIGJyb3dzZXIgc3VwcG9ydGVkIGNvZGVjcyBhbmQgdWUgc3VwcG9ydGVkIGNvZGVjcy5cbiAgICAgKi9cbiAgICBmdXp6eUludGVyc2VjdFVFQW5kQnJvd3NlckNvZGVjcyhzZHApIHtcbiAgICAgICAgLy8gV2Ugd2FudCB0byBidWlsZCBhbiBhcnJheSBvZiBhbGwgc3VwcG9ydGVkIGNvZGVjcyBvbiBib3RoIHNpZGVzXG4gICAgICAgIGNvbnN0IGFsbFN1cHBvcnRlZENvZGVjcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBjb25zdCBhbGxVRUNvZGVjcyA9IHRoaXMucGFyc2VBdmFpbGFibGVDb2RlY3Moc2RwKTtcbiAgICAgICAgY29uc3QgYWxsQnJvd3NlckNvZGVjcyA9IHRoaXMuY29uZmlnLmdldFNldHRpbmdPcHRpb24oT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYykub3B0aW9ucztcbiAgICAgICAgZm9yIChjb25zdCB1ZUNvZGVjIG9mIGFsbFVFQ29kZWNzKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBicm93c2VyIGNvZGVjcyBkaXJlY3RseSBtYXRjaGVzIFVFIGNvZGVjICh3aXRoIHBhcmFtZXRlcnMgYW5kIGV2ZXJ5dGhpbmcpXG4gICAgICAgICAgICBpZiAoYWxsQnJvd3NlckNvZGVjcy5pbmNsdWRlcyh1ZUNvZGVjKSkge1xuICAgICAgICAgICAgICAgIGFsbFN1cHBvcnRlZENvZGVjcy5wdXNoKHVlQ29kZWMpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGNoZWNrIGlmIGJyb3dzZXIgY29kZWMgYXQgbGVhc3QgY29udGFpbnMgYSBtYXRjaCBmb3IgdGhlIFVFIGNvZGVjIG5hbWUgKHdpdGhvdXQgcGFyYW1ldGVycykuXG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1ZUNvZGVjTmFtZUFuZFBhcmFtcyA9IHVlQ29kZWMuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1ZUNvZGVjTmFtZSA9IHVlQ29kZWNOYW1lQW5kUGFyYW1zWzBdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYnJvd3NlckNvZGVjIG9mIGFsbEJyb3dzZXJDb2RlY3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJyb3dzZXJDb2RlYy5pbmNsdWRlcyh1ZUNvZGVjTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHBhc3MgYnJvd3NlciBjb2RlYyBoZXJlIGFzIHRoZXkgb3B0aW9uIGNvbnRhaW4gZXh0cmEgcGFyYW1ldGVycy5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbFN1cHBvcnRlZENvZGVjcy5wdXNoKGJyb3dzZXJDb2RlYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsU3VwcG9ydGVkQ29kZWNzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXR1cCB0cmFja3Mgb24gdGhlIFJUQyBQZWVyIENvbm5lY3Rpb25cbiAgICAgKiBAcGFyYW0gdXNlTWljIC0gaXMgbWljIGluIHVzZVxuICAgICAqIEBwYXJhbSB1c2VDYW1lcmEgLSBpcyB3ZWJjYW0gaW4gdXNlXG4gICAgICovXG4gICAgc2V0dXBUcmFuc2NlaXZlcnNBc3luYyh1c2VNaWMsIHVzZUNhbWVyYSkge1xuICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaDtcbiAgICAgICAgICAgIGxldCBoYXNWaWRlb1JlY2VpdmVyID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRyYW5zY2VpdmVyIG9mIChfYiA9IChfYSA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRUcmFuc2NlaXZlcnMoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW10pIHtcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNjZWl2ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIudHJhY2sgJiZcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIudHJhY2sua2luZCA9PT0gJ3ZpZGVvJykge1xuICAgICAgICAgICAgICAgICAgICBoYXNWaWRlb1JlY2VpdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gU2V0dXAgYSB0cmFuc2NlaXZlciBmb3Igc2VuZGluZyB3ZWJjYW0gdmlkZW8gdG8gVUUgYW5kIHJlY2VpdmluZyB2aWRlbyBmcm9tIFVFXG4gICAgICAgICAgICBpZiAoIXVzZUNhbWVyYSkge1xuICAgICAgICAgICAgICAgIGlmICghaGFzVmlkZW9SZWNlaXZlcikge1xuICAgICAgICAgICAgICAgICAgICAoX2MgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuYWRkVHJhbnNjZWl2ZXIoJ3ZpZGVvJywgeyBkaXJlY3Rpb246ICdyZWN2b25seScgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy5zZXR1cFZpZGVvU2VuZGVyKGhhc1ZpZGVvUmVjZWl2ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFJUQ1J0cFJlY2VpdmVyLmdldENhcGFiaWxpdGllcyAmJiB0aGlzLnByZWZlcnJlZENvZGVjICE9ICcnKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0cmFuc2NlaXZlciBvZiAoX2UgPSAoX2QgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuZ2V0VHJhbnNjZWl2ZXJzKCkpICE9PSBudWxsICYmIF9lICE9PSB2b2lkIDAgPyBfZSA6IFtdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2NlaXZlciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyLnRyYWNrICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5yZWNlaXZlci50cmFjay5raW5kID09PSAndmlkZW8nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5zZXRDb2RlY1ByZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgb3VyIHByZWZlcnJlZCBjb2RlYyBmcm9tIHRoZSBjb2RlY3Mgb3B0aW9ucyBkcm9wIGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZWZlcnJlZFJUUENvZGVjID0gdGhpcy5wcmVmZXJyZWRDb2RlYy5zcGxpdCgnICcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJlZmVycmVkUlRDUnRwQ29kZWNDYXBhYmlsaXR5ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWVUeXBlOiAndmlkZW8vJyArIHByZWZlcnJlZFJUUENvZGVjWzBdIC8qIE5hbWUgKi8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tSYXRlOiA5MDAwMCAvKiBBbGwgY3VycmVudCB2aWRlbyBmb3JtYXRzIGluIGJyb3dzZXJzIGhhdmUgOTBraHogY2xvY2sgcmF0ZSAqLyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZHBGbXRwTGluZTogcHJlZmVycmVkUlRQQ29kZWNbMV0gPyBwcmVmZXJyZWRSVFBDb2RlY1sxXSA6ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9wdWxhdGUgYSBsaXN0IG9mIGNvZGVjcyB3ZSB3aWxsIHN1cHBvcnQgd2l0aCBvdXIgcHJlZmVycmVkIG9uZSBpbiB0aGUgZmlyc3QgcG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG91clN1cHBvcnRlZENvZGVjcyA9IFtwcmVmZXJyZWRSVENSdHBDb2RlY0NhcGFiaWxpdHldO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR28gdGhyb3VnaCBhbGwgY29kZWNzIHRoZSBicm93c2VyIHN1cHBvcnRzIGFuZCBhZGQgdGhlbSB0byB0aGUgbGlzdCAoaW4gYW55IG9yZGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgUlRDUnRwUmVjZWl2ZXIuZ2V0Q2FwYWJpbGl0aWVzKCd2aWRlbycpLmNvZGVjcy5mb3JFYWNoKChicm93c2VyU3VwcG9ydGVkQ29kZWMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBhZGQgb3VyIHByZWZlcnJlZCBjb2RlYyBhZ2FpbiwgYnV0IGFkZCBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJvd3NlclN1cHBvcnRlZENvZGVjLm1pbWVUeXBlICE9IHByZWZlcnJlZFJUQ1J0cENvZGVjQ2FwYWJpbGl0eS5taW1lVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXJTdXBwb3J0ZWRDb2RlY3MucHVzaChicm93c2VyU3VwcG9ydGVkQ29kZWMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoYnJvd3NlclN1cHBvcnRlZENvZGVjID09PSBudWxsIHx8IGJyb3dzZXJTdXBwb3J0ZWRDb2RlYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogYnJvd3NlclN1cHBvcnRlZENvZGVjLnNkcEZtdHBMaW5lKSAhPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJlZmVycmVkUlRDUnRwQ29kZWNDYXBhYmlsaXR5ID09PSBudWxsIHx8IHByZWZlcnJlZFJUQ1J0cENvZGVjQ2FwYWJpbGl0eSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJlZmVycmVkUlRDUnRwQ29kZWNDYXBhYmlsaXR5LnNkcEZtdHBMaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXJTdXBwb3J0ZWRDb2RlY3MucHVzaChicm93c2VyU3VwcG9ydGVkQ29kZWMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb2RlYyBvZiBvdXJTdXBwb3J0ZWRDb2RlY3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNvZGVjID09PSBudWxsIHx8IGNvZGVjID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb2RlYy5zZHBGbXRwTGluZSkgPT09IHVuZGVmaW5lZCB8fCBjb2RlYy5zZHBGbXRwTGluZSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3QgZHluYW1pY2FsbHkgYWRkIG1lbWJlcnMgdG8gdGhlIGNvZGVjLCBzbyBpbnN0ZWFkIHJlbW92ZSB0aGUgZmllbGQgaWYgaXQncyBlbXB0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY29kZWMuc2RwRm10cExpbmU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIuc2V0Q29kZWNQcmVmZXJlbmNlcyhvdXJTdXBwb3J0ZWRDb2RlY3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGhhc0F1ZGlvUmVjZWl2ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdHJhbnNjZWl2ZXIgb2YgKF9nID0gKF9mID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLmdldFRyYW5zY2VpdmVycygpKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiBbXSkge1xuICAgICAgICAgICAgICAgIGlmICh0cmFuc2NlaXZlciAmJlxuICAgICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5yZWNlaXZlciAmJlxuICAgICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5yZWNlaXZlci50cmFjayAmJlxuICAgICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5yZWNlaXZlci50cmFjay5raW5kID09PSAnYXVkaW8nKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0F1ZGlvUmVjZWl2ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTZXR1cCBhIHRyYW5zY2VpdmVyIGZvciBzZW5kaW5nIG1pYyBhdWRpbyB0byBVRSBhbmQgcmVjZWl2aW5nIGF1ZGlvIGZyb20gVUVcbiAgICAgICAgICAgIGlmICghdXNlTWljKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNBdWRpb1JlY2VpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIChfaCA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9oID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfaC5hZGRUcmFuc2NlaXZlcignYXVkaW8nLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdyZWN2b25seSdcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgeWllbGQgdGhpcy5zZXR1cEF1ZGlvU2VuZGVyKGhhc0F1ZGlvUmVjZWl2ZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2V0dXBWaWRlb1NlbmRlcihoYXNWaWRlb1JlY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgICAgICAvLyBzZXQgdGhlIG1lZGlhIHNlbmQgb3B0aW9uc1xuICAgICAgICAgICAgY29uc3QgbWVkaWFTZW5kT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICB2aWRlbzogdHJ1ZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIE5vdGUgdXNpbmcgd2ViY2FtIG9uIGFuZHJvaWQgY2hyb21lIHJlcXVpcmVzIFNTTCBvciBjaHJvbWU6Ly9mbGFncy8gXCJ1bnNhZmVseS10cmVhdC1pbnNlY3VyZS1vcmlnaW4tYXMtc2VjdXJlXCJcbiAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IHlpZWxkIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKG1lZGlhU2VuZE9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKHN0cmVhbSkge1xuICAgICAgICAgICAgICAgIGlmIChoYXNWaWRlb1JlY2VpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdHJhbnNjZWl2ZXIgb2YgKF9iID0gKF9hID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdldFRyYW5zY2VpdmVycygpKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBbXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJUQ1V0aWxzLmNhblRyYW5zY2VpdmVyUmVjZWl2ZVZpZGVvKHRyYW5zY2VpdmVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdHJhY2sgb2Ygc3RyZWFtLmdldFRyYWNrcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay5raW5kICYmIHRyYWNrLmtpbmQgPT0gJ3ZpZGVvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIuc2VuZGVyLnJlcGxhY2VUcmFjayh0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5kaXJlY3Rpb24gPSAnc2VuZHJlY3YnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRyYWNrIG9mIHN0cmVhbS5nZXRUcmFja3MoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLmtpbmQgJiYgdHJhY2sua2luZCA9PSAndmlkZW8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9jID0gdGhpcy5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmFkZFRyYW5zY2VpdmVyKHRyYWNrLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ3NlbmRyZWN2J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNWaWRlb1JlY2VpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIChfZCA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5hZGRUcmFuc2NlaXZlcigndmlkZW8nLCB7IGRpcmVjdGlvbjogJ3JlY3Zvbmx5JyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzZXR1cEF1ZGlvU2VuZGVyKGhhc0F1ZGlvUmVjZWl2ZXIpIHtcbiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgICAgIC8vIHNldCB0aGUgYXVkaW8gb3B0aW9ucyBiYXNlZCBvbiBtaWMgdXNhZ2VcbiAgICAgICAgICAgIGNvbnN0IGF1ZGlvT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICBhdXRvR2FpbkNvbnRyb2w6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudDogMSxcbiAgICAgICAgICAgICAgICBlY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBsYXRlbmN5OiAwLFxuICAgICAgICAgICAgICAgIG5vaXNlU3VwcHJlc3Npb246IGZhbHNlLFxuICAgICAgICAgICAgICAgIHNhbXBsZVJhdGU6IDQ4MDAwLFxuICAgICAgICAgICAgICAgIHNhbXBsZVNpemU6IDE2LFxuICAgICAgICAgICAgICAgIHZvbHVtZTogMS4wXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gc2V0IHRoZSBtZWRpYSBzZW5kIG9wdGlvbnNcbiAgICAgICAgICAgIGNvbnN0IG1lZGlhU2VuZE9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgdmlkZW86IGZhbHNlLFxuICAgICAgICAgICAgICAgIGF1ZGlvOiBhdWRpb09wdGlvbnNcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBOb3RlIHVzaW5nIG1pYyBvbiBhbmRyb2lkIGNocm9tZSByZXF1aXJlcyBTU0wgb3IgY2hyb21lOi8vZmxhZ3MvIFwidW5zYWZlbHktdHJlYXQtaW5zZWN1cmUtb3JpZ2luLWFzLXNlY3VyZVwiXG4gICAgICAgICAgICBjb25zdCBzdHJlYW0gPSB5aWVsZCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShtZWRpYVNlbmRPcHRpb25zKTtcbiAgICAgICAgICAgIGlmIChzdHJlYW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzQXVkaW9SZWNlaXZlcikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRyYW5zY2VpdmVyIG9mIChfYiA9IChfYSA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXRUcmFuc2NlaXZlcnMoKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSVENVdGlscy5jYW5UcmFuc2NlaXZlclJlY2VpdmVBdWRpbyh0cmFuc2NlaXZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRyYWNrIG9mIHN0cmVhbS5nZXRUcmFja3MoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2sua2luZCAmJiB0cmFjay5raW5kID09ICdhdWRpbycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnNlbmRlci5yZXBsYWNlVHJhY2sodHJhY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNjZWl2ZXIuZGlyZWN0aW9uID0gJ3NlbmRyZWN2JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0cmFjayBvZiBzdHJlYW0uZ2V0VHJhY2tzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay5raW5kICYmIHRyYWNrLmtpbmQgPT0gJ2F1ZGlvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfYyA9IHRoaXMucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5hZGRUcmFuc2NlaXZlcih0cmFjaywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdzZW5kcmVjdidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghaGFzQXVkaW9SZWNlaXZlcikge1xuICAgICAgICAgICAgICAgICAgICAoX2QgPSB0aGlzLnBlZXJDb25uZWN0aW9uKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuYWRkVHJhbnNjZWl2ZXIoJ2F1ZGlvJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiAncmVjdm9ubHknXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuZCBvdmVycmlkZSBldmVudCBmb3Igd2hlbiB0aGUgdmlkZW8gc3RhdHMgYXJlIGZpcmVkXG4gICAgICogQHBhcmFtIGV2ZW50IC0gQWdncmVnYXRlZCBTdGF0c1xuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBvblZpZGVvU3RhdHMoZXZlbnQpIHtcbiAgICAgICAgLy8gRGVmYXVsdCBGdW5jdGlvbmFsaXR5OiBEbyBOb3RoaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuZCBvdmVycmlkZSBldmVudCBmb3Igd2hlbiBsYXRlbmN5IGluZm8gaXMgY2FsY3VsYXRlZFxuICAgICAqIEBwYXJhbSBsYXRlbmN5SW5mbyAtIENhbGN1bGF0ZWQgbGF0ZW5jeSBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgb25MYXRlbmN5Q2FsY3VsYXRlZChsYXRlbmN5SW5mbykge1xuICAgICAgICAvLyBEZWZhdWx0IEZ1bmN0aW9uYWxpdHk6IERvIE5vdGhpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZlbnQgdG8gc2VuZCB0aGUgUlRDIG9mZmVyIHRvIHRoZSBTaWduYWxpbmcgc2VydmVyXG4gICAgICogQHBhcmFtIG9mZmVyIC0gUlRDIE9mZmVyXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uU2VuZFdlYlJUQ09mZmVyKG9mZmVyKSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFdmVudCBmaXJlZCB3aGVuIHJlbW90ZSBvZmZlciBkZXNjcmlwdGlvbiBpcyBzZXQuXG4gICAgICogQHBhcmFtIG9mZmVyIC0gUlRDIE9mZmVyXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uU2V0UmVtb3RlRGVzY3JpcHRpb24ob2ZmZXIpIHtcbiAgICAgICAgLy8gRGVmYXVsdCBGdW5jdGlvbmFsaXR5OiBEbyBOb3RoaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV2ZW50IGZpcmUgd2hlbiBsb2NhbCBkZXNjcmlwdGlvbiBhbnN3ZXIgaXMgc2V0LlxuICAgICAqIEBwYXJhbSBhbnN3ZXIgLSBSVEMgQW5zd2VyXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIG9uU2V0TG9jYWxEZXNjcmlwdGlvbihhbnN3ZXIpIHtcbiAgICAgICAgLy8gRGVmYXVsdCBGdW5jdGlvbmFsaXR5OiBEbyBOb3RoaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG92ZXJyaWRlIGZvciBzaG93aW5nIHRoZSBQZWVyIGNvbm5lY3Rpb24gY29ubmVjdGluZyBPdmVybGF5XG4gICAgICovXG4gICAgc2hvd1RleHRPdmVybGF5Q29ubmVjdGluZygpIHtcbiAgICAgICAgLy8gRGVmYXVsdCBGdW5jdGlvbmFsaXR5OiBEbyBOb3RoaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuIG92ZXJyaWRlIGZvciBzaG93aW5nIHRoZSBQZWVyIGNvbm5lY3Rpb24gRmFpbGVkIG92ZXJsYXlcbiAgICAgKi9cbiAgICBzaG93VGV4dE92ZXJsYXlTZXR1cEZhaWx1cmUoKSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICBwYXJzZUF2YWlsYWJsZUNvZGVjcyhydGNTZXNzaW9uRGVzY3JpcHRpb24pIHtcbiAgICAgICAgLy8gTm8gcG9pbnQgaW4gdXBkYXRpbmcgdGhlIGF2YWlsYWJsZSBjb2RlY3MgaWYgb24gRkZcbiAgICAgICAgaWYgKCFSVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMpXG4gICAgICAgICAgICByZXR1cm4gWydPbmx5IGF2YWlsYWJsZSBvbiBDaHJvbWUnXTtcbiAgICAgICAgY29uc3QgdWVTdXBwb3J0ZWRDb2RlY3MgPSBbXTtcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBzcGxpdFNlY3Rpb25zKHJ0Y1Nlc3Npb25EZXNjcmlwdGlvbi5zZHApO1xuICAgICAgICAvLyBkaXNjYXJkIHRoZSBzZXNzaW9uIGluZm9ybWF0aW9uIGFzIHdlIG9ubHkgd2FudCBtZWRpYSByZWxhdGVkIGluZm9cbiAgICAgICAgc2VjdGlvbnMuc2hpZnQoKTtcbiAgICAgICAgc2VjdGlvbnMuZm9yRWFjaCgobWVkaWFTZWN0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGNvZGVjcyB9ID0gcGFyc2VSdHBQYXJhbWV0ZXJzKG1lZGlhU2VjdGlvbik7XG4gICAgICAgICAgICAvLyBGaWx0ZXIgb25seSBmb3IgVlBYIC8gSDI2WCAvIEFWMVxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlciA9IC8oVlBcXGR8SDI2XFxkfEFWMSkuKi87XG4gICAgICAgICAgICBjb2RlY3MuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGMubmFtZSArXG4gICAgICAgICAgICAgICAgICAgICcgJyArXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGMucGFyYW1ldGVycyB8fCB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHApID0+IHAgKyAnPScgKyBjLnBhcmFtZXRlcnNbcF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbignOycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlci5leGVjKHN0cik7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjLm5hbWUgPT0gJ1ZQOScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVFIGFuc3dlcnMgZG9uJ3Qgc3BlY2lmeSBwcm9maWxlIGJ1dCB3ZSBrbm93IHdlIHdhbnQgcHJvZmlsZSAwXG4gICAgICAgICAgICAgICAgICAgICAgICBjLnBhcmFtZXRlcnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2ZpbGUtaWQnOiAnMCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZWNTdHIgPSBjLm5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGMucGFyYW1ldGVycyB8fCB7fSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwKSA9PiBwICsgJz0nICsgYy5wYXJhbWV0ZXJzW3BdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCc7Jyk7XG4gICAgICAgICAgICAgICAgICAgIHVlU3VwcG9ydGVkQ29kZWNzLnB1c2goY29kZWNTdHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVlU3VwcG9ydGVkQ29kZWNzO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBTZXNzaW9uIHN0YXRpc3RpY3NcbiAqL1xuZXhwb3J0IGNsYXNzIFNlc3Npb25TdGF0cyB7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXNzaW9uU3RhdHMuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogQ2xhc3MgdG8gaG9sZCB0aGUgc3RyZWFtIHN0YXRzIGRhdGEgY29taW5nIGluIGZyb20gd2ViUnRjXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJlYW1TdGF0cyB7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TdHJlYW1TdGF0cy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgT3B0aW9uUGFyYW1ldGVycyB9IGZyb20gJy4uL0NvbmZpZy9Db25maWcnO1xuaW1wb3J0IHsgV2ViUnRjUGxheWVyQ29udHJvbGxlciB9IGZyb20gJy4uL1dlYlJ0Y1BsYXllci9XZWJSdGNQbGF5ZXJDb250cm9sbGVyJztcbmltcG9ydCB7IEZsYWdzLCBOdW1lcmljUGFyYW1ldGVycyB9IGZyb20gJy4uL0NvbmZpZy9Db25maWcnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuaW1wb3J0IHsgUGl4ZWxTdHJlYW1pbmdFdmVudEVtaXR0ZXIsIEluaXRpYWxTZXR0aW5nc0V2ZW50LCBMYXRlbmN5Q2FsY3VsYXRlZEV2ZW50LCBMYXRlbmN5VGVzdFJlc3VsdEV2ZW50LCBTdGF0c1JlY2VpdmVkRXZlbnQsIFN0cmVhbUxvYWRpbmdFdmVudCwgU3RyZWFtUHJlQ29ubmVjdEV2ZW50LCBTdHJlYW1SZWNvbm5lY3RFdmVudCwgU3RyZWFtUHJlRGlzY29ubmVjdEV2ZW50LCBWaWRlb0VuY29kZXJBdmdRUEV2ZW50LCBWaWRlb0luaXRpYWxpemVkRXZlbnQsIFdlYlJ0Y0F1dG9Db25uZWN0RXZlbnQsIFdlYlJ0Y0Nvbm5lY3RlZEV2ZW50LCBXZWJSdGNDb25uZWN0aW5nRXZlbnQsIFdlYlJ0Y0Rpc2Nvbm5lY3RlZEV2ZW50LCBXZWJSdGNGYWlsZWRFdmVudCwgV2ViUnRjU2RwRXZlbnQsIERhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXNwb25zZUV2ZW50LCBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzdWx0RXZlbnQsIFBsYXllckNvdW50RXZlbnQsIFdlYlJ0Y1RDUFJlbGF5RGV0ZWN0ZWRFdmVudCwgU3Vic2NyaWJlRmFpbGVkRXZlbnQsIFdlYlJ0Y1NkcE9mZmVyRXZlbnQsIFdlYlJ0Y1NkcEFuc3dlckV2ZW50IH0gZnJvbSAnLi4vVXRpbC9FdmVudEVtaXR0ZXInO1xuaW1wb3J0IHsgV2ViWFJDb250cm9sbGVyIH0gZnJvbSAnLi4vV2ViWFIvV2ViWFJDb250cm9sbGVyJztcbmltcG9ydCB7IE1lc3NhZ2VEaXJlY3Rpb24gfSBmcm9tICcuLi9VZUluc3RhbmNlTWVzc2FnZS9TdHJlYW1NZXNzYWdlQ29udHJvbGxlcic7XG5pbXBvcnQgeyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0Q29udHJvbGxlciB9IGZyb20gJy4uL0RhdGFDaGFubmVsL0RhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyJztcbmltcG9ydCB7IFJUQ1V0aWxzIH0gZnJvbSAnLi4vVXRpbC9SVENVdGlscyc7XG5pbXBvcnQgeyBJVVJMU2VhcmNoUGFyYW1zIH0gZnJvbSAnLi4vVXRpbC9JVVJMU2VhcmNoUGFyYW1zJztcbi8qKlxuICogVGhlIGtleSBjbGFzcyBmb3IgdGhlIGJyb3dzZXIgc2lkZSBvZiBhIFBpeGVsIFN0cmVhbWluZyBhcHBsaWNhdGlvbiwgaXQgaW5jbHVkZXM6XG4gKiBXZWJSVEMgaGFuZGxpbmcsIFhSIHN1cHBvcnQsIGlucHV0IGhhbmRsaW5nLCBhbmQgZW1pdHRlcnMgZm9yIGxpZmV0aW1lIGFuZCBzdGF0ZSBjaGFuZ2UgZXZlbnRzLlxuICogVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoaXMgY2xhc3MgYXMgaXMsIHRocm91Z2ggY29tcG9zaXRpb24sIG9yIGV4dGVuZCBpdC4gSW4gYW55IGNhc2UsXG4gKiB0aGlzIHdpbGwgbGlrZWx5IGJlIHRoZSBjb3JlIG9mIHlvdXIgUGl4ZWwgU3RyZWFtaW5nIGV4cGVyaWVuY2UgaW4gdGVybXMgb2YgZnVuY3Rpb25hbGl0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBpeGVsU3RyZWFtaW5nIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gQSBuZXdseSBpbnN0YW50aWF0ZWQgY29uZmlnIG9iamVjdFxuICAgICAqIEBwYXJhbSBvdmVycmlkZXMgLSBQYXJhbWV0ZXJzIHRvIG92ZXJyaWRlIGRlZmF1bHQgYmVoYXZpb3VyXG4gICAgICogcmV0dXJucyB0aGUgYmFzZSBQaXhlbCBzdHJlYW1pbmcgb2JqZWN0XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnLCBvdmVycmlkZXMpIHtcbiAgICAgICAgdGhpcy5hbGxvd0NvbnNvbGVDb21tYW5kcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgaWYgKG92ZXJyaWRlcyA9PT0gbnVsbCB8fCBvdmVycmlkZXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG92ZXJyaWRlcy52aWRlb0VsZW1lbnRQYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZGVvRWxlbWVudFBhcmVudCA9IG92ZXJyaWRlcy52aWRlb0VsZW1lbnRQYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyID0gbmV3IFBpeGVsU3RyZWFtaW5nRXZlbnRFbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY29uZmlndXJlU2V0dGluZ3MoKTtcbiAgICAgICAgLy8gc2V0dXAgV2ViUlRDXG4gICAgICAgIHRoaXMuc2V0V2ViUnRjUGxheWVyQ29udHJvbGxlcihuZXcgV2ViUnRjUGxheWVyQ29udHJvbGxlcih0aGlzLmNvbmZpZywgdGhpcykpO1xuICAgICAgICB0aGlzLl93ZWJYckNvbnRyb2xsZXIgPSBuZXcgV2ViWFJDb250cm9sbGVyKHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLl9zZXR1cFdlYlJ0Y1RDUFJlbGF5RGV0ZWN0aW9uID0gdGhpcy5fc2V0dXBXZWJSdGNUQ1BSZWxheURldGVjdGlvbi5iaW5kKHRoaXMpO1xuICAgICAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXIgZm9yIHRoZSB3ZWJSdGNDb25uZWN0ZWQgZXZlbnRcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYlJ0Y0Nvbm5lY3RlZCcsIChfKSA9PiB7XG4gICAgICAgICAgICAvLyBCaW5kIHRvIHRoZSBzdGF0cyByZWNlaXZlZCBldmVudFxuICAgICAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXRzUmVjZWl2ZWQnLCB0aGlzLl9zZXR1cFdlYlJ0Y1RDUFJlbGF5RGV0ZWN0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgdmlkZW8gc3RyZWFtIGVsZW1lbnQuXG4gICAgICovXG4gICAgZ2V0IHZpZGVvRWxlbWVudFBhcmVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl92aWRlb0VsZW1lbnRQYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZGVvRWxlbWVudFBhcmVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fdmlkZW9FbGVtZW50UGFyZW50LmlkID0gJ3ZpZGVvRWxlbWVudFBhcmVudCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZGVvRWxlbWVudFBhcmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHRoZSBzZXR0aW5ncyB3aXRoIG9uIGNoYW5nZSBsaXN0ZW5lcnMgYW5kIGFueSBhZGRpdGlvbmFsIHBlciBleHBlcmllbmNlIHNldHRpbmdzLlxuICAgICAqL1xuICAgIGNvbmZpZ3VyZVNldHRpbmdzKCkge1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKEZsYWdzLklzUXVhbGl0eUNvbnRyb2xsZXIsICh3YW50c1F1YWxpdHlDb250cm9sbGVyKSA9PiB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgc2V0dGluZyBoYXMgYmVlbiBzZXQgdG8gdHJ1ZSAoZWl0aGVyIHByb2dyYW1tYXRpY2FsbHkgb3IgdGhlIHVzZXIgaGFzIGZsaWNrZWQgdGhlIHRvZ2dsZSlcbiAgICAgICAgICAgIC8vIGFuZCB3ZSBhcmVuJ3QgY3VycmVudGx5IHF1YWxpdHkgY29udHJvbGxlciwgc2VuZCB0aGUgcmVxdWVzdFxuICAgICAgICAgICAgaWYgKHdhbnRzUXVhbGl0eUNvbnRyb2xsZXIgPT09IHRydWUgJiYgIXRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuaXNRdWFsaXR5Q29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2VuZFJlcXVlc3RRdWFsaXR5Q29udHJvbE93bmVyc2hpcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihGbGFncy5BRktEZXRlY3Rpb24sIChpc0FGS0VuYWJsZWQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2V0QWZrRW5hYmxlZChpc0FGS0VuYWJsZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihGbGFncy5NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbiwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci51cGRhdGVWaWRlb1N0cmVhbVNpemUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUsIChpc0hvdmVyaW5nTW91c2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldEZsYWdMYWJlbChGbGFncy5Ib3ZlcmluZ01vdXNlTW9kZSwgYENvbnRyb2wgU2NoZW1lOiAke2lzSG92ZXJpbmdNb3VzZSA/ICdIb3ZlcmluZycgOiAnTG9ja2VkJ30gTW91c2VgKTtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2V0TW91c2VJbnB1dEVuYWJsZWQodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5Nb3VzZUlucHV0KSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyB1c2VyIGlucHV0XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoRmxhZ3MuS2V5Ym9hcmRJbnB1dCwgKGlzRW5hYmxlZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZXRLZXlib2FyZElucHV0RW5hYmxlZChpc0VuYWJsZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihGbGFncy5Nb3VzZUlucHV0LCAoaXNFbmFibGVkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNldE1vdXNlSW5wdXRFbmFibGVkKGlzRW5hYmxlZCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKEZsYWdzLkZha2VNb3VzZVdpdGhUb3VjaGVzLCAoX2lzRmFrZU1vdXNlRW5hYmxlZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZXRUb3VjaElucHV0RW5hYmxlZCh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLlRvdWNoSW5wdXQpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoRmxhZ3MuVG91Y2hJbnB1dCwgKGlzRW5hYmxlZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZXRUb3VjaElucHV0RW5hYmxlZChpc0VuYWJsZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihGbGFncy5HYW1lcGFkSW5wdXQsIChpc0VuYWJsZWQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2V0R2FtZVBhZElucHV0RW5hYmxlZChpc0VuYWJsZWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZGlyZWN0IHFwIHNldHRpbmdzXG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPbk51bWVyaWNTZXR0aW5nQ2hhbmdlZExpc3RlbmVyKE51bWVyaWNQYXJhbWV0ZXJzLk1pblFQLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLSAgU2VuZGluZyBNaW5RUCAgLS0tLS0tLS0nKTtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2VuZEVuY29kZXJNaW5RUChuZXdWYWx1ZSk7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICAgICAgY29uc3QgcXVhbGl0eSA9IE1hdGgudHJ1bmMoMTAwICogKDEgLSBuZXdWYWx1ZSAvIDUxKSk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWF4LCBxdWFsaXR5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPbk51bWVyaWNTZXR0aW5nQ2hhbmdlZExpc3RlbmVyKE51bWVyaWNQYXJhbWV0ZXJzLk1heFFQLCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLSAgU2VuZGluZyBNYXhRUCAgLS0tLS0tLS0nKTtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2VuZEVuY29kZXJNYXhRUChuZXdWYWx1ZSk7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICAgICAgY29uc3QgcXVhbGl0eSA9IE1hdGgudHJ1bmMoMTAwICogKDEgLSBuZXdWYWx1ZSAvIDUxKSk7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWluLCBxdWFsaXR5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGRpcmVjdCBxdWFsaXR5IGZhY3RvciBzZXR0aW5nc1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25OdW1lcmljU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihOdW1lcmljUGFyYW1ldGVycy5NaW5RdWFsaXR5LCAobmV3VmFsdWUpID0+IHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLSAgU2VuZGluZyBNaW5RdWFsaXR5ICAtLS0tLS0tLScpO1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZW5kRW5jb2Rlck1pblF1YWxpdHkobmV3VmFsdWUpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE51bWVyaWNTZXR0aW5nKE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNaW4sIG5ld1ZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPbk51bWVyaWNTZXR0aW5nQ2hhbmdlZExpc3RlbmVyKE51bWVyaWNQYXJhbWV0ZXJzLk1heFF1YWxpdHksIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tICBTZW5kaW5nIE1heFF1YWxpdHkgIC0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRFbmNvZGVyTWF4UXVhbGl0eShuZXdWYWx1ZSk7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0TnVtZXJpY1NldHRpbmcoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heCwgbmV3VmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gbmV3IHF1YWxpdHkgdmFsdWUgdGhhdCBnZXRzIHNjYWxlZCB0byBxcCBmb3IgbGVnYWN5IHJlYXNvbnNcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uTnVtZXJpY1NldHRpbmdDaGFuZ2VkTGlzdGVuZXIoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1pbiwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IDUxIC0gKG5ld1ZhbHVlIC8gMTAwKSAqIDUxO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tICBTZW5kaW5nIE1pblFQIGZyb20gcXVhbGl0eSB2YWx1ZSAgLS0tLS0tLS0nKTtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2VuZEVuY29kZXJNYXhRUChuZXdWYWx1ZSk7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uTnVtZXJpY1NldHRpbmdDaGFuZ2VkTGlzdGVuZXIoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heCwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICBuZXdWYWx1ZSA9IDUxIC0gKG5ld1ZhbHVlIC8gMTAwKSAqIDUxO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tICBTZW5kaW5nIE1heFFQIGZyb20gcXVhbGl0eSB2YWx1ZSAgLS0tLS0tLS0nKTtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2VuZEVuY29kZXJNaW5RUChuZXdWYWx1ZSk7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gV2ViUlRDIHNldHRpbmdzXG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPbk51bWVyaWNTZXR0aW5nQ2hhbmdlZExpc3RlbmVyKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01pbkJpdHJhdGUsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tICBTZW5kaW5nIHdlYiBydGMgc2V0dGluZ3MgIC0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRXZWJSVENNaW5CaXRyYXRlKG5ld1ZhbHVlICogMTAwMCAvKiBrYnBzIHRvIGJwcyAqLyk7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uTnVtZXJpY1NldHRpbmdDaGFuZ2VkTGlzdGVuZXIoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWF4Qml0cmF0ZSwgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnLS0tLS0tLS0gIFNlbmRpbmcgd2ViIHJ0YyBzZXR0aW5ncyAgLS0tLS0tLS0nKTtcbiAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2VuZFdlYlJUQ01heEJpdHJhdGUobmV3VmFsdWUgKiAxMDAwIC8qIGticHMgdG8gYnBzICovKTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25OdW1lcmljU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihOdW1lcmljUGFyYW1ldGVycy5XZWJSVENGUFMsIChuZXdWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tICBTZW5kaW5nIHdlYiBydGMgc2V0dGluZ3MgIC0tLS0tLS0tJyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRXZWJSVENGcHMobmV3VmFsdWUpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29uZmlnLl9hZGRPbk9wdGlvblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYywgKG5ld1ZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5fd2ViUnRjQ29udHJvbGxlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2V0UHJlZmVycmVkQ29kZWMobmV3VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25maWcuX3JlZ2lzdGVyT25DaGFuZ2VFdmVudHModGhpcy5fZXZlbnRFbWl0dGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBpbnB1dCBjb250cm9sIG93bmVyc2hpcFxuICAgICAqIEBwYXJhbSBpbnB1dENvbnRyb2xPd25lcnNoaXAgLSBkb2VzIHRoZSB1c2VyIGhhdmUgaW5wdXQgY29udHJvbCBvd25lcnNoaXBcbiAgICAgKi9cbiAgICBfb25JbnB1dENvbnRyb2xPd25lcnNoaXAoaW5wdXRDb250cm9sT3duZXJzaGlwKSB7XG4gICAgICAgIHRoaXMuX2lucHV0Q29udHJvbGxlciA9IGlucHV0Q29udHJvbE93bmVyc2hpcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW5zdGFudGlhdGUgdGhlIFdlYlJUQ1BsYXllckNvbnRyb2xsZXIgaW50ZXJmYWNlIHRvIHByb3ZpZGUgV2ViUlRDUGxheWVyQ29udHJvbGxlciBmdW5jdGlvbmFsaXR5IHdpdGhpbiB0aGlzIGNsYXNzIGFuZCBzZXQgdXAgYW55dGhpbmcgdGhhdCByZXF1aXJlcyBpdFxuICAgICAqIEBwYXJhbSB3ZWJSdGNQbGF5ZXJDb250cm9sbGVyIC0gYSBXZWJSdGNQbGF5ZXJDb250cm9sbGVyIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXRXZWJSdGNQbGF5ZXJDb250cm9sbGVyKHdlYlJ0Y1BsYXllckNvbnRyb2xsZXIpIHtcbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlciA9IHdlYlJ0Y1BsYXllckNvbnRyb2xsZXI7XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2V0UHJlZmVycmVkQ29kZWModGhpcy5jb25maWcuZ2V0U2V0dGluZ09wdGlvbihPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZENvZGVjKS5zZWxlY3RlZCk7XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIucmVzaXplUGxheWVyU3R5bGUoKTtcbiAgICAgICAgLy8gY29ubmVjdCBpZiBhdXRvIGNvbm5lY3QgZmxhZyBpcyBlbmFibGVkXG4gICAgICAgIHRoaXMuY2hlY2tGb3JBdXRvQ29ubmVjdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25uZWN0IHRvIHNpZ25hbGluZyBzZXJ2ZXIuXG4gICAgICovXG4gICAgY29ubmVjdCgpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFN0cmVhbVByZUNvbm5lY3RFdmVudCgpKTtcbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5jb25uZWN0VG9TaWduYWxsaW5nU2VydmVyKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlY29ubmVjdHMgdG8gdGhlIHNpZ25hbGluZyBzZXJ2ZXIuIElmIGNvbm5lY3Rpb24gaXMgdXAsIGRpc2Nvbm5lY3RzIGZpcnN0XG4gICAgICogYmVmb3JlIGVzdGFibGlzaGluZyBhIG5ldyBjb25uZWN0aW9uXG4gICAgICovXG4gICAgcmVjb25uZWN0KCkge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgU3RyZWFtUmVjb25uZWN0RXZlbnQoKSk7XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIudHJ5UmVjb25uZWN0KCdSZWNvbm5lY3RpbmcuLi4nKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGlzY29ubmVjdCBmcm9tIHRoZSBzaWduYWxpbmcgc2VydmVyIGFuZCBjbG9zZSBvcGVuIHBlZXIgY29ubmVjdGlvbnMuXG4gICAgICovXG4gICAgZGlzY29ubmVjdCgpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFN0cmVhbVByZURpc2Nvbm5lY3RFdmVudCgpKTtcbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5jbG9zZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQbGF5IHRoZSBzdHJlYW0uIENhbiBiZSBjYWxsZWQgb25seSBhZnRlciBhIHBlZXIgY29ubmVjdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZC5cbiAgICAgKi9cbiAgICBwbGF5KCkge1xuICAgICAgICB0aGlzLl9vblN0cmVhbUxvYWRpbmcoKTtcbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5wbGF5U3RyZWFtKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEF1dG8gY29ubmVjdCBpZiBBdXRvQ29ubmVjdCBmbGFnIGlzIGVuYWJsZWRcbiAgICAgKi9cbiAgICBjaGVja0ZvckF1dG9Db25uZWN0KCkge1xuICAgICAgICAvLyBzZXQgdXAgaWYgdGhlIGF1dG8gcGxheSB3aWxsIGJlIHVzZWQgb3IgcmVndWxhciBjbGljayB0byBzdGFydFxuICAgICAgICBpZiAodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5BdXRvQ29ubmVjdCkpIHtcbiAgICAgICAgICAgIC8vIGlmIGF1dG9wbGF5aW5nIHNob3cgYW4gaW5mbyBvdmVybGF5IHdoaWxlIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBjb25uZWN0aW9uIHRvIGJlZ2luXG4gICAgICAgICAgICB0aGlzLl9vbldlYlJ0Y0F1dG9Db25uZWN0KCk7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLmNvbm5lY3RUb1NpZ25hbGxpbmdTZXJ2ZXIoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXaWxsIHVubXV0ZSB0aGUgbWljcm9waG9uZSB0cmFjayB3aGljaCBpcyBzZW50IHRvIFVucmVhbCBFbmdpbmUuXG4gICAgICogQnkgZGVmYXVsdCwgd2lsbCBvbmx5IHVubXV0ZSBhbiBleGlzdGluZyBtaWMgdHJhY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZm9yY2VFbmFibGUgQ2FuIGJlIHVzZWQgZm9yIGNhc2VzIHdoZW4gdGhpcyBvYmplY3Qgd2Fzbid0IGluaXRpYWxpemVkIHdpdGggYSBtaWMgdHJhY2suXG4gICAgICogSWYgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSByZXN0YXJ0ZWQgd2l0aCBhIG1pY3JvcGhvbmUuXG4gICAgICogV2FybmluZzogdGhpcyB0YWtlcyBzb21lIHRpbWUsIGFzIGEgZnVsbCByZW5lZ290aWF0aW9uIGFuZCByZWNvbm5lY3Rpb24gd2lsbCBoYXBwZW4uXG4gICAgICovXG4gICAgdW5tdXRlTWljcm9waG9uZShmb3JjZUVuYWJsZSA9IGZhbHNlKSB7XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gZXhpc3RpbmcgbWljIHRyYWNrLCB3ZSBqdXN0IHNldCBtdXRlZCBzdGF0ZVxuICAgICAgICBpZiAodGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZCgnVXNlTWljJykpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0TWljcm9waG9uZU11dGVkKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIHByZS1leGlzdGluZyBtaWMgdHJhY2ssIGFuZCBjYWxsZXIgaXMgb2sgd2l0aCBmdWxsIHJlc2V0LCB3ZSBlbmFibGUgYW5kIHJlc2V0XG4gICAgICAgIGlmIChmb3JjZUVuYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0RmxhZ0VuYWJsZWQoJ1VzZU1pYycsIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB3ZSBwcmVmZXIgbm90IHRvIGZvcmNlIGEgcmVjb25uZWN0aW9uLCBqdXN0IHdhcm4gdGhlIHVzZXIgdGhhdCB0aGlzIG9wZXJhdGlvbiBkaWRuJ3QgaGFwcGVuXG4gICAgICAgIExvZ2dlci5XYXJuaW5nKCdUcnlpbmcgdG8gdW5tdXRlIG1pYywgYnV0IFBpeGVsU3RyZWFtaW5nIHdhcyBpbml0aWFsaXplZCB3aXRoIG5vIG1pY3JvcGhvbmUgdHJhY2suIENhbGwgd2l0aCBmb3JjZUVuYWJsZSA9PSB0cnVlIHRvIHJlLWNvbm5lY3Qgd2l0aCBhIG1pYyB0cmFjay4nKTtcbiAgICB9XG4gICAgbXV0ZU1pY3JvcGhvbmUoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKCdVc2VNaWMnKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRNaWNyb3Bob25lTXV0ZWQodHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgd2Fzbid0IGEgbWljIHRyYWNrLCBqdXN0IGxldCB1c2VyIGtub3cgdGhlcmUncyBub3RoaW5nIHRvIG11dGVcbiAgICAgICAgTG9nZ2VyLkluZm8oJ1RyeWluZyB0byBtdXRlIG1pYywgYnV0IFBpeGVsU3RyZWFtaW5nIGhhcyBubyBtaWNyb3Bob25lIHRyYWNrLCBzbyBzZW5kaW5nIHNvdW5kIGlzIGFscmVhZHkgZGlzYWJsZWQuJyk7XG4gICAgfVxuICAgIHNldE1pY3JvcGhvbmVNdXRlZChtdXRlKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgZm9yIChjb25zdCB0cmFuc2NlaXZlciBvZiAoX2QgPSAoX2MgPSAoX2IgPSAoX2EgPSB0aGlzLl93ZWJSdGNDb250cm9sbGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGVlckNvbm5lY3Rpb25Db250cm9sbGVyKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucGVlckNvbm5lY3Rpb24pID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5nZXRUcmFuc2NlaXZlcnMoKSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogW10pIHtcbiAgICAgICAgICAgIGlmIChSVENVdGlscy5jYW5UcmFuc2NlaXZlclNlbmRBdWRpbyh0cmFuc2NlaXZlcikpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2NlaXZlci5zZW5kZXIudHJhY2suZW5hYmxlZCA9ICFtdXRlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdpbGwgdW5tdXRlIHRoZSB2aWRlbyB0cmFjayB3aGljaCBpcyBzZW50IHRvIFVucmVhbCBFbmdpbmUuXG4gICAgICogQnkgZGVmYXVsdCwgd2lsbCBvbmx5IHVubXV0ZSBhbiBleGlzdGluZyB2aWRlbyB0cmFjay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBmb3JjZUVuYWJsZSBDYW4gYmUgdXNlZCBmb3IgY2FzZXMgd2hlbiB0aGlzIG9iamVjdCB3YXNuJ3QgaW5pdGlhbGl6ZWQgd2l0aCBhIHZpZGVvIHRyYWNrLlxuICAgICAqIElmIHRoaXMgcGFyYW1ldGVyIGlzIHRydWUsIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgcmVzdGFydGVkIHdpdGggYSBjYW1lcmEuXG4gICAgICogV2FybmluZzogdGhpcyB0YWtlcyBzb21lIHRpbWUsIGFzIGEgZnVsbCByZW5lZ290aWF0aW9uIGFuZCByZWNvbm5lY3Rpb24gd2lsbCBoYXBwZW4uXG4gICAgICovXG4gICAgdW5tdXRlQ2FtZXJhKGZvcmNlRW5hYmxlID0gZmFsc2UpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBleGlzdGluZyB2aWRlbyB0cmFjaywgd2UganVzdCBzZXQgbXV0ZWQgc3RhdGVcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoJ1VzZUNhbWVyYScpKSB7XG4gICAgICAgICAgICB0aGlzLnNldENhbWVyYU11dGVkKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGVyZSdzIG5vIHByZS1leGlzdGluZyB2aWRlbyB0cmFjaywgYW5kIGNhbGxlciBpcyBvayB3aXRoIGZ1bGwgcmVzZXQsIHdlIGVuYWJsZSBhbmQgcmVzZXRcbiAgICAgICAgaWYgKGZvcmNlRW5hYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXRGbGFnRW5hYmxlZCgnVXNlQ2FtZXJhJywgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLnJlY29ubmVjdCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHdlIHByZWZlciBub3QgdG8gZm9yY2UgYSByZWNvbm5lY3Rpb24sIGp1c3Qgd2FybiB0aGUgdXNlciB0aGF0IHRoaXMgb3BlcmF0aW9uIGRpZG4ndCBoYXBwZW5cbiAgICAgICAgTG9nZ2VyLldhcm5pbmcoJ1RyeWluZyB0byB1bm11dGUgdmlkZW8sIGJ1dCBQaXhlbFN0cmVhbWluZyB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBubyB2aWRlbyB0cmFjay4gQ2FsbCB3aXRoIGZvcmNlRW5hYmxlID09IHRydWUgdG8gcmUtY29ubmVjdCB3aXRoIGEgdmlkZW8gdHJhY2suJyk7XG4gICAgfVxuICAgIG11dGVDYW1lcmEoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKCdVc2VDYW1lcmEnKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRDYW1lcmFNdXRlZCh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGVyZSB3YXNuJ3QgYSBtaWMgdHJhY2ssIGp1c3QgbGV0IHVzZXIga25vdyB0aGVyZSdzIG5vdGhpbmcgdG8gbXV0ZVxuICAgICAgICBMb2dnZXIuSW5mbygnVHJ5aW5nIHRvIG11dGUgY2FtZXJhLCBidXQgUGl4ZWxTdHJlYW1pbmcgaGFzIG5vIHZpZGVvIHRyYWNrLCBzbyBzZW5kaW5nIHZpZGVvIGlzIGFscmVhZHkgZGlzYWJsZWQuJyk7XG4gICAgfVxuICAgIHNldENhbWVyYU11dGVkKG11dGUpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBmb3IgKGNvbnN0IHRyYW5zY2VpdmVyIG9mIChfZCA9IChfYyA9IChfYiA9IChfYSA9IHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5wZWVyQ29ubmVjdGlvbikgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmdldFRyYW5zY2VpdmVycygpKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBbXSkge1xuICAgICAgICAgICAgaWYgKFJUQ1V0aWxzLmNhblRyYW5zY2VpdmVyU2VuZFZpZGVvKHRyYW5zY2VpdmVyKSkge1xuICAgICAgICAgICAgICAgIHRyYW5zY2VpdmVyLnNlbmRlci50cmFjay5lbmFibGVkID0gIW11dGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZW1pdCBhbiBldmVudCB3aGVuIGF1dG8gY29ubmVjdGluZyBvY2N1cnNcbiAgICAgKi9cbiAgICBfb25XZWJSdGNBdXRvQ29ubmVjdCgpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFdlYlJ0Y0F1dG9Db25uZWN0RXZlbnQoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGVtaXQgYW4gZXZlbnQgZm9yIHdoZW4gU0RQIG5lZ290aWF0aW9uIGlzIGZ1bGx5IGZpbmlzaGVkLlxuICAgICAqL1xuICAgIF9vbldlYlJ0Y1NkcCgpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFdlYlJ0Y1NkcEV2ZW50KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBlbWl0IGFuIFNEUCBvZmZlciBhZnRlciBpdCBoYXMgYmVlbiBzZXQuXG4gICAgICovXG4gICAgX29uV2ViUnRjU2RwT2ZmZXIob2ZmZXIpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFdlYlJ0Y1NkcE9mZmVyRXZlbnQoeyBzZHA6IG9mZmVyIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZW1pdCBhbiBTRFAgYW5zd2VyIGFmdGVyIGl0IGhhcyBiZWVuIHNldC5cbiAgICAgKi9cbiAgICBfb25XZWJSdGNTZHBBbnN3ZXIoYW5zd2VyKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBXZWJSdGNTZHBBbnN3ZXJFdmVudCh7IHNkcDogYW5zd2VyIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gY2FsbCB0byBlbWl0IGEgYGxhdGVuY3lDYWxjdWxhdGVkYCBldmVudC5cbiAgICAgKi9cbiAgICBfb25MYXRlbmN5Q2FsY3VsYXRlZChsYXRlbmN5SW5mbykge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgTGF0ZW5jeUNhbGN1bGF0ZWRFdmVudCh7IGxhdGVuY3lJbmZvIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gZW1pdHMgYSBTdHJlYW1Mb2FkaW5nIGV2ZW50XG4gICAgICovXG4gICAgX29uU3RyZWFtTG9hZGluZygpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFN0cmVhbUxvYWRpbmdFdmVudCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXZlbnQgZmlyZWQgd2hlbiB0aGUgdmlkZW8gaXMgZGlzY29ubmVjdGVkIC0gZW1pdHMgZ2l2ZW4gZXZlbnRTdHJpbmcgb3IgYW4gb3ZlcnJpZGVcbiAgICAgKiBtZXNzYWdlIGZyb20gd2ViUnRjQ29udHJvbGxlciBpZiBvbmUgaGFzIGJlZW4gc2V0XG4gICAgICogQHBhcmFtIGV2ZW50U3RyaW5nIC0gYSBzdHJpbmcgZGVzY3JpYmluZyB3aHkgdGhlIGNvbm5lY3Rpb24gY2xvc2VkXG4gICAgICogQHBhcmFtIGFsbG93Q2xpY2tUb1JlY29ubmVjdCAtIHRydWUgaWYgd2Ugd2FudCB0byBhbGxvdyB0aGUgdXNlciB0byByZXRyeSB0aGUgY29ubmVjdGlvbiB3aXRoIGEgY2xpY2tcbiAgICAgKi9cbiAgICBfb25EaXNjb25uZWN0KGV2ZW50U3RyaW5nLCBhbGxvd0NsaWNrVG9SZWNvbm5lY3QpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFdlYlJ0Y0Rpc2Nvbm5lY3RlZEV2ZW50KHtcbiAgICAgICAgICAgIGV2ZW50U3RyaW5nOiBldmVudFN0cmluZyxcbiAgICAgICAgICAgIGFsbG93Q2xpY2tUb1JlY29ubmVjdDogYWxsb3dDbGlja1RvUmVjb25uZWN0XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIFdlYiBSdGMgaXMgY29ubmVjdGluZ1xuICAgICAqL1xuICAgIF9vbldlYlJ0Y0Nvbm5lY3RpbmcoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBXZWJSdGNDb25uZWN0aW5nRXZlbnQoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiBXZWIgUnRjIGhhcyBjb25uZWN0ZWRcbiAgICAgKi9cbiAgICBfb25XZWJSdGNDb25uZWN0ZWQoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBXZWJSdGNDb25uZWN0ZWRFdmVudCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIFdlYiBSdGMgZmFpbHMgdG8gY29ubmVjdFxuICAgICAqL1xuICAgIF9vbldlYlJ0Y0ZhaWxlZCgpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFdlYlJ0Y0ZhaWxlZEV2ZW50KCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgd2hlbiB0aGUgVmlkZW8gaGFzIGJlZW4gSW5pdGlhbGl6ZWRcbiAgICAgKi9cbiAgICBfb25WaWRlb0luaXRpYWxpemVkKCkge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgVmlkZW9Jbml0aWFsaXplZEV2ZW50KCkpO1xuICAgICAgICB0aGlzLl92aWRlb1N0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB1cCBmdW5jdGlvbmFsaXR5IHRvIGhhcHBlbiB3aGVuIHJlY2VpdmluZyBsYXRlbmN5IHRlc3QgcmVzdWx0c1xuICAgICAqIEBwYXJhbSBsYXRlbmN5IC0gbGF0ZW5jeSB0ZXN0IHJlc3VsdHMgb2JqZWN0XG4gICAgICovXG4gICAgX29uTGF0ZW5jeVRlc3RSZXN1bHQobGF0ZW5jeVRpbWluZ3MpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IExhdGVuY3lUZXN0UmVzdWx0RXZlbnQoeyBsYXRlbmN5VGltaW5ncyB9KSk7XG4gICAgfVxuICAgIF9vbkRhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXNwb25zZShyZXNwb25zZSkge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3BvbnNlRXZlbnQoeyByZXNwb25zZSB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB1cCBmdW5jdGlvbmFsaXR5IHRvIGhhcHBlbiB3aGVuIHJlY2VpdmluZyB2aWRlbyBzdGF0aXN0aWNzXG4gICAgICogQHBhcmFtIHZpZGVvU3RhdHMgLSB2aWRlbyBzdGF0aXN0aWNzIGFzIGEgYWdncmVnYXRlIHN0YXRzIG9iamVjdFxuICAgICAqL1xuICAgIF9vblZpZGVvU3RhdHModmlkZW9TdGF0cykge1xuICAgICAgICAvLyBEdXJhdGlvblxuICAgICAgICBpZiAoIXRoaXMuX3ZpZGVvU3RhcnRUaW1lIHx8IHRoaXMuX3ZpZGVvU3RhcnRUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZGVvU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgfVxuICAgICAgICB2aWRlb1N0YXRzLmhhbmRsZVNlc3Npb25TdGF0aXN0aWNzKHRoaXMuX3ZpZGVvU3RhcnRUaW1lLCB0aGlzLl9pbnB1dENvbnRyb2xsZXIsIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIudmlkZW9BdmdRcCk7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBTdGF0c1JlY2VpdmVkRXZlbnQoeyBhZ2dyZWdhdGVkU3RhdHM6IHZpZGVvU3RhdHMgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZnVuY3Rpb25hbGl0eSB0byBoYXBwZW4gd2hlbiBjYWxjdWxhdGluZyB0aGUgYXZlcmFnZSB2aWRlbyBlbmNvZGVyIHFwXG4gICAgICogQHBhcmFtIFFQIC0gdGhlIHF1YWxpdHkgbnVtYmVyIG9mIHRoZSBzdHJlYW1cbiAgICAgKi9cbiAgICBfb25WaWRlb0VuY29kZXJBdmdRUChRUCkge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgVmlkZW9FbmNvZGVyQXZnUVBFdmVudCh7IGF2Z1FQOiBRUCB9KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB1cCBmdW5jdGlvbmFsaXR5IHRvIGhhcHBlbiB3aGVuIHJlY2VpdmluZyBhbmQgaGFuZGxpbmcgaW5pdGlhbCBzZXR0aW5ncyBmb3IgdGhlIFVFIGFwcFxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyAtIGluaXRpYWwgVUUgYXBwIHNldHRpbmdzXG4gICAgICovXG4gICAgX29uSW5pdGlhbFNldHRpbmdzKHNldHRpbmdzKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IEluaXRpYWxTZXR0aW5nc0V2ZW50KHsgc2V0dGluZ3MgfSkpO1xuICAgICAgICBpZiAoc2V0dGluZ3MuUGl4ZWxTdHJlYW1pbmdTZXR0aW5ncykge1xuICAgICAgICAgICAgdGhpcy5hbGxvd0NvbnNvbGVDb21tYW5kcyA9IChfYSA9IHNldHRpbmdzLlBpeGVsU3RyZWFtaW5nU2V0dGluZ3MuQWxsb3dQaXhlbFN0cmVhbWluZ0NvbW1hbmRzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBmYWxzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmFsbG93Q29uc29sZUNvbW1hbmRzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIExvZ2dlci5JbmZvKCctQWxsb3dQaXhlbFN0cmVhbWluZ0NvbW1hbmRzPWZhbHNlLCBzZW5kaW5nIGFyYml0cmFyeSBjb25zb2xlIGNvbW1hbmRzIGZyb20gYnJvd3NlciB0byBVRSBpcyBkaXNhYmxlZC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VVcmxQYXJhbXMgPSB0aGlzLmNvbmZpZy51c2VVcmxQYXJhbXM7XG4gICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBJVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgICAgICBMb2dnZXIuSW5mbyhgdXNpbmcgVVJMIHBhcmFtZXRlcnMgJHt1c2VVcmxQYXJhbXN9YCk7XG4gICAgICAgIGlmIChzZXR0aW5ncy5FbmNvZGVyU2V0dGluZ3MpIHtcbiAgICAgICAgICAgIC8vIGhlcmUgd2Ugc2hvdWxkIGVpdGhlciBnZXQgTWluL01heFFQIGZyb20gUFMxXG4gICAgICAgICAgICAvLyBvciBNaW4vTWF4UXVhbGl0eSBmcm9tIFBTMlxuICAgICAgICAgICAgLy8gd2Ugb25seSB3YW50IHRvIHNldCBvbmUgc2V0IG9yIHRoZSBvdGhlciBhcyB0aGV5IGNvbnZlcmdlIGluIENvbXBhdFF1YWxpdHlNaW4vTWF4IGFuZFxuICAgICAgICAgICAgLy8gd2UgZG9udCB3YW50IHRvIGhhdmUgdGhlbSBjb25mbGljdCB3aXRoIGRlZmF1bHQgdmFsdWVzLlxuICAgICAgICAgICAgaWYgKHNldHRpbmdzLkVuY29kZXJTZXR0aW5ncy5NaW5RUCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE51bWVyaWNTZXR0aW5nKE51bWVyaWNQYXJhbWV0ZXJzLk1pblFQLCBcbiAgICAgICAgICAgICAgICAvLyBJZiBhIHNldHRpbmcgaXMgc2V0IGluIHRoZSBVUkwsIG1ha2Ugc3VyZSB3ZSByZXNwZWN0IHRoYXQgdmFsdWUgYXMgb3Bwb3NlZCB0byB3aGF0IHRoZSBhcHBsaWNhdGlvbiBzZW5kcyB1c1xuICAgICAgICAgICAgICAgIHVzZVVybFBhcmFtcyAmJiB1cmxQYXJhbXMuaGFzKE51bWVyaWNQYXJhbWV0ZXJzLk1pblFQKVxuICAgICAgICAgICAgICAgICAgICA/IE51bWJlci5wYXJzZUZsb2F0KHVybFBhcmFtcy5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuTWluUVApKVxuICAgICAgICAgICAgICAgICAgICA6IHNldHRpbmdzLkVuY29kZXJTZXR0aW5ncy5NaW5RUCB8fCAwKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5NYXhRUCwgdXNlVXJsUGFyYW1zICYmIHVybFBhcmFtcy5oYXMoTnVtZXJpY1BhcmFtZXRlcnMuTWF4UVApXG4gICAgICAgICAgICAgICAgICAgID8gTnVtYmVyLnBhcnNlRmxvYXQodXJsUGFyYW1zLmdldChOdW1lcmljUGFyYW1ldGVycy5NYXhRUCkpXG4gICAgICAgICAgICAgICAgICAgIDogc2V0dGluZ3MuRW5jb2RlclNldHRpbmdzLk1heFFQIHx8IDUxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5FbmNvZGVyU2V0dGluZ3MuTWluUXVhbGl0eSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE51bWVyaWNTZXR0aW5nKE51bWVyaWNQYXJhbWV0ZXJzLk1pblF1YWxpdHksIFxuICAgICAgICAgICAgICAgIC8vIElmIGEgc2V0dGluZyBpcyBzZXQgaW4gdGhlIFVSTCwgbWFrZSBzdXJlIHdlIHJlc3BlY3QgdGhhdCB2YWx1ZSBhcyBvcHBvc2VkIHRvIHdoYXQgdGhlIGFwcGxpY2F0aW9uIHNlbmRzIHVzXG4gICAgICAgICAgICAgICAgdXNlVXJsUGFyYW1zICYmIHVybFBhcmFtcy5oYXMoTnVtZXJpY1BhcmFtZXRlcnMuTWluUXVhbGl0eSlcbiAgICAgICAgICAgICAgICAgICAgPyBOdW1iZXIucGFyc2VGbG9hdCh1cmxQYXJhbXMuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLk1pblF1YWxpdHkpKVxuICAgICAgICAgICAgICAgICAgICA6IHNldHRpbmdzLkVuY29kZXJTZXR0aW5ncy5NaW5RdWFsaXR5IHx8IDApO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE51bWVyaWNTZXR0aW5nKE51bWVyaWNQYXJhbWV0ZXJzLk1heFF1YWxpdHksIHVzZVVybFBhcmFtcyAmJiB1cmxQYXJhbXMuaGFzKE51bWVyaWNQYXJhbWV0ZXJzLk1heFF1YWxpdHkpXG4gICAgICAgICAgICAgICAgICAgID8gTnVtYmVyLnBhcnNlRmxvYXQodXJsUGFyYW1zLmdldChOdW1lcmljUGFyYW1ldGVycy5NYXhRdWFsaXR5KSlcbiAgICAgICAgICAgICAgICAgICAgOiBzZXR0aW5ncy5FbmNvZGVyU2V0dGluZ3MuTWF4UXVhbGl0eSB8fCAxMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGhlc2UgdHdvIGFyZSBqdXN0IHVzZWQgdG8gY29udmVyZ2UgcXVhbGl0eSBhbmQgcXAgYW5kIGJlaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnRseSBzaW5jZSB0aGV5XG4gICAgICAgICAgICAvLyBzaG91bGRudCBleGlzdCBpbiBFbmNvZGVyU2V0dGluZ3NcbiAgICAgICAgICAgIGlmICh1c2VVcmxQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodXJsUGFyYW1zLmhhcyhOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWluKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWluLCBOdW1iZXIucGFyc2VGbG9hdCh1cmxQYXJhbXMuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNaW4pKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh1cmxQYXJhbXMuaGFzKE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNYXgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE51bWVyaWNTZXR0aW5nKE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNYXgsIE51bWJlci5wYXJzZUZsb2F0KHVybFBhcmFtcy5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heCkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNldHRpbmdzLldlYlJUQ1NldHRpbmdzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXROdW1lcmljU2V0dGluZyhOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNaW5CaXRyYXRlLCB1c2VVcmxQYXJhbXMgJiYgdXJsUGFyYW1zLmhhcyhOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNaW5CaXRyYXRlKVxuICAgICAgICAgICAgICAgID8gTnVtYmVyLnBhcnNlRmxvYXQodXJsUGFyYW1zLmdldChOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNaW5CaXRyYXRlKSlcbiAgICAgICAgICAgICAgICA6IHNldHRpbmdzLldlYlJUQ1NldHRpbmdzLk1pbkJpdHJhdGUgLyAxMDAwIC8qIGJwcyB0byBrYnBzICovKTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnNldE51bWVyaWNTZXR0aW5nKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUsIHVzZVVybFBhcmFtcyAmJiB1cmxQYXJhbXMuaGFzKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUpXG4gICAgICAgICAgICAgICAgPyBOdW1iZXIucGFyc2VGbG9hdCh1cmxQYXJhbXMuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01heEJpdHJhdGUpKVxuICAgICAgICAgICAgICAgIDogc2V0dGluZ3MuV2ViUlRDU2V0dGluZ3MuTWF4Qml0cmF0ZSAvIDEwMDAgLyogYnBzIHRvIGticHMgKi8pO1xuICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0TnVtZXJpY1NldHRpbmcoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDRlBTLCB1c2VVcmxQYXJhbXMgJiYgdXJsUGFyYW1zLmhhcyhOdW1lcmljUGFyYW1ldGVycy5XZWJSVENGUFMpXG4gICAgICAgICAgICAgICAgPyBOdW1iZXIucGFyc2VGbG9hdCh1cmxQYXJhbXMuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ0ZQUykpXG4gICAgICAgICAgICAgICAgOiBzZXR0aW5ncy5XZWJSVENTZXR0aW5ncy5GUFMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB1cCBmdW5jdGlvbmFsaXR5IHRvIGhhcHBlbiB3aGVuIHNldHRpbmcgcXVhbGl0eSBjb250cm9sIG93bmVyc2hpcCBvZiBhIHN0cmVhbVxuICAgICAqIEBwYXJhbSBoYXNRdWFsaXR5T3duZXJzaGlwIC0gZG9lcyB0aGlzIHVzZXIgaGF2ZSBxdWFsaXR5IG93bmVyc2hpcCBvZiB0aGUgc3RyZWFtIHRydWUgLyBmYWxzZVxuICAgICAqL1xuICAgIF9vblF1YWxpdHlDb250cm9sT3duZXJzaGlwKGhhc1F1YWxpdHlPd25lcnNoaXApIHtcbiAgICAgICAgdGhpcy5jb25maWcuc2V0RmxhZ0VuYWJsZWQoRmxhZ3MuSXNRdWFsaXR5Q29udHJvbGxlciwgaGFzUXVhbGl0eU93bmVyc2hpcCk7XG4gICAgfVxuICAgIF9vblBsYXllckNvdW50KHBsYXllckNvdW50KSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBQbGF5ZXJDb3VudEV2ZW50KHsgY291bnQ6IHBsYXllckNvdW50IH0pKTtcbiAgICB9XG4gICAgX29uU3Vic2NyaWJlRmFpbGVkKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLmRpc3BhdGNoRXZlbnQobmV3IFN1YnNjcmliZUZhaWxlZEV2ZW50KHsgbWVzc2FnZTogbWVzc2FnZSB9KSk7XG4gICAgfVxuICAgIC8vIFNldHMgdXAgdG8gZW1pdCB0aGUgd2VicnRjIHRjcCByZWxheSBkZXRlY3QgZXZlbnRcbiAgICBfc2V0dXBXZWJSdGNUQ1BSZWxheURldGVjdGlvbihzdGF0c1JlY2VpdmVkRXZlbnQpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBhY3RpdmUgY2FuZGlkYXRlIHBhaXJcbiAgICAgICAgY29uc3QgYWN0aXZlQ2FuZGlkYXRlUGFpciA9IHN0YXRzUmVjZWl2ZWRFdmVudC5kYXRhLmFnZ3JlZ2F0ZWRTdGF0cy5nZXRBY3RpdmVDYW5kaWRhdGVQYWlyKCk7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBhY3RpdmUgY2FuZGlkYXRlIHBhaXIgaXMgbm90IG51bGxcbiAgICAgICAgaWYgKGFjdGl2ZUNhbmRpZGF0ZVBhaXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBsb2NhbCBjYW5kaWRhdGUgYXNzaWduZWQgdG8gdGhlIGFjdGl2ZSBjYW5kaWRhdGUgcGFpclxuICAgICAgICAgICAgY29uc3QgbG9jYWxDYW5kaWRhdGUgPSBzdGF0c1JlY2VpdmVkRXZlbnQuZGF0YS5hZ2dyZWdhdGVkU3RhdHMubG9jYWxDYW5kaWRhdGVzLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlkID09IGFjdGl2ZUNhbmRpZGF0ZVBhaXIubG9jYWxDYW5kaWRhdGVJZCwgbnVsbCk7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbG9jYWwgY2FuZGlkYXRlIGlzIG5vdCBudWxsLCBjYW5kaWRhdGUgdHlwZSBpcyByZWxheSBhbmQgdGhlIHJlbGF5IHByb3RvY29sIGlzIHRjcFxuICAgICAgICAgICAgaWYgKGxvY2FsQ2FuZGlkYXRlICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBsb2NhbENhbmRpZGF0ZS5jYW5kaWRhdGVUeXBlID09ICdyZWxheScgJiZcbiAgICAgICAgICAgICAgICBsb2NhbENhbmRpZGF0ZS5yZWxheVByb3RvY29sID09ICd0Y3AnKSB7XG4gICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgd2ViIHJ0YyB0Y3AgcmVsYXkgZGV0ZWN0ZWQgZXZlbnRcbiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChuZXcgV2ViUnRjVENQUmVsYXlEZXRlY3RlZEV2ZW50KCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGhlIGNoZWNrIGlzIGNvbXBsZXRlZCBhbmQgdGhlIHN0YXRzIGxpc3RlbiBldmVudCBjYW4gYmUgcmVtb3ZlZFxuICAgICAgICAgICAgdGhpcy5fZXZlbnRFbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N0YXRzUmVjZWl2ZWQnLCB0aGlzLl9zZXR1cFdlYlJ0Y1RDUFJlbGF5RGV0ZWN0aW9uKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGEgY29ubmVjdGlvbiBsYXRlbmN5IHRlc3QuXG4gICAgICogTk9URTogVGhlcmUgYXJlIHBsYW5zIHRvIHJlZmFjdG9yIGFsbCByZXF1ZXN0KiBmdW5jdGlvbnMuIEV4cGVjdCBjaGFuZ2VzIGlmIHlvdSB1c2UgdGhpcyFcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHJlcXVlc3RMYXRlbmN5VGVzdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl93ZWJSdGNDb250cm9sbGVyLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zZW5kTGF0ZW5jeVRlc3QoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlcXVlc3QgYSBkYXRhIGNoYW5uZWwgbGF0ZW5jeSB0ZXN0LlxuICAgICAqIE5PVEU6IFRoZXJlIGFyZSBwbGFucyB0byByZWZhY3RvciBhbGwgcmVxdWVzdCogZnVuY3Rpb25zLiBFeHBlY3QgY2hhbmdlcyBpZiB5b3UgdXNlIHRoaXMhXG4gICAgICovXG4gICAgcmVxdWVzdERhdGFDaGFubmVsTGF0ZW5jeVRlc3QoY29uZmlnKSB7XG4gICAgICAgIGlmICghdGhpcy5fd2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZGF0YUNoYW5uZWxMYXRlbmN5VGVzdENvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyID0gbmV3IERhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250cm9sbGVyKHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2VuZERhdGFDaGFubmVsTGF0ZW5jeVRlc3QuYmluZCh0aGlzLl93ZWJSdGNDb250cm9sbGVyKSwgKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5kaXNwYXRjaEV2ZW50KG5ldyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzdWx0RXZlbnQoeyByZXN1bHQgfSkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2RhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXNwb25zZScsICh7IGRhdGE6IHsgcmVzcG9uc2UgfSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGF0YUNoYW5uZWxMYXRlbmN5VGVzdENvbnRyb2xsZXIucmVjZWl2ZShyZXNwb25zZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YUNoYW5uZWxMYXRlbmN5VGVzdENvbnRyb2xsZXIuc3RhcnQoY29uZmlnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVxdWVzdCBmb3IgdGhlIFVFIGFwcGxpY2F0aW9uIHRvIHNob3cgRlBTIGNvdW50ZXIuXG4gICAgICogTk9URTogVGhlcmUgYXJlIHBsYW5zIHRvIHJlZmFjdG9yIGFsbCByZXF1ZXN0KiBmdW5jdGlvbnMuIEV4cGVjdCBjaGFuZ2VzIGlmIHlvdSB1c2UgdGhpcyFcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHJlcXVlc3RTaG93RnBzKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNlbmRTaG93RnBzKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXF1ZXN0IGZvciBhIG5ldyBJRnJhbWUgZnJvbSB0aGUgVUUgYXBwbGljYXRpb24uXG4gICAgICogTk9URTogVGhlcmUgYXJlIHBsYW5zIHRvIHJlZmFjdG9yIGFsbCByZXF1ZXN0KiBmdW5jdGlvbnMuIEV4cGVjdCBjaGFuZ2VzIGlmIHlvdSB1c2UgdGhpcyFcbiAgICAgKiBAcmV0dXJuc1xuICAgICAqL1xuICAgIHJlcXVlc3RJZnJhbWUoKSB7XG4gICAgICAgIGlmICghdGhpcy5fd2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2VuZElmcmFtZVJlcXVlc3QoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgZGF0YSB0byBVRSBhcHBsaWNhdGlvbi4gVGhlIGRhdGEgd2lsbCBiZSBydW4gdGhyb3VnaCBKU09OLnN0cmluZ2lmeSgpIHNvIGUuZy4gc3RyaW5nc1xuICAgICAqIGFuZCBhbnkgc2VyaWFsaXphYmxlIHBsYWluIEpTT04gb2JqZWN0cyB3aXRoIG5vIHJlY3VycmVuY2UgY2FuIGJlIHNlbnQuXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBzdWNjZWVkZWQsIGZhbHNlIGlmIHJlamVjdGVkXG4gICAgICovXG4gICAgZW1pdFVJSW50ZXJhY3Rpb24oZGVzY3JpcHRvcikge1xuICAgICAgICBpZiAoIXRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIudmlkZW9QbGF5ZXIuaXNWaWRlb1JlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLmVtaXRVSUludGVyYWN0aW9uKGRlc2NyaXB0b3IpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIGNvbW1hbmQgdG8gVUUgYXBwbGljYXRpb24uIEJsb2NrcyBDb25zb2xlQ29tbWFuZCBkZXNjcmlwdG9ycyB1bmxlc3MgVUVcbiAgICAgKiBoYXMgc2lnbmFsZWQgdGhhdCBpdCBhbGxvd3MgY29uc29sZSBjb21tYW5kcy5cbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHN1Y2NlZWRlZCwgZmFsc2UgaWYgcmVqZWN0ZWRcbiAgICAgKi9cbiAgICBlbWl0Q29tbWFuZChkZXNjcmlwdG9yKSB7XG4gICAgICAgIGlmICghdGhpcy5fd2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5hbGxvd0NvbnNvbGVDb21tYW5kcyAmJiAnQ29uc29sZUNvbW1hbmQnIGluIGRlc2NyaXB0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLmVtaXRDb21tYW5kKGRlc2NyaXB0b3IpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIGNvbnNvbGUgY29tbWFuZCB0byBVRSBhcHBsaWNhdGlvbi4gT25seSBhbGxvd2VkIGlmIFVFIGhhcyBzaWduYWxlZCB0aGF0IGl0IGFsbG93c1xuICAgICAqIGNvbnNvbGUgY29tbWFuZHMuXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBzdWNjZWVkZWQsIGZhbHNlIGlmIHJlamVjdGVkXG4gICAgICovXG4gICAgZW1pdENvbnNvbGVDb21tYW5kKGNvbW1hbmQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmFsbG93Q29uc29sZUNvbW1hbmRzIHx8ICF0aGlzLl93ZWJSdGNDb250cm9sbGVyLnZpZGVvUGxheWVyLmlzVmlkZW9SZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5lbWl0Q29uc29sZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB0ZXh0IGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBVRSB0ZXh0IGJveCB3aWRnZXQuXG4gICAgICogQHBhcmFtIGNvbnRlbnRzIFRoZSBuZXcgY29udGVudHMgb2YgdGhlIFVFIHRleHQgYm94LlxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG1lc3NhZ2UgY291bGQgYmUgc2VudC5cbiAgICAgKi9cbiAgICBzZW5kVGV4dGJveEVudHJ5KGNvbnRlbnRzKSB7XG4gICAgICAgIGlmICghdGhpcy5fd2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci5pc1ZpZGVvUmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2VuZFRleHRib3hFbnRyeShjb250ZW50cyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBVRSAtPiBicm93c2VyIHJlc3BvbnNlIGV2ZW50IGxpc3RlbmVyXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVzcG9uc2UgaGFuZGxlclxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciAtIFRoZSBtZXRob2QgdG8gYmUgYWN0aXZhdGVkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkXG4gICAgICovXG4gICAgYWRkUmVzcG9uc2VFdmVudExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIucmVzcG9uc2VDb250cm9sbGVyLmFkZFJlc3BvbnNlRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIFVFIC0+IGJyb3dzZXIgcmVzcG9uc2UgZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSByZXNwb25zZSBoYW5kbGVyXG4gICAgICovXG4gICAgcmVtb3ZlUmVzcG9uc2VFdmVudExpc3RlbmVyKG5hbWUpIHtcbiAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5yZXNwb25zZUNvbnRyb2xsZXIucmVtb3ZlUmVzcG9uc2VFdmVudExpc3RlbmVyKG5hbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIG5ldyBldmVudC5cbiAgICAgKiBAcGFyYW0gZSBldmVudFxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgZGlzcGF0Y2hFdmVudChlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudEVtaXR0ZXIuZGlzcGF0Y2hFdmVudChlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYW4gZXZlbnQgaGFuZGxlci5cbiAgICAgKiBAcGFyYW0gdHlwZSBldmVudCBuYW1lXG4gICAgICogQHBhcmFtIGxpc3RlbmVyIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50RW1pdHRlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFuIGV2ZW50IGhhbmRsZXIuXG4gICAgICogQHBhcmFtIHR5cGUgZXZlbnQgbmFtZVxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciBldmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICovXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9ldmVudEVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuYWJsZS9kaXNhYmxlIFhSIG1vZGUuXG4gICAgICovXG4gICAgdG9nZ2xlWFIoKSB7XG4gICAgICAgIHRoaXMud2ViWHJDb250cm9sbGVyLnhyQ2xpY2tlZCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXNzIGluIGEgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSBzaWduYWxsaW5nIHNlcnZlciBVUkwuXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgaWYgeW91IG5lZWQgdG8gcHJvZ3JhbW1hdGljYWxseSBjb25zdHJ1Y3QgeW91ciBzaWduYWxsaW5nIHNlcnZlciBVUkwuXG4gICAgICogQHBhcmFtIHNpZ25hbGxpbmdVcmxCdWlsZGVyRnVuYyBBIGZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIGEgc2lnbmFsbGluZyBzZXJ2ZXIgdXJsLlxuICAgICAqL1xuICAgIHNldFNpZ25hbGxpbmdVcmxCdWlsZGVyKHNpZ25hbGxpbmdVcmxCdWlsZGVyRnVuYykge1xuICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnNpZ25hbGxpbmdVcmxCdWlsZGVyID0gc2lnbmFsbGluZ1VybEJ1aWxkZXJGdW5jO1xuICAgIH1cbiAgICBnZXQgd2ViUnRjQ29udHJvbGxlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFB1YmxpYyBnZXR0ZXIgZm9yIHRoZSB3ZWJzb2NrZXQgY29udHJvbGxlci4gQWNjZXNzIHRvIHRoaXMgcHJvcGVydHkgYWxsb3dzIHlvdSB0byBzZW5kXG4gICAgICogY3VzdG9tIHdlYnNvY2tldCBtZXNzYWdlcy5cbiAgICAgKi9cbiAgICBnZXQgc2lnbmFsbGluZ1Byb3RvY29sKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2ViUnRjQ29udHJvbGxlci5wcm90b2NvbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHVibGljIGdldHRlciBmb3IgdGhlIHdlYlhyQ29udHJvbGxlciBjb250cm9sbGVyLiBVc2VkIGZvciBhbGwgWFIgZmVhdHVyZXMuXG4gICAgICovXG4gICAgZ2V0IHdlYlhyQ29udHJvbGxlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlYlhyQ29udHJvbGxlcjtcbiAgICB9XG4gICAgcmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihuYW1lLCBkaXJlY3Rpb24sIGhhbmRsZXIpIHtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIgJiYgdHlwZW9mIGhhbmRsZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBMb2dnZXIuV2FybmluZyhgVW5hYmxlIHRvIHJlZ2lzdGVyIGFuIHVuZGVmaW5lZCBoYW5kbGVyIGZvciAke25hbWV9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyICYmIHR5cGVvZiBoYW5kbGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhpcy5fd2ViUnRjQ29udHJvbGxlci5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGRpcmVjdGlvbiwgbmFtZSwgKGRhdGEpID0+IHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcihuYW1lLCBkYXRhKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93ZWJSdGNDb250cm9sbGVyLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoZGlyZWN0aW9uLCBuYW1lLCAoZGF0YSkgPT4gaGFuZGxlcihkYXRhKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IHRvU3RyZWFtZXJIYW5kbGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzO1xuICAgIH1cbiAgICBpc1JlY29ubmVjdGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlYlJ0Y0NvbnRyb2xsZXIuaXNSZWNvbm5lY3Rpbmc7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGl4ZWxTdHJlYW1pbmcuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmV4cG9ydCBjbGFzcyBSZXNwb25zZUNvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnJlc3BvbnNlRXZlbnRMaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIHJlc3BvbnNlIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSByZXNwb25zZSBtYXBcbiAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSByZXNwb25zZVxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciAtIFRoZSBtZXRob2QgdG8gYmUgYWN0aXZhdGVkIHdoZW4gdGhlIHJlc3BvbnNlIGlzIHNlbGVjdGVkXG4gICAgICovXG4gICAgYWRkUmVzcG9uc2VFdmVudExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2VFdmVudExpc3RlbmVycy5zZXQobmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSByZXNwb25zZSBldmVudCBsaXN0ZW5lciB0byB0aGUgcmVzcG9uc2UgbWFwXG4gICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVSZXNwb25zZUV2ZW50TGlzdGVuZXIobmFtZSkge1xuICAgICAgICB0aGlzLnJlc3BvbnNlRXZlbnRMaXN0ZW5lcnMuZGVsZXRlKG5hbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgYSByZXNwb25zZSB3aGVuIHJlY2VpdmluZyBvbmUgZm9ybSB0aGUgc3RyZWFtZXJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSAtIERhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YSBjaGFubmVsIHdpdGggdGhlIGNvbW1hbmQgaW4gcXVlc3Rpb25cbiAgICAgKi9cbiAgICBvblJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGFDaGFubmVsUmVjZWl2ZU1lc3NhZ2VUeXBlLlJlc3BvbnNlJyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTE2JykuZGVjb2RlKG1lc3NhZ2Uuc2xpY2UoMSkpO1xuICAgICAgICBMb2dnZXIuSW5mbyhyZXNwb25zZXMpO1xuICAgICAgICB0aGlzLnJlc3BvbnNlRXZlbnRMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKHJlc3BvbnNlcyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVJlc3BvbnNlQ29udHJvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuZXhwb3J0IGNsYXNzIFNlbmRNZXNzYWdlQ29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGRhdGFDaGFubmVsU2VuZGVyIC0gRGF0YSBjaGFubmVsIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHRvU3RyZWFtZXJNZXNzYWdlc01hcFByb3ZpZGVyIC0gU3RyZWFtIE1lc3NhZ2VzIGluc3RhbmNlXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoZGF0YUNoYW5uZWxTZW5kZXIsIHRvU3RyZWFtZXJNZXNzYWdlc01hcFByb3ZpZGVyKSB7XG4gICAgICAgIHRoaXMuZGF0YUNoYW5uZWxTZW5kZXIgPSBkYXRhQ2hhbm5lbFNlbmRlcjtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXNNYXBQcm92aWRlciA9IHRvU3RyZWFtZXJNZXNzYWdlc01hcFByb3ZpZGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgc3RyZWFtZXIgdGhyb3VnaCB0aGUgZGF0YSBjaGFubmVsXG4gICAgICogQHBhcmFtIG1lc3NhZ2VUeXBlIC0gdGhlIHR5cGUgb2YgbWVzc2FnZSB3ZSBhcmUgc2VuZGluZ1xuICAgICAqIEBwYXJhbSBtZXNzYWdlRGF0YSAtIHRoZSBtZXNzYWdlIGRhdGEgd2UgYXJlIHNlbmRpbmcgb3ZlciB0aGUgZGF0YSBjaGFubmVsXG4gICAgICogQHJldHVybnMgLSBuaWxcbiAgICAgKi9cbiAgICBzZW5kTWVzc2FnZVRvU3RyZWFtZXIobWVzc2FnZVR5cGUsIG1lc3NhZ2VEYXRhKSB7XG4gICAgICAgIGlmIChtZXNzYWdlRGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBtZXNzYWdlRGF0YSA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvU3RyZWFtZXJNZXNzYWdlcyA9IHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzTWFwUHJvdmlkZXIudG9TdHJlYW1lck1lc3NhZ2VzO1xuICAgICAgICBjb25zdCBtZXNzYWdlRm9ybWF0ID0gdG9TdHJlYW1lck1lc3NhZ2VzLmdldChtZXNzYWdlVHlwZSk7XG4gICAgICAgIGlmIChtZXNzYWdlRm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcihgQXR0ZW1wdGVkIHRvIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSBzdHJlYW1lciB3aXRoIG1lc3NhZ2UgdHlwZTogJHttZXNzYWdlVHlwZX0sIGJ1dCB0aGUgZnJvbnRlbmQgaGFzbid0IGJlZW4gY29uZmlndXJlZCB0byBzZW5kIHN1Y2ggYSBtZXNzYWdlLiBDaGVjayB5b3UndmUgYWRkZWQgdGhlIG1lc3NhZ2UgdHlwZSBpbiB5b3VyIGNwcGApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXNzYWdlRm9ybWF0LnN0cnVjdHVyZSAmJiBtZXNzYWdlRGF0YSAmJiBtZXNzYWdlRm9ybWF0LnN0cnVjdHVyZS5sZW5ndGggIT09IG1lc3NhZ2VEYXRhLmxlbmd0aCkge1xuICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBQcm92aWRlZCBtZXNzYWdlIGRhdGEgZG9lc24ndCBtYXRjaCBleHBlY3RlZCBsYXlvdXQuIEV4cGVjdGVkIFsgJHttZXNzYWdlRm9ybWF0LnN0cnVjdHVyZVxuICAgICAgICAgICAgICAgIC5tYXAoKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAndWludDgnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICd1aW50MTYnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdpbnQxNic6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZG91YmxlJzpcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50b1N0cmluZygpfSBdIGJ1dCByZWNlaXZlZCBbICR7bWVzc2FnZURhdGEubWFwKChlbGVtZW50KSA9PiB0eXBlb2YgZWxlbWVudCkudG9TdHJpbmcoKX0gXWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBieXRlTGVuZ3RoID0gMDtcbiAgICAgICAgY29uc3QgdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICAgICAgLy8gT25lIGxvb3AgdG8gY2FsY3VsYXRlIHRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgYWxsIG9mIHRoZSBwcm92aWRlZCBkYXRhXG4gICAgICAgIG1lc3NhZ2VEYXRhLmZvckVhY2goKGVsZW1lbnQsIGlkeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IG1lc3NhZ2VGb3JtYXQuc3RydWN0dXJlW2lkeF07XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd1aW50OCc6XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGggKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndWludDE2JzpcbiAgICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aCArPSAyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdpbnQxNic6XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGggKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZmxvYXQnOlxuICAgICAgICAgICAgICAgICAgICBieXRlTGVuZ3RoICs9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGggKz0gODtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gMiBieXRlcyBmb3Igc3RyaW5nIGxlbmd0aFxuICAgICAgICAgICAgICAgICAgICBieXRlTGVuZ3RoICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIC8vIDIgYnl0ZXMgcGVyIGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aCArPSAyICogdGV4dEVuY29kZXIuZW5jb2RlKGVsZW1lbnQpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkYXRhID0gbmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcihieXRlTGVuZ3RoICsgMSkpO1xuICAgICAgICBkYXRhLnNldFVpbnQ4KDAsIG1lc3NhZ2VGb3JtYXQuaWQpO1xuICAgICAgICBsZXQgYnl0ZU9mZnNldCA9IDE7XG4gICAgICAgIG1lc3NhZ2VEYXRhLmZvckVhY2goKGVsZW1lbnQsIGlkeCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IG1lc3NhZ2VGb3JtYXQuc3RydWN0dXJlW2lkeF07XG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd1aW50OCc6XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0VWludDgoYnl0ZU9mZnNldCwgZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVPZmZzZXQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndWludDE2JzpcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXRVaW50MTYoYnl0ZU9mZnNldCwgZWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVPZmZzZXQgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaW50MTYnOlxuICAgICAgICAgICAgICAgICAgICBkYXRhLnNldEludDE2KGJ5dGVPZmZzZXQsIGVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBieXRlT2Zmc2V0ICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Zsb2F0JzpcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXRGbG9hdDMyKGJ5dGVPZmZzZXQsIGVsZW1lbnQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBieXRlT2Zmc2V0ICs9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0RmxvYXQ2NChieXRlT2Zmc2V0LCBlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZU9mZnNldCArPSA4O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICAgICAgICAgICAgICBkYXRhLnNldFVpbnQxNihieXRlT2Zmc2V0LCBlbGVtZW50Lmxlbmd0aCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJ5dGVPZmZzZXQgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnNldFVpbnQxNihieXRlT2Zmc2V0LCBlbGVtZW50LmNoYXJDb2RlQXQoaSksIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZU9mZnNldCArPSAyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF0aGlzLmRhdGFDaGFubmVsU2VuZGVyLmNhblNlbmQoKSkge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oYERhdGEgY2hhbm5lbCBjYW5ub3Qgc2VuZCB5ZXQsIHNraXBwaW5nIHNlbmRpbmcgbWVzc2FnZTogJHttZXNzYWdlVHlwZX0gLSAke25ldyBVaW50OEFycmF5KGRhdGEuYnVmZmVyKX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFDaGFubmVsU2VuZGVyLnNlbmREYXRhKGRhdGEuYnVmZmVyKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZW5kTWVzc2FnZUNvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmV4cG9ydCBjbGFzcyBUb1N0cmVhbWVyTWVzc2FnZSB7XG59XG5leHBvcnQgY2xhc3MgU3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMgPSBuZXcgTWFwKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBvcHVsYXRlIHRoZSBEZWZhdWx0IG1lc3NhZ2UgcHJvdG9jb2xcbiAgICAgKi9cbiAgICBwb3B1bGF0ZURlZmF1bHRQcm90b2NvbCgpIHtcbiAgICAgICAgLypcbiAgICAgICAgICogQ29udHJvbCBNZXNzYWdlcy4gUmFuZ2UgPSAwLi40OS5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnSUZyYW1lUmVxdWVzdCcsIHtcbiAgICAgICAgICAgIGlkOiAwLFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdSZXF1ZXN0UXVhbGl0eUNvbnRyb2wnLCB7XG4gICAgICAgICAgICBpZDogMSxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnRnBzUmVxdWVzdCcsIHtcbiAgICAgICAgICAgIGlkOiAyLFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdBdmVyYWdlQml0cmF0ZVJlcXVlc3QnLCB7XG4gICAgICAgICAgICBpZDogMyxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnU3RhcnRTdHJlYW1pbmcnLCB7XG4gICAgICAgICAgICBpZDogNCxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnU3RvcFN0cmVhbWluZycsIHtcbiAgICAgICAgICAgIGlkOiA1LFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdMYXRlbmN5VGVzdCcsIHtcbiAgICAgICAgICAgIGlkOiA2LFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3N0cmluZyddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ1JlcXVlc3RJbml0aWFsU2V0dGluZ3MnLCB7XG4gICAgICAgICAgICBpZDogNyxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnVGVzdEVjaG8nLCB7XG4gICAgICAgICAgICBpZDogOCxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogW11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnRGF0YUNoYW5uZWxMYXRlbmN5VGVzdCcsIHtcbiAgICAgICAgICAgIGlkOiA5LFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbXVxuICAgICAgICB9KTtcbiAgICAgICAgLypcbiAgICAgICAgICogSW5wdXQgTWVzc2FnZXMuIFJhbmdlID0gNTAuLjg5LlxuICAgICAgICAgKi9cbiAgICAgICAgLy8gR2VuZXJpYyBJbnB1dCBNZXNzYWdlcy4gUmFuZ2UgPSA1MC4uNTkuXG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnVUlJbnRlcmFjdGlvbicsIHtcbiAgICAgICAgICAgIGlkOiA1MCxcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWydzdHJpbmcnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdDb21tYW5kJywge1xuICAgICAgICAgICAgaWQ6IDUxLFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3N0cmluZyddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ1RleHRib3hFbnRyeScsIHtcbiAgICAgICAgICAgIGlkOiA1MixcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWydzdHJpbmcnXVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gS2V5Ym9hcmQgSW5wdXQgTWVzc2FnZS4gUmFuZ2UgPSA2MC4uNjkuXG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnS2V5RG93bicsIHtcbiAgICAgICAgICAgIGlkOiA2MCxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAga2V5Q29kZSAgaXNSZXBlYXRcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWyd1aW50OCcsICd1aW50OCddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ0tleVVwJywge1xuICAgICAgICAgICAgaWQ6IDYxLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICBrZXlDb2RlXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDgnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdLZXlQcmVzcycsIHtcbiAgICAgICAgICAgIGlkOiA2MixcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgY2hhcmNvZGVcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWyd1aW50MTYnXVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gTW91c2UgSW5wdXQgTWVzc2FnZXMuIFJhbmdlID0gNzAuLjc5LlxuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ01vdXNlRW50ZXInLCB7XG4gICAgICAgICAgICBpZDogNzAsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ01vdXNlTGVhdmUnLCB7XG4gICAgICAgICAgICBpZDogNzEsXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFtdXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ01vdXNlRG93bicsIHtcbiAgICAgICAgICAgIGlkOiA3MixcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICBidXR0b24gICAgIHggICAgICAgICB5XG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDgnLCAndWludDE2JywgJ3VpbnQxNiddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ01vdXNlVXAnLCB7XG4gICAgICAgICAgICBpZDogNzMsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgYnV0dG9uICAgICB4ICAgICAgICAgeVxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3VpbnQ4JywgJ3VpbnQxNicsICd1aW50MTYnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdNb3VzZU1vdmUnLCB7XG4gICAgICAgICAgICBpZDogNzQsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgeCAgICAgICAgICAgeSAgICAgIGRlbHRhWCAgICBkZWx0YVlcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWyd1aW50MTYnLCAndWludDE2JywgJ2ludDE2JywgJ2ludDE2J11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnTW91c2VXaGVlbCcsIHtcbiAgICAgICAgICAgIGlkOiA3NSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICBkZWx0YSAgICAgICB4ICAgICAgICB5XG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsnaW50MTYnLCAndWludDE2JywgJ3VpbnQxNiddXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRvU3RyZWFtZXJNZXNzYWdlcy5zZXQoJ01vdXNlRG91YmxlJywge1xuICAgICAgICAgICAgaWQ6IDc2LFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgIGJ1dHRvbiAgICAgeCAgICAgICAgIHlcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWyd1aW50OCcsICd1aW50MTYnLCAndWludDE2J11cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIFRvdWNoIElucHV0IE1lc3NhZ2VzLiBSYW5nZSA9IDgwLi44OS5cbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdUb3VjaFN0YXJ0Jywge1xuICAgICAgICAgICAgaWQ6IDgwLFxuICAgICAgICAgICAgLy8gICAgICAgICAgbnVtdG91Y2hlcygxKSAgIHggICAgICAgeSAgICAgICAgaWR4ICAgICBmb3JjZSAgICAgdmFsaWRcbiAgICAgICAgICAgIHN0cnVjdHVyZTogWyd1aW50OCcsICd1aW50MTYnLCAndWludDE2JywgJ3VpbnQ4JywgJ3VpbnQ4JywgJ3VpbnQ4J11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnVG91Y2hFbmQnLCB7XG4gICAgICAgICAgICBpZDogODEsXG4gICAgICAgICAgICAvLyAgICAgICAgICBudW10b3VjaGVzKDEpICAgeCAgICAgICB5ICAgICAgICBpZHggICAgIGZvcmNlICAgICB2YWxpZFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3VpbnQ4JywgJ3VpbnQxNicsICd1aW50MTYnLCAndWludDgnLCAndWludDgnLCAndWludDgnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdUb3VjaE1vdmUnLCB7XG4gICAgICAgICAgICBpZDogODIsXG4gICAgICAgICAgICAvLyAgICAgICAgICBudW10b3VjaGVzKDEpICAgeCAgICAgICB5ICAgICAgIGlkeCAgICAgIGZvcmNlICAgICB2YWxpZFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3VpbnQ4JywgJ3VpbnQxNicsICd1aW50MTYnLCAndWludDgnLCAndWludDgnLCAndWludDgnXVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gR2FtZXBhZCBJbnB1dCBNZXNzYWdlcy4gUmFuZ2UgPSA5MC4uOTlcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdHYW1lcGFkQ29ubmVjdGVkJywge1xuICAgICAgICAgICAgaWQ6IDkzLFxuICAgICAgICAgICAgc3RydWN0dXJlOiBbXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdHYW1lcGFkQnV0dG9uUHJlc3NlZCcsIHtcbiAgICAgICAgICAgIGlkOiA5MCxcbiAgICAgICAgICAgIC8vICAgICAgICAgY3RybGVySWQgICBidXR0b24gIGlzUmVwZWF0XG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDgnLCAndWludDgnLCAndWludDgnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KCdHYW1lcGFkQnV0dG9uUmVsZWFzZWQnLCB7XG4gICAgICAgICAgICBpZDogOTEsXG4gICAgICAgICAgICAvLyAgICAgICAgIGN0cmxlcklkICAgYnV0dG9uICBpc1JlcGVhdCgwKVxuICAgICAgICAgICAgc3RydWN0dXJlOiBbJ3VpbnQ4JywgJ3VpbnQ4JywgJ3VpbnQ4J11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnR2FtZXBhZEFuYWxvZycsIHtcbiAgICAgICAgICAgIGlkOiA5MixcbiAgICAgICAgICAgIC8vICAgICAgICAgY3RybGVySWQgICBidXR0b24gIGFuYWxvZ1ZhbHVlXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDgnLCAndWludDgnLCAnZG91YmxlJ11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzLnNldCgnR2FtZXBhZERpc2Nvbm5lY3RlZCcsIHtcbiAgICAgICAgICAgIGlkOiA5NCxcbiAgICAgICAgICAgIC8vICAgICAgICAgIGN0cmxlcklkXG4gICAgICAgICAgICBzdHJ1Y3R1cmU6IFsndWludDgnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoMCwgJ1F1YWxpdHlDb250cm9sT3duZXJzaGlwJyk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDEsICdSZXNwb25zZScpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldCgyLCAnQ29tbWFuZCcpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldCgzLCAnRnJlZXplRnJhbWUnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoNCwgJ1VuZnJlZXplRnJhbWUnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoNSwgJ1ZpZGVvRW5jb2RlckF2Z1FQJyk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDYsICdMYXRlbmN5VGVzdCcpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldCg3LCAnSW5pdGlhbFNldHRpbmdzJyk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDgsICdGaWxlRXh0ZW5zaW9uJyk7XG4gICAgICAgIHRoaXMuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KDksICdGaWxlTWltZVR5cGUnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoMTAsICdGaWxlQ29udGVudHMnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoMTEsICdUZXN0RWNobycpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldCgxMiwgJ0lucHV0Q29udHJvbE93bmVyc2hpcCcpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldCgxMywgJ0dhbWVwYWRSZXNwb25zZScpO1xuICAgICAgICB0aGlzLmZyb21TdHJlYW1lck1lc3NhZ2VzLnNldCgxNCwgJ0RhdGFDaGFubmVsTGF0ZW5jeVRlc3QnKTtcbiAgICAgICAgdGhpcy5mcm9tU3RyZWFtZXJNZXNzYWdlcy5zZXQoMjU1LCAnUHJvdG9jb2wnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBtZXNzYWdlIGhhbmRsZXJcbiAgICAgKiBAcGFyYW0gbWVzc2FnZURpcmVjdGlvbiAtIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG1lc3NhZ2U7IHRvU3RyZWFtZXIgb3IgZnJvbVN0cmVhbWVyXG4gICAgICogQHBhcmFtIG1lc3NhZ2VUeXBlIC0gdGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gbWVzc2FnZUhhbmRsZXIgLSB0aGUgZnVuY3Rpb24gb3IgbWV0aG9kIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhpcyBoYW5kbGVyIGlzIGNhbGxlZFxuICAgICAqL1xuICAgIHJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIobWVzc2FnZURpcmVjdGlvbiwgbWVzc2FnZVR5cGUsIG1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgIHN3aXRjaCAobWVzc2FnZURpcmVjdGlvbikge1xuICAgICAgICAgICAgY2FzZSBNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXI6XG4gICAgICAgICAgICAgICAgdGhpcy50b1N0cmVhbWVySGFuZGxlcnMuc2V0KG1lc3NhZ2VUeXBlLCBtZXNzYWdlSGFuZGxlcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyOlxuICAgICAgICAgICAgICAgIHRoaXMuZnJvbVN0cmVhbWVySGFuZGxlcnMuc2V0KG1lc3NhZ2VUeXBlLCBtZXNzYWdlSGFuZGxlcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIExvZ2dlci5JbmZvKGBVbmtub3duIG1lc3NhZ2UgZGlyZWN0aW9uICR7bWVzc2FnZURpcmVjdGlvbn1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogVGhlIGVudW0gZm9yIG1lc3NhZ2UgZGlyZWN0aW9uc1xuICovXG5leHBvcnQgdmFyIE1lc3NhZ2VEaXJlY3Rpb247XG4oZnVuY3Rpb24gKE1lc3NhZ2VEaXJlY3Rpb24pIHtcbiAgICBNZXNzYWdlRGlyZWN0aW9uW01lc3NhZ2VEaXJlY3Rpb25bXCJUb1N0cmVhbWVyXCJdID0gMF0gPSBcIlRvU3RyZWFtZXJcIjtcbiAgICBNZXNzYWdlRGlyZWN0aW9uW01lc3NhZ2VEaXJlY3Rpb25bXCJGcm9tU3RyZWFtZXJcIl0gPSAxXSA9IFwiRnJvbVN0cmVhbWVyXCI7XG59KShNZXNzYWdlRGlyZWN0aW9uIHx8IChNZXNzYWdlRGlyZWN0aW9uID0ge30pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5leHBvcnQgY2xhc3MgVG9TdHJlYW1lck1lc3NhZ2VzQ29udHJvbGxlciB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHNlbmRNZXNzYWdlQ29udHJvbGxlciAtIFN0cmVhbSBtZXNzYWdlIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihzZW5kTWVzc2FnZUNvbnRyb2xsZXIpIHtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIgPSBzZW5kTWVzc2FnZUNvbnRyb2xsZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgUmVxdWVzdCB0byBUYWtlIFF1YWxpdHkgQ29udHJvbCB0byB0aGUgVUUgSW5zdGFuY2VcbiAgICAgKi9cbiAgICBTZW5kUmVxdWVzdFF1YWxpdHlDb250cm9sKCkge1xuICAgICAgICB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1JlcXVlc3RRdWFsaXR5Q29udHJvbCcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIE1heCBGUFMgUmVxdWVzdCB0byB0aGUgVUUgSW5zdGFuY2VcbiAgICAgKi9cbiAgICBTZW5kTWF4RnBzUmVxdWVzdCgpIHtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdGcHNSZXF1ZXN0Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgQXZlcmFnZSBCaXRyYXRlIFJlcXVlc3QgdG8gdGhlIFVFIEluc3RhbmNlXG4gICAgICovXG4gICAgU2VuZEF2ZXJhZ2VCaXRyYXRlUmVxdWVzdCgpIHtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdBdmVyYWdlQml0cmF0ZVJlcXVlc3QnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIFN0YXJ0IFN0cmVhbWluZyBNZXNzYWdlIHRvIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqL1xuICAgIFNlbmRTdGFydFN0cmVhbWluZygpIHtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdTdGFydFN0cmVhbWluZycpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgU3RvcCBTdHJlYW1pbmcgTWVzc2FnZSB0byB0aGUgVUUgSW5zdGFuY2VcbiAgICAgKi9cbiAgICBTZW5kU3RvcFN0cmVhbWluZygpIHtcbiAgICAgICAgdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdTdG9wU3RyZWFtaW5nJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBSZXF1ZXN0IEluaXRpYWwgU2V0dGluZ3MgdG8gdGhlIFVFIEluc3RhbmNlXG4gICAgICovXG4gICAgU2VuZFJlcXVlc3RJbml0aWFsU2V0dGluZ3MoKSB7XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignUmVxdWVzdEluaXRpYWxTZXR0aW5ncycpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVRvU3RyZWFtZXJNZXNzYWdlc0NvbnRyb2xsZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41JztcbmV4cG9ydCBjbGFzcyBCcm93c2VyVXRpbHMge1xuICAgIHN0YXRpYyBnZXRTdXBwb3J0ZWRWaWRlb0NvZGVjcygpIHtcbiAgICAgICAgY29uc3QgYnJvd3NlclN1cHBvcnRlZENvZGVjcyA9IFtdO1xuICAgICAgICAvLyBUcnkgZ2V0IHRoZSBpbmZvIG5lZWRlZCBmcm9tIHRoZSBSVENSdHBSZWNlaXZlci4gVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBvbiBjaHJvbWVcbiAgICAgICAgaWYgKCFSVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMpIHtcbiAgICAgICAgICAgIExvZ2dlci5XYXJuaW5nKCdSVENSdHBSZWNlaXZlci5nZXRDYXBhYmlsaXRpZXMgQVBJIGlzIG5vdCBhdmFpbGFibGUgaW4geW91ciBicm93c2VyLCBkZWZhdWx0aW5nIHRvIGd1ZXNzIHRoYXQgd2Ugc3VwcG9ydCBILjI2NC4nKTtcbiAgICAgICAgICAgIGJyb3dzZXJTdXBwb3J0ZWRDb2RlY3MucHVzaCgnSDI2NCBsZXZlbC1hc3ltbWV0cnktYWxsb3dlZD0xO3BhY2tldGl6YXRpb24tbW9kZT0xO3Byb2ZpbGUtbGV2ZWwtaWQ9NDJlMDFmJyk7XG4gICAgICAgICAgICByZXR1cm4gYnJvd3NlclN1cHBvcnRlZENvZGVjcztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtYXRjaGVyID0gLyhWUFxcZHxIMjZcXGR8QVYxKS4qLztcbiAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gUlRDUnRwUmVjZWl2ZXIuZ2V0Q2FwYWJpbGl0aWVzKCd2aWRlbycpO1xuICAgICAgICBpZiAoIWNhcGFiaWxpdGllcykge1xuICAgICAgICAgICAgYnJvd3NlclN1cHBvcnRlZENvZGVjcy5wdXNoKCdIMjY0IGxldmVsLWFzeW1tZXRyeS1hbGxvd2VkPTE7cGFja2V0aXphdGlvbi1tb2RlPTE7cHJvZmlsZS1sZXZlbC1pZD00MmUwMWYnKTtcbiAgICAgICAgICAgIHJldHVybiBicm93c2VyU3VwcG9ydGVkQ29kZWNzO1xuICAgICAgICB9XG4gICAgICAgIGNhcGFiaWxpdGllcy5jb2RlY3MuZm9yRWFjaCgoY29kZWMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0ciA9IGNvZGVjLm1pbWVUeXBlLnNwbGl0KCcvJylbMV0gKyAnICcgKyAoY29kZWMuc2RwRm10cExpbmUgfHwgJycpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBtYXRjaGVyLmV4ZWMoc3RyKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGJyb3dzZXJTdXBwb3J0ZWRDb2RlY3MucHVzaChzdHIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGJyb3dzZXJTdXBwb3J0ZWRDb2RlY3M7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3NlclV0aWxzLmpzLm1hcCIsIi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gQUZLIGRpc2Nvbm5lY3QgaXMgYWJvdXQgdG8gaGFwcGVuLlxuICogQ2FuIGJlIGNhbmNlbGxlZCBieSBjYWxsaW5nIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFma1dhcm5pbmdBY3RpdmF0ZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ2Fma1dhcm5pbmdBY3RpdmF0ZScpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdGhlIEFGSyBkaXNjb25uZWN0IGNvdW50ZG93biBpcyB1cGRhdGVkLlxuICovXG5leHBvcnQgY2xhc3MgQWZrV2FybmluZ1VwZGF0ZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ2Fma1dhcm5pbmdVcGRhdGUnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIEFGSyB3YXJuaW5nIGlzIGRlYWN0aXZhdGVkLlxuICovXG5leHBvcnQgY2xhc3MgQWZrV2FybmluZ0RlYWN0aXZhdGVFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ2Fma1dhcm5pbmdEZWFjdGl2YXRlJyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiBBRksgY291bnRkb3duIHJlYWNoZXMgMCBhbmQgdGhlIHVzZXIgaXMgZGlzY29ubmVjdGVkLlxuICovXG5leHBvcnQgY2xhc3MgQWZrVGltZWRPdXRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ2Fma1RpbWVkT3V0Jyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB3ZSByZWNlaXZlIG5ldyB2aWRlbyBxdWFsaXR5IHZhbHVlLlxuICovXG5leHBvcnQgY2xhc3MgVmlkZW9FbmNvZGVyQXZnUVBFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCd2aWRlb0VuY29kZXJBdmdRUCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIGFmdGVyIGEgV2ViUnRjIGNvbm5lY3Rpb24gaGFzIGJlZW4gbmVnb3RpYXRlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlJ0Y1NkcEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignd2ViUnRjU2RwJyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgYWZ0ZXIgdGhlIFNEUCBhbnN3ZXIgaXMgc2V0LlxuICovXG5leHBvcnQgY2xhc3MgV2ViUnRjU2RwQW5zd2VyRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignd2ViUnRjU2RwQW5zd2VyJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgYWZ0ZXIgdGhlIFNEUCBvZmZlciBpcyBzZXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJSdGNTZHBPZmZlckV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3dlYlJ0Y1NkcE9mZmVyJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiBhdXRvIGNvbm5lY3RpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJSdGNBdXRvQ29ubmVjdEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignd2ViUnRjQXV0b0Nvbm5lY3QnKTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHNlbmRpbmcgYSBXZWJSdGMgb2ZmZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJSdGNDb25uZWN0aW5nRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCd3ZWJSdGNDb25uZWN0aW5nJyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiBXZWJSdGMgY29ubmVjdGlvbiBoYXMgYmVlbiBlc3RhYmxpc2hlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlJ0Y0Nvbm5lY3RlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignd2ViUnRjQ29ubmVjdGVkJyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgaWYgV2ViUnRjIGNvbm5lY3Rpb24gaGFzIGZhaWxlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYlJ0Y0ZhaWxlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignd2ViUnRjRmFpbGVkJyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgaWYgV2ViUnRjIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkLlxuICovXG5leHBvcnQgY2xhc3MgV2ViUnRjRGlzY29ubmVjdGVkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignd2ViUnRjRGlzY29ubmVjdGVkJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiBSVENEYXRhQ2hhbm5lbCBpcyBvcGVuZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhQ2hhbm5lbE9wZW5FdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdkYXRhQ2hhbm5lbE9wZW4nKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIFJUQ0RhdGFDaGFubmVsIGlzIGNsb3NlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFDaGFubmVsQ2xvc2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdkYXRhQ2hhbm5lbENsb3NlJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgb24gUlRDRGF0YUNoYW5uZWwgZXJyb3JzLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YUNoYW5uZWxFcnJvckV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ2RhdGFDaGFubmVsRXJyb3InKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHRoZSB2aWRlbyBzdHJlYW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBWaWRlb0luaXRpYWxpemVkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCd2aWRlb0luaXRpYWxpemVkJyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB2aWRlbyBzdHJlYW0gbG9hZGluZyBzdGFydHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJlYW1Mb2FkaW5nRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdzdHJlYW1Mb2FkaW5nJyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB2aWRlbyBzdHJlYW0gbG9hZGluZyBoYXMgZmluaXNoZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJlYW1QcmVDb25uZWN0RXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdzdHJlYW1Db25uZWN0Jyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB2aWRlbyBzdHJlYW0gaGFzIHN0b3BwZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJlYW1QcmVEaXNjb25uZWN0RXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdzdHJlYW1EaXNjb25uZWN0Jyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB2aWRlbyBzdHJlYW0gaXMgcmVjb25uZWN0aW5nLlxuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtUmVjb25uZWN0RXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdzdHJlYW1SZWNvbm5lY3QnKTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBpZiB0aGVyZSBhcmUgZXJyb3JzIGxvYWRpbmcgdGhlIHZpZGVvIHN0cmVhbS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsYXlTdHJlYW1FcnJvckV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3BsYXlTdHJlYW1FcnJvcicpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIGJlZm9yZSB0cnlpbmcgdG8gc3RhcnQgdmlkZW8gcGxheWJhY2suXG4gKi9cbmV4cG9ydCBjbGFzcyBQbGF5U3RyZWFtRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdwbGF5U3RyZWFtJyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgaWYgdGhlIGJyb3dzZXIgcmVqZWN0cyB2aWRlbyBwbGF5YmFjay4gQ2FuIGhhcHBlbiBmb3IgZXhhbXBsZSBpZlxuICogdmlkZW8gYXV0by1wbGF5IHdpdGhvdXQgdXNlciBpbnRlcmFjdGlvbiBpcyByZWZ1c2VkIGJ5IHRoZSBicm93c2VyLlxuICovXG5leHBvcnQgY2xhc3MgUGxheVN0cmVhbVJlamVjdGVkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcigncGxheVN0cmVhbVJlamVjdGVkJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiByZWNlaXZpbmcgYSBmdWxsIEZyZWV6ZUZyYW1lIGltYWdlIGZyb20gVUUuXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2FkRnJlZXplRnJhbWVFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdsb2FkRnJlZXplRnJhbWUnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHJlY2VpdmluZyBVbmZyZWV6ZUZyYW1lIG1lc3NhZ2UgZnJvbSBVRSBhbmQgdmlkZW8gcGxheWJhY2sgaXMgYWJvdXQgdG8gYmUgcmVzdW1lZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEhpZGVGcmVlemVGcmFtZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignaGlkZUZyZWV6ZUZyYW1lJyk7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiByZWNlaXZpbmcgV2ViUlRDIHN0YXRpc3RpY3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGF0c1JlY2VpdmVkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignc3RhdHNSZWNlaXZlZCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gc3RyZWFtZXIgbGlzdCBjaGFuZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgU3RyZWFtZXJMaXN0TWVzc2FnZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3N0cmVhbWVyTGlzdE1lc3NhZ2UnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIGEgc3Vic2NyaWJlZCB0byBzdHJlYW1lcidzIGlkIGNoYW5nZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdHJlYW1lcklEQ2hhbmdlZE1lc3NhZ2VFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdTdHJlYW1lcklEQ2hhbmdlZE1lc3NhZ2UnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHJlY2VpdmluZyBsYXRlbmN5IHRlc3QgcmVzdWx0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIExhdGVuY3lUZXN0UmVzdWx0RXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignbGF0ZW5jeVRlc3RSZXN1bHQnKTtcbiAgICAgICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB9XG59XG4vKipcbiAqIEFuIGV2ZW50IHRoYXQgaXMgZW1pdHRlZCBldmVyeXRpbWUgbGF0ZW5jeSBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSBXZWJSVEMgc3RhdHMgQVBJLlxuICovXG5leHBvcnQgY2xhc3MgTGF0ZW5jeUNhbGN1bGF0ZWRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdsYXRlbmN5Q2FsY3VsYXRlZCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gd2UgcmVjZWl2ZSB0aGUgXCJvblNjcmVlbktleWJvYXJkXCIgY29tbWFuZCBmcm9tIFVFLlxuICovXG5leHBvcnQgY2xhc3MgU2hvd09uU2NyZWVuS2V5Ym9hcmRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdzaG93T25TY3JlZW5LZXlib2FyZCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gcmVjZWl2aW5nIGRhdGEgY2hhbm5lbCBsYXRlbmN5IHRlc3QgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIuXG4gKiBUaGlzIGV2ZW50IGlzIGhhbmRsZWQgYnkgRGF0YUNoYW5uZWxMYXRlbmN5VGVzdENvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXNwb25zZUV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ2RhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXNwb25zZScpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gZGF0YSBjaGFubmVsIGxhdGVuY3kgdGVzdCByZXN1bHRzIGFyZSByZWFkeS5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXN1bHRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcihkYXRhKSB7XG4gICAgICAgIHN1cGVyKCdkYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzdWx0Jyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFN1YnNjcmliZUZhaWxlZEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3N1YnNjcmliZUZhaWxlZCcpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gcmVjZWl2aW5nIGluaXRpYWwgc2V0dGluZ3MgZnJvbSBVRS5cbiAqL1xuZXhwb3J0IGNsYXNzIEluaXRpYWxTZXR0aW5nc0V2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ2luaXRpYWxTZXR0aW5ncycpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gUGl4ZWxTdHJlYW1pbmcgc2V0dGluZ3MgY2hhbmdlLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcignc2V0dGluZ3NDaGFuZ2VkJyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBFdmVudCBlbWl0dGVkIHdoZW4gYW4gWFIgU2Vzc2lvbiBzdGFydHNcbiAqL1xuZXhwb3J0IGNsYXNzIFhyU2Vzc2lvblN0YXJ0ZWRFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ3hyU2Vzc2lvblN0YXJ0ZWQnKTtcbiAgICB9XG59XG4vKipcbiAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhbiBYUiBTZXNzaW9uIGVuZHNcbiAqL1xuZXhwb3J0IGNsYXNzIFhyU2Vzc2lvbkVuZGVkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCd4clNlc3Npb25FbmRlZCcpO1xuICAgIH1cbn1cbi8qKlxuICogRXZlbnQgZW1pdHRlZCB3aGVuIGFuIFhSIEZyYW1lIGlzIGNvbXBsZXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBYckZyYW1lRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoZGF0YSkge1xuICAgICAgICBzdXBlcigneHJGcmFtZScpO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKlxuICogQW4gZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gcmVjZWl2aW5nIGEgcGxheWVyIGNvdW50IGZyb20gdGhlIHNpZ25hbGxpbmcgc2VydmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBQbGF5ZXJDb3VudEV2ZW50IGV4dGVuZHMgRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGRhdGEpIHtcbiAgICAgICAgc3VwZXIoJ3BsYXllckNvdW50Jyk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgfVxufVxuLyoqXG4gKiBBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB0aGUgd2ViUlRDIGNvbm5lY3Rpb25zIGlzIHJlbGF5ZWQgb3ZlciBUQ1AuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJSdGNUQ1BSZWxheURldGVjdGVkRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCd3ZWJSdGNUQ1BSZWxheURldGVjdGVkJyk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFBpeGVsU3RyZWFtaW5nRXZlbnRFbWl0dGVyIGV4dGVuZHMgRXZlbnRUYXJnZXQge1xuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgbmV3IGV2ZW50LlxuICAgICAqIEBwYXJhbSBlIGV2ZW50XG4gICAgICogQHJldHVybnNcbiAgICAgKi9cbiAgICBkaXNwYXRjaEV2ZW50KGUpIHtcbiAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoRXZlbnQoZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGFuIGV2ZW50IGhhbmRsZXIuXG4gICAgICogQHBhcmFtIHR5cGUgZXZlbnQgbmFtZVxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciBldmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICovXG4gICAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgICBzdXBlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGFuIGV2ZW50IGhhbmRsZXIuXG4gICAgICogQHBhcmFtIHR5cGUgZXZlbnQgbmFtZVxuICAgICAqIEBwYXJhbSBsaXN0ZW5lciBldmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICovXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgICBzdXBlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FdmVudEVtaXR0ZXIuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41Jztcbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcG9wdWxhdGUgZmlsZSBpbmZvcm1hdGlvbiBmcm9tIGJ5dGUgYnVmZmVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEZpbGVVdGlsIHtcbiAgICAvKipcbiAgICAgKiBQcm9jZXNzZXMgYSBmaWxlcyBleHRlbnNpb24gd2hlbiByZWNlaXZlZCBvdmVyIGRhdGEgY2hhbm5lbFxuICAgICAqIEBwYXJhbSB2aWV3IC0gdGhlIGZpbGUgZXh0ZW5zaW9uIGRhdGFcbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0RXh0ZW5zaW9uRnJvbUJ5dGVzKHZpZXcsIGZpbGUpIHtcbiAgICAgICAgLy8gUmVzZXQgZmlsZSBpZiB3ZSBnb3QgYSBmaWxlIG1lc3NhZ2UgYW5kIHdlIGFyZSBub3QgXCJyZWNlaXZpbmdcIiBpdCB5ZXRcbiAgICAgICAgaWYgKCFmaWxlLnJlY2VpdmluZykge1xuICAgICAgICAgICAgZmlsZS5taW1ldHlwZSA9ICcnO1xuICAgICAgICAgICAgZmlsZS5leHRlbnNpb24gPSAnJztcbiAgICAgICAgICAgIGZpbGUucmVjZWl2aW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIGZpbGUudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZpbGUuY2h1bmtzID0gMDtcbiAgICAgICAgICAgIGZpbGUuZGF0YSA9IFtdO1xuICAgICAgICAgICAgZmlsZS50aW1lc3RhbXBTdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ1JlY2VpdmVkIGZpcnN0IGNodW5rIG9mIGZpbGUnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleHRlbnNpb25Bc1N0cmluZyA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTE2JykuZGVjb2RlKHZpZXcuc2xpY2UoMSkpO1xuICAgICAgICBMb2dnZXIuSW5mbyhleHRlbnNpb25Bc1N0cmluZyk7XG4gICAgICAgIGZpbGUuZXh0ZW5zaW9uID0gZXh0ZW5zaW9uQXNTdHJpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhIGZpbGVzIG1pbWUgdHlwZSB3aGVuIHJlY2VpdmVkIG92ZXIgZGF0YSBjaGFubmVsXG4gICAgICogQHBhcmFtIHZpZXcgLSB0aGUgZmlsZSBtaW1lIHR5cGUgZGF0YVxuICAgICAqL1xuICAgIHN0YXRpYyBzZXRNaW1lVHlwZUZyb21CeXRlcyh2aWV3LCBmaWxlKSB7XG4gICAgICAgIC8vIFJlc2V0IGZpbGUgaWYgd2UgZ290IGEgZmlsZSBtZXNzYWdlIGFuZCB3ZSBhcmUgbm90IFwicmVjZWl2aW5nXCIgaXQgeWV0XG4gICAgICAgIGlmICghZmlsZS5yZWNlaXZpbmcpIHtcbiAgICAgICAgICAgIGZpbGUubWltZXR5cGUgPSAnJztcbiAgICAgICAgICAgIGZpbGUuZXh0ZW5zaW9uID0gJyc7XG4gICAgICAgICAgICBmaWxlLnJlY2VpdmluZyA9IHRydWU7XG4gICAgICAgICAgICBmaWxlLnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICBmaWxlLmNodW5rcyA9IDA7XG4gICAgICAgICAgICBmaWxlLmRhdGEgPSBbXTtcbiAgICAgICAgICAgIGZpbGUudGltZXN0YW1wU3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdSZWNlaXZlZCBmaXJzdCBjaHVuayBvZiBmaWxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWltZUFzU3RyaW5nID0gbmV3IFRleHREZWNvZGVyKCd1dGYtMTYnKS5kZWNvZGUodmlldy5zbGljZSgxKSk7XG4gICAgICAgIExvZ2dlci5JbmZvKG1pbWVBc1N0cmluZyk7XG4gICAgICAgIGZpbGUubWltZXR5cGUgPSBtaW1lQXNTdHJpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2Nlc3NlcyBhIGZpbGVzIGNvbnRlbnRzIHdoZW4gcmVjZWl2ZWQgb3ZlciBkYXRhIGNoYW5uZWxcbiAgICAgKiBAcGFyYW0gdmlldyAtIHRoZSBmaWxlIGNvbnRlbnRzIGRhdGFcbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0Q29udGVudHNGcm9tQnl0ZXModmlldywgZmlsZSkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHJlY2VpdmVkIHRoZSBpbml0aWFsIHNldHVwIGluc3RydWN0aW9ucywgcmV0dXJuXG4gICAgICAgIGlmICghZmlsZS5yZWNlaXZpbmcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IHR5cGVTaXplID0gMTtcbiAgICAgICAgY29uc3QgaW50U2l6ZSA9IDQ7XG4gICAgICAgIGNvbnN0IG1heE1lc3NhZ2VTaXplID0gMTYgKiAxMDI0O1xuICAgICAgICBjb25zdCBoZWFkZXJTaXplID0gdHlwZVNpemUgKyBpbnRTaXplO1xuICAgICAgICBjb25zdCBtYXhQYXlsb2FkU2l6ZSA9IG1heE1lc3NhZ2VTaXplIC0gaGVhZGVyU2l6ZTtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRvdGFsIG51bWJlciBvZiBjaHVua3MgZnJvbSB0aGUgdG90YWwgZmlsZSBzaXplXG4gICAgICAgIGZpbGUuY2h1bmtzID0gTWF0aC5jZWlsKG5ldyBEYXRhVmlldyh2aWV3LnNsaWNlKHR5cGVTaXplLCBoZWFkZXJTaXplKS5idWZmZXIpLmdldEludDMyKDAsIHRydWUpIC8gbWF4UGF5bG9hZFNpemUpO1xuICAgICAgICAvLyBHZXQgdGhlIGZpbGUgcGFydCBvZiB0aGUgcGF5bG9hZFxuICAgICAgICBjb25zdCBmaWxlQnl0ZXMgPSB2aWV3LnNsaWNlKGhlYWRlclNpemUpO1xuICAgICAgICAvLyBBcHBlbmQgdG8gZXhpc3RpbmcgZGF0YSB0aGF0IGhvbGRzIHRoZSBmaWxlXG4gICAgICAgIGZpbGUuZGF0YS5wdXNoKGZpbGVCeXRlcyk7XG4gICAgICAgIC8vIFVuY29tbWVudCBmb3IgZGVidWdcbiAgICAgICAgTG9nZ2VyLkluZm8oYFJlY2VpdmVkIGZpbGUgY2h1bms6ICR7ZmlsZS5kYXRhLmxlbmd0aH0vJHtmaWxlLmNodW5rc31gKTtcbiAgICAgICAgaWYgKGZpbGUuZGF0YS5sZW5ndGggPT09IGZpbGUuY2h1bmtzKSB7XG4gICAgICAgICAgICBmaWxlLnJlY2VpdmluZyA9IGZhbHNlO1xuICAgICAgICAgICAgZmlsZS52YWxpZCA9IHRydWU7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnUmVjZWl2ZWQgY29tcGxldGUgZmlsZScpO1xuICAgICAgICAgICAgY29uc3QgdHJhbnNmZXJEdXJhdGlvbiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gZmlsZS50aW1lc3RhbXBTdGFydDtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZmVyQml0cmF0ZSA9IE1hdGgucm91bmQoKGZpbGUuY2h1bmtzICogbWF4TWVzc2FnZVNpemUpIC8gdHJhbnNmZXJEdXJhdGlvbik7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbyhgQXZlcmFnZSB0cmFuc2ZlciBiaXRyYXRlOiAke3RyYW5zZmVyQml0cmF0ZX1rYi9zIG92ZXIgJHt0cmFuc2ZlckR1cmF0aW9uIC8gMTAwMH0gc2Vjb25kc2ApO1xuICAgICAgICAgICAgLy8gRmlsZSByZWNvbnN0cnVjdGlvblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBFeGFtcGxlIGNvZGUgdG8gcmVjb25zdHJ1Y3QgdGhlIGZpbGVcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBUaGlzIGNvZGUgcmVjb25zdHJ1Y3RzIHRoZSByZWNlaXZlZCBkYXRhIGludG8gdGhlIG9yaWdpbmFsIGZpbGUgYmFzZWQgb24gdGhlIG1pbWUgdHlwZSBhbmQgZXh0ZW5zaW9uIHByb3ZpZGVkIGFuZCB0aGVuIGRvd25sb2FkcyB0aGUgcmVjb25zdHJ1Y3RlZCBmaWxlXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGNvbnN0IHJlY2VpdmVkID0gbmV3IEJsb2IoZmlsZS5kYXRhLCB7IHR5cGU6IGZpbGUubWltZXR5cGUgfSk7XG4gICAgICAgICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgYS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBVUkwuY3JlYXRlT2JqZWN0VVJMKHJlY2VpdmVkKSk7XG4gICAgICAgICAgICBhLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBgdHJhbnNmZXIuJHtmaWxlLmV4dGVuc2lvbn1gKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKGEpO1xuICAgICAgICAgICAgLy8gaWYgeW91IGFyZSBzbyBpbmNsaW5lZCB0byBtYWtlIGl0IGF1dG8tZG93bmxvYWQsIGRvIHNvbWV0aGluZyBsaWtlOiBhLmNsaWNrKCk7XG4gICAgICAgICAgICBhLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGZpbGUuZGF0YS5sZW5ndGggPiBmaWxlLmNodW5rcykge1xuICAgICAgICAgICAgZmlsZS5yZWNlaXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIExvZ2dlci5FcnJvcihgUmVjZWl2ZWQgYmlnZ2VyIGZpbGUgdGhhbiBhZHZlcnRpc2VkOiAke2ZpbGUuZGF0YS5sZW5ndGh9LyR7ZmlsZS5jaHVua3N9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEEgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgdGVtcGxhdGUgZm9yIGEgZG93bmxvYWRlZCBmaWxlXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWxlVGVtcGxhdGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLm1pbWV0eXBlID0gJyc7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uID0gJyc7XG4gICAgICAgIHRoaXMucmVjZWl2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2h1bmtzID0gMDtcbiAgICAgICAgdGhpcy5kYXRhID0gW107XG4gICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GaWxlVXRpbC5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBBIGNhc2UgaW5zZW5zaXRpdmUsIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgVVJMU2VhcmNoUGFyYW1zXG4gKi9cbmV4cG9ydCBjbGFzcyBJVVJMU2VhcmNoUGFyYW1zIHtcbiAgICBjb25zdHJ1Y3RvcihzZWFyY2gpIHtcbiAgICAgICAgdGhpcy5fdXJsUGFyYW1zID0ge307XG4gICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoc2VhcmNoKTtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIHVybFBhcmFtcykge1xuICAgICAgICAgICAgdGhpcy5fdXJsUGFyYW1zW25hbWUudG9Mb3dlckNhc2UoKV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYXMobmFtZSkge1xuICAgICAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpIGluIHRoaXMuX3VybFBhcmFtcztcbiAgICB9XG4gICAgZ2V0KG5hbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdXJsUGFyYW1zW25hbWUudG9Mb3dlckNhc2UoKV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SVVSTFNlYXJjaFBhcmFtcy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBDb252ZXJ0cyBjb29yZGluYXRlcyBmcm9tIGVsZW1lbnQgcmVsYXRpdmUgY29vcmRpbmF0ZXMgdG8gdmFsdWVzIG5vcm1hbGl6ZWQgd2l0aGluIHRoZSB2YWx1ZSByYW5nZSBvZiBhIHNob3J0IChhbmQgYmFjayBhZ2FpbilcbiAqL1xuZXhwb3J0IGNsYXNzIElucHV0Q29vcmRUcmFuc2xhdG9yIHtcbiAgICAvLyB3ZSBkb250IHVzZSBhIGNvbnN0cnVjdG9yIGhlcmUgYmVjYXVzZSB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQgYW5kIHBhc3NlZCBhcm91bmQgdG8gdmFyaW91cyBsb2NhdGlvbnNcbiAgICAvLyBwb3NzaWJseSBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLlxuICAgIHJlY29uZmlndXJlKHBsYXllclNpemUsIHZpZGVvU2l6ZSkge1xuICAgICAgICBjb25zdCBwbGF5ZXJBc3BlY3RSYXRpbyA9IHBsYXllclNpemUuaGVpZ2h0IC8gcGxheWVyU2l6ZS53aWR0aDtcbiAgICAgICAgY29uc3QgdmlkZW9Bc3BlY3RSYXRpbyA9IHZpZGVvU2l6ZS5oZWlnaHQgLyB2aWRlb1NpemUud2lkdGg7XG4gICAgICAgIHRoaXMucGxheWVySXNMYXJnZXIgPSBwbGF5ZXJBc3BlY3RSYXRpbyA+IHZpZGVvQXNwZWN0UmF0aW87XG4gICAgICAgIHRoaXMucGxheWVyU2l6ZSA9IHBsYXllclNpemU7XG4gICAgICAgIHRoaXMucmF0aW8gPSB0aGlzLnBsYXllcklzTGFyZ2VyXG4gICAgICAgICAgICA/IHBsYXllckFzcGVjdFJhdGlvIC8gdmlkZW9Bc3BlY3RSYXRpb1xuICAgICAgICAgICAgOiB2aWRlb0FzcGVjdFJhdGlvIC8gcGxheWVyQXNwZWN0UmF0aW87XG4gICAgfVxuICAgIHRyYW5zbGF0ZVVuc2lnbmVkKHgsIHkpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFggPSB0aGlzLnBsYXllcklzTGFyZ2VyXG4gICAgICAgICAgICA/IHggLyB0aGlzLnBsYXllclNpemUud2lkdGhcbiAgICAgICAgICAgIDogdGhpcy5yYXRpbyAqICh4IC8gdGhpcy5wbGF5ZXJTaXplLndpZHRoIC0gMC41KSArIDAuNTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFkgPSB0aGlzLnBsYXllcklzTGFyZ2VyXG4gICAgICAgICAgICA/IHRoaXMucmF0aW8gKiAoeSAvIHRoaXMucGxheWVyU2l6ZS5oZWlnaHQgLSAwLjUpICsgMC41XG4gICAgICAgICAgICA6IHkgLyB0aGlzLnBsYXllclNpemUuaGVpZ2h0O1xuICAgICAgICBpZiAobm9ybWFsaXplZFggPCAwLjAgfHwgbm9ybWFsaXplZFggPiAxLjAgfHwgbm9ybWFsaXplZFkgPCAwLjAgfHwgbm9ybWFsaXplZFkgPiAxLjApIHtcbiAgICAgICAgICAgIHJldHVybiB7IGluUmFuZ2U6IGZhbHNlLCB4OiA2NTUzNSwgeTogNjU1MzUgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IGluUmFuZ2U6IHRydWUsIHg6IG5vcm1hbGl6ZWRYICogNjU1MzYsIHk6IG5vcm1hbGl6ZWRZICogNjU1MzYgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0cmFuc2xhdGVTaWduZWQoeCwgeSkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkWCA9IHRoaXMucGxheWVySXNMYXJnZXJcbiAgICAgICAgICAgID8geCAvICgwLjUgKiB0aGlzLnBsYXllclNpemUud2lkdGgpXG4gICAgICAgICAgICA6ICh0aGlzLnJhdGlvICogeCkgLyAoMC41ICogdGhpcy5wbGF5ZXJTaXplLndpZHRoKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFkgPSB0aGlzLnBsYXllcklzTGFyZ2VyXG4gICAgICAgICAgICA/ICh0aGlzLnJhdGlvICogeSkgLyAoMC41ICogdGhpcy5wbGF5ZXJTaXplLmhlaWdodClcbiAgICAgICAgICAgIDogeSAvICgwLjUgKiB0aGlzLnBsYXllclNpemUuaGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuIHsgeDogbm9ybWFsaXplZFggKiAzMjc2NywgeTogbm9ybWFsaXplZFkgKiAzMjc2NyB9O1xuICAgIH1cbiAgICB1bnRyYW5zbGF0ZVVuc2lnbmVkKHgsIHkpIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFggPSB0aGlzLnBsYXllcklzTGFyZ2VyID8geCAvIDY1NTM2IDogKHggLyA2NTUzNiAtIDAuNSkgLyB0aGlzLnJhdGlvICsgMC41O1xuICAgICAgICBjb25zdCBub3JtYWxpemVkWSA9IHRoaXMucGxheWVySXNMYXJnZXIgPyAoeSAvIDY1NTM2IC0gMC41KSAvIHRoaXMucmF0aW8gKyAwLjUgOiB5IC8gNjU1MzY7XG4gICAgICAgIHJldHVybiB7IHg6IG5vcm1hbGl6ZWRYICogdGhpcy5wbGF5ZXJTaXplLndpZHRoLCB5OiBub3JtYWxpemVkWSAqIHRoaXMucGxheWVyU2l6ZS5oZWlnaHQgfTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbnB1dENvb3JkVHJhbnNsYXRvci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuZXhwb3J0IGNsYXNzIFJUQ1V0aWxzIHtcbiAgICBzdGF0aWMgaXNWaWRlb1RyYW5zY2VpdmVyKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhblRyYW5zY2VpdmVyUmVjZWl2ZVZpZGVvKHRyYW5zY2VpdmVyKSB8fCB0aGlzLmNhblRyYW5zY2VpdmVyU2VuZFZpZGVvKHRyYW5zY2VpdmVyKTtcbiAgICB9XG4gICAgc3RhdGljIGNhblRyYW5zY2VpdmVyUmVjZWl2ZVZpZGVvKHRyYW5zY2VpdmVyKSB7XG4gICAgICAgIHJldHVybiAoISF0cmFuc2NlaXZlciAmJlxuICAgICAgICAgICAgKHRyYW5zY2VpdmVyLmRpcmVjdGlvbiA9PT0gJ3NlbmRyZWN2JyB8fCB0cmFuc2NlaXZlci5kaXJlY3Rpb24gPT09ICdyZWN2b25seScpICYmXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5yZWNlaXZlciAmJlxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIudHJhY2sgJiZcbiAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyLnRyYWNrLmtpbmQgPT09ICd2aWRlbycpO1xuICAgIH1cbiAgICBzdGF0aWMgY2FuVHJhbnNjZWl2ZXJTZW5kVmlkZW8odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgcmV0dXJuICghIXRyYW5zY2VpdmVyICYmXG4gICAgICAgICAgICAodHJhbnNjZWl2ZXIuZGlyZWN0aW9uID09PSAnc2VuZHJlY3YnIHx8IHRyYW5zY2VpdmVyLmRpcmVjdGlvbiA9PT0gJ3NlbmRvbmx5JykgJiZcbiAgICAgICAgICAgIHRyYW5zY2VpdmVyLnNlbmRlciAmJlxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIuc2VuZGVyLnRyYWNrICYmXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5zZW5kZXIudHJhY2sua2luZCA9PT0gJ3ZpZGVvJyk7XG4gICAgfVxuICAgIHN0YXRpYyBpc0F1ZGlvVHJhbnNjZWl2ZXIodHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuVHJhbnNjZWl2ZXJSZWNlaXZlQXVkaW8odHJhbnNjZWl2ZXIpIHx8IHRoaXMuY2FuVHJhbnNjZWl2ZXJTZW5kQXVkaW8odHJhbnNjZWl2ZXIpO1xuICAgIH1cbiAgICBzdGF0aWMgY2FuVHJhbnNjZWl2ZXJSZWNlaXZlQXVkaW8odHJhbnNjZWl2ZXIpIHtcbiAgICAgICAgcmV0dXJuICghIXRyYW5zY2VpdmVyICYmXG4gICAgICAgICAgICAodHJhbnNjZWl2ZXIuZGlyZWN0aW9uID09PSAnc2VuZHJlY3YnIHx8IHRyYW5zY2VpdmVyLmRpcmVjdGlvbiA9PT0gJ3JlY3Zvbmx5JykgJiZcbiAgICAgICAgICAgIHRyYW5zY2VpdmVyLnJlY2VpdmVyICYmXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5yZWNlaXZlci50cmFjayAmJlxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIucmVjZWl2ZXIudHJhY2sua2luZCA9PT0gJ2F1ZGlvJyk7XG4gICAgfVxuICAgIHN0YXRpYyBjYW5UcmFuc2NlaXZlclNlbmRBdWRpbyh0cmFuc2NlaXZlcikge1xuICAgICAgICByZXR1cm4gKCEhdHJhbnNjZWl2ZXIgJiZcbiAgICAgICAgICAgICh0cmFuc2NlaXZlci5kaXJlY3Rpb24gPT09ICdzZW5kcmVjdicgfHwgdHJhbnNjZWl2ZXIuZGlyZWN0aW9uID09PSAnc2VuZG9ubHknKSAmJlxuICAgICAgICAgICAgdHJhbnNjZWl2ZXIuc2VuZGVyICYmXG4gICAgICAgICAgICB0cmFuc2NlaXZlci5zZW5kZXIudHJhY2sgJiZcbiAgICAgICAgICAgIHRyYW5zY2VpdmVyLnNlbmRlci50cmFjay5raW5kID09PSAnYXVkaW8nKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1SVENVdGlscy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuLyoqXG4gKiBWaWRlbyBQbGF5ZXIgQ29udHJvbGxlciBoYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiB0aGUgdmlkZW8gSFRNTCBlbGVtZW50IGFuZCBhbGwgaGFuZGxlcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFN0cmVhbUNvbnRyb2xsZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB2aWRlb0VsZW1lbnRQcm92aWRlciBWaWRlbyBQbGF5ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih2aWRlb0VsZW1lbnRQcm92aWRlcikge1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudFByb3ZpZGVyID0gdmlkZW9FbGVtZW50UHJvdmlkZXI7XG4gICAgICAgIHRoaXMuYXVkaW9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnQXVkaW8nKTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnRQcm92aWRlci5zZXRBdWRpb0VsZW1lbnQodGhpcy5hdWRpb0VsZW1lbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gdGhlIFBlZXIgY29ubmVjdGlvbiBoYXMgYSB0cmFjayBldmVudFxuICAgICAqIEBwYXJhbSBydGNUcmFja0V2ZW50IC0gUlRDIFRyYWNrIEV2ZW50XG4gICAgICovXG4gICAgaGFuZGxlT25UcmFjayhydGNUcmFja0V2ZW50KSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdoYW5kbGVPblRyYWNrICcgKyBKU09OLnN0cmluZ2lmeShydGNUcmFja0V2ZW50LnN0cmVhbXMpKTtcbiAgICAgICAgLy8gRG8gbm90IGFkZCB0aGUgdHJhY2sgaWYgdGhlIElEIGlzIGBwcm9iYXRvcmAgYXMgdGhpcyBpcyBzcGVjaWFsIHRyYWNrIGNyZWF0ZWQgYnkgbWVkaWFzb3VwIGZvciBiaXRyYXRlIHByb2JpbmcuXG4gICAgICAgIC8vIFJlZmVyIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9FcGljR2FtZXNFeHQvUGl4ZWxTdHJlYW1pbmdJbmZyYXN0cnVjdHVyZS9wdWxsLzg2IGZvciBtb3JlIGRldGFpbHMuXG4gICAgICAgIGlmIChydGNUcmFja0V2ZW50LnN0cmVhbXMubGVuZ3RoIDwgMSB8fCBydGNUcmFja0V2ZW50LnN0cmVhbXNbMF0uaWQgPT0gJ3Byb2JhdG9yJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IHRoaXMudmlkZW9FbGVtZW50UHJvdmlkZXIuZ2V0VmlkZW9FbGVtZW50KCk7XG4gICAgICAgIGlmIChydGNUcmFja0V2ZW50LnRyYWNrKSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnR290IHRyYWNrIC0gJyArXG4gICAgICAgICAgICAgICAgcnRjVHJhY2tFdmVudC50cmFjay5raW5kICtcbiAgICAgICAgICAgICAgICAnIGlkPScgK1xuICAgICAgICAgICAgICAgIHJ0Y1RyYWNrRXZlbnQudHJhY2suaWQgK1xuICAgICAgICAgICAgICAgICcgcmVhZHlTdGF0ZT0nICtcbiAgICAgICAgICAgICAgICBydGNUcmFja0V2ZW50LnRyYWNrLnJlYWR5U3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydGNUcmFja0V2ZW50LnRyYWNrLmtpbmQgPT0gJ2F1ZGlvJykge1xuICAgICAgICAgICAgdGhpcy5DcmVhdGVBdWRpb1RyYWNrKHJ0Y1RyYWNrRXZlbnQuc3RyZWFtc1swXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocnRjVHJhY2tFdmVudC50cmFjay5raW5kID09ICd2aWRlbycgJiZcbiAgICAgICAgICAgIHZpZGVvRWxlbWVudC5zcmNPYmplY3QgIT09IHJ0Y1RyYWNrRXZlbnQuc3RyZWFtc1swXSkge1xuICAgICAgICAgICAgdmlkZW9FbGVtZW50LnNyY09iamVjdCA9IHJ0Y1RyYWNrRXZlbnQuc3RyZWFtc1swXTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdTZXQgdmlkZW8gc291cmNlIGZyb20gdmlkZW8gdHJhY2sgb250cmFjay4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBhdWRpbyBkZXZpY2Ugd2hlbiByZWNlaXZpbmcgYW4gUlRDVHJhY2tFdmVudCB3aXRoIHRoZSBraW5kIG9mIFwiYXVkaW9cIlxuICAgICAqIEBwYXJhbSBhdWRpb01lZGlhU3RyZWFtIC0gQXVkaW8gTWVkaWEgc3RyZWFtIHRyYWNrXG4gICAgICovXG4gICAgQ3JlYXRlQXVkaW9UcmFjayhhdWRpb01lZGlhU3RyZWFtKSB7XG4gICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IHRoaXMudmlkZW9FbGVtZW50UHJvdmlkZXIuZ2V0VmlkZW9FbGVtZW50KCk7XG4gICAgICAgIC8vIGRvIG5vdGhpbmcgdGhlIHZpZGVvIGhhcyB0aGUgc2FtZSBtZWRpYSBzdHJlYW0gYXMgdGhlIGF1ZGlvIHRyYWNrIHdlIGhhdmUgaGVyZSAodGhleSBhcmUgbGlua2VkKVxuICAgICAgICBpZiAodmlkZW9FbGVtZW50LnNyY09iamVjdCA9PSBhdWRpb01lZGlhU3RyZWFtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gdmlkZW8gZWxlbWVudCBoYXMgc29tZSBvdGhlciBtZWRpYSBzdHJlYW0gdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYXVkaW8gdHJhY2tcbiAgICAgICAgZWxzZSBpZiAodmlkZW9FbGVtZW50LnNyY09iamVjdCAmJiB2aWRlb0VsZW1lbnQuc3JjT2JqZWN0ICE9PSBhdWRpb01lZGlhU3RyZWFtKSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgYXVkaW8gZWxlbWVudFxuICAgICAgICAgICAgdGhpcy5hdWRpb0VsZW1lbnQuc3JjT2JqZWN0ID0gYXVkaW9NZWRpYVN0cmVhbTtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdDcmVhdGVkIG5ldyBhdWRpbyBlbGVtZW50IHRvIHBsYXkgc2VwYXJhdGUgYXVkaW8gc3RyZWFtLicpO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RyZWFtQ29udHJvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgRmxhZ3MgfSBmcm9tICcuLi9Db25maWcvQ29uZmlnJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41Jztcbi8qKlxuICogVGhlIHZpZGVvIHBsYXllciBodG1sIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGNsYXNzIFZpZGVvUGxheWVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gdmlkZW9FbGVtZW50UGFyZW50IHRoZSBodG1sIGRpdiB0aGUgdGhlIHZpZGVvIHBsYXllciB3aWxsIGJlIGluamVjdGVkIGludG9cbiAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSBhcHBsaWNhdGlvbnMgY29uZmlndXJhdGlvbi4gV2UncmUgaW50ZXJlc3RlZCBpbiB0aGUgc3RhcnRWaWRlb011dGVkIGZsYWdcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih2aWRlb0VsZW1lbnRQYXJlbnQsIGNvbmZpZykge1xuICAgICAgICB0aGlzLmxhc3RUaW1lUmVzaXplZCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5pZCA9ICdzdHJlYW1pbmdWaWRlbyc7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50LmRpc2FibGVQaWN0dXJlSW5QaWN0dXJlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQucGxheXNJbmxpbmUgPSB0cnVlO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5zdHlsZS53aWR0aCA9ICcxMDAlJztcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzEwMCUnO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJztcbiAgICAgICAgdmlkZW9FbGVtZW50UGFyZW50LmFwcGVuZENoaWxkKHRoaXMudmlkZW9FbGVtZW50KTtcbiAgICAgICAgdGhpcy5vblJlc2l6ZVBsYXllckNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1Jlc29sdXRpb24gY2hhbmdlZCwgcmVzdHlsaW5nIHBsYXllciwgZGlkIHlvdSBmb3JnZXQgdG8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbj8nKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5vbk1hdGNoVmlld3BvcnRSZXNvbHV0aW9uQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnUmVzb2x1dGlvbiBjaGFuZ2VkIGFuZCBtYXRjaCB2aWV3cG9ydCByZXNvbHV0aW9uIGlzIHR1cm5lZCBvbiwgZGlkIHlvdSBmb3JnZXQgdG8gb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbj8nKTtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gc2V0IHBsYXkgZm9yIHZpZGVvIChhbmQgYXVkaW8pXG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50Lm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5hdWRpb0VsZW1lbnQgIT0gdW5kZWZpbmVkICYmIHRoaXMuYXVkaW9FbGVtZW50LnBhdXNlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9FbGVtZW50LnBsYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnZpZGVvRWxlbWVudC5wYXVzZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5wbGF5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50Lm9ubG9hZGVkbWV0YWRhdGEgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uVmlkZW9Jbml0aWFsaXplZCgpO1xuICAgICAgICB9O1xuICAgICAgICAvLyBzZXQgcmVzaXplIGV2ZW50cyB0byB0aGUgd2luZG93cyBpZiBpdCBpcyByZXNpemVkIG9yIGl0cyBvcmllbnRhdGlvbiBpcyBjaGFuZ2VkXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLnJlc2l6ZVBsYXllclN0eWxlKCksIHRydWUpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb3JpZW50YXRpb25jaGFuZ2UnLCAoKSA9PiB0aGlzLm9uT3JpZW50YXRpb25DaGFuZ2UoKSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50LnNyYyA9ICcnO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5zcmNPYmplY3QgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZGVvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgaWYgKHRoaXMuYXVkaW9FbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudC5zcmMgPSAnJztcbiAgICAgICAgICAgIHRoaXMuYXVkaW9FbGVtZW50LnNyY09iamVjdCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRBdWRpb0VsZW1lbnQoYXVkaW9FbGVtZW50KSB7XG4gICAgICAgIHRoaXMuYXVkaW9FbGVtZW50ID0gYXVkaW9FbGVtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHVwIHRoZSB2aWRlbyBlbGVtZW50IHdpdGggYW55IGFwcGxpY2F0aW9uIGNvbmZpZyBhbmQgcGxheXMgdGhlIHZpZGVvIGVsZW1lbnQuXG4gICAgICogQHJldHVybnMgQSBwcm9taXNlIGZvciBpZiBwbGF5aW5nIHRoZSB2aWRlbyB3YXMgc3VjY2Vzc2Z1bCBvciBub3QuXG4gICAgICovXG4gICAgcGxheSgpIHtcbiAgICAgICAgdGhpcy52aWRlb0VsZW1lbnQubXV0ZWQgPSB0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLlN0YXJ0VmlkZW9NdXRlZCk7XG4gICAgICAgIHRoaXMudmlkZW9FbGVtZW50LmF1dG9wbGF5ID0gdGhpcy5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5BdXRvUGxheVZpZGVvKTtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW9FbGVtZW50LnBsYXkoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmlkZW8gZWxlbWVudCBpcyBwYXVzZWQuXG4gICAgICovXG4gICAgaXNQYXVzZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvRWxlbWVudC5wYXVzZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIC0gd2hldGhlciB0aGUgdmlkZW8gZWxlbWVudCBpcyBwbGF5aW5nLlxuICAgICAqL1xuICAgIGlzVmlkZW9SZWFkeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlkZW9FbGVtZW50LnJlYWR5U3RhdGUgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnZpZGVvRWxlbWVudC5yZWFkeVN0YXRlID4gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgdmlkZW8gZWxlbWVudCBoYXMgYSB2YWxpZCB2aWRlbyBzb3VyY2UgKHNyY09iamVjdCkuXG4gICAgICovXG4gICAgaGFzVmlkZW9Tb3VyY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvRWxlbWVudC5zcmNPYmplY3QgIT09IHVuZGVmaW5lZCAmJiB0aGlzLnZpZGVvRWxlbWVudC5zcmNPYmplY3QgIT09IG51bGw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY3VycmVudCBjb250ZXh0IG9mIHRoZSBodG1sIHZpZGVvIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyAtIHRoZSBjdXJyZW50IGNvbnRleHQgb2YgdGhlIHZpZGVvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBnZXRWaWRlb0VsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZGVvRWxlbWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGNvbnRleHQgb2YgdGhlIGh0bWwgdmlkZW8gZWxlbWVudHMgcGFyZW50XG4gICAgICogQHJldHVybnMgLSB0aGUgY3VycmVudCBjb250ZXh0IG9mIHRoZSB2aWRlbyBlbGVtZW50cyBwYXJlbnRcbiAgICAgKi9cbiAgICBnZXRWaWRlb1BhcmVudEVsZW1lbnQoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IHRoaXMudmlkZW9FbGVtZW50LnBhcmVudEVsZW1lbnQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBWaWRlbyBFbGVtZW50cyBzcmMgb2JqZWN0IHRyYWNrcyB0byBlbmFibGVcbiAgICAgKiBAcGFyYW0gZW5hYmxlZCAtIEVuYWJsZSBUcmFja3Mgb24gdGhlIFNyYyBPYmplY3RcbiAgICAgKi9cbiAgICBzZXRWaWRlb0VuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgICAvLyB0aGlzIGlzIGEgdGVtcG9yYXJ5IGhhY2sgdW50aWwgdHlwZSBzY3JpcHRzIHZpZGVvIGVsZW1lbnQgaXMgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBuZWVkIGZvciB0cmFja3Mgb24gYSBodG1sIHZpZGVvIGVsZW1lbnRcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdGhpcy52aWRlb0VsZW1lbnQ7XG4gICAgICAgIHZpZGVvRWxlbWVudC5zcmNPYmplY3RcbiAgICAgICAgICAgIC5nZXRUcmFja3MoKVxuICAgICAgICAgICAgLmZvckVhY2goKHRyYWNrKSA9PiAodHJhY2suZW5hYmxlZCA9IGVuYWJsZWQpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQW4gb3ZlcnJpZGUgZm9yIHdoZW4gdGhlIHZpZGVvIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYSBzcmNPYmplY3RcbiAgICAgKi9cbiAgICBvblZpZGVvSW5pdGlhbGl6ZWQoKSB7XG4gICAgICAgIC8vIERlZmF1bHQgRnVuY3Rpb25hbGl0eTogRG8gTm90aGluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBPbiB0aGUgb3JpZW50YXRpb24gY2hhbmdlIG9mIGEgd2luZG93IGNsZWFyIHRoZSB0aW1lb3V0XG4gICAgICovXG4gICAgb25PcmllbnRhdGlvbkNoYW5nZSgpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMub3JpZW50YXRpb25DaGFuZ2VUaW1lb3V0KTtcbiAgICAgICAgdGhpcy5vcmllbnRhdGlvbkNoYW5nZVRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVBsYXllclN0eWxlKCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlc2l6ZXMgdGhlIHBsYXllciBzdHlsZSBiYXNlZCBvbiB0aGUgd2luZG93IGhlaWdodCBhbmQgd2lkdGhcbiAgICAgKiBAcmV0dXJucyAtIG5pbCBpZiByZXF1aXJlbWVudHMgYXJlIHNhdGlzZmllZFxuICAgICAqL1xuICAgIHJlc2l6ZVBsYXllclN0eWxlKCkge1xuICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnRQYXJlbnQgPSB0aGlzLmdldFZpZGVvUGFyZW50RWxlbWVudCgpO1xuICAgICAgICBpZiAoIXZpZGVvRWxlbWVudFBhcmVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlVmlkZW9TdHJlYW1TaXplKCk7XG4gICAgICAgIGlmICh2aWRlb0VsZW1lbnRQYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdmaXhlZC1zaXplJykpIHtcbiAgICAgICAgICAgIHRoaXMub25SZXNpemVQbGF5ZXJDYWxsYmFjaygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnRyb2xzIGZvciByZXNpemluZyB0aGUgcGxheWVyXG4gICAgICAgIHRoaXMucmVzaXplUGxheWVyU3R5bGVUb0ZpbGxQYXJlbnRFbGVtZW50KCk7XG4gICAgICAgIHRoaXMub25SZXNpemVQbGF5ZXJDYWxsYmFjaygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXNpemVzIHRoZSBwbGF5ZXIgZWxlbWVudCB0byBmaWxsIHRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqL1xuICAgIHJlc2l6ZVBsYXllclN0eWxlVG9GaWxsUGFyZW50RWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcy5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgLy9WaWRlbyBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0IHNvIHNldCB2aWRlb0VsZW1lbnRQYXJlbnQgdG8gc2l6ZSBvZiBwYXJlbnQgZWxlbWVudFxuICAgICAgICBjb25zdCBzdHlsZVdpZHRoID0gJzEwMCUnO1xuICAgICAgICBjb25zdCBzdHlsZUhlaWdodCA9ICcxMDAlJztcbiAgICAgICAgY29uc3Qgc3R5bGVUb3AgPSAwO1xuICAgICAgICBjb25zdCBzdHlsZUxlZnQgPSAwO1xuICAgICAgICB2aWRlb0VsZW1lbnRQYXJlbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsICd0b3A6ICcgK1xuICAgICAgICAgICAgc3R5bGVUb3AgK1xuICAgICAgICAgICAgJ3B4OyBsZWZ0OiAnICtcbiAgICAgICAgICAgIHN0eWxlTGVmdCArXG4gICAgICAgICAgICAncHg7IHdpZHRoOiAnICtcbiAgICAgICAgICAgIHN0eWxlV2lkdGggK1xuICAgICAgICAgICAgJzsgaGVpZ2h0OiAnICtcbiAgICAgICAgICAgIHN0eWxlSGVpZ2h0ICtcbiAgICAgICAgICAgICc7IGN1cnNvcjogZGVmYXVsdDsnKTtcbiAgICB9XG4gICAgdXBkYXRlVmlkZW9TdHJlYW1TaXplKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuTWF0Y2hWaWV3cG9ydFJlc29sdXRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIGlmIChub3cgLSB0aGlzLmxhc3RUaW1lUmVzaXplZCA+IDMwMCkge1xuICAgICAgICAgICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcy5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGlmICghdmlkZW9FbGVtZW50UGFyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbk1hdGNoVmlld3BvcnRSZXNvbHV0aW9uQ2FsbGJhY2sodmlkZW9FbGVtZW50UGFyZW50LmNsaWVudFdpZHRoLCB2aWRlb0VsZW1lbnRQYXJlbnQuY2xpZW50SGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMubGFzdFRpbWVSZXNpemVkID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnUmVzaXppbmcgdG9vIG9mdGVuIC0gc2tpcHBpbmcnKTtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVvdXRIYW5kbGUpO1xuICAgICAgICAgICAgdGhpcy5yZXNpemVUaW1lb3V0SGFuZGxlID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVWaWRlb1N0cmVhbVNpemUoKSwgMTAwKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpZGVvUGxheWVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBXZWJTb2NrZXRUcmFuc3BvcnQsIExvZ2dlciwgU2lnbmFsbGluZ1Byb3RvY29sLCBNZXNzYWdlcywgTWVzc2FnZUhlbHBlcnMsIEtlZXBhbGl2ZU1vbml0b3IgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2NvbW1vbi11ZTUuNSc7XG5pbXBvcnQgeyBTdHJlYW1Db250cm9sbGVyIH0gZnJvbSAnLi4vVmlkZW9QbGF5ZXIvU3RyZWFtQ29udHJvbGxlcic7XG5pbXBvcnQgeyBGcmVlemVGcmFtZUNvbnRyb2xsZXIgfSBmcm9tICcuLi9GcmVlemVGcmFtZS9GcmVlemVGcmFtZUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgQUZLQ29udHJvbGxlciB9IGZyb20gJy4uL0FGSy9BRktDb250cm9sbGVyJztcbmltcG9ydCB7IERhdGFDaGFubmVsQ29udHJvbGxlciB9IGZyb20gJy4uL0RhdGFDaGFubmVsL0RhdGFDaGFubmVsQ29udHJvbGxlcic7XG5pbXBvcnQgeyBQZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIgfSBmcm9tICcuLi9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvUGVlckNvbm5lY3Rpb25Db250cm9sbGVyJztcbmltcG9ydCB7IEZsYWdzLCBDb250cm9sU2NoZW1lVHlwZSwgVGV4dFBhcmFtZXRlcnMsIE9wdGlvblBhcmFtZXRlcnMsIE51bWVyaWNQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vQ29uZmlnL0NvbmZpZyc7XG5pbXBvcnQgeyBJbml0aWFsU2V0dGluZ3MgfSBmcm9tICcuLi9EYXRhQ2hhbm5lbC9Jbml0aWFsU2V0dGluZ3MnO1xuaW1wb3J0IHsgTGF0ZW5jeVRlc3RSZXN1bHRzIH0gZnJvbSAnLi4vRGF0YUNoYW5uZWwvTGF0ZW5jeVRlc3RSZXN1bHRzJztcbmltcG9ydCB7IEZpbGVUZW1wbGF0ZSwgRmlsZVV0aWwgfSBmcm9tICcuLi9VdGlsL0ZpbGVVdGlsJztcbmltcG9ydCB7IElucHV0Q2xhc3Nlc0ZhY3RvcnkgfSBmcm9tICcuLi9JbnB1dHMvSW5wdXRDbGFzc2VzRmFjdG9yeSc7XG5pbXBvcnQgeyBWaWRlb1BsYXllciB9IGZyb20gJy4uL1ZpZGVvUGxheWVyL1ZpZGVvUGxheWVyJztcbmltcG9ydCB7IFN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLCBNZXNzYWdlRGlyZWN0aW9uIH0gZnJvbSAnLi4vVWVJbnN0YW5jZU1lc3NhZ2UvU3RyZWFtTWVzc2FnZUNvbnRyb2xsZXInO1xuaW1wb3J0IHsgUmVzcG9uc2VDb250cm9sbGVyIH0gZnJvbSAnLi4vVWVJbnN0YW5jZU1lc3NhZ2UvUmVzcG9uc2VDb250cm9sbGVyJztcbmltcG9ydCB7IFNlbmRNZXNzYWdlQ29udHJvbGxlciB9IGZyb20gJy4uL1VlSW5zdGFuY2VNZXNzYWdlL1NlbmRNZXNzYWdlQ29udHJvbGxlcic7XG5pbXBvcnQgeyBUb1N0cmVhbWVyTWVzc2FnZXNDb250cm9sbGVyIH0gZnJvbSAnLi4vVWVJbnN0YW5jZU1lc3NhZ2UvVG9TdHJlYW1lck1lc3NhZ2VzQ29udHJvbGxlcic7XG5pbXBvcnQgeyBEYXRhQ2hhbm5lbFNlbmRlciB9IGZyb20gJy4uL0RhdGFDaGFubmVsL0RhdGFDaGFubmVsU2VuZGVyJztcbmltcG9ydCB7IElucHV0Q29vcmRUcmFuc2xhdG9yIH0gZnJvbSAnLi4vVXRpbC9JbnB1dENvb3JkVHJhbnNsYXRvcic7XG5pbXBvcnQgeyBEYXRhQ2hhbm5lbENsb3NlRXZlbnQsIERhdGFDaGFubmVsRXJyb3JFdmVudCwgRGF0YUNoYW5uZWxPcGVuRXZlbnQsIEhpZGVGcmVlemVGcmFtZUV2ZW50LCBMb2FkRnJlZXplRnJhbWVFdmVudCwgUGxheVN0cmVhbUVycm9yRXZlbnQsIFBsYXlTdHJlYW1FdmVudCwgUGxheVN0cmVhbVJlamVjdGVkRXZlbnQsIFNob3dPblNjcmVlbktleWJvYXJkRXZlbnQsIFN0cmVhbWVyTGlzdE1lc3NhZ2VFdmVudCwgU3RyZWFtZXJJRENoYW5nZWRNZXNzYWdlRXZlbnQgfSBmcm9tICcuLi9VdGlsL0V2ZW50RW1pdHRlcic7XG5pbXBvcnQgeyBJVVJMU2VhcmNoUGFyYW1zIH0gZnJvbSAnLi4vVXRpbC9JVVJMU2VhcmNoUGFyYW1zJztcbmltcG9ydCB7IEJyb3dzZXJVdGlscyB9IGZyb20gJy4uL1V0aWwvQnJvd3NlclV0aWxzJztcbi8qKlxuICogRW50cnkgcG9pbnQgZm9yIHRoZSBXZWJSVEMgUGxheWVyXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJSdGNQbGF5ZXJDb250cm9sbGVyIHtcbiAgICAvKipcbiAgICAgKlxuICAgICAqIEBwYXJhbSBjb25maWcgLSB0aGUgZnJvbnRlbmQgY29uZmlnIG9iamVjdFxuICAgICAqIEBwYXJhbSBwaXhlbFN0cmVhbWluZyAtIHRoZSBQaXhlbFN0cmVhbWluZyBvYmplY3RcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihjb25maWcsIHBpeGVsU3RyZWFtaW5nKSB7XG4gICAgICAgIHRoaXMuc2hvdWxkU2hvd1BsYXlPdmVybGF5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5hdXRvSm9pblRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZyA9IHBpeGVsU3RyZWFtaW5nO1xuICAgICAgICB0aGlzLnJlc3BvbnNlQ29udHJvbGxlciA9IG5ldyBSZXNwb25zZUNvbnRyb2xsZXIoKTtcbiAgICAgICAgdGhpcy5maWxlID0gbmV3IEZpbGVUZW1wbGF0ZSgpO1xuICAgICAgICB0aGlzLnNkcENvbnN0cmFpbnRzID0ge1xuICAgICAgICAgICAgb2ZmZXJUb1JlY2VpdmVBdWRpbzogdHJ1ZSxcbiAgICAgICAgICAgIG9mZmVyVG9SZWNlaXZlVmlkZW86IHRydWVcbiAgICAgICAgfTtcbiAgICAgICAgLy8gc2V0IHVwIHRoZSBhZmsgbG9naWMgY2xhc3MgYW5kIGNvbm5lY3QgdXAgaXRzIG1ldGhvZCBmb3IgY2xvc2luZyB0aGUgc2lnbmFsaW5nIHNlcnZlclxuICAgICAgICB0aGlzLmFma0NvbnRyb2xsZXIgPSBuZXcgQUZLQ29udHJvbGxlcih0aGlzLmNvbmZpZywgdGhpcy5waXhlbFN0cmVhbWluZywgdGhpcy5vbkFma1RyaWdnZXJlZC5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5hZmtDb250cm9sbGVyLm9uQUZLVGltZWRPdXRDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VTaWduYWxpbmdTZXJ2ZXIoJ1lvdSBoYXZlIGJlZW4gZGlzY29ubmVjdGVkIGR1ZSB0byBpbmFjdGl2aXR5LicsIGZhbHNlKTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5mcmVlemVGcmFtZUNvbnRyb2xsZXIgPSBuZXcgRnJlZXplRnJhbWVDb250cm9sbGVyKHRoaXMucGl4ZWxTdHJlYW1pbmcudmlkZW9FbGVtZW50UGFyZW50KTtcbiAgICAgICAgdGhpcy52aWRlb1BsYXllciA9IG5ldyBWaWRlb1BsYXllcih0aGlzLnBpeGVsU3RyZWFtaW5nLnZpZGVvRWxlbWVudFBhcmVudCwgdGhpcy5jb25maWcpO1xuICAgICAgICB0aGlzLnZpZGVvUGxheWVyLm9uVmlkZW9Jbml0aWFsaXplZCA9ICgpID0+IHRoaXMuaGFuZGxlVmlkZW9Jbml0aWFsaXplZCgpO1xuICAgICAgICAvLyBXaGVuIGluIG1hdGNoIHZpZXdwb3J0IHJlc29sdXRpb24gbW9kZSwgd2hlbiB0aGUgYnJvd3NlciB2aWV3cG9ydCBpcyByZXNpemVkIHdlIHNlbmQgYSByZXNpemUgY29tbWFuZCBiYWNrIHRvIFVFLlxuICAgICAgICB0aGlzLnZpZGVvUGxheWVyLm9uTWF0Y2hWaWV3cG9ydFJlc29sdXRpb25DYWxsYmFjayA9ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0ge1xuICAgICAgICAgICAgICAgICdSZXNvbHV0aW9uLldpZHRoJzogd2lkdGgsXG4gICAgICAgICAgICAgICAgJ1Jlc29sdXRpb24uSGVpZ2h0JzogaGVpZ2h0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdDb21tYW5kJykoW0pTT04uc3RyaW5naWZ5KGRlc2NyaXB0b3IpXSk7XG4gICAgICAgIH07XG4gICAgICAgIC8vIEV2ZXJ5IHRpbWUgdmlkZW8gcGxheWVyIGlzIHJlc2l6ZWQgaW4gYnJvd3NlciB3ZSBuZWVkIHRvIHJlaW5pdGlhbGl6ZSB0aGUgbW91c2UgY29vcmRpbmF0ZSBjb252ZXJzaW9uIGFuZCBmcmVlemUgZnJhbWUgc2l6aW5nIGxvZ2ljLlxuICAgICAgICB0aGlzLnZpZGVvUGxheWVyLm9uUmVzaXplUGxheWVyQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldFVwTW91c2VBbmRGcmVlemVGcmFtZSgpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcih0aGlzLnZpZGVvUGxheWVyKTtcbiAgICAgICAgdGhpcy5jb29yZGluYXRlQ29udmVydGVyID0gbmV3IElucHV0Q29vcmRUcmFuc2xhdG9yKCk7XG4gICAgICAgIHRoaXMuc2VuZHJlY3ZEYXRhQ2hhbm5lbENvbnRyb2xsZXIgPSBuZXcgRGF0YUNoYW5uZWxDb250cm9sbGVyKCk7XG4gICAgICAgIHRoaXMucmVjdkRhdGFDaGFubmVsQ29udHJvbGxlciA9IG5ldyBEYXRhQ2hhbm5lbENvbnRyb2xsZXIoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckRhdGFDaGFubmVsRXZlbnRFbWl0dGVycyh0aGlzLnNlbmRyZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckRhdGFDaGFubmVsRXZlbnRFbWl0dGVycyh0aGlzLnJlY3ZEYXRhQ2hhbm5lbENvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLmRhdGFDaGFubmVsU2VuZGVyID0gbmV3IERhdGFDaGFubmVsU2VuZGVyKHRoaXMuc2VuZHJlY3ZEYXRhQ2hhbm5lbENvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLmRhdGFDaGFubmVsU2VuZGVyLnJlc2V0QWZrV2FybmluZ1RpbWVyT25EYXRhU2VuZCA9ICgpID0+IHRoaXMuYWZrQ29udHJvbGxlci5yZXNldEFma1dhcm5pbmdUaW1lcigpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFN0cmVhbU1lc3NhZ2VDb250cm9sbGVyKCk7XG4gICAgICAgIC8vIHNldCB1cCB3ZWJzb2NrZXQgbWV0aG9kc1xuICAgICAgICB0aGlzLnRyYW5zcG9ydCA9IG5ldyBXZWJTb2NrZXRUcmFuc3BvcnQoY29uZmlnLndlYlNvY2tldFByb3RvY29scyk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wgPSBuZXcgU2lnbmFsbGluZ1Byb3RvY29sKHRoaXMudHJhbnNwb3J0KTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5hZGRMaXN0ZW5lcihNZXNzYWdlcy5jb25maWcudHlwZU5hbWUsIChtc2cpID0+IHRoaXMuaGFuZGxlT25Db25maWdNZXNzYWdlKG1zZykpO1xuICAgICAgICB0aGlzLnByb3RvY29sLmFkZExpc3RlbmVyKE1lc3NhZ2VzLnBpbmcudHlwZU5hbWUsIChtc2cpID0+IHRoaXMuaGFuZGxlUGluZ01lc3NhZ2UobXNnKSk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wuYWRkTGlzdGVuZXIoTWVzc2FnZXMuc3RyZWFtZXJMaXN0LnR5cGVOYW1lLCAobXNnKSA9PiB0aGlzLmhhbmRsZVN0cmVhbWVyTGlzdE1lc3NhZ2UobXNnKSk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wuYWRkTGlzdGVuZXIoTWVzc2FnZXMuc3Vic2NyaWJlRmFpbGVkLnR5cGVOYW1lLCAobXNnKSA9PiB0aGlzLmhhbmRsZVN1YnNjcmliZUZhaWxlZE1lc3NhZ2UobXNnKSk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wuYWRkTGlzdGVuZXIoTWVzc2FnZXMuc3RyZWFtZXJJZENoYW5nZWQudHlwZU5hbWUsIChtc2cpID0+IHRoaXMuaGFuZGxlU3RyZWFtZXJJRENoYW5nZWRNZXNzYWdlKG1zZykpO1xuICAgICAgICB0aGlzLnByb3RvY29sLmFkZExpc3RlbmVyKE1lc3NhZ2VzLnBsYXllckNvdW50LnR5cGVOYW1lLCAobXNnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwbGF5ZXJDb3VudE1lc3NhZ2UgPSBtc2c7XG4gICAgICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vblBsYXllckNvdW50KHBsYXllckNvdW50TWVzc2FnZS5jb3VudCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb3RvY29sLmFkZExpc3RlbmVyKE1lc3NhZ2VzLmFuc3dlci50eXBlTmFtZSwgKG1zZykgPT4gdGhpcy5oYW5kbGVXZWJSdGNBbnN3ZXIobXNnKSk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wuYWRkTGlzdGVuZXIoTWVzc2FnZXMub2ZmZXIudHlwZU5hbWUsIChtc2cpID0+IHRoaXMuaGFuZGxlV2ViUnRjT2ZmZXIobXNnKSk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wuYWRkTGlzdGVuZXIoTWVzc2FnZXMucGVlckRhdGFDaGFubmVscy50eXBlTmFtZSwgKG1zZykgPT4gdGhpcy5oYW5kbGVXZWJSdGNTRlVQZWVyRGF0YWNoYW5uZWxzKG1zZykpO1xuICAgICAgICB0aGlzLnByb3RvY29sLmFkZExpc3RlbmVyKE1lc3NhZ2VzLmljZUNhbmRpZGF0ZS50eXBlTmFtZSwgKG1zZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWNlQ2FuZGlkYXRlTWVzc2FnZSA9IG1zZztcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlSWNlQ2FuZGlkYXRlKGljZUNhbmRpZGF0ZU1lc3NhZ2UuY2FuZGlkYXRlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wudHJhbnNwb3J0LmFkZExpc3RlbmVyKCdvcGVuJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IE1lc3NhZ2VIZWxwZXJzLmNyZWF0ZU1lc3NhZ2UoTWVzc2FnZXMubGlzdFN0cmVhbWVycyk7XG4gICAgICAgICAgICB0aGlzLnByb3RvY29sLnNlbmRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMDtcbiAgICAgICAgICAgIHRoaXMuaXNSZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucHJvdG9jb2wudHJhbnNwb3J0LmFkZExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgIC8vIGRvbnQgcmVhbGx5IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZSBzaW5jZSB0aGUgY2xvc2UgZXZlbnQgc2hvdWxkIGZvbGxvdy5cbiAgICAgICAgICAgIExvZ2dlci5FcnJvcihgR290IGEgdHJhbnNwb3J0IGVycm9yLmApO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC50cmFuc3BvcnQuYWRkTGlzdGVuZXIoJ2Nsb3NlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyB3aGVuIHdlIHJlZnJlc2ggdGhlIHBhZ2UgZHVyaW5nIGEgc3RyZWFtIHdlIGdldCB0aGUgZ29pbmcgYXdheSBjb2RlLlxuICAgICAgICAgICAgLy8gaW4gdGhhdCBjYXNlIHdlIGRvbid0IHdhbnQgdG8gcmVjb25uZWN0IHNpbmNlIHdlJ3JlIG5hdmlnYXRpbmcgYXdheS5cbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DbG9zZUV2ZW50L2NvZGVcbiAgICAgICAgICAgIC8vIGxpc3RzIGFsbCB0aGUgY29kZXMuXG4gICAgICAgICAgICBjb25zdCBDT0RFX0dPSU5HX0FXQVkgPSAxMDAxO1xuICAgICAgICAgICAgY29uc3QgbWF4UmVjb25uZWN0QXR0ZW1wdHMgPSB0aGlzLmNvbmZpZy5nZXROdW1lcmljU2V0dGluZ1ZhbHVlKE51bWVyaWNQYXJhbWV0ZXJzLk1heFJlY29ubmVjdEF0dGVtcHRzKTtcbiAgICAgICAgICAgIGNvbnN0IGF0dGVtcHRzTGVmdCA9IHRoaXMucmVjb25uZWN0QXR0ZW1wdCA8IG1heFJlY29ubmVjdEF0dGVtcHRzO1xuICAgICAgICAgICAgY29uc3QgcmVjb25uZWN0RW5hYmxlZCA9IHRoaXMuZm9yY2VSZWNvbm5lY3QgfHwgKHRoaXMuZW5hYmxlQXV0b1JlY29ubmVjdCAmJiBtYXhSZWNvbm5lY3RBdHRlbXB0cyA+IDAgJiYgYXR0ZW1wdHNMZWZ0KTtcbiAgICAgICAgICAgIGNvbnN0IHdpbGxUcnlSZWNvbm5lY3QgPSByZWNvbm5lY3RFbmFibGVkICYmIGV2ZW50LmNvZGUgIT0gQ09ERV9HT0lOR19BV0FZO1xuICAgICAgICAgICAgY29uc3QgYWxsb3dDbGlja1RvUmVjb25uZWN0ID0gIXdpbGxUcnlSZWNvbm5lY3Q7XG4gICAgICAgICAgICBjb25zdCBkaXNjb25uZWN0TWVzc2FnZSA9IHRoaXMuZGlzY29ubmVjdE1lc3NhZ2UgPyB0aGlzLmRpc2Nvbm5lY3RNZXNzYWdlIDogZXZlbnQucmVhc29uO1xuICAgICAgICAgICAgdGhpcy5mb3JjZVJlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGxpc3Qgb2YgYWxsIHBvc3NpYmxlIGNvZGVjcyBvbiBkaXNjb25uZWN0IHNvIHRoYXQgaWYgdGhlIG5leHQgY29ubmVjdGlvbiBoYXMgXCJOZWdvdGlhdGVDb2RlY3NcIiBvblxuICAgICAgICAgICAgLy8gdGhlbiBhbGwgY29kZWNzIGNhbiBiZSBuZWdvdGlhdGVkXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5nZXRTZXR0aW5nT3B0aW9uKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMpLm9wdGlvbnMgPVxuICAgICAgICAgICAgICAgIEJyb3dzZXJVdGlscy5nZXRTdXBwb3J0ZWRWaWRlb0NvZGVjcygpO1xuICAgICAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25EaXNjb25uZWN0KGRpc2Nvbm5lY3RNZXNzYWdlLCBhbGxvd0NsaWNrVG9SZWNvbm5lY3QpO1xuICAgICAgICAgICAgdGhpcy5hZmtDb250cm9sbGVyLnN0b3BBZmtXYXJuaW5nVGltZXIoKTtcbiAgICAgICAgICAgIC8vIHN0b3Agc2VuZGluZyBzdGF0cyBvbiBpbnRlcnZhbCBpZiB3ZSBoYXZlIGNsb3NlZCBvdXIgY29ubmVjdGlvblxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHNUaW1lckhhbmRsZSAmJiB0aGlzLnN0YXRzVGltZXJIYW5kbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMuc3RhdHNUaW1lckhhbmRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyByZXNldCB0aGUgc3RyZWFtIHF1YWxpdHkgaWNvbi5cbiAgICAgICAgICAgIHRoaXMuc2V0VmlkZW9FbmNvZGVyQXZnUVAoMCk7XG4gICAgICAgICAgICAvLyB1bnJlZ2lzdGVyIGFsbCBpbnB1dCBkZXZpY2UgZXZlbnQgaGFuZGxlcnMgb24gZGlzY29ubmVjdFxuICAgICAgICAgICAgdGhpcy5zZXRUb3VjaElucHV0RW5hYmxlZChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnNldE1vdXNlSW5wdXRFbmFibGVkKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuc2V0S2V5Ym9hcmRJbnB1dEVuYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5zZXRHYW1lUGFkSW5wdXRFbmFibGVkKGZhbHNlKTtcbiAgICAgICAgICAgIGlmICh3aWxsVHJ5UmVjb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgLy8gbmVlZCBhIHNtYWxsIGRlbGF5IGhlcmUgdG8gcHJldmVudCByZWNvbm5lY3Qgc3BhbW1pbmdcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0Kys7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9SZWNvbm5lY3QoZXZlbnQucmVhc29uKTtcbiAgICAgICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHNldCB1cCB0aGUgZmluYWwgd2ViUnRjIHBsYXllciBjb250cm9sbGVyIG1ldGhvZHMgZnJvbSB3aXRoaW4gb3VyIGFwcGxpY2F0aW9uIHNvIGEgY29ubmVjdGlvbiBjYW4gYmUgYWN0aXZhdGVkXG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyID0gbmV3IFNlbmRNZXNzYWdlQ29udHJvbGxlcih0aGlzLmRhdGFDaGFubmVsU2VuZGVyLCB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyKTtcbiAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXNDb250cm9sbGVyID0gbmV3IFRvU3RyZWFtZXJNZXNzYWdlc0NvbnRyb2xsZXIodGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXJzKCk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucG9wdWxhdGVEZWZhdWx0UHJvdG9jb2woKTtcbiAgICAgICAgdGhpcy5pbnB1dENsYXNzZXNGYWN0b3J5ID0gbmV3IElucHV0Q2xhc3Nlc0ZhY3RvcnkodGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlciwgdGhpcy52aWRlb1BsYXllciwgdGhpcy5jb29yZGluYXRlQ29udmVydGVyKTtcbiAgICAgICAgdGhpcy5pc1VzaW5nU0ZVID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNVc2luZ1NWQyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzUXVhbGl0eUNvbnRyb2xsZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcmVmZXJyZWRDb2RlYyA9ICcnO1xuICAgICAgICB0aGlzLmVuYWJsZUF1dG9SZWNvbm5lY3QgPSB0cnVlO1xuICAgICAgICB0aGlzLmZvcmNlUmVjb25uZWN0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVjb25uZWN0QXR0ZW1wdCA9IDA7XG4gICAgICAgIHRoaXMuaXNSZWNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb25maWcuX2FkZE9uT3B0aW9uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQsIChzdHJlYW1lcmlkKSA9PiB7XG4gICAgICAgICAgICBpZiAoc3RyZWFtZXJpZCA9PT0gdW5kZWZpbmVkIHx8IHN0cmVhbWVyaWQgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGN1cnJlbnQgcGVlciBjb25uZWN0aW9uIGFuZCBjcmVhdGUgYSBuZXcgb25lXG4gICAgICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5wZWVyQ29ubmVjdGlvbi5jbG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIuY3JlYXRlUGVlckNvbm5lY3Rpb24odGhpcy5wZWVyQ29uZmlnLCB0aGlzLnByZWZlcnJlZENvZGVjKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlZFN0cmVhbSA9IHN0cmVhbWVyaWQ7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gTWVzc2FnZUhlbHBlcnMuY3JlYXRlTWVzc2FnZShNZXNzYWdlcy5zdWJzY3JpYmUsIHsgc3RyZWFtZXJJZDogc3RyZWFtZXJpZCB9KTtcbiAgICAgICAgICAgIHRoaXMucHJvdG9jb2wuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZy5fYWRkT25PcHRpb25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSwgKHByZWZlcnJlZFF1YWxpdHkpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVmZXJyZWRRdWFsaXR5ID09PSB1bmRlZmluZWQgfHwgcHJlZmVycmVkUXVhbGl0eSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVXNpbmdTVkMpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2VyIGlzIHVzaW5nIFNWQyBzbyBzZWxlY3RlZCBxdWFsaXR5IHdpbGwgYmUgb2YgdGhlIGZvcm0gU3hUeShoKS4gSnVzdCBleHRyYWN0IHRoZSB4IGFuZCB5IG51bWJlcnNcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gTWVzc2FnZUhlbHBlcnMuY3JlYXRlTWVzc2FnZShNZXNzYWdlcy5sYXllclByZWZlcmVuY2UsIHtcbiAgICAgICAgICAgICAgICAgICAgc3BhdGlhbExheWVyOiArcHJlZmVycmVkUXVhbGl0eVsxXSAtIDEsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBvcmFsTGF5ZXI6ICtwcmVmZXJyZWRRdWFsaXR5WzNdIC0gMVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlciBpcyBub3QgdXNpbmcgU1ZDIHNvIHRoZSBzZWxlY3RlZCBxdWFsaXR5IHdpbGwgYmUgZWl0aGVyIExvdywgTWVkaXVtIG9yIEhpZ2ggc28gd2UgZXh0cmFjdCB0aGUgYXBwcm9wcmlhdGUgc3BhdGlhbCBsYXllciBpbmRleFxuICAgICAgICAgICAgICAgIGNvbnN0IGFsbFF1YWxpdGllcyA9IHRoaXMuY29uZmlnLmdldFNldHRpbmdPcHRpb24oT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRRdWFsaXR5KS5vcHRpb25zO1xuICAgICAgICAgICAgICAgIGNvbnN0IHF1YWxpdHlJbmRleCA9IGFsbFF1YWxpdGllcy5pbmRleE9mKHByZWZlcnJlZFF1YWxpdHkpO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBNZXNzYWdlSGVscGVycy5jcmVhdGVNZXNzYWdlKE1lc3NhZ2VzLmxheWVyUHJlZmVyZW5jZSwge1xuICAgICAgICAgICAgICAgICAgICBzcGF0aWFsTGF5ZXI6IHF1YWxpdHlJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgdGVtcG9yYWxMYXllcjogMFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm90b2NvbC5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0VmlkZW9FbmNvZGVyQXZnUVAoLTEpO1xuICAgICAgICB0aGlzLnNpZ25hbGxpbmdVcmxCdWlsZGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2lnbmFsbGluZ1NlcnZlclVybCA9IHRoaXMuY29uZmlnLmdldFRleHRTZXR0aW5nVmFsdWUoVGV4dFBhcmFtZXRlcnMuU2lnbmFsbGluZ1NlcnZlclVybCk7XG4gICAgICAgICAgICByZXR1cm4gc2lnbmFsbGluZ1NlcnZlclVybDtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVzdHJveXMgdGhlIHZpZGVvIHBsYXllciBhbmQgbWFrZXMgc3VyZSByZXNvdXJjZXMgYXJlIGZyZWVkLiBUaGlzIGhlbHBzIHRvIHByZXZlbnQgdGhlIGlzc3VlIGluIGNocm9tZVxuICAgICAqIHdoZXJlIGl0IHJlZnVzZXMgdG8gbWFrZSBuZXcgdmlkZW8gcGxheWVycy5cbiAgICAgKi9cbiAgICBkZXN0cm95VmlkZW9QbGF5ZXIoKSB7XG4gICAgICAgIHRoaXMudmlkZW9QbGF5ZXIuZGVzdHJveSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkXG4gICAgICogQHBhcmFtIGV2ZW50IC0gTWVzc2FnZSBFdmVudFxuICAgICAqL1xuICAgIGhhbmRsZU9uTWVzc2FnZShldmVudCkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gbmV3IFVpbnQ4QXJyYXkoZXZlbnQuZGF0YSk7XG4gICAgICAgIExvZ2dlci5JbmZvKCdNZXNzYWdlIGluY29taW5nOicgKyBtZXNzYWdlKTtcbiAgICAgICAgLy90cnkge1xuICAgICAgICBjb25zdCBtZXNzYWdlVHlwZSA9IHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIuZnJvbVN0cmVhbWVyTWVzc2FnZXMuZ2V0KG1lc3NhZ2VbMF0pO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLmZyb21TdHJlYW1lckhhbmRsZXJzLmdldChtZXNzYWdlVHlwZSkoZXZlbnQuZGF0YSk7XG4gICAgICAgIC8vfSBjYXRjaCAoZSkge1xuICAgICAgICAvL0xvZ2dlci5FcnJvcihMb2dnZXIuR2V0U3RhY2tUcmFjZSgpLCBgQ3VzdG9tIGRhdGEgY2hhbm5lbCBtZXNzYWdlIHdpdGggbWVzc2FnZSB0eXBlIHRoYXQgaXMgdW5rbm93biB0byB0aGUgUGl4ZWwgU3RyZWFtaW5nIHByb3RvY29sLiBEb2VzIHlvdXIgUGl4ZWxTdHJlYW1pbmdQcm90b2NvbCBuZWVkIHVwZGF0aW5nPyBUaGUgbWVzc2FnZSB0eXBlIHdhczogJHttZXNzYWdlWzBdfWApO1xuICAgICAgICAvL31cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgbWVzc2FnZSBhbGwgaGFuZGxlcnNcbiAgICAgKi9cbiAgICByZWdpc3Rlck1lc3NhZ2VIYW5kbGVycygpIHtcbiAgICAgICAgLy8gRnJvbSBTdHJlYW1lclxuICAgICAgICAvLyBNZXNzYWdlIGV2ZW50cyBmcm9tIHRoZSBzdHJlYW1lciBoYXZlIGEgZGF0YSB0eXBlIG9mIEFycmF5QnVmZmVyIGFzIHdlIGZvcmNlIHRoaXMgdHlwZSBpbiB0aGUgRGF0YWNoYW5uZWxDb250cm9sbGVyXG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ1F1YWxpdHlDb250cm9sT3duZXJzaGlwJywgKGRhdGEpID0+IHRoaXMub25RdWFsaXR5Q29udHJvbE93bmVyc2hpcChkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ1Jlc3BvbnNlJywgKGRhdGEpID0+IHRoaXMucmVzcG9uc2VDb250cm9sbGVyLm9uUmVzcG9uc2UoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdDb21tYW5kJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25Db21tYW5kKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnRnJlZXplRnJhbWUnLCAoZGF0YSkgPT4gdGhpcy5vbkZyZWV6ZUZyYW1lTWVzc2FnZShkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ1VuZnJlZXplRnJhbWUnLCAoKSA9PiB0aGlzLmludmFsaWRhdGVGcmVlemVGcmFtZUFuZEVuYWJsZVZpZGVvKCkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdWaWRlb0VuY29kZXJBdmdRUCcsIChkYXRhKSA9PiB0aGlzLmhhbmRsZVZpZGVvRW5jb2RlckF2Z1FQKGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnTGF0ZW5jeVRlc3QnLCAoZGF0YSkgPT4gdGhpcy5oYW5kbGVMYXRlbmN5VGVzdFJlc3VsdChkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ0RhdGFDaGFubmVsTGF0ZW5jeVRlc3QnLCAoZGF0YSkgPT4gdGhpcy5oYW5kbGVEYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzcG9uc2UoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdJbml0aWFsU2V0dGluZ3MnLCAoZGF0YSkgPT4gdGhpcy5oYW5kbGVJbml0aWFsU2V0dGluZ3MoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdGaWxlRXh0ZW5zaW9uJywgKGRhdGEpID0+IHRoaXMub25GaWxlRXh0ZW5zaW9uKGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnRmlsZU1pbWVUeXBlJywgKGRhdGEpID0+IHRoaXMub25GaWxlTWltZVR5cGUoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdGaWxlQ29udGVudHMnLCAoZGF0YSkgPT4gdGhpcy5vbkZpbGVDb250ZW50cyhkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ1Rlc3RFY2hvJywgKCkgPT4ge1xuICAgICAgICAgICAgLyogRG8gbm90aGluZyAqL1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnSW5wdXRDb250cm9sT3duZXJzaGlwJywgKGRhdGEpID0+IHRoaXMub25JbnB1dENvbnRyb2xPd25lcnNoaXAoZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIsICdHYW1lcGFkUmVzcG9uc2UnLCAoZGF0YSkgPT4gdGhpcy5vbkdhbWVwYWRSZXNwb25zZShkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciwgJ011bHRpcGxleGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgLyogRG8gbm90aGluZyBhcyB0aGlzIG1lc3NhZ2UgdHlwZSBpcyB1c2VkIG9ubHkgYnkgdGhlIFNGVSAqL1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCAnUHJvdG9jb2wnLCAoZGF0YSkgPT4gdGhpcy5vblByb3RvY29sTWVzc2FnZShkYXRhKSk7XG4gICAgICAgIC8vIFRvIFN0cmVhbWVyXG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdJRnJhbWVSZXF1ZXN0JywgKCkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdJRnJhbWVSZXF1ZXN0JykpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnUmVxdWVzdFF1YWxpdHlDb250cm9sJywgKCkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdSZXF1ZXN0UXVhbGl0eUNvbnRyb2wnKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdGcHNSZXF1ZXN0JywgKCkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdGcHNSZXF1ZXN0JykpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnQXZlcmFnZUJpdHJhdGVSZXF1ZXN0JywgKCkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdBdmVyYWdlQml0cmF0ZVJlcXVlc3QnKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdTdGFydFN0cmVhbWluZycsICgpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignU3RhcnRTdHJlYW1pbmcnKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdTdG9wU3RyZWFtaW5nJywgKCkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdTdG9wU3RyZWFtaW5nJykpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnTGF0ZW5jeVRlc3QnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdMYXRlbmN5VGVzdCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1JlcXVlc3RJbml0aWFsU2V0dGluZ3MnLCAoKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1JlcXVlc3RJbml0aWFsU2V0dGluZ3MnKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdUZXN0RWNobycsICgpID0+IHtcbiAgICAgICAgICAgIC8qIERvIG5vdGhpbmcgKi9cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdVSUludGVyYWN0aW9uJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignVUlJbnRlcmFjdGlvbicsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ0NvbW1hbmQnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdDb21tYW5kJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnVGV4dGJveEVudHJ5JywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignVGV4dGJveEVudHJ5JywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnS2V5RG93bicsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ0tleURvd24nLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdLZXlVcCcsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ0tleVVwJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnS2V5UHJlc3MnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdLZXlQcmVzcycsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ01vdXNlRW50ZXInLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdNb3VzZUVudGVyJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnTW91c2VMZWF2ZScsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ01vdXNlTGVhdmUnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdNb3VzZURvd24nLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdNb3VzZURvd24nLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdNb3VzZVVwJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignTW91c2VVcCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ01vdXNlTW92ZScsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ01vdXNlTW92ZScsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ01vdXNlV2hlZWwnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdNb3VzZVdoZWVsJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnTW91c2VEb3VibGUnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdNb3VzZURvdWJsZScsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1RvdWNoU3RhcnQnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdUb3VjaFN0YXJ0JywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnVG91Y2hFbmQnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdUb3VjaEVuZCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1RvdWNoTW92ZScsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1RvdWNoTW92ZScsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ0dhbWVwYWRDb25uZWN0ZWQnLCAoKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ0dhbWVwYWRDb25uZWN0ZWQnKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdHYW1lcGFkQnV0dG9uUHJlc3NlZCcsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ0dhbWVwYWRCdXR0b25QcmVzc2VkJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnR2FtZXBhZEJ1dHRvblJlbGVhc2VkJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignR2FtZXBhZEJ1dHRvblJlbGVhc2VkJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnR2FtZXBhZEFuYWxvZycsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ0dhbWVwYWRBbmFsb2cnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdHYW1lcGFkRGlzY29ubmVjdGVkJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignR2FtZXBhZERpc2Nvbm5lY3RlZCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1hSRXllVmlld3MnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdYUkV5ZVZpZXdzJywgZGF0YSkpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnWFJITURUcmFuc2Zvcm0nLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdYUkhNRFRyYW5zZm9ybScsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1hSQ29udHJvbGxlclRyYW5zZm9ybScsIChkYXRhKSA9PiB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIoJ1hSQ29udHJvbGxlclRyYW5zZm9ybScsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1hSU3lzdGVtJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignWFJTeXN0ZW0nLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdYUkJ1dHRvblRvdWNoZWQnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdYUkJ1dHRvblRvdWNoZWQnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdYUkJ1dHRvblRvdWNoUmVsZWFzZWQnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdYUkJ1dHRvblRvdWNoUmVsZWFzZWQnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdYUkJ1dHRvblByZXNzZWQnLCAoZGF0YSkgPT4gdGhpcy5zZW5kTWVzc2FnZUNvbnRyb2xsZXIuc2VuZE1lc3NhZ2VUb1N0cmVhbWVyKCdYUkJ1dHRvblByZXNzZWQnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdYUkJ1dHRvblJlbGVhc2VkJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignWFJCdXR0b25SZWxlYXNlZCcsIGRhdGEpKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lciwgJ1hSQW5hbG9nJywgKGRhdGEpID0+IHRoaXMuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcignWFJBbmFsb2cnLCBkYXRhKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIucmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsICdDaGFubmVsUmVsYXlTdGF0dXMnLCAoKSA9PiB7XG4gICAgICAgICAgICAvKiBEbyBub3RoaW5nIGFzIHRoaXMgbWVzc2FnZSB0eXBlIGlzIHVzZWQgb25seSBieSB0aGUgU0ZVICovXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLCAnTXVsdGlwbGV4ZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAvKiBEbyBub3RoaW5nIGFzIHRoaXMgbWVzc2FnZSB0eXBlIGlzIHVzZWQgb25seSBieSB0aGUgU0ZVICovXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY3RpdmF0ZSB0aGUgbG9naWMgYXNzb2NpYXRlZCB3aXRoIGEgY29tbWFuZCBmcm9tIFVFXG4gICAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBvbkNvbW1hbmQobWVzc2FnZSkge1xuICAgICAgICBMb2dnZXIuSW5mbygnRGF0YUNoYW5uZWxSZWNlaXZlTWVzc2FnZVR5cGUuQ29tbWFuZCcpO1xuICAgICAgICBjb25zdCBjb21tYW5kQXNTdHJpbmcgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi0xNicpLmRlY29kZShtZXNzYWdlLnNsaWNlKDEpKTtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGEgQ2hhbm5lbCBDb21tYW5kOiAnICsgY29tbWFuZEFzU3RyaW5nKTtcbiAgICAgICAgY29uc3QgY29tbWFuZCA9IEpTT04ucGFyc2UoY29tbWFuZEFzU3RyaW5nKTtcbiAgICAgICAgLy8gSGFuZGxlIFwib25TY3JlZW5LZXlib2FyZFwiIGV2ZW50XG4gICAgICAgIGlmIChjb21tYW5kLmNvbW1hbmQgPT09ICdvblNjcmVlbktleWJvYXJkJykge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVPblNjcmVlbktleWJvYXJkQ29tbWFuZChjb21tYW5kKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBoYW5kbGVPblNjcmVlbktleWJvYXJkQ29tbWFuZChjb21tYW5kKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgIHNob3dPblNjcmVlbktleWJvYXJkOiAoX2EgPSBjb21tYW5kLnNob3dPblNjcmVlbktleWJvYXJkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0cnVlLFxuICAgICAgICAgICAgeDogKF9iID0gY29tbWFuZC54KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwLFxuICAgICAgICAgICAgeTogKF9jID0gY29tbWFuZC55KSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwLFxuICAgICAgICAgICAgY29udGVudHM6IChfZCA9IGNvbW1hbmQuY29udGVudHMpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6ICcnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgU2hvd09uU2NyZWVuS2V5Ym9hcmRFdmVudChkYXRhKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgYSBwcm90b2NvbCBtZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIHN0cmVhbWVyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgZGF0YSBmcm9tIHRoZSBzdHJlYW1lclxuICAgICAqL1xuICAgIG9uUHJvdG9jb2xNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3RvY29sU3RyaW5nID0gbmV3IFRleHREZWNvZGVyKCd1dGYtMTYnKS5kZWNvZGUobWVzc2FnZS5zbGljZSgxKSk7XG4gICAgICAgICAgICBjb25zdCBwcm90b2NvbEpTT04gPSBKU09OLnBhcnNlKHByb3RvY29sU3RyaW5nKTtcbiAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvY29sSlNPTiwgJ0RpcmVjdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKCdNYWxmb3JtZWQgcHJvdG9jb2wgcmVjZWl2ZWQuIEVuc3VyZSB0aGUgcHJvdG9jb2wgbWVzc2FnZSBjb250YWlucyBhIGRpcmVjdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gcHJvdG9jb2xKU09OLkRpcmVjdGlvbjtcbiAgICAgICAgICAgIGRlbGV0ZSBwcm90b2NvbEpTT04uRGlyZWN0aW9uO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oYFJlY2VpdmVkIG5ldyAke2RpcmVjdGlvbiA9PSBNZXNzYWdlRGlyZWN0aW9uLkZyb21TdHJlYW1lciA/ICdGcm9tU3RyZWFtZXInIDogJ1RvU3RyZWFtZXInfSBwcm90b2NvbC4gVXBkYXRpbmcgZXhpc3RpbmcgcHJvdG9jb2wuLi5gKTtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKHByb3RvY29sSlNPTikuZm9yRWFjaCgobWVzc2FnZVR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gcHJvdG9jb2xKU09OW21lc3NhZ2VUeXBlXTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGRpcmVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lcjpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIG1lc3NhZ2UgY29udGFpbnMgYWxsIHRoZSByZWxldmFudCBwYXJhbXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1lc3NhZ2UsICdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBUb1N0cmVhbWVyLT4ke21lc3NhZ2VUeXBlfSBwcm90b2NvbCBkZWZpbml0aW9uIHdhcyBtYWxmb3JtZWQgYXMgaXQgZGlkbid0IGNvbnRhaW4gYXQgbGVhc3QgYW4gaWRcXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uIHdhczogJHtKU09OLnN0cmluZ2lmeShtZXNzYWdlLCBudWxsLCAyKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gaW4gYSBmb3JFYWNoIGlzIGVxdWl2YWxlbnQgdG8gYSBjb250aW51ZSBpbiBhIG5vcm1hbCBmb3IgbG9vcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVFNS4xIGFuZCBVRTUuMiBkb24ndCBzZW5kIGEgc3RydWN0dXJlIGZvciB0aGVzZSBtZXNzYWdlIHR5cGVzLCBidXQgdGhleSBhY3R1YWxseSBkbyBoYXZlIGEgc3RydWN0dXJlIHNvIGlnbm9yZSB1cGRhdGluZyB0aGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZVR5cGUgPT09ICdVSUludGVyYWN0aW9uJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlID09PSAnQ29tbWFuZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZSA9PT0gJ0xhdGVuY3lUZXN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQobWVzc2FnZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UndmUgcmVnaXN0ZXJlZCBhIGhhbmRsZXIgZm9yIHRoaXMgbWVzc2FnZSB0eXBlIHdlIGNhbiBhZGQgaXQgdG8gb3VyIHN1cHBvcnRlZCBtZXNzYWdlcy4gaWUgcmVnaXN0ZXJNZXNzYWdlSGFuZGxlciguLi4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVyTWVzc2FnZXMuc2V0KG1lc3NhZ2VUeXBlLCBtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcihgVGhlcmUgd2FzIG5vIHJlZ2lzdGVyZWQgaGFuZGxlciBmb3IgXCIke21lc3NhZ2VUeXBlfVwiIC0gdHJ5IGFkZGluZyBvbmUgdXNpbmcgcmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihNZXNzYWdlRGlyZWN0aW9uLlRvU3RyZWFtZXIsIFwiJHttZXNzYWdlVHlwZX1cIiwgbXlIYW5kbGVyKWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXI6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBtZXNzYWdlIGNvbnRhaW5zIGFsbCB0aGUgcmVsZXZhbnQgcGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtZXNzYWdlLCAnaWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcihgRnJvbVN0cmVhbWVyLT4ke21lc3NhZ2VUeXBlfSBwcm90b2NvbCBkZWZpbml0aW9uIHdhcyBtYWxmb3JtZWQgYXMgaXQgZGlkbid0IGNvbnRhaW4gYXQgbGVhc3QgYW4gaWRcXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uIHdhczogJHtKU09OLnN0cmluZ2lmeShtZXNzYWdlLCBudWxsLCAyKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gaW4gYSBmb3JFYWNoIGlzIGVxdWl2YWxlbnQgdG8gYSBjb250aW51ZSBpbiBhIG5vcm1hbCBmb3IgbG9vcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLmZyb21TdHJlYW1lckhhbmRsZXJzLmdldChtZXNzYWdlVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSd2ZSByZWdpc3RlcmVkIGEgaGFuZGxlciBmb3IgdGhpcyBtZXNzYWdlIHR5cGUuIGllIHJlZ2lzdGVyTWVzc2FnZUhhbmRsZXIoLi4uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIuZnJvbVN0cmVhbWVyTWVzc2FnZXMuc2V0KG1lc3NhZ2UuaWQsIG1lc3NhZ2VUeXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcihgVGhlcmUgd2FzIG5vIHJlZ2lzdGVyZWQgaGFuZGxlciBmb3IgXCIke21lc3NhZ2V9XCIgLSB0cnkgYWRkaW5nIG9uZSB1c2luZyByZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKE1lc3NhZ2VEaXJlY3Rpb24uRnJvbVN0cmVhbWVyLCBcIiR7bWVzc2FnZVR5cGV9XCIsIG15SGFuZGxlcilgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkVycm9yKGBVbmtub3duIGRpcmVjdGlvbjogJHtkaXJlY3Rpb259YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBPbmNlIHRoZSBwcm90b2NvbCBoYXMgYmVlbiByZWNlaXZlZCwgd2UgY2FuIHNlbmQgb3VyIGNvbnRyb2wgbWVzc2FnZXNcbiAgICAgICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzQ29udHJvbGxlci5TZW5kUmVxdWVzdEluaXRpYWxTZXR0aW5ncygpO1xuICAgICAgICAgICAgdGhpcy50b1N0cmVhbWVyTWVzc2FnZXNDb250cm9sbGVyLlNlbmRSZXF1ZXN0UXVhbGl0eUNvbnRyb2woKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBhbiBpbnB1dCBjb250cm9sIG1lc3NhZ2Ugd2hlbiBpdCBpcyByZWNlaXZlZCBmcm9tIHRoZSBzdHJlYW1lclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBpbnB1dCBjb250cm9sIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBvbklucHV0Q29udHJvbE93bmVyc2hpcChtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShtZXNzYWdlKTtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGFDaGFubmVsUmVjZWl2ZU1lc3NhZ2VUeXBlLklucHV0Q29udHJvbE93bmVyc2hpcCcpO1xuICAgICAgICBjb25zdCBpbnB1dENvbnRyb2xPd25lcnNoaXAgPSBuZXcgQm9vbGVhbih2aWV3WzFdKS52YWx1ZU9mKCk7XG4gICAgICAgIExvZ2dlci5JbmZvKGBSZWNlaXZlZCBpbnB1dCBjb250cm9sbGVyIG1lc3NhZ2UgLSB3aWxsIHlvdXIgaW5wdXQgY29udHJvbCB0aGUgc3RyZWFtOiAke2lucHV0Q29udHJvbE93bmVyc2hpcH1gKTtcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25JbnB1dENvbnRyb2xPd25lcnNoaXAoaW5wdXRDb250cm9sT3duZXJzaGlwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgICAqL1xuICAgIG9uR2FtZXBhZFJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VTdHJpbmcgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi0xNicpLmRlY29kZShtZXNzYWdlLnNsaWNlKDEpKTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VKU09OID0gSlNPTi5wYXJzZShyZXNwb25zZVN0cmluZyk7XG4gICAgICAgIHRoaXMuZ2FtZVBhZENvbnRyb2xsZXIub25HYW1lcGFkUmVzcG9uc2VSZWNlaXZlZChyZXNwb25zZUpTT04uY29udHJvbGxlcklkKTtcbiAgICB9XG4gICAgb25BZmtUcmlnZ2VyZWQoKSB7XG4gICAgICAgIHRoaXMuYWZrQ29udHJvbGxlci5vbkFma0NsaWNrKCk7XG4gICAgICAgIC8vIGlmIHRoZSBzdHJlYW0gaXMgcGF1c2VkIHBsYXkgaXQsIGlmIHdlIGNhblxuICAgICAgICBpZiAodGhpcy52aWRlb1BsYXllci5pc1BhdXNlZCgpICYmIHRoaXMudmlkZW9QbGF5ZXIuaGFzVmlkZW9Tb3VyY2UoKSkge1xuICAgICAgICAgICAgdGhpcy5wbGF5U3RyZWFtKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHdoZXRoZXIgd2Ugc2hvdWxkIHRpbWVvdXQgd2hlbiBhZmsuXG4gICAgICogQHBhcmFtIGFma0VuYWJsZWQgSWYgdHJ1ZSB3ZSB0aW1lb3V0IHdoZW4gaWRsZSBmb3Igc29tZSBnaXZlbiBhbW91bnQgb2YgdGltZS5cbiAgICAgKi9cbiAgICBzZXRBZmtFbmFibGVkKGFma0VuYWJsZWQpIHtcbiAgICAgICAgaWYgKGFma0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMub25BZmtUcmlnZ2VyZWQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWZrQ29udHJvbGxlci5zdG9wQWZrV2FybmluZ1RpbWVyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQXR0ZW1wdCBhIHJlY29ubmVjdGlvbiB0byB0aGUgc2lnbmFsbGluZyBzZXJ2ZXIuIE1hbnVhbCB0cmlnZ2VyXG4gICAgICovXG4gICAgdHJ5UmVjb25uZWN0KG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5mb3JjZVJlY29ubmVjdCA9IHRydWU7XG4gICAgICAgIHRoaXMuZG9SZWNvbm5lY3QobWVzc2FnZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERvZXMgdGhlIGFjdHVhbCByZWNvbm5lY3Qgd29yay4gVXNlZCBieSB0aGUgYXV0byByZWNvbm5lY3QgZmVhdHVyZSB0byBza2lwIHRoZSBtYW51YWwgZmxhZy5cbiAgICAgKi9cbiAgICBkb1JlY29ubmVjdChtZXNzYWdlKSB7XG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHdlYlNvY2tldENvbnRyb2xsZXIgcmV0dXJuIGltbWVkaWF0ZWx5IG9yIHRoaXMgd2lsbCBub3Qgd29ya1xuICAgICAgICBpZiAoIXRoaXMucHJvdG9jb2wpIHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdUaGlzIHBsYXllciBoYXMgbm8gcHJvdG9jb2wgY29ubmVjdGlvbi4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmlzUmVjb25uZWN0aW5nID0gdHJ1ZTtcbiAgICAgICAgLy8gaWYgdGhlIGNvbm5lY3Rpb24gaXMgb3BlbiwgZmlyc3QgY2xvc2UgaXQgYW5kIGZvcmNlIGEgcmVjb25uZWN0LlxuICAgICAgICBpZiAodGhpcy5wcm90b2NvbC5pc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZm9yY2VSZWNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RNZXNzYWdlID0gYCR7bWVzc2FnZX0gUmVjb25uZWN0aW5nLmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNsb3NlU2lnbmFsaW5nU2VydmVyKG1lc3NhZ2UsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25XZWJSdGNBdXRvQ29ubmVjdCgpO1xuICAgICAgICAgICAgdGhpcy5jb25uZWN0VG9TaWduYWxsaW5nU2VydmVyKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9hZHMgYSBmcmVlemUgZnJhbWUgaWYgaXQgaXMgcmVxdWlyZWQgb3RoZXJ3aXNlIHNob3dzIHRoZSBwbGF5IG92ZXJsYXlcbiAgICAgKi9cbiAgICBsb2FkRnJlZXplRnJhbWVPclNob3dQbGF5T3ZlcmxheSgpIHtcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5kaXNwYXRjaEV2ZW50KG5ldyBMb2FkRnJlZXplRnJhbWVFdmVudCh7XG4gICAgICAgICAgICBzaG91bGRTaG93UGxheU92ZXJsYXk6IHRoaXMuc2hvdWxkU2hvd1BsYXlPdmVybGF5LFxuICAgICAgICAgICAgaXNWYWxpZDogdGhpcy5mcmVlemVGcmFtZUNvbnRyb2xsZXIudmFsaWQsXG4gICAgICAgICAgICBqcGVnRGF0YTogdGhpcy5mcmVlemVGcmFtZUNvbnRyb2xsZXIuanBlZ1xuICAgICAgICB9KSk7XG4gICAgICAgIGlmICh0aGlzLnNob3VsZFNob3dQbGF5T3ZlcmxheSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ3Nob3dpbmcgcGxheSBvdmVybGF5Jyk7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZVBsYXllclN0eWxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBMb2dnZXIuSW5mbygnc2hvd2luZyBmcmVlemUgZnJhbWUnKTtcbiAgICAgICAgICAgIHRoaXMuZnJlZXplRnJhbWVDb250cm9sbGVyLnNob3dGcmVlemVGcmFtZSgpO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy52aWRlb1BsYXllci5zZXRWaWRlb0VuYWJsZWQoZmFsc2UpO1xuICAgICAgICB9LCB0aGlzLmZyZWV6ZUZyYW1lQ29udHJvbGxlci5mcmVlemVGcmFtZURlbGF5KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJvY2VzcyB0aGUgZnJlZXplIGZyYW1lIGFuZCBsb2FkIGl0XG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIGZyZWV6ZSBmcmFtZSBkYXRhIGluIGJ5dGVzXG4gICAgICovXG4gICAgb25GcmVlemVGcmFtZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBMb2dnZXIuSW5mbygnRGF0YUNoYW5uZWxSZWNlaXZlTWVzc2FnZVR5cGUuRnJlZXplRnJhbWUnKTtcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lQ29udHJvbGxlci5wcm9jZXNzRnJlZXplRnJhbWVNZXNzYWdlKHZpZXcsICgpID0+IHRoaXMubG9hZEZyZWV6ZUZyYW1lT3JTaG93UGxheU92ZXJsYXkoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEVuYWJsZSB0aGUgdmlkZW8gYWZ0ZXIgaGlkaW5nIGEgZnJlZXplIGZyYW1lXG4gICAgICovXG4gICAgaW52YWxpZGF0ZUZyZWV6ZUZyYW1lQW5kRW5hYmxlVmlkZW8oKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdEYXRhQ2hhbm5lbFJlY2VpdmVNZXNzYWdlVHlwZS5GcmVlemVGcmFtZScpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgSGlkZUZyZWV6ZUZyYW1lRXZlbnQoKSk7XG4gICAgICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lQ29udHJvbGxlci5oaWRlRnJlZXplRnJhbWUoKTtcbiAgICAgICAgfSwgdGhpcy5mcmVlemVGcmFtZUNvbnRyb2xsZXIuZnJlZXplRnJhbWVEZWxheSk7XG4gICAgICAgIGlmICh0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvRWxlbWVudCgpKSB7XG4gICAgICAgICAgICB0aGlzLnZpZGVvUGxheWVyLnNldFZpZGVvRW5hYmxlZCh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmVwIGRhdGFjaGFubmVsIGRhdGEgZm9yIHByb2Nlc3NpbmcgZmlsZSBleHRlbnNpb25cbiAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZmlsZSBleHRlbnNpb24gZGF0YVxuICAgICAqL1xuICAgIG9uRmlsZUV4dGVuc2lvbihkYXRhKSB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgRmlsZVV0aWwuc2V0RXh0ZW5zaW9uRnJvbUJ5dGVzKHZpZXcsIHRoaXMuZmlsZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByZXAgZGF0YWNoYW5uZWwgZGF0YSBmb3IgcHJvY2Vzc2luZyB0aGUgZmlsZSBtaW1lIHR5cGVcbiAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZmlsZSBtaW1lIHR5cGUgZGF0YVxuICAgICAqL1xuICAgIG9uRmlsZU1pbWVUeXBlKGRhdGEpIHtcbiAgICAgICAgY29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICAgICAgICBGaWxlVXRpbC5zZXRNaW1lVHlwZUZyb21CeXRlcyh2aWV3LCB0aGlzLmZpbGUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcmVwIGRhdGFjaGFubmVsIGRhdGEgZm9yIHByb2Nlc3NpbmcgdGhlIGZpbGUgY29udGVudHNcbiAgICAgKiBAcGFyYW0gZGF0YSB0aGUgZmlsZSBjb250ZW50cyBkYXRhXG4gICAgICovXG4gICAgb25GaWxlQ29udGVudHMoZGF0YSkge1xuICAgICAgICBjb25zdCB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgIEZpbGVVdGlsLnNldENvbnRlbnRzRnJvbUJ5dGVzKHZpZXcsIHRoaXMuZmlsZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBsYXlzIHRoZSBzdHJlYW0gYXVkaW8gYW5kIHZpZGVvIHNvdXJjZSBhbmQgc2V0cyB1cCBvdGhlciBwaWVjZXMgd2hpbGUgdGhlIHN0cmVhbSBzdGFydHNcbiAgICAgKi9cbiAgICBwbGF5U3RyZWFtKCkge1xuICAgICAgICBpZiAoIXRoaXMudmlkZW9QbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnQ291bGQgbm90IHBsYXkgdmlkZW8gc3RyZWFtIGJlY2F1c2UgdGhlIHZpZGVvIHBsYXllciB3YXMgbm90IGluaXRpYWxpemVkIGNvcnJlY3RseS4nO1xuICAgICAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5kaXNwYXRjaEV2ZW50KG5ldyBQbGF5U3RyZWFtRXJyb3JFdmVudCh7IG1lc3NhZ2UgfSkpO1xuICAgICAgICAgICAgTG9nZ2VyLkVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGNvbm5lY3Rpb25cbiAgICAgICAgICAgIHRoaXMuY2xvc2VTaWduYWxpbmdTZXJ2ZXIoJ1N0cmVhbSBub3QgaW5pdGlhbGl6ZWQgY29ycmVjdGx5JywgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy52aWRlb1BsYXllci5oYXNWaWRlb1NvdXJjZSgpKSB7XG4gICAgICAgICAgICBMb2dnZXIuV2FybmluZygnQ2Fubm90IHBsYXkgc3RyZWFtLCB0aGUgdmlkZW8gZWxlbWVudCBoYXMgbm8gc3JjT2JqZWN0IHRvIHBsYXkuJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRUb3VjaElucHV0RW5hYmxlZCh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLlRvdWNoSW5wdXQpKTtcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5kaXNwYXRjaEV2ZW50KG5ldyBQbGF5U3RyZWFtRXZlbnQoKSk7XG4gICAgICAgIGlmICh0aGlzLnN0cmVhbUNvbnRyb2xsZXIuYXVkaW9FbGVtZW50LnNyY09iamVjdCkge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRNdXRlZCA9IHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuU3RhcnRWaWRlb011dGVkKTtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlci5hdWRpb0VsZW1lbnQubXV0ZWQgPSBzdGFydE11dGVkO1xuICAgICAgICAgICAgaWYgKHN0YXJ0TXV0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYXlWaWRlbygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJlYW1Db250cm9sbGVyLmF1ZGlvRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAucGxheSgpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5VmlkZW8oKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKG9uUmVqZWN0ZWRSZWFzb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLkluZm8ob25SZWplY3RlZFJlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgIExvZ2dlci5JbmZvKCdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgYXV0b3BsYXlpbmcgdmlkZW8gd2l0aG91dCBpbnRlcmFjdGlvbiAtIHRvIHJlc29sdmUgdGhpcyB3ZSBhcmUgZ29pbmcgdG8gc2hvdyB0aGUgcGxheSBidXR0b24gb3ZlcmxheS4nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5kaXNwYXRjaEV2ZW50KG5ldyBQbGF5U3RyZWFtUmVqZWN0ZWRFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246IG9uUmVqZWN0ZWRSZWFzb25cbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wbGF5VmlkZW8oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3VsZFNob3dQbGF5T3ZlcmxheSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZyZWV6ZUZyYW1lQ29udHJvbGxlci5zaG93RnJlZXplRnJhbWUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGxheXMgdGhlIHZpZGVvIHN0cmVhbVxuICAgICAqL1xuICAgIHBsYXlWaWRlbygpIHtcbiAgICAgICAgLy8gaGFuZGxlIHBsYXkoKSB3aXRoIHByb21pc2UgYXMgaXQgaXMgYW4gYXN5bmNocm9ub3VzIGNhbGxcbiAgICAgICAgdGhpcy52aWRlb1BsYXllci5wbGF5KCkuY2F0Y2goKG9uUmVqZWN0ZWRSZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN0cmVhbUNvbnRyb2xsZXIuYXVkaW9FbGVtZW50LnNyY09iamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlci5hdWRpb0VsZW1lbnQucGF1c2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIExvZ2dlci5JbmZvKG9uUmVqZWN0ZWRSZWFzb24pO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJ0Jyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBhdXRvcGxheWluZyB2aWRlbyB3aXRob3V0IGludGVyYWN0aW9uIC0gdG8gcmVzb2x2ZSB0aGlzIHdlIGFyZSBnb2luZyB0byBzaG93IHRoZSBwbGF5IGJ1dHRvbiBvdmVybGF5LicpO1xuICAgICAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5kaXNwYXRjaEV2ZW50KG5ldyBQbGF5U3RyZWFtUmVqZWN0ZWRFdmVudCh7IHJlYXNvbjogb25SZWplY3RlZFJlYXNvbiB9KSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFbmFibGUgdGhlIHZpZGVvIHRvIHBsYXkgYXV0b21hdGljYWxseSBpZiBlbmFibGVBdXRvcGxheSBpcyB0cnVlXG4gICAgICovXG4gICAgYXV0b1BsYXlWaWRlb09yU2V0VXBQbGF5T3ZlcmxheSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuQXV0b1BsYXlWaWRlbykpIHtcbiAgICAgICAgICAgIC8vIGF0dGVtcHQgdG8gcGxheSB0aGUgdmlkZW9cbiAgICAgICAgICAgIHRoaXMucGxheVN0cmVhbSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVzaXplUGxheWVyU3R5bGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29ubmVjdCB0byB0aGUgU2lnbmFsaW5nIHNlcnZlclxuICAgICAqL1xuICAgIGNvbm5lY3RUb1NpZ25hbGxpbmdTZXJ2ZXIoKSB7XG4gICAgICAgIHRoaXMubG9jYWxseUNsb3NlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVuYWJsZUF1dG9SZWNvbm5lY3QgPSB0cnVlO1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RNZXNzYWdlID0gbnVsbDtcbiAgICAgICAgY29uc3Qgc2lnbmFsbGluZ1VybCA9IHRoaXMuc2lnbmFsbGluZ1VybEJ1aWxkZXIoKTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5jb25uZWN0KHNpZ25hbGxpbmdVcmwpO1xuICAgICAgICBjb25zdCBrZWVwYWxpdmVEZWxheSA9IHRoaXMuY29uZmlnLmdldE51bWVyaWNTZXR0aW5nVmFsdWUoTnVtZXJpY1BhcmFtZXRlcnMuS2VlcGFsaXZlRGVsYXkpO1xuICAgICAgICBpZiAoa2VlcGFsaXZlRGVsYXkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmtlZXBhbGl2ZSA9IG5ldyBLZWVwYWxpdmVNb25pdG9yKHRoaXMucHJvdG9jb2wsIGtlZXBhbGl2ZURlbGF5KTtcbiAgICAgICAgICAgIHRoaXMua2VlcGFsaXZlLm9uVGltZW91dCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcGluZyBmYWlscyBqdXN0IGRpc2Nvbm5lY3RcbiAgICAgICAgICAgICAgICBMb2dnZXIuRXJyb3IoYFByb3RvY29sIHRpbWVvdXRgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3RvY29sLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyB3aWxsIHN0YXJ0IHRoZSBoYW5kc2hha2UgdG8gdGhlIHNpZ25hbGxpbmcgc2VydmVyXG4gICAgICogQHBhcmFtIHBlZXJDb25maWcgIC0gUlRDIENvbmZpZ3VyYXRpb24gT3B0aW9ucyBmcm9tIHRoZSBTaWduYWxpbmcgc2VydmVyXG4gICAgICogQHJlbWFyayBSVEMgUGVlciBDb25uZWN0aW9uIG9uIEljZSBDYW5kaWRhdGUgZXZlbnQgaGF2ZSBpdCBoYW5kbGVkIGJ5IGhhbmRsZSBTZW5kIEljZSBDYW5kaWRhdGVcbiAgICAgKi9cbiAgICBzdGFydFNlc3Npb24ocGVlckNvbmZpZykge1xuICAgICAgICB0aGlzLnBlZXJDb25maWcgPSBwZWVyQ29uZmlnO1xuICAgICAgICAvLyBjaGVjayBmb3IgZm9yY2luZyB0dXJuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkZvcmNlVFVSTikpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciBhIHR1cm4gc2VydmVyXG4gICAgICAgICAgICBjb25zdCBoYXNUdXJuU2VydmVyID0gdGhpcy5jaGVja1R1cm5TZXJ2ZXJBdmFpbGFiaWxpdHkocGVlckNvbmZpZyk7XG4gICAgICAgICAgICAvLyBjbG9zZSBhbmQgZXJyb3IgaWYgdHVybiBpcyBmb3JjZWQgYW5kIHRoZXJlIGlzIG5vIHR1cm4gc2VydmVyXG4gICAgICAgICAgICBpZiAoIWhhc1R1cm5TZXJ2ZXIpIHtcbiAgICAgICAgICAgICAgICBMb2dnZXIuSW5mbygnTm8gdHVybiBzZXJ2ZXIgd2FzIGZvdW5kIGluIHRoZSBQZWVyIENvbm5lY3Rpb24gT3B0aW9ucy4gVFVSTiBjYW5ub3QgYmUgZm9yY2VkLCBjbG9zaW5nIGNvbm5lY3Rpb24uIFBsZWFzZSB1c2UgU1RVTiBpbnN0ZWFkJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVNpZ25hbGluZ1NlcnZlcignVFVSTiBjYW5ub3QgYmUgZm9yY2VkLCBjbG9zaW5nIGNvbm5lY3Rpb24uIFBsZWFzZSB1c2UgU1RVTiBpbnN0ZWFkLicsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0IHVwIHRoZSBwZWVyIGNvbm5lY3Rpb24gY29udHJvbGxlclxuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlciA9IG5ldyBQZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIodGhpcy5wZWVyQ29uZmlnLCB0aGlzLmNvbmZpZywgdGhpcy5wcmVmZXJyZWRDb2RlYyk7XG4gICAgICAgIC8vIHNldCB1cCBwZWVyIGNvbm5lY3Rpb24gY29udHJvbGxlciB2aWRlbyBzdGF0c1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5vblZpZGVvU3RhdHMgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlVmlkZW9TdGF0cyhldmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIC8qIFNldCBldmVudCBoYW5kbGVyIGZvciBsYXRlbmN5IGluZm9ybWF0aW9uIGlzIGNhbGN1bGF0ZWQsIGhhbmRsZSB0aGUgZXZlbnQgYnkgcHJvcG9nYXRpbmcgdG8gdGhlIFBpeGVsU3RyZWFtaW5nIEFQSSAqL1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5vbkxhdGVuY3lDYWxjdWxhdGVkID0gKGxhdGVuY3lJbmZvKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vbkxhdGVuY3lDYWxjdWxhdGVkKGxhdGVuY3lJbmZvKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyogV2hlbiB0aGUgUGVlciBDb25uZWN0aW9uIHdhbnRzIHRvIHNlbmQgYW4gb2ZmZXIgaGF2ZSBpdCBoYW5kbGVkICovXG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLm9uU2VuZFdlYlJUQ09mZmVyID0gKG9mZmVyKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVNlbmRXZWJSVENPZmZlcihvZmZlcik7XG4gICAgICAgIH07XG4gICAgICAgIC8qIFNldCBldmVudCBoYW5kbGVyIGZvciB3aGVuIGxvY2FsIGFuc3dlciBkZXNjcmlwdGlvbiBpcyBzZXQgKi9cbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIub25TZXRMb2NhbERlc2NyaXB0aW9uID0gKGFuc3dlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZW5kV2ViUlRDQW5zd2VyKGFuc3dlcik7XG4gICAgICAgIH07XG4gICAgICAgIC8qIFNldCBldmVudCBoYW5kbGVyIGZvciB3aGVuIHJlbW90ZSBvZmZlciBkZXNjcmlwdGlvbiBpcyBzZXQgKi9cbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIub25TZXRSZW1vdGVEZXNjcmlwdGlvbiA9IChvZmZlcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25XZWJSdGNTZHBPZmZlcihvZmZlcik7XG4gICAgICAgIH07XG4gICAgICAgIC8qIFdoZW4gdGhlIFBlZXIgQ29ubmVjdGlvbiBpY2UgY2FuZGlkYXRlIGlzIGFkZGVkIGhhdmUgaXQgaGFuZGxlZCAqL1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5vblBlZXJJY2VDYW5kaWRhdGUgPSAocGVlckNvbm5lY3Rpb25JY2VFdmVudCkgPT4gdGhpcy5oYW5kbGVTZW5kSWNlQ2FuZGlkYXRlKHBlZXJDb25uZWN0aW9uSWNlRXZlbnQpO1xuICAgICAgICAvKiBXaGVuIHRoZSBQZWVyIENvbm5lY3Rpb24gaGFzIGEgZGF0YSBjaGFubmVsIGNyZWF0ZWQgZm9yIGl0IGJ5IHRoZSBicm93c2VyLCBoYW5kbGUgaXQgKi9cbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIub25EYXRhQ2hhbm5lbCA9IChkYXRhY2hhbm5lbEV2ZW50KSA9PiB0aGlzLmhhbmRsZURhdGFDaGFubmVsKGRhdGFjaGFubmVsRXZlbnQpO1xuICAgICAgICAvLyBzZXQgdXAgd2ViUnRjIHRleHQgb3ZlcmxheXNcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIuc2hvd1RleHRPdmVybGF5Q29ubmVjdGluZyA9ICgpID0+IHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uV2ViUnRjQ29ubmVjdGluZygpO1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5zaG93VGV4dE92ZXJsYXlTZXR1cEZhaWx1cmUgPSAoKSA9PiB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vbldlYlJ0Y0ZhaWxlZCgpO1xuICAgICAgICBsZXQgd2ViUnRjQ29ubmVjdGVkU2VudCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5vbkljZUNvbm5lY3Rpb25TdGF0ZUNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vIEJyb3dzZXJzIGVtaXQgXCJjb25uZWN0ZWRcIiB3aGVuIGdldHRpbmcgZmlyc3QgY29ubmVjdGlvbiBhbmQgXCJjb21wbGV0ZWRcIiB3aGVuIGZpbmlzaGluZ1xuICAgICAgICAgICAgLy8gY2FuZGlkYXRlIGNoZWNraW5nLiBIb3dldmVyLCBzb21ldGltZXMgYnJvd3NlcnMgY2FuIHNraXAgXCJjb25uZWN0ZWRcIiBhbmQgb25seSBlbWl0IFwiY29tcGxldGVkXCIuXG4gICAgICAgICAgICAvLyBUaGVyZWZvcmUgbmVlZCB0byBjaGVjayBib3RoIGNhc2VzIGFuZCBlbWl0IG9uV2ViUnRjQ29ubmVjdGVkIG9ubHkgb25jZSBvbiB0aGUgZmlyc3QgaGl0LlxuICAgICAgICAgICAgaWYgKCF3ZWJSdGNDb25uZWN0ZWRTZW50ICYmXG4gICAgICAgICAgICAgICAgWydjb25uZWN0ZWQnLCAnY29tcGxldGVkJ10uaW5jbHVkZXModGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIucGVlckNvbm5lY3Rpb24uaWNlQ29ubmVjdGlvblN0YXRlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uV2ViUnRjQ29ubmVjdGVkKCk7XG4gICAgICAgICAgICAgICAgd2ViUnRjQ29ubmVjdGVkU2VudCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8qIFJUQyBQZWVyIENvbm5lY3Rpb24gb24gVHJhY2sgZXZlbnQgLT4gaGFuZGxlIG9uIHRyYWNrICovXG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLm9uVHJhY2sgPSAodHJhY2tFdmVudCkgPT4gdGhpcy5zdHJlYW1Db250cm9sbGVyLmhhbmRsZU9uVHJhY2sodHJhY2tFdmVudCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB0aGUgcGVlciBjb25uZWN0aW9uIG9wdGlvbnMgZm9yIGEgdHVybiBzZXJ2ZXIgYW5kIHJldHVybnMgdHJ1ZSBvciBmYWxzZVxuICAgICAqL1xuICAgIGNoZWNrVHVyblNlcnZlckF2YWlsYWJpbGl0eShvcHRpb25zKSB7XG4gICAgICAgIC8vIGlmIGljZVNlcnZlcnMgaXMgZW1wdHkgcmV0dXJuIGZhbHNlIHRoaXMgc2hvdWxkIG5vdCBiZSB0aGUgZ2VuZXJhbCB1c2UgY2FzZSBidXQgaXMgaGVyZSBpbmNhc2VcbiAgICAgICAgaWYgKCFvcHRpb25zLmljZVNlcnZlcnMpIHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdBIHR1cm4gc2V2ZXIgd2FzIG5vdCBmb3VuZCcpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgaWNlIHNlcnZlcnMgdG8gY2hlY2sgZm9yIGEgdHVybiB1cmxcbiAgICAgICAgZm9yIChjb25zdCBpY2VTZXJ2ZXIgb2Ygb3B0aW9ucy5pY2VTZXJ2ZXJzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHVybCBvZiBpY2VTZXJ2ZXIudXJscykge1xuICAgICAgICAgICAgICAgIGlmICh1cmwuaW5jbHVkZXMoJ3R1cm4nKSkge1xuICAgICAgICAgICAgICAgICAgICBMb2dnZXIuSW5mbyhgQSB0dXJuIHNldmVyIHdhcyBmb3VuZCBhdCAke3VybH1gKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIExvZ2dlci5JbmZvKCdBIHR1cm4gc2V2ZXIgd2FzIG5vdCBmb3VuZCcpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiBhIENvbmZpZyBNZXNzYWdlIGlzIHJlY2VpdmVkIGNvbnRhaW5zIHRoZSBQZWVyIENvbm5lY3Rpb24gT3B0aW9ucyByZXF1aXJlZCAoU1RVTiBhbmQgVFVSTiBTZXJ2ZXIgSW5mbylcbiAgICAgKiBAcGFyYW0gbWVzc2FnZUNvbmZpZyAtIENvbmZpZyBNZXNzYWdlIHJlY2VpdmVkIGZyb20gdGhlIHNpZ25hbGluZyBzZXJ2ZXJcbiAgICAgKi9cbiAgICBoYW5kbGVPbkNvbmZpZ01lc3NhZ2UobWVzc2FnZUNvbmZpZykge1xuICAgICAgICB0aGlzLnJlc2l6ZVBsYXllclN0eWxlKCk7XG4gICAgICAgIC8vIFRlbGwgdGhlIFdlYlJ0Y0NvbnRyb2xsZXIgdG8gc3RhcnQgYSBzZXNzaW9uIHdpdGggdGhlIHBlZXIgb3B0aW9ucyBzZW50IGZyb20gdGhlIHNpZ25hbGluZyBzZXJ2ZXJcbiAgICAgICAgdGhpcy5zdGFydFNlc3Npb24obWVzc2FnZUNvbmZpZy5wZWVyQ29ubmVjdGlvbk9wdGlvbnMpO1xuICAgIH1cbiAgICBoYW5kbGVQaW5nTWVzc2FnZShwaW5nTWVzc2FnZSkge1xuICAgICAgICB0aGlzLnByb3RvY29sLnNlbmRNZXNzYWdlKE1lc3NhZ2VIZWxwZXJzLmNyZWF0ZU1lc3NhZ2UoTWVzc2FnZXMucG9uZywgeyB0aW1lOiBwaW5nTWVzc2FnZS50aW1lIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZSBzaWduYWxsaW5nIHNlcnZlciBnaXZlcyB1cyB0aGUgbGlzdCBvZiBzdHJlYW1lciBpZHMuXG4gICAgICovXG4gICAgaGFuZGxlU3RyZWFtZXJMaXN0TWVzc2FnZShtZXNzYWdlU3RyZWFtZXJMaXN0KSB7XG4gICAgICAgIExvZ2dlci5JbmZvKGBHb3Qgc3RyZWFtZXIgbGlzdCAke21lc3NhZ2VTdHJlYW1lckxpc3QuaWRzfWApO1xuICAgICAgICBsZXQgd2FudGVkU3RyZWFtZXJJZCA9ICcnO1xuICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgc3RyZWFtZXIgaWQgb3B0aW9uXG4gICAgICAgIGNvbnN0IHN0cmVhbWVySURPcHRpb24gPSB0aGlzLmNvbmZpZy5nZXRTZXR0aW5nT3B0aW9uKE9wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZCk7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU2VsZWN0aW9uID0gc3RyZWFtZXJJRE9wdGlvbi5zZWxlY3RlZC50b1N0cmluZygpLnRyaW0oKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0IHRvIHNlbGVjdGVkIG9wdGlvbiBpZiBpdCBleGlzdHNcbiAgICAgICAgICAgIHdhbnRlZFN0cmVhbWVySWQgPSBzdHJlYW1lcklET3B0aW9uLnNlbGVjdGVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFkZCB0aGUgc3RyZWFtZXJzIHRvIHRoZSBVSVxuICAgICAgICBjb25zdCBzZXR0aW5nT3B0aW9ucyA9IFsuLi5tZXNzYWdlU3RyZWFtZXJMaXN0Lmlkc107IC8vIGNvcHkgdGhlIG9yaWdpbmFsIG1lc3NhZ2VTdHJlYW1lckxpc3QuaWRzXG4gICAgICAgIHNldHRpbmdPcHRpb25zLnVuc2hpZnQoJycpOyAvLyBhZGQgYW4gZW1wdHkgb3B0aW9uIGF0IHRoZSB0b3BcbiAgICAgICAgdGhpcy5jb25maWcuc2V0T3B0aW9uU2V0dGluZ09wdGlvbnMoT3B0aW9uUGFyYW1ldGVycy5TdHJlYW1lcklkLCBzZXR0aW5nT3B0aW9ucyk7XG4gICAgICAgIGxldCBhdXRvU2VsZWN0ZWRTdHJlYW1lcklkID0gJyc7XG4gICAgICAgIGNvbnN0IHdhaXRGb3JTdHJlYW1lciA9IHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuV2FpdEZvclN0cmVhbWVyKTtcbiAgICAgICAgY29uc3QgcmVjb25uZWN0TGltaXQgPSB0aGlzLmNvbmZpZy5nZXROdW1lcmljU2V0dGluZ1ZhbHVlKE51bWVyaWNQYXJhbWV0ZXJzLk1heFJlY29ubmVjdEF0dGVtcHRzKTtcbiAgICAgICAgY29uc3QgcmVjb25uZWN0RGVsYXkgPSB0aGlzLmNvbmZpZy5nZXROdW1lcmljU2V0dGluZ1ZhbHVlKE51bWVyaWNQYXJhbWV0ZXJzLlN0cmVhbWVyQXV0b0pvaW5JbnRlcnZhbCk7XG4gICAgICAgIC8vIGZpcnN0IHdlIGZpZ3VyZSBvdXQgYSB3YW50ZWQgc3RyZWFtZXIgaWQgdGhyb3VnaCB2YXJpb3VzIG1lYW5zXG4gICAgICAgIGNvbnN0IHVzZVVybFBhcmFtcyA9IHRoaXMuY29uZmlnLnVzZVVybFBhcmFtcztcbiAgICAgICAgY29uc3QgdXJsUGFyYW1zID0gbmV3IElVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICAgIGlmICh1c2VVcmxQYXJhbXMgJiYgdXJsUGFyYW1zLmhhcyhPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQpKSB7XG4gICAgICAgICAgICAvLyBpZiB3ZSd2ZSBzZXQgdGhlIHN0cmVhbWVyIGlkIG9uIHRoZSB1cmwgd2Ugb25seSB3YW50IHRoYXQgc3RyZWFtZXIgaWRcbiAgICAgICAgICAgIHdhbnRlZFN0cmVhbWVySWQgPSB1cmxQYXJhbXMuZ2V0KE9wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zdWJzY3JpYmVkU3RyZWFtKSB7XG4gICAgICAgICAgICAvLyB3ZSB3ZXJlIHByZXZpb3VzbHkgc3Vic2NyaWJlZCB0byBhIHN0cmVhbWVyLCB3ZSB3YW50IHRoYXRcbiAgICAgICAgICAgIHdhbnRlZFN0cmVhbWVySWQgPSB0aGlzLnN1YnNjcmliZWRTdHJlYW07XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm93IGxldHMgc2VlIGlmIHdlIGNhbiBwaWNrIGl0LlxuICAgICAgICBpZiAod2FudGVkU3RyZWFtZXJJZCAmJiBtZXNzYWdlU3RyZWFtZXJMaXN0Lmlkcy5pbmNsdWRlcyh3YW50ZWRTdHJlYW1lcklkKSkge1xuICAgICAgICAgICAgLy8gaWYgdGhlIHdhbnRlZCBzdHJlYW0gaXMgaW4gdGhlIGxpc3QuIHdlIHBpY2sgdGhhdFxuICAgICAgICAgICAgYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCA9IHdhbnRlZFN0cmVhbWVySWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoKCF3YW50ZWRTdHJlYW1lcklkIHx8ICF3YWl0Rm9yU3RyZWFtZXIpICYmIG1lc3NhZ2VTdHJlYW1lckxpc3QuaWRzLmxlbmd0aCA9PSAxKSB7XG4gICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlmIHdlJ3JlIG5vdCB3YWl0aW5nIGZvciB0aGUgd2FudGVkIHN0cmVhbWVyIGFuZCB0aGVyZSdzIG9ubHkgb25lIHN0cmVhbWVyLCBjb25uZWN0IHRvIGl0XG4gICAgICAgICAgICBhdXRvU2VsZWN0ZWRTdHJlYW1lcklkID0gbWVzc2FnZVN0cmVhbWVyTGlzdC5pZHNbMF07XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgd2UgZm91bmQgYSBzdHJlYW1lciBpZCB0byBhdXRvIHNlbGVjdCwgc2VsZWN0IGl0XG4gICAgICAgIGlmIChhdXRvU2VsZWN0ZWRTdHJlYW1lcklkKSB7XG4gICAgICAgICAgICB0aGlzLnJlY29ubmVjdEF0dGVtcHQgPSAwO1xuICAgICAgICAgICAgdGhpcy5pc1JlY29ubmVjdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jb25maWcuc2V0T3B0aW9uU2V0dGluZ1ZhbHVlKE9wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZCwgYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBubyBhdXRvIHNlbGVjdGVkIHN0cmVhbWVyLlxuICAgICAgICAgICAgLy8gaWYgd2UncmUgd2FpdGluZyBmb3IgYSBzdHJlYW1lciB0aGVuIHRyeSByZWNvbm5lY3RpbmdcbiAgICAgICAgICAgIGlmICh3YWl0Rm9yU3RyZWFtZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNvbm5lY3RBdHRlbXB0IDwgcmVjb25uZWN0TGltaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgcmVjb25uZWN0cyBhdmFpbGFibGVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0Kys7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZWNvbm5lY3RpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvdG9jb2wuc2VuZE1lc3NhZ2UoTWVzc2FnZUhlbHBlcnMuY3JlYXRlTWVzc2FnZShNZXNzYWdlcy5saXN0U3RyZWFtZXJzKSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIHJlY29ubmVjdERlbGF5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGV4aGF1c3RlZCBvdXIgcmVjb25uZWN0IGF0dGVtcHRzLCByZXR1cm4gdG8gbWFpbiBzY3JlZW5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3RBdHRlbXB0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1JlY29ubmVjdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUF1dG9SZWNvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGlzcGF0Y2ggdGhpcyBldmVudCBmaW5hbGx5XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgU3RyZWFtZXJMaXN0TWVzc2FnZUV2ZW50KHtcbiAgICAgICAgICAgIG1lc3NhZ2VTdHJlYW1lckxpc3QsXG4gICAgICAgICAgICBhdXRvU2VsZWN0ZWRTdHJlYW1lcklkLFxuICAgICAgICAgICAgd2FudGVkU3RyZWFtZXJJZFxuICAgICAgICB9KSk7XG4gICAgfVxuICAgIGhhbmRsZVN1YnNjcmliZUZhaWxlZE1lc3NhZ2Uoc3Vic2NyaWJlRmFpbGVkTWVzc2FnZSkge1xuICAgICAgICB0aGlzLnJlY29ubmVjdEF0dGVtcHQgPSAwO1xuICAgICAgICB0aGlzLmlzUmVjb25uZWN0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW5hYmxlQXV0b1JlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vblN1YnNjcmliZUZhaWxlZChzdWJzY3JpYmVGYWlsZWRNZXNzYWdlLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBoYW5kbGVTdHJlYW1lcklEQ2hhbmdlZE1lc3NhZ2Uoc3RyZWFtZXJJRENoYW5nZWRNZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IG5ld0lEID0gc3RyZWFtZXJJRENoYW5nZWRNZXNzYWdlLm5ld0lEO1xuICAgICAgICAvLyBuZWVkIHRvIGVkaXQgdGhlIHNlbGVjdGVkIHN0cmVhbWVyIGluIHRoZSBzZXR0aW5ncyBsaXN0XG4gICAgICAgIGNvbnN0IHN0cmVhbWVyTGlzdE9wdGlvbnMgPSB0aGlzLmNvbmZpZy5nZXRTZXR0aW5nT3B0aW9uKE9wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZCk7XG4gICAgICAgIC8vIHRlbXBvcmFyaWx5IHByZXZlbnQgb25DaGFuZ2UgZnJvbSBmaXJpbmcgKGl0IHdvdWxkIHRyeSB0byBzdWJzY3JpYmUgdG8gdGhlIHN0cmVhbWVyIGFnYWluKVxuICAgICAgICBjb25zdCBvbGRPbkNoYW5nZSA9IHN0cmVhbWVyTGlzdE9wdGlvbnMub25DaGFuZ2U7XG4gICAgICAgIHN0cmVhbWVyTGlzdE9wdGlvbnMub25DaGFuZ2UgPSAoKSA9PiB7IH07XG4gICAgICAgIC8vIGNoYW5nZSB0aGUgc2VsZWN0ZWQgZW50cnkuXG4gICAgICAgIGNvbnN0IHN0cmVhbWVyTGlzdCA9IHN0cmVhbWVyTGlzdE9wdGlvbnMub3B0aW9ucztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJlYW1lckxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmIChzdHJlYW1lckxpc3RbaV0gPT0gdGhpcy5zdWJzY3JpYmVkU3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtZXJMaXN0W2ldID0gbmV3SUQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gdXBkYXRlIHRoZSBsaXN0XG4gICAgICAgIHN0cmVhbWVyTGlzdE9wdGlvbnMub3B0aW9ucyA9IHN0cmVhbWVyTGlzdDtcbiAgICAgICAgLy8gdXBkYXRlIHRoZSBzZWxlY3RlZCBlbnRyeVxuICAgICAgICBzdHJlYW1lckxpc3RPcHRpb25zLnNlbGVjdGVkID0gbmV3SUQ7XG4gICAgICAgIC8vIHJlc3RvcmUgdGhlIG9sZCBjaGFuZ2Ugbm90aWZpZXIuXG4gICAgICAgIHN0cmVhbWVyTGlzdE9wdGlvbnMub25DaGFuZ2UgPSBvbGRPbkNoYW5nZTtcbiAgICAgICAgLy8gcmVtZW1iZXIgd2hpY2ggc3RyZWFtIHdlJ3JlIHN1YnNjcmliZSB0b1xuICAgICAgICB0aGlzLnN1YnNjcmliZWRTdHJlYW0gPSBzdHJlYW1lcklEQ2hhbmdlZE1lc3NhZ2UubmV3SUQ7XG4gICAgICAgIC8vIG5vdGlmeSBhbnkgbGlzdGVuZXJzXG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgU3RyZWFtZXJJRENoYW5nZWRNZXNzYWdlRXZlbnQoe1xuICAgICAgICAgICAgbmV3SURcbiAgICAgICAgfSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdGhlIFJUQyBBbnN3ZXIgZnJvbSB0aGUgc2lnbmFsaW5nIHNlcnZlclxuICAgICAqIEBwYXJhbSBBbnN3ZXIgLSBBbnN3ZXIgU0RQIGZyb20gdGhlIHBlZXIuXG4gICAgICovXG4gICAgaGFuZGxlV2ViUnRjQW5zd2VyKEFuc3dlcikge1xuICAgICAgICBMb2dnZXIuSW5mbyhgR290IGFuc3dlciBzZHAgJHtBbnN3ZXIuc2RwfWApO1xuICAgICAgICBjb25zdCBzZHBBbnN3ZXIgPSB7XG4gICAgICAgICAgICBzZHA6IEFuc3dlci5zZHAsXG4gICAgICAgICAgICB0eXBlOiAnYW5zd2VyJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5yZWNlaXZlQW5zd2VyKHNkcEFuc3dlcik7XG4gICAgICAgIHRoaXMuaGFuZGxlUG9zdFdlYnJ0Y05lZ290aWF0aW9uKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0aGUgUlRDIG9mZmVyIGZyb20gYSBXZWJSVEMgcGVlciAocmVjZWl2ZWQgdGhyb3VnaCB0aGUgc2lnbmFsbGluZyBzZXJ2ZXIpLlxuICAgICAqIEBwYXJhbSBPZmZlciAtIE9mZmVyIFNEUCBmcm9tIHRoZSBwZWVyLlxuICAgICAqL1xuICAgIGhhbmRsZVdlYlJ0Y09mZmVyKE9mZmVyKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKGBHb3Qgb2ZmZXIgc2RwICR7T2ZmZXIuc2RwfWApO1xuICAgICAgICB0aGlzLmlzVXNpbmdTRlUgPSBPZmZlci5zZnUgPyBPZmZlci5zZnUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1VzaW5nU1ZDID0gT2ZmZXIuc2NhbGFiaWxpdHlNb2RlID8gT2ZmZXIuc2NhbGFiaWxpdHlNb2RlICE9ICdMMVQxJyA6IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5pc1VzaW5nU0ZVIHx8IHRoaXMuaXNVc2luZ1NWQykge1xuICAgICAgICAgICAgLy8gRGlzYWJsZSBuZWdvdGlhdGluZyB3aXRoIHRoZSBzZnUgYXMgdGhlIHNmdSBvbmx5IHN1cHBvcnRzIG9uZSBjb2RlYyBhdCBhIHRpbWVcbiAgICAgICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLnByZWZlcnJlZENvZGVjID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTk9URTogVGhlc2UgdHdvIHNldHRpbmdzIGNvbmZpZ3VyYXRpb25zIGFyZSBkb25lIG91dHNpZGUgb2YgYW4gaWYodGhpcy5pc1VzaW5nU0ZVKSBzbyB0aGF0IHVzZXJzXG4gICAgICAgIC8vIGNhbiBzd2l0Y2ggYmV0d2VlbiBhIGRlZmF1bHQgYW5kIFNGVSBzdHJlYW0gYW5kIGhhdmUgdGhlIHNldHRpbmdzIHJlY29uZmlndXJlIGFwcHJvcHJpYXRlbHlcbiAgICAgICAgY29uc3Qgc2NhbGFiaWxpdHlNb2RlID0gT2ZmZXIuc2NhbGFiaWxpdHlNb2RlID8gT2ZmZXIuc2NhbGFiaWxpdHlNb2RlIDogJ0wxVDEnO1xuICAgICAgICBsZXQgYXZhaWxhYmxlUXVhbGl0aWVzID0gWydEZWZhdWx0J107XG4gICAgICAgIGlmICh0aGlzLmlzVXNpbmdTRlUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc1VzaW5nU1ZDKSB7XG4gICAgICAgICAgICAgICAgLy8gVXNlciBpcyB1c2luZyBhbiBTRlUgd2l0aG91dCBhbnkgdGVtcG9yYWwgc2NhbGFiaWxpdHkuIEp1c3Qgb2ZmZXIgZWFzaWx5IHJlYWRhYmxlIG5hbWVzXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlUXVhbGl0aWVzID0gWydMb3cnLCAnTWVkaXVtJywgJ0hpZ2gnXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVzZXIgaXMgdXNpbmcgU1ZDLiBHZW5lcmF0ZSBhbGwgYXZhaWxhYmxlIG9wdGlvbnMuXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlUXVhbGl0aWVzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgbWF4U3BhdGlhbExheWVycyA9ICtzY2FsYWJpbGl0eU1vZGVbMV07XG4gICAgICAgICAgICAgICAgY29uc3QgbWF4VGVtcG9yYWxMYXllcnMgPSArc2NhbGFiaWxpdHlNb2RlWzNdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHMgPSAxOyBzIDw9IG1heFNwYXRpYWxMYXllcnM7IHMrKykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB0ID0gMTsgdCA8PSBtYXhUZW1wb3JhbExheWVyczsgdCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVRdWFsaXRpZXMucHVzaChgUyR7c31UJHt0fWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgcG9zc2libGUgdmlkZW8gcXVhbGl0eSBvcHRpb25zXG4gICAgICAgIHRoaXMuY29uZmlnLnNldE9wdGlvblNldHRpbmdPcHRpb25zKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSwgYXZhaWxhYmxlUXVhbGl0aWVzKTtcbiAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWxlY3RlZCB2aWRlbyBxdWFsaXR5IHdpdGggdGhlIGhpZ2hlc3QgcG9zc2libGUgcmVzb2x1dGlvblxuICAgICAgICB0aGlzLmNvbmZpZy5zZXRPcHRpb25TZXR0aW5nVmFsdWUoT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRRdWFsaXR5LCBhdmFpbGFibGVRdWFsaXRpZXMuc2xpY2UoLTEpWzBdKTtcbiAgICAgICAgY29uc3Qgc2RwT2ZmZXIgPSB7XG4gICAgICAgICAgICBzZHA6IE9mZmVyLnNkcCxcbiAgICAgICAgICAgIHR5cGU6ICdvZmZlcidcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIucmVjZWl2ZU9mZmVyKHNkcE9mZmVyLCB0aGlzLmNvbmZpZyk7XG4gICAgICAgIHRoaXMuaGFuZGxlUG9zdFdlYnJ0Y05lZ290aWF0aW9uKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB3aGVuIHRoZSBTRlUgcHJvdmlkZXMgdGhlIHBlZXIgd2l0aCBpdHMgZGF0YSBjaGFubmVsc1xuICAgICAqIEBwYXJhbSBEYXRhQ2hhbm5lbHMgLSBUaGUgbWVzc2FnZSBmcm9tIHRoZSBTRlUgY29udGFpbmluZyB0aGUgZGF0YSBjaGFubmVscyBpZHNcbiAgICAgKi9cbiAgICBoYW5kbGVXZWJSdGNTRlVQZWVyRGF0YWNoYW5uZWxzKERhdGFDaGFubmVscykge1xuICAgICAgICBjb25zdCBTZW5kT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG9yZGVyZWQ6IHRydWUsXG4gICAgICAgICAgICBuZWdvdGlhdGVkOiB0cnVlLFxuICAgICAgICAgICAgaWQ6IERhdGFDaGFubmVscy5zZW5kU3RyZWFtSWRcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdW5pZGlyZWN0aW9uYWwgPSBEYXRhQ2hhbm5lbHMuc2VuZFN0cmVhbUlkICE9IERhdGFDaGFubmVscy5yZWN2U3RyZWFtSWQ7XG4gICAgICAgIHRoaXMuc2VuZHJlY3ZEYXRhQ2hhbm5lbENvbnRyb2xsZXIuY3JlYXRlRGF0YUNoYW5uZWwodGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIucGVlckNvbm5lY3Rpb24sIHVuaWRpcmVjdGlvbmFsID8gJ3NlbmQtZGF0YWNoYW5uZWwnIDogJ2RhdGFjaGFubmVsJywgU2VuZE9wdGlvbnMpO1xuICAgICAgICBpZiAodW5pZGlyZWN0aW9uYWwpIHtcbiAgICAgICAgICAgIGNvbnN0IFJlY3ZPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIG9yZGVyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgbmVnb3RpYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpZDogRGF0YUNoYW5uZWxzLnJlY3ZTdHJlYW1JZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMucmVjdkRhdGFDaGFubmVsQ29udHJvbGxlci5jcmVhdGVEYXRhQ2hhbm5lbCh0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5wZWVyQ29ubmVjdGlvbiwgJ3JlY3YtZGF0YWNoYW5uZWwnLCBSZWN2T3B0aW9ucyk7XG4gICAgICAgICAgICB0aGlzLnJlY3ZEYXRhQ2hhbm5lbENvbnRyb2xsZXIuaGFuZGxlT25PcGVuID0gKCkgPT4gdGhpcy5wcm90b2NvbC5zZW5kTWVzc2FnZShNZXNzYWdlSGVscGVycy5jcmVhdGVNZXNzYWdlKE1lc3NhZ2VzLnBlZXJEYXRhQ2hhbm5lbHNSZWFkeSkpO1xuICAgICAgICAgICAgLy8gSWYgd2UncmUgdW5pLWRpcmVjdGlvbmFsLCBvbmx5IHRoZSByZWN2IGRhdGEgY2hhbm5lbCBzaG91bGQgaGFuZGxlIGluY29taW5nIG1lc3NhZ2VzXG4gICAgICAgICAgICB0aGlzLnJlY3ZEYXRhQ2hhbm5lbENvbnRyb2xsZXIuaGFuZGxlT25NZXNzYWdlID0gKGV2KSA9PiB0aGlzLmhhbmRsZU9uTWVzc2FnZShldik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBlbHNlIG91ciBwcmltYXJ5IGRhdGFjaGFubmVsIGlzIHNlbmQvcmVjdiBzbyBpdCBjYW4gaGFuZGxlIGluY29taW5nIG1lc3NhZ2VzXG4gICAgICAgICAgICB0aGlzLnNlbmRyZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyLmhhbmRsZU9uTWVzc2FnZSA9IChldikgPT4gdGhpcy5oYW5kbGVPbk1lc3NhZ2UoZXYpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZVBvc3RXZWJydGNOZWdvdGlhdGlvbigpIHtcbiAgICAgICAgLy8gc3RhcnQgdGhlIGFmayB3YXJuaW5nIHRpbWVyIGFzIFBTIGlzIG5vdyBydW5uaW5nXG4gICAgICAgIHRoaXMuYWZrQ29udHJvbGxlci5zdGFydEFma1dhcm5pbmdUaW1lcigpO1xuICAgICAgICAvLyBzaG93IHRoZSBvdmVybGF5IHRoYXQgd2UgaGF2ZSBuZWdvdGlhdGVkIGEgY29ubmVjdGlvblxuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vbldlYlJ0Y1NkcCgpO1xuICAgICAgICBpZiAodGhpcy5zdGF0c1RpbWVySGFuZGxlICYmIHRoaXMuc3RhdHNUaW1lckhhbmRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLnN0YXRzVGltZXJIYW5kbGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdHNUaW1lckhhbmRsZSA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB0aGlzLmdldFN0YXRzKCksIDEwMDApO1xuICAgICAgICAvKiAgKi9cbiAgICAgICAgdGhpcy5zZXRNb3VzZUlucHV0RW5hYmxlZCh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLk1vdXNlSW5wdXQpKTtcbiAgICAgICAgdGhpcy5zZXRLZXlib2FyZElucHV0RW5hYmxlZCh0aGlzLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLktleWJvYXJkSW5wdXQpKTtcbiAgICAgICAgdGhpcy5zZXRHYW1lUGFkSW5wdXRFbmFibGVkKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuR2FtZXBhZElucHV0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdoZW4gYW4gaWNlIENhbmRpZGF0ZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBTaWduYWxpbmcgc2VydmVyIGFkZCBpdCB0byB0aGUgUGVlciBDb25uZWN0aW9uIENsaWVudFxuICAgICAqIEBwYXJhbSBpY2VDYW5kaWRhdGUgLSBJY2UgQ2FuZGlkYXRlIGZyb20gU2VydmVyXG4gICAgICovXG4gICAgaGFuZGxlSWNlQ2FuZGlkYXRlKGljZUNhbmRpZGF0ZSkge1xuICAgICAgICBMb2dnZXIuSW5mbygnV2ViIFJUQyBDb250cm9sbGVyOiBvbldlYlJ0Y0ljZScpO1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSBuZXcgUlRDSWNlQ2FuZGlkYXRlKGljZUNhbmRpZGF0ZSk7XG4gICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLmhhbmRsZU9uSWNlKGNhbmRpZGF0ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIGljZSBDYW5kaWRhdGUgdG8gdGhlIHNpZ25hbGluZyBzZXJ2ZXIgdmlhIHdlYnNvY2tldFxuICAgICAqIEBwYXJhbSBpY2VFdmVudCAtIFJUQyBQZWVyIENvbm5lY3Rpb25JY2VFdmVudCkge1xuICAgICAqL1xuICAgIGhhbmRsZVNlbmRJY2VDYW5kaWRhdGUoaWNlRXZlbnQpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ09uSWNlQ2FuZGlkYXRlJyk7XG4gICAgICAgIGlmIChpY2VFdmVudC5jYW5kaWRhdGUgJiYgaWNlRXZlbnQuY2FuZGlkYXRlLmNhbmRpZGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wcm90b2NvbC5zZW5kTWVzc2FnZShNZXNzYWdlSGVscGVycy5jcmVhdGVNZXNzYWdlKE1lc3NhZ2VzLmljZUNhbmRpZGF0ZSwgeyBjYW5kaWRhdGU6IGljZUV2ZW50LmNhbmRpZGF0ZSB9KSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGUgaWNlIENhbmRpZGF0ZSB0byB0aGUgc2lnbmFsaW5nIHNlcnZlciB2aWEgd2Vic29ja2V0XG4gICAgICogQHBhcmFtIGljZUV2ZW50IC0gUlRDIFBlZXIgQ29ubmVjdGlvbkljZUV2ZW50KSB7XG4gICAgICovXG4gICAgaGFuZGxlRGF0YUNoYW5uZWwoZGF0YWNoYW5uZWxFdmVudCkge1xuICAgICAgICBMb2dnZXIuSW5mbygnRGF0YSBjaGFubmVsIGNyZWF0ZWQgZm9yIHVzIGJ5IGJyb3dzZXIgYXMgd2UgYXJlIGEgcmVjZWl2aW5nIHBlZXIuJyk7XG4gICAgICAgIHRoaXMuc2VuZHJlY3ZEYXRhQ2hhbm5lbENvbnRyb2xsZXIuZGF0YUNoYW5uZWwgPSBkYXRhY2hhbm5lbEV2ZW50LmNoYW5uZWw7XG4gICAgICAgIC8vIERhdGEgY2hhbm5lbCB3YXMgY3JlYXRlZCBmb3IgdXMsIHNvIHdlIGp1c3QgbmVlZCB0byBzZXR1cCBpdHMgY2FsbGJhY2tzIGFuZCBhcnJheSB0eXBlXG4gICAgICAgIHRoaXMuc2VuZHJlY3ZEYXRhQ2hhbm5lbENvbnRyb2xsZXIuc2V0dXBEYXRhQ2hhbm5lbCgpO1xuICAgICAgICB0aGlzLnNlbmRyZWN2RGF0YUNoYW5uZWxDb250cm9sbGVyLmhhbmRsZU9uTWVzc2FnZSA9IChldikgPT4gdGhpcy5oYW5kbGVPbk1lc3NhZ2UoZXYpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBSVEMgT2ZmZXIgU2Vzc2lvbiB0byB0aGUgU2lnbmFsaW5nIHNlcnZlciB2aWEgd2Vic29ja2V0XG4gICAgICogQHBhcmFtIG9mZmVyIC0gUlRDIFNlc3Npb24gRGVzY3JpcHRpb25cbiAgICAgKi9cbiAgICBoYW5kbGVTZW5kV2ViUlRDT2ZmZXIob2ZmZXIpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ1NlbmRpbmcgdGhlIG9mZmVyIHRvIHRoZSBTZXJ2ZXInKTtcbiAgICAgICAgY29uc3QgZXh0cmFQYXJhbXMgPSB7XG4gICAgICAgICAgICBzZHA6IG9mZmVyLnNkcCxcbiAgICAgICAgICAgIG1pbkJpdHJhdGVCcHM6IDEwMDAgKiB0aGlzLmNvbmZpZy5nZXROdW1lcmljU2V0dGluZ1ZhbHVlKE51bWVyaWNQYXJhbWV0ZXJzLldlYlJUQ01pbkJpdHJhdGUpLFxuICAgICAgICAgICAgbWF4Qml0cmF0ZUJwczogMTAwMCAqIHRoaXMuY29uZmlnLmdldE51bWVyaWNTZXR0aW5nVmFsdWUoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWF4Qml0cmF0ZSlcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wcm90b2NvbC5zZW5kTWVzc2FnZShNZXNzYWdlSGVscGVycy5jcmVhdGVNZXNzYWdlKE1lc3NhZ2VzLm9mZmVyLCBleHRyYVBhcmFtcykpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIHRoZSBSVEMgT2ZmZXIgU2Vzc2lvbiB0byB0aGUgU2lnbmFsaW5nIHNlcnZlciB2aWEgd2Vic29ja2V0XG4gICAgICogQHBhcmFtIGFuc3dlciAtIFJUQyBTZXNzaW9uIERlc2NyaXB0aW9uXG4gICAgICovXG4gICAgaGFuZGxlU2VuZFdlYlJUQ0Fuc3dlcihhbnN3ZXIpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ1NlbmRpbmcgdGhlIGFuc3dlciB0byB0aGUgU2VydmVyJyk7XG4gICAgICAgIGNvbnN0IGV4dHJhUGFyYW1zID0ge1xuICAgICAgICAgICAgc2RwOiBhbnN3ZXIuc2RwLFxuICAgICAgICAgICAgbWluQml0cmF0ZUJwczogMTAwMCAqIHRoaXMuY29uZmlnLmdldE51bWVyaWNTZXR0aW5nVmFsdWUoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWluQml0cmF0ZSksXG4gICAgICAgICAgICBtYXhCaXRyYXRlQnBzOiAxMDAwICogdGhpcy5jb25maWcuZ2V0TnVtZXJpY1NldHRpbmdWYWx1ZShOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNYXhCaXRyYXRlKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnByb3RvY29sLnNlbmRNZXNzYWdlKE1lc3NhZ2VIZWxwZXJzLmNyZWF0ZU1lc3NhZ2UoTWVzc2FnZXMuYW5zd2VyLCBleHRyYVBhcmFtcykpO1xuICAgICAgICBpZiAodGhpcy5pc1VzaW5nU0ZVKSB7XG4gICAgICAgICAgICB0aGlzLnByb3RvY29sLnNlbmRNZXNzYWdlKE1lc3NhZ2VIZWxwZXJzLmNyZWF0ZU1lc3NhZ2UoTWVzc2FnZXMuZGF0YUNoYW5uZWxSZXF1ZXN0KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2VuZCBhbnN3ZXIgYmFjayB0byBQaXhlbCBTdHJlYW1pbmcgbWFpbiBjbGFzcyBmb3IgZXZlbnQgZGlzcGF0Y2hcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25XZWJSdGNTZHBBbnN3ZXIoYW5zd2VyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBmcmVlemUgZnJhbWUgb3ZlcmxheSB0byB0aGUgcGxheWVyIGRpdlxuICAgICAqL1xuICAgIHNldFVwTW91c2VBbmRGcmVlemVGcmFtZSgpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRpbmcgYW5kIG5vcm1hbGl6aW5nIHBvc2l0aW9ucyBkZXBlbmRzIG9uIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBwbGF5ZXIuXG4gICAgICAgIGNvbnN0IHBsYXllckVsZW1lbnQgPSB0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvUGFyZW50RWxlbWVudCgpO1xuICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnQgPSB0aGlzLnZpZGVvUGxheWVyLmdldFZpZGVvRWxlbWVudCgpO1xuICAgICAgICB0aGlzLmNvb3JkaW5hdGVDb252ZXJ0ZXIucmVjb25maWd1cmUoeyB3aWR0aDogcGxheWVyRWxlbWVudC5jbGllbnRXaWR0aCwgaGVpZ2h0OiBwbGF5ZXJFbGVtZW50LmNsaWVudEhlaWdodCB9LCB7IHdpZHRoOiB2aWRlb0VsZW1lbnQudmlkZW9XaWR0aCwgaGVpZ2h0OiB2aWRlb0VsZW1lbnQudmlkZW9IZWlnaHQgfSk7XG4gICAgICAgIHRoaXMuZnJlZXplRnJhbWVDb250cm9sbGVyLmZyZWV6ZUZyYW1lLnJlc2l6ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgQ29ubmVjdGlvbiB0byB0aGUgc2lnbmFsaW5nIHNlcnZlclxuICAgICAqL1xuICAgIGNsb3NlU2lnbmFsaW5nU2VydmVyKG1lc3NhZ2UsIGFsbG93UmVjb25uZWN0KSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5sb2NhbGx5Q2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5lbmFibGVBdXRvUmVjb25uZWN0ID0gYWxsb3dSZWNvbm5lY3Q7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdE1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICAoX2EgPSB0aGlzLnByb3RvY29sKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGlzY29ubmVjdCgxMDAwLCBtZXNzYWdlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIHBlZXIgY29ubmVjdGlvblxuICAgICAqL1xuICAgIGNsb3NlUGVlckNvbm5lY3Rpb24oKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jbG9zZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDbG9zZSBhbGwgY29ubmVjdGlvbnNcbiAgICAgKi9cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZVNpZ25hbGluZ1NlcnZlcignJywgZmFsc2UpO1xuICAgICAgICB0aGlzLmNsb3NlUGVlckNvbm5lY3Rpb24oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmlyZXMgYSBWaWRlbyBTdGF0cyBFdmVudCBpbiB0aGUgUlRDIFBlZXIgQ29ubmVjdGlvblxuICAgICAqL1xuICAgIGdldFN0YXRzKCkge1xuICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci5nZW5lcmF0ZVN0YXRzKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBMYXRlbmN5IFRlc3QgUmVxdWVzdCB0byB0aGUgVUUgSW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZW5kTGF0ZW5jeVRlc3QoKSB7XG4gICAgICAgIHRoaXMubGF0ZW5jeVN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnTGF0ZW5jeVRlc3QnKShbXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgU3RhcnRUaW1lOiB0aGlzLmxhdGVuY3lTdGFydFRpbWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgRGF0YSBDaGFubmVsIExhdGVuY3kgVGVzdCBSZXF1ZXN0IHRvIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqL1xuICAgIHNlbmREYXRhQ2hhbm5lbExhdGVuY3lUZXN0KGRlc2NyaXB0b3IpIHtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdEYXRhQ2hhbm5lbExhdGVuY3lUZXN0JykoW1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZGVzY3JpcHRvcilcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIE1pblFQIGVuY29kZXIgc2V0dGluZyB0byB0aGUgVUUgSW5zdGFuY2UuXG4gICAgICogQHBhcmFtIG1pblFQIC0gVGhlIGxvd2VyIGJvdW5kIGZvciBRUCB3aGVuIGVuY29kaW5nXG4gICAgICogdmFsaWQgdmFsdWVzIGFyZSAoMS01MSkgd2hlcmU6XG4gICAgICogMSA9IEJlc3QgcXVhbGl0eSBidXQgaGlnaGVzdCBiaXRyYXRlLlxuICAgICAqIDUxID0gV29yc3QgcXVhbGl0eSBidXQgbG93ZXN0IGJpdHJhdGUuXG4gICAgICogQnkgZGVmYXVsdCB0aGUgbWluUVAgaXMgMSBtZWFuaW5nIHRoZSBlbmNvZGVyIGlzIGZyZWVcbiAgICAgKiB0byBhaW0gZm9yIHRoZSBiZXN0IHF1YWxpdHkgaXQgY2FuIG9uIHRoZSBnaXZlbiBuZXR3b3JrIGxpbmsuXG4gICAgICovXG4gICAgc2VuZEVuY29kZXJNaW5RUChtaW5RUCkge1xuICAgICAgICBMb2dnZXIuSW5mbyhgTWluUVA9JHttaW5RUH1cXG5gKTtcbiAgICAgICAgaWYgKG1pblFQICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnQ29tbWFuZCcpKFtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICdFbmNvZGVyLk1pblFQJzogbWluUVBcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGUgTWF4UVAgZW5jb2RlciBzZXR0aW5nIHRvIHRoZSBVRSBJbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gbWF4UVAgLSBUaGUgdXBwZXIgYm91bmQgZm9yIFFQIHdoZW4gZW5jb2RpbmdcbiAgICAgKiB2YWxpZCB2YWx1ZXMgYXJlICgxLTUxKSB3aGVyZTpcbiAgICAgKiAxID0gQmVzdCBxdWFsaXR5IGJ1dCBoaWdoZXN0IGJpdHJhdGUuXG4gICAgICogNTEgPSBXb3JzdCBxdWFsaXR5IGJ1dCBsb3dlc3QgYml0cmF0ZS5cbiAgICAgKiBCeSBkZWZhdWx0IHRoZSBtYXhRUCBpcyA1MSBtZWFuaW5nIHRoZSBlbmNvZGVyIGlzIGZyZWVcbiAgICAgKiB0byBkcm9wIHF1YWxpdHkgYXMgbG93IGFzIG5lZWRlZCBvbiB0aGUgZ2l2ZW4gbmV0d29yayBsaW5rLlxuICAgICAqL1xuICAgIHNlbmRFbmNvZGVyTWF4UVAobWF4UVApIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oYE1heFFQPSR7bWF4UVB9XFxuYCk7XG4gICAgICAgIGlmIChtYXhRUCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAnRW5jb2Rlci5NYXhRUCc6IG1heFFQXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIE1pblF1YWxpdHkgZW5jb2RlciBzZXR0aW5nIHRvIHRoZSBVRSBJbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gbWluUXVhbGl0eSAtIFRoZSBsb3dlciBib3VuZCBmb3IgcXVhbGl0eSB3aGVuIGVuY29kaW5nXG4gICAgICogdmFsaWQgdmFsdWVzIGFyZSAoMC0xMDApIHdoZXJlOlxuICAgICAqIDAgPSBXb3JzdCBxdWFsaXR5LlxuICAgICAqIDEwMCA9IEJlc3QgcXVhbGl0eS5cbiAgICAgKi9cbiAgICBzZW5kRW5jb2Rlck1pblF1YWxpdHkobWluUXVhbGl0eSkge1xuICAgICAgICBMb2dnZXIuSW5mbyhgTWluUXVhbGl0eT0ke21pblF1YWxpdHl9XFxuYCk7XG4gICAgICAgIGlmIChtaW5RdWFsaXR5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnQ29tbWFuZCcpKFtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICdFbmNvZGVyLk1pblF1YWxpdHknOiBtaW5RdWFsaXR5XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIE1heFF1YWxpdHkgZW5jb2RlciBzZXR0aW5nIHRvIHRoZSBVRSBJbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gbWF4UXVhbGl0eSAtIFRoZSB1cHBlciBib3VuZCBmb3IgcXVhbGl0eSB3aGVuIGVuY29kaW5nXG4gICAgICogdmFsaWQgdmFsdWVzIGFyZSAoMC0xMDApIHdoZXJlOlxuICAgICAqIDAgPSBXb3JzdCBxdWFsaXR5LlxuICAgICAqIDEwMCA9IEJlc3QgcXVhbGl0eS5cbiAgICAgKi9cbiAgICBzZW5kRW5jb2Rlck1heFF1YWxpdHkobWF4UXVhbGl0eSkge1xuICAgICAgICBMb2dnZXIuSW5mbyhgTWF4UXVhbGl0eT0ke21heFF1YWxpdHl9XFxuYCk7XG4gICAgICAgIGlmIChtYXhRdWFsaXR5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnQ29tbWFuZCcpKFtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICdFbmNvZGVyLk1heFF1YWxpdHknOiBtYXhRdWFsaXR5XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgdGhlIHsgV2ViUlRDLk1pbkJpdHJhdGU6IFNvbWVOdW1iZXIgfX0gY29tbWFuZCB0byBVRSB0byBzZXRcbiAgICAgKiB0aGUgbWluaW11bSBiaXRyYXRlIHRoYXQgd2UgYWxsb3cgV2ViUlRDIHRvIHVzZVxuICAgICAqIChub3RlIHNldHRpbmcgdGhpcyB0b28gaGlnaCBpbiBwb29yIG5ldHdvcmtzIGNhbiBiZSBwcm9ibGVtYXRpYykuXG4gICAgICogQHBhcmFtIG1pbkJpdHJhdGUgLSBUaGUgbWluaW11bSBiaXRyYXRlIHdlIHdvdWxkIGxpa2UgV2ViUlRDIHRvIG5vdCBmYWxsIGJlbG93LlxuICAgICAqL1xuICAgIHNlbmRXZWJSVENNaW5CaXRyYXRlKG1pbkJpdHJhdGUpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oYFdlYlJUQyBNaW4gQml0cmF0ZT0ke21pbkJpdHJhdGV9YCk7XG4gICAgICAgIGlmIChtaW5CaXRyYXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnQ29tbWFuZCcpKFtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICdXZWJSVEMuTWluQml0cmF0ZSc6IG1pbkJpdHJhdGVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGUgeyBXZWJSVEMuTWF4Qml0cmF0ZTogU29tZU51bWJlciB9fSBjb21tYW5kIHRvIFVFIHRvIHNldFxuICAgICAqIHRoZSBtaW5pbXVtIGJpdHJhdGUgdGhhdCB3ZSBhbGxvdyBXZWJSVEMgdG8gdXNlXG4gICAgICogKG5vdGUgc2V0dGluZyB0aGlzIHRvbyBsb3cgY291bGQgcmVzdWx0IGluIGJsb2NreSB2aWRlbykuXG4gICAgICogQHBhcmFtIG1pbkJpdHJhdGUgLSBUaGUgbWluaW11bSBiaXRyYXRlIHdlIHdvdWxkIGxpa2UgV2ViUlRDIHRvIG5vdCBmYWxsIGJlbG93LlxuICAgICAqL1xuICAgIHNlbmRXZWJSVENNYXhCaXRyYXRlKG1heEJpdHJhdGUpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oYFdlYlJUQyBNYXggQml0cmF0ZT0ke21heEJpdHJhdGV9YCk7XG4gICAgICAgIGlmIChtYXhCaXRyYXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnQ29tbWFuZCcpKFtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICdXZWJSVEMuTWF4Qml0cmF0ZSc6IG1heEJpdHJhdGVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGUgeyBXZWJSVEMuRnBzOiBTb21lTnVtYmVyIH19IFVFIDUuMCtcbiAgICAgKiBhbmQgeyBXZWJSVEMuTWF4RnBzIH0gVUUgNC4yNyBjb21tYW5kIHRvIHNldFxuICAgICAqIHRoZSBtYXhpbXVtIGZwcyB3ZSB3b3VsZCBsaWtlIFdlYlJUQyB0byBzdHJlYW0gYXQuXG4gICAgICogQHBhcmFtIGZwcyAtIFRoZSBtYXhpbXVtIHN0cmVhbSBmcHMuXG4gICAgICovXG4gICAgc2VuZFdlYlJUQ0ZwcyhmcHMpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oYFdlYlJUQyBGUFM9JHtmcHN9YCk7XG4gICAgICAgIGlmIChmcHMgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdDb21tYW5kJykoW1xuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHsgJ1dlYlJUQy5GcHMnOiBmcHMgfSlcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgLyogVE9ETzogUmVtb3ZlIHdoZW4gVUUgNC4yNyB1bnN1cHBvcnRlZC4gKi9cbiAgICAgICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnQ29tbWFuZCcpKFtcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7ICdXZWJSVEMuTWF4RnBzJzogZnBzIH0pXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kcyB0aGUgVUkgRGVzY3JpcHRvciBgc3RhdCBmcHNgIHRvIHRoZSBVRSBJbnN0YW5jZVxuICAgICAqL1xuICAgIHNlbmRTaG93RnBzKCkge1xuICAgICAgICBMb2dnZXIuSW5mbygnLS0tLSAgIFNlbmRpbmcgc2hvdyBzdGF0IHRvIFVFICAgLS0tLScpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ0NvbW1hbmQnKShbSlNPTi5zdHJpbmdpZnkoeyAnc3RhdC5mcHMnOiAnJyB9KV0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGFuIElmcmFtZSByZXF1ZXN0IHRvIHRoZSBzdHJlYW1lclxuICAgICAqL1xuICAgIHNlbmRJZnJhbWVSZXF1ZXN0KCkge1xuICAgICAgICBMb2dnZXIuSW5mbygnLS0tLSAgIFNlbmRpbmcgUmVxdWVzdCBmb3IgYW4gSUZyYW1lICAtLS0tJyk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnSUZyYW1lUmVxdWVzdCcpKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBVSUludGVyYWN0aW9uIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBlbWl0VUlJbnRlcmFjdGlvbihkZXNjcmlwdG9yKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCctLS0tICAgU2VuZGluZyBjdXN0b20gVUlJbnRlcmFjdGlvbiBtZXNzYWdlICAgLS0tLScpO1xuICAgICAgICB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1VJSW50ZXJhY3Rpb24nKShbSlNPTi5zdHJpbmdpZnkoZGVzY3JpcHRvcildKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZCBhIENvbW1hbmQgbWVzc2FnZVxuICAgICAqL1xuICAgIGVtaXRDb21tYW5kKGRlc2NyaXB0b3IpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0gICBTZW5kaW5nIGN1c3RvbSBDb21tYW5kIG1lc3NhZ2UgICAtLS0tJyk7XG4gICAgICAgIHRoaXMuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnQ29tbWFuZCcpKFtKU09OLnN0cmluZ2lmeShkZXNjcmlwdG9yKV0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgY29uc29sZSBjb21tYW5kIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBlbWl0Q29uc29sZUNvbW1hbmQoY29tbWFuZCkge1xuICAgICAgICBMb2dnZXIuSW5mbygnLS0tLSAgIFNlbmRpbmcgY3VzdG9tIENvbW1hbmQ6Q29uc29sZUNvbW1hbmQgbWVzc2FnZSAgIC0tLS0nKTtcbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdDb21tYW5kJykoW1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIENvbnNvbGVDb21tYW5kOiBjb21tYW5kXG4gICAgICAgICAgICB9KVxuICAgICAgICBdKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHRoZSBVRSBJbnN0YW5jZSB0byBoYXZlIG93bmVyc2hpcCBvZiBRdWFsaXR5XG4gICAgICovXG4gICAgc2VuZFJlcXVlc3RRdWFsaXR5Q29udHJvbE93bmVyc2hpcCgpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJy0tLS0gICBTZW5kaW5nIFJlcXVlc3QgdG8gQ29udHJvbCBRdWFsaXR5ICAtLS0tJyk7XG4gICAgICAgIHRoaXMudG9TdHJlYW1lck1lc3NhZ2VzQ29udHJvbGxlci5TZW5kUmVxdWVzdFF1YWxpdHlDb250cm9sKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNlbmQgYSBgVGV4dEJveEVudHJ5YCBtZXNzYWdlIGJhY2sgdG8gVUUuXG4gICAgICogQHBhcmFtIGNvbnRlbnRzIFRoZSBuZXcgY29udGVudHMgb2YgdGhlIFVFIHNpZGUgdGV4dCBib3guXG4gICAgICovXG4gICAgc2VuZFRleHRib3hFbnRyeShjb250ZW50cykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIExvZ2dlci5JbmZvKCctLS0tICAgU2VuZGluZyBUZXh0Ym94RW50cnkgbWVzc2FnZSAgLS0tLScpO1xuICAgICAgICAoX2EgPSB0aGlzLnN0cmVhbU1lc3NhZ2VDb250cm9sbGVyLnRvU3RyZWFtZXJIYW5kbGVycy5nZXQoJ1RleHRib3hFbnRyeScpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EoW2NvbnRlbnRzXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiBhIExhdGVuY3kgVGVzdCBSZXN1bHQgYXJlIHJlY2VpdmVkIGZyb20gdGhlIFVFIEluc3RhbmNlXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBMYXRlbmN5IFRlc3QgVGltaW5nc1xuICAgICAqL1xuICAgIGhhbmRsZUxhdGVuY3lUZXN0UmVzdWx0KG1lc3NhZ2UpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGFDaGFubmVsUmVjZWl2ZU1lc3NhZ2VUeXBlLmxhdGVuY3lUZXN0Jyk7XG4gICAgICAgIGNvbnN0IGxhdGVuY3lBc1N0cmluZyA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTE2JykuZGVjb2RlKG1lc3NhZ2Uuc2xpY2UoMSkpO1xuICAgICAgICBjb25zdCBsYXRlbmN5VGVzdFJlc3VsdHMgPSBuZXcgTGF0ZW5jeVRlc3RSZXN1bHRzKCk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24obGF0ZW5jeVRlc3RSZXN1bHRzLCBKU09OLnBhcnNlKGxhdGVuY3lBc1N0cmluZykpO1xuICAgICAgICBsYXRlbmN5VGVzdFJlc3VsdHMucHJvY2Vzc0ZpZWxkcygpO1xuICAgICAgICBsYXRlbmN5VGVzdFJlc3VsdHMudGVzdFN0YXJ0VGltZU1zID0gdGhpcy5sYXRlbmN5U3RhcnRUaW1lO1xuICAgICAgICBsYXRlbmN5VGVzdFJlc3VsdHMuYnJvd3NlclJlY2VpcHRUaW1lTXMgPSBEYXRlLm5vdygpO1xuICAgICAgICBsYXRlbmN5VGVzdFJlc3VsdHMubGF0ZW5jeUV4Y2x1ZGluZ0RlY29kZSA9IH5+KGxhdGVuY3lUZXN0UmVzdWx0cy5icm93c2VyUmVjZWlwdFRpbWVNcyAtIGxhdGVuY3lUZXN0UmVzdWx0cy50ZXN0U3RhcnRUaW1lTXMpO1xuICAgICAgICBsYXRlbmN5VGVzdFJlc3VsdHMudGVzdER1cmF0aW9uID0gfn4obGF0ZW5jeVRlc3RSZXN1bHRzLlRyYW5zbWlzc2lvblRpbWVNcyAtIGxhdGVuY3lUZXN0UmVzdWx0cy5SZWNlaXB0VGltZU1zKTtcbiAgICAgICAgbGF0ZW5jeVRlc3RSZXN1bHRzLm5ldHdvcmtMYXRlbmN5ID0gfn4obGF0ZW5jeVRlc3RSZXN1bHRzLmxhdGVuY3lFeGNsdWRpbmdEZWNvZGUgLSBsYXRlbmN5VGVzdFJlc3VsdHMudGVzdER1cmF0aW9uKTtcbiAgICAgICAgaWYgKGxhdGVuY3lUZXN0UmVzdWx0cy5mcmFtZURpc3BsYXlEZWx0YVRpbWVNcyAmJiBsYXRlbmN5VGVzdFJlc3VsdHMuYnJvd3NlclJlY2VpcHRUaW1lTXMpIHtcbiAgICAgICAgICAgIGxhdGVuY3lUZXN0UmVzdWx0cy5lbmRUb0VuZExhdGVuY3kgPSB+fihsYXRlbmN5VGVzdFJlc3VsdHMuZnJhbWVEaXNwbGF5RGVsdGFUaW1lTXMgK1xuICAgICAgICAgICAgICAgIGxhdGVuY3lUZXN0UmVzdWx0cy5uZXR3b3JrTGF0ZW5jeSxcbiAgICAgICAgICAgICAgICArbGF0ZW5jeVRlc3RSZXN1bHRzLkNhcHR1cmVUb1NlbmRNcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25MYXRlbmN5VGVzdFJlc3VsdChsYXRlbmN5VGVzdFJlc3VsdHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gYSBEYXRhIENoYW5uZWwgTGF0ZW5jeSBUZXN0IFJlc3BvbnNlIGlzIHJlY2VpdmVkIGZyb20gdGhlIFVFIEluc3RhbmNlXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBEYXRhIENoYW5uZWwgTGF0ZW5jeSBUZXN0IFJlc3BvbnNlXG4gICAgICovXG4gICAgaGFuZGxlRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3BvbnNlKG1lc3NhZ2UpIHtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGFDaGFubmVsUmVjZWl2ZU1lc3NhZ2VUeXBlLmRhdGFDaGFubmVsTGF0ZW5jeVJlc3BvbnNlJyk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQXNTdHJpbmcgPSBuZXcgVGV4dERlY29kZXIoJ3V0Zi0xNicpLmRlY29kZShtZXNzYWdlLnNsaWNlKDEpKTtcbiAgICAgICAgY29uc3QgbGF0ZW5jeVRlc3RSZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2VBc1N0cmluZyk7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uRGF0YUNoYW5uZWxMYXRlbmN5VGVzdFJlc3BvbnNlKGxhdGVuY3lUZXN0UmVzcG9uc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gdGhlIEVuY29kZXIgYW5kIFdlYiBSVEMgU2V0dGluZ3MgYXJlIHJlY2VpdmVkIGZyb20gdGhlIFVFIEluc3RhbmNlXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBJbml0aWFsIEVuY29kZXIgYW5kIFdlYiBSVEMgU2V0dGluZ3NcbiAgICAgKi9cbiAgICBoYW5kbGVJbml0aWFsU2V0dGluZ3MobWVzc2FnZSkge1xuICAgICAgICBMb2dnZXIuSW5mbygnRGF0YUNoYW5uZWxSZWNlaXZlTWVzc2FnZVR5cGUuSW5pdGlhbFNldHRpbmdzJyk7XG4gICAgICAgIGNvbnN0IHBheWxvYWRBc1N0cmluZyA9IG5ldyBUZXh0RGVjb2RlcigndXRmLTE2JykuZGVjb2RlKG1lc3NhZ2Uuc2xpY2UoMSkpO1xuICAgICAgICBjb25zdCBwYXJzZWRJbml0aWFsU2V0dGluZ3MgPSBKU09OLnBhcnNlKHBheWxvYWRBc1N0cmluZyk7XG4gICAgICAgIGNvbnN0IGluaXRpYWxTZXR0aW5ncyA9IG5ldyBJbml0aWFsU2V0dGluZ3MoKTtcbiAgICAgICAgaWYgKHBhcnNlZEluaXRpYWxTZXR0aW5ncy5FbmNvZGVyKSB7XG4gICAgICAgICAgICBpbml0aWFsU2V0dGluZ3MuRW5jb2RlclNldHRpbmdzID0gcGFyc2VkSW5pdGlhbFNldHRpbmdzLkVuY29kZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZEluaXRpYWxTZXR0aW5ncy5XZWJSVEMpIHtcbiAgICAgICAgICAgIGluaXRpYWxTZXR0aW5ncy5XZWJSVENTZXR0aW5ncyA9IHBhcnNlZEluaXRpYWxTZXR0aW5ncy5XZWJSVEM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZEluaXRpYWxTZXR0aW5ncy5QaXhlbFN0cmVhbWluZykge1xuICAgICAgICAgICAgaW5pdGlhbFNldHRpbmdzLlBpeGVsU3RyZWFtaW5nU2V0dGluZ3MgPSBwYXJzZWRJbml0aWFsU2V0dGluZ3MuUGl4ZWxTdHJlYW1pbmc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZEluaXRpYWxTZXR0aW5ncy5Db25maWdPcHRpb25zICYmXG4gICAgICAgICAgICBwYXJzZWRJbml0aWFsU2V0dGluZ3MuQ29uZmlnT3B0aW9ucy5EZWZhdWx0VG9Ib3ZlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXRGbGFnRW5hYmxlZChGbGFncy5Ib3ZlcmluZ01vdXNlTW9kZSwgISFwYXJzZWRJbml0aWFsU2V0dGluZ3MuQ29uZmlnT3B0aW9ucy5EZWZhdWx0VG9Ib3Zlcik7XG4gICAgICAgIH1cbiAgICAgICAgaW5pdGlhbFNldHRpbmdzLnVlQ29tcGF0aWJsZSgpO1xuICAgICAgICBMb2dnZXIuSW5mbyhwYXlsb2FkQXNTdHJpbmcpO1xuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vbkluaXRpYWxTZXR0aW5ncyhpbml0aWFsU2V0dGluZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gdGhlIFF1YW50aXphdGlvbiBQYXJhbWV0ZXIgYXJlIHJlY2VpdmVkIGZyb20gdGhlIFVFIEluc3RhbmNlXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBFbmNvZGVycyBRdWFudGl6YXRpb24gUGFyYW1ldGVyXG4gICAgICovXG4gICAgaGFuZGxlVmlkZW9FbmNvZGVyQXZnUVAobWVzc2FnZSkge1xuICAgICAgICBMb2dnZXIuSW5mbygnRGF0YUNoYW5uZWxSZWNlaXZlTWVzc2FnZVR5cGUuVmlkZW9FbmNvZGVyQXZnUVAnKTtcbiAgICAgICAgY29uc3QgQXZnUVAgPSBOdW1iZXIobmV3IFRleHREZWNvZGVyKCd1dGYtMTYnKS5kZWNvZGUobWVzc2FnZS5zbGljZSgxKSkpO1xuICAgICAgICB0aGlzLnNldFZpZGVvRW5jb2RlckF2Z1FQKEF2Z1FQKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZSB2aWRlbyBlbGVtZW50IGhhcyBiZWVuIGxvYWRlZCB3aXRoIGEgc3JjT2JqZWN0XG4gICAgICovXG4gICAgaGFuZGxlVmlkZW9Jbml0aWFsaXplZCgpIHtcbiAgICAgICAgdGhpcy5waXhlbFN0cmVhbWluZy5fb25WaWRlb0luaXRpYWxpemVkKCk7XG4gICAgICAgIC8vIGVpdGhlciBhdXRvcGxheSB0aGUgdmlkZW8gb3Igc2V0IHVwIHRoZSBwbGF5IG92ZXJsYXlcbiAgICAgICAgdGhpcy5hdXRvUGxheVZpZGVvT3JTZXRVcFBsYXlPdmVybGF5KCk7XG4gICAgICAgIHRoaXMucmVzaXplUGxheWVyU3R5bGUoKTtcbiAgICAgICAgdGhpcy52aWRlb1BsYXllci51cGRhdGVWaWRlb1N0cmVhbVNpemUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmxhZyBzZXQgaWYgdGhlIHVzZXIgaGFzIFF1YWxpdHkgT3duZXJzaGlwXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBEb2VzIHRoZSBjdXJyZW50IGNsaWVudCBoYXZlIFF1YWxpdHkgT3duZXJzaGlwXG4gICAgICovXG4gICAgb25RdWFsaXR5Q29udHJvbE93bmVyc2hpcChtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgVWludDhBcnJheShtZXNzYWdlKTtcbiAgICAgICAgTG9nZ2VyLkluZm8oJ0RhdGFDaGFubmVsUmVjZWl2ZU1lc3NhZ2VUeXBlLlF1YWxpdHlDb250cm9sT3duZXJzaGlwJyk7XG4gICAgICAgIHRoaXMuaXNRdWFsaXR5Q29udHJvbGxlciA9IG5ldyBCb29sZWFuKHZpZXdbMV0pLnZhbHVlT2YoKTtcbiAgICAgICAgTG9nZ2VyLkluZm8oYFJlY2VpdmVkIHF1YWxpdHkgY29udHJvbGxlciBtZXNzYWdlLCB3aWxsIGNvbnRyb2wgcXVhbGl0eTogJHt0aGlzLmlzUXVhbGl0eUNvbnRyb2xsZXJ9YCk7XG4gICAgICAgIHRoaXMucGl4ZWxTdHJlYW1pbmcuX29uUXVhbGl0eUNvbnRyb2xPd25lcnNoaXAodGhpcy5pc1F1YWxpdHlDb250cm9sbGVyKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB3aGVuIHRoZSBBZ2dyZWdhdGVkIHN0YXRzIGFyZSBDb2xsZWN0ZWRcbiAgICAgKiBAcGFyYW0gc3RhdHMgLSBBZ2dyZWdhdGVkIFN0YXRzXG4gICAgICovXG4gICAgaGFuZGxlVmlkZW9TdGF0cyhzdGF0cykge1xuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vblZpZGVvU3RhdHMoc3RhdHMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUbyBSZXNpemUgdGhlIFZpZGVvIFBsYXllciBlbGVtZW50XG4gICAgICovXG4gICAgcmVzaXplUGxheWVyU3R5bGUoKSB7XG4gICAgICAgIHRoaXMudmlkZW9QbGF5ZXIucmVzaXplUGxheWVyU3R5bGUoKTtcbiAgICB9XG4gICAgc2V0UHJlZmVycmVkQ29kZWMoY29kZWMpIHtcbiAgICAgICAgdGhpcy5wcmVmZXJyZWRDb2RlYyA9IGNvZGVjO1xuICAgICAgICBpZiAodGhpcy5wZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgIHRoaXMucGVlckNvbm5lY3Rpb25Db250cm9sbGVyLnByZWZlcnJlZENvZGVjID0gY29kZWM7XG4gICAgICAgICAgICB0aGlzLnBlZXJDb25uZWN0aW9uQ29udHJvbGxlci51cGRhdGVDb2RlY1NlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHNldFZpZGVvRW5jb2RlckF2Z1FQKGF2Z1FQKSB7XG4gICAgICAgIHRoaXMudmlkZW9BdmdRcCA9IGF2Z1FQO1xuICAgICAgICB0aGlzLnBpeGVsU3RyZWFtaW5nLl9vblZpZGVvRW5jb2RlckF2Z1FQKHRoaXMudmlkZW9BdmdRcCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGVuYWJsZXMvZGlzYWJsZXMga2V5Ym9hcmQgZXZlbnQgbGlzdGVuZXJzXG4gICAgICovXG4gICAgc2V0S2V5Ym9hcmRJbnB1dEVuYWJsZWQoaXNFbmFibGVkKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5rZXlib2FyZENvbnRyb2xsZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS51bnJlZ2lzdGVyKCk7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMua2V5Ym9hcmRDb250cm9sbGVyID0gdGhpcy5pbnB1dENsYXNzZXNGYWN0b3J5LnJlZ2lzdGVyS2V5Qm9hcmQodGhpcy5jb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIGVuYWJsZXMvZGlzYWJsZXMgbW91c2UgZXZlbnQgbGlzdGVuZXJzXG4gICAgICovXG4gICAgc2V0TW91c2VJbnB1dEVuYWJsZWQoaXNFbmFibGVkKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5tb3VzZUNvbnRyb2xsZXIpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS51bnJlZ2lzdGVyKCk7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vdXNlTW9kZSA9IHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUpXG4gICAgICAgICAgICAgICAgPyBDb250cm9sU2NoZW1lVHlwZS5Ib3ZlcmluZ01vdXNlXG4gICAgICAgICAgICAgICAgOiBDb250cm9sU2NoZW1lVHlwZS5Mb2NrZWRNb3VzZTtcbiAgICAgICAgICAgIHRoaXMubW91c2VDb250cm9sbGVyID0gdGhpcy5pbnB1dENsYXNzZXNGYWN0b3J5LnJlZ2lzdGVyTW91c2UobW91c2VNb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBlbmFibGVzL2Rpc2FibGVzIHRvdWNoIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIHNldFRvdWNoSW5wdXRFbmFibGVkKGlzRW5hYmxlZCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMudG91Y2hDb250cm9sbGVyKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudW5yZWdpc3RlcigpO1xuICAgICAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoQ29udHJvbGxlciA9IHRoaXMuaW5wdXRDbGFzc2VzRmFjdG9yeS5yZWdpc3RlclRvdWNoKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoRmxhZ3MuRmFrZU1vdXNlV2l0aFRvdWNoZXMpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBlbmFibGVzL2Rpc2FibGVzIGdhbWUgcGFkIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIHNldEdhbWVQYWRJbnB1dEVuYWJsZWQoaXNFbmFibGVkKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5nYW1lUGFkQ29udHJvbGxlcikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnVucmVnaXN0ZXIoKTtcbiAgICAgICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5nYW1lUGFkQ29udHJvbGxlciA9IHRoaXMuaW5wdXRDbGFzc2VzRmFjdG9yeS5yZWdpc3RlckdhbWVQYWQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZWdpc3RlckRhdGFDaGFubmVsRXZlbnRFbWl0dGVycyhkYXRhQ2hhbm5lbCkge1xuICAgICAgICBkYXRhQ2hhbm5lbC5vbk9wZW4gPSAobGFiZWwsIGV2ZW50KSA9PiB0aGlzLnBpeGVsU3RyZWFtaW5nLmRpc3BhdGNoRXZlbnQobmV3IERhdGFDaGFubmVsT3BlbkV2ZW50KHsgbGFiZWwsIGV2ZW50IH0pKTtcbiAgICAgICAgZGF0YUNoYW5uZWwub25DbG9zZSA9IChsYWJlbCwgZXZlbnQpID0+IHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgRGF0YUNoYW5uZWxDbG9zZUV2ZW50KHsgbGFiZWwsIGV2ZW50IH0pKTtcbiAgICAgICAgZGF0YUNoYW5uZWwub25FcnJvciA9IChsYWJlbCwgZXZlbnQpID0+IHRoaXMucGl4ZWxTdHJlYW1pbmcuZGlzcGF0Y2hFdmVudChuZXcgRGF0YUNoYW5uZWxFcnJvckV2ZW50KHsgbGFiZWwsIGV2ZW50IH0pKTtcbiAgICB9XG4gICAgcmVnaXN0ZXJNZXNzYWdlSGFuZGxlcihuYW1lLCBkaXJlY3Rpb24sIGhhbmRsZXIpIHtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gTWVzc2FnZURpcmVjdGlvbi5Gcm9tU3RyZWFtZXIgJiYgdHlwZW9mIGhhbmRsZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBMb2dnZXIuV2FybmluZyhgVW5hYmxlIHRvIHJlZ2lzdGVyIGhhbmRsZXIgZm9yICR7bmFtZX0gYXMgbm8gaGFuZGxlciB3YXMgcGFzc2VkYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKGRpcmVjdGlvbiwgbmFtZSwgKGRhdGEpID0+IHR5cGVvZiBoYW5kbGVyID09PSAndW5kZWZpbmVkJyAmJiBkaXJlY3Rpb24gPT09IE1lc3NhZ2VEaXJlY3Rpb24uVG9TdHJlYW1lclxuICAgICAgICAgICAgPyB0aGlzLnNlbmRNZXNzYWdlQ29udHJvbGxlci5zZW5kTWVzc2FnZVRvU3RyZWFtZXIobmFtZSwgZGF0YSlcbiAgICAgICAgICAgIDogaGFuZGxlcihkYXRhKSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9V2ViUnRjUGxheWVyQ29udHJvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdjb21tb24tdWU1LjUnO1xuaW1wb3J0IHsgWFJHYW1lcGFkQ29udHJvbGxlciB9IGZyb20gJy4uL0lucHV0cy9YUkdhbWVwYWRDb250cm9sbGVyJztcbmltcG9ydCB7IFhyRnJhbWVFdmVudCB9IGZyb20gJy4uL1V0aWwvRXZlbnRFbWl0dGVyJztcbmltcG9ydCB7IEZsYWdzIH0gZnJvbSAnLi4vQ29uZmlnL0NvbmZpZyc7XG5leHBvcnQgY2xhc3MgV2ViWFJDb250cm9sbGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih3ZWJSdGNQbGF5ZXJDb250cm9sbGVyKSB7XG4gICAgICAgIHRoaXMueHJWaWV3ZXJQb3NlID0gbnVsbDtcbiAgICAgICAgLy8gVXNlZCBmb3IgY29tcGFyaXNvbnMgdG8gZW5zdXJlIHR3byBudW1iZXJzIGFyZSBjbG9zZSBlbm91Z2guXG4gICAgICAgIHRoaXMuRVBTSUxPTiA9IDAuMDAwMDAwMTtcbiAgICAgICAgdGhpcy52aWRlb1RleHR1cmUgPSBudWxsO1xuICAgICAgICB0aGlzLnByZXZWaWRlb1dpZHRoID0gMDtcbiAgICAgICAgdGhpcy5wcmV2VmlkZW9IZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLmxlZnRWaWV3ID0gbnVsbDtcbiAgICAgICAgdGhpcy5yaWdodFZpZXcgPSBudWxsO1xuICAgICAgICAvLyBTdG9yZSB0aGUgSE1EIGRhdGEgd2UgaGF2ZSBsYXN0IHNlbnQgKG5vdCBhbGwgb2YgaXQgaXMgbmVlZGVkIGV2ZXJ5IGZyYW1lIHVubGVzcyBpdCBjaGFuZ2VzKVxuICAgICAgICB0aGlzLmxhc3RTZW50TGVmdEV5ZVByb2ogPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RTZW50UmlnaHRFeWVQcm9qID0gbnVsbDtcbiAgICAgICAgdGhpcy5sYXN0U2VudFJlbGF0aXZlTGVmdEV5ZVBvcyA9IG51bGw7XG4gICAgICAgIHRoaXMubGFzdFNlbnRSZWxhdGl2ZVJpZ2h0RXllUG9zID0gbnVsbDtcbiAgICAgICAgdGhpcy54clNlc3Npb24gPSBudWxsO1xuICAgICAgICB0aGlzLndlYlJ0Y0NvbnRyb2xsZXIgPSB3ZWJSdGNQbGF5ZXJDb250cm9sbGVyO1xuICAgICAgICB0aGlzLnhyR2FtZXBhZENvbnRyb2xsZXIgPSBuZXcgWFJHYW1lcGFkQ29udHJvbGxlcih0aGlzLndlYlJ0Y0NvbnRyb2xsZXIuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIpO1xuICAgICAgICB0aGlzLm9uU2Vzc2lvbkVuZGVkID0gbmV3IEV2ZW50VGFyZ2V0KCk7XG4gICAgICAgIHRoaXMub25TZXNzaW9uU3RhcnRlZCA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgICAgICB0aGlzLm9uRnJhbWUgPSBuZXcgRXZlbnRUYXJnZXQoKTtcbiAgICB9XG4gICAgeHJDbGlja2VkKCkge1xuICAgICAgICBpZiAoIXRoaXMueHJTZXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAoIW5hdmlnYXRvci54cikge1xuICAgICAgICAgICAgICAgIExvZ2dlci5FcnJvcignVGhpcyBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgWFIuJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmF2aWdhdG9yLnhyXG4gICAgICAgICAgICAgICAgLyogUmVxdWVzdCBpbW1lcnNpdmUtdnIgc2Vzc2lvbiB3aXRob3V0IGFueSBvcHRpb25hbCBmZWF0dXJlcy4gKi9cbiAgICAgICAgICAgICAgICAucmVxdWVzdFNlc3Npb24oJ2ltbWVyc2l2ZS12cicsIHsgb3B0aW9uYWxGZWF0dXJlczogW10gfSlcbiAgICAgICAgICAgICAgICAudGhlbigoc2Vzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMub25YclNlc3Npb25TdGFydGVkKHNlc3Npb24pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnhyU2Vzc2lvbi5lbmQoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblhyU2Vzc2lvbkVuZGVkKCkge1xuICAgICAgICBMb2dnZXIuSW5mbygnWFIgU2Vzc2lvbiBlbmRlZCcpO1xuICAgICAgICB0aGlzLnhyU2Vzc2lvbiA9IG51bGw7XG4gICAgICAgIHRoaXMub25TZXNzaW9uRW5kZWQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3hyU2Vzc2lvbkVuZGVkJykpO1xuICAgIH1cbiAgICBpbml0R0woKSB7XG4gICAgICAgIGlmICh0aGlzLmdsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuZ2wgPSBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wyJywge1xuICAgICAgICAgICAgeHJDb21wYXRpYmxlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBTZXQgb3VyIGNsZWFyIGNvbG9yXG4gICAgICAgIHRoaXMuZ2wuY2xlYXJDb2xvcigwLjAsIDAuMCwgMC4wLCAxKTtcbiAgICB9XG4gICAgaW5pdFNoYWRlcnMoKSB7XG4gICAgICAgIC8vIHNoYWRlciBzb3VyY2UgY29kZVxuICAgICAgICBjb25zdCB2ZXJ0ZXhTaGFkZXJTb3VyY2UgPSBgXG4gICAgICAgIGF0dHJpYnV0ZSB2ZWMyIGFfcG9zaXRpb247XG4gICAgICAgIGF0dHJpYnV0ZSB2ZWMyIGFfdGV4Q29vcmQ7XG5cbiAgICAgICAgLy8gdmFyeWluZ3NcbiAgICAgICAgdmFyeWluZyB2ZWMyIHZfdGV4Q29vcmQ7XG5cbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV9wb3NpdGlvbi54LCBhX3Bvc2l0aW9uLnksIDAsIDEpO1xuICAgICAgICAgICAvLyBwYXNzIHRoZSB0ZXhDb29yZCB0byB0aGUgZnJhZ21lbnQgc2hhZGVyXG4gICAgICAgICAgIC8vIFRoZSBHUFUgd2lsbCBpbnRlcnBvbGF0ZSB0aGlzIHZhbHVlIGJldHdlZW4gcG9pbnRzLlxuICAgICAgICAgICB2X3RleENvb3JkID0gYV90ZXhDb29yZDtcbiAgICAgICAgfVxuICAgICAgICBgO1xuICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlclNvdXJjZSA9IGBcbiAgICAgICAgcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cbiAgICAgICAgLy8gb3VyIHRleHR1cmVcbiAgICAgICAgdW5pZm9ybSBzYW1wbGVyMkQgdV9pbWFnZTtcblxuICAgICAgICAvLyB0aGUgdGV4Q29vcmRzIHBhc3NlZCBpbiBmcm9tIHRoZSB2ZXJ0ZXggc2hhZGVyLlxuICAgICAgICB2YXJ5aW5nIHZlYzIgdl90ZXhDb29yZDtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgIGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh1X2ltYWdlLCB2X3RleENvb3JkKTtcbiAgICAgICAgfVxuICAgICAgICBgO1xuICAgICAgICAvLyBzZXR1cCB2ZXJ0ZXggc2hhZGVyXG4gICAgICAgIGNvbnN0IHZlcnRleFNoYWRlciA9IHRoaXMuZ2wuY3JlYXRlU2hhZGVyKHRoaXMuZ2wuVkVSVEVYX1NIQURFUik7XG4gICAgICAgIHRoaXMuZ2wuc2hhZGVyU291cmNlKHZlcnRleFNoYWRlciwgdmVydGV4U2hhZGVyU291cmNlKTtcbiAgICAgICAgdGhpcy5nbC5jb21waWxlU2hhZGVyKHZlcnRleFNoYWRlcik7XG4gICAgICAgIC8vIHNldHVwIGZyYWdtZW50IHNoYWRlclxuICAgICAgICBjb25zdCBmcmFnbWVudFNoYWRlciA9IHRoaXMuZ2wuY3JlYXRlU2hhZGVyKHRoaXMuZ2wuRlJBR01FTlRfU0hBREVSKTtcbiAgICAgICAgdGhpcy5nbC5zaGFkZXJTb3VyY2UoZnJhZ21lbnRTaGFkZXIsIGZyYWdtZW50U2hhZGVyU291cmNlKTtcbiAgICAgICAgdGhpcy5nbC5jb21waWxlU2hhZGVyKGZyYWdtZW50U2hhZGVyKTtcbiAgICAgICAgLy8gc2V0dXAgR0xTTCBwcm9ncmFtXG4gICAgICAgIGNvbnN0IHNoYWRlclByb2dyYW0gPSB0aGlzLmdsLmNyZWF0ZVByb2dyYW0oKTtcbiAgICAgICAgdGhpcy5nbC5hdHRhY2hTaGFkZXIoc2hhZGVyUHJvZ3JhbSwgdmVydGV4U2hhZGVyKTtcbiAgICAgICAgdGhpcy5nbC5hdHRhY2hTaGFkZXIoc2hhZGVyUHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIpO1xuICAgICAgICB0aGlzLmdsLmxpbmtQcm9ncmFtKHNoYWRlclByb2dyYW0pO1xuICAgICAgICB0aGlzLmdsLnVzZVByb2dyYW0oc2hhZGVyUHJvZ3JhbSk7XG4gICAgICAgIC8vIGxvb2sgdXAgd2hlcmUgdmVydGV4IGRhdGEgbmVlZHMgdG8gZ29cbiAgICAgICAgdGhpcy5wb3NpdGlvbkxvY2F0aW9uID0gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbihzaGFkZXJQcm9ncmFtLCAnYV9wb3NpdGlvbicpO1xuICAgICAgICB0aGlzLnRleGNvb3JkTG9jYXRpb24gPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKHNoYWRlclByb2dyYW0sICdhX3RleENvb3JkJyk7XG4gICAgfVxuICAgIHVwZGF0ZVZpZGVvVGV4dHVyZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnZpZGVvVGV4dHVyZSkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIG91ciB0ZXh0dXJlIHRoYXQgd2UgdXNlIGluIG91ciBzaGFkZXJcbiAgICAgICAgICAgIC8vIGFuZCBiaW5kIGl0IG9uY2UgYmVjYXVzZSB3ZSBuZXZlciB1c2UgYW55IG90aGVyIHRleHR1cmUuXG4gICAgICAgICAgICB0aGlzLnZpZGVvVGV4dHVyZSA9IHRoaXMuZ2wuY3JlYXRlVGV4dHVyZSgpO1xuICAgICAgICAgICAgdGhpcy5nbC5iaW5kVGV4dHVyZSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMudmlkZW9UZXh0dXJlKTtcbiAgICAgICAgICAgIC8vIFNldCB0aGUgcGFyYW1ldGVycyBzbyB3ZSBjYW4gcmVuZGVyIGFueSBzaXplIGltYWdlLlxuICAgICAgICAgICAgdGhpcy5nbC50ZXhQYXJhbWV0ZXJpKHRoaXMuZ2wuVEVYVFVSRV8yRCwgdGhpcy5nbC5URVhUVVJFX1dSQVBfUywgdGhpcy5nbC5DTEFNUF9UT19FREdFKTtcbiAgICAgICAgICAgIHRoaXMuZ2wudGV4UGFyYW1ldGVyaSh0aGlzLmdsLlRFWFRVUkVfMkQsIHRoaXMuZ2wuVEVYVFVSRV9XUkFQX1QsIHRoaXMuZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICB0aGlzLmdsLnRleFBhcmFtZXRlcmkodGhpcy5nbC5URVhUVVJFXzJELCB0aGlzLmdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgdGhpcy5nbC5MSU5FQVIpO1xuICAgICAgICAgICAgdGhpcy5nbC50ZXhQYXJhbWV0ZXJpKHRoaXMuZ2wuVEVYVFVSRV8yRCwgdGhpcy5nbC5URVhUVVJFX01BR19GSUxURVIsIHRoaXMuZ2wuTElORUFSKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2aWRlb0hlaWdodCA9IHRoaXMud2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci5nZXRWaWRlb0VsZW1lbnQoKS52aWRlb0hlaWdodDtcbiAgICAgICAgY29uc3QgdmlkZW9XaWR0aCA9IHRoaXMud2ViUnRjQ29udHJvbGxlci52aWRlb1BsYXllci5nZXRWaWRlb0VsZW1lbnQoKS52aWRlb1dpZHRoO1xuICAgICAgICBpZiAodGhpcy5wcmV2VmlkZW9IZWlnaHQgIT0gdmlkZW9IZWlnaHQgfHwgdGhpcy5wcmV2VmlkZW9XaWR0aCAhPSB2aWRlb1dpZHRoKSB7XG4gICAgICAgICAgICAvLyBEbyBmdWxsIHVwZGF0ZSBvZiB0ZXh0dXJlIGlmIGRpbWVuc2lvbnMgZG8gbm90IG1hdGNoXG4gICAgICAgICAgICB0aGlzLmdsLnRleEltYWdlMkQodGhpcy5nbC5URVhUVVJFXzJELCAwLCB0aGlzLmdsLlJHQkEsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCAwLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuVU5TSUdORURfQllURSwgdGhpcy53ZWJSdGNDb250cm9sbGVyLnZpZGVvUGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIGRpbWVuc2lvbnMgbWF0Y2gganVzdCB1cGRhdGUgdGhlIHN1YiByZWdpb25cbiAgICAgICAgICAgIHRoaXMuZ2wudGV4U3ViSW1hZ2UyRCh0aGlzLmdsLlRFWFRVUkVfMkQsIDAsIDAsIDAsIHZpZGVvV2lkdGgsIHZpZGVvSGVpZ2h0LCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuVU5TSUdORURfQllURSwgdGhpcy53ZWJSdGNDb250cm9sbGVyLnZpZGVvUGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgcHJldiB2aWRlbyB3aWR0aC9oZWlnaHRcbiAgICAgICAgdGhpcy5wcmV2VmlkZW9IZWlnaHQgPSB2aWRlb0hlaWdodDtcbiAgICAgICAgdGhpcy5wcmV2VmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7XG4gICAgfVxuICAgIGluaXRCdWZmZXJzKCkge1xuICAgICAgICAvLyBDcmVhdGUgb3V0IHBvc2l0aW9uIGJ1ZmZlciBhbmQgaXRzIHZlcnRleCBzaGFkZXIgYXR0cmlidXRlXG4gICAgICAgIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIGJ1ZmZlciB0byBwdXQgdGhlIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgcGxhbmUgd2Ugd2lsbCBkcmF3IHRoZSB2aWRlbyBzdHJlYW0gb250b1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkJ1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgICAgICAvLyBCaW5kIHRoZSBwb3NpdGlvbiBidWZmZXJcbiAgICAgICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy5wb3NpdGlvbkJ1ZmZlcik7XG4gICAgICAgICAgICAvLyBFbmFibGUgYHBvc2l0aW9uTG9jYXRpb25gIHRvIGJlIHVzZWQgYXMgdmVydGV4IHNoYWRlciBhdHRyaWJ1dGVcbiAgICAgICAgICAgIHRoaXMuZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodGhpcy5wb3NpdGlvbkxvY2F0aW9uKTtcbiAgICAgICAgICAgIC8vIE5vdGU6IHBvc2l0aW9ucyBhcmUgcGFzc2VkIGluIGNsaXAtc3BhY2UgY29vcmRpbmF0ZXMgWy0xLi4xXSBzbyBubyBuZWVkIHRvIGNvbnZlcnQgaW4tc2hhZGVyXG4gICAgICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMuZ2wuYnVmZmVyRGF0YSh0aGlzLmdsLkFSUkFZX0JVRkZFUiwgbmV3IEZsb2F0MzJBcnJheShbXG4gICAgICAgICAgICAgICAgLTEuMCwgMS4wLFxuICAgICAgICAgICAgICAgIDEuMCwgMS4wLFxuICAgICAgICAgICAgICAgIC0xLjAsIC0xLjAsXG4gICAgICAgICAgICAgICAgLTEuMCwgLTEuMCxcbiAgICAgICAgICAgICAgICAxLjAsIDEuMCxcbiAgICAgICAgICAgICAgICAxLjAsIC0xLjBcbiAgICAgICAgICAgIF0pLCB0aGlzLmdsLlNUQVRJQ19EUkFXKTtcbiAgICAgICAgICAgIC8vIFRlbGwgcG9zaXRpb24gYXR0cmlidXRlIG9mIHRoZSB2ZXJ0ZXggc2hhZGVyIGhvdyB0byBnZXQgZGF0YSBvdXQgb2YgdGhlIGJvdW5kIGJ1ZmZlciAodGhlIHBvc2l0aW9uQnVmZmVyKVxuICAgICAgICAgICAgdGhpcy5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMucG9zaXRpb25Mb2NhdGlvbiwgMiAvKnNpemUqLywgdGhpcy5nbC5GTE9BVCAvKnR5cGUqLywgZmFsc2UgLypub3JtYWxpemUqLywgMCAvKnN0cmlkZSovLCAwIC8qb2Zmc2V0Ki8pO1xuICAgICAgICB9XG4gICAgICAgIC8vIENyZWF0ZSBvdXIgdGV4dHVyZSBjb29yZGluYXRlIGJ1ZmZlcnMgZm9yIGFjY2Vzc2luZyBvdXIgdGV4dHVyZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLnRleGNvb3JkQnVmZmVyID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgICAgIC8vIEJpbmQgdGhlIHRleHR1cmUgY29vcmRpbmF0ZSBidWZmZXJcbiAgICAgICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy50ZXhjb29yZEJ1ZmZlcik7XG4gICAgICAgICAgICAvLyBFbmFibGUgYHRleGNvb3JkTG9jYXRpb25gIHRvIGJlIHVzZWQgYXMgYSB2ZXJ0ZXggc2hhZGVyIGF0dHJpYnV0ZVxuICAgICAgICAgICAgdGhpcy5nbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh0aGlzLnRleGNvb3JkTG9jYXRpb24pO1xuICAgICAgICAgICAgLy8gVGhlIHRleHR1cmUgY29vcmRpbmF0ZXMgdG8gYXBwbHkgZm9yIHJlY3RhbmdsZSB3ZSBhcmUgZHJhd2luZ1xuICAgICAgICAgICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDEuMCwgMS4wLCAwLjAsIDEuMCwgMS4wXSksIHRoaXMuZ2wuU1RBVElDX0RSQVcpO1xuICAgICAgICAgICAgLy8gVGVsbCB0ZXh0dXJlIGNvb3JkaW5hdGUgYXR0cmlidXRlIG9mIHRoZSB2ZXJ0ZXggc2hhZGVyIGhvdyB0byBnZXQgZGF0YSBvdXQgb2YgdGhlIGJvdW5kIGJ1ZmZlciAodGhlIHRleGNvb3JkQnVmZmVyKVxuICAgICAgICAgICAgdGhpcy5nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHRoaXMudGV4Y29vcmRMb2NhdGlvbiwgMiAvKnNpemUqLywgdGhpcy5nbC5GTE9BVCAvKnR5cGUqLywgZmFsc2UgLypub3JtYWxpemUqLywgMCAvKnN0cmlkZSovLCAwIC8qb2Zmc2V0Ki8pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uWHJTZXNzaW9uU3RhcnRlZChzZXNzaW9uKSB7XG4gICAgICAgIExvZ2dlci5JbmZvKCdYUiBTZXNzaW9uIHN0YXJ0ZWQnKTtcbiAgICAgICAgdGhpcy54clNlc3Npb24gPSBzZXNzaW9uO1xuICAgICAgICB0aGlzLnhyU2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uWHJTZXNzaW9uRW5kZWQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEluaXRpYWxpemF0aW9uXG4gICAgICAgIHRoaXMuaW5pdEdMKCk7XG4gICAgICAgIHRoaXMuaW5pdFNoYWRlcnMoKTtcbiAgICAgICAgdGhpcy5pbml0QnVmZmVycygpO1xuICAgICAgICBzZXNzaW9uLnJlcXVlc3RSZWZlcmVuY2VTcGFjZSgnbG9jYWwnKS50aGVuKChyZWZTcGFjZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy54clJlZlNwYWNlID0gcmVmU3BhY2U7XG4gICAgICAgICAgICAvLyBTZXQgdXAgb3VyIGJhc2UgbGF5ZXIgKGkuZS4gYSBwcm9qZWN0aW9uIGxheWVyIHRoYXQgZmlsbHMgdGhlIGVudGlyZSBYUiB2aWV3cG9ydCkuXG4gICAgICAgICAgICB0aGlzLnhyU2Vzc2lvbi51cGRhdGVSZW5kZXJTdGF0ZSh7XG4gICAgICAgICAgICAgICAgYmFzZUxheWVyOiBuZXcgWFJXZWJHTExheWVyKHRoaXMueHJTZXNzaW9uLCB0aGlzLmdsKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGFyZ2V0IGZyYW1lcmF0ZSB0byA5MCBmcHMgaWYgOTAgZnBzIGlzIHN1cHBvcnRlZCBpbiB0aGlzIFhSIGRldmljZVxuICAgICAgICAgICAgaWYgKHRoaXMueHJTZXNzaW9uLnN1cHBvcnRlZEZyYW1lUmF0ZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZyYW1lUmF0ZSBvZiB0aGlzLnhyU2Vzc2lvbi5zdXBwb3J0ZWRGcmFtZVJhdGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZVJhdGUgPT0gOTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24udXBkYXRlVGFyZ2V0RnJhbWVSYXRlKDkwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEJpbmRpbmcgdG8gZWFjaCBuZXcgZnJhbWUgdG8gZ2V0IGxhdGVzdCBYUiB1cGRhdGVzXG4gICAgICAgICAgICB0aGlzLnhyU2Vzc2lvbi5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5vblhyRnJhbWUuYmluZCh0aGlzKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9uU2Vzc2lvblN0YXJ0ZWQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ3hyU2Vzc2lvblN0YXJ0ZWQnKSk7XG4gICAgfVxuICAgIGFyZUFycmF5c0VxdWFsKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIChhLmxlbmd0aCA9PT0gYi5sZW5ndGggJiYgYS5ldmVyeSgoZWxlbWVudCwgaW5kZXgpID0+IE1hdGguYWJzKGVsZW1lbnQgLSBiW2luZGV4XSkgPD0gdGhpcy5FUFNJTE9OKSk7XG4gICAgfVxuICAgIGFyZVBvaW50c0VxdWFsKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIChNYXRoLmFicyhhLnggLSBiLngpID49IHRoaXMuRVBTSUxPTiAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYS55IC0gYi55KSA+PSB0aGlzLkVQU0lMT04gJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGEueiAtIGIueikgPj0gdGhpcy5FUFNJTE9OKTtcbiAgICB9XG4gICAgc2VuZFhSRGF0YVRvVUUoKSB7XG4gICAgICAgIGlmICh0aGlzLmxlZnRWaWV3ID09IG51bGwgfHwgdGhpcy5yaWdodFZpZXcgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIHNlbGVjdGl2ZWx5IHNlbmQgZWl0aGVyIHRoZSBgWFJFeWVWaWV3c2Agb3IgYFhSSE1EVHJhbnNmb3JtYFxuICAgICAgICAvLyBtZXNzYWdlcyBvdmVyIHRoZSBkYXRhY2hhbm5lbC4gVGhlIHJlYXNvbiBmb3IgdGhpcyBzZWxlY3RpdmUgc2VuZGluZyBpcyB0aGF0XG4gICAgICAgIC8vIHRoZSBgWFJFeWVWaWV3c2AgaXMgYSBtdWNoIGxhcmdlciBtZXNzYWdlIGFuZCBjaGFuZ2VzIGluZnJlcXVlbnRseSAoZS5nLiBvbmx5IHdoZW4gdXNlciBjaGFuZ2VzIGhlYWRzZXQgSVBEKS5cbiAgICAgICAgLy8gVGhlcmVmb3JlLCB3ZSBvbmx5IG5lZWQgdG8gc2VuZCBpdCBvbmNlIG9uIHN0YXJ0dXAgYW5kIHRoZW4gYW55IHRpbWUgaXQgY2hhbmdlcy5cbiAgICAgICAgLy8gVGhlIHJlc3Qgb2YgdGhlIHRpbWUgd2UgY2FuIHNlbmQgdGhlIGBYUkhNRFRyYW5zZm9ybWAgbWVzc2FnZS5cbiAgICAgICAgbGV0IHNob3VsZFNlbmRFeWVWaWV3cyA9IHRoaXMubGFzdFNlbnRMZWZ0RXllUHJvaiA9PSBudWxsIHx8XG4gICAgICAgICAgICB0aGlzLmxhc3RTZW50UmlnaHRFeWVQcm9qID09IG51bGwgfHxcbiAgICAgICAgICAgIHRoaXMubGFzdFNlbnRSZWxhdGl2ZUxlZnRFeWVQb3MgPT0gbnVsbCB8fFxuICAgICAgICAgICAgdGhpcy5sYXN0U2VudFJlbGF0aXZlUmlnaHRFeWVQb3MgPT0gbnVsbDtcbiAgICAgICAgY29uc3QgbGVmdEV5ZVRyYW5zID0gdGhpcy5sZWZ0Vmlldy50cmFuc2Zvcm0ubWF0cml4O1xuICAgICAgICBjb25zdCBsZWZ0RXllUHJvaiA9IHRoaXMubGVmdFZpZXcucHJvamVjdGlvbk1hdHJpeDtcbiAgICAgICAgY29uc3QgcmlnaHRFeWVUcmFucyA9IHRoaXMucmlnaHRWaWV3LnRyYW5zZm9ybS5tYXRyaXg7XG4gICAgICAgIGNvbnN0IHJpZ2h0RXllUHJvaiA9IHRoaXMucmlnaHRWaWV3LnByb2plY3Rpb25NYXRyaXg7XG4gICAgICAgIGNvbnN0IGhtZFRyYW5zID0gdGhpcy54clZpZXdlclBvc2UudHJhbnNmb3JtLm1hdHJpeDtcbiAgICAgICAgLy8gQ2hlY2sgaWYgcHJvamVjdGlvbiBtYXRyaWNlcyBoYXZlIGNoYW5nZWRcbiAgICAgICAgaWYgKCFzaG91bGRTZW5kRXllVmlld3MgJiYgdGhpcy5sYXN0U2VudExlZnRFeWVQcm9qICE9IG51bGwgJiYgdGhpcy5sYXN0U2VudFJpZ2h0RXllUHJvaiAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBsZWZ0RXllUHJvalVuY2hhbmdlZCA9IHRoaXMuYXJlQXJyYXlzRXF1YWwobGVmdEV5ZVByb2osIHRoaXMubGFzdFNlbnRMZWZ0RXllUHJvaik7XG4gICAgICAgICAgICBjb25zdCByaWdodEV5ZVByb2pVbmNoYW5nZWQgPSB0aGlzLmFyZUFycmF5c0VxdWFsKHJpZ2h0RXllUHJvaiwgdGhpcy5sYXN0U2VudFJpZ2h0RXllUHJvaik7XG4gICAgICAgICAgICBzaG91bGRTZW5kRXllVmlld3MgPSBsZWZ0RXllUHJvalVuY2hhbmdlZCA9PSBmYWxzZSB8fCByaWdodEV5ZVByb2pVbmNoYW5nZWQgPT0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVmdEV5ZVJlbGF0aXZlUG9zID0gbmV3IERPTVBvaW50UmVhZE9ubHkodGhpcy5sZWZ0Vmlldy50cmFuc2Zvcm0ucG9zaXRpb24ueCAtIHRoaXMueHJWaWV3ZXJQb3NlLnRyYW5zZm9ybS5wb3NpdGlvbi54LCB0aGlzLmxlZnRWaWV3LnRyYW5zZm9ybS5wb3NpdGlvbi55IC0gdGhpcy54clZpZXdlclBvc2UudHJhbnNmb3JtLnBvc2l0aW9uLnksIHRoaXMubGVmdFZpZXcudHJhbnNmb3JtLnBvc2l0aW9uLnogLSB0aGlzLnhyVmlld2VyUG9zZS50cmFuc2Zvcm0ucG9zaXRpb24ueiwgMS4wKTtcbiAgICAgICAgY29uc3QgcmlnaHRFeWVSZWxhdGl2ZVBvcyA9IG5ldyBET01Qb2ludFJlYWRPbmx5KHRoaXMubGVmdFZpZXcudHJhbnNmb3JtLnBvc2l0aW9uLnggLSB0aGlzLnhyVmlld2VyUG9zZS50cmFuc2Zvcm0ucG9zaXRpb24ueCwgdGhpcy5sZWZ0Vmlldy50cmFuc2Zvcm0ucG9zaXRpb24ueSAtIHRoaXMueHJWaWV3ZXJQb3NlLnRyYW5zZm9ybS5wb3NpdGlvbi55LCB0aGlzLmxlZnRWaWV3LnRyYW5zZm9ybS5wb3NpdGlvbi56IC0gdGhpcy54clZpZXdlclBvc2UudHJhbnNmb3JtLnBvc2l0aW9uLnosIDEuMCk7XG4gICAgICAgIC8vIENoZWNrIGlmIHJlbGF0aXZlIGV5ZSBwb3MgaGFzIGNoYW5nZWQgKGUuZyBJUEQgY2hhbmdlZClcbiAgICAgICAgaWYgKCFzaG91bGRTZW5kRXllVmlld3MgJiZcbiAgICAgICAgICAgIHRoaXMubGFzdFNlbnRSZWxhdGl2ZUxlZnRFeWVQb3MgIT0gbnVsbCAmJlxuICAgICAgICAgICAgdGhpcy5sYXN0U2VudFJlbGF0aXZlUmlnaHRFeWVQb3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgbGVmdEV5ZVBvc1VuY2hhbmdlZCA9IHRoaXMuYXJlUG9pbnRzRXF1YWwobGVmdEV5ZVJlbGF0aXZlUG9zLCB0aGlzLmxhc3RTZW50UmVsYXRpdmVMZWZ0RXllUG9zKTtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0RXllUG9zVW5jaGFuZ2VkID0gdGhpcy5hcmVQb2ludHNFcXVhbChyaWdodEV5ZVJlbGF0aXZlUG9zLCB0aGlzLmxhc3RTZW50UmVsYXRpdmVSaWdodEV5ZVBvcyk7XG4gICAgICAgICAgICBzaG91bGRTZW5kRXllVmlld3MgPSBsZWZ0RXllUG9zVW5jaGFuZ2VkID09IGZhbHNlIHx8IHJpZ2h0RXllUG9zVW5jaGFuZ2VkID09IGZhbHNlO1xuICAgICAgICAgICAgLy8gTm90ZTogV2UgYXJlIG5vdCBjaGVja2luZyBpZiBFeWVWaWV3IHJvdGF0aW9uIGNoYW5nZXMgKGFzIGZhciBhcyBJIGtub3cgbm8gSE1EIHN1cHBvcnRzIGNoYW5naW5nIHRoaXMgdmFsdWUgYXQgcnVudGltZSkuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3VsZFNlbmRFeWVWaWV3cykge1xuICAgICAgICAgICAgLy8gc2VuZCB0cmFuc2Zvcm0gKDR4NCkgYW5kIHByb2plY3Rpb24gbWF0cml4ICg0eDQpIGRhdGEgZm9yIGVhY2ggZXllIChsZWZ0IGZpcnN0LCB0aGVuIHJpZ2h0KVxuICAgICAgICAgICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICB0aGlzLndlYlJ0Y0NvbnRyb2xsZXIuc3RyZWFtTWVzc2FnZUNvbnRyb2xsZXIudG9TdHJlYW1lckhhbmRsZXJzLmdldCgnWFJFeWVWaWV3cycpKFtcbiAgICAgICAgICAgICAgICAvLyBMZWZ0IGV5ZSA0eDQgdHJhbnNmb3JtIG1hdHJpeFxuICAgICAgICAgICAgICAgIGxlZnRFeWVUcmFuc1swXSwgbGVmdEV5ZVRyYW5zWzRdLCBsZWZ0RXllVHJhbnNbOF0sIGxlZnRFeWVUcmFuc1sxMl0sXG4gICAgICAgICAgICAgICAgbGVmdEV5ZVRyYW5zWzFdLCBsZWZ0RXllVHJhbnNbNV0sIGxlZnRFeWVUcmFuc1s5XSwgbGVmdEV5ZVRyYW5zWzEzXSxcbiAgICAgICAgICAgICAgICBsZWZ0RXllVHJhbnNbMl0sIGxlZnRFeWVUcmFuc1s2XSwgbGVmdEV5ZVRyYW5zWzEwXSwgbGVmdEV5ZVRyYW5zWzE0XSxcbiAgICAgICAgICAgICAgICBsZWZ0RXllVHJhbnNbM10sIGxlZnRFeWVUcmFuc1s3XSwgbGVmdEV5ZVRyYW5zWzExXSwgbGVmdEV5ZVRyYW5zWzE1XSxcbiAgICAgICAgICAgICAgICAvLyBMZWZ0IGV5ZSA0eDQgcHJvamVjdGlvbiBtYXRyaXhcbiAgICAgICAgICAgICAgICBsZWZ0RXllUHJvalswXSwgbGVmdEV5ZVByb2pbNF0sIGxlZnRFeWVQcm9qWzhdLCBsZWZ0RXllUHJvalsxMl0sXG4gICAgICAgICAgICAgICAgbGVmdEV5ZVByb2pbMV0sIGxlZnRFeWVQcm9qWzVdLCBsZWZ0RXllUHJvals5XSwgbGVmdEV5ZVByb2pbMTNdLFxuICAgICAgICAgICAgICAgIGxlZnRFeWVQcm9qWzJdLCBsZWZ0RXllUHJvals2XSwgbGVmdEV5ZVByb2pbMTBdLCBsZWZ0RXllUHJvalsxNF0sXG4gICAgICAgICAgICAgICAgbGVmdEV5ZVByb2pbM10sIGxlZnRFeWVQcm9qWzddLCBsZWZ0RXllUHJvalsxMV0sIGxlZnRFeWVQcm9qWzE1XSxcbiAgICAgICAgICAgICAgICAvLyBSaWdodCBleWUgNHg0IHRyYW5zZm9ybSBtYXRyaXhcbiAgICAgICAgICAgICAgICByaWdodEV5ZVRyYW5zWzBdLCByaWdodEV5ZVRyYW5zWzRdLCByaWdodEV5ZVRyYW5zWzhdLCByaWdodEV5ZVRyYW5zWzEyXSxcbiAgICAgICAgICAgICAgICByaWdodEV5ZVRyYW5zWzFdLCByaWdodEV5ZVRyYW5zWzVdLCByaWdodEV5ZVRyYW5zWzldLCByaWdodEV5ZVRyYW5zWzEzXSxcbiAgICAgICAgICAgICAgICByaWdodEV5ZVRyYW5zWzJdLCByaWdodEV5ZVRyYW5zWzZdLCByaWdodEV5ZVRyYW5zWzEwXSwgcmlnaHRFeWVUcmFuc1sxNF0sXG4gICAgICAgICAgICAgICAgcmlnaHRFeWVUcmFuc1szXSwgcmlnaHRFeWVUcmFuc1s3XSwgcmlnaHRFeWVUcmFuc1sxMV0sIHJpZ2h0RXllVHJhbnNbMTVdLFxuICAgICAgICAgICAgICAgIC8vIHJpZ2h0IGV5ZSA0eDQgcHJvamVjdGlvbiBtYXRyaXhcbiAgICAgICAgICAgICAgICByaWdodEV5ZVByb2pbMF0sIHJpZ2h0RXllUHJvals0XSwgcmlnaHRFeWVQcm9qWzhdLCByaWdodEV5ZVByb2pbMTJdLFxuICAgICAgICAgICAgICAgIHJpZ2h0RXllUHJvalsxXSwgcmlnaHRFeWVQcm9qWzVdLCByaWdodEV5ZVByb2pbOV0sIHJpZ2h0RXllUHJvalsxM10sXG4gICAgICAgICAgICAgICAgcmlnaHRFeWVQcm9qWzJdLCByaWdodEV5ZVByb2pbNl0sIHJpZ2h0RXllUHJvalsxMF0sIHJpZ2h0RXllUHJvalsxNF0sXG4gICAgICAgICAgICAgICAgcmlnaHRFeWVQcm9qWzNdLCByaWdodEV5ZVByb2pbN10sIHJpZ2h0RXllUHJvalsxMV0sIHJpZ2h0RXllUHJvalsxNV0sXG4gICAgICAgICAgICAgICAgLy8gSE1EIDR4NCB0cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICBobWRUcmFuc1swXSwgaG1kVHJhbnNbNF0sIGhtZFRyYW5zWzhdLCBobWRUcmFuc1sxMl0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbMV0sIGhtZFRyYW5zWzVdLCBobWRUcmFuc1s5XSwgaG1kVHJhbnNbMTNdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzJdLCBobWRUcmFuc1s2XSwgaG1kVHJhbnNbMTBdLCBobWRUcmFuc1sxNF0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbM10sIGhtZFRyYW5zWzddLCBobWRUcmFuc1sxMV0sIGhtZFRyYW5zWzE1XSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VudExlZnRFeWVQcm9qID0gbGVmdEV5ZVByb2o7XG4gICAgICAgICAgICB0aGlzLmxhc3RTZW50UmlnaHRFeWVQcm9qID0gcmlnaHRFeWVQcm9qO1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VudFJlbGF0aXZlTGVmdEV5ZVBvcyA9IGxlZnRFeWVSZWxhdGl2ZVBvcztcbiAgICAgICAgICAgIHRoaXMubGFzdFNlbnRSZWxhdGl2ZVJpZ2h0RXllUG9zID0gcmlnaHRFeWVSZWxhdGl2ZVBvcztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IG5lZWQgdG8gdGhlIGVudGlyZSBleWUgdmlld3MgYmVpbmcgc2VudCBqdXN0IHNlbmQgdGhlIEhNRCB0cmFuc2Zvcm1cbiAgICAgICAgICAgIHRoaXMud2ViUnRjQ29udHJvbGxlci5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci50b1N0cmVhbWVySGFuZGxlcnMuZ2V0KCdYUkhNRFRyYW5zZm9ybScpKFtcbiAgICAgICAgICAgICAgICAvLyBITUQgNHg0IHRyYW5zZm9ybVxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzBdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzRdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzhdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzEyXSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1sxXSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1s1XSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1s5XSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1sxM10sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbMl0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbNl0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbMTBdLFxuICAgICAgICAgICAgICAgIGhtZFRyYW5zWzE0XSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1szXSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1s3XSxcbiAgICAgICAgICAgICAgICBobWRUcmFuc1sxMV0sXG4gICAgICAgICAgICAgICAgaG1kVHJhbnNbMTVdXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblhyRnJhbWUodGltZSwgZnJhbWUpIHtcbiAgICAgICAgdGhpcy54clZpZXdlclBvc2UgPSBmcmFtZS5nZXRWaWV3ZXJQb3NlKHRoaXMueHJSZWZTcGFjZSk7XG4gICAgICAgIGlmICh0aGlzLnhyVmlld2VyUG9zZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3cygpO1xuICAgICAgICAgICAgaWYgKHRoaXMubGVmdFZpZXcgPT0gbnVsbCB8fCB0aGlzLnJpZ2h0VmlldyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZW5kWFJEYXRhVG9VRSgpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWaWRlb1RleHR1cmUoKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMud2ViUnRjQ29udHJvbGxlci5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5YUkNvbnRyb2xsZXJJbnB1dCkpIHtcbiAgICAgICAgICAgIHRoaXMueHJTZXNzaW9uLmlucHV0U291cmNlcy5mb3JFYWNoKChzb3VyY2UsIF9pbmRleCwgX2FycmF5KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy54ckdhbWVwYWRDb250cm9sbGVyLnVwZGF0ZVN0YXR1cyhzb3VyY2UsIGZyYW1lLCB0aGlzLnhyUmVmU3BhY2UpO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy54clNlc3Npb24ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCh0aW1lLCBmcmFtZSkgPT4gdGhpcy5vblhyRnJhbWUodGltZSwgZnJhbWUpKTtcbiAgICAgICAgdGhpcy5vbkZyYW1lLmRpc3BhdGNoRXZlbnQobmV3IFhyRnJhbWVFdmVudCh7IHRpbWUsIGZyYW1lIH0pKTtcbiAgICB9XG4gICAgdXBkYXRlVmlld3MoKSB7XG4gICAgICAgIGlmICghdGhpcy54clZpZXdlclBvc2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHZpZXcgb2YgdGhpcy54clZpZXdlclBvc2Uudmlld3MpIHtcbiAgICAgICAgICAgIGlmICh2aWV3LmV5ZSA9PT0gJ2xlZnQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sZWZ0VmlldyA9IHZpZXc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh2aWV3LmV5ZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIHRoaXMucmlnaHRWaWV3ID0gdmlldztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5nbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEJpbmQgdGhlIGZyYW1lYnVmZmVyIHRvIHRoZSBiYXNlIGxheWVyJ3MgZnJhbWVidWZmZXJcbiAgICAgICAgY29uc3QgZ2xMYXllciA9IHRoaXMueHJTZXNzaW9uLnJlbmRlclN0YXRlLmJhc2VMYXllcjtcbiAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgZ2xMYXllci5mcmFtZWJ1ZmZlcik7XG4gICAgICAgIC8vIFNldCB0aGUgcmVsZXZhbnQgcG9ydGlvbiBvZiBjbGlwIHNwYWNlXG4gICAgICAgIHRoaXMuZ2wudmlld3BvcnQoMCwgMCwgZ2xMYXllci5mcmFtZWJ1ZmZlcldpZHRoLCBnbExheWVyLmZyYW1lYnVmZmVySGVpZ2h0KTtcbiAgICAgICAgLy8gRHJhdyB0aGUgcmVjdGFuZ2xlIHdlIHdpbGwgc2hvdyB0aGUgdmlkZW8gc3RyZWFtIHRleHR1cmUgb25cbiAgICAgICAgdGhpcy5nbC5kcmF3QXJyYXlzKHRoaXMuZ2wuVFJJQU5HTEVTIC8qcHJpbWl0aXZlVHlwZSovLCAwIC8qb2Zmc2V0Ki8sIDYgLypjb3VudCovKTtcbiAgICB9XG4gICAgc3RhdGljIGlzU2Vzc2lvblN1cHBvcnRlZChtb2RlKSB7XG4gICAgICAgIGlmIChsb2NhdGlvbi5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdXZWJYUiByZXF1aXJlcyBodHRwcywgaWYgeW91IHdhbnQgV2ViWFIgdXNlIGh0dHBzLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZpZ2F0b3IueHIpIHtcbiAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0b3IueHIuaXNTZXNzaW9uU3VwcG9ydGVkKG1vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVdlYlhSQ29udHJvbGxlci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuZXhwb3J0IHsgV2ViUnRjUGxheWVyQ29udHJvbGxlciB9IGZyb20gJy4vV2ViUnRjUGxheWVyL1dlYlJ0Y1BsYXllckNvbnRyb2xsZXInO1xuZXhwb3J0IHsgV2ViWFJDb250cm9sbGVyIH0gZnJvbSAnLi9XZWJYUi9XZWJYUkNvbnRyb2xsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Db25maWcvQ29uZmlnJztcbmV4cG9ydCB7IFNldHRpbmdCYXNlIH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ0Jhc2UnO1xuZXhwb3J0IHsgU2V0dGluZ0ZsYWcgfSBmcm9tICcuL0NvbmZpZy9TZXR0aW5nRmxhZyc7XG5leHBvcnQgeyBTZXR0aW5nTnVtYmVyIH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ051bWJlcic7XG5leHBvcnQgeyBTZXR0aW5nT3B0aW9uIH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ09wdGlvbic7XG5leHBvcnQgeyBTZXR0aW5nVGV4dCB9IGZyb20gJy4vQ29uZmlnL1NldHRpbmdUZXh0JztcbmV4cG9ydCB7IFBpeGVsU3RyZWFtaW5nIH0gZnJvbSAnLi9QaXhlbFN0cmVhbWluZy9QaXhlbFN0cmVhbWluZyc7XG5leHBvcnQgeyBBRktDb250cm9sbGVyIGFzIEFma0xvZ2ljIH0gZnJvbSAnLi9BRksvQUZLQ29udHJvbGxlcic7XG5leHBvcnQgeyBMYXRlbmN5VGVzdFJlc3VsdHMgfSBmcm9tICcuL0RhdGFDaGFubmVsL0xhdGVuY3lUZXN0UmVzdWx0cyc7XG5leHBvcnQgKiBmcm9tICcuL0RhdGFDaGFubmVsL0luaXRpYWxTZXR0aW5ncyc7XG5leHBvcnQgeyBBZ2dyZWdhdGVkU3RhdHMgfSBmcm9tICcuL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9BZ2dyZWdhdGVkU3RhdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9VdGlsL0lucHV0Q29vcmRUcmFuc2xhdG9yJztcbmV4cG9ydCB7IE1lc3NhZ2VEaXJlY3Rpb24gfSBmcm9tICcuL1VlSW5zdGFuY2VNZXNzYWdlL1N0cmVhbU1lc3NhZ2VDb250cm9sbGVyJztcbmV4cG9ydCB7IENhbmRpZGF0ZVBhaXJTdGF0cyB9IGZyb20gJy4vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL0NhbmRpZGF0ZVBhaXJTdGF0cyc7XG5leHBvcnQgeyBDYW5kaWRhdGVTdGF0IH0gZnJvbSAnLi9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvQ2FuZGlkYXRlU3RhdCc7XG5leHBvcnQgeyBEYXRhQ2hhbm5lbFN0YXRzIH0gZnJvbSAnLi9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvRGF0YUNoYW5uZWxTdGF0cyc7XG5leHBvcnQgeyBJbmJvdW5kQXVkaW9TdGF0cywgSW5ib3VuZFZpZGVvU3RhdHMgfSBmcm9tICcuL1BlZXJDb25uZWN0aW9uQ29udHJvbGxlci9JbmJvdW5kUlRQU3RhdHMnO1xuZXhwb3J0IHsgT3V0Ym91bmRSVFBTdGF0cywgUmVtb3RlT3V0Ym91bmRSVFBTdGF0cyB9IGZyb20gJy4vUGVlckNvbm5lY3Rpb25Db250cm9sbGVyL091dEJvdW5kUlRQU3RhdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9QZWVyQ29ubmVjdGlvbkNvbnRyb2xsZXIvTGF0ZW5jeUNhbGN1bGF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9EYXRhQ2hhbm5lbC9EYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzdWx0cyc7XG5leHBvcnQgKiBmcm9tICcuL1V0aWwvRXZlbnRFbWl0dGVyJztcbmV4cG9ydCAqIGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nY29tbW9uLXVlNS41Jztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IEZsYWdzLCBMb2dnZXIsIE9wdGlvblBhcmFtZXRlcnMgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41JztcbmltcG9ydCB7IENvbm5lY3RPdmVybGF5IH0gZnJvbSAnLi4vT3ZlcmxheS9Db25uZWN0T3ZlcmxheSc7XG5pbXBvcnQgeyBEaXNjb25uZWN0T3ZlcmxheSB9IGZyb20gJy4uL092ZXJsYXkvRGlzY29ubmVjdE92ZXJsYXknO1xuaW1wb3J0IHsgUGxheU92ZXJsYXkgfSBmcm9tICcuLi9PdmVybGF5L1BsYXlPdmVybGF5JztcbmltcG9ydCB7IEluZm9PdmVybGF5IH0gZnJvbSAnLi4vT3ZlcmxheS9JbmZvT3ZlcmxheSc7XG5pbXBvcnQgeyBFcnJvck92ZXJsYXkgfSBmcm9tICcuLi9PdmVybGF5L0Vycm9yT3ZlcmxheSc7XG5pbXBvcnQgeyBBRktPdmVybGF5IH0gZnJvbSAnLi4vT3ZlcmxheS9BRktPdmVybGF5JztcbmltcG9ydCB7IENvbnRyb2xzIH0gZnJvbSAnLi4vVUkvQ29udHJvbHMnO1xuaW1wb3J0IHsgTGFiZWxsZWRCdXR0b24gfSBmcm9tICcuLi9VSS9MYWJlbGxlZEJ1dHRvbic7XG5pbXBvcnQgeyBTZXR0aW5nc1BhbmVsIH0gZnJvbSAnLi4vVUkvU2V0dGluZ3NQYW5lbCc7XG5pbXBvcnQgeyBTdGF0c1BhbmVsIH0gZnJvbSAnLi4vVUkvU3RhdHNQYW5lbCc7XG5pbXBvcnQgeyBWaWRlb1FwSW5kaWNhdG9yIH0gZnJvbSAnLi4vVUkvVmlkZW9RcEluZGljYXRvcic7XG5pbXBvcnQgeyBDb25maWdVSSB9IGZyb20gJy4uL0NvbmZpZy9Db25maWdVSSc7XG5pbXBvcnQgeyBFZGl0VGV4dE1vZGFsIH0gZnJvbSAnLi4vVUkvRWRpdFRleHRNb2RhbCc7XG5pbXBvcnQgeyBVSUVsZW1lbnRDcmVhdGlvbk1vZGUsIGlzUGFuZWxFbmFibGVkLCBFeHRyYUZsYWdzIH0gZnJvbSAnLi4vVUkvVUlDb25maWd1cmF0aW9uVHlwZXMnO1xuaW1wb3J0IHsgRnVsbFNjcmVlbkljb25FeHRlcm5hbCB9IGZyb20gJy4uL1VJL0Z1bGxzY3JlZW5JY29uJztcbi8qKlxuICogQW4gQXBwbGljYXRpb24gaXMgYSBjb21iaW5hdGlvbiBvZiBVSSBlbGVtZW50cyB0byBkaXNwbGF5IGFuZCBtYW5hZ2UgYSBXZWJSVEMgUGl4ZWwgU3RyZWFtaW5nXG4gKiBjb25uZWN0aW9uLiBJdCBpbmNsdWRlcyBmZWF0dXJlcyBmb3IgY29udHJvbGxpbmcgYSBzdHJlYW0gd2l0aCBtb3VzZSBhbmQga2V5Ym9hcmQsXG4gKiBtYW5hZ2luZyBjb25uZWN0aW9uIGVuZHBvaW50cywgYXMgd2VsbCBhcyBkaXNwbGF5aW5nIHN0YXRzIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBhYm91dCBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZWRpdFRleHRNb2RhbCA9IG51bGw7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLnN0cmVhbSA9IG9wdGlvbnMuc3RyZWFtO1xuICAgICAgICAvLyBFeHBsaWNpdGx5IGNyZWF0ZSB1aSBmZWF0dXJlcyBub3cgc28gY3JlYXRpb24gdGltZSBpcyBrbm93blxuICAgICAgICB0aGlzLl91aUZlYXR1cmVFbGVtZW50ID0gdGhpcy5jcmVhdGVVSUZlYXR1cmVzRWxlbWVudCgpO1xuICAgICAgICAvLyBFeHBsaWNpdGx5IGNyZWF0ZSByb290IGVsZW1lbnQgbm93IHNvIGNyZWF0aW9uIHRpbWUgaXMga25vd25cbiAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSB0aGlzLmNyZWF0ZVJvb3RFbGVtZW50KHRoaXMuc3RyZWFtLCB0aGlzLl91aUZlYXR1cmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy5vbkNvbG9yTW9kZUNoYW5nZWQgPSBvcHRpb25zLm9uQ29sb3JNb2RlQ2hhbmdlZDtcbiAgICAgICAgdGhpcy5jb25maWdVSSA9IG5ldyBDb25maWdVSSh0aGlzLnN0cmVhbS5jb25maWcpO1xuICAgICAgICB0aGlzLmNyZWF0ZU92ZXJsYXlzKCk7XG4gICAgICAgIGlmIChpc1BhbmVsRW5hYmxlZChvcHRpb25zLnN0YXRzUGFuZWxDb25maWcpKSB7XG4gICAgICAgICAgICAvLyBBZGQgc3RhdHMgcGFuZWxcbiAgICAgICAgICAgIHRoaXMuc3RhdHNQYW5lbCA9IG5ldyBTdGF0c1BhbmVsKG9wdGlvbnMuc3RhdHNQYW5lbENvbmZpZyk7XG4gICAgICAgICAgICB0aGlzLnVpRmVhdHVyZXNFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3RhdHNQYW5lbC5yb290RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUGFuZWxFbmFibGVkKG9wdGlvbnMuc2V0dGluZ3NQYW5lbENvbmZpZykpIHtcbiAgICAgICAgICAgIC8vIEFkZCBzZXR0aW5ncyBwYW5lbFxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nc1BhbmVsID0gbmV3IFNldHRpbmdzUGFuZWwoKTtcbiAgICAgICAgICAgIHRoaXMudWlGZWF0dXJlc0VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1BhbmVsLnJvb3RFbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJlU2V0dGluZ3MoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnMudmlkZW9RcEluZGljYXRvckNvbmZpZyB8fCAhb3B0aW9ucy52aWRlb1FwSW5kaWNhdG9yQ29uZmlnLmRpc2FibGVJbmRpY2F0b3IpIHtcbiAgICAgICAgICAgIC8vIEFkZCB0aGUgdmlkZW8gc3RyZWFtIFFQIGluZGljYXRvclxuICAgICAgICAgICAgdGhpcy52aWRlb1FwSW5kaWNhdG9yID0gbmV3IFZpZGVvUXBJbmRpY2F0b3Iob3B0aW9ucy52aWRlb1FwSW5kaWNhdG9yQ29uZmlnKTtcbiAgICAgICAgICAgIHRoaXMudWlGZWF0dXJlc0VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy52aWRlb1FwSW5kaWNhdG9yLnJvb3RFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNyZWF0ZUJ1dHRvbnMoKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckNhbGxiYWNrcygpO1xuICAgICAgICB0aGlzLnNob3dDb25uZWN0T3JBdXRvQ29ubmVjdE92ZXJsYXlzKCk7XG4gICAgICAgIHRoaXMuc2V0Q29sb3JNb2RlKHRoaXMuY29uZmlnVUkuaXNDdXN0b21GbGFnRW5hYmxlZChFeHRyYUZsYWdzLkxpZ2h0TW9kZSkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5jb25maWcuX2FkZE9uU2V0dGluZ0NoYW5nZWRMaXN0ZW5lcihGbGFncy5IaWRlVUksIChpc0VuYWJsZWQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3VpRmVhdHVyZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IGlzRW5hYmxlZCA/ICdoaWRkZW4nIDogJ3Zpc2libGUnO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuc3RyZWFtLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLkhpZGVVSSkpIHtcbiAgICAgICAgICAgIHRoaXMuX3VpRmVhdHVyZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNyZWF0ZU92ZXJsYXlzKCkge1xuICAgICAgICAvLyBidWlsZCBhbGwgb2YgdGhlIG92ZXJsYXlzXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdE92ZXJsYXkgPSBuZXcgRGlzY29ubmVjdE92ZXJsYXkodGhpcy5zdHJlYW0udmlkZW9FbGVtZW50UGFyZW50KTtcbiAgICAgICAgdGhpcy5jb25uZWN0T3ZlcmxheSA9IG5ldyBDb25uZWN0T3ZlcmxheSh0aGlzLnN0cmVhbS52aWRlb0VsZW1lbnRQYXJlbnQpO1xuICAgICAgICB0aGlzLnBsYXlPdmVybGF5ID0gbmV3IFBsYXlPdmVybGF5KHRoaXMuc3RyZWFtLnZpZGVvRWxlbWVudFBhcmVudCk7XG4gICAgICAgIHRoaXMuaW5mb092ZXJsYXkgPSBuZXcgSW5mb092ZXJsYXkodGhpcy5zdHJlYW0udmlkZW9FbGVtZW50UGFyZW50KTtcbiAgICAgICAgdGhpcy5lcnJvck92ZXJsYXkgPSBuZXcgRXJyb3JPdmVybGF5KHRoaXMuc3RyZWFtLnZpZGVvRWxlbWVudFBhcmVudCk7XG4gICAgICAgIHRoaXMuYWZrT3ZlcmxheSA9IG5ldyBBRktPdmVybGF5KHRoaXMuc3RyZWFtLnZpZGVvRWxlbWVudFBhcmVudCk7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdE92ZXJsYXkub25BY3Rpb24oKCkgPT4gdGhpcy5zdHJlYW0ucmVjb25uZWN0KCkpO1xuICAgICAgICAvLyBCdWlsZCB0aGUgd2ViUnRjIGNvbm5lY3Qgb3ZlcmxheSBFdmVudCBMaXN0ZW5lciBhbmQgc2hvdyB0aGUgY29ubmVjdCBvdmVybGF5XG4gICAgICAgIHRoaXMuY29ubmVjdE92ZXJsYXkub25BY3Rpb24oKCkgPT4gdGhpcy5zdHJlYW0uY29ubmVjdCgpKTtcbiAgICAgICAgLy8gc2V0IHVwIHRoZSBwbGF5IG92ZXJsYXlzIGFjdGlvblxuICAgICAgICB0aGlzLnBsYXlPdmVybGF5Lm9uQWN0aW9uKCgpID0+IHRoaXMuc3RyZWFtLnBsYXkoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB1cCBidXR0b24gY2xpY2sgZnVuY3Rpb25zIGFuZCBidXR0b24gZnVuY3Rpb25hbGl0eVxuICAgICAqL1xuICAgIGNyZWF0ZUJ1dHRvbnMoKSB7XG4gICAgICAgIGNvbnN0IGlzSXBob25lID0gL2lQaG9uZS8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICAgICAgY29uc3QgaXNJcGFkID0gL2lQYWQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgfHxcbiAgICAgICAgICAgICgvTWFjaW50b3NoLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICdvbnRvdWNoZW5kJyBpbiBkb2N1bWVudCk7XG4gICAgICAgIGNvbnN0IGlzU2FmYXJpID0gbmF2aWdhdG9yLnZlbmRvciAmJlxuICAgICAgICAgICAgbmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCdBcHBsZScpID4gLTEgJiZcbiAgICAgICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQgJiZcbiAgICAgICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQ3JpT1MnKSA9PSAtMSAmJlxuICAgICAgICAgICAgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGeGlPUycpID09IC0xO1xuICAgICAgICAvLyBJbiBzb21lIGNhc2VzIHdlIHdhbnQgdG8gZGlzYWJsZSBmdWxsc2NyZWVuIGJ1dHRvbiBpZiBpdCBpcyBub3QgZXhwbGljaXRseSByZXF1ZXN0ZWQ6XG4gICAgICAgIC8vIElQaG9uZSBkb2VzIG5vdCBzdXBwb3J0IGZ1bGxzY3JlZW4gQVBJIGFzIGF0IDI4dGggSnVseSAyMDI0IChzZWU6IGh0dHBzOi8vY2FuaXVzZS5jb20vZnVsbHNjcmVlbikgc28gaWZcbiAgICAgICAgLy8gd2UgYXJlIG9uIElQaG9uZSBhbmQgdXNlciBoYXMgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgVUkgY29uZmlnIGZvclxuICAgICAgICAvLyBmdWxsc2NyZWVuIGJ1dHRvbiB0aGVuIHdlIHNob3VsZCBkaXNhYmxlIHRoaXMgYnV0dG9uIGFzIGl0IGRvZXNuJ3Qgd29yay5cbiAgICAgICAgLy8gQWRkaXRpb25hbGx5IGlQYWQgb24gbm9uLVNhZmFyaSBicm93c2VycyBkb2Vzbid0IHJlYWxseSBhbGxvdyB0b3VjaCBpbnB1dHMgYW5kIGZ1bGxzY3JlZW4gdmlkZW8gYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgICAgLy8gSWYgeW91IGRvIHRoaXMgdGhlIHZpZGVvIGdldHMgZHJhZ2dlZCBvZmYgYmFjayB0byBub3JtYWwgbm9uLWZ1bGxzY3JlZW4gdmlkZW8gYW5kIHRoZW4gdGhlIHZpZGVvIGlzIHBhdXNlZC5cbiAgICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vRXBpY0dhbWVzRXh0L1BpeGVsU3RyZWFtaW5nSW5mcmFzdHJ1Y3R1cmUvaXNzdWVzLzIxOVxuICAgICAgICBjb25zdCBkaXNhYmxlRnVsbHNjcmVlbkJ1dHRvbiA9IGlzSXBob25lIHx8ICghaXNTYWZhcmkgJiYgaXNJcGFkKTtcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuZnVsbFNjcmVlbkNvbnRyb2xzQ29uZmlnID09PSB1bmRlZmluZWQgJiYgZGlzYWJsZUZ1bGxzY3JlZW5CdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuZnVsbFNjcmVlbkNvbnRyb2xzQ29uZmlnID0geyBjcmVhdGlvbk1vZGU6IFVJRWxlbWVudENyZWF0aW9uTW9kZS5EaXNhYmxlIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udHJvbHNVSUNvbmZpZyA9IHtcbiAgICAgICAgICAgIHN0YXRzQnV0dG9uVHlwZTogdGhpcy5fb3B0aW9ucy5zdGF0c1BhbmVsQ29uZmlnXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9vcHRpb25zLnN0YXRzUGFuZWxDb25maWcudmlzaWJpbGl0eUJ1dHRvbkNvbmZpZ1xuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc2V0dGluZ3NCdXR0b25UeXBlOiB0aGlzLl9vcHRpb25zLnNldHRpbmdzUGFuZWxDb25maWdcbiAgICAgICAgICAgICAgICA/IHRoaXMuX29wdGlvbnMuc2V0dGluZ3NQYW5lbENvbmZpZy52aXNpYmlsaXR5QnV0dG9uQ29uZmlnXG4gICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBmdWxsc2NyZWVuQnV0dG9uVHlwZTogdGhpcy5fb3B0aW9ucy5mdWxsU2NyZWVuQ29udHJvbHNDb25maWcsXG4gICAgICAgICAgICB4ckljb25UeXBlOiB0aGlzLl9vcHRpb25zLnhyQ29udHJvbHNDb25maWcsXG4gICAgICAgICAgICBoaWRlQ29udHJvbHNJbkZ1bGxzY3JlZW46IHRoaXMuX29wdGlvbnMuaGlkZUNvbnRyb2xzSW5GdWxsc2NyZWVuXG4gICAgICAgIH07XG4gICAgICAgIC8vIFNldHVwIGNvbnRyb2xzXG4gICAgICAgIGNvbnN0IGNvbnRyb2xzID0gbmV3IENvbnRyb2xzKGNvbnRyb2xzVUlDb25maWcpO1xuICAgICAgICB0aGlzLnVpRmVhdHVyZXNFbGVtZW50LmFwcGVuZENoaWxkKGNvbnRyb2xzLnJvb3RFbGVtZW50KTtcbiAgICAgICAgLy8gV2hlbiB3ZSBmdWxsc2NyZWVuIHdlIHdhbnQgdGhpcyBlbGVtZW50IHRvIGJlIHRoZSByb290XG4gICAgICAgIGNvbnN0IGZ1bGxTY3JlZW5CdXR0b24gPSBcbiAgICAgICAgLy8gRGVwZW5kaW5nIG9uIGlmIHdlJ3JlIGNyZWF0aW5nIGFuIGludGVybmFsIGJ1dHRvbiwgb3IgdXNpbmcgYW4gZXh0ZXJuYWwgb25lXG4gICAgICAgICEhdGhpcy5fb3B0aW9ucy5mdWxsU2NyZWVuQ29udHJvbHNDb25maWcgJiZcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuZnVsbFNjcmVlbkNvbnRyb2xzQ29uZmlnLmNyZWF0aW9uTW9kZSA9PT0gVUlFbGVtZW50Q3JlYXRpb25Nb2RlLlVzZUN1c3RvbUVsZW1lbnRcbiAgICAgICAgICAgID8gLy8gRWl0aGVyIGNyZWF0ZSBhIGZ1bGxzY3JlZW4gY2xhc3MgYmFzZWQgb24gdGhlIGV4dGVybmFsIGJ1dHRvblxuICAgICAgICAgICAgICAgIG5ldyBGdWxsU2NyZWVuSWNvbkV4dGVybmFsKHRoaXMuX29wdGlvbnMuZnVsbFNjcmVlbkNvbnRyb2xzQ29uZmlnLmN1c3RvbUVsZW1lbnQpXG4gICAgICAgICAgICA6IC8vIE9yIHVzZSB0aGUgb25lIGNyZWF0ZWQgYnkgdGhlIENvbnRyb2xzIGluaXRpYWxpemVyIGVhcmxpZXJcbiAgICAgICAgICAgICAgICBjb250cm9scy5mdWxsc2NyZWVuSWNvbjtcbiAgICAgICAgaWYgKGZ1bGxTY3JlZW5CdXR0b24pIHtcbiAgICAgICAgICAgIGZ1bGxTY3JlZW5CdXR0b24uZnVsbHNjcmVlbkVsZW1lbnQgPSAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KVxuICAgICAgICAgICAgICAgID8gdGhpcy5zdHJlYW0udmlkZW9FbGVtZW50UGFyZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpWzBdXG4gICAgICAgICAgICAgICAgOiB0aGlzLnJvb3RFbGVtZW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIEFkZCBzZXR0aW5ncyBidXR0b24gdG8gY29udHJvbHNcbiAgICAgICAgY29uc3Qgc2V0dGluZ3NCdXR0b24gPSBjb250cm9scy5zZXR0aW5nc0ljb25cbiAgICAgICAgICAgID8gY29udHJvbHMuc2V0dGluZ3NJY29uLnJvb3RFbGVtZW50XG4gICAgICAgICAgICA6IHRoaXMuX29wdGlvbnMuc2V0dGluZ3NQYW5lbENvbmZpZy52aXNpYmlsaXR5QnV0dG9uQ29uZmlnLmN1c3RvbUVsZW1lbnQ7XG4gICAgICAgIGlmIChzZXR0aW5nc0J1dHRvbilcbiAgICAgICAgICAgIHNldHRpbmdzQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB0aGlzLnNldHRpbmdzQ2xpY2tlZCgpO1xuICAgICAgICBpZiAodGhpcy5zZXR0aW5nc1BhbmVsKVxuICAgICAgICAgICAgdGhpcy5zZXR0aW5nc1BhbmVsLnNldHRpbmdzQ2xvc2VCdXR0b24ub25jbGljayA9ICgpID0+IHRoaXMuc2V0dGluZ3NDbGlja2VkKCk7XG4gICAgICAgIC8vIEFkZCBXZWJYUiBidXR0b24gdG8gY29udHJvbHNcbiAgICAgICAgY29uc3QgeHJCdXR0b24gPSBjb250cm9scy54ckljb25cbiAgICAgICAgICAgID8gY29udHJvbHMueHJJY29uLnJvb3RFbGVtZW50XG4gICAgICAgICAgICA6IHRoaXMuX29wdGlvbnMueHJDb250cm9sc0NvbmZpZy5jcmVhdGlvbk1vZGUgPT09IFVJRWxlbWVudENyZWF0aW9uTW9kZS5Vc2VDdXN0b21FbGVtZW50XG4gICAgICAgICAgICAgICAgPyB0aGlzLl9vcHRpb25zLnhyQ29udHJvbHNDb25maWcuY3VzdG9tRWxlbWVudFxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAoeHJCdXR0b24pXG4gICAgICAgICAgICB4ckJ1dHRvbi5vbmNsaWNrID0gKCkgPT4gdGhpcy5zdHJlYW0udG9nZ2xlWFIoKTtcbiAgICAgICAgLy8gc2V0dXAgdGhlIHN0YXRzL2luZm8gYnV0dG9uXG4gICAgICAgIGNvbnN0IHN0YXRzQnV0dG9uID0gY29udHJvbHMuc3RhdHNJY29uXG4gICAgICAgICAgICA/IGNvbnRyb2xzLnN0YXRzSWNvbi5yb290RWxlbWVudFxuICAgICAgICAgICAgOiB0aGlzLl9vcHRpb25zLnN0YXRzUGFuZWxDb25maWcudmlzaWJpbGl0eUJ1dHRvbkNvbmZpZy5jdXN0b21FbGVtZW50O1xuICAgICAgICBpZiAoc3RhdHNCdXR0b24pXG4gICAgICAgICAgICBzdGF0c0J1dHRvbi5vbmNsaWNrID0gKCkgPT4gdGhpcy5zdGF0c0NsaWNrZWQoKTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdHNQYW5lbCkge1xuICAgICAgICAgICAgdGhpcy5zdGF0c1BhbmVsLnN0YXRzQ2xvc2VCdXR0b24ub25jbGljayA9ICgpID0+IHRoaXMuc3RhdHNDbGlja2VkKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRkIGNvbW1hbmQgYnV0dG9ucyAoaWYgd2UgaGF2ZSBzb21ld2hlcmUgdG8gYWRkIHRoZW0gdG8pXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzUGFuZWwpIHtcbiAgICAgICAgICAgIC8vIEFkZCBidXR0b24gZm9yIHRvZ2dsZSBmcHNcbiAgICAgICAgICAgIGNvbnN0IHNob3dGUFNCdXR0b24gPSBuZXcgTGFiZWxsZWRCdXR0b24oJ1Nob3cgRlBTJywgJ1RvZ2dsZScpO1xuICAgICAgICAgICAgc2hvd0ZQU0J1dHRvbi5hZGRPbkNsaWNrTGlzdGVuZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RyZWFtLnJlcXVlc3RTaG93RnBzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIEFkZCBidXR0b24gZm9yIHJlc3RhcnQgc3RyZWFtXG4gICAgICAgICAgICBjb25zdCByZXN0YXJ0U3RyZWFtQnV0dG9uID0gbmV3IExhYmVsbGVkQnV0dG9uKCdSZXN0YXJ0IFN0cmVhbScsICdSZXN0YXJ0Jyk7XG4gICAgICAgICAgICByZXN0YXJ0U3RyZWFtQnV0dG9uLmFkZE9uQ2xpY2tMaXN0ZW5lcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJlYW0ucmVjb25uZWN0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIEFkZCBidXR0b24gZm9yIHJlcXVlc3Qga2V5ZnJhbWVcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RLZXlmcmFtZUJ1dHRvbiA9IG5ldyBMYWJlbGxlZEJ1dHRvbignUmVxdWVzdCBrZXlmcmFtZScsICdSZXF1ZXN0Jyk7XG4gICAgICAgICAgICByZXF1ZXN0S2V5ZnJhbWVCdXR0b24uYWRkT25DbGlja0xpc3RlbmVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0cmVhbS5yZXF1ZXN0SWZyYW1lKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1hbmRzU2VjdGlvbkVsZW0gPSB0aGlzLmNvbmZpZ1VJLmJ1aWxkU2VjdGlvbldpdGhIZWFkaW5nKHRoaXMuc2V0dGluZ3NQYW5lbC5zZXR0aW5nc0NvbnRlbnRFbGVtZW50LCAnQ29tbWFuZHMnKTtcbiAgICAgICAgICAgIGNvbW1hbmRzU2VjdGlvbkVsZW0uYXBwZW5kQ2hpbGQoc2hvd0ZQU0J1dHRvbi5yb290RWxlbWVudCk7XG4gICAgICAgICAgICBjb21tYW5kc1NlY3Rpb25FbGVtLmFwcGVuZENoaWxkKHJlcXVlc3RLZXlmcmFtZUJ1dHRvbi5yb290RWxlbWVudCk7XG4gICAgICAgICAgICBjb21tYW5kc1NlY3Rpb25FbGVtLmFwcGVuZENoaWxkKHJlc3RhcnRTdHJlYW1CdXR0b24ucm9vdEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGUgc2V0dGluZ3Mgd2l0aCBvbiBjaGFuZ2UgbGlzdGVuZXJzIGFuZCBhbnkgYWRkaXRpb25hbCBwZXIgZXhwZXJpZW5jZSBzZXR0aW5ncy5cbiAgICAgKi9cbiAgICBjb25maWd1cmVTZXR0aW5ncygpIHtcbiAgICAgICAgLy8gVGhpcyBidWlsZHMgYWxsIHRoZSBzZXR0aW5ncyBzZWN0aW9ucyBhbmQgZmxhZ3MgdW5kZXIgdGhpcyBgc2V0dGluZ3NDb250ZW50YCBlbGVtZW50LlxuICAgICAgICB0aGlzLmNvbmZpZ1VJLnBvcHVsYXRlU2V0dGluZ3NFbGVtZW50KHRoaXMuc2V0dGluZ3NQYW5lbC5zZXR0aW5nc0NvbnRlbnRFbGVtZW50LCB0aGlzLl9vcHRpb25zLnNldHRpbmdzUGFuZWxDb25maWcpO1xuICAgICAgICB0aGlzLmNvbmZpZ1VJLmFkZEN1c3RvbUZsYWdPblNldHRpbmdDaGFuZ2VkTGlzdGVuZXIoRXh0cmFGbGFncy5MaWdodE1vZGUsIChpc0xpZ2h0TW9kZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb25maWdVSS5zZXRDdXN0b21GbGFnTGFiZWwoRXh0cmFGbGFncy5MaWdodE1vZGUsIGBDb2xvciBTY2hlbWU6ICR7aXNMaWdodE1vZGUgPyAnTGlnaHQnIDogJ0RhcmsnfSBNb2RlYCk7XG4gICAgICAgICAgICB0aGlzLnNldENvbG9yTW9kZShpc0xpZ2h0TW9kZSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZWdpc3RlckNhbGxiYWNrcygpIHtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignYWZrV2FybmluZ0FjdGl2YXRlJywgKHsgZGF0YTogeyBjb3VudERvd24sIGRpc21pc3NBZmsgfSB9KSA9PiB0aGlzLnNob3dBZmtPdmVybGF5KGNvdW50RG93biwgZGlzbWlzc0FmaykpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdhZmtXYXJuaW5nVXBkYXRlJywgKHsgZGF0YTogeyBjb3VudERvd24gfSB9KSA9PiB0aGlzLmFma092ZXJsYXkudXBkYXRlQ291bnRkb3duKGNvdW50RG93bikpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdhZmtXYXJuaW5nRGVhY3RpdmF0ZScsICgpID0+IHRoaXMuYWZrT3ZlcmxheS5oaWRlKCkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdhZmtUaW1lZE91dCcsICgpID0+IHRoaXMuYWZrT3ZlcmxheS5oaWRlKCkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCd2aWRlb0VuY29kZXJBdmdRUCcsICh7IGRhdGE6IHsgYXZnUVAgfSB9KSA9PiB0aGlzLm9uVmlkZW9FbmNvZGVyQXZnUVAoYXZnUVApKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignd2ViUnRjU2RwJywgKCkgPT4gdGhpcy5vbldlYlJ0Y1NkcCgpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignd2ViUnRjQXV0b0Nvbm5lY3QnLCAoKSA9PiB0aGlzLm9uV2ViUnRjQXV0b0Nvbm5lY3QoKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3dlYlJ0Y0Nvbm5lY3RpbmcnLCAoKSA9PiB0aGlzLm9uV2ViUnRjQ29ubmVjdGluZygpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignd2ViUnRjQ29ubmVjdGVkJywgKCkgPT4gdGhpcy5vbldlYlJ0Y0Nvbm5lY3RlZCgpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignd2ViUnRjRmFpbGVkJywgKCkgPT4gdGhpcy5vbldlYlJ0Y0ZhaWxlZCgpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignd2ViUnRjRGlzY29ubmVjdGVkJywgKHsgZGF0YTogeyBldmVudFN0cmluZywgYWxsb3dDbGlja1RvUmVjb25uZWN0IH0gfSkgPT4gdGhpcy5vbkRpc2Nvbm5lY3QoZXZlbnRTdHJpbmcsIGFsbG93Q2xpY2tUb1JlY29ubmVjdCkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCd2aWRlb0luaXRpYWxpemVkJywgKCkgPT4gdGhpcy5vblZpZGVvSW5pdGlhbGl6ZWQoKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3N0cmVhbUxvYWRpbmcnLCAoKSA9PiB0aGlzLm9uU3RyZWFtTG9hZGluZygpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcigncGxheVN0cmVhbUVycm9yJywgKHsgZGF0YTogeyBtZXNzYWdlIH0gfSkgPT4gdGhpcy5vblBsYXlTdHJlYW1FcnJvcihtZXNzYWdlKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXlTdHJlYW0nLCAoKSA9PiB0aGlzLm9uUGxheVN0cmVhbSgpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcigncGxheVN0cmVhbVJlamVjdGVkJywgKHsgZGF0YTogeyByZWFzb24gfSB9KSA9PiB0aGlzLm9uUGxheVN0cmVhbVJlamVjdGVkKHJlYXNvbikpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdsb2FkRnJlZXplRnJhbWUnLCAoeyBkYXRhOiB7IHNob3VsZFNob3dQbGF5T3ZlcmxheSB9IH0pID0+IHRoaXMub25Mb2FkRnJlZXplRnJhbWUoc2hvdWxkU2hvd1BsYXlPdmVybGF5KSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXRzUmVjZWl2ZWQnLCAoeyBkYXRhOiB7IGFnZ3JlZ2F0ZWRTdGF0cyB9IH0pID0+IHRoaXMub25TdGF0c1JlY2VpdmVkKGFnZ3JlZ2F0ZWRTdGF0cykpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdsYXRlbmN5Q2FsY3VsYXRlZCcsICh7IGRhdGE6IHsgbGF0ZW5jeUluZm8gfSB9KSA9PiB0aGlzLm9uTGF0ZW5jeVVwZGF0ZShsYXRlbmN5SW5mbykpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdsYXRlbmN5VGVzdFJlc3VsdCcsICh7IGRhdGE6IHsgbGF0ZW5jeVRpbWluZ3MgfSB9KSA9PiB0aGlzLm9uTGF0ZW5jeVRlc3RSZXN1bHRzKGxhdGVuY3lUaW1pbmdzKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ2RhdGFDaGFubmVsTGF0ZW5jeVRlc3RSZXN1bHQnLCAoeyBkYXRhOiB7IHJlc3VsdCB9IH0pID0+IHRoaXMub25EYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzdWx0cyhyZXN1bHQpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignc3RyZWFtZXJMaXN0TWVzc2FnZScsICh7IGRhdGE6IHsgbWVzc2FnZVN0cmVhbWVyTGlzdCwgYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCwgd2FudGVkU3RyZWFtZXJJZCB9IH0pID0+IHRoaXMuaGFuZGxlU3RyZWFtZXJMaXN0TWVzc2FnZShtZXNzYWdlU3RyZWFtZXJMaXN0LCBhdXRvU2VsZWN0ZWRTdHJlYW1lcklkLCB3YW50ZWRTdHJlYW1lcklkKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1YnNjcmliZUZhaWxlZCcsICh7IGRhdGE6IHsgbWVzc2FnZSB9IH0pID0+IHRoaXMuaGFuZGxlU3Vic2NyaWJlRmFpbGVkTWVzc2FnZShtZXNzYWdlKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3NldHRpbmdzQ2hhbmdlZCcsIChldmVudCkgPT4gdGhpcy5vblNldHRpbmdzQ2hhbmdlZChldmVudCkpO1xuICAgICAgICB0aGlzLnN0cmVhbS5hZGRFdmVudExpc3RlbmVyKCdwbGF5ZXJDb3VudCcsICh7IGRhdGE6IHsgY291bnQgfSB9KSA9PiB0aGlzLm9uUGxheWVyQ291bnQoY291bnQpKTtcbiAgICAgICAgdGhpcy5zdHJlYW0uYWRkRXZlbnRMaXN0ZW5lcignd2ViUnRjVENQUmVsYXlEZXRlY3RlZCcsICgpID0+IExvZ2dlci5XYXJuaW5nKGBTdHJlYW0gcXVhaWx0eSBkZWdyYWRlZCBkdWUgdG8gbmV0d29yayBlbnZpcm9tZW50LCBzdHJlYW0gaXMgcmVsYXllZCBvdmVyIFRDUC5gKSk7XG4gICAgICAgIHRoaXMuc3RyZWFtLmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3dPblNjcmVlbktleWJvYXJkJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAvLyBPbmx5IHNob3cgdGhlIGVkaXQgdGV4dCBtb2RhbCBpZiB0aGUgZmxhZyBpcyBlbmFibGVkXG4gICAgICAgICAgICBpZiAoIXRoaXMuc3RyZWFtLmNvbmZpZy5pc0ZsYWdFbmFibGVkKEZsYWdzLlVzZU1vZGFsRm9yVGV4dElucHV0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGV2dERhdGEgPSBldmVudC5kYXRhO1xuICAgICAgICAgICAgaWYgKGV2dERhdGEuc2hvd09uU2NyZWVuS2V5Ym9hcmQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFZGl0VGV4dE1vZGFsKGV2dERhdGEuY29udGVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm9vdEVsZW1lbnQgb2YgdGhlIGFwcGxpY2F0aW9uLCB2aWRlbyBzdHJlYW0gYW5kIGFsbCBVSSBhcmUgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50LlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSB0aGlzLmNyZWF0ZVJvb3RFbGVtZW50KHRoaXMuc3RyZWFtLCB0aGlzLnVpRmVhdHVyZXNFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIHJvb3QgZWxlbWVudCBmb3IgdGhlIFBpeGVsIFN0cmVhbWluZyBVSS5cbiAgICAgKiBOb3RlOiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBQaXhlbCBTdHJlYW1pbmcgb2JqZWN0IGlzIGNyZWF0ZWQuXG4gICAgICogQHBhcmFtIHBpeGVsc3RyZWFtaW5nIC0gVGhlIFBpeGVsIFN0cmVhbWluZyBvYmplY3QuXG4gICAgICogQHBhcmFtIHVpRmVhdHVyZXNFbGVtIC0gVGhlIGVsZW1lbnQgaG9sZGluZyBhbGwgdGhlIGN1c3RvbSBVSSBmZWF0dXJlcy5cbiAgICAgKiBAcmV0dXJucyBBIGRpdiB3aXRoIHRoZSBpZCAjcGxheWVyVUkgcG9wdWxhdGVkIHdpdGggdmlkZW9FbGVtZW50UGFyZW50IGFuZCB1aUZlYXR1cmVFbGVtZW50LlxuICAgICAqL1xuICAgIGNyZWF0ZVJvb3RFbGVtZW50KHBpeGVsc3RyZWFtaW5nLCB1aUZlYXR1cmVzRWxlbSkge1xuICAgICAgICBjb25zdCBlbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGVsZW0uaWQgPSAncGxheWVyVUknO1xuICAgICAgICBlbGVtLmNsYXNzTGlzdC5hZGQoJ25vc2VsZWN0Jyk7XG4gICAgICAgIGlmIChwaXhlbHN0cmVhbWluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBjcmVhdGUgcm9vdCBlbGVtZW50IHByb3Blcmx5IC0gcGl4ZWxzdHJlYW1pbmcgb2JqZWN0IHdhcyB1bmRlZmluZWQuIEFyZSB5b3UgY2FsbGluZyB0aGlzIHRvbyBlYXJseT8nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGl4ZWxzdHJlYW1pbmcudmlkZW9FbGVtZW50UGFyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGNyZWF0ZSByb290IGVsZW1lbnQgcHJvcGVybHkgLSB2aWRlb0VsZW1lbnRQYXJlbnQgb2JqZWN0IHdhcyB1bmRlZmluZWQuIEFyZSB5b3UgY2FsbGluZyB0aGlzIHRvbyBlYXJseT8nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodWlGZWF0dXJlc0VsZW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgY3JlYXRlIHJvb3QgZWxlbWVudCBwcm9wZXJseSAtIHVpRmVhdHVyZXNFbGVtZW50IG9iamVjdCB3YXMgdW5kZWZpbmVkLiBBcmUgeW91IGNhbGxpbmcgdGhpcyB0b28gZWFybHk/Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbS5hcHBlbmRDaGlsZChwaXhlbHN0cmVhbWluZy52aWRlb0VsZW1lbnRQYXJlbnQpO1xuICAgICAgICBlbGVtLmFwcGVuZENoaWxkKHVpRmVhdHVyZXNFbGVtKTtcbiAgICAgICAgcmV0dXJuIGVsZW07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgdGhlIFVJIGZlYXR1cmVzLCBsaWtlIHRoZSBzdGF0cyBhbmQgc2V0dGluZ3MgcGFuZWxzLlxuICAgICAqL1xuICAgIGdldCB1aUZlYXR1cmVzRWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl91aUZlYXR1cmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl91aUZlYXR1cmVFbGVtZW50ID0gdGhpcy5jcmVhdGVVSUZlYXR1cmVzRWxlbWVudCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl91aUZlYXR1cmVFbGVtZW50O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIHRoZSBVSSBmZWF0dXJlcyBlbGVtZW50IGZvciBob2xkaW5nIGFsbCB0aGUgY3VzdG9tIFVJIGZlYXR1cmVzLlxuICAgICAqIEByZXR1cm5zIEEgZGl2IHdpdGggdGhlIGlkICN1aUZlYXR1cmVzLlxuICAgICAqL1xuICAgIGNyZWF0ZVVJRmVhdHVyZXNFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBlbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGVsZW0uaWQgPSAndWlGZWF0dXJlcyc7XG4gICAgICAgIHJldHVybiBlbGVtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgZGlzY29ubmVjdCBvdmVybGF5XG4gICAgICogQHBhcmFtIHVwZGF0ZVRleHQgLSB0aGUgdGV4dCB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBvdmVybGF5XG4gICAgICovXG4gICAgc2hvd0Rpc2Nvbm5lY3RPdmVybGF5KHVwZGF0ZVRleHQpIHtcbiAgICAgICAgdGhpcy5oaWRlQ3VycmVudE92ZXJsYXkoKTtcbiAgICAgICAgdGhpcy51cGRhdGVEaXNjb25uZWN0T3ZlcmxheSh1cGRhdGVUZXh0KTtcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0T3ZlcmxheS5zaG93KCk7XG4gICAgICAgIHRoaXMuY3VycmVudE92ZXJsYXkgPSB0aGlzLmRpc2Nvbm5lY3RPdmVybGF5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIGRpc2Nvbm5lY3Qgb3ZlcmxheXMgc3BhbiB0ZXh0XG4gICAgICogQHBhcmFtIHVwZGF0ZVRleHQgLSB0aGUgbmV3IGNvdW50ZG93biBudW1iZXJcbiAgICAgKi9cbiAgICB1cGRhdGVEaXNjb25uZWN0T3ZlcmxheSh1cGRhdGVUZXh0KSB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdE92ZXJsYXkudXBkYXRlKHVwZGF0ZVRleHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBY3RpdmF0ZXMgdGhlIGRpc2Nvbm5lY3Qgb3ZlcmxheXMgYWN0aW9uXG4gICAgICovXG4gICAgb25EaXNjb25uZWN0aW9uQWN0aW9uKCkge1xuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RPdmVybGF5LmFjdGl2YXRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhpZGVzIHRoZSBjdXJyZW50IG92ZXJsYXlcbiAgICAgKi9cbiAgICBoaWRlQ3VycmVudE92ZXJsYXkoKSB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRPdmVybGF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE92ZXJsYXkuaGlkZSgpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50T3ZlcmxheSA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvd3MgdGhlIGNvbm5lY3Qgb3ZlcmxheVxuICAgICAqL1xuICAgIHNob3dDb25uZWN0T3ZlcmxheSgpIHtcbiAgICAgICAgdGhpcy5oaWRlQ3VycmVudE92ZXJsYXkoKTtcbiAgICAgICAgdGhpcy5jb25uZWN0T3ZlcmxheS5zaG93KCk7XG4gICAgICAgIHRoaXMuY3VycmVudE92ZXJsYXkgPSB0aGlzLmNvbm5lY3RPdmVybGF5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgcGxheSBvdmVybGF5XG4gICAgICovXG4gICAgc2hvd1BsYXlPdmVybGF5KCkge1xuICAgICAgICB0aGlzLmhpZGVDdXJyZW50T3ZlcmxheSgpO1xuICAgICAgICB0aGlzLnBsYXlPdmVybGF5LnNob3coKTtcbiAgICAgICAgdGhpcy5jdXJyZW50T3ZlcmxheSA9IHRoaXMucGxheU92ZXJsYXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3dzIHRoZSB0ZXh0IG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gdGV4dCAtIHRoZSB0ZXh0IHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgb3ZlcmxheVxuICAgICAqL1xuICAgIHNob3dUZXh0T3ZlcmxheSh0ZXh0KSB7XG4gICAgICAgIHRoaXMuaGlkZUN1cnJlbnRPdmVybGF5KCk7XG4gICAgICAgIHRoaXMuaW5mb092ZXJsYXkudXBkYXRlKHRleHQpO1xuICAgICAgICB0aGlzLmluZm9PdmVybGF5LnNob3coKTtcbiAgICAgICAgdGhpcy5jdXJyZW50T3ZlcmxheSA9IHRoaXMuaW5mb092ZXJsYXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3dzIHRoZSBlcnJvciBvdmVybGF5XG4gICAgICogQHBhcmFtIHRleHQgLSB0aGUgdGV4dCB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIG92ZXJsYXlcbiAgICAgKi9cbiAgICBzaG93RXJyb3JPdmVybGF5KHRleHQpIHtcbiAgICAgICAgdGhpcy5oaWRlQ3VycmVudE92ZXJsYXkoKTtcbiAgICAgICAgdGhpcy5lcnJvck92ZXJsYXkudXBkYXRlKHRleHQpO1xuICAgICAgICB0aGlzLmVycm9yT3ZlcmxheS5zaG93KCk7XG4gICAgICAgIHRoaXMuY3VycmVudE92ZXJsYXkgPSB0aGlzLmVycm9yT3ZlcmxheTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvd3Mgb3IgaGlkZXMgdGhlIHNldHRpbmdzIHBhbmVsIGlmIGNsaWNrZWRcbiAgICAgKi9cbiAgICBzZXR0aW5nc0NsaWNrZWQoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgKF9hID0gdGhpcy5zdGF0c1BhbmVsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGlkZSgpO1xuICAgICAgICB0aGlzLnNldHRpbmdzUGFuZWwudG9nZ2xlVmlzaWJpbGl0eSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93cyBvciBoaWRlcyB0aGUgc3RhdHMgcGFuZWwgaWYgY2xpY2tlZFxuICAgICAqL1xuICAgIHN0YXRzQ2xpY2tlZCgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnNldHRpbmdzUGFuZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oaWRlKCk7XG4gICAgICAgIHRoaXMuc3RhdHNQYW5lbC50b2dnbGVWaXNpYmlsaXR5KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjdGl2YXRlcyB0aGUgY29ubmVjdCBvdmVybGF5cyBhY3Rpb25cbiAgICAgKi9cbiAgICBvbkNvbm5lY3RBY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdE92ZXJsYXkuYWN0aXZhdGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWN0aXZhdGVzIHRoZSBwbGF5IG92ZXJsYXlzIGFjdGlvblxuICAgICAqL1xuICAgIG9uUGxheUFjdGlvbigpIHtcbiAgICAgICAgdGhpcy5wbGF5T3ZlcmxheS5hY3RpdmF0ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93cyB0aGUgYWZrIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gY291bnREb3duIC0gdGhlIGNvdW50ZG93biBudW1iZXIgZm9yIHRoZSBhZmsgY291bnRkb3duXG4gICAgICovXG4gICAgc2hvd0Fma092ZXJsYXkoY291bnREb3duLCBkaXNtaXNzQWZrKSB7XG4gICAgICAgIHRoaXMuaGlkZUN1cnJlbnRPdmVybGF5KCk7XG4gICAgICAgIHRoaXMuYWZrT3ZlcmxheS51cGRhdGVDb3VudGRvd24oY291bnREb3duKTtcbiAgICAgICAgdGhpcy5hZmtPdmVybGF5Lm9uQWN0aW9uKCgpID0+IGRpc21pc3NBZmsoKSk7XG4gICAgICAgIHRoaXMuYWZrT3ZlcmxheS5zaG93KCk7XG4gICAgICAgIHRoaXMuY3VycmVudE92ZXJsYXkgPSB0aGlzLmFma092ZXJsYXk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNob3cgdGhlIENvbm5lY3QgT3ZlcmxheSBvciBhdXRvIGNvbm5lY3RcbiAgICAgKi9cbiAgICBzaG93Q29ubmVjdE9yQXV0b0Nvbm5lY3RPdmVybGF5cygpIHtcbiAgICAgICAgLy8gc2V0IHVwIGlmIHRoZSBhdXRvIHBsYXkgd2lsbCBiZSB1c2VkIG9yIHJlZ3VsYXIgY2xpY2sgdG8gc3RhcnRcbiAgICAgICAgaWYgKCF0aGlzLnN0cmVhbS5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5BdXRvQ29ubmVjdCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0Nvbm5lY3RPdmVybGF5KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvdyB0aGUgd2ViUnRjQXV0b0Nvbm5lY3QgT3ZlcmxheSBhbmQgY29ubmVjdFxuICAgICAqL1xuICAgIG9uV2ViUnRjQXV0b0Nvbm5lY3QoKSB7XG4gICAgICAgIHRoaXMuc2hvd1RleHRPdmVybGF5KCdBdXRvIENvbm5lY3RpbmcgTm93Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB1cCBmdW5jdGlvbmFsaXR5IHRvIGhhcHBlbiB3aGVuIHJlY2VpdmluZyBhIHdlYlJUQyBhbnN3ZXJcbiAgICAgKi9cbiAgICBvbldlYlJ0Y1NkcCgpIHtcbiAgICAgICAgdGhpcy5zaG93VGV4dE92ZXJsYXkoJ1dlYlJUQyBDb25uZWN0aW9uIE5lZ290aWF0ZWQnKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvd3MgYSB0ZXh0IG92ZXJsYXkgdG8gYWxlcnQgdGhlIHVzZXIgdGhlIHN0cmVhbSBpcyBjdXJyZW50bHkgbG9hZGluZ1xuICAgICAqL1xuICAgIG9uU3RyZWFtTG9hZGluZygpIHtcbiAgICAgICAgLy8gYnVpbGQgdGhlIHNwaW5uZXIgc3BhblxuICAgICAgICBjb25zdCBzcGlubmVyU3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgc3Bpbm5lclNwYW4uY2xhc3NOYW1lID0gJ3Zpc3VhbGx5LWhpZGRlbic7XG4gICAgICAgIHNwaW5uZXJTcGFuLmlubmVySFRNTCA9ICdMb2FkaW5nLi4uJztcbiAgICAgICAgLy8gYnVpbGQgdGhlIHNwaW5uZXIgZGl2XG4gICAgICAgIGNvbnN0IHNwaW5uZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgc3Bpbm5lckRpdi5pZCA9ICdsb2FkaW5nLXNwaW5uZXInO1xuICAgICAgICBzcGlubmVyRGl2LmNsYXNzTmFtZSA9ICdzcGlubmVyLWJvcmRlciBtcy0yJztcbiAgICAgICAgc3Bpbm5lckRpdi5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnc3RhdHVzJyk7XG4gICAgICAgIC8vIGFwcGVuZCB0aGUgc3Bpbm5lciB0byB0aGUgZWxlbWVudFxuICAgICAgICBzcGlubmVyRGl2LmFwcGVuZENoaWxkKHNwaW5uZXJTcGFuKTtcbiAgICAgICAgdGhpcy5zaG93VGV4dE92ZXJsYXkoJ0xvYWRpbmcgU3RyZWFtICcgKyBzcGlubmVyRGl2Lm91dGVySFRNTCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIHZpZGVvIGlzIGRpc2Nvbm5lY3RlZCAtIGRpc3BsYXlzIHRoZSBlcnJvciBvdmVybGF5IGFuZCByZXNldHMgdGhlIGJ1dHRvbnMgc3RyZWFtIHRvb2xzIHVwb24gZGlzY29ubmVjdFxuICAgICAqIEBwYXJhbSBldmVudFN0cmluZyAtIHRoZSBldmVudCB0ZXh0IHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgb3ZlcmxheVxuICAgICAqIEBwYXJhbSBhbGxvd0NsaWNrVG9SZWNvbm5lY3QgLSB0cnVlIGlmIHdlIHdhbnQgdG8gYWxsb3cgdGhlIHVzZXIgdG8gY2xpY2sgdG8gcmVjb25uZWN0LiBPdGhlcndpc2UgaXQncyBqdXN0IGEgbWVzc2FnZS5cbiAgICAgKi9cbiAgICBvbkRpc2Nvbm5lY3QoZXZlbnRTdHJpbmcsIGFsbG93Q2xpY2tUb1JlY29ubmVjdCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IG92ZXJsYXlNZXNzYWdlID0gJ0Rpc2Nvbm5lY3RlZCcgKyAoZXZlbnRTdHJpbmcgPyBgOiAke2V2ZW50U3RyaW5nfWAgOiAnLicpO1xuICAgICAgICBpZiAoYWxsb3dDbGlja1RvUmVjb25uZWN0KSB7XG4gICAgICAgICAgICB0aGlzLnNob3dEaXNjb25uZWN0T3ZlcmxheShgJHtvdmVybGF5TWVzc2FnZX0gQ2xpY2sgVG8gUmVzdGFydC5gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yT3ZlcmxheShvdmVybGF5TWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGlzYWJsZSBzdGFydGluZyBhIGxhdGVuY3kgY2hlY2tzXG4gICAgICAgIChfYSA9IHRoaXMuc3RhdHNQYW5lbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9uRGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHdoZW4gV2ViIFJ0YyBpcyBjb25uZWN0aW5nXG4gICAgICovXG4gICAgb25XZWJSdGNDb25uZWN0aW5nKCkge1xuICAgICAgICB0aGlzLnNob3dUZXh0T3ZlcmxheSgnU3RhcnRpbmcgY29ubmVjdGlvbiB0byBzZXJ2ZXIsIHBsZWFzZSB3YWl0Jyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiBXZWIgUnRjIGhhcyBjb25uZWN0ZWRcbiAgICAgKi9cbiAgICBvbldlYlJ0Y0Nvbm5lY3RlZCgpIHtcbiAgICAgICAgdGhpcy5zaG93VGV4dE92ZXJsYXkoJ1dlYlJUQyBjb25uZWN0ZWQsIHdhaXRpbmcgZm9yIHZpZGVvJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgd2hlbiBXZWIgUnRjIGZhaWxzIHRvIGNvbm5lY3RcbiAgICAgKi9cbiAgICBvbldlYlJ0Y0ZhaWxlZCgpIHtcbiAgICAgICAgdGhpcy5zaG93RXJyb3JPdmVybGF5KCdVbmFibGUgdG8gc2V0dXAgdmlkZW8nKTtcbiAgICB9XG4gICAgb25Mb2FkRnJlZXplRnJhbWUoc2hvdWxkU2hvd1BsYXlPdmVybGF5KSB7XG4gICAgICAgIGlmIChzaG91bGRTaG93UGxheU92ZXJsYXkgPT09IHRydWUpIHtcbiAgICAgICAgICAgIExvZ2dlci5JbmZvKCdzaG93aW5nIHBsYXkgb3ZlcmxheScpO1xuICAgICAgICAgICAgdGhpcy5zaG93UGxheU92ZXJsYXkoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblBsYXlTdHJlYW0oKSB7XG4gICAgICAgIHRoaXMuaGlkZUN1cnJlbnRPdmVybGF5KCk7XG4gICAgfVxuICAgIG9uUGxheVN0cmVhbUVycm9yKG1lc3NhZ2UpIHtcbiAgICAgICAgdGhpcy5zaG93RXJyb3JPdmVybGF5KG1lc3NhZ2UpO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4gICAgb25QbGF5U3RyZWFtUmVqZWN0ZWQob25SZWplY3RlZFJlYXNvbikge1xuICAgICAgICB0aGlzLnNob3dQbGF5T3ZlcmxheSgpO1xuICAgIH1cbiAgICBvblZpZGVvSW5pdGlhbGl6ZWQoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKCF0aGlzLnN0cmVhbS5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5BdXRvUGxheVZpZGVvKSkge1xuICAgICAgICAgICAgdGhpcy5zaG93UGxheU92ZXJsYXkoKTtcbiAgICAgICAgfVxuICAgICAgICAoX2EgPSB0aGlzLnN0YXRzUGFuZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5vblZpZGVvSW5pdGlhbGl6ZWQodGhpcy5zdHJlYW0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZnVuY3Rpb25hbGl0eSB0byBoYXBwZW4gd2hlbiBjYWxjdWxhdGluZyB0aGUgYXZlcmFnZSB2aWRlbyBlbmNvZGVyIHFwXG4gICAgICogQHBhcmFtIFFQIC0gdGhlIHF1YWxpdHkgbnVtYmVyIG9mIHRoZSBzdHJlYW1cbiAgICAgKi9cbiAgICBvblZpZGVvRW5jb2RlckF2Z1FQKFFQKSB7XG4gICAgICAgIC8vIFVwZGF0ZSBpbnRlcm5hbCBRUCBpbmRpY2F0b3IgaWYgb25lIGlzIHByZXNlbnRcbiAgICAgICAgaWYgKHRoaXMudmlkZW9RcEluZGljYXRvcikge1xuICAgICAgICAgICAgdGhpcy52aWRlb1FwSW5kaWNhdG9yLnVwZGF0ZVFwVG9vbHRpcChRUCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25Jbml0aWFsU2V0dGluZ3Moc2V0dGluZ3MpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoc2V0dGluZ3MuUGl4ZWxTdHJlYW1pbmdTZXR0aW5ncykge1xuICAgICAgICAgICAgKF9hID0gdGhpcy5zdGF0c1BhbmVsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29uZmlndXJlKHNldHRpbmdzLlBpeGVsU3RyZWFtaW5nU2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uU3RhdHNSZWNlaXZlZChhZ2dyZWdhdGVkU3RhdHMpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAvLyBHcmFiIGFsbCBzdGF0cyB3ZSBjYW4gb2ZmIHRoZSBhZ2dyZWdhdGVkIHN0YXRzXG4gICAgICAgIChfYSA9IHRoaXMuc3RhdHNQYW5lbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhhbmRsZVN0YXRzKGFnZ3JlZ2F0ZWRTdGF0cyk7XG4gICAgfVxuICAgIG9uTGF0ZW5jeVVwZGF0ZShsYXRlbmN5SW5mbykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMuc3RhdHNQYW5lbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhhbmRsZUxhdGVuY3lJbmZvKGxhdGVuY3lJbmZvKTtcbiAgICB9XG4gICAgb25MYXRlbmN5VGVzdFJlc3VsdHMobGF0ZW5jeVRpbWluZ3MpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnN0YXRzUGFuZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sYXRlbmN5VGVzdC5oYW5kbGVUZXN0UmVzdWx0KGxhdGVuY3lUaW1pbmdzKTtcbiAgICB9XG4gICAgb25EYXRhQ2hhbm5lbExhdGVuY3lUZXN0UmVzdWx0cyhyZXN1bHQpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICAoX2EgPSB0aGlzLnN0YXRzUGFuZWwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kYXRhQ2hhbm5lbExhdGVuY3lUZXN0LmhhbmRsZVRlc3RSZXN1bHQocmVzdWx0KTtcbiAgICB9XG4gICAgb25QbGF5ZXJDb3VudChwbGF5ZXJDb3VudCkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHRoaXMuc3RhdHNQYW5lbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhhbmRsZVBsYXllckNvdW50KHBsYXllckNvdW50KTtcbiAgICB9XG4gICAgaGFuZGxlU3RyZWFtZXJMaXN0TWVzc2FnZShtZXNzYWdlU3RyZWFtaW5nTGlzdCwgYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCwgd2FudGVkU3RyZWFtZXJJZCkge1xuICAgICAgICBjb25zdCB3YWl0Rm9yU3RyZWFtZXIgPSB0aGlzLnN0cmVhbS5jb25maWcuaXNGbGFnRW5hYmxlZChGbGFncy5XYWl0Rm9yU3RyZWFtZXIpO1xuICAgICAgICBjb25zdCBpc1JlY29ubmVjdGluZyA9IHRoaXMuc3RyZWFtLmlzUmVjb25uZWN0aW5nKCk7XG4gICAgICAgIGxldCBtZXNzYWdlID0gbnVsbDtcbiAgICAgICAgbGV0IGFsbG93UmVzdGFydCA9IHRydWU7XG4gICAgICAgIGlmICghYXV0b1NlbGVjdGVkU3RyZWFtZXJJZCkge1xuICAgICAgICAgICAgaWYgKHdhaXRGb3JTdHJlYW1lciAmJiB3YW50ZWRTdHJlYW1lcklkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVjb25uZWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgV2FpdGluZyBmb3IgJHt3YW50ZWRTdHJlYW1lcklkfSB0byBiZWNvbWUgYXZhaWxhYmxlLmA7XG4gICAgICAgICAgICAgICAgICAgIGFsbG93UmVzdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBHYXZlIHVwIHdhaXRpbmcgZm9yICR7d2FudGVkU3RyZWFtZXJJZH0gdG8gYmVjb21lIGF2YWlsYWJsZS4gQ2xpY2sgdG8gdHJ5IGFnYWluYDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VTdHJlYW1pbmdMaXN0Lmlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9IGAgb3Igc2VsZWN0IGEgc3RyZWFtZXIgZnJvbSB0aGUgc2V0dGluZ3MgbWVudS5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFsbG93UmVzdGFydCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWVzc2FnZVN0cmVhbWluZ0xpc3QuaWRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzUmVjb25uZWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgV2FpdGluZyBmb3IgYSBzdHJlYW1lciB0byBiZWNvbWUgYXZhaWxhYmxlLmA7XG4gICAgICAgICAgICAgICAgICAgIGFsbG93UmVzdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBObyBzdHJlYW1lcnMgYXZhaWxhYmxlLiBDbGljayB0byB0cnkgYWdhaW4uYDtcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dSZXN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYE11bHRpcGxlIHN0cmVhbWVycyBhdmFpbGFibGUuIFNlbGVjdCBvbmUgZnJvbSB0aGUgc2V0dGluZ3MgbWVudS5gO1xuICAgICAgICAgICAgICAgIGFsbG93UmVzdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsbG93UmVzdGFydCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Rpc2Nvbm5lY3RPdmVybGF5KG1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93VGV4dE92ZXJsYXkobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlU3Vic2NyaWJlRmFpbGVkTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgICAgIHRoaXMuc2hvd0Rpc2Nvbm5lY3RPdmVybGF5KGBTdWJzY3JpYmUgZmFpbGVkOiBcIiR7bWVzc2FnZX1cIiBDbGljayB0byB0cnkgYWdhaW5gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IGxpZ2h0L2RhcmsgY29sb3IgbW9kZVxuICAgICAqIEBwYXJhbSBpc0xpZ2h0TW9kZSAtIHNob3VsZCB3ZSB1c2UgYSBsaWdodCBvciBkYXJrIGNvbG9yIHNjaGVtZVxuICAgICAqL1xuICAgIHNldENvbG9yTW9kZShpc0xpZ2h0TW9kZSkge1xuICAgICAgICBpZiAodGhpcy5vbkNvbG9yTW9kZUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMub25Db2xvck1vZGVDaGFuZ2VkKGlzTGlnaHRNb2RlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzaG93RWRpdFRleHRNb2RhbCh1ZVRleHRib3hDb250ZW50cykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIC8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgbW9kYWxcbiAgICAgICAgKF9hID0gdGhpcy5lZGl0VGV4dE1vZGFsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eucm9vdEVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIC8vIE1ha2UgYSBuZXcgbW9kYWwgZm9yIGVkaXRpbmcgdGhlIFVFIHRleHRib3ggb24gdGhlIGJyb3dzZXIgc2lkZVxuICAgICAgICB0aGlzLmVkaXRUZXh0TW9kYWwgPSBuZXcgRWRpdFRleHRNb2RhbCgpO1xuICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIHJvb3Qgb2YgdGhlIFBpeGVsIFN0cmVhbWluZyBhcHBsaWNhdGlvblxuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmFwcGVuZCh0aGlzLmVkaXRUZXh0TW9kYWwucm9vdEVsZW1lbnQpO1xuICAgICAgICAvLyBBZGQgdGhlIHRleHQgY29udGVudCBmcm9tIFVFIHNpZGUgYW5kIHN1bW1vbiBvbi1zY3JlZW4ga2V5Ym9hcmRcbiAgICAgICAgdGhpcy5lZGl0VGV4dE1vZGFsLnNob3dNb2RhbCh1ZVRleHRib3hDb250ZW50cyk7XG4gICAgICAgIC8vIEJpbmQgdG8gdGhlIGNvbmZpcm0gZXZlbnRcbiAgICAgICAgdGhpcy5lZGl0VGV4dE1vZGFsLmV2ZW50cy5hZGRFdmVudExpc3RlbmVyKCdlZGl0Q29uZmlybWVkJywgKGV2dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWRpdFRleHRFdmVudCA9IGV2dDtcbiAgICAgICAgICAgIHRoaXMuc3RyZWFtLnNlbmRUZXh0Ym94RW50cnkoZWRpdFRleHRFdmVudC5jb25maXJtZWRUZXh0KTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9uU2V0dGluZ3NDaGFuZ2VkKGV2ZW50KSB7XG4gICAgICAgIC8vIFBhc3MgdGhlIGV2ZW50IGRpcmVjdGx5IG9udG8gdGhlIGNvbmZpZ1VJLiBUaGlzIHdpbGwgZG8gdGhpbmdzIGxpa2UgdXBkYXRpbmcgdGhlIHBvc3NpYmxlIHZhbHVlc1xuICAgICAgICAvLyBhcyB3ZWxsIGFzIHRoZSBzZWxlY3RlZCB2YWx1ZVxuICAgICAgICB0aGlzLmNvbmZpZ1VJLm9uU2V0dGluZ3NDaGFuZ2VkKGV2ZW50KTtcbiAgICAgICAgY29uc3QgeyBcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuICAgICAgICBkYXRhOiB7IGlkLCB0YXJnZXQsIHR5cGUgfSB9ID0gZXZlbnQ7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgaGFuZGxlIHNwZWNpZmljIHNldHRpbmcgYmVoYXZpb3VyXG4gICAgICAgIGlmIChpZCA9PSBPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZlcnJlZFF1YWxpdHlPcHRpb24gPSB0aGlzLnN0cmVhbS5jb25maWcuZ2V0U2V0dGluZ09wdGlvbihPcHRpb25QYXJhbWV0ZXJzLlByZWZlcnJlZFF1YWxpdHkpO1xuICAgICAgICAgICAgaWYgKFsuLi5wcmVmZXJyZWRRdWFsaXR5T3B0aW9uLm9wdGlvbnNdLmluY2x1ZGVzKCdEZWZhdWx0JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ1VJLmRpc2FibGVTZXR0aW5nKE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ1VJLmVuYWJsZVNldHRpbmcoT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRRdWFsaXR5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFwcGxpY2F0aW9uLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBUZXh0UGFyYW1ldGVycywgT3B0aW9uUGFyYW1ldGVycywgRmxhZ3MsIE51bWVyaWNQYXJhbWV0ZXJzLCBTZXR0aW5nRmxhZywgTG9nZ2VyLCBpc0ZsYWdJZCwgaXNOdW1lcmljSWQsIGlzVGV4dElkLCBpc09wdGlvbklkIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNSc7XG5pbXBvcnQgeyBTZXR0aW5nVUlGbGFnIH0gZnJvbSAnLi9TZXR0aW5nVUlGbGFnJztcbmltcG9ydCB7IFNldHRpbmdVSU51bWJlciB9IGZyb20gJy4vU2V0dGluZ1VJTnVtYmVyJztcbmltcG9ydCB7IFNldHRpbmdVSVRleHQgfSBmcm9tICcuL1NldHRpbmdVSVRleHQnO1xuaW1wb3J0IHsgU2V0dGluZ1VJT3B0aW9uIH0gZnJvbSAnLi9TZXR0aW5nVUlPcHRpb24nO1xuaW1wb3J0IHsgRXh0cmFGbGFncywgaXNTZWN0aW9uRW5hYmxlZCwgaXNTZXR0aW5nRW5hYmxlZCwgU2V0dGluZ3NTZWN0aW9ucyB9IGZyb20gJy4uL1VJL1VJQ29uZmlndXJhdGlvblR5cGVzJztcbmV4cG9ydCBjbGFzcyBDb25maWdVSSB7XG4gICAgLy8gLS0tLS0tLS0tLS0tIFNldHRpbmdzIC0tLS0tLS0tLS0tLS0tLS0tXG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRmxhZ3MgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8qIEEgbWFwIG9mIGZsYWdzIHRoYXQgY2FuIGJlIHRvZ2dsZWQgLSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBpbiB0aGUgYXBwbGljYXRpb24gLSBlLmcuIFVzZSBNaWM/ICovXG4gICAgICAgIHRoaXMuZmxhZ3NVaSA9IG5ldyBNYXAoKTtcbiAgICAgICAgLyogQSBtYXAgb2YgbnVtZXJpY2FsIHNldHRpbmdzIC0gb3B0aW9ucyB0aGF0IGNhbiBiZSBpbiB0aGUgYXBwbGljYXRpb24gLSBlLmcuIE1pbkJpdHJhdGUgKi9cbiAgICAgICAgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpID0gbmV3IE1hcCgpO1xuICAgICAgICAvKiBBIG1hcCBvZiB0ZXh0IHNldHRpbmdzIC0gZS5nLiBzaWduYWxsaW5nIHNlcnZlciB1cmwgKi9cbiAgICAgICAgdGhpcy50ZXh0UGFyYW1ldGVyc1VpID0gbmV3IE1hcCgpO1xuICAgICAgICAvKiBBIG1hcCBvZiBlbnVtIGJhc2VkIHNldHRpbmdzIC0gZS5nLiBwcmVmZXJyZWQgY29kZWMgKi9cbiAgICAgICAgdGhpcy5vcHRpb25QYXJhbWV0ZXJzVWkgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlQ3VzdG9tVUlTZXR0aW5ncyhjb25maWcudXNlVXJsUGFyYW1zKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlclNldHRpbmdzVUlDb21wb25lbnRzKGNvbmZpZyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBjdXN0b20gVUkgc2V0dGluZ3MgdGhhdCBhcmUgbm90IHByb3ZpZGVkIGJ5IHRoZSBQaXhlbCBTdHJlYW1pbmcgbGlicmFyeS5cbiAgICAgKi9cbiAgICBjcmVhdGVDdXN0b21VSVNldHRpbmdzKHVzZVVybFBhcmFtcykge1xuICAgICAgICB0aGlzLmN1c3RvbUZsYWdzLnNldChFeHRyYUZsYWdzLkxpZ2h0TW9kZSwgbmV3IFNldHRpbmdGbGFnKEV4dHJhRmxhZ3MuTGlnaHRNb2RlLCAnQ29sb3IgU2NoZW1lOiBEYXJrIE1vZGUnLCAnUGFnZSBzdHlsaW5nIHdpbGwgYmUgZWl0aGVyIGxpZ2h0IG9yIGRhcmsnLCBmYWxzZSAvKmlmIHdhbnQgdG8gdXNlIHN5c3RlbSBwcmVmOiAod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpJykubWF0Y2hlcykqLywgdXNlVXJsUGFyYW1zLCAoaXNMaWdodE1vZGUsIHNldHRpbmcpID0+IHtcbiAgICAgICAgICAgIHNldHRpbmcubGFiZWwgPSBgQ29sb3IgU2NoZW1lOiAke2lzTGlnaHRNb2RlID8gJ0xpZ2h0JyA6ICdEYXJrJ30gTW9kZWA7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBVSSB3cmFwcGVyIGNvbXBvbmVudHMgZm9yIGVhY2ggc2V0dGluZyBlbGVtZW50IGluIGNvbmZpZy5cbiAgICAgKiBAcGFyYW0gY29uZmlnIC1cbiAgICAgKi9cbiAgICByZWdpc3RlclNldHRpbmdzVUlDb21wb25lbnRzKGNvbmZpZykge1xuICAgICAgICBmb3IgKGNvbnN0IHNldHRpbmcgb2YgY29uZmlnLmdldEZsYWdzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuZmxhZ3NVaS5zZXQoc2V0dGluZy5pZCwgbmV3IFNldHRpbmdVSUZsYWcoc2V0dGluZykpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgc2V0dGluZyBvZiBBcnJheS5mcm9tKHRoaXMuY3VzdG9tRmxhZ3MudmFsdWVzKCkpKSB7XG4gICAgICAgICAgICB0aGlzLmZsYWdzVWkuc2V0KHNldHRpbmcuaWQsIG5ldyBTZXR0aW5nVUlGbGFnKHNldHRpbmcpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNldHRpbmcgb2YgY29uZmlnLmdldFRleHRTZXR0aW5ncygpKSB7XG4gICAgICAgICAgICB0aGlzLnRleHRQYXJhbWV0ZXJzVWkuc2V0KHNldHRpbmcuaWQsIG5ldyBTZXR0aW5nVUlUZXh0KHNldHRpbmcpKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHNldHRpbmcgb2YgY29uZmlnLmdldE51bWVyaWNTZXR0aW5ncygpKSB7XG4gICAgICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzVWkuc2V0KHNldHRpbmcuaWQsIG5ldyBTZXR0aW5nVUlOdW1iZXIoc2V0dGluZykpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgc2V0dGluZyBvZiBjb25maWcuZ2V0T3B0aW9uU2V0dGluZ3MoKSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25QYXJhbWV0ZXJzVWkuc2V0KHNldHRpbmcuaWQsIG5ldyBTZXR0aW5nVUlPcHRpb24oc2V0dGluZykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2UgRE9NIGVsZW1lbnRzIGZvciBhIHNldHRpbmdzIHNlY3Rpb24gd2l0aCBhIGhlYWRpbmcuXG4gICAgICogQHBhcmFtIHNldHRpbmdzRWxlbSAtIFRoZSBwYXJlbnQgY29udGFpbmVyIGZvciBvdXIgRE9NIGVsZW1lbnRzLlxuICAgICAqIEBwYXJhbSBzZWN0aW9uSGVhZGluZyAtIFRoZSBoZWFkaW5nIGVsZW1lbnQgdG8gZ28gaW50byB0aGUgc2VjdGlvbi5cbiAgICAgKiBAcmV0dXJucyBUaGUgY29uc3RydWN0ZWQgRE9NIGVsZW1lbnQgZm9yIHRoZSBzZWN0aW9uLlxuICAgICAqL1xuICAgIGJ1aWxkU2VjdGlvbldpdGhIZWFkaW5nKHNldHRpbmdzRWxlbSwgc2VjdGlvbkhlYWRpbmcpIHtcbiAgICAgICAgLy8gbWFrZSBzZWN0aW9uIGVsZW1lbnRcbiAgICAgICAgY29uc3Qgc2VjdGlvbkVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzZWN0aW9uJyk7XG4gICAgICAgIHNlY3Rpb25FbGVtLmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzQ29udGFpbmVyJyk7XG4gICAgICAgIC8vIG1ha2Ugc2VjdGlvbiBoZWFkaW5nXG4gICAgICAgIGNvbnN0IHBzU2V0dGluZ3NIZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcHNTZXR0aW5nc0hlYWRlci5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nc0hlYWRlcicpO1xuICAgICAgICBwc1NldHRpbmdzSGVhZGVyLmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzLXRleHQnKTtcbiAgICAgICAgcHNTZXR0aW5nc0hlYWRlci50ZXh0Q29udGVudCA9IHNlY3Rpb25IZWFkaW5nO1xuICAgICAgICAvLyBhZGQgc2VjdGlvbiBhbmQgaGVhZGluZyB0byBwYXJlbnQgc2V0dGluZ3MgZWxlbWVudFxuICAgICAgICBzZWN0aW9uRWxlbS5hcHBlbmRDaGlsZChwc1NldHRpbmdzSGVhZGVyKTtcbiAgICAgICAgc2V0dGluZ3NFbGVtLmFwcGVuZENoaWxkKHNlY3Rpb25FbGVtKTtcbiAgICAgICAgcmV0dXJuIHNlY3Rpb25FbGVtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXR1cCBmbGFncyB3aXRoIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGFuZCBhZGQgdGhlbSB0byB0aGUgYENvbmZpZy5mbGFnc2AgbWFwLlxuICAgICAqIEBwYXJhbSBzZXR0aW5nc0VsZW0gLSAtIFRoZSBlbGVtZW50IHRoYXQgY29udGFpbnMgYWxsIHRoZSBpbmRpdmlkdWFsIHNldHRpbmdzIHNlY3Rpb25zLCBmbGFncywgYW5kIHNvIG9uLlxuICAgICAqL1xuICAgIHBvcHVsYXRlU2V0dGluZ3NFbGVtZW50KHNldHRpbmdzRWxlbSwgc2V0dGluZ3NDb25maWcpIHtcbiAgICAgICAgaWYgKGlzU2VjdGlvbkVuYWJsZWQoc2V0dGluZ3NDb25maWcsIFNldHRpbmdzU2VjdGlvbnMuUGl4ZWxTdHJlYW1pbmcpKSB7XG4gICAgICAgICAgICAvKiBTZXR1cCBhbGwgUGl4ZWwgU3RyZWFtaW5nIHNwZWNpZmljIHNldHRpbmdzICovXG4gICAgICAgICAgICBjb25zdCBwc1NldHRpbmdzU2VjdGlvbiA9IHRoaXMuYnVpbGRTZWN0aW9uV2l0aEhlYWRpbmcoc2V0dGluZ3NFbGVtLCBTZXR0aW5nc1NlY3Rpb25zLlBpeGVsU3RyZWFtaW5nKTtcbiAgICAgICAgICAgIC8vIG1ha2Ugc2V0dGluZ3Mgc2hvdyB1cCBpbiBET01cbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBUZXh0UGFyYW1ldGVycy5TaWduYWxsaW5nU2VydmVyVXJsKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdUZXh0KHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLnRleHRQYXJhbWV0ZXJzVWkuZ2V0KFRleHRQYXJhbWV0ZXJzLlNpZ25hbGxpbmdTZXJ2ZXJVcmwpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBPcHRpb25QYXJhbWV0ZXJzLlN0cmVhbWVySWQpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ09wdGlvbihwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5vcHRpb25QYXJhbWV0ZXJzVWkuZ2V0KE9wdGlvblBhcmFtZXRlcnMuU3RyZWFtZXJJZCkpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLkF1dG9Db25uZWN0KSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEZsYWdzLkF1dG9Db25uZWN0KSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuQXV0b1BsYXlWaWRlbykpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5BdXRvUGxheVZpZGVvKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuVXNlTWljKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEZsYWdzLlVzZU1pYykpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLlVzZUNhbWVyYSkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5Vc2VDYW1lcmEpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5TdGFydFZpZGVvTXV0ZWQpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuU3RhcnRWaWRlb011dGVkKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuSXNRdWFsaXR5Q29udHJvbGxlcikpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5Jc1F1YWxpdHlDb250cm9sbGVyKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuRm9yY2VNb25vQXVkaW8pKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuRm9yY2VNb25vQXVkaW8pKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5Gb3JjZVRVUk4pKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuRm9yY2VUVVJOKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuU3VwcHJlc3NCcm93c2VyS2V5cykpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5TdXBwcmVzc0Jyb3dzZXJLZXlzKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuQUZLRGV0ZWN0aW9uKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEZsYWdzLkFGS0RldGVjdGlvbikpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLldhaXRGb3JTdHJlYW1lcikpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5XYWl0Rm9yU3RyZWFtZXIpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBOdW1lcmljUGFyYW1ldGVycy5BRktUaW1lb3V0U2VjcykpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nTnVtZXJpYyhwc1NldHRpbmdzU2VjdGlvbiwgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChOdW1lcmljUGFyYW1ldGVycy5BRktUaW1lb3V0U2VjcykpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE51bWVyaWNQYXJhbWV0ZXJzLkFGS0NvdW50ZG93blNlY3MpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ051bWVyaWMocHNTZXR0aW5nc1NlY3Rpb24sIHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaS5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuQUZLQ291bnRkb3duU2VjcykpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE51bWVyaWNQYXJhbWV0ZXJzLk1heFJlY29ubmVjdEF0dGVtcHRzKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdOdW1lcmljKHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzVWkuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLk1heFJlY29ubmVjdEF0dGVtcHRzKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgTnVtZXJpY1BhcmFtZXRlcnMuU3RyZWFtZXJBdXRvSm9pbkludGVydmFsKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdOdW1lcmljKHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzVWkuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLlN0cmVhbWVyQXV0b0pvaW5JbnRlcnZhbCkpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE51bWVyaWNQYXJhbWV0ZXJzLktlZXBhbGl2ZURlbGF5KSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdOdW1lcmljKHBzU2V0dGluZ3NTZWN0aW9uLCB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzVWkuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLktlZXBhbGl2ZURlbGF5KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU2VjdGlvbkVuYWJsZWQoc2V0dGluZ3NDb25maWcsIFNldHRpbmdzU2VjdGlvbnMuVUkpKSB7XG4gICAgICAgICAgICAvKiBTZXR1cCBhbGwgdmlldy91aSByZWxhdGVkIHNldHRpbmdzIHVuZGVyIHRoaXMgc2VjdGlvbiAqL1xuICAgICAgICAgICAgY29uc3Qgdmlld1NldHRpbmdzU2VjdGlvbiA9IHRoaXMuYnVpbGRTZWN0aW9uV2l0aEhlYWRpbmcoc2V0dGluZ3NFbGVtLCBTZXR0aW5nc1NlY3Rpb25zLlVJKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5NYXRjaFZpZXdwb3J0UmVzb2x1dGlvbikpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyh2aWV3U2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEZsYWdzLk1hdGNoVmlld3BvcnRSZXNvbHV0aW9uKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcodmlld1NldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5Ib3ZlcmluZ01vdXNlTW9kZSkpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEV4dHJhRmxhZ3MuTGlnaHRNb2RlKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKHZpZXdTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRXh0cmFGbGFncy5MaWdodE1vZGUpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNTZWN0aW9uRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgU2V0dGluZ3NTZWN0aW9ucy5JbnB1dCkpIHtcbiAgICAgICAgICAgIC8qIFNldHVwIGFsbCBlbmNvZGVyIHJlbGF0ZWQgc2V0dGluZ3MgdW5kZXIgdGhpcyBzZWN0aW9uICovXG4gICAgICAgICAgICBjb25zdCBpbnB1dFNldHRpbmdzU2VjdGlvbiA9IHRoaXMuYnVpbGRTZWN0aW9uV2l0aEhlYWRpbmcoc2V0dGluZ3NFbGVtLCBTZXR0aW5nc1NlY3Rpb25zLklucHV0KTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5LZXlib2FyZElucHV0KSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKGlucHV0U2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEZsYWdzLktleWJvYXJkSW5wdXQpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5Nb3VzZUlucHV0KSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdGbGFnKGlucHV0U2V0dGluZ3NTZWN0aW9uLCB0aGlzLmZsYWdzVWkuZ2V0KEZsYWdzLk1vdXNlSW5wdXQpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5GYWtlTW91c2VXaXRoVG91Y2hlcykpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhpbnB1dFNldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5GYWtlTW91c2VXaXRoVG91Y2hlcykpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLlRvdWNoSW5wdXQpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ0ZsYWcoaW5wdXRTZXR0aW5nc1NlY3Rpb24sIHRoaXMuZmxhZ3NVaS5nZXQoRmxhZ3MuVG91Y2hJbnB1dCkpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIEZsYWdzLkdhbWVwYWRJbnB1dCkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhpbnB1dFNldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5HYW1lcGFkSW5wdXQpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBGbGFncy5YUkNvbnRyb2xsZXJJbnB1dCkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nRmxhZyhpbnB1dFNldHRpbmdzU2VjdGlvbiwgdGhpcy5mbGFnc1VpLmdldChGbGFncy5YUkNvbnRyb2xsZXJJbnB1dCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1NlY3Rpb25FbmFibGVkKHNldHRpbmdzQ29uZmlnLCBTZXR0aW5nc1NlY3Rpb25zLkVuY29kZXIpKSB7XG4gICAgICAgICAgICAvKiBTZXR1cCBhbGwgZW5jb2RlciByZWxhdGVkIHNldHRpbmdzIHVuZGVyIHRoaXMgc2VjdGlvbiAqL1xuICAgICAgICAgICAgY29uc3QgZW5jb2RlclNldHRpbmdzU2VjdGlvbiA9IHRoaXMuYnVpbGRTZWN0aW9uV2l0aEhlYWRpbmcoc2V0dGluZ3NFbGVtLCBTZXR0aW5nc1NlY3Rpb25zLkVuY29kZXIpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNaW4pKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ051bWVyaWMoZW5jb2RlclNldHRpbmdzU2VjdGlvbiwgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChOdW1lcmljUGFyYW1ldGVycy5Db21wYXRRdWFsaXR5TWluKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgTnVtZXJpY1BhcmFtZXRlcnMuQ29tcGF0UXVhbGl0eU1heCkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nTnVtZXJpYyhlbmNvZGVyU2V0dGluZ3NTZWN0aW9uLCB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzVWkuZ2V0KE51bWVyaWNQYXJhbWV0ZXJzLkNvbXBhdFF1YWxpdHlNYXgpKTtcbiAgICAgICAgICAgIGNvbnN0IHByZWZlcnJlZENvZGVjT3B0aW9uID0gdGhpcy5vcHRpb25QYXJhbWV0ZXJzVWkuZ2V0KE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMpO1xuICAgICAgICAgICAgaWYgKGlzU2V0dGluZ0VuYWJsZWQoc2V0dGluZ3NDb25maWcsIE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkQ29kZWMpKVxuICAgICAgICAgICAgICAgIHRoaXMuYWRkU2V0dGluZ09wdGlvbihlbmNvZGVyU2V0dGluZ3NTZWN0aW9uLCB0aGlzLm9wdGlvblBhcmFtZXRlcnNVaS5nZXQoT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRDb2RlYykpO1xuICAgICAgICAgICAgaWYgKHByZWZlcnJlZENvZGVjT3B0aW9uICYmXG4gICAgICAgICAgICAgICAgWy4uLnByZWZlcnJlZENvZGVjT3B0aW9uLnNlbGVjdG9yLm9wdGlvbnNdXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKG8pID0+IG8udmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIC5pbmNsdWRlcygnT25seSBhdmFpbGFibGUgb24gQ2hyb21lJykpIHtcbiAgICAgICAgICAgICAgICBwcmVmZXJyZWRDb2RlY09wdGlvbi5kaXNhYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgT3B0aW9uUGFyYW1ldGVycy5QcmVmZXJyZWRRdWFsaXR5KSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdPcHRpb24oZW5jb2RlclNldHRpbmdzU2VjdGlvbiwgdGhpcy5vcHRpb25QYXJhbWV0ZXJzVWkuZ2V0KE9wdGlvblBhcmFtZXRlcnMuUHJlZmVycmVkUXVhbGl0eSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1NlY3Rpb25FbmFibGVkKHNldHRpbmdzQ29uZmlnLCBTZXR0aW5nc1NlY3Rpb25zLldlYlJUQykpIHtcbiAgICAgICAgICAgIC8qIFNldHVwIGFsbCB3ZWJydGMgcmVsYXRlZCBzZXR0aW5ncyB1bmRlciB0aGlzIHNlY3Rpb24gKi9cbiAgICAgICAgICAgIGNvbnN0IHdlYnJ0Y1NldHRpbmdzU2VjdGlvbiA9IHRoaXMuYnVpbGRTZWN0aW9uV2l0aEhlYWRpbmcoc2V0dGluZ3NFbGVtLCBTZXR0aW5nc1NlY3Rpb25zLldlYlJUQyk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDRlBTKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdOdW1lcmljKHdlYnJ0Y1NldHRpbmdzU2VjdGlvbiwgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChOdW1lcmljUGFyYW1ldGVycy5XZWJSVENGUFMpKTtcbiAgICAgICAgICAgIGlmIChpc1NldHRpbmdFbmFibGVkKHNldHRpbmdzQ29uZmlnLCBOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNaW5CaXRyYXRlKSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNldHRpbmdOdW1lcmljKHdlYnJ0Y1NldHRpbmdzU2VjdGlvbiwgdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChOdW1lcmljUGFyYW1ldGVycy5XZWJSVENNaW5CaXRyYXRlKSk7XG4gICAgICAgICAgICBpZiAoaXNTZXR0aW5nRW5hYmxlZChzZXR0aW5nc0NvbmZpZywgTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWF4Qml0cmF0ZSkpXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZXR0aW5nTnVtZXJpYyh3ZWJydGNTZXR0aW5nc1NlY3Rpb24sIHRoaXMubnVtZXJpY1BhcmFtZXRlcnNVaS5nZXQoTnVtZXJpY1BhcmFtZXRlcnMuV2ViUlRDTWF4Qml0cmF0ZSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIFNldHRpbmdUZXh0IGVsZW1lbnQgdG8gYSBwYXJ0aWN1bGFyIHNldHRpbmdzIHNlY3Rpb24gaW4gdGhlIERPTSBhbmQgcmVnaXN0ZXJzIHRoYXQgdGV4dCBpbiB0aGUgdGV4dCBzZXR0aW5ncyBtYXAuXG4gICAgICogQHBhcmFtIHNldHRpbmdzU2VjdGlvbiAtIFRoZSBzZXR0aW5ncyBzZWN0aW9uIEhUTUwgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ1RleHQgLSBUaGUgdGV4dHVhbCBzZXR0aW5ncyBvYmplY3QuXG4gICAgICovXG4gICAgYWRkU2V0dGluZ1RleHQoc2V0dGluZ3NTZWN0aW9uLCBzZXR0aW5nVGV4dCkge1xuICAgICAgICBpZiAoc2V0dGluZ1RleHQpIHtcbiAgICAgICAgICAgIHNldHRpbmdzU2VjdGlvbi5hcHBlbmRDaGlsZChzZXR0aW5nVGV4dC5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLnRleHRQYXJhbWV0ZXJzVWkuc2V0KHNldHRpbmdUZXh0LnNldHRpbmcuaWQsIHNldHRpbmdUZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGQgYSBTZXR0aW5nRmxhZyBlbGVtZW50IHRvIGEgcGFydGljdWxhciBzZXR0aW5ncyBzZWN0aW9uIGluIHRoZSBET00gYW5kIHJlZ2lzdGVycyB0aGF0IGZsYWcgaW4gdGhlIENvbmZpZy5mbGFnIG1hcC5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ3NTZWN0aW9uIC0gVGhlIHNldHRpbmdzIHNlY3Rpb24gSFRNTCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSBzZXR0aW5nRmxhZyAtIFRoZSBzZXR0aW5ncyBmbGFnIG9iamVjdC5cbiAgICAgKi9cbiAgICBhZGRTZXR0aW5nRmxhZyhzZXR0aW5nc1NlY3Rpb24sIHNldHRpbmdGbGFnKSB7XG4gICAgICAgIGlmIChzZXR0aW5nRmxhZykge1xuICAgICAgICAgICAgc2V0dGluZ3NTZWN0aW9uLmFwcGVuZENoaWxkKHNldHRpbmdGbGFnLnJvb3RFbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMuZmxhZ3NVaS5zZXQoc2V0dGluZ0ZsYWcuc2V0dGluZy5pZCwgc2V0dGluZ0ZsYWcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIG51bWVyaWMgc2V0dGluZyBlbGVtZW50IHRvIGEgcGFydGljdWxhciBzZXR0aW5ncyBzZWN0aW9uIGluIHRoZSBET00gYW5kIHJlZ2lzdGVycyB0aGF0IGZsYWcgaW4gdGhlIENvbmZpZy5udW1lcmljUGFyYW1ldGVycyBtYXAuXG4gICAgICogQHBhcmFtIHNldHRpbmdzU2VjdGlvbiAtIFRoZSBzZXR0aW5ncyBzZWN0aW9uIEhUTUwgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0gc2V0dGluZ0ZsYWcgLSBUaGUgc2V0dGluZ3MgZmxhZyBvYmplY3QuXG4gICAgICovXG4gICAgYWRkU2V0dGluZ051bWVyaWMoc2V0dGluZ3NTZWN0aW9uLCBzZXR0aW5nKSB7XG4gICAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgICAgICBzZXR0aW5nc1NlY3Rpb24uYXBwZW5kQ2hpbGQoc2V0dGluZy5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzVWkuc2V0KHNldHRpbmcuc2V0dGluZy5pZCwgc2V0dGluZyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGFuIGVudW0gYmFzZWQgc2V0dGluZ3MgZWxlbWVudCB0byBhIHBhcnRpY3VsYXIgc2V0dGluZ3Mgc2VjdGlvbiBpbiB0aGUgRE9NIGFuZCByZWdpc3RlcnMgdGhhdCBmbGFnIGluIHRoZSBDb25maWcuZW51bVBhcmFtZXRlcnMgbWFwLlxuICAgICAqIEBwYXJhbSBzZXR0aW5nc1NlY3Rpb24gLSBUaGUgc2V0dGluZ3Mgc2VjdGlvbiBIVE1MIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHNldHRpbmdGbGFnIC0gVGhlIHNldHRpbmdzIGZsYWcgb2JqZWN0LlxuICAgICAqL1xuICAgIGFkZFNldHRpbmdPcHRpb24oc2V0dGluZ3NTZWN0aW9uLCBzZXR0aW5nKSB7XG4gICAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgICAgICBzZXR0aW5nc1NlY3Rpb24uYXBwZW5kQ2hpbGQoc2V0dGluZy5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB0aGlzLm9wdGlvblBhcmFtZXRlcnNVaS5zZXQoc2V0dGluZy5zZXR0aW5nLmlkLCBzZXR0aW5nKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvblNldHRpbmdzQ2hhbmdlZCh7IGRhdGE6IHsgaWQsIHRhcmdldCwgdHlwZSB9IH0pIHtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdmbGFnJykge1xuICAgICAgICAgICAgY29uc3QgX2lkID0gaWQ7XG4gICAgICAgICAgICBjb25zdCBfdGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZyA9IHRoaXMuZmxhZ3NVaS5nZXQoX2lkKTtcbiAgICAgICAgICAgIGlmIChzZXR0aW5nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmcuZmxhZyAhPT0gX3RhcmdldC5mbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmcuZmxhZyA9IF90YXJnZXQuZmxhZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHNldHRpbmcubGFiZWwgIT09IF90YXJnZXQubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGluZy5sYWJlbCA9IF90YXJnZXQubGFiZWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBjb25zdCBfaWQgPSBpZDtcbiAgICAgICAgICAgIGNvbnN0IF90YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChfaWQpO1xuICAgICAgICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy5udW1iZXIgIT09IF90YXJnZXQubnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmcubnVtYmVyID0gX3RhcmdldC5udW1iZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nLmxhYmVsICE9PSBfdGFyZ2V0LmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmcubGFiZWwgPSBfdGFyZ2V0LmxhYmVsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAndGV4dCcpIHtcbiAgICAgICAgICAgIGNvbnN0IF9pZCA9IGlkO1xuICAgICAgICAgICAgY29uc3QgX3RhcmdldCA9IHRhcmdldDtcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSB0aGlzLnRleHRQYXJhbWV0ZXJzVWkuZ2V0KF9pZCk7XG4gICAgICAgICAgICBpZiAoc2V0dGluZykge1xuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nLnRleHQgIT09IF90YXJnZXQudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLnRleHQgPSBfdGFyZ2V0LnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nLmxhYmVsICE9PSBfdGFyZ2V0LmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmcubGFiZWwgPSBfdGFyZ2V0LmxhYmVsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnb3B0aW9uJykge1xuICAgICAgICAgICAgY29uc3QgX2lkID0gaWQ7XG4gICAgICAgICAgICBjb25zdCBfdGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZyA9IHRoaXMub3B0aW9uUGFyYW1ldGVyc1VpLmdldChfaWQpO1xuICAgICAgICAgICAgaWYgKHNldHRpbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1aU9wdGlvbnMgPSBzZXR0aW5nLm9wdGlvbnM7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0T3B0aW9ucyA9IF90YXJnZXQub3B0aW9ucztcbiAgICAgICAgICAgICAgICBpZiAodWlPcHRpb25zLmxlbmd0aCAhPT0gdGFyZ2V0T3B0aW9ucy5sZW5ndGggfHxcbiAgICAgICAgICAgICAgICAgICAgIXVpT3B0aW9ucy5ldmVyeSgodmFsdWUpID0+IHRhcmdldE9wdGlvbnMuaW5jbHVkZXModmFsdWUpKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLm9wdGlvbnMgPSBfdGFyZ2V0Lm9wdGlvbnM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nLnNlbGVjdGVkICE9PSBfdGFyZ2V0LnNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRpbmcuc2VsZWN0ZWQgPSBfdGFyZ2V0LnNlbGVjdGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZy5sYWJlbCAhPT0gX3RhcmdldC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLmxhYmVsID0gX3RhcmdldC5sYWJlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkIGEgY2FsbGJhY2sgdG8gZmlyZSB3aGVuIHRoZSBmbGFnIGlzIHRvZ2dsZWQuXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBmbGFnLlxuICAgICAqIEBwYXJhbSBvbkNoYW5nZUxpc3RlbmVyIC0gVGhlIGNhbGxiYWNrIHRvIGZpcmUgd2hlbiB0aGUgdmFsdWUgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBhZGRDdXN0b21GbGFnT25TZXR0aW5nQ2hhbmdlZExpc3RlbmVyKGlkLCBvbkNoYW5nZUxpc3RlbmVyKSB7XG4gICAgICAgIGlmICh0aGlzLmN1c3RvbUZsYWdzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRmxhZ3MuZ2V0KGlkKS5vbkNoYW5nZSA9IG9uQ2hhbmdlTGlzdGVuZXI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsYWJlbCBmb3IgdGhlIGZsYWcuXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBmbGFnLlxuICAgICAqIEBwYXJhbSBsYWJlbCAtIFRoZSBuZXcgbGFiZWwgdG8gdXNlIGZvciB0aGUgZmxhZy5cbiAgICAgKi9cbiAgICBzZXRDdXN0b21GbGFnTGFiZWwoaWQsIGxhYmVsKSB7XG4gICAgICAgIGlmICghdGhpcy5jdXN0b21GbGFncy5oYXMoaWQpKSB7XG4gICAgICAgICAgICBMb2dnZXIuV2FybmluZyhgQ2Fubm90IHNldCBsYWJlbCBmb3IgZmxhZyBjYWxsZWQgJHtpZH0gLSBpdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgQ29uZmlnLmZsYWdzIG1hcC5gKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRmxhZ3MuZ2V0KGlkKS5sYWJlbCA9IGxhYmVsO1xuICAgICAgICAgICAgdGhpcy5mbGFnc1VpLmdldChpZCkubGFiZWwgPSBsYWJlbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZsYWcgd2hpY2ggaGFzIHRoZSBnaXZlbiBpZC5cbiAgICAgKiBAcGFyYW0gaWQgLSBUaGUgdW5pcXVlIGlkIGZvciB0aGUgZmxhZy5cbiAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBmbGFnIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgaXNDdXN0b21GbGFnRW5hYmxlZChpZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXN0b21GbGFncy5nZXQoaWQpLmZsYWc7XG4gICAgfVxuICAgIGRpc2FibGVTZXR0aW5nKGlkKSB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgaWYgKGlzRmxhZ0lkKGlkKSkge1xuICAgICAgICAgICAgKF9hID0gdGhpcy5mbGFnc1VpLmdldChpZCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kaXNhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNOdW1lcmljSWQoaWQpKSB7XG4gICAgICAgICAgICAoX2IgPSB0aGlzLm51bWVyaWNQYXJhbWV0ZXJzVWkuZ2V0KGlkKSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmRpc2FibGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1RleHRJZChpZCkpIHtcbiAgICAgICAgICAgIChfYyA9IHRoaXMudGV4dFBhcmFtZXRlcnNVaS5nZXQoaWQpKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzT3B0aW9uSWQoaWQpKSB7XG4gICAgICAgICAgICAoX2QgPSB0aGlzLm9wdGlvblBhcmFtZXRlcnNVaS5nZXQoaWQpKSA9PT0gbnVsbCB8fCBfZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2QuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVuYWJsZVNldHRpbmcoaWQpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBpZiAoaXNGbGFnSWQoaWQpKSB7XG4gICAgICAgICAgICAoX2EgPSB0aGlzLmZsYWdzVWkuZ2V0KGlkKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVuYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzTnVtZXJpY0lkKGlkKSkge1xuICAgICAgICAgICAgKF9iID0gdGhpcy5udW1lcmljUGFyYW1ldGVyc1VpLmdldChpZCkpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc1RleHRJZChpZCkpIHtcbiAgICAgICAgICAgIChfYyA9IHRoaXMudGV4dFBhcmFtZXRlcnNVaS5nZXQoaWQpKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuZW5hYmxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNPcHRpb25JZChpZCkpIHtcbiAgICAgICAgICAgIChfZCA9IHRoaXMub3B0aW9uUGFyYW1ldGVyc1VpLmdldChpZCkpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5lbmFibGUoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbmZpZ1VJLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGEgc2V0dGluZyB0aGF0IGhhcyBhIHRleHQgbGFiZWwsIGFuIGFyYml0cmFyeSBzZXR0aW5nIHZhbHVlIGl0IHN0b3JlcywgYW4gYSBIVE1MIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoaXMgc2V0dGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdVSUJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHNldHRpbmcpIHtcbiAgICAgICAgdGhpcy5fc2V0dGluZyA9IHNldHRpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBnZXQgc2V0dGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmc7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFJldHVybiBvciBjcmVhdGVzIGEgSFRNTCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGlzIHNldHRpbmcgaW4gdGhlIERPTS5cbiAgICAgKi9cbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldHRpbmdVSUJhc2UuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IFNldHRpbmdVSUJhc2UgfSBmcm9tICcuL1NldHRpbmdVSUJhc2UnO1xuZXhwb3J0IGNsYXNzIFNldHRpbmdVSUZsYWcgZXh0ZW5kcyBTZXR0aW5nVUlCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5nKSB7XG4gICAgICAgIHN1cGVyKHNldHRpbmcpO1xuICAgICAgICB0aGlzLmxhYmVsID0gc2V0dGluZy5sYWJlbDtcbiAgICAgICAgdGhpcy5mbGFnID0gc2V0dGluZy5mbGFnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBjb21wb25lbnQuXG4gICAgICovXG4gICAgZ2V0IHNldHRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nO1xuICAgIH1cbiAgICBnZXQgc2V0dGluZ3NUZXh0RWxlbSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5nc1RleHRFbGVtKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1RleHRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dCA9IHRoaXMuc2V0dGluZy5fbGFiZWw7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1RleHRFbGVtLnRpdGxlID0gdGhpcy5zZXR0aW5nLmRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc1RleHRFbGVtO1xuICAgIH1cbiAgICBnZXQgY2hlY2tib3goKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2hlY2tib3gpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgICAgICAgICAgLy8gQmxvY2sga2V5cHJlc3MvdXAvZG93biBwcm9wb2dhdGlvbiBmcm9tIHRleHQgZmllbGQgdHlwaW5nIGdvaW5nIHRvIFVFXG4gICAgICAgICAgICB0aGlzLl9jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY2hlY2tib3g7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFJldHVybiBvciBjcmVhdGVzIGEgSFRNTCBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGlzIHNldHRpbmcgaW4gdGhlIERPTS5cbiAgICAgKi9cbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSByb290IGRpdiB3aXRoIFwic2V0dGluZ1wiIGNzcyBjbGFzc1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmlkID0gdGhpcy5zZXR0aW5nLmlkO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2V0dGluZycpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIGRpdiBlbGVtZW50IHRvIGNvbnRhaW4gb3VyIHNldHRpbmcncyB0ZXh0XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnNldHRpbmdzVGV4dEVsZW0pO1xuICAgICAgICAgICAgLy8gY3JlYXRlIGxhYmVsIGVsZW1lbnQgdG8gd3JhcCBvdXQgaW5wdXQgdHlwZVxuICAgICAgICAgICAgY29uc3Qgd3JhcHBlckxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICAgICAgICAgIHdyYXBwZXJMYWJlbC5jbGFzc0xpc3QuYWRkKCd0Z2wtc3dpdGNoJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh3cmFwcGVyTGFiZWwpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIGlucHV0IHR5cGU9Y2hlY2tib3hcbiAgICAgICAgICAgIHRoaXMuY2hlY2tib3gudGl0bGUgPSB0aGlzLnNldHRpbmcuZGVzY3JpcHRpb247XG4gICAgICAgICAgICB0aGlzLmNoZWNrYm94LmNsYXNzTGlzdC5hZGQoJ3RnbCcpO1xuICAgICAgICAgICAgdGhpcy5jaGVja2JveC5jbGFzc0xpc3QuYWRkKCd0Z2wtZmxhdCcpO1xuICAgICAgICAgICAgY29uc3Qgc2xpZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBzbGlkZXIuY2xhc3NMaXN0LmFkZCgndGdsLXNsaWRlcicpO1xuICAgICAgICAgICAgd3JhcHBlckxhYmVsLmFwcGVuZENoaWxkKHRoaXMuY2hlY2tib3gpO1xuICAgICAgICAgICAgd3JhcHBlckxhYmVsLmFwcGVuZENoaWxkKHNsaWRlcik7XG4gICAgICAgICAgICAvLyBzZXR1cCBvbiBjaGFuZ2UgZnJvbSBjaGVja2JveFxuICAgICAgICAgICAgdGhpcy5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5mbGFnICE9PSB0aGlzLmNoZWNrYm94LmNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5nLmZsYWcgPSB0aGlzLmNoZWNrYm94LmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy51cGRhdGVVUkxQYXJhbXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc2V0dGluZydzIHN0b3JlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gaW5WYWx1ZSAtIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBzZXR0aW5nLlxuICAgICAqL1xuICAgIHNldCBmbGFnKGluVmFsdWUpIHtcbiAgICAgICAgdGhpcy5jaGVja2JveC5jaGVja2VkID0gaW5WYWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHZhbHVlXG4gICAgICovXG4gICAgZ2V0IGZsYWcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoZWNrYm94LmNoZWNrZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgbGFiZWwgdGV4dCBmb3IgdGhlIHNldHRpbmcuXG4gICAgICogQHBhcmFtIGxhYmVsIC0gc2V0dGluZyBsYWJlbC5cbiAgICAgKi9cbiAgICBzZXQgbGFiZWwoaW5MYWJlbCkge1xuICAgICAgICB0aGlzLnNldHRpbmdzVGV4dEVsZW0uaW5uZXJUZXh0ID0gaW5MYWJlbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGxhYmVsXG4gICAgICovXG4gICAgZ2V0IGxhYmVsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dDtcbiAgICB9XG4gICAgZGlzYWJsZSgpIHtcbiAgICAgICAgdGhpcy5jaGVja2JveC5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5jaGVja2JveC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldHRpbmdVSUZsYWcuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUnO1xuaW1wb3J0IHsgU2V0dGluZ1VJQmFzZSB9IGZyb20gJy4vU2V0dGluZ1VJQmFzZSc7XG4vKipcbiAqIEEgbnVtYmVyIHNwaW5uZXIgd2l0aCBhIHRleHQgbGFiZWwgYmVzaWRlIGl0LlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ1VJTnVtYmVyIGV4dGVuZHMgU2V0dGluZ1VJQmFzZSB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZykge1xuICAgICAgICBzdXBlcihzZXR0aW5nKTtcbiAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuc2V0dGluZy5sYWJlbDtcbiAgICAgICAgdGhpcy5udW1iZXIgPSB0aGlzLnNldHRpbmcubnVtYmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZyBjb21wb25lbnQuXG4gICAgICovXG4gICAgZ2V0IHNldHRpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nO1xuICAgIH1cbiAgICBnZXQgc2V0dGluZ3NUZXh0RWxlbSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zZXR0aW5nc1RleHRFbGVtKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1RleHRFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzVGV4dEVsZW0uaW5uZXJUZXh0ID0gdGhpcy5zZXR0aW5nLmxhYmVsO1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NUZXh0RWxlbS50aXRsZSA9IHRoaXMuc2V0dGluZy5kZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NUZXh0RWxlbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBIVE1MSW5wdXRFbGVtZW50IGZvciB0aGUgYnV0dG9uLlxuICAgICAqL1xuICAgIGdldCBzcGlubmVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3NwaW5uZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX3NwaW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICAgICAgdGhpcy5fc3Bpbm5lci50eXBlID0gJ251bWJlcic7XG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLm1pbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3Bpbm5lci5taW4gPSB0aGlzLnNldHRpbmcubWluLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zZXR0aW5nLm1heCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3Bpbm5lci5tYXggPSB0aGlzLnNldHRpbmcubWF4LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9zcGlubmVyLnZhbHVlID0gdGhpcy5zZXR0aW5nLm51bWJlci50b1N0cmluZygpO1xuICAgICAgICAgICAgdGhpcy5fc3Bpbm5lci50aXRsZSA9IHRoaXMuc2V0dGluZy5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIHRoaXMuX3NwaW5uZXIuY2xhc3NMaXN0LmFkZCgnZm9ybS1jb250cm9sJyk7XG4gICAgICAgICAgICAvLyBCbG9jayBrZXlwcmVzcy91cC9kb3duIHByb3BvZ2F0aW9uIGZyb20gdGV4dCBmaWVsZCB0eXBpbmcgZ29pbmcgdG8gVUVcbiAgICAgICAgICAgIHRoaXMuc3Bpbm5lci5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNwaW5uZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zcGlubmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zcGlubmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBSZXR1cm4gb3IgY3JlYXRlcyBhIEhUTUwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhpcyBzZXR0aW5nIGluIHRoZSBET00uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgcm9vdCBkaXYgd2l0aCBcInNldHRpbmdcIiBjc3MgY2xhc3NcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdmb3JtLWdyb3VwJyk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgZGl2IGVsZW1lbnQgdG8gY29udGFpbiBvdXIgc2V0dGluZydzIHRleHRcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc2V0dGluZ3NUZXh0RWxlbSk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgbGFiZWwgZWxlbWVudCB0byB3cmFwIG91dCBpbnB1dCB0eXBlXG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnNwaW5uZXIpO1xuICAgICAgICAgICAgLy8gc2V0dXAgb25jaGFuZ2VcbiAgICAgICAgICAgIHRoaXMuc3Bpbm5lci5vbmNoYW5nZSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0RWxlbSA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IE51bWJlci5wYXJzZUZsb2F0KGlucHV0RWxlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihwYXJzZWRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLldhcm5pbmcoYENvdWxkIG5vdCBwYXJzZSB2YWx1ZSBjaGFuZ2UgaW50byBhIHZhbGlkIG51bWJlciAtIHZhbHVlIHdhcyAke2lucHV0RWxlbS52YWx1ZX0sIHJlc2V0dGluZyB2YWx1ZSB0byAke3RoaXMuc2V0dGluZy5taW59YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcubnVtYmVyICE9PSB0aGlzLnNldHRpbmcubWluKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcubnVtYmVyID0gdGhpcy5zZXR0aW5nLm1pbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5udW1iZXIgIT09IHBhcnNlZFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcubnVtYmVyID0gcGFyc2VkVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcudXBkYXRlVVJMUGFyYW1zKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBudW1iZXIgaW4gdGhlIHNwaW5uZXIgKHdpbGwgYmUgY2xhbXBlZCB3aXRoaW4gcmFuZ2UpLlxuICAgICAqL1xuICAgIHNldCBudW1iZXIobmV3TnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc3Bpbm5lci52YWx1ZSA9IHRoaXMuc2V0dGluZy5jbGFtcChuZXdOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB2YWx1ZVxuICAgICAqL1xuICAgIGdldCBudW1iZXIoKSB7XG4gICAgICAgIHJldHVybiArdGhpcy5zcGlubmVyLnZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGxhYmVsIHRleHQgZm9yIHRoZSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSBsYWJlbCAtIHNldHRpbmcgbGFiZWwuXG4gICAgICovXG4gICAgc2V0IGxhYmVsKGluTGFiZWwpIHtcbiAgICAgICAgdGhpcy5zZXR0aW5nc1RleHRFbGVtLmlubmVyVGV4dCA9IGluTGFiZWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBsYWJlbFxuICAgICAqL1xuICAgIGdldCBsYWJlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3NUZXh0RWxlbS5pbm5lclRleHQ7XG4gICAgfVxuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRoaXMuc3Bpbm5lci5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuICAgIGVuYWJsZSgpIHtcbiAgICAgICAgdGhpcy5zcGlubmVyLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2V0dGluZ1VJTnVtYmVyLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBTZXR0aW5nVUlCYXNlIH0gZnJvbSAnLi9TZXR0aW5nVUlCYXNlJztcbmV4cG9ydCBjbGFzcyBTZXR0aW5nVUlPcHRpb24gZXh0ZW5kcyBTZXR0aW5nVUlCYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihzZXR0aW5nKSB7XG4gICAgICAgIHN1cGVyKHNldHRpbmcpO1xuICAgICAgICB0aGlzLmxhYmVsID0gdGhpcy5zZXR0aW5nLmxhYmVsO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB0aGlzLnNldHRpbmcub3B0aW9ucztcbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2V0dGluZy5zZWxlY3RlZDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIHNldHRpbmcgY29tcG9uZW50LlxuICAgICAqL1xuICAgIGdldCBzZXR0aW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZztcbiAgICB9XG4gICAgZ2V0IHNlbGVjdG9yKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlbGVjdCcpO1xuICAgICAgICAgICAgdGhpcy5fc2VsZWN0b3IuY2xhc3NMaXN0LmFkZCgnZm9ybS1jb250cm9sJyk7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3Rvci5jbGFzc0xpc3QuYWRkKCdzZXR0aW5ncy1vcHRpb24nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0b3I7XG4gICAgfVxuICAgIGdldCBzZXR0aW5nc1RleHRFbGVtKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3NldHRpbmdzVGV4dEVsZW0pIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzVGV4dEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzVGV4dEVsZW0uaW5uZXJUZXh0ID0gdGhpcy5zZXR0aW5nLmxhYmVsO1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NUZXh0RWxlbS50aXRsZSA9IHRoaXMuc2V0dGluZy5kZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NUZXh0RWxlbTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0gbGFiZWwgLSBzZXR0aW5nIGxhYmVsLlxuICAgICAqL1xuICAgIHNldCBsYWJlbChpbkxhYmVsKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3NUZXh0RWxlbS5pbm5lclRleHQgPSBpbkxhYmVsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgbGFiZWxcbiAgICAgKi9cbiAgICBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzVGV4dEVsZW0uaW5uZXJUZXh0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBSZXR1cm4gb3IgY3JlYXRlcyBhIEhUTUwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhpcyBzZXR0aW5nIGluIHRoZSBET00uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgcm9vdCBkaXYgd2l0aCBcInNldHRpbmdcIiBjc3MgY2xhc3NcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5pZCA9IHRoaXMuc2V0dGluZy5pZDtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NldHRpbmcnKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Zvcm0tZ3JvdXAnKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBkaXYgZWxlbWVudCB0byBjb250YWluIG91ciBzZXR0aW5nJ3MgdGV4dFxuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1RleHRFbGVtKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBsYWJlbCBlbGVtZW50IHRvIHdyYXAgb3V0IGlucHV0IHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh3cmFwcGVyTGFiZWwpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHNlbGVjdCBlbGVtZW50XG4gICAgICAgICAgICB0aGlzLnNlbGVjdG9yLnRpdGxlID0gdGhpcy5zZXR0aW5nLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgd3JhcHBlckxhYmVsLmFwcGVuZENoaWxkKHRoaXMuc2VsZWN0b3IpO1xuICAgICAgICAgICAgLy8gc2V0dXAgb24gY2hhbmdlIGZyb20gc2VsZWN0b3JcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3Iub25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2V0dGluZy5zZWxlY3RlZCAhPT0gdGhpcy5zZWxlY3Rvci52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdG9yLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcudXBkYXRlVVJMUGFyYW1zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIEJsb2NrIGtleXByZXNzL3VwL2Rvd24gcHJvcG9nYXRpb24gZnJvbSB0ZXh0IGZpZWxkIHR5cGluZyBnb2luZyB0byBVRVxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rvci5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICBzZXQgb3B0aW9ucyh2YWx1ZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMuc2VsZWN0b3Iub3B0aW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rvci5yZW1vdmUoaSk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgICAgIG9wdC52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgb3B0LmlubmVySFRNTCA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rvci5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5zZWxlY3Rvci5vcHRpb25zXS5tYXAoKG8pID0+IG8udmFsdWUpO1xuICAgIH1cbiAgICBzZXQgc2VsZWN0ZWQodmFsdWUpIHtcbiAgICAgICAgLy8gQSB1c2VyIG1heSBub3Qgc3BlY2lmeSB0aGUgZnVsbCBwb3NzaWJsZSB2YWx1ZSBzbyB3ZSBpbnN0ZWFkIHVzZSB0aGUgY2xvc2VzdCBtYXRjaC5cbiAgICAgICAgLy8gZWcgP3h4eD1IMjY0IHdvdWxkIHNlbGVjdCAnSDI2NCBsZXZlbC1hc3ltbWV0cnktYWxsb3dlZD0xO3BhY2tldGl6YXRpb24tbW9kZT0xO3Byb2ZpbGUtbGV2ZWwtaWQ9NDIwMDFmJ1xuICAgICAgICBjb25zdCBmaWx0ZXJlZExpc3QgPSB0aGlzLm9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi5pbmRleE9mKHZhbHVlKSAhPT0gLTEpO1xuICAgICAgICBpZiAoZmlsdGVyZWRMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rvci52YWx1ZSA9IGZpbHRlcmVkTGlzdFswXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgc2VsZWN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdG9yLnZhbHVlO1xuICAgIH1cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLnNlbGVjdG9yLmRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZW5hYmxlKCkge1xuICAgICAgICB0aGlzLnNlbGVjdG9yLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U2V0dGluZ1VJT3B0aW9uLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBTZXR0aW5nVUlCYXNlIH0gZnJvbSAnLi9TZXR0aW5nVUlCYXNlJztcbmV4cG9ydCBjbGFzcyBTZXR0aW5nVUlUZXh0IGV4dGVuZHMgU2V0dGluZ1VJQmFzZSB7XG4gICAgY29uc3RydWN0b3Ioc2V0dGluZykge1xuICAgICAgICBzdXBlcihzZXR0aW5nKTtcbiAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuc2V0dGluZy5sYWJlbDtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGhpcy5zZXR0aW5nLnRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBzZXR0aW5nIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBnZXQgc2V0dGluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmc7XG4gICAgfVxuICAgIGdldCBzZXR0aW5nc1RleHRFbGVtKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3NldHRpbmdzVGV4dEVsZW0pIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzVGV4dEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzVGV4dEVsZW0uaW5uZXJUZXh0ID0gdGhpcy5zZXR0aW5nLmxhYmVsO1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NUZXh0RWxlbS50aXRsZSA9IHRoaXMuc2V0dGluZy5kZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NUZXh0RWxlbTtcbiAgICB9XG4gICAgZ2V0IHRleHRib3goKSB7XG4gICAgICAgIGlmICghdGhpcy5fdGV4dGJveCkge1xuICAgICAgICAgICAgdGhpcy5fdGV4dGJveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgICB0aGlzLl90ZXh0Ym94LmNsYXNzTGlzdC5hZGQoJ2Zvcm0tY29udHJvbCcpO1xuICAgICAgICAgICAgdGhpcy5fdGV4dGJveC50eXBlID0gJ3RleHRib3gnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl90ZXh0Ym94O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBSZXR1cm4gb3IgY3JlYXRlcyBhIEhUTUwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhpcyBzZXR0aW5nIGluIHRoZSBET00uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgcm9vdCBkaXYgd2l0aCBcInNldHRpbmdcIiBjc3MgY2xhc3NcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5pZCA9IHRoaXMuc2V0dGluZy5pZDtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NldHRpbmcnKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBkaXYgZWxlbWVudCB0byBjb250YWluIG91ciBzZXR0aW5nJ3MgdGV4dFxuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1RleHRFbGVtKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBsYWJlbCBlbGVtZW50IHRvIHdyYXAgb3V0IGlucHV0IHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh3cmFwcGVyTGFiZWwpO1xuICAgICAgICAgICAgLy8gY3JlYXRlIGlucHV0IHR5cGU9Y2hlY2tib3hcbiAgICAgICAgICAgIHRoaXMudGV4dGJveC50aXRsZSA9IHRoaXMuc2V0dGluZy5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIHdyYXBwZXJMYWJlbC5hcHBlbmRDaGlsZCh0aGlzLnRleHRib3gpO1xuICAgICAgICAgICAgLy8gc2V0dXAgb24gY2hhbmdlIGZyb20gY2hlY2tib3hcbiAgICAgICAgICAgIHRoaXMudGV4dGJveC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmcudGV4dCAhPT0gdGhpcy50ZXh0Ym94LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZy50ZXh0ID0gdGhpcy50ZXh0Ym94LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmcudXBkYXRlVVJMUGFyYW1zKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBCbG9jayBrZXlwcmVzcy91cC9kb3duIHByb3BvZ2F0aW9uIGZyb20gdGV4dCBmaWVsZCB0eXBpbmcgZ29pbmcgdG8gVUVcbiAgICAgICAgICAgIHRoaXMudGV4dGJveC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRleHRib3guYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50ZXh0Ym94LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBzZXR0aW5nJ3Mgc3RvcmVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSBpblZhbHVlIC0gVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHNldHRpbmcuXG4gICAgICovXG4gICAgc2V0IHRleHQoaW5WYWx1ZSkge1xuICAgICAgICB0aGlzLnRleHRib3gudmFsdWUgPSBpblZhbHVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdmFsdWVcbiAgICAgKi9cbiAgICBnZXQgdGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGV4dGJveC52YWx1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBsYWJlbCB0ZXh0IGZvciB0aGUgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0gbGFiZWwgLSBzZXR0aW5nIGxhYmVsLlxuICAgICAqL1xuICAgIHNldCBsYWJlbChpbkxhYmVsKSB7XG4gICAgICAgIHRoaXMuc2V0dGluZ3NUZXh0RWxlbS5pbm5lclRleHQgPSBpbkxhYmVsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgbGFiZWxcbiAgICAgKi9cbiAgICBnZXQgbGFiZWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzVGV4dEVsZW0uaW5uZXJUZXh0O1xuICAgIH1cbiAgICBkaXNhYmxlKCkge1xuICAgICAgICB0aGlzLnRleHRib3guZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbmFibGUoKSB7XG4gICAgICAgIHRoaXMudGV4dGJveC5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldHRpbmdVSVRleHQuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IEFjdGlvbk92ZXJsYXkgfSBmcm9tICcuL0FjdGlvbk92ZXJsYXknO1xuLyoqXG4gKiBTaG93IGFuIG92ZXJsYXkgZm9yIHdoZW4gdGhlIHNlc3Npb24gaXMgdW5hdHRlbmRlZCwgaXQgYmVnaW5zIGEgY291bnRkb3duIHRpbWVyLCB3aGljaCB3aGVuIGVsYXBzZWQgd2lsbCBkaXNjb25uZWN0IHRoZSBzdHJlYW0uXG4gKi9cbmV4cG9ydCBjbGFzcyBBRktPdmVybGF5IGV4dGVuZHMgQWN0aW9uT3ZlcmxheSB7XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgcm9vdCBlbGVtZW50IG9mIHRoaXMgb3ZlcmxheS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlUm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGFma092ZXJsYXlIdG1sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGFma092ZXJsYXlIdG1sLmlkID0gJ2Fma092ZXJsYXknO1xuICAgICAgICBhZmtPdmVybGF5SHRtbC5jbGFzc05hbWUgPSAnY2xpY2thYmxlU3RhdGUnO1xuICAgICAgICByZXR1cm4gYWZrT3ZlcmxheUh0bWw7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRlbnQgZWxlbWVudCBvZiB0aGlzIG92ZXJsYXksIHdoaWNoIGNvbnRhaW4gc29tZSB0ZXh0IGZvciBhbiBhZmsgY291bnQgZG93bi5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlQ29udGVudEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGFma092ZXJsYXlIdG1sSW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgYWZrT3ZlcmxheUh0bWxJbm5lci5pZCA9ICdhZmtPdmVybGF5SW5uZXInO1xuICAgICAgICBhZmtPdmVybGF5SHRtbElubmVyLmlubmVySFRNTCA9XG4gICAgICAgICAgICAnPGNlbnRlcj5ObyBhY3Rpdml0eSBkZXRlY3RlZDxicj5EaXNjb25uZWN0aW5nIGluIDxzcGFuIGlkPVwiYWZrQ291bnREb3duTnVtYmVyXCI+PC9zcGFuPiBzZWNvbmRzPGJyPkNsaWNrIHRvIGNvbnRpbnVlPGJyPjwvY2VudGVyPic7XG4gICAgICAgIHJldHVybiBhZmtPdmVybGF5SHRtbElubmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYW4gQWZrIG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIHRoZSBlbGVtZW50IHRoaXMgb3ZlcmxheSB3aWxsIGJlIGluc2VydGVkIGludG9cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihyb290RGl2KSB7XG4gICAgICAgIHN1cGVyKHJvb3REaXYsIEFGS092ZXJsYXkuY3JlYXRlUm9vdEVsZW1lbnQoKSwgQUZLT3ZlcmxheS5jcmVhdGVDb250ZW50RWxlbWVudCgpKTtcbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgY291bnQgZG93biBzcGFucyBudW1iZXIgZm9yIHRoZSBvdmVybGF5XG4gICAgICogQHBhcmFtIGNvdW50ZG93biAtIHRoZSBjb3VudCBkb3duIG51bWJlciB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBzcGFuIGZvciB1cGRhdGluZ1xuICAgICAqL1xuICAgIHVwZGF0ZUNvdW50ZG93bihjb3VudGRvd24pIHtcbiAgICAgICAgdGhpcy50ZXh0RWxlbWVudC5pbm5lckhUTUwgPSBgPGNlbnRlcj5ObyBhY3Rpdml0eSBkZXRlY3RlZDxicj5EaXNjb25uZWN0aW5nIGluIDxzcGFuIGlkPVwiYWZrQ291bnREb3duTnVtYmVyXCI+JHtjb3VudGRvd259PC9zcGFuPiBzZWNvbmRzPGJyPkNsaWNrIHRvIGNvbnRpbnVlPGJyPjwvY2VudGVyPmA7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QUZLT3ZlcmxheS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNSc7XG5pbXBvcnQgeyBPdmVybGF5QmFzZSB9IGZyb20gJy4vQmFzZU92ZXJsYXknO1xuLyoqXG4gKiBDbGFzcyBmb3IgdGhlIGJhc2UgYWN0aW9uIG92ZXJsYXkgc3RydWN0dXJlXG4gKi9cbmV4cG9ydCBjbGFzcyBBY3Rpb25PdmVybGF5IGV4dGVuZHMgT3ZlcmxheUJhc2Uge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhbiBhY3Rpb24gb3ZlcmxheVxuICAgICAqIEBwYXJhbSByb290RGl2IC0gdGhlIHJvb3QgZWxlbWVudCB0aGlzIG92ZXJsYXkgd2lsbCBiZSBpbnNlcnRlZCBpbnRvXG4gICAgICogQHBhcmFtIHJvb3RFbGVtZW50IC0gdGhlIHJvb3QgZWxlbWVudCB0aGF0IGlzIHRoZSBvdmVybGF5XG4gICAgICogQHBhcmFtIGNvbnRlbnRFbGVtZW50IC0gYW4gZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRleHQgZm9yIHRoZSBhY3Rpb24gb3ZlcmxheVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHJvb3REaXYsIHJvb3RFbGVtZW50LCBjb250ZW50RWxlbWVudCkge1xuICAgICAgICBzdXBlcihyb290RGl2LCByb290RWxlbWVudCwgY29udGVudEVsZW1lbnQpO1xuICAgICAgICB0aGlzLm9uQWN0aW9uQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAvKiBkbyBub3RoaW5nICovIExvZ2dlci5JbmZvKCdEaWQgeW91IGZvcmdldCB0byBzZXQgdGhlIG9uQWN0aW9uIGNhbGxiYWNrIGluIHlvdXIgb3ZlcmxheT8nKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSB0ZXh0IG92ZXJsYXlzIGlubmVyIHRleHRcbiAgICAgKiBAcGFyYW0gdGV4dCAtIHRoZSB1cGRhdGUgdGV4dCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBvdmVybGF5XG4gICAgICovXG4gICAgdXBkYXRlKHRleHQpIHtcbiAgICAgICAgaWYgKHRleHQgIT0gbnVsbCB8fCB0ZXh0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy50ZXh0RWxlbWVudC5pbm5lckhUTUwgPSB0ZXh0O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldCBhIG1ldGhvZCBhcyBhbiBldmVudCBlbWl0dGVyIGNhbGxiYWNrXG4gICAgICogQHBhcmFtIGNhbGxCYWNrIC0gdGhlIG1ldGhvZCB0aGF0IGlzIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBldmVudCBpcyBlbWl0dGVkXG4gICAgICovXG4gICAgb25BY3Rpb24oY2FsbEJhY2spIHtcbiAgICAgICAgdGhpcy5vbkFjdGlvbkNhbGxiYWNrID0gY2FsbEJhY2s7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFjdGl2YXRlIGFuIGV2ZW50IHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhlIGV2ZW50IGVtaXR0ZXJcbiAgICAgKi9cbiAgICBhY3RpdmF0ZSgpIHtcbiAgICAgICAgdGhpcy5vbkFjdGlvbkNhbGxiYWNrKCk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QWN0aW9uT3ZlcmxheS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBDbGFzcyBmb3IgdGhlIGJhc2Ugb3ZlcmxheSBzdHJ1Y3R1cmVcbiAqL1xuZXhwb3J0IGNsYXNzIE92ZXJsYXlCYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYW4gb3ZlcmxheVxuICAgICAqIEBwYXJhbSByb290RGl2IC0gdGhlIHJvb3QgZWxlbWVudCB0aGlzIG92ZXJsYXkgd2lsbCBiZSBpbnNlcnRlZCBpbnRvXG4gICAgICogQHBhcmFtIHJvb3RFbGVtZW50IC0gdGhlIHJvb3QgZWxlbWVudCB0aGF0IGlzIHRoZSBvdmVybGF5XG4gICAgICovXG4gICAgY29uc3RydWN0b3Iocm9vdERpdiwgcm9vdEVsZW1lbnQsIHRleHRFbGVtZW50KSB7XG4gICAgICAgIHRoaXMucm9vdERpdiA9IHJvb3REaXY7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQgPSByb290RWxlbWVudDtcbiAgICAgICAgdGhpcy50ZXh0RWxlbWVudCA9IHRleHRFbGVtZW50O1xuICAgICAgICB0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudGV4dEVsZW1lbnQpO1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgdGhpcy5yb290RGl2LmFwcGVuZENoaWxkKHRoaXMucm9vdEVsZW1lbnQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTaG93IHRoZSBvdmVybGF5XG4gICAgICovXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW5TdGF0ZScpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIaWRlIHRoZSBvdmVybGF5XG4gICAgICovXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdoaWRkZW5TdGF0ZScpO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJhc2VPdmVybGF5LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBBY3Rpb25PdmVybGF5IH0gZnJvbSAnLi9BY3Rpb25PdmVybGF5Jztcbi8qKlxuICogT3ZlcmxheSBzaG93biBkdXJpbmcgY29ubmVjdGlvbiwgaGFzIGEgYnV0dG9uIHRoYXQgY2FuIGJlIGNsaWNrZWQgdG8gaW5pdGlhdGUgYSBjb25uZWN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgQ29ubmVjdE92ZXJsYXkgZXh0ZW5kcyBBY3Rpb25PdmVybGF5IHtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCByb290IGVsZW1lbnQgb2YgdGhpcyBvdmVybGF5LlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVSb290RWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgY29ubmVjdEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgY29ubmVjdEVsZW0uaWQgPSAnY29ubmVjdE92ZXJsYXknO1xuICAgICAgICBjb25uZWN0RWxlbS5jbGFzc05hbWUgPSAnY2xpY2thYmxlU3RhdGUnO1xuICAgICAgICByZXR1cm4gY29ubmVjdEVsZW07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIGNvbnRlbnQgZWxlbWVudCBvZiB0aGlzIG92ZXJsYXksIHdoaWNoIGNvbnRhaW4gd2hhdGV2ZXIgY29udGVudCB0aGlzIGVsZW1lbnQgY29udGFpbnMsIGxpa2UgdGV4dCBvciBhIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlQ29udGVudEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGNvbm5lY3RDb250ZW50RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBjb25uZWN0Q29udGVudEVsZW0uaWQgPSAnY29ubmVjdEJ1dHRvbic7XG4gICAgICAgIGNvbm5lY3RDb250ZW50RWxlbS5pbm5lckhUTUwgPSAnQ2xpY2sgdG8gc3RhcnQnO1xuICAgICAgICByZXR1cm4gY29ubmVjdENvbnRlbnRFbGVtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBjb25uZWN0IG92ZXJsYXkgd2l0aCBhIGNvbm5lY3Rpb24gYnV0dG9uLlxuICAgICAqIEBwYXJhbSBwYXJlbnRFbGVtIC0gdGhlIHBhcmVudCBlbGVtZW50IHRoaXMgb3ZlcmxheSB3aWxsIGJlIGluc2VydGVkIGludG8uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGFyZW50RWxlbSkge1xuICAgICAgICBzdXBlcihwYXJlbnRFbGVtLCBDb25uZWN0T3ZlcmxheS5jcmVhdGVSb290RWxlbWVudCgpLCBDb25uZWN0T3ZlcmxheS5jcmVhdGVDb250ZW50RWxlbWVudCgpKTtcbiAgICAgICAgLy8gYWRkIHRoZSBuZXcgZXZlbnQgbGlzdGVuZXJcbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29ubmVjdE92ZXJsYXkuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IEFjdGlvbk92ZXJsYXkgfSBmcm9tICcuL0FjdGlvbk92ZXJsYXknO1xuLyoqXG4gKiBPdmVybGF5IHNob3duIGR1cmluZyBkaXNjb25uZWN0aW9uLCBoYXMgYSByZWNvbm5lY3Rpb24gZWxlbWVudCB0aGF0IGNhbiBiZSBjbGlja2VkIHRvIHJlY29ubmVjdC5cbiAqL1xuZXhwb3J0IGNsYXNzIERpc2Nvbm5lY3RPdmVybGF5IGV4dGVuZHMgQWN0aW9uT3ZlcmxheSB7XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgcm9vdCBlbGVtZW50IG9mIHRoaXMgb3ZlcmxheS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlUm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGRpc2Nvbm5lY3RPdmVybGF5SHRtbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXNjb25uZWN0T3ZlcmxheUh0bWwuaWQgPSAnZGlzY29ubmVjdE92ZXJsYXknO1xuICAgICAgICBkaXNjb25uZWN0T3ZlcmxheUh0bWwuY2xhc3NOYW1lID0gJ2NsaWNrYWJsZVN0YXRlJztcbiAgICAgICAgcmV0dXJuIGRpc2Nvbm5lY3RPdmVybGF5SHRtbDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgY29udGVudCBlbGVtZW50IG9mIHRoaXMgb3ZlcmxheSwgd2hpY2ggY29udGFpbiB3aGF0ZXZlciBjb250ZW50IHRoaXMgZWxlbWVudCBjb250YWlucywgbGlrZSB0ZXh0IG9yIGEgYnV0dG9uLlxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVDb250ZW50RWxlbWVudCgpIHtcbiAgICAgICAgLy8gYnVpbGQgdGhlIGlubmVyIGh0bWwgY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGRpc2Nvbm5lY3RPdmVybGF5SHRtbENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBkaXNjb25uZWN0T3ZlcmxheUh0bWxDb250YWluZXIuaWQgPSAnZGlzY29ubmVjdEJ1dHRvbic7XG4gICAgICAgIGRpc2Nvbm5lY3RPdmVybGF5SHRtbENvbnRhaW5lci5pbm5lckhUTUwgPSAnQ2xpY2sgVG8gUmVzdGFydCc7XG4gICAgICAgIHJldHVybiBkaXNjb25uZWN0T3ZlcmxheUh0bWxDb250YWluZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIGRpc2Nvbm5lY3Qgb3ZlcmxheSB3aXRoIGEgcmV0cnkgY29ubmVjdGlvbiBpY29uLlxuICAgICAqIEBwYXJhbSBwYXJlbnRFbGVtIC0gdGhlIHBhcmVudCBlbGVtZW50IHRoaXMgb3ZlcmxheSB3aWxsIGJlIGluc2VydGVkIGludG8uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGFyZW50RWxlbSkge1xuICAgICAgICBzdXBlcihwYXJlbnRFbGVtLCBEaXNjb25uZWN0T3ZlcmxheS5jcmVhdGVSb290RWxlbWVudCgpLCBEaXNjb25uZWN0T3ZlcmxheS5jcmVhdGVDb250ZW50RWxlbWVudCgpKTtcbiAgICAgICAgLy8gYWRkIHRoZSBuZXcgZXZlbnQgbGlzdGVuZXJcbiAgICAgICAgdGhpcy5yb290RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RGlzY29ubmVjdE92ZXJsYXkuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IFRleHRPdmVybGF5IH0gZnJvbSAnLi9UZXh0T3ZlcmxheSc7XG4vKipcbiAqIEdlbmVyaWMgb3ZlcmxheSB1c2VkIHRvIHNob3cgdGV4dHVhbCBlcnJvciBpbmZvIHRvIHRoZSB1c2VyLlxuICovXG5leHBvcnQgY2xhc3MgRXJyb3JPdmVybGF5IGV4dGVuZHMgVGV4dE92ZXJsYXkge1xuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIHJvb3QgZWxlbWVudCBvZiB0aGlzIG92ZXJsYXkuXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVJvb3RFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBlcnJvck92ZXJsYXlIdG1sID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGVycm9yT3ZlcmxheUh0bWwuaWQgPSAnZXJyb3JPdmVybGF5JztcbiAgICAgICAgZXJyb3JPdmVybGF5SHRtbC5jbGFzc05hbWUgPSAndGV4dERpc3BsYXlTdGF0ZSc7XG4gICAgICAgIHJldHVybiBlcnJvck92ZXJsYXlIdG1sO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZW50IGVsZW1lbnQgb2YgdGhpcyBvdmVybGF5LCB3aGljaCBjb250YWluIHdoYXRldmVyIGNvbnRlbnQgdGhpcyBlbGVtZW50IGNvbnRhaW5zLCBsaWtlIHRleHQgb3IgYSBidXR0b24uXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZUNvbnRlbnRFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBlcnJvck92ZXJsYXlIdG1sSW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZXJyb3JPdmVybGF5SHRtbElubmVyLmlkID0gJ2Vycm9yT3ZlcmxheUlubmVyJztcbiAgICAgICAgcmV0dXJuIGVycm9yT3ZlcmxheUh0bWxJbm5lcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgY29ubmVjdCBvdmVybGF5IHdpdGggYSBjb25uZWN0aW9uIGJ1dHRvbi5cbiAgICAgKiBAcGFyYW0gcGFyZW50RWxlbSAtIHRoZSBwYXJlbnQgZWxlbWVudCB0aGlzIG92ZXJsYXkgd2lsbCBiZSBpbnNlcnRlZCBpbnRvLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudEVsZW0pIHtcbiAgICAgICAgc3VwZXIocGFyZW50RWxlbSwgRXJyb3JPdmVybGF5LmNyZWF0ZVJvb3RFbGVtZW50KCksIEVycm9yT3ZlcmxheS5jcmVhdGVDb250ZW50RWxlbWVudCgpKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1FcnJvck92ZXJsYXkuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmltcG9ydCB7IFRleHRPdmVybGF5IH0gZnJvbSAnLi9UZXh0T3ZlcmxheSc7XG4vKipcbiAqIEdlbmVyaWMgb3ZlcmxheSB1c2VkIHRvIHNob3cgdGV4dHVhbCBpbmZvIHRvIHRoZSB1c2VyLlxuICovXG5leHBvcnQgY2xhc3MgSW5mb092ZXJsYXkgZXh0ZW5kcyBUZXh0T3ZlcmxheSB7XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgcm9vdCBlbGVtZW50IG9mIHRoaXMgb3ZlcmxheS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlUm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IGluZm9PdmVybGF5SHRtbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBpbmZvT3ZlcmxheUh0bWwuaWQgPSAnaW5mb092ZXJsYXknO1xuICAgICAgICBpbmZvT3ZlcmxheUh0bWwuY2xhc3NOYW1lID0gJ3RleHREaXNwbGF5U3RhdGUnO1xuICAgICAgICByZXR1cm4gaW5mb092ZXJsYXlIdG1sO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZW50IGVsZW1lbnQgb2YgdGhpcyBvdmVybGF5LCB3aGljaCBjb250YWluIHdoYXRldmVyIGNvbnRlbnQgdGhpcyBlbGVtZW50IGNvbnRhaW5zLCBsaWtlIHRleHQgb3IgYSBidXR0b24uXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZUNvbnRlbnRFbGVtZW50KCkge1xuICAgICAgICBjb25zdCBpbmZvT3ZlcmxheUh0bWxJbm5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBpbmZvT3ZlcmxheUh0bWxJbm5lci5pZCA9ICdtZXNzYWdlT3ZlcmxheUlubmVyJztcbiAgICAgICAgcmV0dXJuIGluZm9PdmVybGF5SHRtbElubmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSBjb25uZWN0IG92ZXJsYXkgd2l0aCBhIGNvbm5lY3Rpb24gYnV0dG9uLlxuICAgICAqIEBwYXJhbSBwYXJlbnRFbGVtIC0gdGhlIHBhcmVudCBlbGVtZW50IHRoaXMgb3ZlcmxheSB3aWxsIGJlIGluc2VydGVkIGludG8uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocGFyZW50RWxlbSkge1xuICAgICAgICBzdXBlcihwYXJlbnRFbGVtLCBJbmZvT3ZlcmxheS5jcmVhdGVSb290RWxlbWVudCgpLCBJbmZvT3ZlcmxheS5jcmVhdGVDb250ZW50RWxlbWVudCgpKTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1JbmZvT3ZlcmxheS5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgQWN0aW9uT3ZlcmxheSB9IGZyb20gJy4vQWN0aW9uT3ZlcmxheSc7XG4vKipcbiAqIE92ZXJsYXkgc2hvd24gd2hlbiBzdHJlYW0gaXMgcmVhZHkgdG8gcGxheS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsYXlPdmVybGF5IGV4dGVuZHMgQWN0aW9uT3ZlcmxheSB7XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgVGhlIGNyZWF0ZWQgcm9vdCBlbGVtZW50IG9mIHRoaXMgb3ZlcmxheS5cbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlUm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGNvbnN0IHBsYXlFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHBsYXlFbGVtLmlkID0gJ3BsYXlPdmVybGF5JztcbiAgICAgICAgcGxheUVsZW0uY2xhc3NOYW1lID0gJ2NsaWNrYWJsZVN0YXRlJztcbiAgICAgICAgcmV0dXJuIHBsYXlFbGVtO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBUaGUgY3JlYXRlZCBjb250ZW50IGVsZW1lbnQgb2YgdGhpcyBvdmVybGF5LCB3aGljaCBjb250YWluIHdoYXRldmVyIGNvbnRlbnQgdGhpcyBlbGVtZW50IGNvbnRhaW5zLCBsaWtlIHRleHQgb3IgYSBidXR0b24uXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZUNvbnRlbnRFbGVtZW50KCkge1xuICAgICAgICAvLyB0b2RvOiBjaGFuZ2UgdGhpcyB0byBhbiBzdmdcbiAgICAgICAgY29uc3QgcGxheU92ZXJsYXlIdG1sSW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbWcnKTtcbiAgICAgICAgcGxheU92ZXJsYXlIdG1sSW5uZXIuaWQgPSAncGxheUJ1dHRvbic7XG4gICAgICAgIHBsYXlPdmVybGF5SHRtbElubmVyLnNyYyA9XG4gICAgICAgICAgICAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFQRUFBQUQ1Q0FZQUFBRDJtTk5rQUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQURzTUFBQTdEQWNkdnFHUUFBQUFaZEVWWWRGTnZablIzWVhKbEFIQmhhVzUwTG01bGRDQTBMakF1TWpIeElHbVZBQUFTZ2tsRVFWUjRYdTJkQzdCZFZYMkhxVUNDSVJBU0NQakFGSVFSRUJSQkJTUlliRk90OGxJckZVV1JGcVhXc1Q1d2JJdFVxRldzMEtxSU1QS29ZRVdwUlMwNktEalMxQmVWRmtWUWJDdyt3Q2ZpQXdHaENLV1A5UHVadFUyNHVUZTU5enoyMlkvdm0vbkdrWHR6N2pscnI5K3NkZlplYS8wM1diMTY5UXR4R1c2MmlZaTBEOEw3TmJ3WWo4RWRjZFB5SXhGcEE0VDJQL0YvOFVhOENJL0doUG5YeXErSVNKTWhyQWx4eFg5aFJ1WUw4U2g4U1BrMUVXa3FCSFhkRUZmY2c2dnczZmhzM0tiOHVvZzBEUUk2WFlncjhyT3ZZc0o4T000di8weEVta0lKNm9iNFA4eklmQU5lZ0N2UU1JczBCUUs1c1JCWEpNeS93SXpNNStCeVhGQmVSa1FtQlVHY2JZalg1UzVNbU0vQUEzQ0w4bklpVWpjRWNKQVFWOXlCWDhhL3dTZWl6NWhGNm9iZ0RSUGlrR2ZNQ2ZPWDhEVGN1N3kwaU5RQm9SczJ4QlgvZzNkaXd2d20zS244Q1JFWko0UnRWQ0d1cU1LY3U5a240eEowOVpmSXVDQmdvdzV4eUozc1RMTnpBeXdyd0Y2SjI2TmhGaGsxQkdzY0lWNlhoUGx1dkE2UHh4M0tueGFSVVVDb3hoM2lpb1E1ejVuL0JZL0ZKZVV0aU1nd0VLYTZRbHlSTU4rSG44SG40WmJscllqSUlCQ2l1a01jOHAyNVdzNlpNRCt6dkIwUm1Tc0VhQklobmtyZXc1VjRFSHJDaU1oY0tBRnFDditObCtKK3VCQzlteTJ5TVFoS2swSmNrZS9NNzhHc3kwNllIMVRlcm9oTWhZQTBNY1FWUDhOejhVRGNDbDJiTFRJVmd0SGtFRmQ4RDgvRS9YRnJkR1FXcVNBUWJRaHh5S09wbS9CMDNBYzlNa2drRUlhMmhMZ2lONzhTNWxQeDBiZ0l2UUVtL1lVQXRDM0VGUW56emZnbnVEYzZ6WlorUXNkdmE0alg1U3Y0YXR3WEhabWxYOURodXhEaWtDMlFuOGRYWVVibVJlVWppblFiT250WFFseVJUUmFmd2xkZ3dyeFYrYWdpM1lSTzNyVVFWL3djVitMTDhESG95WnpTVGVqY1hRMXhSYzcvdWh5emwza3YzTHg4ZEpGdVFLZnVlb2hEbmpGblpQNG8vajdtMFpRSDRFczNvRFAzSWNRVjJmNllNRitDT1pqZ1VlaVoyZEp1Nk1SOUN2RzYzSUx2eDR6TUNmTzgwaVFpN1lMTzI5Y1FWM3diMzRzcHNyNHJ1bUJFMmdXZHR1OGhEbG45OVMxTVhlWVg0TTZsZVVTYUR4M1dFSzhsUmRZVDVsUi96UGxmbnN3cHpZZU9hb2pYSjRjU2ZCM1B3K2ZndHVnMFc1b0puZE1RVDAvdVpHZWFYWlZ5ZlRadVY1cE5wRG5RTVEzeHhzazBPOVVmejhaRGNkdlNmQ0tUaHc1cGlHZFAyaW9GNDk2SlQwYzNXY2prS1IxVDVrWVdqQ1RNNzhEZlFoZU15T1NnQXhyaXdjaDM1bFIvdkFiUHdPWG96UytwSHpxZUlSNk9hbDEyd3Z4MmZCeTZ5VUxxZ3c1bmlFZER3cHlSK1ZwTWtmWHNtSElwcDR3Zk9wb2hIajIzNFJmd0ZOd0RuV2JMK0tDREdlTHhrSkg1cDNnMXZnNTNLMDB1TWxyb1hJWjR2R1RCU01KOEZlWmt6bVdsNlVWR0E1M0tFTmZEL1ppeU5DbXludk8vRnBkTElESWNkQ1pEWEM4Wm1mT2QrZC93SmVqWlh6SWNkQ0pEWEQ5NXhwd2pkblArVjc0ekg0V3UvcExCb1BNWTRzbVNNTitGS2JKK0JCcG1tUnQwR2tQY0RCTG11L0ZqZUFpNmxGTm1CNTNGRURlSFRMUHphQ29qODBkd0JmcU1XVFlNbmNRUU41ZXNBUHN3N2xjdWw4ajYwRUVNY2ZQSkRiRDNZVTdsM0t4Y09wRTEwQ2tNY1R2SVZEdmZtYy9FM1hFTHRQcWpHT0tXa2hWZ3ArR2VtREQ3dmJuUDBBRU1jWHRKa2ZVMzRHTnhBVG95OXhFdXZDRnVQNnZ3Sk15T3FZWGwwa3BmNEtJYjRtNVFuY3laVFJhcFpHR1krd0lYMnhCM2kzdnhPc3dtaTEzUWFYYlg0UUliNG02U1kzYS9pTWRoN21ZYjVxN0NoVFhFM2FYYWFMRVNxN3JNVzVaTEwxMkJpMnFJKzhFOWVEa216THVoWWU0S1hFeEQzQjh5TXQrT2wrS0wwQ0xyWFlDTGFJajdSOEo4SzE2Q1I2UExPZHNNRjg4UTk1ZnNtUG9SWG96UHhkek5kdlZYMitDaUdXTEp6YStFT1hXWmo4U2QwQVB3MndJWHl4QkxxUFl5MzRMblk4SzhEQTF6MCtFaUdXS1pTZ0o5STc0TFUyUjlSM1NhM1ZTNE9JWllacUpheW5rV3BzajZ3MHUza1NiQmhUSEVzakh1d3hzd3BWd1B3NldsKzBnVDRJSVlZcGtObVdLbnIxeVBxZjU0S0c1VnVwRk1rbkpoUkdaTHdwelZYNm4rK0RaOEdycGphcEp3QVF5eERFTENuQjFUcVdUeDEvZ1VkR1NlQkRTOElaWkJTWkJqenY3NlBQNFZIb1NHdVU1b2NFTXNveUJoVHNHNFZIOThJeDZBODBzM2szRkNReHRpR1NWWk1QSVQvQ3dtelB1aHo1akhDUTFzaUdVY1pDbG53dnhwUEFYM0xGMU9SZzJOYTRobFhHU0tuUVVqQ2ZObjhQWDRDTnkwZEQ4WkJUU29JWlp4a3pCWEkvUG44QVRNdW16RFBBcG9TRU1zZFpFdzV6dnpEekhUN0pkand1elpYOE5BQXhwaW1RU1paaWZNbjhUajhhR2xTOHBjb2ZFTXNVeUtqTXc1bFRPbmpId2NjMlRRa3RJMVpiYlFhSVpZSmszQ25FMFdHWm12d09laCs1aG5DNDFsaUtVcFZDTnp3dndKUEJ5OStiVXhhQ1JETEUwalliNGZVLzB4MCt5RDhjR2x5OHBVYUJ4RExFMGtRYTdDZkNmbU1MOEQwU04ycDBLakdHSnBPZ2x6dFdna2gvazlDVDFpdDRMR01NVFNGaExtTEJySjNleHpjSi9TamZzTkRXR0lwWTBrMEQvQU0vR1JwVHYzRXhyQUVFdWJxVmFBblk1THNYOTNzL25RaGxpNlFMVUY4bldZSTNibllUK1djL0pCRGJGMGhlcU85amZ3bGZoSW5JL2REak1mMEJCTEYwbVlyOE5zc2tpTnFTMndtMkhtZ3hsaTZUSjV6cHdqZy80UWQ4YnVMUnJoUXhsaTZRTTVaamRIQmgySCtjN2NuVVVqZkJoRExIMGhVK3k3Y0NVK0g3T1hlVjZKUW52aFF4aGk2UnNKYzBibXkvQlorTXNiWUNVUzdZTTNiNGlscnlUTTJRTDVRVXpCdUh4bmJ0ODBtemR0aUVWV3I3NE5MOEtVY2syUjlmYU16THhaUXl5eWhvek1XY3A1SWY0dUpzek5QNXlBTjJtSVJSNUlWbi9kak9maEVkanN3L3g0YzRaWVpIcnlqUGttUEJzUHdZZVYyRFFMM3BnaEZwbVpUTEZ6WkZEQ25Mck16OER0c1RrYkxYZ3pobGhrNHlUTTJjdThDck5qS2lOendqejVPbE84Q1VNc01qY1M1cXpMZmd1bXlQcjJKVTZUZ1RkZ2lFVUdveXF5bnJyTXY0MlRPVE9iUDJ5SVJRWW4wK3dzNWJ3YVU4cjFOM0hyRXE5NjRBOGFZcEhoU1pqdndCU01TNWdQd25yV1pmT0hETEhJNk1nejVoeXhtNEp4ZjRrSDRIakR6Qjh3eENLakoySE9OUHVmOGM5eEh4elBYbVplMkJDTGpJZE1zV01xV2Z3VG5vaVB3ZEdPekx5Z0lSWVpQd2x6VldQcXRiZ1hqbWJCQ0M5a2lFWHFJOCtZczhuaWNud043bGFpT0RpOGlDRVdxWmVNeWxtWG5UQ25ZRnhPNXR5eFJITHU4SThOc2Noa1NKaXpMdnY3bUpINXBiZ1k1N1pqaW45Z2lFVW1TelV5Znc5VFpQMVkzTFpFZE9Qd3k0WllwQmtrektuKytCMzhLQjZGMjVXb3pneS9aSWhGbWtYQ25MTy92b3Nmd3B3eXNxaEVkbjM0b1NFV2FTWUo4eTh3MCt3UDRHRzQvb0lSL3FNaEZtazJWWmd6elU2WXMyTnE3VDVtL284aEZta0hDWE8yUHliTUYrTysrQ0JETE5JdUV1U3N5ODUzNWx2eFpFTXMwajZxV3N6WkpiWFVFSXUwaTF2d3JaaHFGWnY1blZpa1BXVHFmQTVtRjlRREQrZmpQeGhpa2VhUjc3N3hkcndBbjFBaXV6NzgwQkNMTkl2c2RNcUJBcWtOdFJ3M1hCZUtYekRFSXBNbm8yN0NlemRlaWsvR0JTV21HNFpmTk1RaWt5UGh6WHJwVkdYTTZSOHJjRzdsVmZrSGhsaWtmaExlN0Z6S282S1YrSHU0NW03elhPRWZHbUtSZXNrZTRvVDNrM2dNYmxuaU9CaThnQ0VXcVllTXZEL0dLL0Y0M0tIRWNEaDRJVU1zTWw1eXcrcEhtTE9vWDRhREg4VXpIYnlnSVJZWkQvbmVtNUgzS2p3QmQ4TFJWMUhrUlEyeHlHakozZWFjTloxaWF5ZmhyK1A0NmhuejRvWllaRFJrMnB6d3BoN1RYK0N1T1A3Nnhmd1JReXd5SE5sVlZJWDNWSHg4aVZjOThBY05zY2pnWkpGR3lwcStHZmZId1o3MURnTi8xQkNMekoyZjQ3L2lXekJsVElkNzFqc00vSEZETERJN2NyZjVIcndHMzRZSFk3MEZ4YWVETjJHSVJUWk13cHZqY0s3RmQrQlRjZkxocmVETkdHS1JtY25JZXoyK0V3L0ZoVGkzTWl2amhqZGtpRVhXSjBmRWZoWFB3bWZpNGhLWjVzR2JNOFFpYThuNjVsWDRMa3psaFllVnFEUVgzcVFoRmxuenJQYy84RnpNdHNCbDJLeHA4MHp3UmcyeDlKMGN4bjRlcG9CWmxralcvNngzR0hqRGhsajZTSlpJNWdUSjkrRHpNZUhkdk1TaVhmREdEYkgwaVdwYllNcWdKTHk3WUx0RzNxbndBUXl4OUlWc0M3d0VYNEM3NC9oMkZ0VUpIOFFRUzlmSlVUZzVRZkk0M0FQbmxlN2ZEZmhBaGxpNlNvNS8vUmkrR0JQZXlhMXZIaWQ4TUVNc1hTTUgwWDBDWDRKNzRjTFMzYnNKSDlBUVMxZklUYXZzNmYxVmVMRWR6M3FIZ1E5cGlLWHRaSE5DMWpmbkVMcGZUcHV4KytHdDRNTWFZbWtybVRaL0dWK0xDVyszcDgwendRYzN4Tkkyc2tUeUJzd2hkSHRpYzdZRlRnSWF3QkJMbTdnUlQ4SEg0ZGJZbjJuelROQUlobGphUUNya3Z3a1QzdHl3R3Y4cGttMkJ4akRFMGxSeW9rYk9zam9EVXlFL042d003MVJvRkVNc1RTUGh2UlBmalkvR0JlaTBlU1pvSEVNc1RlSjIvQUR1ZyszY1ZWUTNOSlFobGlhUWtmY2Y4U25vcURzWGFEQkRMSk1pajRydXhjdndhZWpJT3dnMG5DR1d1c255eUlUM0Nqd00rN2xJWTFUUWdJWlk2aUEzcXpMeVptZFJTbjBlaWMwOVFiSk4wSkNHV01aSndwdVI5dzc4RXI0UXU3a2xjRkxRb0laWXhrWHE5T1p1YzJvV1pYTkN2NWRIamdzYTFoRExxS25DbTJxQjJaencwTkxkWkJ6UXdJWllSa1dtelQvRGhQZEUzS1YwTXhrbk5MUWhsbUhKOTk2RU53WEhzamtocTZ4Y0hsa1hOTFlobGtGSmVIUERLaHZ5c3praDRXMzM4YTl0aEVZM3hESlg4cWdvR3hNUzN0VHBmU3pPTDExSzZvYkdOOFF5V3hMZUxJL010RG1sUHZkSHA4MlRob3RnaUdVMlpPU3R3cnNDWFNMWkZMZ1lobGcyeEYyWWM2ek94cWVqQ3pXYUJoZkZFTXQwcE1qMlZ6QjFlZy9CSmFYTFNOUGc0aGhpcWNqZDVpelVTSVg4bFBwOEZpNHRYVVdhQ2hmSkVFdEloZndVMmI0UVUyUjdPM1JmYnh2Z1FobmlmcE9EMTcrSkNXOUtmUzVGN3ppM0NTNllJZTRuT1hqOVcvaDNlQXcrdkhRSmFSdGNQRVBjTC9LczkyYThDSS9GWGRGcGM1dmhBaHJpL3ZCOS9IdjhBM3dVdWtTeUMzQWhEWEgzK1NuK0F4NlBxWkR2RXNrdXdRVTF4TjJrT2dvbkowaW0xR2MySjJ4UkxydDBDUzZzSWU0VzFjNmlqMk5HM2xST21GY3V0M1FSTHJBaDdnNEo3NVg0UjdnM0d0NCt3SVUyeE8wbjArWlA0YXN3QmNkYzM5d251T0NHdUwza1dlL244RFc0THk0cWwxWDZCQmZlRUxlVEwrQUorQVRjQm4zVzIxZTQrSWE0UGVTTzg5ZndUL0dKdUFoZEl0bDM2QVNHdVBsa1o5RzM4ZldZbzNBeThocGVXUU9kd1JBM2x4d0JleE8rR1ZQcTA3SW5zajUwREVQY1RMSysrZTJZYzZ3V285OTVaWHJvSElhNFdkeUtPUXBuT1diYXZHbTVWQ0xUUXljeHhNMGdwMGllajAvRzNMQXl2REk3NkN5R2VISlV4K0c4SHc5RXd5dHpoMDVqaUNkRERxSzdIQS9BaGVoM1hoa01PbzhocnBlMDk2ZnhkOUQ5dkRJOHBWUEorTGtYUDR2UFFhZk1NanJvVUlaNGZPUTdiOVkzWDRVNXg4b2kyeko2NkZpR2VQUmtlV1JPa2Z3aUhvZWUzU3pqZ3c1bWlFZERSdDE0RCtidzlaZmpEcVdaUmNZSEhjMFFEMDkxRkU2T2dQMHo5T0IxcVE4Nm15RWVuS3h0VG5nejhyNEJIWG1sZnVoNGhuanVKTHdwOVpscWdhZmg3cVU1UmVxSERtaUlaMCttelZrZWVRTytGUjlmbWxGa2N0QVJEZkhzU0ozZWY4ZHFaNUdIMEVrem9ETWE0cG5KM2VhMFQwN1RPQWV6dm5sQmFUcVJabEE2cVR5UWhEZHJtMWZoQlhnd0dsNXBKblJPUTd5VzZqbHZ3dnRlZkFadVhwcEtwSm1VVGl0cnA4MHA5Wm4xelE4dVRTVFNiT2lzZlE5eHBzMnBrSi93UGhlM0swMGowZzdvdEgwTjhmMzRkWHdmSG8wVzJaWjJRdWZ0WTRpelBES25hYndJSDRFZS95cnRoUTdjbHhCbmxkVVA4Qko4TVNhODd1dVY5a05IN25xSWM0WlZ3dnNoZkNrdVE4TXIzWUVPM2RVUVo0bmtEL0hEbUZLZmU1U1BMTkl0Nk54ZERISEMreEY4QmFic2lTT3ZkQmM2ZUpkQ2ZCdGVoZ2x2aW16N3JGZTZEeDI5Q3lIT1FvMHI4TldZT3IwVzJaYitRSWR2YTRpelJETFBlbGRpNnZTbTFPZkM4ckZFK2dNZHY0MGh6bnUrR2xNaGZ6L2NFajBPUi9vSm5iOU5JYzU3dlFaUHhDZWhJNjlJQ1ViVHlkbk4xK0xKbVBBdUtXOWZSQWhFazBPY1o3M1hZdzZoT3dnOXYxbGtLZ1NqcVNITzVvUlQ4VGR3S2JxK1dXUTZDRWVUUXB3N3psbW9jVHFtVG0vT2I3Ym9tTWlHSUNSTkNIR216VC9Cc3pDbFBqUHl1c3BLWkRZUWxrbUgrTWY0dDdnY3QwZW56U0p6Z2RCTUtzUUo3MFg0VkhUa0ZSa1V3bE4zaUZNNTRZTjRLRzZMSGtRbk1neUVxSzRRNTFudnBaandadVExdkNLamdERFZFZUlyOFhCTWVMM2JMREpLQ05XNFFweVI5em84QXJkQmIxaUpqQVBDTmVvUUo3eXBGbmdzemtjM0pvaU1FMEkycWhEbldXOEtqdjB4dWpGQnBDNEkzREFoemdxckhFU1hVcC9aMC91UThySWlVaGNFYjVBUUo3ejM0VGZ3Sk55NXZKeUkxQTBCbkcySUU5eVlzaWZmd1RmaXp1aDNYcEZKUWdobkUrSjgzMDE0djR1cGtMOHIrcWhJcEFrUXhnMkZPT0hOenpOdFBoZjNSRWRla1NaUlFqcVZUSnR6Z3VTTmVENGVXSDVkUkpvR0FaMGE0cnZ4bTNnaHJrQ256U0pOaHBCV0ljNy9wbHBnd3B1ZFJaN2RMTklHQ092dEpid1g0Mkc0dVB4SVJOb0FvVTJkM2lOeFVmbFBJdElhTnRuay93RUdCb01kcEVDR0hBQUFBQUJKUlU1RXJrSmdnZz09JztcbiAgICAgICAgcGxheU92ZXJsYXlIdG1sSW5uZXIuYWx0ID0gJ1N0YXJ0IFN0cmVhbWluZyc7XG4gICAgICAgIHJldHVybiBwbGF5T3ZlcmxheUh0bWxJbm5lcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0IGEgY29ubmVjdCBvdmVybGF5IHdpdGggYSBjb25uZWN0aW9uIGJ1dHRvbi5cbiAgICAgKiBAcGFyYW0gcGFyZW50RWxlbSAtIHRoZSBwYXJlbnQgZWxlbWVudCB0aGlzIG92ZXJsYXkgd2lsbCBiZSBpbnNlcnRlZCBpbnRvLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudEVsZW0pIHtcbiAgICAgICAgc3VwZXIocGFyZW50RWxlbSwgUGxheU92ZXJsYXkuY3JlYXRlUm9vdEVsZW1lbnQoKSwgUGxheU92ZXJsYXkuY3JlYXRlQ29udGVudEVsZW1lbnQoKSk7XG4gICAgICAgIC8vIGFkZCB0aGUgbmV3IGV2ZW50IGxpc3RlbmVyXG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBsYXlPdmVybGF5LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBPdmVybGF5QmFzZSB9IGZyb20gJy4vQmFzZU92ZXJsYXknO1xuLyoqXG4gKiBDbGFzcyBmb3IgdGhlIHRleHQgb3ZlcmxheSBiYXNlXG4gKi9cbmV4cG9ydCBjbGFzcyBUZXh0T3ZlcmxheSBleHRlbmRzIE92ZXJsYXlCYXNlIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgYSB0ZXh0IG92ZXJsYXlcbiAgICAgKiBAcGFyYW0gcm9vdERpdiAtIHRoZSByb290IGVsZW1lbnQgdGhpcyBvdmVybGF5IHdpbGwgYmUgaW5zZXJ0ZWQgaW50b1xuICAgICAqIEBwYXJhbSByb290RWxlbWVudCAtIHRoZSByb290IGVsZW1lbnQgdGhhdCBpcyB0aGUgb3ZlcmxheVxuICAgICAqIEBwYXJhbSB0ZXh0RWxlbWVudCAtIGFuIGVsZW1lbnQgdGhhdCBjb250YWlucyB0ZXh0IGZvciB0aGUgYWN0aW9uIG92ZXJsYXlcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihyb290RGl2LCByb290RWxlbWVudCwgdGV4dEVsZW1lbnQpIHtcbiAgICAgICAgc3VwZXIocm9vdERpdiwgcm9vdEVsZW1lbnQsIHRleHRFbGVtZW50KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSB0ZXh0IG92ZXJsYXlzIGlubmVyIHRleHRcbiAgICAgKiBAcGFyYW0gdGV4dCAtIHRoZSB1cGRhdGUgdGV4dCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBvdmVybGF5XG4gICAgICovXG4gICAgdXBkYXRlKHRleHQpIHtcbiAgICAgICAgaWYgKHRleHQgIT0gbnVsbCB8fCB0ZXh0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy50ZXh0RWxlbWVudC5pbm5lckhUTUwgPSB0ZXh0O1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VGV4dE92ZXJsYXkuanMubWFwIiwiLyogQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gKi9cbmltcG9ydCBqc3MgZnJvbSAnanNzJztcbmltcG9ydCBnbG9iYWwgZnJvbSAnanNzLXBsdWdpbi1nbG9iYWwnO1xuaW1wb3J0IGNhbWVsQ2FzZSBmcm9tICdqc3MtcGx1Z2luLWNhbWVsLWNhc2UnO1xuZXhwb3J0IGNsYXNzIFBpeGVsU3RyZWFtaW5nQXBwbGljYXRpb25TdHlsZSB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgICAgICB0aGlzLmRlZmF1bHRMaWdodE1vZGVQYWxldHRlID0ge1xuICAgICAgICAgICAgJy0tY29sb3IwJzogJyNlMmUwZGQ4MCcsXG4gICAgICAgICAgICAnLS1jb2xvcjEnOiAnI0ZGRkZGRicsXG4gICAgICAgICAgICAnLS1jb2xvcjInOiAnIzAwMDAwMCcsXG4gICAgICAgICAgICAnLS1jb2xvcjMnOiAnIzA1ODVmZScsXG4gICAgICAgICAgICAnLS1jb2xvcjQnOiAnIzM1YjM1MCcsXG4gICAgICAgICAgICAnLS1jb2xvcjUnOiAnI2ZmYWIwMCcsXG4gICAgICAgICAgICAnLS1jb2xvcjYnOiAnI2UxZTJkZCcsXG4gICAgICAgICAgICAnLS1jb2xvcjcnOiAnI2MzYzRiZidcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kZWZhdWx0RGFya01vZGVQYWxldHRlID0ge1xuICAgICAgICAgICAgJy0tY29sb3IwJzogJyMxZDFmMjJlMCcsXG4gICAgICAgICAgICAnLS1jb2xvcjEnOiAnIzAwMDAwMCcsXG4gICAgICAgICAgICAnLS1jb2xvcjInOiAnI0ZGRkZGRicsXG4gICAgICAgICAgICAnLS1jb2xvcjMnOiAnIzA1ODVmZScsXG4gICAgICAgICAgICAnLS1jb2xvcjQnOiAnIzM1YjM1MCcsXG4gICAgICAgICAgICAnLS1jb2xvcjUnOiAnI2ZmYWIwMCcsXG4gICAgICAgICAgICAnLS1jb2xvcjYnOiAnIzFlMWQyMicsXG4gICAgICAgICAgICAnLS1jb2xvcjcnOiAnIzNjM2I0MCdcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5kZWZhdWx0U3R5bGVzID0ge1xuICAgICAgICAgICAgJzpyb290Jzoge1xuICAgICAgICAgICAgICAgICctLWNvbG9yMCc6ICcjMWQxZjIyZTAnLFxuICAgICAgICAgICAgICAgICctLWNvbG9yMSc6ICcjMDAwMDAwJyxcbiAgICAgICAgICAgICAgICAnLS1jb2xvcjInOiAnI0ZGRkZGRicsXG4gICAgICAgICAgICAgICAgJy0tY29sb3IzJzogJyMwNTg1ZmUnLFxuICAgICAgICAgICAgICAgICctLWNvbG9yNCc6ICcjMzViMzUwJyxcbiAgICAgICAgICAgICAgICAnLS1jb2xvcjUnOiAnI2ZmYWIwMCcsXG4gICAgICAgICAgICAgICAgJy0tY29sb3I2JzogJyMxZTFkMjInLFxuICAgICAgICAgICAgICAgICctLWNvbG9yNyc6ICcjM2MzYjQwJyxcbiAgICAgICAgICAgICAgICAnLS1jb2xvcjgnOiAnIzQxMDA4YycsXG4gICAgICAgICAgICAgICAgJy0tY29sb3I5JzogJyMzZTAwNzAnLFxuICAgICAgICAgICAgICAgICctLWNvbG9yMTAnOiAnIzJlMDA1MicsXG4gICAgICAgICAgICAgICAgJy0tY29sb3IxMSc6ICdyZ2JhKDY1LDAsMTM5LDEpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcubm9zZWxlY3QnOiB7XG4gICAgICAgICAgICAgICAgdXNlclNlbGVjdDogJ25vbmUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNwbGF5ZXJVSSc6IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyN2aWRlb0VsZW1lbnRQYXJlbnQnOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1jb2xvcjEpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjdWlGZWF0dXJlcyc6IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIHpJbmRleDogJzMwJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWNvbG9yMiknLFxuICAgICAgICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJyxcbiAgICAgICAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLlVpVG9vbCAudG9vbHRpcHRleHQnOiB7XG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogJ2hpZGRlbicsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWNvbG9yMiknLFxuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnMTVweCcsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzBweCAxMHB4JyxcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBcIidNb250c2VycmF0Jywgc2Fucy1zZXJpZlwiLFxuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMC43NXJlbScsXG4gICAgICAgICAgICAgICAgbGV0dGVyU3BhY2luZzogJzAuNzVweCcsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgdG9wOiAnMCcsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgyNSUpJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiAnMTI1JScsXG4gICAgICAgICAgICAgICAgekluZGV4OiAnMjAnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5VaVRvb2w6aG92ZXIgLnRvb2x0aXB0ZXh0Jzoge1xuICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6ICd2aXNpYmxlJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1jb2xvcjcpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjY29ubmVjdGlvbiAudG9vbHRpcHRleHQnOiB7XG4gICAgICAgICAgICAgICAgdG9wOiAnMTI1JScsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtMjUlKScsXG4gICAgICAgICAgICAgICAgbGVmdDogJzAnLFxuICAgICAgICAgICAgICAgIHpJbmRleDogJzIwJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnNXB4IDEwcHgnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNjb25uZWN0aW9uJzoge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgIGJvdHRvbTogJzglJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiAnNSUnLFxuICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiJ01pY2hyb21hJywgc2Fucy1zZXJpZlwiLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJzNyZW0nLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnM3JlbScsXG4gICAgICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ2FsbCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3NldHRpbmdzLXBhbmVsIC50b29sdGlwdGV4dCc6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgICAgICAgICAgIHRvcDogJzEyNSUnLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTUwJSknLFxuICAgICAgICAgICAgICAgIGxlZnQ6ICcwJyxcbiAgICAgICAgICAgICAgICB6SW5kZXg6ICcyMCcsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzVweCAxMHB4JyxcbiAgICAgICAgICAgICAgICBib3JkZXI6ICczcHggc29saWQgdmFyKC0tY29sb3IzKScsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICdtYXgtY29udGVudCcsXG4gICAgICAgICAgICAgICAgZmFsbGJhY2tzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAnbWF4LWNvbnRlbnQnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcjogJzNweCBzb2xpZCB2YXIoLS1jb2xvcjMpJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAnNXB4IDEwcHgnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHpJbmRleDogJzIwJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAnMCdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNTAlKSdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAnMTI1JSdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjY29udHJvbHMnOiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgdG9wOiAnMyUnLFxuICAgICAgICAgICAgICAgIGxlZnQ6ICcyJScsXG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogXCInTWljaHJvbWEnLCBzYW5zLXNlcmlmXCIsXG4gICAgICAgICAgICAgICAgcG9pbnRlckV2ZW50czogJ2FsbCcsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjY29udHJvbHM+Kic6IHtcbiAgICAgICAgICAgICAgICBtYXJnaW5Cb3R0b206ICcwLjVyZW0nLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzUwJScsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcycmVtJyxcbiAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiAnMS43NXJlbScsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzAuNXJlbSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI2NvbnRyb2xzICNhZGRpdGlvbmFsaW5mbyc6IHtcbiAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IFwiJ01vbnRzZXJyYXQnLCBzYW5zLXNlcmlmXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI2Z1bGxzY3JlZW4tYnRuJzoge1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICcwLjZyZW0gIWltcG9ydGFudCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI21pbmltaXplSWNvbic6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3NldHRpbmdzQnRuLCAjc3RhdHNCdG4nOiB7XG4gICAgICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3VpRmVhdHVyZXMgYnV0dG9uJzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWNvbG9yNyknLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCB2YXIoLS1jb2xvcjcpJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWNvbG9yMiknLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnM3JlbScsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnM3JlbScsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzAuNXJlbScsXG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjdWlGZWF0dXJlcyBidXR0b246aG92ZXInOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3IzKScsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnM3B4IHNvbGlkIHZhcigtLWNvbG9yMyknLFxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb246ICcwLjI1cyBlYXNlJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nTGVmdDogJzAuNTVyZW0nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdUb3A6ICcwLjU1cmVtJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjdWlGZWF0dXJlcyBidXR0b246YWN0aXZlJzoge1xuICAgICAgICAgICAgICAgIGJvcmRlcjogJzNweCBzb2xpZCB2YXIoLS1jb2xvcjMpJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1jb2xvcjcpJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nTGVmdDogJzAuNTVyZW0nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdUb3A6ICcwLjU1cmVtJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuYnRuLWZsYXQnOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tY29sb3IyKScsXG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogXCInTW9udHNlcnJhdCdcIixcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiAnYm9sZCcsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnM3B4IHNvbGlkIHZhcigtLWNvbG9yMyknLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzFyZW0nLFxuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMC43NXJlbScsXG4gICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICcwLjVyZW0nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodDogJzAuNXJlbScsXG4gICAgICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuYnRuLWZsYXQ6aG92ZXInOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3IzKScsXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2Vhc2UgMC4zcydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmJ0bi1mbGF0OmRpc2FibGVkJzoge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd2YXIoLS1jb2xvcjcpJyxcbiAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogJ3ZhcigtLWNvbG9yMyknLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tY29sb3IzKScsXG4gICAgICAgICAgICAgICAgY3Vyc29yOiAnZGVmYXVsdCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmJ0bi1mbGF0OmFjdGl2ZSc6IHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmJ0bi1mbGF0OmZvY3VzJzoge1xuICAgICAgICAgICAgICAgIG91dGxpbmU6ICdub25lJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjdWlGZWF0dXJlcyBpbWcnOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcucGFuZWwtd3JhcCc6IHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgICB0b3A6ICcwJyxcbiAgICAgICAgICAgICAgICBib3R0b206ICcwJyxcbiAgICAgICAgICAgICAgICByaWdodDogJzAnLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnMjB2dycsXG4gICAgICAgICAgICAgICAgbWF4V2lkdGg6ICc5MHZ3JyxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDEwMCUpJyxcbiAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAnLjNzIGVhc2Utb3V0JyxcbiAgICAgICAgICAgICAgICBwb2ludGVyRXZlbnRzOiAnYWxsJyxcbiAgICAgICAgICAgICAgICBvdmVyZmxvd1k6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBvdmVyZmxvd1g6ICdoaWRkZW4nLFxuICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3ZhcigtLWNvbG9yMCknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5wYW5lbC13cmFwLXZpc2libGUnOiB7XG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgwJSknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5wYW5lbCc6IHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvd1k6ICdhdXRvJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMWVtJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjc2V0dGluZ3NIZWFkaW5nLCAjc3RhdHNIZWFkaW5nJzoge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMmVtJyxcbiAgICAgICAgICAgICAgICBtYXJnaW5CbG9ja1N0YXJ0OiAnMC42N2VtJyxcbiAgICAgICAgICAgICAgICBtYXJnaW5CbG9ja0VuZDogJzAuNjdlbScsXG4gICAgICAgICAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6ICcwcHgnLFxuICAgICAgICAgICAgICAgIG1hcmdpbklubGluZUVuZDogJzBweCcsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzAgMCAwIDJyZW0nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNzZXR0aW5nc0Nsb3NlLCAjc3RhdHNDbG9zZSc6IHtcbiAgICAgICAgICAgICAgICBtYXJnaW46ICcwLjVyZW0nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdUb3A6ICcwLjVyZW0nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdCb3R0b206ICcwLjVyZW0nLFxuICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodDogJzAuNXJlbScsXG4gICAgICAgICAgICAgICAgZm9udFNpemU6ICcyZW0nLFxuICAgICAgICAgICAgICAgIGZsb2F0OiAncmlnaHQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNzZXR0aW5nc0Nsb3NlOmFmdGVyLCAjc3RhdHNDbG9zZTphZnRlcic6IHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nTGVmdDogJzAuNXJlbScsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICAgICAgICAgICAgY29udGVudDogJ1wiXFxcXDAwZDdcIidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3NldHRpbmdzQ2xvc2U6aG92ZXIsICNzdGF0c0Nsb3NlOmhvdmVyJzoge1xuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tY29sb3IzKScsXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2Vhc2UgMC4zcydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3NldHRpbmdzQ29udGVudCwgI3N0YXRzQ29udGVudCc6IHtcbiAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiAnMnJlbScsXG4gICAgICAgICAgICAgICAgbWFyZ2luUmlnaHQ6ICcycmVtJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuc2V0dGluZyc6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogJ3JvdycsXG4gICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMC4xNXJlbSAxMHB4IDAuMTVyZW0gMTBweCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnNldHRpbmdzLXRleHQnOiB7XG4gICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1jb2xvcjIpJyxcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJyxcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiAnbm9ybWFsJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuc2V0dGluZ3Mtb3B0aW9uJzoge1xuICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgdGV4dE92ZXJmbG93OiAnZWxsaXBzaXMnLFxuICAgICAgICAgICAgICAgIHdoaXRlU3BhY2U6ICdub3dyYXAnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNjb25uZWN0T3ZlcmxheSwgI3BsYXlPdmVybGF5LCAjaW5mb092ZXJsYXksICNlcnJvck92ZXJsYXksICNhZmtPdmVybGF5LCAjZGlzY29ubmVjdE92ZXJsYXknOiB7XG4gICAgICAgICAgICAgICAgekluZGV4OiAnMzAnLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tY29sb3IyKScsXG4gICAgICAgICAgICAgICAgZm9udFNpemU6ICcxLjhlbScsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1jb2xvcjEpJyxcbiAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgdGV4dFRyYW5zZm9ybTogJ3VwcGVyY2FzZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmNsaWNrYWJsZVN0YXRlJzoge1xuICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnRleHREaXNwbGF5U3RhdGUnOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5oaWRkZW5TdGF0ZSc6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3BsYXlCdXR0b24sICNjb25uZWN0QnV0dG9uJzoge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIHpJbmRleDogJzMwJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICdpbWcjcGxheUJ1dHRvbic6IHtcbiAgICAgICAgICAgICAgICBtYXhXaWR0aDogJzI0MXB4JyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzEwJSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3VpSW50ZXJhY3Rpb24nOiB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI1VJSW50ZXJhY3Rpb25CdXR0b25Cb3VuZGFyeSc6IHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMnB4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjVUlJbnRlcmFjdGlvbkJ1dHRvbic6IHtcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuYnRuLW92ZXJsYXknOiB7XG4gICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnRnbC1zd2l0Y2gnOiB7XG4gICAgICAgICAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaydcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnRnbC1zd2l0Y2ggLnRnbCc6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnbm9uZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnRnbCwgLnRnbDphZnRlciwgLnRnbDpiZWZvcmUsIC50Z2wgKiwgLnRnbCAqOmFmdGVyLCAudGdsICo6YmVmb3JlLCAudGdsKy50Z2wtc2xpZGVyJzoge1xuICAgICAgICAgICAgICAgICctd2Via2l0LWJveC1zaXppbmcnOiAnYm9yZGVyLWJveCcsXG4gICAgICAgICAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnRnbDo6LW1vei1zZWxlY3Rpb24sIC50Z2w6YWZ0ZXI6Oi1tb3otc2VsZWN0aW9uLCAudGdsOmJlZm9yZTo6LW1vei1zZWxlY3Rpb24sIC50Z2wgKjo6LW1vei1zZWxlY3Rpb24sIC50Z2wgKjphZnRlcjo6LW1vei1zZWxlY3Rpb24sIC50Z2wgKjpiZWZvcmU6Oi1tb3otc2VsZWN0aW9uLCAudGdsKy50Z2wtc2xpZGVyOjotbW96LXNlbGVjdGlvbic6IHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAnbm9uZSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnRnbDo6c2VsZWN0aW9uLCAudGdsOmFmdGVyOjpzZWxlY3Rpb24sIC50Z2w6YmVmb3JlOjpzZWxlY3Rpb24sIC50Z2wgKjo6c2VsZWN0aW9uLCAudGdsICo6YWZ0ZXI6OnNlbGVjdGlvbiwgLnRnbCAqOmJlZm9yZTo6c2VsZWN0aW9uLCAudGdsKy50Z2wtc2xpZGVyOjpzZWxlY3Rpb24nOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ25vbmUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2wtc2xpZGVyJzoge30sXG4gICAgICAgICAgICAnLnRnbCsudGdsLXNsaWRlcic6IHtcbiAgICAgICAgICAgICAgICBvdXRsaW5lOiAnMCcsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzQwcHgnLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJzE4cHgnLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgIHVzZXJTZWxlY3Q6ICdub25lJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcudGdsKy50Z2wtc2xpZGVyOmFmdGVyLCAudGdsKy50Z2wtc2xpZGVyOmJlZm9yZSc6IHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogJzUwJScsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiAnMTAwJSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnRnbCsudGdsLXNsaWRlcjphZnRlcic6IHtcbiAgICAgICAgICAgICAgICBsZWZ0OiAnMCdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLnRnbCsudGdsLXNsaWRlcjpiZWZvcmUnOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ25vbmUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2wtZmxhdCsudGdsLXNsaWRlcic6IHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiAnMnB4JyxcbiAgICAgICAgICAgICAgICAnLXdlYmtpdC10cmFuc2l0aW9uJzogJ2FsbCAuMnMgZWFzZScsXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAuMnMgZWFzZScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3ZhcigtLWNvbG9yNiknLFxuICAgICAgICAgICAgICAgIGJvcmRlcjogJzNweCBzb2xpZCB2YXIoLS1jb2xvcjcpJyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcyZW0nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2wtZmxhdCsudGdsLXNsaWRlcjphZnRlcic6IHtcbiAgICAgICAgICAgICAgICAnLXdlYmtpdC10cmFuc2l0aW9uJzogJ2FsbCAuMnMgZWFzZScsXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2FsbCAuMnMgZWFzZScsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3ZhcigtLWNvbG9yNyknLFxuICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcxZW0nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy50Z2wtZmxhdDpjaGVja2VkKy50Z2wtc2xpZGVyJzoge1xuICAgICAgICAgICAgICAgIGJvcmRlcjogJzNweCBzb2xpZCB2YXIoLS1jb2xvcjMpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcudGdsLWZsYXQ6Y2hlY2tlZCsudGdsLXNsaWRlcjphZnRlcic6IHtcbiAgICAgICAgICAgICAgICBsZWZ0OiAnNTAlJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndmFyKC0tY29sb3IzKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLmJ0bi1hcHBseSc6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnYmxvY2sgIWltcG9ydGFudCcsXG4gICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogJ2F1dG8nLFxuICAgICAgICAgICAgICAgIG1hcmdpblJpZ2h0OiAnYXV0bycsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICc0MCUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5mb3JtLWNvbnRyb2wnOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3I3KScsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnMnB4IHNvbGlkIHZhcigtLWNvbG9yNyknLFxuICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzRweCcsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1jb2xvcjIpJyxcbiAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdyaWdodCcsXG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogJ2luaGVyaXQnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5mb3JtLWNvbnRyb2w6aG92ZXInOiB7XG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1jb2xvcjcpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuZm9ybS1ncm91cCc6IHtcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiAnNHB4JyxcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnZ3JpZCcsXG4gICAgICAgICAgICAgICAgZ3JpZFRlbXBsYXRlQ29sdW1uczogJzgwJSAyMCUnLFxuICAgICAgICAgICAgICAgIHJvd0dhcDogJzRweCcsXG4gICAgICAgICAgICAgICAgcGFkZGluZ1JpZ2h0OiAnMTBweCcsXG4gICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICcxMHB4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuZm9ybS1ncm91cCBsYWJlbCc6IHtcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJyxcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiAnbm9ybWFsJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuc2V0dGluZ3NDb250YWluZXInOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbTogJzFweCBzb2xpZCB2YXIoLS1jb2xvcjcpJyxcbiAgICAgICAgICAgICAgICBwYWRkaW5nVG9wOiAnMTBweCcsXG4gICAgICAgICAgICAgICAgcGFkZGluZ0JvdHRvbTogJzEwcHgnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5zZXR0aW5nc0NvbnRhaW5lcj4gOmZpcnN0LWNoaWxkJzoge1xuICAgICAgICAgICAgICAgIG1hcmdpblRvcDogJzRweCcsXG4gICAgICAgICAgICAgICAgbWFyZ2luQm90dG9tOiAnNHB4JyxcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiAnYm9sZCcsXG4gICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJyxcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogJ3JvdycsXG4gICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2Jhc2VsaW5lJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuY29sbGFwc2UnOiB7XG4gICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICc1JSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnI3N0cmVhbVRvb2xzJzoge1xuICAgICAgICAgICAgICAgIGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOiAnNXB4JyxcbiAgICAgICAgICAgICAgICBib3JkZXJCb3R0b21MZWZ0UmFkaXVzOiAnNXB4JyxcbiAgICAgICAgICAgICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgdG9wOiAnMCcsXG4gICAgICAgICAgICAgICAgcmlnaHQ6ICcyJScsXG4gICAgICAgICAgICAgICAgekluZGV4OiAnMTAwJyxcbiAgICAgICAgICAgICAgICBib3JkZXI6ICc0cHggc29saWQgdmFyKC0tY29sb3VyOCknLFxuICAgICAgICAgICAgICAgIGJvcmRlclRvcFdpZHRoOiAnMHB4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuc2V0dGluZ3NIZWFkZXInOiB7XG4gICAgICAgICAgICAgICAgZm9udFN0eWxlOiAnaXRhbGljJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcjc3RyZWFtVG9vbHNIZWFkZXInOiB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnc3BhY2UtYmV0d2VlbicsXG4gICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tOiAnMXB4IHNvbGlkIHZhcigtLWNvbG91cjgpJyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1jb2xvcjcpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuc3RyZWFtVG9vbHMnOiB7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAndmFyKC0tY29sb3IyKScsXG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogJ3ZhcigtLWJ1dHRvbkZvbnQpJyxcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiAnbGlnaHRlcicsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd2YXIoLS1jb2xvcjcpJ1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuc3RyZWFtVG9vbHMtc2hvd24+I3N0cmVhbVRvb2xzU2V0dGluZ3MsIC5zdHJlYW1Ub29scy1zaG93bj4jc3RyZWFtVG9vbHNTdGF0cyc6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnYmxvY2snXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNzdHJlYW1Ub29sc1RvZ2dsZSc6IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJyNxdWFsaXR5U3RhdHVzJzoge1xuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMzdweCcsXG4gICAgICAgICAgICAgICAgcGFkZGluZ1JpZ2h0OiAnNHB4J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICcuc3ZnSWNvbic6IHtcbiAgICAgICAgICAgICAgICBmaWxsOiAndmFyKC0tY29sb3IyKSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLm1vZGFsJzoge1xuICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnMTAwdncnLFxuICAgICAgICAgICAgICAgIG1pbkhlaWdodDogJzEwMHZoJyxcbiAgICAgICAgICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgICAgICAgICAgdG9wOiAnMCcsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWNvbG9yMiknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5pbm5lck1vZGFsJzoge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnNTAwcHgnLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJzMwMHB4JyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd2YXIoLS1jb2xvcjApJyxcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJyxcbiAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICcwLjc1ZW0nXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5tb2RhbEJ0bkNvbnRhaW5lcic6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICAgICAgZmxleERpcmVjdGlvbjogJ3JvdycsXG4gICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1hcm91bmQnLFxuICAgICAgICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgcGFkZGluZ1RvcDogJzFlbScsXG4gICAgICAgICAgICAgICAgcGFkZGluZ0JvdHRvbTogJzFlbSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAnLm1vZGFsVGV4dEFyZWEnOiB7XG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnbGVmdCcsXG4gICAgICAgICAgICAgICAgd2lkdGg6ICc5NSUnLFxuICAgICAgICAgICAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgICAgICAgICAgIHJlc2l6ZTogJ25vbmUnLFxuICAgICAgICAgICAgICAgIGZvbnRTaXplOiAnMXJlbScsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIHZhcigtLWNvbG9yMiknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5tb2RhbFRleHRBcmVhOmZvY3VzLXZpc2libGUnOiB7XG4gICAgICAgICAgICAgICAgb3V0bGluZTogJ25vbmUgIWltcG9ydGFudCcsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIHZhcigtLWNvbG9yMyknXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgJy5tb2RhbCAuYnRuLWZsYXQnOiB7XG4gICAgICAgICAgICAgICAgZm9udFNpemU6ICcxLjByZW0nXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHsgY3VzdG9tU3R5bGVzLCBsaWdodE1vZGVQYWxldHRlLCBkYXJrTW9kZVBhbGV0dGUsIGpzc0luc2VydGlvblBvaW50IH0gPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcbiAgICAgICAgLy8gT25lIHRpbWUgc2V0dXAgd2l0aCBkZWZhdWx0IHBsdWdpbnMgYW5kIHNldHRpbmdzLlxuICAgICAgICBjb25zdCBqc3NPcHRpb25zID0ge1xuICAgICAgICAgICAgLy8gSlNTIGhhcyBtYW55IGludGVyZXN0aW5nIHBsdWdpbnMgd2UgbWF5IHdpc2ggdG8gdHVybiBvblxuICAgICAgICAgICAgLy9wbHVnaW5zOiBbZnVuY3Rpb25zKCksIHRlbXBsYXRlKCksIGdsb2JhbCgpLCBleHRlbmQoKSwgbmVzdGVkKCksIGNvbXBvc2UoKSwgY2FtZWxDYXNlKCksIGRlZmF1bHRVbml0KG9wdGlvbnMuZGVmYXVsdFVuaXQpLCBleHBhbmQoKSwgdmVuZG9yUHJlZml4ZXIoKSwgcHJvcHNTb3J0KCldXG4gICAgICAgICAgICBwbHVnaW5zOiBbZ2xvYmFsKCksIGNhbWVsQ2FzZSgpXSxcbiAgICAgICAgICAgIGluc2VydGlvblBvaW50OiBqc3NJbnNlcnRpb25Qb2ludFxuICAgICAgICB9O1xuICAgICAgICBqc3Muc2V0dXAoanNzT3B0aW9ucyk7XG4gICAgICAgIHRoaXMuY3VzdG9tU3R5bGVzID0gY3VzdG9tU3R5bGVzO1xuICAgICAgICB0aGlzLmxpZ2h0TW9kZVBhbGV0dGUgPSBsaWdodE1vZGVQYWxldHRlICE9PSBudWxsICYmIGxpZ2h0TW9kZVBhbGV0dGUgIT09IHZvaWQgMCA/IGxpZ2h0TW9kZVBhbGV0dGUgOiB0aGlzLmRlZmF1bHRMaWdodE1vZGVQYWxldHRlO1xuICAgICAgICB0aGlzLmRhcmtNb2RlUGFsZXR0ZSA9IGRhcmtNb2RlUGFsZXR0ZSAhPT0gbnVsbCAmJiBkYXJrTW9kZVBhbGV0dGUgIT09IHZvaWQgMCA/IGRhcmtNb2RlUGFsZXR0ZSA6IHRoaXMuZGVmYXVsdERhcmtNb2RlUGFsZXR0ZTtcbiAgICB9XG4gICAgYXBwbHlTdHlsZVNoZWV0KCkge1xuICAgICAgICAvLyBUb2RvOiByZWZhY3RvciBjb2RlYmFzZSB0byB1c2UganNzIGF0IGEgY29tcG9uZW50IGxldmVsLCBjbGFzc2VzIGNhbiBiZSBncmFiYmVkIGxpa2Ugc286XG4gICAgICAgIC8vY29uc3Qge3BpeGVsU3RyZWFtaW5nQ2xhc3Nlc30gPSBqc3MuY3JlYXRlU3R5bGVTaGVldChzdHlsZXMpLmF0dGFjaCgpO1xuICAgICAgICAvLyBhdHRhY2ggZ2VuZXJhdGVkIHN0eWxlIHNoZWV0IHRvIHBhZ2VcbiAgICAgICAganNzLmNyZWF0ZVN0eWxlU2hlZXQoe1xuICAgICAgICAgICAgJ0BnbG9iYWwnOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZGVmYXVsdFN0eWxlcyksIHRoaXMuY3VzdG9tU3R5bGVzKVxuICAgICAgICB9KS5hdHRhY2goKTtcbiAgICB9XG4gICAgYXBwbHlQYWxldHRlKHBhbGV0dGUpIHtcbiAgICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCc6cm9vdCcpO1xuICAgICAgICByb290RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jb2xvcjAnLCBwYWxldHRlWyctLWNvbG9yMCddKTtcbiAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tY29sb3IxJywgcGFsZXR0ZVsnLS1jb2xvcjEnXSk7XG4gICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWNvbG9yMicsIHBhbGV0dGVbJy0tY29sb3IyJ10pO1xuICAgICAgICByb290RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jb2xvcjMnLCBwYWxldHRlWyctLWNvbG9yMyddKTtcbiAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tY29sb3I0JywgcGFsZXR0ZVsnLS1jb2xvcjQnXSk7XG4gICAgICAgIHJvb3RFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWNvbG9yNScsIHBhbGV0dGVbJy0tY29sb3I1J10pO1xuICAgICAgICByb290RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jb2xvcjYnLCBwYWxldHRlWyctLWNvbG9yNiddKTtcbiAgICAgICAgcm9vdEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tY29sb3I3JywgcGFsZXR0ZVsnLS1jb2xvcjcnXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgcGxheWVycyBjb2xvciB2YXJpYWJsZXNcbiAgICAgKiBAcGFyYW0gaXNMaWdodE1vZGUgLSBzaG91bGQgd2UgdXNlIGEgbGlnaHQgb3IgZGFyayBjb2xvciBzY2hlbWVcbiAgICAgKi9cbiAgICBzZXRDb2xvck1vZGUoaXNMaWdodE1vZGUpIHtcbiAgICAgICAgaWYgKGlzTGlnaHRNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5UGFsZXR0ZSh0aGlzLmxpZ2h0TW9kZVBhbGV0dGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBseVBhbGV0dGUodGhpcy5kYXJrTW9kZVBhbGV0dGUpO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UGl4ZWxTdHJlYW1pbmdBcHBsaWNhdGlvblN0eWxlcy5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgRnVsbFNjcmVlbkljb24gfSBmcm9tICcuL0Z1bGxzY3JlZW5JY29uJztcbmltcG9ydCB7IFNldHRpbmdzSWNvbiB9IGZyb20gJy4vU2V0dGluZ3NJY29uJztcbmltcG9ydCB7IFN0YXRzSWNvbiB9IGZyb20gJy4vU3RhdHNJY29uJztcbmltcG9ydCB7IFhSSWNvbiB9IGZyb20gJy4vWFJJY29uJztcbmltcG9ydCB7IFdlYlhSQ29udHJvbGxlciB9IGZyb20gJ0BlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjUnO1xuaW1wb3J0IHsgVUlFbGVtZW50Q3JlYXRpb25Nb2RlIH0gZnJvbSAnLi4vVUkvVUlDb25maWd1cmF0aW9uVHlwZXMnO1xuLy8gSWYgdGhlcmUgaXNuJ3QgYSB0eXBlIHByb3ZpZGVkLCBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBjcmVhdGUgdGhlIGVsZW1lbnQuXG5mdW5jdGlvbiBzaG91bGRDcmVhdGVCdXR0b24odHlwZSkge1xuICAgIHJldHVybiB0eXBlID09IHVuZGVmaW5lZCA/IHRydWUgOiB0eXBlLmNyZWF0aW9uTW9kZSA9PT0gVUlFbGVtZW50Q3JlYXRpb25Nb2RlLkNyZWF0ZURlZmF1bHRFbGVtZW50O1xufVxuLyoqXG4gKiBFbGVtZW50IGNvbnRhaW5pbmcgdmFyaW91cyBjb250cm9scyBsaWtlIHN0YXRzLCBzZXR0aW5ncywgZnVsbHNjcmVlbi5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyb2xzIHtcbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3QgdGhlIGNvbnRyb2xzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICBpZiAoIWNvbmZpZyB8fCBzaG91bGRDcmVhdGVCdXR0b24oY29uZmlnLnN0YXRzQnV0dG9uVHlwZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdHNJY29uID0gbmV3IFN0YXRzSWNvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY29uZmlnIHx8IHNob3VsZENyZWF0ZUJ1dHRvbihjb25maWcuc2V0dGluZ3NCdXR0b25UeXBlKSkge1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nc0ljb24gPSBuZXcgU2V0dGluZ3NJY29uKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb25maWcgfHwgc2hvdWxkQ3JlYXRlQnV0dG9uKGNvbmZpZy5mdWxsc2NyZWVuQnV0dG9uVHlwZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZnVsbHNjcmVlbkljb24gPSBuZXcgRnVsbFNjcmVlbkljb24oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWNvbmZpZyB8fCBzaG91bGRDcmVhdGVCdXR0b24oY29uZmlnLnhySWNvblR5cGUpKSB7XG4gICAgICAgICAgICB0aGlzLnhySWNvbiA9IG5ldyBYUkljb24oKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGVsZW1lbnQgY29udGFpbmluZyB0aGUgY29udHJvbHMuXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuaWQgPSAnY29udHJvbHMnO1xuICAgICAgICAgICAgaWYgKHRoaXMuZnVsbHNjcmVlbkljb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmZ1bGxzY3JlZW5JY29uLnJvb3RFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzSWNvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc2V0dGluZ3NJY29uLnJvb3RFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRzSWNvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3RhdHNJY29uLnJvb3RFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnhySWNvbikge1xuICAgICAgICAgICAgICAgIHZvaWQgV2ViWFJDb250cm9sbGVyLmlzU2Vzc2lvblN1cHBvcnRlZCgnaW1tZXJzaXZlLXZyJykudGhlbigoc3VwcG9ydGVkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMueHJJY29uLnJvb3RFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIHRoaXMuaGFuZGxlRnVsbHNjcmVlbkNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIGhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2UoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3QgaXNJbkZ1bGxzY3JlZW4gPSAhIWRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50O1xuICAgICAgICBpZiAoaXNJbkZ1bGxzY3JlZW4gJiYgKChfYSA9IHRoaXMuY29uZmlnKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaGlkZUNvbnRyb2xzSW5GdWxsc2NyZWVuKSkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNvbnRyb2xzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tICdAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41JztcbmltcG9ydCB7IFN0YXRzU2VjdGlvbnMgfSBmcm9tICcuL1VJQ29uZmlndXJhdGlvblR5cGVzJztcbi8qKlxuICogRGF0YUNoYW5uZWwgTGF0ZW5jeSB0ZXN0IFVJIGVsZW1lbnRzIGFuZCByZXN1bHRzIGhhbmRsaW5nLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YUNoYW5uZWxMYXRlbmN5VGVzdCB7XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBidXR0b24gY29udGFpbmluZyB0aGUgc3RhdHMgaWNvbi5cbiAgICAgKi9cbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3NDb250YWluZXInKTtcbiAgICAgICAgICAgIC8vIG1ha2UgaGVhZGluZ1xuICAgICAgICAgICAgY29uc3QgaGVhZGluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgaGVhZGluZy5pZCA9ICdkYXRhQ2hhbm5lbExhdGVuY3lUZXN0SGVhZGVyJztcbiAgICAgICAgICAgIGhlYWRpbmcuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3MtdGV4dCcpO1xuICAgICAgICAgICAgaGVhZGluZy5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nc0hlYWRlcicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGluZyk7XG4gICAgICAgICAgICBjb25zdCBoZWFkaW5nVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgaGVhZGluZ1RleHQuaW5uZXJIVE1MID0gU3RhdHNTZWN0aW9ucy5EYXRhQ2hhbm5lbExhdGVuY3lUZXN0O1xuICAgICAgICAgICAgaGVhZGluZy5hcHBlbmRDaGlsZChoZWFkaW5nVGV4dCk7XG4gICAgICAgICAgICBoZWFkaW5nLmFwcGVuZENoaWxkKHRoaXMubGF0ZW5jeVRlc3RCdXR0b24pO1xuICAgICAgICAgICAgLy8gbWFrZSB0ZXN0IHJlc3VsdHMgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgcmVzdWx0c1BhcmVudEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHJlc3VsdHNQYXJlbnRFbGVtLmlkID0gJ2RhdGFDaGFubmVsTGF0ZW5jeVRlc3RDb250YWluZXInO1xuICAgICAgICAgICAgcmVzdWx0c1BhcmVudEVsZW0uY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZChyZXN1bHRzUGFyZW50RWxlbSk7XG4gICAgICAgICAgICByZXN1bHRzUGFyZW50RWxlbS5hcHBlbmRDaGlsZCh0aGlzLmxhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IGxhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbGF0ZW5jeVRlc3RSZXN1bHRzRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RSZXN1bHRzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RSZXN1bHRzRWxlbWVudC5pZCA9ICdkYXRhQ2hhbm5lbExhdGVuY3lTdGF0c1Jlc3VsdHMnO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RSZXN1bHRzRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdTdGF0c1Jlc3VsdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50O1xuICAgIH1cbiAgICBnZXQgbGF0ZW5jeVRlc3RCdXR0b24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fbGF0ZW5jeVRlc3RCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uLnR5cGUgPSAnYnV0dG9uJztcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uLnZhbHVlID0gJ1J1biBUZXN0JztcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uLmlkID0gJ2J0bi1zdGFydC1kYXRhLWNoYW5uZWwtbGF0ZW5jeS10ZXN0JztcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uLmNsYXNzTGlzdC5hZGQoJ3N0cmVhbVRvb2xzLWJ1dHRvbicpO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RCdXR0b24uY2xhc3NMaXN0LmFkZCgnYnRuLWZsYXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbGF0ZW5jeVRlc3RCdXR0b247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBvcHVsYXRlIHRoZSBVSSBiYXNlZCBvbiB0aGUgbGF0ZW5jeSB0ZXN0J3MgcmVzdWx0cy5cbiAgICAgKiBAcGFyYW0gcmVzdWx0IC0gVGhlIGxhdGVuY3kgdGVzdCByZXN1bHRzLlxuICAgICAqL1xuICAgIGhhbmRsZVRlc3RSZXN1bHQocmVzdWx0KSB7XG4gICAgICAgIExvZ2dlci5JbmZvKEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpO1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2sgd2UgaGF2ZSByZXN1bHRzLCBOYU4gd291bGQgbWVhbiB0aGF0IFVFIHZlcnNpb24gd2UgdGFsayB0byBkb2Vzbid0IHN1cHBvcnQgb3VyIHRlc3RcbiAgICAgICAgICovXG4gICAgICAgIGlmIChpc05hTihyZXN1bHQuZGF0YUNoYW5uZWxSdHQpKSB7XG4gICAgICAgICAgICB0aGlzLmxhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQuaW5uZXJIVE1MID0gJzxkaXY+Tm90IHN1cHBvcnRlZDwvZGl2Pic7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxhdGVuY3lTdGF0c0lubmVySFRNTCA9ICcnO1xuICAgICAgICBsYXRlbmN5U3RhdHNJbm5lckhUTUwgKz0gJzxkaXY+RGF0YSBjaGFubmVsIFJUVCAobXMpOiAnICsgcmVzdWx0LmRhdGFDaGFubmVsUnR0ICsgJzwvZGl2Pic7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZXBhcmF0ZSBwYXRoIHRpbWUgZGlzY292ZXJ5IHdvcmtzIG9ubHkgd2hlbiBVRSBhbmQgUGxheWVyIGNsb2NrcyBoYXZlIGJlZW4gc3luY2hyb25pemVkLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHJlc3VsdC5wbGF5ZXJUb1N0cmVhbWVyVGltZSA+PSAwICYmIHJlc3VsdC5zdHJlYW1lclRvUGxheWVyVGltZSA+PSAwKSB7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHNJbm5lckhUTUwgKz1cbiAgICAgICAgICAgICAgICAnPGRpdj5QbGF5ZXIgdG8gU3RyZWFtZXIgcGF0aCAobXMpOiAnICsgcmVzdWx0LnBsYXllclRvU3RyZWFtZXJUaW1lICsgJzwvZGl2Pic7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHNJbm5lckhUTUwgKz1cbiAgICAgICAgICAgICAgICAnPGRpdj5TdHJlYW1lciB0byBQbGF5ZXIgcGF0aCAobXMpOiAnICsgcmVzdWx0LnN0cmVhbWVyVG9QbGF5ZXJUaW1lICsgJzwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5sYXRlbmN5VGVzdFJlc3VsdHNFbGVtZW50LmlubmVySFRNTCA9IGxhdGVuY3lTdGF0c0lubmVySFRNTDtcbiAgICAgICAgLy9zZXR1cCBidXR0b24gdG8gZG93bmxvYWQgdGhlIGRldGFpbGVkIHJlc3VsdHNcbiAgICAgICAgY29uc3QgZG93bmxvYWRCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICBkb3dubG9hZEJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgIGRvd25sb2FkQnV0dG9uLnZhbHVlID0gJ0Rvd25sb2FkJztcbiAgICAgICAgZG93bmxvYWRCdXR0b24uY2xhc3NMaXN0LmFkZCgnc3RyZWFtVG9vbHMtYnV0dG9uJyk7XG4gICAgICAgIGRvd25sb2FkQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2J0bi1mbGF0Jyk7XG4gICAgICAgIGRvd25sb2FkQnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlID0gbmV3IEJsb2IoW3Jlc3VsdC5leHBvcnRMYXRlbmN5QXNDU1YoKV0sIHsgdHlwZTogJ3RleHQvcGxhaW4nIH0pO1xuICAgICAgICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7XG4gICAgICAgICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICAgICAgICBhLmRvd25sb2FkID0gJ2RhdGFfY2hhbm5lbF9sYXRlbmN5X3Rlc3RfcmVzdWx0cy5jc3YnO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTtcbiAgICAgICAgICAgIGEuY2xpY2soKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYSk7XG4gICAgICAgICAgICAgICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmxhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQuYXBwZW5kQ2hpbGQoZG93bmxvYWRCdXR0b24pO1xuICAgIH1cbiAgICBoYW5kbGVUZXN0U3RhcnQoKSB7XG4gICAgICAgIHRoaXMubGF0ZW5jeVRlc3RSZXN1bHRzRWxlbWVudC5pbm5lckhUTUwgPSAnPGRpdj5UZXN0IGluIHByb2dyZXNzPC9kaXY+JztcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1EYXRhQ2hhbm5lbExhdGVuY3lUZXN0LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vLyBFdmVudCBmaXJlZCB3aGVuIFwiQ29uZmlybVwiIGJ1dHRvbiBpcyBjbGlja2VkXG5leHBvcnQgY2xhc3MgRWRpdENvbmZpcm1lZEV2ZW50IGV4dGVuZHMgQ3VzdG9tRXZlbnQge1xuICAgIGNvbnN0cnVjdG9yKGNvbmZpcm1lZFRleHQpIHtcbiAgICAgICAgc3VwZXIoJ2VkaXRDb25maXJtZWQnLCB7XG4gICAgICAgICAgICBkZXRhaWw6IGNvbmZpcm1lZFRleHQsXG4gICAgICAgICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb25maXJtZWRUZXh0ID0gY29uZmlybWVkVGV4dDtcbiAgICB9XG59XG4vKipcbiAqIEEgbW9kYWwgdGhhdCBpcyBzaG93biB3aGVuIGEgVUUgd2lkZ2V0IGlzIHRvdWNoZWQgb24gbW9iaWxlLlxuICogb3JcbiAqIEEgaGlkZGVuIChvZmZzY3JlZW4pIGlucHV0IGZpZWxkIHRoYXQgaXMgc2hvd24gb24gbm9uLXRvdWNoIGRldmljZXMgKGUuZy4gRGVza3RvcClcbiAqIHdoZW4gYSBVRSB3aWRnZXQgaXMgY2xpY2tlZC4gVGhlIGhpZGRlbiB0ZXh0IGZpZWxkIGlzIHVzZWQgc28gbm9uLWxhdGluIGNoYXJhY3RlclxuICogaW5wdXQgY2FuIGJlIGNvbXBvc2VkIHVzaW5nIElNRSBhc3Npc3RhbmNlICh3aGljaCByZXF1aXJlcyBhbiBpbnB1dCBmaWVsZCkuXG4gKlxuICogVGhlIHJlYXNvbiB0aGlzIG1vZGFsIGlzIHJlcXVpcmVkIGlzIHRoYXQgb24gbW9iaWxlIHR5cGluZyB1c2VzXG4gKiBhbiBvbi1zY3JlZW4ga2V5Ym9hcmQsIHdoaWNoIHJlcXVpcmVzIGEgdmFsaWQgaW5wdXQgdGV4dCBhcmVhL2lucHV0XG4gKiB0byBiZSBmb2N1c2VkIHRvIHN1bW1vbiBpdC4gVGhlcmVmb3JlIHdlIHNob3cgdGhpcyBtb2RhbCB3aGljaCBoYXNcbiAqIHRoZSBjb250ZW50cyBvZiB0aGUgVUUgd2lkZ2V0LCBwb3B1bGF0ZSBpdHMgdGV4dCBhcmVhIHdpdGggdGhlIGNvbnRlbnRzXG4gKiBvZiB0aGUgVUUgd2lkZ2V0LCB0aGVuIGZvY3VzIHRoZSB0ZXh0IGFyZWEgdG8gZmluYWxseSBzdW1tb24gdGhlIG5hdGl2ZVxuICogb24tc2NyZWVuIGtleWJvYXJkLlxuICpcbiAqIFRoZSBtb2RhbCBhbHNvIGNvbnRhaW5zOlxuICogMSkgQSBjYW5jZWwgYnV0dG9uIC0gdGhpcyBjbG9zZXMgdGhlIG1vZGFsXG4gKiAyKSBBIGNvbmZpcm0gYnV0dG9uIC0gdGhpcyBzdWJtaXRzIHRoZSBlZGl0IGJhY2sgdG8gdGhlIFVFIHNpZGVcbiAqL1xuZXhwb3J0IGNsYXNzIEVkaXRUZXh0TW9kYWwge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IHRoaXMucm9vdEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudFRhcmdldCgpO1xuICAgIH1cbiAgICAvLyBCaW5kIHRvIHRoaXMgaWYgeW91IHdhbnQgdG8gaGFuZGxlIGVkaXQgY29uZmlybWVkXG4gICAgZ2V0IGV2ZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2V2ZW50cztcbiAgICB9XG4gICAgc2hvd01vZGFsKGV4aXN0aW5nVGV4dEFyZWFDb250ZW50cykge1xuICAgICAgICBpZiAoZXhpc3RpbmdUZXh0QXJlYUNvbnRlbnRzKSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgYW55IG51bGwgdGVybWluYXRvcnMgZnJvbSB0aGUgc3RyaW5nXG4gICAgICAgICAgICBleGlzdGluZ1RleHRBcmVhQ29udGVudHMgPSBleGlzdGluZ1RleHRBcmVhQ29udGVudHMucmVwbGFjZSgvXFwwL2csICcnKTtcbiAgICAgICAgICAgIHRoaXMudGV4dEFyZWEudmFsdWUgPSBleGlzdGluZ1RleHRBcmVhQ29udGVudHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQnJpbmcgZm9jdXMgdG8gdGhlIHRleHQgYXJlYS5cbiAgICAgICAgLy8gVGhpcyB3aWxsIG1ha2UgdGhlIG9uLXNjcmVlbiBrZXlib2FyZCBzaG93IGlmIHdlIGFyZVxuICAgICAgICAvLyBhIGRldmljZSB0aGF0IGhhcyBhIG5hdGl2ZSBvbi1zY3JlZW4ga2V5Ym9hcmQuXG4gICAgICAgIC8vIElmIHdlIGFyZSBvbiBhIG5vbi10b3VjaCBkZXZpY2UgdGhpcyB3aWxsIGdpdmUgSU1FIGEgdmFsaWRcbiAgICAgICAgLy8gaW5wdXQgZmllbGQgdG8gd29yayB3aXRoLlxuICAgICAgICB0aGlzLnRleHRBcmVhLmZvY3VzKCk7XG4gICAgICAgIC8vIFB1dCBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgdGV4dGFyZWFcbiAgICAgICAgdGhpcy50ZXh0QXJlYS5zZWxlY3Rpb25TdGFydCA9IHRoaXMudGV4dEFyZWEudmFsdWUubGVuZ3RoO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJvb3QgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGVpdGhlciB0aGUgbW9kYWwgKG1vYmlsZSkgb3IgaGlkZGVuIHRleHQgaW5wdXQgKGRlc2t0b3ApXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbW9kYWwnKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaW5uZXJNb2RhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICBnZXQgaW5uZXJNb2RhbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbm5lck1vZGFsKSB7XG4gICAgICAgICAgICB0aGlzLl9pbm5lck1vZGFsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9pbm5lck1vZGFsLmNsYXNzTGlzdC5hZGQoJ2lubmVyTW9kYWwnKTtcbiAgICAgICAgICAgIHRoaXMuX2lubmVyTW9kYWwuYXBwZW5kQ2hpbGQodGhpcy5lZGl0VGV4dEhlYWRpbmcpO1xuICAgICAgICAgICAgdGhpcy5faW5uZXJNb2RhbC5hcHBlbmRDaGlsZCh0aGlzLnRleHRBcmVhKTtcbiAgICAgICAgICAgIHRoaXMuX2lubmVyTW9kYWwuYXBwZW5kQ2hpbGQodGhpcy5tb2RhbEJ0bkNvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2lubmVyTW9kYWw7XG4gICAgfVxuICAgIGdldCBlZGl0VGV4dEhlYWRpbmcoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZWRpdFRleHRIZWFkaW5nKSB7XG4gICAgICAgICAgICB0aGlzLl9lZGl0VGV4dEhlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdoMicpO1xuICAgICAgICAgICAgdGhpcy5fZWRpdFRleHRIZWFkaW5nLmlubmVyVGV4dCA9ICdFZGl0IFRleHQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9lZGl0VGV4dEhlYWRpbmc7XG4gICAgfVxuICAgIGdldCB0ZXh0QXJlYSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90ZXh0QXJlYSkge1xuICAgICAgICAgICAgdGhpcy5fdGV4dEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgICAgICAgICAgdGhpcy5fdGV4dEFyZWEuY2xhc3NMaXN0LmFkZCgnZm9ybS1jb250cm9sJyk7XG4gICAgICAgICAgICB0aGlzLl90ZXh0QXJlYS5jbGFzc0xpc3QuYWRkKCdtb2RhbFRleHRBcmVhJyk7XG4gICAgICAgICAgICB0aGlzLl90ZXh0QXJlYS50aXRsZSA9ICdFZGl0IFRleHQgQXJlYSc7XG4gICAgICAgICAgICB0aGlzLl90ZXh0QXJlYS5wbGFjZWhvbGRlciA9ICdVRSB0ZXh0IHdpZGdldCB2YWx1ZSBoZXJlLi4uJztcbiAgICAgICAgICAgIC8vIFdoZW4ga2V5Ym9hcmQgaXMgdHlwZWQgaW50byB3ZSB3YW50IHRvIGVuc3VyZSBrZXlzIGFyZSBub3Qgc2VudCBiYWNrIHRvIFVFIHVudGlsIHdlIGNvbmZpcm0uXG4gICAgICAgICAgICB0aGlzLnRleHRBcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGV4dEFyZWEuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy50ZXh0QXJlYS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudGV4dEFyZWEuYWRkRXZlbnRMaXN0ZW5lcignY29tcG9zaXRpb25lbmQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl90ZXh0QXJlYTtcbiAgICB9XG4gICAgZ2V0IG1vZGFsQnRuQ29udGFpbmVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuX21vZGFsQnRuQ29udGFpbmVyKSB7XG4gICAgICAgICAgICB0aGlzLl9tb2RhbEJ0bkNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fbW9kYWxCdG5Db250YWluZXIuY2xhc3NMaXN0LmFkZCgnbW9kYWxCdG5Db250YWluZXInKTtcbiAgICAgICAgICAgIHRoaXMuX21vZGFsQnRuQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY2FuY2VsQnRuKTtcbiAgICAgICAgICAgIHRoaXMuX21vZGFsQnRuQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY29uZmlybUJ0bik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX21vZGFsQnRuQ29udGFpbmVyO1xuICAgIH1cbiAgICBnZXQgY2FuY2VsQnRuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2NhbmNlbEJ0bikge1xuICAgICAgICAgICAgdGhpcy5fY2FuY2VsQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgICAgICB0aGlzLl9jYW5jZWxCdG4uY2xhc3NMaXN0LmFkZCgnYnRuLWZsYXQnKTtcbiAgICAgICAgICAgIHRoaXMuX2NhbmNlbEJ0bi5pbm5lclRleHQgPSAnQ2FuY2VsJztcbiAgICAgICAgICAgIC8vIFdoZW4gY2FuY2VsIGlzIGNsaWNrZWQsIHJlbW92ZSB0aGlzIG1vZGFsIGZyb20gdGhlIERPTVxuICAgICAgICAgICAgdGhpcy5fY2FuY2VsQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yb290RWxlbWVudC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhlIGNsaWNrL3RhcCBkb2VzIG5vdCBnbyBiYWNrIHRvIFVFXG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY2FuY2VsQnRuO1xuICAgIH1cbiAgICBnZXQgY29uZmlybUJ0bigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb25maXJtQnRuKSB7XG4gICAgICAgICAgICB0aGlzLl9jb25maXJtQnRuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgICAgICB0aGlzLl9jb25maXJtQnRuLmNsYXNzTGlzdC5hZGQoJ2J0bi1mbGF0Jyk7XG4gICAgICAgICAgICB0aGlzLl9jb25maXJtQnRuLmlubmVyVGV4dCA9ICdDb25maXJtJztcbiAgICAgICAgICAgIC8vIFdoZW4gY29uZmlybSBpcyBjbGlja2VkLCByZW1vdmUgZnJvbSBET00gYW5kIHNlbmQgdGhlIGNvbnRlbnRzIG9mIHRleHRhcmVhIHRvIFVFXG4gICAgICAgICAgICB0aGlzLl9jb25maXJtQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudHMuZGlzcGF0Y2hFdmVudChuZXcgRWRpdENvbmZpcm1lZEV2ZW50KHRoaXMudGV4dEFyZWEudmFsdWUpKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJvb3RFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgY2xpY2svdGFwIGRvZXMgbm90IGdvIGJhY2sgdG8gVUVcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maXJtQnRuO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVkaXRUZXh0TW9kYWwuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYW4gZWxlbWVudCAoaS5lLiBidXR0b24pIHRoYXQsIHdoZW4gY2xpY2tlZCwgd2lsbCB0b2dnbGUgZnVsbHNjcmVlbiBvZiBhIGdpdmVuIGVsZW1lbnQuXG4gKiBDYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbnkgSFRNTEVsZW1lbnQsIGlmIGl0IGlzIHNldCBhcyByb290RWxlbWVudCBpbiB0aGUgY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBGdWxsU2NyZWVuSWNvbkJhc2Uge1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICBzZXQgcm9vdEVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50Lm9uY2xpY2sgPSAoKSA9PiB0aGlzLnRvZ2dsZUZ1bGxzY3JlZW4oKTtcbiAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBlbGVtZW50O1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5pc0Z1bGxzY3JlZW4gPSBmYWxzZTtcbiAgICAgICAgLy8gc2V0IHVwIHRoZSBmdWxsIHNjcmVlbiBldmVudHNcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0ZnVsbHNjcmVlbmNoYW5nZScsICgpID0+IHRoaXMub25GdWxsc2NyZWVuQ2hhbmdlKCksIGZhbHNlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW96ZnVsbHNjcmVlbmNoYW5nZScsICgpID0+IHRoaXMub25GdWxsc2NyZWVuQ2hhbmdlKCksIGZhbHNlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsICgpID0+IHRoaXMub25GdWxsc2NyZWVuQ2hhbmdlKCksIGZhbHNlKTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignTVNGdWxsc2NyZWVuQ2hhbmdlJywgKCkgPT4gdGhpcy5vbkZ1bGxzY3JlZW5DaGFuZ2UoKSwgZmFsc2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNYWtlcyB0aGUgZG9jdW1lbnQgb3IgZnVsbHNjcmVlbkVsZW1lbnQgZnVsbHNjcmVlbi5cbiAgICAgKi9cbiAgICB0b2dnbGVGdWxsc2NyZWVuKCkge1xuICAgICAgICAvLyBpZiBhbHJlYWR5IGZ1bGwgc2NyZWVuOyBleGl0XG4gICAgICAgIC8vIGVsc2UgZ28gZnVsbHNjcmVlblxuICAgICAgICBpZiAoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHxcbiAgICAgICAgICAgIGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICAgICBkb2N1bWVudC5tb3pGdWxsU2NyZWVuRWxlbWVudCB8fFxuICAgICAgICAgICAgZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZnVsbHNjcmVlbkVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGVsZW1lbnQubW96UmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50Lm1velJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50LndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZWxlbWVudC5tc1JlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5tc1JlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChlbGVtZW50LndlYmtpdEVudGVyRnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQud2Via2l0RW50ZXJGdWxsc2NyZWVuKCk7IC8vZm9yIGlwaG9uZSB0aGlzIGNvZGUgd29ya2VkXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkZ1bGxzY3JlZW5DaGFuZ2UoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB0aGUgZnVsbHNjcmVlbiBidXR0b24gb24gY2hhbmdlXG4gICAgICovXG4gICAgb25GdWxsc2NyZWVuQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLmlzRnVsbHNjcmVlbiA9XG4gICAgICAgICAgICBkb2N1bWVudC53ZWJraXRJc0Z1bGxTY3JlZW4gfHxcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5tb3pGdWxsU2NyZWVuIHx8XG4gICAgICAgICAgICAgICAgKGRvY3VtZW50Lm1zRnVsbHNjcmVlbkVsZW1lbnQgJiYgZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudCAhPT0gbnVsbCkgfHxcbiAgICAgICAgICAgICAgICAoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgJiYgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgIT09IG51bGwpO1xuICAgIH1cbn1cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgRnVsbFNjcmVlbkljb25CYXNlIHRoYXQgdXNlcyBhbiBleHRlcm5hbGx5XG4gKiBwcm92aWRlZCBIVE1MRWxlbWVudCBmb3IgdG9nZ2xpbmcgZnVsbCBzY3JlZW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBGdWxsU2NyZWVuSWNvbkV4dGVybmFsIGV4dGVuZHMgRnVsbFNjcmVlbkljb25CYXNlIHtcbiAgICBjb25zdHJ1Y3RvcihleHRlcm5hbEJ1dHRvbikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnJvb3RFbGVtZW50ID0gZXh0ZXJuYWxCdXR0b247XG4gICAgfVxufVxuLyoqXG4gKiBUaGUgZGVmYXVsdCBmdWxsc2NyZWVuIGljb24gdGhhdCBjb250YWlucyBhIGJ1dHRvbiBhbmQgc3ZncyBmb3IgZWFjaCBzdGF0ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEZ1bGxTY3JlZW5JY29uIGV4dGVuZHMgRnVsbFNjcmVlbkljb25CYXNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgY29uc3QgY3JlYXRlZEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICBjcmVhdGVkQnV0dG9uLnR5cGUgPSAnYnV0dG9uJztcbiAgICAgICAgY3JlYXRlZEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdVaVRvb2wnKTtcbiAgICAgICAgY3JlYXRlZEJ1dHRvbi5pZCA9ICdmdWxsc2NyZWVuLWJ0bic7XG4gICAgICAgIGNyZWF0ZWRCdXR0b24uYXBwZW5kQ2hpbGQodGhpcy5tYXhpbWl6ZUljb24pO1xuICAgICAgICBjcmVhdGVkQnV0dG9uLmFwcGVuZENoaWxkKHRoaXMubWluaW1pemVJY29uKTtcbiAgICAgICAgY3JlYXRlZEJ1dHRvbi5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXBUZXh0KTtcbiAgICAgICAgdGhpcy5yb290RWxlbWVudCA9IGNyZWF0ZWRCdXR0b247XG4gICAgfVxuICAgIGdldCB0b29sdGlwVGV4dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b29sdGlwVGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwVGV4dC5jbGFzc0xpc3QuYWRkKCd0b29sdGlwdGV4dCcpO1xuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFRleHQuaW5uZXJIVE1MID0gJ0Z1bGxzY3JlZW4nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl90b29sdGlwVGV4dDtcbiAgICB9XG4gICAgZ2V0IG1heGltaXplSWNvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9tYXhpbWl6ZUljb24pIHtcbiAgICAgICAgICAgIHRoaXMuX21heGltaXplSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG4gICAgICAgICAgICB0aGlzLl9tYXhpbWl6ZUljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ2lkJywgJ21heGltaXplSWNvbicpO1xuICAgICAgICAgICAgdGhpcy5fbWF4aW1pemVJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICd4JywgJzBweCcpO1xuICAgICAgICAgICAgdGhpcy5fbWF4aW1pemVJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICd5JywgJzBweCcpO1xuICAgICAgICAgICAgdGhpcy5fbWF4aW1pemVJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICd2aWV3Qm94JywgJzAgMCAzODQuOTcgMzg0Ljk3Jyk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgc3ZnIGdyb3VwIGZvciB0aGUgcGF0aHNcbiAgICAgICAgICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBzdmdHcm91cC5jbGFzc0xpc3QuYWRkKCdzdmdJY29uJyk7XG4gICAgICAgICAgICB0aGlzLl9tYXhpbWl6ZUljb24uYXBwZW5kQ2hpbGQoc3ZnR3JvdXApO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHBhdGhzIGZvciB0aGUgaWNvbiBpdHNlbGYsIG9uZSBmb3IgZWFjaCBjb3JuZXJcbiAgICAgICAgICAgIGNvbnN0IHBhdGgxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMzg0Ljk3LDEyLjAzYzAtNi43MTMtNS4zMTctMTIuMDMtMTIuMDMtMTIuMDNIMjY0Ljg0N2MtNi44MzMsMC0xMS45MjIsNS4zOS0xMS45MzQsMTIuMjIzYzAsNi44MjEsNS4xMDEsMTEuODM4LDExLjkzNCwxMS44MzhoOTYuMDYybC0wLjE5Myw5Ni41MTljMCw2LjgzMyw1LjE5NywxMi4wMywxMi4wMywxMi4wM2M2LjgzMy0wLjAxMiwxMi4wMy01LjE5NywxMi4wMy0xMi4wM2wwLjE5My0xMDguMzY5YzAtMC4wMzYtMC4wMTItMC4wNi0wLjAxMi0wLjA4NEMzODQuOTU4LDEyLjA5LDM4NC45NywxMi4wNjYsMzg0Ljk3LDEyLjAzeicpO1xuICAgICAgICAgICAgY29uc3QgcGF0aDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIHBhdGgyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgJ00xMjAuNDk2LDBIMTIuNDAzYy0wLjAzNiwwLTAuMDYsMC4wMTItMC4wOTYsMC4wMTJDMTIuMjgzLDAuMDEyLDEyLjI0NywwLDEyLjIyMywwQzUuNTEsMCwwLjE5Miw1LjMxNywwLjE5MiwxMi4wM0wwLDEyMC4zOTljMCw2LjgzMyw1LjM5LDExLjkzNCwxMi4yMjMsMTEuOTM0YzYuODIxLDAsMTEuODM4LTUuMTAxLDExLjgzOC0xMS45MzRsMC4xOTItOTYuMzM5aDk2LjI0MmM2LjgzMywwLDEyLjAzLTUuMTk3LDEyLjAzLTEyLjAzQzEzMi41MTQsNS4xOTcsMTI3LjMxNywwLDEyMC40OTYsMHonKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGgzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoMy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMTIwLjEyMywzNjAuOTA5SDI0LjA2MXYtOTYuMjQyYzAtNi44MzMtNS4xOTctMTIuMDMtMTIuMDMtMTIuMDNTMCwyNTcuODMzLDAsMjY0LjY2N3YxMDguMDkyYzAsMC4wMzYsMC4wMTIsMC4wNiwwLjAxMiwwLjA4NGMwLDAuMDM2LTAuMDEyLDAuMDYtMC4wMTIsMC4wOTZjMCw2LjcxMyw1LjMxNywxMi4wMywxMi4wMywxMi4wM2gxMDguMDkyYzYuODMzLDAsMTEuOTIyLTUuMzksMTEuOTM0LTEyLjIyM0MxMzIuMDU3LDM2NS45MjYsMTI2Ljk1NiwzNjAuOTA5LDEyMC4xMjMsMzYwLjkwOXonKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGg0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoNC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMzcyLjc0NywyNTIuOTEzYy02LjgzMywwLTExLjg1LDUuMTAxLTExLjgzOCwxMS45MzR2OTYuMDYyaC05Ni4yNDJjLTYuODMzLDAtMTIuMDMsNS4xOTctMTIuMDMsMTIuMDNzNS4xOTcsMTIuMDMsMTIuMDMsMTIuMDNoMTA4LjA5MmMwLjAzNiwwLDAuMDYtMC4wMTIsMC4wODQtMC4wMTJjMC4wMzYtMC4wMTIsMC4wNiwwLjAxMiwwLjA5NiwwLjAxMmM2LjcxMywwLDEyLjAzLTUuMzE3LDEyLjAzLTEyLjAzVjI2NC44NDdDMzg0Ljk3LDI1OC4wMTQsMzc5LjU4LDI1Mi45MTMsMzcyLjc0NywyNTIuOTEzeicpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDEpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDIpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDMpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhpbWl6ZUljb247XG4gICAgfVxuICAgIGdldCBtaW5pbWl6ZUljb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWluaW1pemVJY29uKSB7XG4gICAgICAgICAgICB0aGlzLl9taW5pbWl6ZUljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpO1xuICAgICAgICAgICAgdGhpcy5fbWluaW1pemVJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICdpZCcsICdtaW5pbWl6ZUljb24nKTtcbiAgICAgICAgICAgIHRoaXMuX21pbmltaXplSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneCcsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX21pbmltaXplSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneScsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX21pbmltaXplSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAndmlld0JveCcsICcwIDAgMzg1LjMzMSAzODUuMzMxJyk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgc3ZnIGdyb3VwIGZvciB0aGUgcGF0aHNcbiAgICAgICAgICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBzdmdHcm91cC5jbGFzc0xpc3QuYWRkKCdzdmdJY29uJyk7XG4gICAgICAgICAgICB0aGlzLl9taW5pbWl6ZUljb24uYXBwZW5kQ2hpbGQoc3ZnR3JvdXApO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHBhdGhzIGZvciB0aGUgaWNvbiBpdHNlbGYsIG9uZSBmb3IgZWFjaCBjb3JuZXJcbiAgICAgICAgICAgIGNvbnN0IHBhdGgxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMjY0Ljk0MywxNTYuNjY1aDEwOC4yNzNjNi44MzMsMCwxMS45MzQtNS4zOSwxMS45MzQtMTIuMjExYzAtNi44MzMtNS4xMDEtMTEuODUtMTEuOTM0LTExLjgzOGgtOTYuMjQyVjM2LjE4MWMwLTYuODMzLTUuMTk3LTEyLjAzLTEyLjAzLTEyLjAzcy0xMi4wMyw1LjE5Ny0xMi4wMywxMi4wM3YxMDguMjczYzAsMC4wMzYsMC4wMTIsMC4wNiwwLjAxMiwwLjA4NGMwLDAuMDM2LTAuMDEyLDAuMDYtMC4wMTIsMC4wOTZDMjUyLjkxMywxNTEuMzQ3LDI1OC4yMywxNTYuNjc3LDI2NC45NDMsMTU2LjY2NXonKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGgyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoMi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMTIwLjI5MSwyNC4yNDdjLTYuODIxLDAtMTEuODM4LDUuMTEzLTExLjgzOCwxMS45MzR2OTYuMjQySDEyLjAzYy02LjgzMywwLTEyLjAzLDUuMTk3LTEyLjAzLDEyLjAzYzAsNi44MzMsNS4xOTcsMTIuMDMsMTIuMDMsMTIuMDNoMTA4LjI3M2MwLjAzNiwwLDAuMDYtMC4wMTIsMC4wODQtMC4wMTJjMC4wMzYsMCwwLjA2LDAuMDEyLDAuMDk2LDAuMDEyYzYuNzEzLDAsMTIuMDMtNS4zMTcsMTIuMDMtMTIuMDNWMzYuMTgxQzEzMi41MTQsMjkuMzYsMTI3LjEyNCwyNC4yNTksMTIwLjI5MSwyNC4yNDd6Jyk7XG4gICAgICAgICAgICBjb25zdCBwYXRoMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDMuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTEyMC4zODcsMjI4LjY2NkgxMi4xMTVjLTYuODMzLDAuMDEyLTExLjkzNCw1LjM5LTExLjkzNCwxMi4yMjNjMCw2LjgzMyw1LjEwMSwxMS44NSwxMS45MzQsMTEuODM4aDk2LjI0MnY5Ni40MjNjMCw2LjgzMyw1LjE5NywxMi4wMywxMi4wMywxMi4wM2M2LjgzMywwLDEyLjAzLTUuMTk3LDEyLjAzLTEyLjAzVjI0MC44NzdjMC0wLjAzNi0wLjAxMi0wLjA2LTAuMDEyLTAuMDg0YzAtMC4wMzYsMC4wMTItMC4wNiwwLjAxMi0wLjA5NkMxMzIuNDE4LDIzMy45ODMsMTI3LjEsMjI4LjY2NiwxMjAuMzg3LDIyOC42NjZ6Jyk7XG4gICAgICAgICAgICBjb25zdCBwYXRoNCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgcGF0aDQuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTM3My4zLDIyOC42NjZIMjY1LjAyOGMtMC4wMzYsMC0wLjA2LDAuMDEyLTAuMDg0LDAuMDEyYy0wLjAzNiwwLTAuMDYtMC4wMTItMC4wOTYtMC4wMTJjLTYuNzEzLDAtMTIuMDMsNS4zMTctMTIuMDMsMTIuMDN2MTA4LjI3M2MwLDYuODMzLDUuMzksMTEuOTIyLDEyLjIyMywxMS45MzRjNi44MjEsMC4wMTIsMTEuODM4LTUuMTAxLDExLjgzOC0xMS45MjJ2LTk2LjI0MkgzNzMuM2M2LjgzMywwLDEyLjAzLTUuMTk3LDEyLjAzLTEyLjAzUzM4MC4xMzQsMjI4LjY3OCwzNzMuMywyMjguNjY2eicpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDEpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDIpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDMpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9taW5pbWl6ZUljb247XG4gICAgfVxuICAgIG9uRnVsbHNjcmVlbkNoYW5nZSgpIHtcbiAgICAgICAgc3VwZXIub25GdWxsc2NyZWVuQ2hhbmdlKCk7XG4gICAgICAgIGNvbnN0IG1pbmltaXplID0gdGhpcy5taW5pbWl6ZUljb247XG4gICAgICAgIGNvbnN0IG1heGltaXplID0gdGhpcy5tYXhpbWl6ZUljb247XG4gICAgICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbikge1xuICAgICAgICAgICAgbWluaW1pemUuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnO1xuICAgICAgICAgICAgLy9pb3MgZGlzYXBwZWFyaW5nIHN2ZyBmaXhcbiAgICAgICAgICAgIG1pbmltaXplLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGUoMCwgMCknO1xuICAgICAgICAgICAgbWF4aW1pemUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1pbmltaXplLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICBtYXhpbWl6ZS5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7XG4gICAgICAgICAgICAvL2lvcyBkaXNhcHBlYXJpbmcgc3ZnIGZpeFxuICAgICAgICAgICAgbWF4aW1pemUuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZSgwLCAwKSc7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1GdWxsc2NyZWVuSWNvbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBBIGJ1dHRvbiB3aXRoIGEgdGV4dCBsYWJlbCBiZXNpZGUgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYWJlbGxlZEJ1dHRvbiB7XG4gICAgY29uc3RydWN0b3IobGFiZWwsIGJ1dHRvblRleHQpIHtcbiAgICAgICAgdGhpcy5fbGFiZWwgPSBsYWJlbDtcbiAgICAgICAgdGhpcy5fYnV0dG9uVGV4dCA9IGJ1dHRvblRleHQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFkZCBhIGNsaWNrIGxpc3RlbmVyIHRvIHRoZSBidXR0b24gZWxlbWVudC5cbiAgICAgKi9cbiAgICBhZGRPbkNsaWNrTGlzdGVuZXIob25DbGlja0Z1bmMpIHtcbiAgICAgICAgdGhpcy5idXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrRnVuYyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgSFRNTElucHV0RWxlbWVudCBmb3IgdGhlIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBnZXQgYnV0dG9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2J1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5fYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgICAgIHRoaXMuX2J1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICB0aGlzLl9idXR0b24udmFsdWUgPSB0aGlzLl9idXR0b25UZXh0O1xuICAgICAgICAgICAgdGhpcy5fYnV0dG9uLmNsYXNzTGlzdC5hZGQoJ292ZXJsYXktYnV0dG9uJyk7XG4gICAgICAgICAgICB0aGlzLl9idXR0b24uY2xhc3NMaXN0LmFkZCgnYnRuLWZsYXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYnV0dG9uO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBSZXR1cm4gb3IgY3JlYXRlcyBhIEhUTUwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhpcyBzZXR0aW5nIGluIHRoZSBET00uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgcm9vdCBkaXYgd2l0aCBcInNldHRpbmdcIiBjc3MgY2xhc3NcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nJyk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgZGl2IGVsZW1lbnQgdG8gY29udGFpbiBvdXIgc2V0dGluZydzIHRleHRcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzVGV4dEVsZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHNldHRpbmdzVGV4dEVsZW0uaW5uZXJUZXh0ID0gdGhpcy5fbGFiZWw7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZChzZXR0aW5nc1RleHRFbGVtKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBsYWJlbCBlbGVtZW50IHRvIHdyYXAgb3V0IGlucHV0IHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgICAgICAgICB3cmFwcGVyTGFiZWwuY2xhc3NMaXN0LmFkZCgnYnRuLW92ZXJsYXknKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHdyYXBwZXJMYWJlbCk7XG4gICAgICAgICAgICB3cmFwcGVyTGFiZWwuYXBwZW5kQ2hpbGQodGhpcy5idXR0b24pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1MYWJlbGxlZEJ1dHRvbi5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNSc7XG5pbXBvcnQgeyBTdGF0c1NlY3Rpb25zIH0gZnJvbSAnLi9VSUNvbmZpZ3VyYXRpb25UeXBlcyc7XG4vKipcbiAqIExhdGVuY3kgdGVzdCBVSSBlbGVtZW50cyBhbmQgcmVzdWx0cyBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIExhdGVuY3lUZXN0IHtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHRoZSBidXR0b24gY29udGFpbmluZyB0aGUgc3RhdHMgaWNvbi5cbiAgICAgKi9cbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3NDb250YWluZXInKTtcbiAgICAgICAgICAgIC8vIG1ha2UgaGVhZGluZ1xuICAgICAgICAgICAgY29uc3QgaGVhZGluZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgaGVhZGluZy5pZCA9ICdsYXRlbmN5VGVzdEhlYWRlcic7XG4gICAgICAgICAgICBoZWFkaW5nLmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzLXRleHQnKTtcbiAgICAgICAgICAgIGhlYWRpbmcuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3NIZWFkZXInKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKGhlYWRpbmcpO1xuICAgICAgICAgICAgY29uc3QgaGVhZGluZ1RleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGhlYWRpbmdUZXh0LmlubmVySFRNTCA9IFN0YXRzU2VjdGlvbnMuTGF0ZW5jeVRlc3Q7XG4gICAgICAgICAgICBoZWFkaW5nLmFwcGVuZENoaWxkKGhlYWRpbmdUZXh0KTtcbiAgICAgICAgICAgIGhlYWRpbmcuYXBwZW5kQ2hpbGQodGhpcy5sYXRlbmN5VGVzdEJ1dHRvbik7XG4gICAgICAgICAgICAvLyBtYWtlIHRlc3QgcmVzdWx0cyBlbGVtZW50XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzUGFyZW50RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgcmVzdWx0c1BhcmVudEVsZW0uaWQgPSAnbGF0ZW5jeVRlc3RDb250YWluZXInO1xuICAgICAgICAgICAgcmVzdWx0c1BhcmVudEVsZW0uY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZChyZXN1bHRzUGFyZW50RWxlbSk7XG4gICAgICAgICAgICByZXN1bHRzUGFyZW50RWxlbS5hcHBlbmRDaGlsZCh0aGlzLmxhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IGxhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fbGF0ZW5jeVRlc3RSZXN1bHRzRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RSZXN1bHRzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RSZXN1bHRzRWxlbWVudC5pZCA9ICdsYXRlbmN5U3RhdHNSZXN1bHRzJztcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnU3RhdHNSZXN1bHQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbGF0ZW5jeVRlc3RSZXN1bHRzRWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IGxhdGVuY3lUZXN0QnV0dG9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbi52YWx1ZSA9ICdSdW4gVGVzdCc7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5VGVzdEJ1dHRvbi5pZCA9ICdidG4tc3RhcnQtbGF0ZW5jeS10ZXN0JztcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lUZXN0QnV0dG9uLmNsYXNzTGlzdC5hZGQoJ3N0cmVhbVRvb2xzLWJ1dHRvbicpO1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVRlc3RCdXR0b24uY2xhc3NMaXN0LmFkZCgnYnRuLWZsYXQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbGF0ZW5jeVRlc3RCdXR0b247XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFBvcHVsYXRlIHRoZSBVSSBiYXNlZCBvbiB0aGUgbGF0ZW5jeSB0ZXN0J3MgcmVzdWx0cy5cbiAgICAgKiBAcGFyYW0gbGF0ZW5jeVRpbWluZ3MgLSBUaGUgbGF0ZW5jeSB0ZXN0IHJlc3VsdHMuXG4gICAgICovXG4gICAgaGFuZGxlVGVzdFJlc3VsdChsYXRlbmN5VGltaW5ncykge1xuICAgICAgICBMb2dnZXIuSW5mbyhKU09OLnN0cmluZ2lmeShsYXRlbmN5VGltaW5ncykpO1xuICAgICAgICBsZXQgbGF0ZW5jeVN0YXRzSW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGlmIChsYXRlbmN5VGltaW5ncy5uZXR3b3JrTGF0ZW5jeSAhPT0gdW5kZWZpbmVkICYmIGxhdGVuY3lUaW1pbmdzLm5ldHdvcmtMYXRlbmN5ID4gMCkge1xuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzSW5uZXJIVE1MICs9ICc8ZGl2Pk5ldCBsYXRlbmN5IFJUVCAobXMpOiAnICsgbGF0ZW5jeVRpbWluZ3MubmV0d29ya0xhdGVuY3kgKyAnPC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF0ZW5jeVRpbWluZ3MuRW5jb2RlTXMgIT09IHVuZGVmaW5lZCAmJiBsYXRlbmN5VGltaW5ncy5FbmNvZGVNcyA+IDApIHtcbiAgICAgICAgICAgIGxhdGVuY3lTdGF0c0lubmVySFRNTCArPSAnPGRpdj5VRSBFbmNvZGUgKG1zKTogJyArIGxhdGVuY3lUaW1pbmdzLkVuY29kZU1zICsgJzwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVuY3lUaW1pbmdzLkNhcHR1cmVUb1NlbmRNcyAhPT0gdW5kZWZpbmVkICYmIGxhdGVuY3lUaW1pbmdzLkNhcHR1cmVUb1NlbmRNcyA+IDApIHtcbiAgICAgICAgICAgIGxhdGVuY3lTdGF0c0lubmVySFRNTCArPSAnPGRpdj5VRSBDYXB0dXJlIChtcyk6ICcgKyBsYXRlbmN5VGltaW5ncy5DYXB0dXJlVG9TZW5kTXMgKyAnPC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF0ZW5jeVRpbWluZ3MuYnJvd3NlclNlbmRMYXRlbmN5ICE9PSB1bmRlZmluZWQgJiYgbGF0ZW5jeVRpbWluZ3MuYnJvd3NlclNlbmRMYXRlbmN5ID4gMCkge1xuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzSW5uZXJIVE1MICs9XG4gICAgICAgICAgICAgICAgJzxkaXY+QnJvd3NlciBzZW5kIGxhdGVuY3kgKG1zKTogJyArIGxhdGVuY3lUaW1pbmdzLmJyb3dzZXJTZW5kTGF0ZW5jeSArICc8L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXRlbmN5VGltaW5ncy5mcmFtZURpc3BsYXlEZWx0YVRpbWVNcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBsYXRlbmN5VGltaW5ncy5icm93c2VyUmVjZWlwdFRpbWVNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHNJbm5lckhUTUwgKz1cbiAgICAgICAgICAgICAgICBsYXRlbmN5VGltaW5ncy5mcmFtZURpc3BsYXlEZWx0YVRpbWVNcyAmJiBsYXRlbmN5VGltaW5ncy5icm93c2VyUmVjZWlwdFRpbWVNc1xuICAgICAgICAgICAgICAgICAgICA/ICc8ZGl2PkJyb3dzZXIgcmVjZWl2ZSBsYXRlbmN5IChtcyk6ICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeVRpbWluZ3MuZnJhbWVEaXNwbGF5RGVsdGFUaW1lTXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PidcbiAgICAgICAgICAgICAgICAgICAgOiAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF0ZW5jeVRpbWluZ3MubGF0ZW5jeUV4Y2x1ZGluZ0RlY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHNJbm5lckhUTUwgKz1cbiAgICAgICAgICAgICAgICAnPGRpdj5Ub3RhbCBsYXRlbmN5IChleGNsdWRpbmcgYnJvd3NlcikgKG1zKTogJyArXG4gICAgICAgICAgICAgICAgICAgIGxhdGVuY3lUaW1pbmdzLmxhdGVuY3lFeGNsdWRpbmdEZWNvZGUgK1xuICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF0ZW5jeVRpbWluZ3MuZW5kVG9FbmRMYXRlbmN5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxhdGVuY3lTdGF0c0lubmVySFRNTCArPSBsYXRlbmN5VGltaW5ncy5lbmRUb0VuZExhdGVuY3lcbiAgICAgICAgICAgICAgICA/ICc8ZGl2PlRvdGFsIGxhdGVuY3kgKG1zKTogJyArIGxhdGVuY3lUaW1pbmdzLmVuZFRvRW5kTGF0ZW5jeSArICc8L2Rpdj4nXG4gICAgICAgICAgICAgICAgOiAnJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhdGVuY3lUZXN0UmVzdWx0c0VsZW1lbnQuaW5uZXJIVE1MID0gbGF0ZW5jeVN0YXRzSW5uZXJIVE1MO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxhdGVuY3lUZXN0LmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIFNldHRpbmdzIGljb24gdGhhdCBjYW4gYmUgY2xpY2tlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNldHRpbmdzSWNvbiB7XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB0aGUgYnV0dG9uIGNvbnRhaW5pbmcgdGhlIHNldHRpbmdzIGljb24uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQudHlwZSA9ICdidXR0b24nO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnVWlUb29sJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5pZCA9ICdzZXR0aW5nc0J0bic7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnNldHRpbmdzSWNvbik7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXBUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCB0b29sdGlwVGV4dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b29sdGlwVGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwVGV4dC5jbGFzc0xpc3QuYWRkKCd0b29sdGlwdGV4dCcpO1xuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFRleHQuaW5uZXJIVE1MID0gJ1NldHRpbmdzJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9vbHRpcFRleHQ7XG4gICAgfVxuICAgIGdldCBzZXR0aW5nc0ljb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3NJY29uKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc0ljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpO1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICdpZCcsICdzZXR0aW5nc0ljb24nKTtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneCcsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneScsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAndmlld0JveCcsICcwIDAgNDc4LjcwMyA0NzguNzAzJyk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgc3ZnIGdyb3VwIGZvciB0aGUgcGF0aHNcbiAgICAgICAgICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBzdmdHcm91cC5jbGFzc0xpc3QuYWRkKCdzdmdJY29uJyk7XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc0ljb24uYXBwZW5kQ2hpbGQoc3ZnR3JvdXApO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHBhdGhzIGZvciB0aGUgaWNvbiBpdHNlbGYsIHRoZSBpbm5lciBhbmQgb3V0IHBhdGggb2YgYSBjb2dcbiAgICAgICAgICAgIGNvbnN0IHBhdGgxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNNDU0LjIsMTg5LjEwMWwtMzMuNi01LjdjLTMuNS0xMS4zLTgtMjIuMi0xMy41LTMyLjZsMTkuOC0yNy43YzguNC0xMS44LDcuMS0yNy45LTMuMi0zOC4xbC0yOS44LTI5LjhcXFxuXHRcdFx0Yy01LjYtNS42LTEzLTguNy0yMC45LTguN2MtNi4yLDAtMTIuMSwxLjktMTcuMSw1LjVsLTI3LjgsMTkuOGMtMTAuOC01LjctMjIuMS0xMC40LTMzLjgtMTMuOWwtNS42LTMzLjJcXFxuXHRcdFx0Yy0yLjQtMTQuMy0xNC43LTI0LjctMjkuMi0yNC43aC00Mi4xYy0xNC41LDAtMjYuOCwxMC40LTI5LjIsMjQuN2wtNS44LDM0Yy0xMS4yLDMuNS0yMi4xLDguMS0zMi41LDEzLjdsLTI3LjUtMTkuOFxcXG5cdFx0XHRjLTUtMy42LTExLTUuNS0xNy4yLTUuNWMtNy45LDAtMTUuNCwzLjEtMjAuOSw4LjdsLTI5LjksMjkuOGMtMTAuMiwxMC4yLTExLjYsMjYuMy0zLjIsMzguMWwyMCwyOC4xXFxcblx0XHRcdGMtNS41LDEwLjUtOS45LDIxLjQtMTMuMywzMi43bC0zMy4yLDUuNmMtMTQuMywyLjQtMjQuNywxNC43LTI0LjcsMjkuMnY0Mi4xYzAsMTQuNSwxMC40LDI2LjgsMjQuNywyOS4ybDM0LDUuOFxcXG5cdFx0XHRjMy41LDExLjIsOC4xLDIyLjEsMTMuNywzMi41bC0xOS43LDI3LjRjLTguNCwxMS44LTcuMSwyNy45LDMuMiwzOC4xbDI5LjgsMjkuOGM1LjYsNS42LDEzLDguNywyMC45LDguN2M2LjIsMCwxMi4xLTEuOSwxNy4xLTUuNVxcXG5cdFx0XHRsMjguMS0yMGMxMC4xLDUuMywyMC43LDkuNiwzMS42LDEzbDUuNiwzMy42YzIuNCwxNC4zLDE0LjcsMjQuNywyOS4yLDI0LjdoNDIuMmMxNC41LDAsMjYuOC0xMC40LDI5LjItMjQuN2w1LjctMzMuNlxcXG5cdFx0XHRjMTEuMy0zLjUsMjIuMi04LDMyLjYtMTMuNWwyNy43LDE5LjhjNSwzLjYsMTEsNS41LDE3LjIsNS41bDAsMGM3LjksMCwxNS4zLTMuMSwyMC45LTguN2wyOS44LTI5LjhjMTAuMi0xMC4yLDExLjYtMjYuMywzLjItMzguMVxcXG5cdFx0XHRsLTE5LjgtMjcuOGM1LjUtMTAuNSwxMC4xLTIxLjQsMTMuNS0zMi42bDMzLjYtNS42YzE0LjMtMi40LDI0LjctMTQuNywyNC43LTI5LjJ2LTQyLjFcXFxuXHRcdFx0QzQ3OC45LDIwMy44MDEsNDY4LjUsMTkxLjUwMSw0NTQuMiwxODkuMTAxeiBNNDUxLjksMjYwLjQwMWMwLDEuMy0wLjksMi40LTIuMiwyLjZsLTQyLDdjLTUuMywwLjktOS41LDQuOC0xMC44LDkuOVxcXG5cdFx0XHRjLTMuOCwxNC43LTkuNiwyOC44LTE3LjQsNDEuOWMtMi43LDQuNi0yLjUsMTAuMywwLjYsMTQuN2wyNC43LDM0LjhjMC43LDEsMC42LDIuNS0wLjMsMy40bC0yOS44LDI5LjhjLTAuNywwLjctMS40LDAuOC0xLjksMC44XFxcblx0XHRcdGMtMC42LDAtMS4xLTAuMi0xLjUtMC41bC0zNC43LTI0LjdjLTQuMy0zLjEtMTAuMS0zLjMtMTQuNy0wLjZjLTEzLjEsNy44LTI3LjIsMTMuNi00MS45LDE3LjRjLTUuMiwxLjMtOS4xLDUuNi05LjksMTAuOGwtNy4xLDQyXFxcblx0XHRcdGMtMC4yLDEuMy0xLjMsMi4yLTIuNiwyLjJoLTQyLjFjLTEuMywwLTIuNC0wLjktMi42LTIuMmwtNy00MmMtMC45LTUuMy00LjgtOS41LTkuOS0xMC44Yy0xNC4zLTMuNy0yOC4xLTkuNC00MS0xNi44XFxcblx0XHRcdGMtMi4xLTEuMi00LjUtMS44LTYuOC0xLjhjLTIuNywwLTUuNSwwLjgtNy44LDIuNWwtMzUsMjQuOWMtMC41LDAuMy0xLDAuNS0xLjUsMC41Yy0wLjQsMC0xLjItMC4xLTEuOS0wLjhsLTI5LjgtMjkuOFxcXG5cdFx0XHRjLTAuOS0wLjktMS0yLjMtMC4zLTMuNGwyNC42LTM0LjVjMy4xLTQuNCwzLjMtMTAuMiwwLjYtMTQuOGMtNy44LTEzLTEzLjgtMjcuMS0xNy42LTQxLjhjLTEuNC01LjEtNS42LTktMTAuOC05LjlsLTQyLjMtNy4yXFxcblx0XHRcdGMtMS4zLTAuMi0yLjItMS4zLTIuMi0yLjZ2LTQyLjFjMC0xLjMsMC45LTIuNCwyLjItMi42bDQxLjctN2M1LjMtMC45LDkuNi00LjgsMTAuOS0xMGMzLjctMTQuNyw5LjQtMjguOSwxNy4xLTQyXFxcblx0XHRcdGMyLjctNC42LDIuNC0xMC4zLTAuNy0xNC42bC0yNC45LTM1Yy0wLjctMS0wLjYtMi41LDAuMy0zLjRsMjkuOC0yOS44YzAuNy0wLjcsMS40LTAuOCwxLjktMC44YzAuNiwwLDEuMSwwLjIsMS41LDAuNWwzNC41LDI0LjZcXFxuXHRcdFx0YzQuNCwzLjEsMTAuMiwzLjMsMTQuOCwwLjZjMTMtNy44LDI3LjEtMTMuOCw0MS44LTE3LjZjNS4xLTEuNCw5LTUuNiw5LjktMTAuOGw3LjItNDIuM2MwLjItMS4zLDEuMy0yLjIsMi42LTIuMmg0Mi4xXFxcblx0XHRcdGMxLjMsMCwyLjQsMC45LDIuNiwyLjJsNyw0MS43YzAuOSw1LjMsNC44LDkuNiwxMCwxMC45YzE1LjEsMy44LDI5LjUsOS43LDQyLjksMTcuNmM0LjYsMi43LDEwLjMsMi41LDE0LjctMC42bDM0LjUtMjQuOFxcXG5cdFx0XHRjMC41LTAuMywxLTAuNSwxLjUtMC41YzAuNCwwLDEuMiwwLjEsMS45LDAuOGwyOS44LDI5LjhjMC45LDAuOSwxLDIuMywwLjMsMy40bC0yNC43LDM0LjdjLTMuMSw0LjMtMy4zLDEwLjEtMC42LDE0LjdcXFxuXHRcdFx0YzcuOCwxMy4xLDEzLjYsMjcuMiwxNy40LDQxLjljMS4zLDUuMiw1LjYsOS4xLDEwLjgsOS45bDQyLDcuMWMxLjMsMC4yLDIuMiwxLjMsMi4yLDIuNnY0Mi4xSDQ1MS45eicpO1xuICAgICAgICAgICAgY29uc3QgcGF0aDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIHBhdGgyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgJ00yMzkuNCwxMzYuMDAxYy01NywwLTEwMy4zLDQ2LjMtMTAzLjMsMTAzLjNzNDYuMywxMDMuMywxMDMuMywxMDMuM3MxMDMuMy00Ni4zLDEwMy4zLTEwMy4zUzI5Ni40LDEzNi4wMDEsMjM5LjQsMTM2LjAwMXogTTIzOS40LDMxNS42MDFjLTQyLjEsMC03Ni4zLTM0LjItNzYuMy03Ni4zczM0LjItNzYuMyw3Ni4zLTc2LjNzNzYuMywzNC4yLDc2LjMsNzYuM1MyODEuNSwzMTUuNjAxLDIzOS40LDMxNS42MDF6Jyk7XG4gICAgICAgICAgICBzdmdHcm91cC5hcHBlbmRDaGlsZChwYXRoMSk7XG4gICAgICAgICAgICBzdmdHcm91cC5hcHBlbmRDaGlsZChwYXRoMik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSWNvbjtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TZXR0aW5nc0ljb24uanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogQSBVSSBjb21wb25lbnQgY29udGFpbmluZyBhbGwgdGhlIHNldHRpbmdzIGZvciB0aGUgYXBwbGljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1BhbmVsIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBSZXR1cm4gb3IgY3JlYXRlcyBhIEhUTUwgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhpcyBzZXR0aW5nIGluIHRoZSBET00uXG4gICAgICovXG4gICAgZ2V0IHJvb3RFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Jvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuaWQgPSAnc2V0dGluZ3MtcGFuZWwnO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncGFuZWwtd3JhcCcpO1xuICAgICAgICAgICAgY29uc3QgcGFuZWxFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBwYW5lbEVsZW0uY2xhc3NMaXN0LmFkZCgncGFuZWwnKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHBhbmVsRWxlbSk7XG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nc0hlYWRpbmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHNldHRpbmdzSGVhZGluZy5pZCA9ICdzZXR0aW5nc0hlYWRpbmcnO1xuICAgICAgICAgICAgc2V0dGluZ3NIZWFkaW5nLnRleHRDb250ZW50ID0gJ1NldHRpbmdzJztcbiAgICAgICAgICAgIHBhbmVsRWxlbS5hcHBlbmRDaGlsZChzZXR0aW5nc0hlYWRpbmcpO1xuICAgICAgICAgICAgcGFuZWxFbGVtLmFwcGVuZENoaWxkKHRoaXMuc2V0dGluZ3NDbG9zZUJ1dHRvbik7XG4gICAgICAgICAgICBwYW5lbEVsZW0uYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc0NvbnRlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIGdldCBzZXR0aW5nc0NvbnRlbnRFbGVtZW50KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3NldHRpbmdzQ29udGVudEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzQ29udGVudEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3NldHRpbmdzQ29udGVudEVsZW1lbnQuaWQgPSAnc2V0dGluZ3NDb250ZW50JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NDb250ZW50RWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IHNldHRpbmdzQ2xvc2VCdXR0b24oKSB7XG4gICAgICAgIGlmICghdGhpcy5fc2V0dGluZ3NDbG9zZUJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NDbG9zZUJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fc2V0dGluZ3NDbG9zZUJ1dHRvbi5pZCA9ICdzZXR0aW5nc0Nsb3NlJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NDbG9zZUJ1dHRvbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvdyBzZXR0aW5ncyBwYW5lbC5cbiAgICAgKi9cbiAgICBzaG93KCkge1xuICAgICAgICBpZiAoIXRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwYW5lbC13cmFwLXZpc2libGUnKSkge1xuICAgICAgICAgICAgdGhpcy5yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwYW5lbC13cmFwLXZpc2libGUnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHNldHRpbmdzIHBhbmVsLlxuICAgICAqL1xuICAgIHRvZ2dsZVZpc2liaWxpdHkoKSB7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgncGFuZWwtd3JhcC12aXNpYmxlJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhpZGUgc2V0dGluZ3MgcGFuZWwuXG4gICAgICovXG4gICAgaGlkZSgpIHtcbiAgICAgICAgaWYgKHRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwYW5lbC13cmFwLXZpc2libGUnKSkge1xuICAgICAgICAgICAgdGhpcy5yb290RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdwYW5lbC13cmFwLXZpc2libGUnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVNldHRpbmdzUGFuZWwuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbi8qKlxuICogU3RhdHMgaWNvbiB0aGF0IGNhbiBiZSBjbGlja2VkLlxuICovXG5leHBvcnQgY2xhc3MgU3RhdHNJY29uIHtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHRoZSBidXR0b24gY29udGFpbmluZyB0aGUgc3RhdHMgaWNvbi5cbiAgICAgKi9cbiAgICBnZXQgcm9vdEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fcm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYnV0dG9uJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdVaVRvb2wnKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmlkID0gJ3N0YXRzQnRuJztcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuc3RhdHNJY29uKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudG9vbHRpcFRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yb290RWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IHRvb2x0aXBUZXh0KCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rvb2x0aXBUZXh0KSB7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBUZXh0LmNsYXNzTGlzdC5hZGQoJ3Rvb2x0aXB0ZXh0Jyk7XG4gICAgICAgICAgICB0aGlzLl90b29sdGlwVGV4dC5pbm5lckhUTUwgPSAnSW5mb3JtYXRpb24nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl90b29sdGlwVGV4dDtcbiAgICB9XG4gICAgZ2V0IHN0YXRzSWNvbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zdGF0c0ljb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzSWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAnc3ZnJyk7XG4gICAgICAgICAgICB0aGlzLl9zdGF0c0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ2lkJywgJ3N0YXRzSWNvbicpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdHNJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICd4JywgJzBweCcpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdHNJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICd5JywgJzBweCcpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdHNJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsICd2aWV3Qm94JywgJzAgMCAzMzAgMzMwJyk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgc3ZnIGdyb3VwIGZvciB0aGUgcGF0aHNcbiAgICAgICAgICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdnJyk7XG4gICAgICAgICAgICBzdmdHcm91cC5jbGFzc0xpc3QuYWRkKCdzdmdJY29uJyk7XG4gICAgICAgICAgICB0aGlzLl9zdGF0c0ljb24uYXBwZW5kQ2hpbGQoc3ZnR3JvdXApO1xuICAgICAgICAgICAgLy8gY3JlYXRlIHBhdGhzIGZvciB0aGUgaWNvbiBpdHNlbGYsIHRoZSBpbm5lciBhbmQgb3V0IHBhdGggb2YgYSBjb2dcbiAgICAgICAgICAgIGNvbnN0IHBhdGgxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMTY1LDAuMDA4Qzc0LjAxOSwwLjAwOCwwLDc0LjAyNCwwLDE2NC45OTljMCw5MC45NzcsNzQuMDE5LDE2NC45OTIsMTY1LDE2NC45OTJzMTY1LTc0LjAxNSwxNjUtMTY0Ljk5MkMzMzAsNzQuMDI0LDI1NS45ODEsMC4wMDgsMTY1LDAuMDA4eiBNMTY1LDI5OS45OTJjLTc0LjQzOSwwLTEzNS02MC41NTctMTM1LTEzNC45OTJTOTAuNTYxLDMwLjAwOCwxNjUsMzAuMDA4czEzNSw2MC41NTcsMTM1LDEzNC45OTFDMzAwLDIzOS40MzYsMjM5LjQzOSwyOTkuOTkyLDE2NSwyOTkuOTkyeicpO1xuICAgICAgICAgICAgY29uc3QgcGF0aDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIHBhdGgyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdkJywgJ00xNjUsMTMwLjAwOGMtOC4yODQsMC0xNSw2LjcxNi0xNSwxNXY5OS45ODNjMCw4LjI4NCw2LjcxNiwxNSwxNSwxNXMxNS02LjcxNiwxNS0xNXYtOTkuOTgzQzE4MCwxMzYuNzI1LDE3My4yODQsMTMwLjAwOCwxNjUsMTMwLjAwOHonKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGgzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdwYXRoJyk7XG4gICAgICAgICAgICBwYXRoMy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMTY1LDcwLjAxMWMtMy45NSwwLTcuODExLDEuNi0xMC42MSw0LjM5Yy0yLjc5LDIuNzktNC4zOSw2LjY2LTQuMzksMTAuNjFzMS42LDcuODEsNC4zOSwxMC42MWMyLjc5LDIuNzksNi42Niw0LjM5LDEwLjYxLDQuMzlzNy44MS0xLjYsMTAuNjA5LTQuMzljMi43OS0yLjgsNC4zOTEtNi42Niw0LjM5MS0xMC42MXMtMS42MDEtNy44Mi00LjM5MS0xMC42MUMxNzIuODEsNzEuNjEsMTY4Ljk1LDcwLjAxMSwxNjUsNzAuMDExeicpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDEpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDIpO1xuICAgICAgICAgICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0c0ljb247XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9U3RhdHNJY29uLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5pbXBvcnQgeyBMYXRlbmN5VGVzdCB9IGZyb20gJy4vTGF0ZW5jeVRlc3QnO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNSc7XG5pbXBvcnQgeyBNYXRoVXRpbHMgfSBmcm9tICcuLi9VdGlsL01hdGhVdGlscyc7XG5pbXBvcnQgeyBEYXRhQ2hhbm5lbExhdGVuY3lUZXN0IH0gZnJvbSAnLi9EYXRhQ2hhbm5lbExhdGVuY3lUZXN0JztcbmltcG9ydCB7IGlzU2VjdGlvbkVuYWJsZWQsIFN0YXRzU2VjdGlvbnMgfSBmcm9tICcuL1VJQ29uZmlndXJhdGlvblR5cGVzJztcbi8qKlxuICogQSBzdGF0IHN0cnVjdHVyZSwgYW4gaWQsIHRoZSBzdGF0IHN0cmluZywgYW5kIHRoZSBlbGVtZW50IHdoZXJlIGl0IGlzIHJlbmRlcmVkLlxuICovXG5leHBvcnQgY2xhc3MgU3RhdCB7XG59XG4vKipcbiAqIEEgVUkgY29tcG9uZW50IGNvbnRhaW5pbmcgYWxsIHRoZSBzdGF0cyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgU3RhdHNQYW5lbCB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIC8qIEEgbWFwIHN0YXRzIHdlIGFyZSBzdG9yaW5nL3JlbmRlcmluZyAqL1xuICAgICAgICB0aGlzLnN0YXRzTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgICAgIHRoaXMubGF0ZW5jeVRlc3QgPSBuZXcgTGF0ZW5jeVRlc3QoKTtcbiAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbExhdGVuY3lUZXN0ID0gbmV3IERhdGFDaGFubmVsTGF0ZW5jeVRlc3QoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHJldHVybnMgUmV0dXJuIG9yIGNyZWF0ZXMgYSBIVE1MIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoaXMgc2V0dGluZyBpbiB0aGUgRE9NLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmlkID0gJ3N0YXRzLXBhbmVsJztcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3BhbmVsLXdyYXAnKTtcbiAgICAgICAgICAgIGNvbnN0IHBhbmVsRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgcGFuZWxFbGVtLmNsYXNzTGlzdC5hZGQoJ3BhbmVsJyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZChwYW5lbEVsZW0pO1xuICAgICAgICAgICAgY29uc3Qgc3RhdHNIZWFkaW5nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBzdGF0c0hlYWRpbmcuaWQgPSAnc3RhdHNIZWFkaW5nJztcbiAgICAgICAgICAgIHN0YXRzSGVhZGluZy50ZXh0Q29udGVudCA9ICdJbmZvcm1hdGlvbic7XG4gICAgICAgICAgICBwYW5lbEVsZW0uYXBwZW5kQ2hpbGQoc3RhdHNIZWFkaW5nKTtcbiAgICAgICAgICAgIHBhbmVsRWxlbS5hcHBlbmRDaGlsZCh0aGlzLnN0YXRzQ2xvc2VCdXR0b24pO1xuICAgICAgICAgICAgcGFuZWxFbGVtLmFwcGVuZENoaWxkKHRoaXMuc3RhdHNDb250ZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICBnZXQgc3RhdHNDb250ZW50RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zdGF0c0NvbnRlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0c0NvbnRlbnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9zdGF0c0NvbnRlbnRFbGVtZW50LmlkID0gJ3N0YXRzQ29udGVudCc7XG4gICAgICAgICAgICBjb25zdCBzdHJlYW1Ub29sU3RhdHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHN0cmVhbVRvb2xTdGF0cy5pZCA9ICdzdHJlYW1Ub29sc1N0YXRzJztcbiAgICAgICAgICAgIHN0cmVhbVRvb2xTdGF0cy5jbGFzc0xpc3QuYWRkKCdjb250YWluZXInKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xTdGF0cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgY29udHJvbFN0YXRzLmlkID0gJ0NvbnRyb2xTdGF0cyc7XG4gICAgICAgICAgICBjb250cm9sU3RhdHMuY2xhc3NMaXN0LmFkZCgncm93Jyk7XG4gICAgICAgICAgICBjb25zdCBzdGF0aXN0aWNzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2VjdGlvbicpO1xuICAgICAgICAgICAgc3RhdGlzdGljcy5pZCA9ICdzdGF0aXN0aWNzJztcbiAgICAgICAgICAgIHN0YXRpc3RpY3MuY2xhc3NMaXN0LmFkZCgnc2V0dGluZ3NDb250YWluZXInKTtcbiAgICAgICAgICAgIGNvbnN0IGxhdGVuY3lTdGF0cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NlY3Rpb24nKTtcbiAgICAgICAgICAgIGxhdGVuY3lTdGF0cy5pZCA9ICdsYXRlbmN5U3RhdHMnO1xuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzLmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzQ29udGFpbmVyJyk7XG4gICAgICAgICAgICBjb25zdCBzdGF0aXN0aWNzSGVhZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBzdGF0aXN0aWNzSGVhZGVyLmlkID0gJ3N0YXRpc3RpY3NIZWFkZXInO1xuICAgICAgICAgICAgc3RhdGlzdGljc0hlYWRlci5jbGFzc0xpc3QuYWRkKCdzZXR0aW5ncy10ZXh0Jyk7XG4gICAgICAgICAgICBzdGF0aXN0aWNzSGVhZGVyLmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzSGVhZGVyJyk7XG4gICAgICAgICAgICBjb25zdCBsYXRlbmN5U3RhdHNIZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGxhdGVuY3lTdGF0c0hlYWRlci5pZCA9ICdsYXRlbmN5U3RhdHNIZWFkZXInO1xuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzSGVhZGVyLmNsYXNzTGlzdC5hZGQoJ3NldHRpbmdzLXRleHQnKTtcbiAgICAgICAgICAgIGxhdGVuY3lTdGF0c0hlYWRlci5jbGFzc0xpc3QuYWRkKCdzZXR0aW5nc0hlYWRlcicpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdHNDb250ZW50RWxlbWVudC5hcHBlbmRDaGlsZChzdHJlYW1Ub29sU3RhdHMpO1xuICAgICAgICAgICAgc3RyZWFtVG9vbFN0YXRzLmFwcGVuZENoaWxkKGNvbnRyb2xTdGF0cyk7XG4gICAgICAgICAgICBjb250cm9sU3RhdHMuYXBwZW5kQ2hpbGQoc3RhdGlzdGljcyk7XG4gICAgICAgICAgICBjb250cm9sU3RhdHMuYXBwZW5kQ2hpbGQobGF0ZW5jeVN0YXRzKTtcbiAgICAgICAgICAgIHN0YXRpc3RpY3MuYXBwZW5kQ2hpbGQoc3RhdGlzdGljc0hlYWRlcik7XG4gICAgICAgICAgICBsYXRlbmN5U3RhdHMuYXBwZW5kQ2hpbGQobGF0ZW5jeVN0YXRzSGVhZGVyKTtcbiAgICAgICAgICAgIGlmIChpc1NlY3Rpb25FbmFibGVkKHRoaXMuX2NvbmZpZywgU3RhdHNTZWN0aW9ucy5TZXNzaW9uU3RhdHMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvblN0YXRzVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIHNlc3Npb25TdGF0c1RleHQuaW5uZXJIVE1MID0gU3RhdHNTZWN0aW9ucy5TZXNzaW9uU3RhdHM7XG4gICAgICAgICAgICAgICAgc3RhdGlzdGljc0hlYWRlci5hcHBlbmRDaGlsZChzZXNzaW9uU3RhdHNUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRpc3RpY3MuYXBwZW5kQ2hpbGQodGhpcy5zdGF0aXN0aWNzQ29udGFpbmVyKTtcbiAgICAgICAgICAgIGlmIChpc1NlY3Rpb25FbmFibGVkKHRoaXMuX2NvbmZpZywgU3RhdHNTZWN0aW9ucy5MYXRlbmN5U3RhdHMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGF0ZW5jeVN0YXRzVGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgIGxhdGVuY3lTdGF0c1RleHQuaW5uZXJIVE1MID0gU3RhdHNTZWN0aW9ucy5MYXRlbmN5U3RhdHM7XG4gICAgICAgICAgICAgICAgbGF0ZW5jeVN0YXRzSGVhZGVyLmFwcGVuZENoaWxkKGxhdGVuY3lTdGF0c1RleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGF0ZW5jeVN0YXRzLmFwcGVuZENoaWxkKHRoaXMubGF0ZW5jeVN0YXRzQ29udGFpbmVyKTtcbiAgICAgICAgICAgIGlmIChpc1NlY3Rpb25FbmFibGVkKHRoaXMuX2NvbmZpZywgU3RhdHNTZWN0aW9ucy5MYXRlbmN5VGVzdCkpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sU3RhdHMuYXBwZW5kQ2hpbGQodGhpcy5sYXRlbmN5VGVzdC5yb290RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTZWN0aW9uRW5hYmxlZCh0aGlzLl9jb25maWcsIFN0YXRzU2VjdGlvbnMuRGF0YUNoYW5uZWxMYXRlbmN5VGVzdCkpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sU3RhdHMuYXBwZW5kQ2hpbGQodGhpcy5kYXRhQ2hhbm5lbExhdGVuY3lUZXN0LnJvb3RFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHNDb250ZW50RWxlbWVudDtcbiAgICB9XG4gICAgZ2V0IHN0YXRpc3RpY3NDb250YWluZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5fc3RhdGlzdGljc0NvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5fc3RhdGlzdGljc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdGlzdGljc0NvbnRhaW5lci5pZCA9ICdzdGF0aXN0aWNzQ29udGFpbmVyJztcbiAgICAgICAgICAgIHRoaXMuX3N0YXRpc3RpY3NDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICAgICAgICB0aGlzLl9zdGF0aXN0aWNzQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc3RhdHNSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0aXN0aWNzQ29udGFpbmVyO1xuICAgIH1cbiAgICBnZXQgbGF0ZW5jeVN0YXRzQ29udGFpbmVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xhdGVuY3lTdGF0c0NvbnRhaW5lcikge1xuICAgICAgICAgICAgdGhpcy5fbGF0ZW5jeVN0YXRzQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5U3RhdHNDb250YWluZXIuaWQgPSAnbGF0ZW5jeVN0YXRzQ29udGFpbmVyJztcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lTdGF0c0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lTdGF0c0NvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmxhdGVuY3lSZXN1bHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9sYXRlbmN5U3RhdHNDb250YWluZXI7XG4gICAgfVxuICAgIGdldCBzdGF0c1Jlc3VsdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9zdGF0c1Jlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHNSZXN1bHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzUmVzdWx0LmlkID0gJ3N0YXRpc3RpY3NSZXN1bHQnO1xuICAgICAgICAgICAgdGhpcy5fc3RhdHNSZXN1bHQuY2xhc3NMaXN0LmFkZCgnU3RhdHNSZXN1bHQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHNSZXN1bHQ7XG4gICAgfVxuICAgIGdldCBsYXRlbmN5UmVzdWx0KCkge1xuICAgICAgICBpZiAoIXRoaXMuX2xhdGVuY3lSZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lSZXN1bHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX2xhdGVuY3lSZXN1bHQuaWQgPSAnbGF0ZW5jeVJlc3VsdCc7XG4gICAgICAgICAgICB0aGlzLl9sYXRlbmN5UmVzdWx0LmNsYXNzTGlzdC5hZGQoJ1N0YXRzUmVzdWx0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhdGVuY3lSZXN1bHQ7XG4gICAgfVxuICAgIGdldCBzdGF0c0Nsb3NlQnV0dG9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3N0YXRzQ2xvc2VCdXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzQ2xvc2VCdXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHRoaXMuX3N0YXRzQ2xvc2VCdXR0b24uaWQgPSAnc3RhdHNDbG9zZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRzQ2xvc2VCdXR0b247XG4gICAgfVxuICAgIG9uRGlzY29ubmVjdCgpIHtcbiAgICAgICAgdGhpcy5sYXRlbmN5VGVzdC5sYXRlbmN5VGVzdEJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRhdGFDaGFubmVsTGF0ZW5jeVRlc3QubGF0ZW5jeVRlc3RCdXR0b24ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIC8vZG8gbm90aGluZ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBvblZpZGVvSW5pdGlhbGl6ZWQoc3RyZWFtKSB7XG4gICAgICAgIC8vIHN0YXJ0aW5nIGEgbGF0ZW5jeSBjaGVja1xuICAgICAgICB0aGlzLmxhdGVuY3lUZXN0LmxhdGVuY3lUZXN0QnV0dG9uLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICBzdHJlYW0ucmVxdWVzdExhdGVuY3lUZXN0KCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZGF0YUNoYW5uZWxMYXRlbmN5VGVzdC5sYXRlbmN5VGVzdEJ1dHRvbi5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRlZCA9IHN0cmVhbS5yZXF1ZXN0RGF0YUNoYW5uZWxMYXRlbmN5VGVzdCh7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDEwMDAsXG4gICAgICAgICAgICAgICAgcnBzOiAxMCxcbiAgICAgICAgICAgICAgICByZXF1ZXN0U2l6ZTogMjAwLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlU2l6ZTogMjAwXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChzdGFydGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbExhdGVuY3lUZXN0LmhhbmRsZVRlc3RTdGFydCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25maWd1cmUoc2V0dGluZ3MpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzLkRpc2FibGVMYXRlbmN5VGVzdCkge1xuICAgICAgICAgICAgdGhpcy5sYXRlbmN5VGVzdC5sYXRlbmN5VGVzdEJ1dHRvbi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmxhdGVuY3lUZXN0LmxhdGVuY3lUZXN0QnV0dG9uLnRpdGxlID0gJ0Rpc2FibGVkIGJ5IC1QaXhlbFN0cmVhbWluZ0Rpc2FibGVMYXRlbmN5VGVzdGVyPXRydWUnO1xuICAgICAgICAgICAgdGhpcy5kYXRhQ2hhbm5lbExhdGVuY3lUZXN0LmxhdGVuY3lUZXN0QnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuZGF0YUNoYW5uZWxMYXRlbmN5VGVzdC5sYXRlbmN5VGVzdEJ1dHRvbi50aXRsZSA9XG4gICAgICAgICAgICAgICAgJ0Rpc2FibGVkIGJ5IC1QaXhlbFN0cmVhbWluZ0Rpc2FibGVMYXRlbmN5VGVzdGVyPXRydWUnO1xuICAgICAgICAgICAgTG9nZ2VyLkluZm8oJy1QaXhlbFN0cmVhbWluZ0Rpc2FibGVMYXRlbmN5VGVzdGVyPXRydWUsIHJlcXVlc3RpbmcgbGF0ZW5jeSByZXBvcnQgZnJvbSB0aGUgdGhlIGJyb3dzZXIgdG8gVUUgaXMgZGlzYWJsZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2hvdyBzdGF0cyBwYW5lbC5cbiAgICAgKi9cbiAgICBzaG93KCkge1xuICAgICAgICBpZiAoIXRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdwYW5lbC13cmFwLXZpc2libGUnKSkge1xuICAgICAgICAgICAgdGhpcy5yb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwYW5lbC13cmFwLXZpc2libGUnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHN0YXRzIHBhbmVsLlxuICAgICAqL1xuICAgIHRvZ2dsZVZpc2liaWxpdHkoKSB7XG4gICAgICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgncGFuZWwtd3JhcC12aXNpYmxlJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEhpZGUgdGhlIHN0YXRzIHBhbmVsLlxuICAgICAqL1xuICAgIGhpZGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnJvb3RFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygncGFuZWwtd3JhcC12aXNpYmxlJykpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgncGFuZWwtd3JhcC12aXNpYmxlJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaGFuZGxlUGxheWVyQ291bnQocGxheWVyQ291bnQpIHtcbiAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdQbGF5ZXJDb3VudFN0YXQnLCAnUGxheWVycycsIHBsYXllckNvdW50LnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgc3RhdHMgY29taW5nIGluIGZyb20gYnJvd3Nlci9VRVxuICAgICAqIEBwYXJhbSBzdGF0cyAtIHRoZSBzdGF0cyBzdHJ1Y3R1cmVcbiAgICAgKi9cbiAgICBoYW5kbGVTdGF0cyhzdGF0cykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIC8vIGZvcm1hdCBudW1iZXJpbmcgYmFzZWQgb24gdGhlIGJyb3dzZXIgbGFuZ3VhZ2VcbiAgICAgICAgY29uc3QgbnVtYmVyRm9ybWF0ID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2UsIHtcbiAgICAgICAgICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogMFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gSW5ib3VuZCBkYXRhXG4gICAgICAgIGNvbnN0IGluYm91bmREYXRhID0gTWF0aFV0aWxzLmZvcm1hdEJ5dGVzKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmJ5dGVzUmVjZWl2ZWQsIDIpO1xuICAgICAgICB0aGlzLmFkZE9yVXBkYXRlU2Vzc2lvblN0YXQoJ0luYm91bmREYXRhU3RhdCcsICdSZWNlaXZlZCcsIGluYm91bmREYXRhKTtcbiAgICAgICAgLy8gUGFja2V0cyBsb3N0XG4gICAgICAgIGNvbnN0IHBhY2tldHNMb3N0U3RhdCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cywgJ3BhY2tldHNMb3N0JylcbiAgICAgICAgICAgID8gbnVtYmVyRm9ybWF0LmZvcm1hdChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5wYWNrZXRzTG9zdClcbiAgICAgICAgICAgIDogJ0Nocm9tZSBvbmx5JztcbiAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdQYWNrZXRzTG9zdFN0YXQnLCAnUGFja2V0cyBMb3N0JywgcGFja2V0c0xvc3RTdGF0KTtcbiAgICAgICAgLy8gQml0cmF0ZVxuICAgICAgICBpZiAoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuYml0cmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdWaWRlb0JpdHJhdGVTdGF0JywgJ1ZpZGVvIEJpdHJhdGUgKGticHMpJywgc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuYml0cmF0ZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHMuaW5ib3VuZEF1ZGlvU3RhdHMuYml0cmF0ZSkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdBdWRpb0JpdHJhdGVTdGF0JywgJ0F1ZGlvIEJpdHJhdGUgKGticHMpJywgc3RhdHMuaW5ib3VuZEF1ZGlvU3RhdHMuYml0cmF0ZS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBWaWRlbyByZXNvbHV0aW9uXG4gICAgICAgIGNvbnN0IHJlc1N0YXQgPSBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZVdpZHRoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lV2lkdGggPiAwICYmXG4gICAgICAgICAgICBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZUhlaWdodCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZUhlaWdodCA+IDBcbiAgICAgICAgICAgID8gc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVXaWR0aCArICd4JyArIHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lSGVpZ2h0XG4gICAgICAgICAgICA6ICdDaHJvbWUgb25seSc7XG4gICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnVmlkZW9SZXNTdGF0JywgJ1ZpZGVvIHJlc29sdXRpb24nLCByZXNTdGF0KTtcbiAgICAgICAgLy8gRnJhbWVzIGRlY29kZWRcbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0RlY29kZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgZnJhbWVzRGVjb2RlZCA9IG51bWJlckZvcm1hdC5mb3JtYXQoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzRGVjb2RlZCk7XG4gICAgICAgICAgICB0aGlzLmFkZE9yVXBkYXRlU2Vzc2lvblN0YXQoJ0ZyYW1lc0RlY29kZWRTdGF0JywgJ0ZyYW1lcyBEZWNvZGVkJywgZnJhbWVzRGVjb2RlZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRnJhbWVyYXRlXG4gICAgICAgIGlmIChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNQZXJTZWNvbmQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnRnJhbWVyYXRlU3RhdCcsICdGcmFtZXJhdGUnLCBzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNQZXJTZWNvbmQudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRnJhbWVzIGRyb3BwZWRcbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0Ryb3BwZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdGcmFtZXNEcm9wcGVkU3RhdCcsICdGcmFtZXMgZHJvcHBlZCcsIHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0Ryb3BwZWQudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmNvZGVjSWQpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTZXNzaW9uU3RhdCgnVmlkZW9Db2RlY1N0YXQnLCAnVmlkZW8gY29kZWMnLCBcbiAgICAgICAgICAgIC8vIFNwbGl0IHRoZSBjb2RlYyB0byByZW1vdmUgdGhlIEZtdHAgbGluZVxuICAgICAgICAgICAgKF9iID0gKF9hID0gc3RhdHMuY29kZWNzLmdldChzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5jb2RlY0lkKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1pbWVUeXBlLnJlcGxhY2UoJ3ZpZGVvLycsICcnKSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogJycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0cy5pbmJvdW5kQXVkaW9TdGF0cy5jb2RlY0lkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE9yVXBkYXRlU2Vzc2lvblN0YXQoJ0F1ZGlvQ29kZWNTdGF0JywgJ0F1ZGlvIGNvZGVjJywgXG4gICAgICAgICAgICAvLyBTcGxpdCB0aGUgY29kZWMgdG8gcmVtb3ZlIHRoZSBGbXRwIGxpbmVcbiAgICAgICAgICAgIChfZCA9IChfYyA9IHN0YXRzLmNvZGVjcy5nZXQoc3RhdHMuaW5ib3VuZEF1ZGlvU3RhdHMuY29kZWNJZCkpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5taW1lVHlwZS5yZXBsYWNlKCdhdWRpby8nLCAnJykpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdG9yZSB0aGUgYWN0aXZlIGNhbmRpZGF0ZSBwYWlyIHJldHVybiBhIG5ldyBDYW5kaWRhdGUgcGFpciBzdGF0IGlmIGdldEFjdGl2ZUNhbmRpZGF0ZSBpcyBudWxsXG4gICAgICAgIGNvbnN0IGFjdGl2ZUNhbmRpZGF0ZVBhaXIgPSBzdGF0cy5nZXRBY3RpdmVDYW5kaWRhdGVQYWlyKCk7XG4gICAgICAgIGlmIChhY3RpdmVDYW5kaWRhdGVQYWlyKSB7XG4gICAgICAgICAgICAvLyBSVFRcbiAgICAgICAgICAgIGNvbnN0IG5ldFJUVCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhY3RpdmVDYW5kaWRhdGVQYWlyLCAnY3VycmVudFJvdW5kVHJpcFRpbWUnKSAmJlxuICAgICAgICAgICAgICAgIHN0YXRzLmlzTnVtYmVyKGFjdGl2ZUNhbmRpZGF0ZVBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUpXG4gICAgICAgICAgICAgICAgPyBNYXRoLmNlaWwoYWN0aXZlQ2FuZGlkYXRlUGFpci5jdXJyZW50Um91bmRUcmlwVGltZSAqIDEwMDApLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICA6IFwiQ2FuJ3QgY2FsY3VsYXRlXCI7XG4gICAgICAgICAgICB0aGlzLmFkZE9yVXBkYXRlU2Vzc2lvblN0YXQoJ1JUVFN0YXQnLCAnTmV0IFJUVCAobXMpJywgbmV0UlRUKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZE9yVXBkYXRlU2Vzc2lvblN0YXQoJ0R1cmF0aW9uU3RhdCcsICdEdXJhdGlvbicsIHN0YXRzLnNlc3Npb25TdGF0cy5ydW5UaW1lKTtcbiAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KCdDb250cm9sc0lucHV0U3RhdCcsICdDb250cm9scyBzdHJlYW0gaW5wdXQnLCBzdGF0cy5zZXNzaW9uU3RhdHMuY29udHJvbHNTdHJlYW1JbnB1dCk7XG4gICAgICAgIC8vIFFQXG4gICAgICAgIGlmIChzdGF0cy5zZXNzaW9uU3RhdHMudmlkZW9FbmNvZGVyQXZnUVAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIU51bWJlci5pc05hTihzdGF0cy5zZXNzaW9uU3RhdHMudmlkZW9FbmNvZGVyQXZnUVApKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE9yVXBkYXRlU2Vzc2lvblN0YXQoJ1FQU3RhdCcsICdWaWRlbyBxdWFudGl6YXRpb24gcGFyYW1ldGVyJywgc3RhdHMuc2Vzc2lvblN0YXRzLnZpZGVvRW5jb2RlckF2Z1FQLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIExvZ2dlci5JbmZvKGAtLS0tLS0tLS0gU3RhdHMgLS0tLS0tLS0tXFxuICR7SlNPTi5zdHJpbmdpZnkoc3RhdHMpfVxcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLWApO1xuICAgIH1cbiAgICBoYW5kbGVMYXRlbmN5SW5mbyhsYXRlbmN5SW5mbykge1xuICAgICAgICBpZiAobGF0ZW5jeUluZm8uZnJhbWVUaW1pbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gRW5jb2RlciBsYXRlbmN5XG4gICAgICAgICAgICBpZiAobGF0ZW5jeUluZm8uZnJhbWVUaW1pbmcuZW5jb2RlckxhdGVuY3lNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZUxhdGVuY3lTdGF0KCdFbmNvZGVMYXRlbmN5JywgJ0VuY29kZSBsYXRlbmN5IChtcyknLCBNYXRoLmNlaWwobGF0ZW5jeUluZm8uZnJhbWVUaW1pbmcuZW5jb2RlckxhdGVuY3lNcykudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQYWNrZXRpemVyIGxhdGVuY3lcbiAgICAgICAgICAgIGlmIChsYXRlbmN5SW5mby5mcmFtZVRpbWluZy5wYWNrZXRpemVMYXRlbmN5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkT3JVcGRhdGVMYXRlbmN5U3RhdCgnUGFja2V0aXplckxhdGVuY3knLCAnUGFja2V0aXplciBsYXRlbmN5IChtcyknLCBNYXRoLmNlaWwobGF0ZW5jeUluZm8uZnJhbWVUaW1pbmcucGFja2V0aXplTGF0ZW5jeU1zKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFBhY2VyIGxhdGVuY3lcbiAgICAgICAgICAgIGlmIChsYXRlbmN5SW5mby5mcmFtZVRpbWluZy5wYWNlckxhdGVuY3lNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZUxhdGVuY3lTdGF0KCdQYWNlckxhdGVuY3knLCAnUGFjZXIgbGF0ZW5jeSAobXMpJywgTWF0aC5jZWlsKGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nLnBhY2VyTGF0ZW5jeU1zKS50b1N0cmluZygpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFNlbmRlciBsYXRlbmN5IGNhbGN1bGF0ZWQgdXNpbmcgdGltaW5nIHN0YXRzXG4gICAgICAgICAgICBpZiAobGF0ZW5jeUluZm8uZnJhbWVUaW1pbmcuY2FwdHVyZVRvU2VuZExhdGVuY3lNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZUxhdGVuY3lTdGF0KCdWaWRlb1RpbWluZ0NhcHR1cmVUb1NlbmQnLCAnUG9zdC1jYXB0dXJlIHRvIHNlbmQgbGF0ZW5jeSAobXMpJywgTWF0aC5jZWlsKGxhdGVuY3lJbmZvLmZyYW1lVGltaW5nLmNhcHR1cmVUb1NlbmRMYXRlbmN5TXMpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsYXRlbmN5SW5mby5zZW5kZXJMYXRlbmN5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZUxhdGVuY3lTdGF0KCdBYnNDYXB0dXJlVGltZVRvU2VuZExhdGVuY3knLCAnUG9zdC1jYXB0dXJlIChhYnMtY3QpIHRvIHNlbmQgbGF0ZW5jeSAobXMpJywgTWF0aC5jZWlsKGxhdGVuY3lJbmZvLnNlbmRlckxhdGVuY3lNcykudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVuY3lJbmZvLmF2ZXJhZ2VBc3NlbWJseURlbGF5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZUxhdGVuY3lTdGF0KCdBdmdBc3NlbWJseURlbGF5JywgJ0Fzc2VtYmx5IGRlbGF5IChtcyknLCBNYXRoLmNlaWwobGF0ZW5jeUluZm8uYXZlcmFnZUFzc2VtYmx5RGVsYXlNcykudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVuY3lJbmZvLmF2ZXJhZ2VEZWNvZGVMYXRlbmN5TXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZUxhdGVuY3lTdGF0KCdBdmdEZWNvZGVEZWxheScsICdEZWNvZGUgdGltZSAobXMpJywgTWF0aC5jZWlsKGxhdGVuY3lJbmZvLmF2ZXJhZ2VEZWNvZGVMYXRlbmN5TXMpLnRvU3RyaW5nKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXRlbmN5SW5mby5hdmVyYWdlSml0dGVyQnVmZmVyRGVsYXlNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE9yVXBkYXRlTGF0ZW5jeVN0YXQoJ0F2Z0ppdHRlckJ1ZmZlckRlbGF5JywgJ0ppdHRlciBidWZmZXIgKG1zKScsIE1hdGguY2VpbChsYXRlbmN5SW5mby5hdmVyYWdlSml0dGVyQnVmZmVyRGVsYXlNcykudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhdGVuY3lJbmZvLmF2ZXJhZ2VQcm9jZXNzaW5nRGVsYXlNcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmFkZE9yVXBkYXRlTGF0ZW5jeVN0YXQoJ0F2Z1Byb2Nlc3NpbmdEZWxheScsICdQcm9jZXNzaW5nIGRlbGF5IChtcyknLCBNYXRoLmNlaWwobGF0ZW5jeUluZm8uYXZlcmFnZVByb2Nlc3NpbmdEZWxheU1zKS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGF0ZW5jeUluZm8uYXZlcmFnZUUyRUxhdGVuY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5hZGRPclVwZGF0ZUxhdGVuY3lTdGF0KCdBdmdFMkVMYXRlbmN5JywgJ1RvdGFsIGxhdGVuY3kgKG1zKScsIE1hdGguY2VpbChsYXRlbmN5SW5mby5hdmVyYWdlRTJFTGF0ZW5jeSkudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBzdGF0IHRvIHRoZSBzdGF0cyByZXN1bHRzIGluIHRoZSBET00gb3IgdXBkYXRlcyBhbiBleGl0aW5nIHN0YXQuXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBzdGF0IHRvIGFkZC91cGRhdGUuXG4gICAgICogQHBhcmFtIHN0YXQgLSBUaGUgY29udGVudHMgb2YgdGhlIHN0YXQuXG4gICAgICovXG4gICAgYWRkT3JVcGRhdGVTZXNzaW9uU3RhdChpZCwgc3RhdExhYmVsLCBzdGF0KSB7XG4gICAgICAgIHRoaXMuYWRkT3JVcGRhdGVTdGF0KFN0YXRzU2VjdGlvbnMuU2Vzc2lvblN0YXRzLCBpZCwgc3RhdExhYmVsLCBzdGF0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQWRkcyBhIG5ldyBzdGF0IHRvIHRoZSBsYXRlbmN5IHJlc3VsdHMgaW4gdGhlIERPTSBvciB1cGRhdGVzIGFuIGV4aXRpbmcgc3RhdC5cbiAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaWQgb2YgdGhlIHN0YXQgdG8gYWRkL3VwZGF0ZS5cbiAgICAgKiBAcGFyYW0gc3RhdCAtIFRoZSBjb250ZW50cyBvZiB0aGUgc3RhdC5cbiAgICAgKi9cbiAgICBhZGRPclVwZGF0ZUxhdGVuY3lTdGF0KGlkLCBzdGF0TGFiZWwsIHN0YXQpIHtcbiAgICAgICAgdGhpcy5hZGRPclVwZGF0ZVN0YXQoU3RhdHNTZWN0aW9ucy5MYXRlbmN5U3RhdHMsIGlkLCBzdGF0TGFiZWwsIHN0YXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBZGRzIGEgbmV3IHN0YXQgdG8gdGhlIHN0YXRzIHJlc3VsdHMgaW4gdGhlIERPTSBvciB1cGRhdGVzIGFuIGV4aXRpbmcgc3RhdC5cbiAgICAgKiBAcGFyYW0gc2VjdGlvbklkIC0gVGhlIHNlY3Rpb24gdG8gYWRkIHRoaXMgc3RhdCB0b28uXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIGlkIG9mIHRoZSBzdGF0IHRvIGFkZC91cGRhdGUuXG4gICAgICogQHBhcmFtIHN0YXQgLSBUaGUgY29udGVudHMgb2YgdGhlIHN0YXQuXG4gICAgICovXG4gICAgYWRkT3JVcGRhdGVTdGF0KHNlY3Rpb25JZCwgaWQsIHN0YXRMYWJlbCwgc3RhdCkge1xuICAgICAgICBpZiAoc2VjdGlvbklkID09PSBTdGF0c1NlY3Rpb25zLlNlc3Npb25TdGF0cyAmJlxuICAgICAgICAgICAgIWlzU2VjdGlvbkVuYWJsZWQodGhpcy5fY29uZmlnLCBTdGF0c1NlY3Rpb25zLlNlc3Npb25TdGF0cykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VjdGlvbklkID09PSBTdGF0c1NlY3Rpb25zLkxhdGVuY3lTdGF0cyAmJlxuICAgICAgICAgICAgIWlzU2VjdGlvbkVuYWJsZWQodGhpcy5fY29uZmlnLCBTdGF0c1NlY3Rpb25zLkxhdGVuY3lTdGF0cykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBPbmx5IHN1cHBvcnQgc2Vzc2lvbiBvciBsYXRlbmN5IHN0YXRzIGJlaW5nIHVwZGF0ZWQgaW4gdGhpcyBmdW5jdGlvbiBjdXJyZW50bHlcbiAgICAgICAgaWYgKHNlY3Rpb25JZCAhPT0gU3RhdHNTZWN0aW9ucy5TZXNzaW9uU3RhdHMgJiYgc2VjdGlvbklkICE9PSBTdGF0c1NlY3Rpb25zLkxhdGVuY3lTdGF0cykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudEVsZW0gPSBzZWN0aW9uSWQgPT09IFN0YXRzU2VjdGlvbnMuU2Vzc2lvblN0YXRzID8gdGhpcy5zdGF0c1Jlc3VsdCA6IHRoaXMubGF0ZW5jeVJlc3VsdDtcbiAgICAgICAgY29uc3Qgc3RhdEhUTUwgPSBgJHtzdGF0TGFiZWx9OiAke3N0YXR9YDtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRzTWFwLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSB0aGUgc3RhdFxuICAgICAgICAgICAgY29uc3QgbmV3U3RhdCA9IG5ldyBTdGF0KCk7XG4gICAgICAgICAgICBuZXdTdGF0LmlkID0gaWQ7XG4gICAgICAgICAgICBuZXdTdGF0LnN0YXQgPSBzdGF0O1xuICAgICAgICAgICAgbmV3U3RhdC50aXRsZSA9IHN0YXRMYWJlbDtcbiAgICAgICAgICAgIG5ld1N0YXQuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgbmV3U3RhdC5lbGVtZW50LmlubmVySFRNTCA9IHN0YXRIVE1MO1xuICAgICAgICAgICAgLy8gYWRkIHRoZSBzdGF0IHRvIHRoZSBkb21cbiAgICAgICAgICAgIHBhcmVudEVsZW0uYXBwZW5kQ2hpbGQobmV3U3RhdC5lbGVtZW50KTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHNNYXAuc2V0KGlkLCBuZXdTdGF0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1cGRhdGUgdGhlIGV4aXN0aW5nIHN0YXRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc3RhdHNNYXAuZ2V0KGlkKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUuZWxlbWVudC5pbm5lckhUTUwgPSBzdGF0SFRNTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVN0YXRzUGFuZWwuanMubWFwIiwiLy8gQ29weXJpZ2h0IEVwaWMgR2FtZXMsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbmV4cG9ydCBjbGFzcyBFeHRyYUZsYWdzIHtcbn1cbkV4dHJhRmxhZ3MuTGlnaHRNb2RlID0gJ0xpZ2h0TW9kZSc7XG4vKipcbiAqIEFsbCB0aGUgVUkgc2VjdGlvbnMgYWNyb3NzIGFsbCB0aGUgcGFuZWxzLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ3NTZWN0aW9ucyB7XG59XG5TZXR0aW5nc1NlY3Rpb25zLlBpeGVsU3RyZWFtaW5nID0gJ1BpeGVsIFN0cmVhbWluZyc7XG5TZXR0aW5nc1NlY3Rpb25zLlVJID0gJ1VJJztcblNldHRpbmdzU2VjdGlvbnMuSW5wdXQgPSAnSW5wdXQnO1xuU2V0dGluZ3NTZWN0aW9ucy5FbmNvZGVyID0gJ0VuY29kZXInO1xuU2V0dGluZ3NTZWN0aW9ucy5XZWJSVEMgPSAnV2ViUlRDJztcblNldHRpbmdzU2VjdGlvbnMuQ29tbWFuZHMgPSAnQ29tbWFuZHMnO1xuZXhwb3J0IGNsYXNzIFN0YXRzU2VjdGlvbnMge1xufVxuU3RhdHNTZWN0aW9ucy5TZXNzaW9uU3RhdHMgPSAnU2Vzc2lvbiBTdGF0cyc7XG5TdGF0c1NlY3Rpb25zLkxhdGVuY3lTdGF0cyA9ICdMYXRlbmN5IFN0YXRzJztcblN0YXRzU2VjdGlvbnMuTGF0ZW5jeVRlc3QgPSAnTGF0ZW5jeSBUZXN0JztcblN0YXRzU2VjdGlvbnMuRGF0YUNoYW5uZWxMYXRlbmN5VGVzdCA9ICdEYXRhIENoYW5uZWwgTGF0ZW5jeSBUZXN0Jztcbi8qKiBXaGV0aGVyIGEgc3RyZWFtIFVJIGVsZW1lbnQgaXMgaW50ZXJuYWxseSBtYWRlLCBleHRlcm5hbGx5IHByb3ZpZGVkLCBvciBkaXNhYmxlZC4gKi9cbmV4cG9ydCB2YXIgVUlFbGVtZW50Q3JlYXRpb25Nb2RlO1xuKGZ1bmN0aW9uIChVSUVsZW1lbnRDcmVhdGlvbk1vZGUpIHtcbiAgICBVSUVsZW1lbnRDcmVhdGlvbk1vZGVbVUlFbGVtZW50Q3JlYXRpb25Nb2RlW1wiQ3JlYXRlRGVmYXVsdEVsZW1lbnRcIl0gPSAwXSA9IFwiQ3JlYXRlRGVmYXVsdEVsZW1lbnRcIjtcbiAgICBVSUVsZW1lbnRDcmVhdGlvbk1vZGVbVUlFbGVtZW50Q3JlYXRpb25Nb2RlW1wiVXNlQ3VzdG9tRWxlbWVudFwiXSA9IDFdID0gXCJVc2VDdXN0b21FbGVtZW50XCI7XG4gICAgVUlFbGVtZW50Q3JlYXRpb25Nb2RlW1VJRWxlbWVudENyZWF0aW9uTW9kZVtcIkRpc2FibGVcIl0gPSAyXSA9IFwiRGlzYWJsZVwiO1xufSkoVUlFbGVtZW50Q3JlYXRpb25Nb2RlIHx8IChVSUVsZW1lbnRDcmVhdGlvbk1vZGUgPSB7fSkpO1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGFuZWxFbmFibGVkKGNvbmZpZykge1xuICAgIHJldHVybiAhY29uZmlnIHx8ICghIWNvbmZpZyAmJiBjb25maWcuaXNFbmFibGVkKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1NlY3Rpb25FbmFibGVkKGNvbmZpZywgc2VjdGlvbikge1xuICAgIHJldHVybiAoIWNvbmZpZyB8fFxuICAgICAgICAoISFjb25maWcgJiZcbiAgICAgICAgICAgICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZy5zZWN0aW9uVmlzaWJpbGl0eSwgc2VjdGlvbikgfHxcbiAgICAgICAgICAgICAgICAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZy5zZWN0aW9uVmlzaWJpbGl0eSwgc2VjdGlvbikgJiZcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNlY3Rpb25WaXNpYmlsaXR5W3NlY3Rpb25dKSkpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1NldHRpbmdFbmFibGVkKGNvbmZpZywgc2V0dGluZykge1xuICAgIHJldHVybiAoIWNvbmZpZyB8fFxuICAgICAgICAoISFjb25maWcgJiZcbiAgICAgICAgICAgICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZy5zZXR0aW5nVmlzaWJpbGl0eSwgc2V0dGluZykgfHxcbiAgICAgICAgICAgICAgICAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZy5zZXR0aW5nVmlzaWJpbGl0eSwgc2V0dGluZykgJiZcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNldHRpbmdWaXNpYmlsaXR5W3NldHRpbmddKSkpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVVJQ29uZmlndXJhdGlvblR5cGVzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4vKipcbiAqIEEgVUkgZWxlbWVudCBzaG93aW5nIHRoZSBRUCAocXVhbnRpemF0aW9uIHBhcmFtZXRlcikgb2YgdGhlIHZpZGVvIHN0cmVhbSBhdCB0aGUgbGFzdCBlbmNvZGVkIGZyYW1lICh3ZWxsLCBsYXN0IHRyYW5zbWl0dGVkIFFQIHJlYWxseSkuXG4gKiBBIGJsb2NraWVyIGVuY29kaW5nIHdpbGwgaGF2ZSBhIGhpZ2hlciBRUCBhbmQgdGhpcyB3aWxsIG1ha2UgdGhlIGluZGljYXRvciB0dXJuIG1vcmUgcmVkLlxuICogQSBub24tYmxvY2t5IHN0cmVhbSB3aWxsIGhhdmUgYSBsb3dlciBRUCBhbmQgdGhpcyB3aWxsIG1ha2UgdGhlIGluZGljYXRvciB0dXJuIG1vcmUgZ3JlZW4uXG4gKiBUaGUgUVAgaW5kaWNhdG9yIGlzIHJlcHJlc2VudGVkIHZpc3VhbGx5IHVzaW5nIGEgV2lGaSBpY29uLlxuICovXG5leHBvcnQgY2xhc3MgVmlkZW9RcEluZGljYXRvciB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICAgIHRoaXMudmlkZW9FbmNvZGVyQXZnUVAgPSAtMTtcbiAgICAgICAgLy8gbm9uIGh0bWwgZWxlbWVudHNcbiAgICAgICAgdGhpcy5zdGF0c1RleHQgPSAnJztcbiAgICAgICAgdGhpcy5jb2xvciA9ICcnO1xuICAgICAgICAvLyBxcCBjb2xvcnNcbiAgICAgICAgdGhpcy5vcmFuZ2VRUCA9IDI2O1xuICAgICAgICB0aGlzLnJlZFFQID0gMzU7XG4gICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgUVAgaW5kaWNhdG9yLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcm9vdCBlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlIHN2ZyBmb3IgdGhlIGNvbm5lY3Rpb25cbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5pZCA9ICdjb25uZWN0aW9uJztcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ1VpVG9vbCcpO1xuICAgICAgICAgICAgLy8gYWRkIHN2ZyBpY29uIGZvciB0aGUgY29ubmVjdGlvbiBzdHJlbmd0aFxuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5xdWFsaXR5U3RhdHVzKTtcbiAgICAgICAgICAgIC8vIGFkZCB0aGUgdGV4dCB1bmRlcm5lYXRoIHRoZSBjb25uZWN0aW9uXG4gICAgICAgICAgICB0aGlzLl9yb290RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnF1YWxpdHlUZXh0KTtcbiAgICAgICAgICAgIC8vIHNldCBjb2xvcnMgdG8gbm90IGNvbm5lY3RlZCBpbml0aWFsbHlcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUXBUb29sdGlwKC0xKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcm9vdEVsZW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdGV4dCB0aGF0IGRpc3BsYXlzIHVuZGVyIHRoZSBpY29uLlxuICAgICAqL1xuICAgIGdldCBxdWFsaXR5VGV4dCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9xdWFsaXR5VGV4dCkge1xuICAgICAgICAgICAgdGhpcy5fcXVhbGl0eVRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICB0aGlzLl9xdWFsaXR5VGV4dC5pZCA9ICdxdWFsaXR5VGV4dCc7XG4gICAgICAgICAgICB0aGlzLl9xdWFsaXR5VGV4dC5jbGFzc0xpc3QuYWRkKCd0b29sdGlwdGV4dCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9xdWFsaXR5VGV4dDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBpY29uLlxuICAgICAqL1xuICAgIGdldCBxdWFsaXR5U3RhdHVzKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3F1YWxpdHlTdGF0dXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3F1YWxpdHlTdGF0dXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3N2ZycpO1xuICAgICAgICAgICAgdGhpcy5fcXVhbGl0eVN0YXR1cy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaWQnLCAnY29ubmVjdGlvblN0cmVuZ3RoJyk7XG4gICAgICAgICAgICB0aGlzLl9xdWFsaXR5U3RhdHVzLnNldEF0dHJpYnV0ZU5TKG51bGwsICd4JywgJzBweCcpO1xuICAgICAgICAgICAgdGhpcy5fcXVhbGl0eVN0YXR1cy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAneScsICcwcHgnKTtcbiAgICAgICAgICAgIHRoaXMuX3F1YWxpdHlTdGF0dXMuc2V0QXR0cmlidXRlTlMobnVsbCwgJ3ZpZXdCb3gnLCAnMCAwIDQ5NC40NSA0OTQuNDUnKTtcbiAgICAgICAgICAgIC8vIGJ1aWxkIHdpZmkgaWNvblxuICAgICAgICAgICAgdGhpcy5xdWFsaXR5U3RhdHVzLmFwcGVuZENoaWxkKHRoaXMuZG90KTtcbiAgICAgICAgICAgIHRoaXMucXVhbGl0eVN0YXR1cy5hcHBlbmRDaGlsZCh0aGlzLm1pZGRsZSk7XG4gICAgICAgICAgICB0aGlzLnF1YWxpdHlTdGF0dXMuYXBwZW5kQ2hpbGQodGhpcy5vdXRlcik7XG4gICAgICAgICAgICB0aGlzLnF1YWxpdHlTdGF0dXMuYXBwZW5kQ2hpbGQodGhpcy5pbm5lcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3F1YWxpdHlTdGF0dXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgZG90IGF0IHRoZSBib3R0b20gb2YgdGhlIHdpZmkgaWNvbi5cbiAgICAgKi9cbiAgICBnZXQgZG90KCkge1xuICAgICAgICBpZiAoIXRoaXMuX2RvdCkge1xuICAgICAgICAgICAgdGhpcy5fZG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdjaXJjbGUnKTtcbiAgICAgICAgICAgIHRoaXMuX2RvdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaWQnLCAnZG90Jyk7XG4gICAgICAgICAgICB0aGlzLl9kb3Quc2V0QXR0cmlidXRlTlMobnVsbCwgJ2N4JywgJzI0Ny4xMjUnKTtcbiAgICAgICAgICAgIHRoaXMuX2RvdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnY3knLCAnMzk4LjkyNScpO1xuICAgICAgICAgICAgdGhpcy5fZG90LnNldEF0dHJpYnV0ZU5TKG51bGwsICdyJywgJzM1LjMnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZG90O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG91dGVyIGFyYyBvZiB0aGUgd2lmaSBpY29uLlxuICAgICAqL1xuICAgIGdldCBvdXRlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9vdXRlcikge1xuICAgICAgICAgICAgdGhpcy5fb3V0ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIHRoaXMuX291dGVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdpZCcsICdvdXRlcicpO1xuICAgICAgICAgICAgdGhpcy5fb3V0ZXIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTQ2Ny45MjUsMjA0LjYyNWMtNi44LDAtMTMuNS0yLjYtMTguNy03LjhjLTExMS41LTExMS40LTI5Mi43LTExMS40LTQwNC4xLDBjLTEwLjMsMTAuMy0yNy4xLDEwLjMtMzcuNCwwcy0xMC4zLTI3LjEsMC0zNy40YzY0LTY0LDE0OS05OS4yLDIzOS41LTk5LjJzMTc1LjUsMzUuMiwyMzkuNSw5OS4yYzEwLjMsMTAuMywxMC4zLDI3LjEsMCwzNy40QzQ4MS40MjUsMjAyLjAyNSw0NzQuNjI1LDIwNC42MjUsNDY3LjkyNSwyMDQuNjI1eicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9vdXRlcjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtaWRkbGUgYXJjIG9mIHRoZSB3aWZpIGljb24uXG4gICAgICovXG4gICAgZ2V0IG1pZGRsZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9taWRkbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX21pZGRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpO1xuICAgICAgICAgICAgdGhpcy5fbWlkZGxlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdpZCcsICdtaWRkbGUnKTtcbiAgICAgICAgICAgIHRoaXMuX21pZGRsZS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZCcsICdNMzk1LjIyNSwyNzcuMzI1Yy02LjgsMC0xMy41LTIuNi0xOC43LTcuOGMtNzEuNC03MS4zLTE4Ny40LTcxLjMtMjU4LjgsMGMtMTAuMywxMC4zLTI3LjEsMTAuMy0zNy40LDBzLTEwLjMtMjcuMSwwLTM3LjRjOTItOTIsMjQxLjYtOTIsMzMzLjYsMGMxMC4zLDEwLjMsMTAuMywyNy4xLDAsMzcuNEM0MDguNzI1LDI3NC43MjUsNDAxLjkyNSwyNzcuMzI1LDM5NS4yMjUsMjc3LjMyNXonKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbWlkZGxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGlubmVyIGFyYyBvZiB0aGUgd2lmaSBpY29uLlxuICAgICAqL1xuICAgIGdldCBpbm5lcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pbm5lcikge1xuICAgICAgICAgICAgdGhpcy5faW5uZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIHRoaXMuX2lubmVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdpZCcsICdpbm5lcicpO1xuICAgICAgICAgICAgdGhpcy5faW5uZXIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTMyMy42MjUsMzQ4LjgyNWMtNi44LDAtMTMuNS0yLjYtMTguNy03LjhjLTE1LjQtMTUuNC0zNi0yMy45LTU3LjgtMjMuOXMtNDIuNCw4LjUtNTcuOCwyMy45Yy0xMC4zLDEwLjMtMjcuMSwxMC4zLTM3LjQsMGMtMTAuMy0xMC4zLTEwLjMtMjcuMSwwLTM3LjRjMjUuNC0yNS40LDU5LjItMzkuNCw5NS4yLTM5LjRzNjkuOCwxNCw5NS4yLDM5LjVjMTAuMywxMC4zLDEwLjMsMjcuMSwwLDM3LjRDMzM3LjIyNSwzNDYuMjI1LDMzMC40MjUsMzQ4LjgyNSwzMjMuNjI1LDM0OC44MjV6Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2lubmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHNldCB0aGUgc3BlZWQgb2YgdGhlIHN0YXR1cyBsaWdodC5cbiAgICAgKiBAcGFyYW0gc3BlZWQgLSBTZXQgdGhlIHNwZWVkIG9mIHRoZSBibGluaywgaGlnaGVyIG51bWJlcnMgbWFrZSB0aGUgc3RhdHVzIGxpZ2h0IGJsaW5rIGZhc3Rlci5cbiAgICAgKi9cbiAgICBibGlua1ZpZGVvUXVhbGl0eVN0YXR1cyhzcGVlZCkge1xuICAgICAgICBsZXQgaXRlcmF0aW9uID0gc3BlZWQ7XG4gICAgICAgIGxldCBvcGFjaXR5ID0gMTtcbiAgICAgICAgY29uc3QgdGlja0lEID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgb3BhY2l0eSAtPSAwLjE7XG4gICAgICAgICAgICB0aGlzLnF1YWxpdHlUZXh0LnN0eWxlLm9wYWNpdHkgPSBTdHJpbmcoTWF0aC5hYnMoKG9wYWNpdHkgLSAwLjUpICogMikpO1xuICAgICAgICAgICAgaWYgKG9wYWNpdHkgPD0gMC4xKSB7XG4gICAgICAgICAgICAgICAgaWYgKC0taXRlcmF0aW9uID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbCh0aWNrSUQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAxMDAgLyBzcGVlZCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIHVwZGF0ZXMgdGhlIFFQIHRvb2x0aXAgYnkgY29udmVydGluZyB0aGUgVmlkZW8gRW5jb2RlciBRUCB0byBhIGNvbG9yIGxpZ2h0XG4gICAgICogQHBhcmFtIFFQIC0gVGhlIHZpZGVvIGVuY29kZXIgUVAgbnVtYmVyIG5lZWRlZCB0byBmaW5kIHRoZSBhdmVyYWdlXG4gICAgICovXG4gICAgdXBkYXRlUXBUb29sdGlwKFFQKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy52aWRlb0VuY29kZXJBdmdRUCA9IFFQO1xuICAgICAgICBpZiAoUVAgPiB0aGlzLnJlZFFQKSB7XG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gJ3JlZCc7XG4gICAgICAgICAgICB0aGlzLmJsaW5rVmlkZW9RdWFsaXR5U3RhdHVzKDIpO1xuICAgICAgICAgICAgdGhpcy5zdGF0c1RleHQgPSBgPGRpdiBzdHlsZT1cImNvbG9yOiAke3RoaXMuY29sb3J9XCI+UG9vciBlbmNvZGluZyBxdWFsaXR5PC9kaXY+YDtcbiAgICAgICAgICAgIHRoaXMub3V0ZXIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCAnIzNjM2I0MCcpO1xuICAgICAgICAgICAgdGhpcy5taWRkbGUuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCAnIzNjM2I0MCcpO1xuICAgICAgICAgICAgdGhpcy5pbm5lci5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsIHRoaXMuY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5kb3Quc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCB0aGlzLmNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChRUCA+IHRoaXMub3JhbmdlUVApIHtcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSAnb3JhbmdlJztcbiAgICAgICAgICAgIHRoaXMuYmxpbmtWaWRlb1F1YWxpdHlTdGF0dXMoMSk7XG4gICAgICAgICAgICB0aGlzLnN0YXRzVGV4dCA9IGA8ZGl2IHN0eWxlPVwiY29sb3I6ICR7dGhpcy5jb2xvcn1cIj5CbG9ja3kgZW5jb2RpbmcgcXVhbGl0eTwvZGl2PmA7XG4gICAgICAgICAgICB0aGlzLm91dGVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMzYzNiNDAnKTtcbiAgICAgICAgICAgIHRoaXMubWlkZGxlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgdGhpcy5jb2xvcik7XG4gICAgICAgICAgICB0aGlzLmlubmVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgdGhpcy5jb2xvcik7XG4gICAgICAgICAgICB0aGlzLmRvdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsIHRoaXMuY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFFQIDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29sb3IgPSAnI2IwYjBiMCc7XG4gICAgICAgICAgICB0aGlzLm91dGVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMzYzNiNDAnKTtcbiAgICAgICAgICAgIHRoaXMubWlkZGxlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgJyMzYzNiNDAnKTtcbiAgICAgICAgICAgIHRoaXMuaW5uZXIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCAnIzNjM2I0MCcpO1xuICAgICAgICAgICAgdGhpcy5kb3Quc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCAnIzNjM2I0MCcpO1xuICAgICAgICAgICAgdGhpcy5zdGF0c1RleHQgPSBgPGRpdiBzdHlsZT1cImNvbG9yOiAke3RoaXMuY29sb3J9XCI+Tm90IGNvbm5lY3RlZDwvZGl2PmA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbG9yID0gJ2xpbWUnO1xuICAgICAgICAgICAgdGhpcy5xdWFsaXR5U3RhdHVzLnN0eWxlLm9wYWNpdHkgPSAoKF9hID0gdGhpcy5jb25maWcpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5oaWRlV2hlbkdvb2QpID09IHRydWUgPyAnMCcgOiAnMSc7XG4gICAgICAgICAgICB0aGlzLnN0YXRzVGV4dCA9IGA8ZGl2IHN0eWxlPVwiY29sb3I6ICR7dGhpcy5jb2xvcn1cIj5DbGVhciBlbmNvZGluZyBxdWFsaXR5PC9kaXY+YDtcbiAgICAgICAgICAgIHRoaXMub3V0ZXIuc2V0QXR0cmlidXRlTlMobnVsbCwgJ2ZpbGwnLCB0aGlzLmNvbG9yKTtcbiAgICAgICAgICAgIHRoaXMubWlkZGxlLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgdGhpcy5jb2xvcik7XG4gICAgICAgICAgICB0aGlzLmlubmVyLnNldEF0dHJpYnV0ZU5TKG51bGwsICdmaWxsJywgdGhpcy5jb2xvcik7XG4gICAgICAgICAgICB0aGlzLmRvdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnZmlsbCcsIHRoaXMuY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVhbGl0eVRleHQuaW5uZXJIVE1MID0gdGhpcy5zdGF0c1RleHQ7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9VmlkZW9RcEluZGljYXRvci5qcy5tYXAiLCIvLyBDb3B5cmlnaHQgRXBpYyBHYW1lcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLyoqXG4gKiBYUiBpY29uIHRoYXQgY2FuIGJlIGNsaWNrZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBYUkljb24ge1xuICAgIC8qKlxuICAgICAqIEdldCB0aGUgdGhlIGJ1dHRvbiBjb250YWluaW5nIHRoZSBYUiBpY29uLlxuICAgICAqL1xuICAgIGdldCByb290RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290RWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LnR5cGUgPSAnYnV0dG9uJztcbiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ1VpVG9vbCcpO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuaWQgPSAneHJCdG4nO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy54ckljb24pO1xuICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy50b29sdGlwVGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3RFbGVtZW50O1xuICAgIH1cbiAgICBnZXQgdG9vbHRpcFRleHQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9vbHRpcFRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgdGhpcy5fdG9vbHRpcFRleHQuY2xhc3NMaXN0LmFkZCgndG9vbHRpcHRleHQnKTtcbiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBUZXh0LmlubmVySFRNTCA9ICdYUic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rvb2x0aXBUZXh0O1xuICAgIH1cbiAgICBnZXQgeHJJY29uKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3hySWNvbikge1xuICAgICAgICAgICAgdGhpcy5feHJJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKTtcbiAgICAgICAgICAgIHRoaXMuX3hySWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCAnaWQnLCAneHJJY29uJyk7XG4gICAgICAgICAgICB0aGlzLl94ckljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3gnLCAnMHB4Jyk7XG4gICAgICAgICAgICB0aGlzLl94ckljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3knLCAnMHB4Jyk7XG4gICAgICAgICAgICB0aGlzLl94ckljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgJ3ZpZXdCb3gnLCAnMCAwIDEwMCAxMDAnKTtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBzdmcgZ3JvdXAgZm9yIHRoZSBwYXRoc1xuICAgICAgICAgICAgY29uc3Qgc3ZnR3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ2cnKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmNsYXNzTGlzdC5hZGQoJ3N2Z0ljb24nKTtcbiAgICAgICAgICAgIHRoaXMuX3hySWNvbi5hcHBlbmRDaGlsZChzdmdHcm91cCk7XG4gICAgICAgICAgICAvLyBjcmVhdGUgcGF0aHMgZm9yIHRoZSBpY29uIGl0c2VsZiwgdGhlIHBhdGggb2YgdGhlIHhyIGhlYWRzZXRcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgJ3BhdGgnKTtcbiAgICAgICAgICAgIHBhdGguc2V0QXR0cmlidXRlTlMobnVsbCwgJ2QnLCAnTTI5IDQxYy01IDAtOSA0LTkgOXM0IDkgOSA5IDktNCA5LTktNC05LTktOXptMCAxNGMtMi44IDAtNS0yLjItNS01czIuMi01IDUtNSA1IDIuMiA1IDUtMi4yIDUtNSA1em00Mi0xNGMtNSAwLTkgNC05IDlzNCA5IDkgOSA5LTQgOS05LTQtOS05LTl6bTAgMTRjLTIuOCAwLTUtMi4yLTUtNXMyLjItNSA1LTUgNSAyLjIgNSA1LTIuMiA1LTUgNXptMTItMzFIMTdjLTYuNiAwLTEyIDUuNC0xMiAxMnYyOGMwIDYuNiA1LjQgMTIgMTIgMTJoMTQuNWMzLjUgMCA2LjgtMS41IDktNC4xbDMuNS00YzEuNS0xLjcgMy43LTIuNyA2LTIuN3M0LjUgMSA2IDIuN2wzLjUgNGMyLjMgMi42IDUuNiA0LjEgOSA0LjFIODNjNi42IDAgMTItNS40IDEyLTEyVjM2YzAtNi42LTUuNC0xMi0xMi0xMnptOCA0MGMwIDQuNC0zLjYgOC04IDhINjguNWMtMi4zIDAtNC41LTEtNi0yLjdsLTMuNS00Yy0yLjMtMi42LTUuNi00LjEtOS00LjEtMy41IDAtNi44IDEuNS05IDQuMWwtMy41IDRDMzYgNzEgMzMuOCA3MiAzMS41IDcySDE3Yy00LjQgMC04LTMuNi04LThWMzZjMC00LjQgMy42LTggOC04aDY2YzQuNCAwIDggMy42IDggOHYyOHonKTtcbiAgICAgICAgICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl94ckljb247XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9WFJJY29uLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5leHBvcnQgY2xhc3MgTWF0aFV0aWxzIHtcbiAgICAvKipcbiAgICAgKiBmb3JtYXRzIEJ5dGVzIGNvbWluZyBpbiBmb3IgdmlkZW8gc3RhdHNcbiAgICAgKiBAcGFyYW0gYnl0ZXMgLSBudW1iZXIgdG8gY29udmVydFxuICAgICAqIEBwYXJhbSBkZWNpbWFscyAtIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlc1xuICAgICAqL1xuICAgIHN0YXRpYyBmb3JtYXRCeXRlcyhieXRlcywgZGVjaW1hbHMpIHtcbiAgICAgICAgaWYgKGJ5dGVzID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gJzAnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZhY3RvciA9IDEwMjQ7XG4gICAgICAgIGNvbnN0IGRtID0gZGVjaW1hbHMgPCAwID8gMCA6IGRlY2ltYWxzO1xuICAgICAgICBjb25zdCBzaXplcyA9IFsnQnl0ZXMnLCAnS2lCJywgJ01pQicsICdHaUInLCAnVGlCJywgJ1BpQicsICdFaUInLCAnWmlCJywgJ1lpQiddO1xuICAgICAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhmYWN0b3IpKTtcbiAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoKGJ5dGVzIC8gTWF0aC5wb3coZmFjdG9yLCBpKSkudG9GaXhlZChkbSkpICsgJyAnICsgc2l6ZXNbaV07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TWF0aFV0aWxzLmpzLm1hcCIsIi8vIENvcHlyaWdodCBFcGljIEdhbWVzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG5leHBvcnQgeyBBcHBsaWNhdGlvbiB9IGZyb20gJy4vQXBwbGljYXRpb24vQXBwbGljYXRpb24nO1xuZXhwb3J0IHsgUGl4ZWxTdHJlYW1pbmdBcHBsaWNhdGlvblN0eWxlIH0gZnJvbSAnLi9TdHlsZXMvUGl4ZWxTdHJlYW1pbmdBcHBsaWNhdGlvblN0eWxlcyc7XG5leHBvcnQgeyBBRktPdmVybGF5IH0gZnJvbSAnLi9PdmVybGF5L0FGS092ZXJsYXknO1xuZXhwb3J0IHsgQWN0aW9uT3ZlcmxheSB9IGZyb20gJy4vT3ZlcmxheS9BY3Rpb25PdmVybGF5JztcbmV4cG9ydCB7IE92ZXJsYXlCYXNlIH0gZnJvbSAnLi9PdmVybGF5L0Jhc2VPdmVybGF5JztcbmV4cG9ydCB7IENvbm5lY3RPdmVybGF5IH0gZnJvbSAnLi9PdmVybGF5L0Nvbm5lY3RPdmVybGF5JztcbmV4cG9ydCB7IERpc2Nvbm5lY3RPdmVybGF5IH0gZnJvbSAnLi9PdmVybGF5L0Rpc2Nvbm5lY3RPdmVybGF5JztcbmV4cG9ydCB7IEVycm9yT3ZlcmxheSB9IGZyb20gJy4vT3ZlcmxheS9FcnJvck92ZXJsYXknO1xuZXhwb3J0IHsgSW5mb092ZXJsYXkgfSBmcm9tICcuL092ZXJsYXkvSW5mb092ZXJsYXknO1xuZXhwb3J0IHsgUGxheU92ZXJsYXkgfSBmcm9tICcuL092ZXJsYXkvUGxheU92ZXJsYXknO1xuZXhwb3J0IHsgVGV4dE92ZXJsYXkgfSBmcm9tICcuL092ZXJsYXkvVGV4dE92ZXJsYXknO1xuZXhwb3J0IHsgQ29uZmlnVUkgfSBmcm9tICcuL0NvbmZpZy9Db25maWdVSSc7XG5leHBvcnQgeyBTZXR0aW5nVUlCYXNlIH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ1VJQmFzZSc7XG5leHBvcnQgeyBTZXR0aW5nVUlGbGFnIH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ1VJRmxhZyc7XG5leHBvcnQgeyBTZXR0aW5nVUlOdW1iZXIgfSBmcm9tICcuL0NvbmZpZy9TZXR0aW5nVUlOdW1iZXInO1xuZXhwb3J0IHsgU2V0dGluZ1VJT3B0aW9uIH0gZnJvbSAnLi9Db25maWcvU2V0dGluZ1VJT3B0aW9uJztcbmV4cG9ydCB7IFNldHRpbmdVSVRleHQgfSBmcm9tICcuL0NvbmZpZy9TZXR0aW5nVUlUZXh0JztcbmV4cG9ydCB7IFVJRWxlbWVudENyZWF0aW9uTW9kZSB9IGZyb20gJy4vVUkvVUlDb25maWd1cmF0aW9uVHlwZXMnO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS5qcy5tYXAiLCIvKipcbiAqIGFzc2VydCB0aGF0IGNvbmRpdGlvbiBpcyB0cnVlIG9yIHRocm93IGVycm9yICh3aXRoIG1lc3NhZ2UpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uLCBtc2cpIHtcbiAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICB9XG59XG4vKipcbiAqIGFzc2VydCB0aGF0IHZhbHVlIGNhbm5vdCBleGlzdCA9IHR5cGUgYG5ldmVyYC4gdGhyb3cgcnVudGltZSBlcnJvciBpZiBpdCBkb2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIodmFsdWUsIG1zZykge1xuICAgIHRocm93IG5ldyBFcnJvcihtc2cgIT09IG51bGwgJiYgbXNnICE9PSB2b2lkIDAgPyBtc2cgOiAnVW5leHBlY3RlZCBvYmplY3Q6ICcgKyB2YWx1ZSk7XG59XG5jb25zdCBGTE9BVDMyX01BWCA9IDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIEZMT0FUMzJfTUlOID0gLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIFVJTlQzMl9NQVggPSAweEZGRkZGRkZGLCBJTlQzMl9NQVggPSAwWDdGRkZGRkZGLCBJTlQzMl9NSU4gPSAtMFg4MDAwMDAwMDtcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRJbnQzMihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gXCJudW1iZXJcIilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGludCAzMjogJyArIHR5cGVvZiBhcmcpO1xuICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcihhcmcpIHx8IGFyZyA+IElOVDMyX01BWCB8fCBhcmcgPCBJTlQzMl9NSU4pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnQgMzI6ICcgKyBhcmcpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFVJbnQzMihhcmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZyAhPT0gXCJudW1iZXJcIilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHVpbnQgMzI6ICcgKyB0eXBlb2YgYXJnKTtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYXJnKSB8fCBhcmcgPiBVSU5UMzJfTUFYIHx8IGFyZyA8IDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB1aW50IDMyOiAnICsgYXJnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRGbG9hdDMyKGFyZykge1xuICAgIGlmICh0eXBlb2YgYXJnICE9PSBcIm51bWJlclwiKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmxvYXQgMzI6ICcgKyB0eXBlb2YgYXJnKTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShhcmcpKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKGFyZyA+IEZMT0FUMzJfTUFYIHx8IGFyZyA8IEZMT0FUMzJfTUlOKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmxvYXQgMzI6ICcgKyBhcmcpO1xufVxuIiwiLy8gbG9va3VwIHRhYmxlIGZyb20gYmFzZTY0IGNoYXJhY3RlciB0byBieXRlXG5sZXQgZW5jVGFibGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycuc3BsaXQoJycpO1xuLy8gbG9va3VwIHRhYmxlIGZyb20gYmFzZTY0IGNoYXJhY3RlciAqY29kZSogdG8gYnl0ZSBiZWNhdXNlIGxvb2t1cCBieSBudW1iZXIgaXMgZmFzdFxubGV0IGRlY1RhYmxlID0gW107XG5mb3IgKGxldCBpID0gMDsgaSA8IGVuY1RhYmxlLmxlbmd0aDsgaSsrKVxuICAgIGRlY1RhYmxlW2VuY1RhYmxlW2ldLmNoYXJDb2RlQXQoMCldID0gaTtcbi8vIHN1cHBvcnQgYmFzZTY0dXJsIHZhcmlhbnRzXG5kZWNUYWJsZVtcIi1cIi5jaGFyQ29kZUF0KDApXSA9IGVuY1RhYmxlLmluZGV4T2YoXCIrXCIpO1xuZGVjVGFibGVbXCJfXCIuY2hhckNvZGVBdCgwKV0gPSBlbmNUYWJsZS5pbmRleE9mKFwiL1wiKTtcbi8qKlxuICogRGVjb2RlcyBhIGJhc2U2NCBzdHJpbmcgdG8gYSBieXRlIGFycmF5LlxuICpcbiAqIC0gaWdub3JlcyB3aGl0ZS1zcGFjZSwgaW5jbHVkaW5nIGxpbmUgYnJlYWtzIGFuZCB0YWJzXG4gKiAtIGFsbG93cyBpbm5lciBwYWRkaW5nIChjYW4gZGVjb2RlIGNvbmNhdGVuYXRlZCBiYXNlNjQgc3RyaW5ncylcbiAqIC0gZG9lcyBub3QgcmVxdWlyZSBwYWRkaW5nXG4gKiAtIHVuZGVyc3RhbmRzIGJhc2U2NHVybCBlbmNvZGluZzpcbiAqICAgXCItXCIgaW5zdGVhZCBvZiBcIitcIixcbiAqICAgXCJfXCIgaW5zdGVhZCBvZiBcIi9cIixcbiAqICAgbm8gcGFkZGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gYmFzZTY0ZGVjb2RlKGJhc2U2NFN0cikge1xuICAgIC8vIGVzdGltYXRlIGJ5dGUgc2l6ZSwgbm90IGFjY291bnRpbmcgZm9yIGlubmVyIHBhZGRpbmcgYW5kIHdoaXRlc3BhY2VcbiAgICBsZXQgZXMgPSBiYXNlNjRTdHIubGVuZ3RoICogMyAvIDQ7XG4gICAgLy8gaWYgKGVzICUgMyAhPT0gMClcbiAgICAvLyB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYmFzZTY0IHN0cmluZycpO1xuICAgIGlmIChiYXNlNjRTdHJbYmFzZTY0U3RyLmxlbmd0aCAtIDJdID09ICc9JylcbiAgICAgICAgZXMgLT0gMjtcbiAgICBlbHNlIGlmIChiYXNlNjRTdHJbYmFzZTY0U3RyLmxlbmd0aCAtIDFdID09ICc9JylcbiAgICAgICAgZXMgLT0gMTtcbiAgICBsZXQgYnl0ZXMgPSBuZXcgVWludDhBcnJheShlcyksIGJ5dGVQb3MgPSAwLCAvLyBwb3NpdGlvbiBpbiBieXRlIGFycmF5XG4gICAgZ3JvdXBQb3MgPSAwLCAvLyBwb3NpdGlvbiBpbiBiYXNlNjQgZ3JvdXBcbiAgICBiLCAvLyBjdXJyZW50IGJ5dGVcbiAgICBwID0gMCAvLyBwcmV2aW91cyBieXRlXG4gICAgO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmFzZTY0U3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGIgPSBkZWNUYWJsZVtiYXNlNjRTdHIuY2hhckNvZGVBdChpKV07XG4gICAgICAgIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIG5vaW5zcGVjdGlvbiBGYWxsVGhyb3VnaEluU3dpdGNoU3RhdGVtZW50SlNcbiAgICAgICAgICAgIHN3aXRjaCAoYmFzZTY0U3RyW2ldKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnPSc6XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMDsgLy8gcmVzZXQgc3RhdGUgd2hlbiBwYWRkaW5nIGZvdW5kXG4gICAgICAgICAgICAgICAgY2FzZSAnXFxuJzpcbiAgICAgICAgICAgICAgICBjYXNlICdcXHInOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1xcdCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnICc6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIHdoaXRlLXNwYWNlLCBhbmQgcGFkZGluZ1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBpbnZhbGlkIGJhc2U2NCBzdHJpbmcuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoIChncm91cFBvcykge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHAgPSBiO1xuICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBieXRlc1tieXRlUG9zKytdID0gcCA8PCAyIHwgKGIgJiA0OCkgPj4gNDtcbiAgICAgICAgICAgICAgICBwID0gYjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgYnl0ZXNbYnl0ZVBvcysrXSA9IChwICYgMTUpIDw8IDQgfCAoYiAmIDYwKSA+PiAyO1xuICAgICAgICAgICAgICAgIHAgPSBiO1xuICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICBieXRlc1tieXRlUG9zKytdID0gKHAgJiAzKSA8PCA2IHwgYjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKGdyb3VwUG9zID09IDEpXG4gICAgICAgIHRocm93IEVycm9yKGBpbnZhbGlkIGJhc2U2NCBzdHJpbmcuYCk7XG4gICAgcmV0dXJuIGJ5dGVzLnN1YmFycmF5KDAsIGJ5dGVQb3MpO1xufVxuLyoqXG4gKiBFbmNvZGVzIGEgYnl0ZSBhcnJheSB0byBhIGJhc2U2NCBzdHJpbmcuXG4gKiBBZGRzIHBhZGRpbmcgYXQgdGhlIGVuZC5cbiAqIERvZXMgbm90IGluc2VydCBuZXdsaW5lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NGVuY29kZShieXRlcykge1xuICAgIGxldCBiYXNlNjQgPSAnJywgZ3JvdXBQb3MgPSAwLCAvLyBwb3NpdGlvbiBpbiBiYXNlNjQgZ3JvdXBcbiAgICBiLCAvLyBjdXJyZW50IGJ5dGVcbiAgICBwID0gMDsgLy8gY2Fycnkgb3ZlciBmcm9tIHByZXZpb3VzIGJ5dGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGIgPSBieXRlc1tpXTtcbiAgICAgICAgc3dpdGNoIChncm91cFBvcykge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGJhc2U2NCArPSBlbmNUYWJsZVtiID4+IDJdO1xuICAgICAgICAgICAgICAgIHAgPSAoYiAmIDMpIDw8IDQ7XG4gICAgICAgICAgICAgICAgZ3JvdXBQb3MgPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGJhc2U2NCArPSBlbmNUYWJsZVtwIHwgYiA+PiA0XTtcbiAgICAgICAgICAgICAgICBwID0gKGIgJiAxNSkgPDwgMjtcbiAgICAgICAgICAgICAgICBncm91cFBvcyA9IDI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgYmFzZTY0ICs9IGVuY1RhYmxlW3AgfCBiID4+IDZdO1xuICAgICAgICAgICAgICAgIGJhc2U2NCArPSBlbmNUYWJsZVtiICYgNjNdO1xuICAgICAgICAgICAgICAgIGdyb3VwUG9zID0gMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBwYWRkaW5nIHJlcXVpcmVkP1xuICAgIGlmIChncm91cFBvcykge1xuICAgICAgICBiYXNlNjQgKz0gZW5jVGFibGVbcF07XG4gICAgICAgIGJhc2U2NCArPSAnPSc7XG4gICAgICAgIGlmIChncm91cFBvcyA9PSAxKVxuICAgICAgICAgICAgYmFzZTY0ICs9ICc9JztcbiAgICB9XG4gICAgcmV0dXJuIGJhc2U2NDtcbn1cbiIsIi8qKlxuICogVGhpcyBoYW5kbGVyIGltcGxlbWVudHMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGZvciB1bmtub3duIGZpZWxkcy5cbiAqIFdoZW4gcmVhZGluZyBkYXRhLCB1bmtub3duIGZpZWxkcyBhcmUgc3RvcmVkIG9uIHRoZSBtZXNzYWdlLCBpbiBhXG4gKiBzeW1ib2wgcHJvcGVydHkuXG4gKiBXaGVuIHdyaXRpbmcgZGF0YSwgdGhlIHN5bWJvbCBwcm9wZXJ0eSBpcyBxdWVyaWVkIGFuZCB1bmtub3duIGZpZWxkc1xuICogYXJlIHNlcmlhbGl6ZWQgaW50byB0aGUgb3V0cHV0IGFnYWluLlxuICovXG5leHBvcnQgdmFyIFVua25vd25GaWVsZEhhbmRsZXI7XG4oZnVuY3Rpb24gKFVua25vd25GaWVsZEhhbmRsZXIpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3ltYm9sIHVzZWQgdG8gc3RvcmUgdW5rbm93biBmaWVsZHMgZm9yIGEgbWVzc2FnZS5cbiAgICAgKiBUaGUgcHJvcGVydHkgbXVzdCBjb25mb3JtIHRvIGBVbmtub3duRmllbGRDb250YWluZXJgLlxuICAgICAqL1xuICAgIFVua25vd25GaWVsZEhhbmRsZXIuc3ltYm9sID0gU3ltYm9sLmZvcihcInByb3RvYnVmLXRzL3Vua25vd25cIik7XG4gICAgLyoqXG4gICAgICogU3RvcmUgYW4gdW5rbm93biBmaWVsZCBkdXJpbmcgYmluYXJ5IHJlYWQgZGlyZWN0bHkgb24gdGhlIG1lc3NhZ2UuXG4gICAgICogVGhpcyBtZXRob2QgaXMgY29tcGF0aWJsZSB3aXRoIGBCaW5hcnlSZWFkT3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkYC5cbiAgICAgKi9cbiAgICBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA9ICh0eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGRhdGEpID0+IHtcbiAgICAgICAgbGV0IGNvbnRhaW5lciA9IGlzKG1lc3NhZ2UpID8gbWVzc2FnZVtVbmtub3duRmllbGRIYW5kbGVyLnN5bWJvbF0gOiBtZXNzYWdlW1Vua25vd25GaWVsZEhhbmRsZXIuc3ltYm9sXSA9IFtdO1xuICAgICAgICBjb250YWluZXIucHVzaCh7IG5vOiBmaWVsZE5vLCB3aXJlVHlwZSwgZGF0YSB9KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFdyaXRlIHVua25vd24gZmllbGRzIHN0b3JlZCBmb3IgdGhlIG1lc3NhZ2UgdG8gdGhlIHdyaXRlci5cbiAgICAgKiBUaGlzIG1ldGhvZCBpcyBjb21wYXRpYmxlIHdpdGggYEJpbmFyeVdyaXRlT3B0aW9ucy53cml0ZVVua25vd25GaWVsZHNgLlxuICAgICAqL1xuICAgIFVua25vd25GaWVsZEhhbmRsZXIub25Xcml0ZSA9ICh0eXBlTmFtZSwgbWVzc2FnZSwgd3JpdGVyKSA9PiB7XG4gICAgICAgIGZvciAobGV0IHsgbm8sIHdpcmVUeXBlLCBkYXRhIH0gb2YgVW5rbm93bkZpZWxkSGFuZGxlci5saXN0KG1lc3NhZ2UpKVxuICAgICAgICAgICAgd3JpdGVyLnRhZyhubywgd2lyZVR5cGUpLnJhdyhkYXRhKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIExpc3QgdW5rbm93biBmaWVsZHMgc3RvcmVkIGZvciB0aGUgbWVzc2FnZS5cbiAgICAgKiBOb3RlIHRoYXQgdGhlcmUgbWF5IGJlIG11bHRpcGxlcyBmaWVsZHMgd2l0aCB0aGUgc2FtZSBudW1iZXIuXG4gICAgICovXG4gICAgVW5rbm93bkZpZWxkSGFuZGxlci5saXN0ID0gKG1lc3NhZ2UsIGZpZWxkTm8pID0+IHtcbiAgICAgICAgaWYgKGlzKG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBsZXQgYWxsID0gbWVzc2FnZVtVbmtub3duRmllbGRIYW5kbGVyLnN5bWJvbF07XG4gICAgICAgICAgICByZXR1cm4gZmllbGRObyA/IGFsbC5maWx0ZXIodWYgPT4gdWYubm8gPT0gZmllbGRObykgOiBhbGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbGFzdCB1bmtub3duIGZpZWxkIGJ5IGZpZWxkIG51bWJlci5cbiAgICAgKi9cbiAgICBVbmtub3duRmllbGRIYW5kbGVyLmxhc3QgPSAobWVzc2FnZSwgZmllbGRObykgPT4gVW5rbm93bkZpZWxkSGFuZGxlci5saXN0KG1lc3NhZ2UsIGZpZWxkTm8pLnNsaWNlKC0xKVswXTtcbiAgICBjb25zdCBpcyA9IChtZXNzYWdlKSA9PiBtZXNzYWdlICYmIEFycmF5LmlzQXJyYXkobWVzc2FnZVtVbmtub3duRmllbGRIYW5kbGVyLnN5bWJvbF0pO1xufSkoVW5rbm93bkZpZWxkSGFuZGxlciB8fCAoVW5rbm93bkZpZWxkSGFuZGxlciA9IHt9KSk7XG4vKipcbiAqIE1lcmdlcyBiaW5hcnkgd3JpdGUgb3IgcmVhZCBvcHRpb25zLiBMYXRlciB2YWx1ZXMgb3ZlcnJpZGUgZWFybGllciB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUJpbmFyeU9wdGlvbnMoYSwgYikge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGEpLCBiKTtcbn1cbi8qKlxuICogUHJvdG9idWYgYmluYXJ5IGZvcm1hdCB3aXJlIHR5cGVzLlxuICpcbiAqIEEgd2lyZSB0eXBlIHByb3ZpZGVzIGp1c3QgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGZpbmQgdGhlIGxlbmd0aCBvZiB0aGVcbiAqIGZvbGxvd2luZyB2YWx1ZS5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL2VuY29kaW5nI3N0cnVjdHVyZVxuICovXG5leHBvcnQgdmFyIFdpcmVUeXBlO1xuKGZ1bmN0aW9uIChXaXJlVHlwZSkge1xuICAgIC8qKlxuICAgICAqIFVzZWQgZm9yIGludDMyLCBpbnQ2NCwgdWludDMyLCB1aW50NjQsIHNpbnQzMiwgc2ludDY0LCBib29sLCBlbnVtXG4gICAgICovXG4gICAgV2lyZVR5cGVbV2lyZVR5cGVbXCJWYXJpbnRcIl0gPSAwXSA9IFwiVmFyaW50XCI7XG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgZml4ZWQ2NCwgc2ZpeGVkNjQsIGRvdWJsZS5cbiAgICAgKiBBbHdheXMgOCBieXRlcyB3aXRoIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlci5cbiAgICAgKi9cbiAgICBXaXJlVHlwZVtXaXJlVHlwZVtcIkJpdDY0XCJdID0gMV0gPSBcIkJpdDY0XCI7XG4gICAgLyoqXG4gICAgICogVXNlZCBmb3Igc3RyaW5nLCBieXRlcywgZW1iZWRkZWQgbWVzc2FnZXMsIHBhY2tlZCByZXBlYXRlZCBmaWVsZHNcbiAgICAgKlxuICAgICAqIE9ubHkgcmVwZWF0ZWQgbnVtZXJpYyB0eXBlcyAodHlwZXMgd2hpY2ggdXNlIHRoZSB2YXJpbnQsIDMyLWJpdCxcbiAgICAgKiBvciA2NC1iaXQgd2lyZSB0eXBlcykgY2FuIGJlIHBhY2tlZC4gSW4gcHJvdG8zLCBzdWNoIGZpZWxkcyBhcmVcbiAgICAgKiBwYWNrZWQgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBXaXJlVHlwZVtXaXJlVHlwZVtcIkxlbmd0aERlbGltaXRlZFwiXSA9IDJdID0gXCJMZW5ndGhEZWxpbWl0ZWRcIjtcbiAgICAvKipcbiAgICAgKiBVc2VkIGZvciBncm91cHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIFdpcmVUeXBlW1dpcmVUeXBlW1wiU3RhcnRHcm91cFwiXSA9IDNdID0gXCJTdGFydEdyb3VwXCI7XG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgZ3JvdXBzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBXaXJlVHlwZVtXaXJlVHlwZVtcIkVuZEdyb3VwXCJdID0gNF0gPSBcIkVuZEdyb3VwXCI7XG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgZml4ZWQzMiwgc2ZpeGVkMzIsIGZsb2F0LlxuICAgICAqIEFsd2F5cyA0IGJ5dGVzIHdpdGggbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyLlxuICAgICAqL1xuICAgIFdpcmVUeXBlW1dpcmVUeXBlW1wiQml0MzJcIl0gPSA1XSA9IFwiQml0MzJcIjtcbn0pKFdpcmVUeXBlIHx8IChXaXJlVHlwZSA9IHt9KSk7XG4iLCJpbXBvcnQgeyBXaXJlVHlwZSB9IGZyb20gXCIuL2JpbmFyeS1mb3JtYXQtY29udHJhY3RcIjtcbmltcG9ydCB7IFBiTG9uZywgUGJVTG9uZyB9IGZyb20gXCIuL3BiLWxvbmdcIjtcbmltcG9ydCB7IHZhcmludDMycmVhZCwgdmFyaW50NjRyZWFkIH0gZnJvbSBcIi4vZ29vZy12YXJpbnRcIjtcbmNvbnN0IGRlZmF1bHRzUmVhZCA9IHtcbiAgICByZWFkVW5rbm93bkZpZWxkOiB0cnVlLFxuICAgIHJlYWRlckZhY3Rvcnk6IGJ5dGVzID0+IG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpLFxufTtcbi8qKlxuICogTWFrZSBvcHRpb25zIGZvciByZWFkaW5nIGJpbmFyeSBkYXRhIGZvcm0gcGFydGlhbCBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5UmVhZE9wdGlvbnMob3B0aW9ucykge1xuICAgIHJldHVybiBvcHRpb25zID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0c1JlYWQpLCBvcHRpb25zKSA6IGRlZmF1bHRzUmVhZDtcbn1cbmV4cG9ydCBjbGFzcyBCaW5hcnlSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZiwgdGV4dERlY29kZXIpIHtcbiAgICAgICAgdGhpcy52YXJpbnQ2NCA9IHZhcmludDY0cmVhZDsgLy8gZGlydHkgY2FzdCBmb3IgYHRoaXNgXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZWFkIGEgYHVpbnQzMmAgZmllbGQsIGFuIHVuc2lnbmVkIDMyIGJpdCB2YXJpbnQuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnVpbnQzMiA9IHZhcmludDMycmVhZDsgLy8gZGlydHkgY2FzdCBmb3IgYHRoaXNgIGFuZCBhY2Nlc3MgdG8gcHJvdGVjdGVkIGBidWZgXG4gICAgICAgIHRoaXMuYnVmID0gYnVmO1xuICAgICAgICB0aGlzLmxlbiA9IGJ1Zi5sZW5ndGg7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgdGhpcy52aWV3ID0gbmV3IERhdGFWaWV3KGJ1Zi5idWZmZXIsIGJ1Zi5ieXRlT2Zmc2V0LCBidWYuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHRoaXMudGV4dERlY29kZXIgPSB0ZXh0RGVjb2RlciAhPT0gbnVsbCAmJiB0ZXh0RGVjb2RlciAhPT0gdm9pZCAwID8gdGV4dERlY29kZXIgOiBuZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiLCB7XG4gICAgICAgICAgICBmYXRhbDogdHJ1ZSxcbiAgICAgICAgICAgIGlnbm9yZUJPTTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWRzIGEgdGFnIC0gZmllbGQgbnVtYmVyIGFuZCB3aXJlIHR5cGUuXG4gICAgICovXG4gICAgdGFnKCkge1xuICAgICAgICBsZXQgdGFnID0gdGhpcy51aW50MzIoKSwgZmllbGRObyA9IHRhZyA+Pj4gMywgd2lyZVR5cGUgPSB0YWcgJiA3O1xuICAgICAgICBpZiAoZmllbGRObyA8PSAwIHx8IHdpcmVUeXBlIDwgMCB8fCB3aXJlVHlwZSA+IDUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIHRhZzogZmllbGQgbm8gXCIgKyBmaWVsZE5vICsgXCIgd2lyZSB0eXBlIFwiICsgd2lyZVR5cGUpO1xuICAgICAgICByZXR1cm4gW2ZpZWxkTm8sIHdpcmVUeXBlXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2tpcCBvbmUgZWxlbWVudCBvbiB0aGUgd2lyZSBhbmQgcmV0dXJuIHRoZSBza2lwcGVkIGRhdGEuXG4gICAgICogU3VwcG9ydHMgV2lyZVR5cGUuU3RhcnRHcm91cCBzaW5jZSB2Mi4wLjAtYWxwaGEuMjMuXG4gICAgICovXG4gICAgc2tpcCh3aXJlVHlwZSkge1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnBvcztcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEZhbGxUaHJvdWdoSW5Td2l0Y2hTdGF0ZW1lbnRKU1xuICAgICAgICBzd2l0Y2ggKHdpcmVUeXBlKSB7XG4gICAgICAgICAgICBjYXNlIFdpcmVUeXBlLlZhcmludDpcbiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5idWZbdGhpcy5wb3MrK10gJiAweDgwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgV2lyZVR5cGUuQml0NjQ6XG4gICAgICAgICAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgICAgIGNhc2UgV2lyZVR5cGUuQml0MzI6XG4gICAgICAgICAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkOlxuICAgICAgICAgICAgICAgIGxldCBsZW4gPSB0aGlzLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHRoaXMucG9zICs9IGxlbjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgV2lyZVR5cGUuU3RhcnRHcm91cDpcbiAgICAgICAgICAgICAgICAvLyBGcm9tIGRlc2NyaXB0b3IucHJvdG86IEdyb3VwIHR5cGUgaXMgZGVwcmVjYXRlZCwgbm90IHN1cHBvcnRlZCBpbiBwcm90bzMuXG4gICAgICAgICAgICAgICAgLy8gQnV0IHdlIG11c3Qgc3RpbGwgYmUgYWJsZSB0byBwYXJzZSBhbmQgdHJlYXQgYXMgdW5rbm93bi5cbiAgICAgICAgICAgICAgICBsZXQgdDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoKHQgPSB0aGlzLnRhZygpWzFdKSAhPT0gV2lyZVR5cGUuRW5kR3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5za2lwKHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2FudCBza2lwIHdpcmUgdHlwZSBcIiArIHdpcmVUeXBlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICByZXR1cm4gdGhpcy5idWYuc3ViYXJyYXkoc3RhcnQsIHRoaXMucG9zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhyb3dzIGVycm9yIGlmIHBvc2l0aW9uIGluIGJ5dGUgYXJyYXkgaXMgb3V0IG9mIHJhbmdlLlxuICAgICAqL1xuICAgIGFzc2VydEJvdW5kcygpIHtcbiAgICAgICAgaWYgKHRoaXMucG9zID4gdGhpcy5sZW4pXG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInByZW1hdHVyZSBFT0ZcIik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgaW50MzJgIGZpZWxkLCBhIHNpZ25lZCAzMiBiaXQgdmFyaW50LlxuICAgICAqL1xuICAgIGludDMyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy51aW50MzIoKSB8IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgc2ludDMyYCBmaWVsZCwgYSBzaWduZWQsIHppZ3phZy1lbmNvZGVkIDMyLWJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgc2ludDMyKCkge1xuICAgICAgICBsZXQgenplID0gdGhpcy51aW50MzIoKTtcbiAgICAgICAgLy8gZGVjb2RlIHppZ3phZ1xuICAgICAgICByZXR1cm4gKHp6ZSA+Pj4gMSkgXiAtKHp6ZSAmIDEpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGludDY0YCBmaWVsZCwgYSBzaWduZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBpbnQ2NCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYkxvbmcoLi4udGhpcy52YXJpbnQ2NCgpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGB1aW50NjRgIGZpZWxkLCBhbiB1bnNpZ25lZCA2NC1iaXQgdmFyaW50LlxuICAgICAqL1xuICAgIHVpbnQ2NCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYlVMb25nKC4uLnRoaXMudmFyaW50NjQoKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgc2ludDY0YCBmaWVsZCwgYSBzaWduZWQsIHppZy16YWctZW5jb2RlZCA2NC1iaXQgdmFyaW50LlxuICAgICAqL1xuICAgIHNpbnQ2NCgpIHtcbiAgICAgICAgbGV0IFtsbywgaGldID0gdGhpcy52YXJpbnQ2NCgpO1xuICAgICAgICAvLyBkZWNvZGUgemlnIHphZ1xuICAgICAgICBsZXQgcyA9IC0obG8gJiAxKTtcbiAgICAgICAgbG8gPSAoKGxvID4+PiAxIHwgKGhpICYgMSkgPDwgMzEpIF4gcyk7XG4gICAgICAgIGhpID0gKGhpID4+PiAxIF4gcyk7XG4gICAgICAgIHJldHVybiBuZXcgUGJMb25nKGxvLCBoaSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgYm9vbGAgZmllbGQsIGEgdmFyaWFudC5cbiAgICAgKi9cbiAgICBib29sKCkge1xuICAgICAgICBsZXQgW2xvLCBoaV0gPSB0aGlzLnZhcmludDY0KCk7XG4gICAgICAgIHJldHVybiBsbyAhPT0gMCB8fCBoaSAhPT0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBmaXhlZDMyYCBmaWVsZCwgYW4gdW5zaWduZWQsIGZpeGVkLWxlbmd0aCAzMi1iaXQgaW50ZWdlci5cbiAgICAgKi9cbiAgICBmaXhlZDMyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3LmdldFVpbnQzMigodGhpcy5wb3MgKz0gNCkgLSA0LCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBzZml4ZWQzMmAgZmllbGQsIGEgc2lnbmVkLCBmaXhlZC1sZW5ndGggMzItYml0IGludGVnZXIuXG4gICAgICovXG4gICAgc2ZpeGVkMzIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0SW50MzIoKHRoaXMucG9zICs9IDQpIC0gNCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBgZml4ZWQ2NGAgZmllbGQsIGFuIHVuc2lnbmVkLCBmaXhlZC1sZW5ndGggNjQgYml0IGludGVnZXIuXG4gICAgICovXG4gICAgZml4ZWQ2NCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYlVMb25nKHRoaXMuc2ZpeGVkMzIoKSwgdGhpcy5zZml4ZWQzMigpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBmaXhlZDY0YCBmaWVsZCwgYSBzaWduZWQsIGZpeGVkLWxlbmd0aCA2NC1iaXQgaW50ZWdlci5cbiAgICAgKi9cbiAgICBzZml4ZWQ2NCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYkxvbmcodGhpcy5zZml4ZWQzMigpLCB0aGlzLnNmaXhlZDMyKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGZsb2F0YCBmaWVsZCwgMzItYml0IGZsb2F0aW5nIHBvaW50IG51bWJlci5cbiAgICAgKi9cbiAgICBmbG9hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRGbG9hdDMyKCh0aGlzLnBvcyArPSA0KSAtIDQsIHRydWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgYGRvdWJsZWAgZmllbGQsIGEgNjQtYml0IGZsb2F0aW5nIHBvaW50IG51bWJlci5cbiAgICAgKi9cbiAgICBkb3VibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0RmxvYXQ2NCgodGhpcy5wb3MgKz0gOCkgLSA4LCB0cnVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBieXRlc2AgZmllbGQsIGxlbmd0aC1kZWxpbWl0ZWQgYXJiaXRyYXJ5IGRhdGEuXG4gICAgICovXG4gICAgYnl0ZXMoKSB7XG4gICAgICAgIGxldCBsZW4gPSB0aGlzLnVpbnQzMigpO1xuICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5wb3MgKz0gbGVuO1xuICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICByZXR1cm4gdGhpcy5idWYuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIGBzdHJpbmdgIGZpZWxkLCBsZW5ndGgtZGVsaW1pdGVkIGRhdGEgY29udmVydGVkIHRvIFVURi04IHRleHQuXG4gICAgICovXG4gICAgc3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXh0RGVjb2Rlci5kZWNvZGUodGhpcy5ieXRlcygpKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBQYkxvbmcsIFBiVUxvbmcgfSBmcm9tIFwiLi9wYi1sb25nXCI7XG5pbXBvcnQgeyB2YXJpbnQzMndyaXRlLCB2YXJpbnQ2NHdyaXRlIH0gZnJvbSBcIi4vZ29vZy12YXJpbnRcIjtcbmltcG9ydCB7IGFzc2VydEZsb2F0MzIsIGFzc2VydEludDMyLCBhc3NlcnRVSW50MzIgfSBmcm9tIFwiLi9hc3NlcnRcIjtcbmNvbnN0IGRlZmF1bHRzV3JpdGUgPSB7XG4gICAgd3JpdGVVbmtub3duRmllbGRzOiB0cnVlLFxuICAgIHdyaXRlckZhY3Rvcnk6ICgpID0+IG5ldyBCaW5hcnlXcml0ZXIoKSxcbn07XG4vKipcbiAqIE1ha2Ugb3B0aW9ucyBmb3Igd3JpdGluZyBiaW5hcnkgZGF0YSBmb3JtIHBhcnRpYWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeVdyaXRlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzV3JpdGUpLCBvcHRpb25zKSA6IGRlZmF1bHRzV3JpdGU7XG59XG5leHBvcnQgY2xhc3MgQmluYXJ5V3JpdGVyIHtcbiAgICBjb25zdHJ1Y3Rvcih0ZXh0RW5jb2Rlcikge1xuICAgICAgICAvKipcbiAgICAgICAgICogUHJldmlvdXMgZm9yayBzdGF0ZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnN0YWNrID0gW107XG4gICAgICAgIHRoaXMudGV4dEVuY29kZXIgPSB0ZXh0RW5jb2RlciAhPT0gbnVsbCAmJiB0ZXh0RW5jb2RlciAhPT0gdm9pZCAwID8gdGV4dEVuY29kZXIgOiBuZXcgVGV4dEVuY29kZXIoKTtcbiAgICAgICAgdGhpcy5jaHVua3MgPSBbXTtcbiAgICAgICAgdGhpcy5idWYgPSBbXTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGFsbCBieXRlcyB3cml0dGVuIGFuZCByZXNldCB0aGlzIHdyaXRlci5cbiAgICAgKi9cbiAgICBmaW5pc2goKSB7XG4gICAgICAgIHRoaXMuY2h1bmtzLnB1c2gobmV3IFVpbnQ4QXJyYXkodGhpcy5idWYpKTsgLy8gZmx1c2ggdGhlIGJ1ZmZlclxuICAgICAgICBsZXQgbGVuID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNodW5rcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGxlbiArPSB0aGlzLmNodW5rc1tpXS5sZW5ndGg7XG4gICAgICAgIGxldCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2h1bmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBieXRlcy5zZXQodGhpcy5jaHVua3NbaV0sIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gdGhpcy5jaHVua3NbaV0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2h1bmtzID0gW107XG4gICAgICAgIHJldHVybiBieXRlcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RhcnQgYSBuZXcgZm9yayBmb3IgbGVuZ3RoLWRlbGltaXRlZCBkYXRhIGxpa2UgYSBtZXNzYWdlXG4gICAgICogb3IgYSBwYWNrZWQgcmVwZWF0ZWQgZmllbGQuXG4gICAgICpcbiAgICAgKiBNdXN0IGJlIGpvaW5lZCBsYXRlciB3aXRoIGBqb2luKClgLlxuICAgICAqL1xuICAgIGZvcmsoKSB7XG4gICAgICAgIHRoaXMuc3RhY2sucHVzaCh7IGNodW5rczogdGhpcy5jaHVua3MsIGJ1ZjogdGhpcy5idWYgfSk7XG4gICAgICAgIHRoaXMuY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuYnVmID0gW107XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBKb2luIHRoZSBsYXN0IGZvcmsuIFdyaXRlIGl0cyBsZW5ndGggYW5kIGJ5dGVzLCB0aGVuXG4gICAgICogcmV0dXJuIHRvIHRoZSBwcmV2aW91cyBzdGF0ZS5cbiAgICAgKi9cbiAgICBqb2luKCkge1xuICAgICAgICAvLyBnZXQgY2h1bmsgb2YgZm9ya1xuICAgICAgICBsZXQgY2h1bmsgPSB0aGlzLmZpbmlzaCgpO1xuICAgICAgICAvLyByZXN0b3JlIHByZXZpb3VzIHN0YXRlXG4gICAgICAgIGxldCBwcmV2ID0gdGhpcy5zdGFjay5wb3AoKTtcbiAgICAgICAgaWYgKCFwcmV2KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHN0YXRlLCBmb3JrIHN0YWNrIGVtcHR5Jyk7XG4gICAgICAgIHRoaXMuY2h1bmtzID0gcHJldi5jaHVua3M7XG4gICAgICAgIHRoaXMuYnVmID0gcHJldi5idWY7XG4gICAgICAgIC8vIHdyaXRlIGxlbmd0aCBvZiBjaHVuayBhcyB2YXJpbnRcbiAgICAgICAgdGhpcy51aW50MzIoY2h1bmsuYnl0ZUxlbmd0aCk7XG4gICAgICAgIHJldHVybiB0aGlzLnJhdyhjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlcyBhIHRhZyAoZmllbGQgbnVtYmVyIGFuZCB3aXJlIHR5cGUpLlxuICAgICAqXG4gICAgICogRXF1aXZhbGVudCB0byBgdWludDMyKCAoZmllbGRObyA8PCAzIHwgdHlwZSkgPj4+IDAgKWAuXG4gICAgICpcbiAgICAgKiBHZW5lcmF0ZWQgY29kZSBzaG91bGQgY29tcHV0ZSB0aGUgdGFnIGFoZWFkIG9mIHRpbWUgYW5kIGNhbGwgYHVpbnQzMigpYC5cbiAgICAgKi9cbiAgICB0YWcoZmllbGRObywgdHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy51aW50MzIoKGZpZWxkTm8gPDwgMyB8IHR5cGUpID4+PiAwKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBjaHVuayBvZiByYXcgYnl0ZXMuXG4gICAgICovXG4gICAgcmF3KGNodW5rKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1Zi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtzLnB1c2gobmV3IFVpbnQ4QXJyYXkodGhpcy5idWYpKTtcbiAgICAgICAgICAgIHRoaXMuYnVmID0gW107XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaHVua3MucHVzaChjaHVuayk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGB1aW50MzJgIHZhbHVlLCBhbiB1bnNpZ25lZCAzMiBiaXQgdmFyaW50LlxuICAgICAqL1xuICAgIHVpbnQzMih2YWx1ZSkge1xuICAgICAgICBhc3NlcnRVSW50MzIodmFsdWUpO1xuICAgICAgICAvLyB3cml0ZSB2YWx1ZSBhcyB2YXJpbnQgMzIsIGlubGluZWQgZm9yIHNwZWVkXG4gICAgICAgIHdoaWxlICh2YWx1ZSA+IDB4N2YpIHtcbiAgICAgICAgICAgIHRoaXMuYnVmLnB1c2goKHZhbHVlICYgMHg3ZikgfCAweDgwKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPj4+IDc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5idWYucHVzaCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBpbnQzMmAgdmFsdWUsIGEgc2lnbmVkIDMyIGJpdCB2YXJpbnQuXG4gICAgICovXG4gICAgaW50MzIodmFsdWUpIHtcbiAgICAgICAgYXNzZXJ0SW50MzIodmFsdWUpO1xuICAgICAgICB2YXJpbnQzMndyaXRlKHZhbHVlLCB0aGlzLmJ1Zik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBib29sYCB2YWx1ZSwgYSB2YXJpYW50LlxuICAgICAqL1xuICAgIGJvb2wodmFsdWUpIHtcbiAgICAgICAgdGhpcy5idWYucHVzaCh2YWx1ZSA/IDEgOiAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYGJ5dGVzYCB2YWx1ZSwgbGVuZ3RoLWRlbGltaXRlZCBhcmJpdHJhcnkgZGF0YS5cbiAgICAgKi9cbiAgICBieXRlcyh2YWx1ZSkge1xuICAgICAgICB0aGlzLnVpbnQzMih2YWx1ZS5ieXRlTGVuZ3RoKTsgLy8gd3JpdGUgbGVuZ3RoIG9mIGNodW5rIGFzIHZhcmludFxuICAgICAgICByZXR1cm4gdGhpcy5yYXcodmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBzdHJpbmdgIHZhbHVlLCBsZW5ndGgtZGVsaW1pdGVkIGRhdGEgY29udmVydGVkIHRvIFVURi04IHRleHQuXG4gICAgICovXG4gICAgc3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGxldCBjaHVuayA9IHRoaXMudGV4dEVuY29kZXIuZW5jb2RlKHZhbHVlKTtcbiAgICAgICAgdGhpcy51aW50MzIoY2h1bmsuYnl0ZUxlbmd0aCk7IC8vIHdyaXRlIGxlbmd0aCBvZiBjaHVuayBhcyB2YXJpbnRcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgZmxvYXRgIHZhbHVlLCAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLlxuICAgICAqL1xuICAgIGZsb2F0KHZhbHVlKSB7XG4gICAgICAgIGFzc2VydEZsb2F0MzIodmFsdWUpO1xuICAgICAgICBsZXQgY2h1bmsgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgbmV3IERhdGFWaWV3KGNodW5rLmJ1ZmZlcikuc2V0RmxvYXQzMigwLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJhdyhjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYGRvdWJsZWAgdmFsdWUsIGEgNjQtYml0IGZsb2F0aW5nIHBvaW50IG51bWJlci5cbiAgICAgKi9cbiAgICBkb3VibGUodmFsdWUpIHtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoOCk7XG4gICAgICAgIG5ldyBEYXRhVmlldyhjaHVuay5idWZmZXIpLnNldEZsb2F0NjQoMCwgdmFsdWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBmaXhlZDMyYCB2YWx1ZSwgYW4gdW5zaWduZWQsIGZpeGVkLWxlbmd0aCAzMi1iaXQgaW50ZWdlci5cbiAgICAgKi9cbiAgICBmaXhlZDMyKHZhbHVlKSB7XG4gICAgICAgIGFzc2VydFVJbnQzMih2YWx1ZSk7XG4gICAgICAgIGxldCBjaHVuayA9IG5ldyBVaW50OEFycmF5KDQpO1xuICAgICAgICBuZXcgRGF0YVZpZXcoY2h1bmsuYnVmZmVyKS5zZXRVaW50MzIoMCwgdmFsdWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBzZml4ZWQzMmAgdmFsdWUsIGEgc2lnbmVkLCBmaXhlZC1sZW5ndGggMzItYml0IGludGVnZXIuXG4gICAgICovXG4gICAgc2ZpeGVkMzIodmFsdWUpIHtcbiAgICAgICAgYXNzZXJ0SW50MzIodmFsdWUpO1xuICAgICAgICBsZXQgY2h1bmsgPSBuZXcgVWludDhBcnJheSg0KTtcbiAgICAgICAgbmV3IERhdGFWaWV3KGNodW5rLmJ1ZmZlcikuc2V0SW50MzIoMCwgdmFsdWUsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5yYXcoY2h1bmspO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBzaW50MzJgIHZhbHVlLCBhIHNpZ25lZCwgemlnemFnLWVuY29kZWQgMzItYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBzaW50MzIodmFsdWUpIHtcbiAgICAgICAgYXNzZXJ0SW50MzIodmFsdWUpO1xuICAgICAgICAvLyB6aWd6YWcgZW5jb2RlXG4gICAgICAgIHZhbHVlID0gKCh2YWx1ZSA8PCAxKSBeICh2YWx1ZSA+PiAzMSkpID4+PiAwO1xuICAgICAgICB2YXJpbnQzMndyaXRlKHZhbHVlLCB0aGlzLmJ1Zik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGBmaXhlZDY0YCB2YWx1ZSwgYSBzaWduZWQsIGZpeGVkLWxlbmd0aCA2NC1iaXQgaW50ZWdlci5cbiAgICAgKi9cbiAgICBzZml4ZWQ2NCh2YWx1ZSkge1xuICAgICAgICBsZXQgY2h1bmsgPSBuZXcgVWludDhBcnJheSg4KTtcbiAgICAgICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoY2h1bmsuYnVmZmVyKTtcbiAgICAgICAgbGV0IGxvbmcgPSBQYkxvbmcuZnJvbSh2YWx1ZSk7XG4gICAgICAgIHZpZXcuc2V0SW50MzIoMCwgbG9uZy5sbywgdHJ1ZSk7XG4gICAgICAgIHZpZXcuc2V0SW50MzIoNCwgbG9uZy5oaSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJhdyhjaHVuayk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYGZpeGVkNjRgIHZhbHVlLCBhbiB1bnNpZ25lZCwgZml4ZWQtbGVuZ3RoIDY0IGJpdCBpbnRlZ2VyLlxuICAgICAqL1xuICAgIGZpeGVkNjQodmFsdWUpIHtcbiAgICAgICAgbGV0IGNodW5rID0gbmV3IFVpbnQ4QXJyYXkoOCk7XG4gICAgICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGNodW5rLmJ1ZmZlcik7XG4gICAgICAgIGxldCBsb25nID0gUGJVTG9uZy5mcm9tKHZhbHVlKTtcbiAgICAgICAgdmlldy5zZXRJbnQzMigwLCBsb25nLmxvLCB0cnVlKTtcbiAgICAgICAgdmlldy5zZXRJbnQzMig0LCBsb25nLmhpLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmF3KGNodW5rKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgYSBgaW50NjRgIHZhbHVlLCBhIHNpZ25lZCA2NC1iaXQgdmFyaW50LlxuICAgICAqL1xuICAgIGludDY0KHZhbHVlKSB7XG4gICAgICAgIGxldCBsb25nID0gUGJMb25nLmZyb20odmFsdWUpO1xuICAgICAgICB2YXJpbnQ2NHdyaXRlKGxvbmcubG8sIGxvbmcuaGksIHRoaXMuYnVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIGEgYHNpbnQ2NGAgdmFsdWUsIGEgc2lnbmVkLCB6aWctemFnLWVuY29kZWQgNjQtYml0IHZhcmludC5cbiAgICAgKi9cbiAgICBzaW50NjQodmFsdWUpIHtcbiAgICAgICAgbGV0IGxvbmcgPSBQYkxvbmcuZnJvbSh2YWx1ZSksIFxuICAgICAgICAvLyB6aWd6YWcgZW5jb2RlXG4gICAgICAgIHNpZ24gPSBsb25nLmhpID4+IDMxLCBsbyA9IChsb25nLmxvIDw8IDEpIF4gc2lnbiwgaGkgPSAoKGxvbmcuaGkgPDwgMSkgfCAobG9uZy5sbyA+Pj4gMzEpKSBeIHNpZ247XG4gICAgICAgIHZhcmludDY0d3JpdGUobG8sIGhpLCB0aGlzLmJ1Zik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIGB1aW50NjRgIHZhbHVlLCBhbiB1bnNpZ25lZCA2NC1iaXQgdmFyaW50LlxuICAgICAqL1xuICAgIHVpbnQ2NCh2YWx1ZSkge1xuICAgICAgICBsZXQgbG9uZyA9IFBiVUxvbmcuZnJvbSh2YWx1ZSk7XG4gICAgICAgIHZhcmludDY0d3JpdGUobG9uZy5sbywgbG9uZy5oaSwgdGhpcy5idWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4iLCIvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbi8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbi8vIG1ldDpcbi8vXG4vLyAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4vLyAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmVcbi8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXJcbi8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGVcbi8vIGRpc3RyaWJ1dGlvbi5cbi8vICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb21cbi8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4vL1xuLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuLy8gXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbi8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuLy9cbi8vIENvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBQcm90b2NvbCBCdWZmZXIgY29tcGlsZXIgaXMgb3duZWQgYnkgdGhlIG93bmVyXG4vLyBvZiB0aGUgaW5wdXQgZmlsZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBpdC4gIFRoaXMgY29kZSBpcyBub3Rcbi8vIHN0YW5kYWxvbmUgYW5kIHJlcXVpcmVzIGEgc3VwcG9ydCBsaWJyYXJ5IHRvIGJlIGxpbmtlZCB3aXRoIGl0LiAgVGhpc1xuLy8gc3VwcG9ydCBsaWJyYXJ5IGlzIGl0c2VsZiBjb3ZlcmVkIGJ5IHRoZSBhYm92ZSBsaWNlbnNlLlxuLyoqXG4gKiBSZWFkIGEgNjQgYml0IHZhcmludCBhcyB0d28gSlMgbnVtYmVycy5cbiAqXG4gKiBSZXR1cm5zIHR1cGxlOlxuICogWzBdOiBsb3cgYml0c1xuICogWzBdOiBoaWdoIGJpdHNcbiAqXG4gKiBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9ibG9iLzhhNzE5MjdkNzRhNGNlMzRlZmUyZDg3NjlmZGExOThmNTJkMjBkMTIvanMvZXhwZXJpbWVudGFsL3J1bnRpbWUva2VybmVsL2J1ZmZlcl9kZWNvZGVyLmpzI0wxNzVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhcmludDY0cmVhZCgpIHtcbiAgICBsZXQgbG93Qml0cyA9IDA7XG4gICAgbGV0IGhpZ2hCaXRzID0gMDtcbiAgICBmb3IgKGxldCBzaGlmdCA9IDA7IHNoaWZ0IDwgMjg7IHNoaWZ0ICs9IDcpIHtcbiAgICAgICAgbGV0IGIgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICAgICAgbG93Qml0cyB8PSAoYiAmIDB4N0YpIDw8IHNoaWZ0O1xuICAgICAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydEJvdW5kcygpO1xuICAgICAgICAgICAgcmV0dXJuIFtsb3dCaXRzLCBoaWdoQml0c107XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IG1pZGRsZUJ5dGUgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICAvLyBsYXN0IGZvdXIgYml0cyBvZiB0aGUgZmlyc3QgMzIgYml0IG51bWJlclxuICAgIGxvd0JpdHMgfD0gKG1pZGRsZUJ5dGUgJiAweDBGKSA8PCAyODtcbiAgICAvLyAzIHVwcGVyIGJpdHMgYXJlIHBhcnQgb2YgdGhlIG5leHQgMzIgYml0IG51bWJlclxuICAgIGhpZ2hCaXRzID0gKG1pZGRsZUJ5dGUgJiAweDcwKSA+PiA0O1xuICAgIGlmICgobWlkZGxlQnl0ZSAmIDB4ODApID09IDApIHtcbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIFtsb3dCaXRzLCBoaWdoQml0c107XG4gICAgfVxuICAgIGZvciAobGV0IHNoaWZ0ID0gMzsgc2hpZnQgPD0gMzE7IHNoaWZ0ICs9IDcpIHtcbiAgICAgICAgbGV0IGIgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICAgICAgaGlnaEJpdHMgfD0gKGIgJiAweDdGKSA8PCBzaGlmdDtcbiAgICAgICAgaWYgKChiICYgMHg4MCkgPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgICAgIHJldHVybiBbbG93Qml0cywgaGlnaEJpdHNdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB2YXJpbnQnKTtcbn1cbi8qKlxuICogV3JpdGUgYSA2NCBiaXQgdmFyaW50LCBnaXZlbiBhcyB0d28gSlMgbnVtYmVycywgdG8gdGhlIGdpdmVuIGJ5dGVzIGFycmF5LlxuICpcbiAqIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvOGE3MTkyN2Q3NGE0Y2UzNGVmZTJkODc2OWZkYTE5OGY1MmQyMGQxMi9qcy9leHBlcmltZW50YWwvcnVudGltZS9rZXJuZWwvd3JpdGVyLmpzI0wzNDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhcmludDY0d3JpdGUobG8sIGhpLCBieXRlcykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjg7IGkgPSBpICsgNykge1xuICAgICAgICBjb25zdCBzaGlmdCA9IGxvID4+PiBpO1xuICAgICAgICBjb25zdCBoYXNOZXh0ID0gISgoc2hpZnQgPj4+IDcpID09IDAgJiYgaGkgPT0gMCk7XG4gICAgICAgIGNvbnN0IGJ5dGUgPSAoaGFzTmV4dCA/IHNoaWZ0IHwgMHg4MCA6IHNoaWZ0KSAmIDB4RkY7XG4gICAgICAgIGJ5dGVzLnB1c2goYnl0ZSk7XG4gICAgICAgIGlmICghaGFzTmV4dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0Qml0cyA9ICgobG8gPj4+IDI4KSAmIDB4MEYpIHwgKChoaSAmIDB4MDcpIDw8IDQpO1xuICAgIGNvbnN0IGhhc01vcmVCaXRzID0gISgoaGkgPj4gMykgPT0gMCk7XG4gICAgYnl0ZXMucHVzaCgoaGFzTW9yZUJpdHMgPyBzcGxpdEJpdHMgfCAweDgwIDogc3BsaXRCaXRzKSAmIDB4RkYpO1xuICAgIGlmICghaGFzTW9yZUJpdHMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMzsgaSA8IDMxOyBpID0gaSArIDcpIHtcbiAgICAgICAgY29uc3Qgc2hpZnQgPSBoaSA+Pj4gaTtcbiAgICAgICAgY29uc3QgaGFzTmV4dCA9ICEoKHNoaWZ0ID4+PiA3KSA9PSAwKTtcbiAgICAgICAgY29uc3QgYnl0ZSA9IChoYXNOZXh0ID8gc2hpZnQgfCAweDgwIDogc2hpZnQpICYgMHhGRjtcbiAgICAgICAgYnl0ZXMucHVzaChieXRlKTtcbiAgICAgICAgaWYgKCFoYXNOZXh0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgYnl0ZXMucHVzaCgoaGkgPj4+IDMxKSAmIDB4MDEpO1xufVxuLy8gY29uc3RhbnRzIGZvciBiaW5hcnkgbWF0aFxuY29uc3QgVFdPX1BXUl8zMl9EQkwgPSAoMSA8PCAxNikgKiAoMSA8PCAxNik7XG4vKipcbiAqIFBhcnNlIGRlY2ltYWwgc3RyaW5nIG9mIDY0IGJpdCBpbnRlZ2VyIHZhbHVlIGFzIHR3byBKUyBudW1iZXJzLlxuICpcbiAqIFJldHVybnMgdHVwbGU6XG4gKiBbMF06IG1pbnVzIHNpZ24/XG4gKiBbMV06IGxvdyBiaXRzXG4gKiBbMl06IGhpZ2ggYml0c1xuICpcbiAqIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnQ2NGZyb21TdHJpbmcoZGVjKSB7XG4gICAgLy8gQ2hlY2sgZm9yIG1pbnVzIHNpZ24uXG4gICAgbGV0IG1pbnVzID0gZGVjWzBdID09ICctJztcbiAgICBpZiAobWludXMpXG4gICAgICAgIGRlYyA9IGRlYy5zbGljZSgxKTtcbiAgICAvLyBXb3JrIDYgZGVjaW1hbCBkaWdpdHMgYXQgYSB0aW1lLCBhY3RpbmcgbGlrZSB3ZSdyZSBjb252ZXJ0aW5nIGJhc2UgMWU2XG4gICAgLy8gZGlnaXRzIHRvIGJpbmFyeS4gVGhpcyBpcyBzYWZlIHRvIGRvIHdpdGggZmxvYXRpbmcgcG9pbnQgbWF0aCBiZWNhdXNlXG4gICAgLy8gTnVtYmVyLmlzU2FmZUludGVnZXIoQUxMXzMyX0JJVFMgKiAxZTYpID09IHRydWUuXG4gICAgY29uc3QgYmFzZSA9IDFlNjtcbiAgICBsZXQgbG93Qml0cyA9IDA7XG4gICAgbGV0IGhpZ2hCaXRzID0gMDtcbiAgICBmdW5jdGlvbiBhZGQxZTZkaWdpdChiZWdpbiwgZW5kKSB7XG4gICAgICAgIC8vIE5vdGU6IE51bWJlcignJykgaXMgMC5cbiAgICAgICAgY29uc3QgZGlnaXQxZTYgPSBOdW1iZXIoZGVjLnNsaWNlKGJlZ2luLCBlbmQpKTtcbiAgICAgICAgaGlnaEJpdHMgKj0gYmFzZTtcbiAgICAgICAgbG93Qml0cyA9IGxvd0JpdHMgKiBiYXNlICsgZGlnaXQxZTY7XG4gICAgICAgIC8vIENhcnJ5IGJpdHMgZnJvbSBsb3dCaXRzIHRvIGhpZ2hCaXRzXG4gICAgICAgIGlmIChsb3dCaXRzID49IFRXT19QV1JfMzJfREJMKSB7XG4gICAgICAgICAgICBoaWdoQml0cyA9IGhpZ2hCaXRzICsgKChsb3dCaXRzIC8gVFdPX1BXUl8zMl9EQkwpIHwgMCk7XG4gICAgICAgICAgICBsb3dCaXRzID0gbG93Qml0cyAlIFRXT19QV1JfMzJfREJMO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZDFlNmRpZ2l0KC0yNCwgLTE4KTtcbiAgICBhZGQxZTZkaWdpdCgtMTgsIC0xMik7XG4gICAgYWRkMWU2ZGlnaXQoLTEyLCAtNik7XG4gICAgYWRkMWU2ZGlnaXQoLTYpO1xuICAgIHJldHVybiBbbWludXMsIGxvd0JpdHMsIGhpZ2hCaXRzXTtcbn1cbi8qKlxuICogRm9ybWF0IDY0IGJpdCBpbnRlZ2VyIHZhbHVlIChhcyB0d28gSlMgbnVtYmVycykgdG8gZGVjaW1hbCBzdHJpbmcuXG4gKlxuICogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludDY0dG9TdHJpbmcoYml0c0xvdywgYml0c0hpZ2gpIHtcbiAgICAvLyBTa2lwIHRoZSBleHBlbnNpdmUgY29udmVyc2lvbiBpZiB0aGUgbnVtYmVyIGlzIHNtYWxsIGVub3VnaCB0byB1c2UgdGhlXG4gICAgLy8gYnVpbHQtaW4gY29udmVyc2lvbnMuXG4gICAgaWYgKChiaXRzSGlnaCA+Pj4gMCkgPD0gMHgxRkZGRkYpIHtcbiAgICAgICAgcmV0dXJuICcnICsgKFRXT19QV1JfMzJfREJMICogYml0c0hpZ2ggKyAoYml0c0xvdyA+Pj4gMCkpO1xuICAgIH1cbiAgICAvLyBXaGF0IHRoaXMgY29kZSBpcyBkb2luZyBpcyBlc3NlbnRpYWxseSBjb252ZXJ0aW5nIHRoZSBpbnB1dCBudW1iZXIgZnJvbVxuICAgIC8vIGJhc2UtMiB0byBiYXNlLTFlNywgd2hpY2ggYWxsb3dzIHVzIHRvIHJlcHJlc2VudCB0aGUgNjQtYml0IHJhbmdlIHdpdGhcbiAgICAvLyBvbmx5IDMgKHZlcnkgbGFyZ2UpIGRpZ2l0cy4gVGhvc2UgZGlnaXRzIGFyZSB0aGVuIHRyaXZpYWwgdG8gY29udmVydCB0b1xuICAgIC8vIGEgYmFzZS0xMCBzdHJpbmcuXG4gICAgLy8gVGhlIG1hZ2ljIG51bWJlcnMgdXNlZCBoZXJlIGFyZSAtXG4gICAgLy8gMl4yNCA9IDE2Nzc3MjE2ID0gKDEsNjc3NzIxNikgaW4gYmFzZS0xZTcuXG4gICAgLy8gMl40OCA9IDI4MTQ3NDk3NjcxMDY1NiA9ICgyLDgxNDc0OTcsNjcxMDY1NikgaW4gYmFzZS0xZTcuXG4gICAgLy8gU3BsaXQgMzI6MzIgcmVwcmVzZW50YXRpb24gaW50byAxNjoyNDoyNCByZXByZXNlbnRhdGlvbiBzbyBvdXJcbiAgICAvLyBpbnRlcm1lZGlhdGUgZGlnaXRzIGRvbid0IG92ZXJmbG93LlxuICAgIGxldCBsb3cgPSBiaXRzTG93ICYgMHhGRkZGRkY7XG4gICAgbGV0IG1pZCA9ICgoKGJpdHNMb3cgPj4+IDI0KSB8IChiaXRzSGlnaCA8PCA4KSkgPj4+IDApICYgMHhGRkZGRkY7XG4gICAgbGV0IGhpZ2ggPSAoYml0c0hpZ2ggPj4gMTYpICYgMHhGRkZGO1xuICAgIC8vIEFzc2VtYmxlIG91ciB0aHJlZSBiYXNlLTFlNyBkaWdpdHMsIGlnbm9yaW5nIGNhcnJpZXMuIFRoZSBtYXhpbXVtXG4gICAgLy8gdmFsdWUgaW4gYSBkaWdpdCBhdCB0aGlzIHN0ZXAgaXMgcmVwcmVzZW50YWJsZSBhcyBhIDQ4LWJpdCBpbnRlZ2VyLCB3aGljaFxuICAgIC8vIGNhbiBiZSBzdG9yZWQgaW4gYSA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLlxuICAgIGxldCBkaWdpdEEgPSBsb3cgKyAobWlkICogNjc3NzIxNikgKyAoaGlnaCAqIDY3MTA2NTYpO1xuICAgIGxldCBkaWdpdEIgPSBtaWQgKyAoaGlnaCAqIDgxNDc0OTcpO1xuICAgIGxldCBkaWdpdEMgPSAoaGlnaCAqIDIpO1xuICAgIC8vIEFwcGx5IGNhcnJpZXMgZnJvbSBBIHRvIEIgYW5kIGZyb20gQiB0byBDLlxuICAgIGxldCBiYXNlID0gMTAwMDAwMDA7XG4gICAgaWYgKGRpZ2l0QSA+PSBiYXNlKSB7XG4gICAgICAgIGRpZ2l0QiArPSBNYXRoLmZsb29yKGRpZ2l0QSAvIGJhc2UpO1xuICAgICAgICBkaWdpdEEgJT0gYmFzZTtcbiAgICB9XG4gICAgaWYgKGRpZ2l0QiA+PSBiYXNlKSB7XG4gICAgICAgIGRpZ2l0QyArPSBNYXRoLmZsb29yKGRpZ2l0QiAvIGJhc2UpO1xuICAgICAgICBkaWdpdEIgJT0gYmFzZTtcbiAgICB9XG4gICAgLy8gQ29udmVydCBiYXNlLTFlNyBkaWdpdHMgdG8gYmFzZS0xMCwgd2l0aCBvcHRpb25hbCBsZWFkaW5nIHplcm9lcy5cbiAgICBmdW5jdGlvbiBkZWNpbWFsRnJvbTFlNyhkaWdpdDFlNywgbmVlZExlYWRpbmdaZXJvcykge1xuICAgICAgICBsZXQgcGFydGlhbCA9IGRpZ2l0MWU3ID8gU3RyaW5nKGRpZ2l0MWU3KSA6ICcnO1xuICAgICAgICBpZiAobmVlZExlYWRpbmdaZXJvcykge1xuICAgICAgICAgICAgcmV0dXJuICcwMDAwMDAwJy5zbGljZShwYXJ0aWFsLmxlbmd0aCkgKyBwYXJ0aWFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0aWFsO1xuICAgIH1cbiAgICByZXR1cm4gZGVjaW1hbEZyb20xZTcoZGlnaXRDLCAvKm5lZWRMZWFkaW5nWmVyb3M9Ki8gMCkgK1xuICAgICAgICBkZWNpbWFsRnJvbTFlNyhkaWdpdEIsIC8qbmVlZExlYWRpbmdaZXJvcz0qLyBkaWdpdEMpICtcbiAgICAgICAgLy8gSWYgdGhlIGZpbmFsIDFlNyBkaWdpdCBkaWRuJ3QgbmVlZCBsZWFkaW5nIHplcm9zLCB3ZSB3b3VsZCBoYXZlXG4gICAgICAgIC8vIHJldHVybmVkIHZpYSB0aGUgdHJpdmlhbCBjb2RlIHBhdGggYXQgdGhlIHRvcC5cbiAgICAgICAgZGVjaW1hbEZyb20xZTcoZGlnaXRBLCAvKm5lZWRMZWFkaW5nWmVyb3M9Ki8gMSk7XG59XG4vKipcbiAqIFdyaXRlIGEgMzIgYml0IHZhcmludCwgc2lnbmVkIG9yIHVuc2lnbmVkLiBTYW1lIGFzIGB2YXJpbnQ2NHdyaXRlKDAsIHZhbHVlLCBieXRlcylgXG4gKlxuICogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm90b2NvbGJ1ZmZlcnMvcHJvdG9idWYvYmxvYi8xYjE4ODMzZjRmMmEyZjY4MWY0ZTRhMjVjZGYzYjBhNDMxMTVlYzI2L2pzL2JpbmFyeS9lbmNvZGVyLmpzI0wxNDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhcmludDMyd3JpdGUodmFsdWUsIGJ5dGVzKSB7XG4gICAgaWYgKHZhbHVlID49IDApIHtcbiAgICAgICAgLy8gd3JpdGUgdmFsdWUgYXMgdmFyaW50IDMyXG4gICAgICAgIHdoaWxlICh2YWx1ZSA+IDB4N2YpIHtcbiAgICAgICAgICAgIGJ5dGVzLnB1c2goKHZhbHVlICYgMHg3ZikgfCAweDgwKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPj4+IDc7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7IGkrKykge1xuICAgICAgICAgICAgYnl0ZXMucHVzaCh2YWx1ZSAmIDEyNyB8IDEyOCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID4+IDc7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZXMucHVzaCgxKTtcbiAgICB9XG59XG4vKipcbiAqIFJlYWQgYW4gdW5zaWduZWQgMzIgYml0IHZhcmludC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3Byb3RvY29sYnVmZmVycy9wcm90b2J1Zi9ibG9iLzhhNzE5MjdkNzRhNGNlMzRlZmUyZDg3NjlmZGExOThmNTJkMjBkMTIvanMvZXhwZXJpbWVudGFsL3J1bnRpbWUva2VybmVsL2J1ZmZlcl9kZWNvZGVyLmpzI0wyMjBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhcmludDMycmVhZCgpIHtcbiAgICBsZXQgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgIGxldCByZXN1bHQgPSBiICYgMHg3RjtcbiAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Qm91bmRzKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGIgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICByZXN1bHQgfD0gKGIgJiAweDdGKSA8PCA3O1xuICAgIGlmICgoYiAmIDB4ODApID09IDApIHtcbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgIHJlc3VsdCB8PSAoYiAmIDB4N0YpIDw8IDE0O1xuICAgIGlmICgoYiAmIDB4ODApID09IDApIHtcbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgIHJlc3VsdCB8PSAoYiAmIDB4N0YpIDw8IDIxO1xuICAgIGlmICgoYiAmIDB4ODApID09IDApIHtcbiAgICAgICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgLy8gRXh0cmFjdCBvbmx5IGxhc3QgNCBiaXRzXG4gICAgYiA9IHRoaXMuYnVmW3RoaXMucG9zKytdO1xuICAgIHJlc3VsdCB8PSAoYiAmIDB4MEYpIDw8IDI4O1xuICAgIGZvciAobGV0IHJlYWRCeXRlcyA9IDU7ICgoYiAmIDB4ODApICE9PSAwKSAmJiByZWFkQnl0ZXMgPCAxMDsgcmVhZEJ5dGVzKyspXG4gICAgICAgIGIgPSB0aGlzLmJ1Zlt0aGlzLnBvcysrXTtcbiAgICBpZiAoKGIgJiAweDgwKSAhPSAwKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgdmFyaW50Jyk7XG4gICAgdGhpcy5hc3NlcnRCb3VuZHMoKTtcbiAgICAvLyBSZXN1bHQgY2FuIGhhdmUgMzIgYml0cywgY29udmVydCBpdCB0byB1bnNpZ25lZFxuICAgIHJldHVybiByZXN1bHQgPj4+IDA7XG59XG4iLCJjb25zdCBkZWZhdWx0c1dyaXRlID0ge1xuICAgIGVtaXREZWZhdWx0VmFsdWVzOiBmYWxzZSxcbiAgICBlbnVtQXNJbnRlZ2VyOiBmYWxzZSxcbiAgICB1c2VQcm90b0ZpZWxkTmFtZTogZmFsc2UsXG4gICAgcHJldHR5U3BhY2VzOiAwLFxufSwgZGVmYXVsdHNSZWFkID0ge1xuICAgIGlnbm9yZVVua25vd25GaWVsZHM6IGZhbHNlLFxufTtcbi8qKlxuICogTWFrZSBvcHRpb25zIGZvciByZWFkaW5nIEpTT04gZGF0YSBmcm9tIHBhcnRpYWwgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25SZWFkT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzUmVhZCksIG9wdGlvbnMpIDogZGVmYXVsdHNSZWFkO1xufVxuLyoqXG4gKiBNYWtlIG9wdGlvbnMgZm9yIHdyaXRpbmcgSlNPTiBkYXRhIGZyb20gcGFydGlhbCBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvbldyaXRlT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRzV3JpdGUpLCBvcHRpb25zKSA6IGRlZmF1bHRzV3JpdGU7XG59XG4vKipcbiAqIE1lcmdlcyBKU09OIHdyaXRlIG9yIHJlYWQgb3B0aW9ucy4gTGF0ZXIgdmFsdWVzIG92ZXJyaWRlIGVhcmxpZXIgdmFsdWVzLiBUeXBlIHJlZ2lzdHJpZXMgYXJlIG1lcmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlSnNvbk9wdGlvbnMoYSwgYikge1xuICAgIHZhciBfYSwgX2I7XG4gICAgbGV0IGMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGEpLCBiKTtcbiAgICBjLnR5cGVSZWdpc3RyeSA9IFsuLi4oKF9hID0gYSA9PT0gbnVsbCB8fCBhID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhLnR5cGVSZWdpc3RyeSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW10pLCAuLi4oKF9iID0gYiA9PT0gbnVsbCB8fCBiID09PSB2b2lkIDAgPyB2b2lkIDAgOiBiLnR5cGVSZWdpc3RyeSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW10pXTtcbiAgICByZXR1cm4gYztcbn1cbiIsIi8qKlxuICogR2V0IHRoZSB0eXBlIG9mIGEgSlNPTiB2YWx1ZS5cbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhcnJheSwgbnVsbCBhbmQgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHlwZW9mSnNvblZhbHVlKHZhbHVlKSB7XG4gICAgbGV0IHQgPSB0eXBlb2YgdmFsdWU7XG4gICAgaWYgKHQgPT0gXCJvYmplY3RcIikge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgICAgICAgICByZXR1cm4gXCJhcnJheVwiO1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgfVxuICAgIHJldHVybiB0O1xufVxuLyoqXG4gKiBJcyB0aGlzIGEgSlNPTiBvYmplY3QgKGluc3RlYWQgb2YgYW4gYXJyYXkgb3IgbnVsbCk/XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0pzb25PYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuIiwiLyoqXG4gKiBDb252ZXJ0cyBzbmFrZV9jYXNlIHRvIGxvd2VyQ2FtZWxDYXNlLlxuICpcbiAqIFNob3VsZCBiZWhhdmUgbGlrZSBwcm90b2M6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcHJvdG9jb2xidWZmZXJzL3Byb3RvYnVmL2Jsb2IvZThhZTEzN2M5NjQ0NGVhMzEzNDg1ZWQxMTE4YzVlNDNiMjA5OWNmMS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmNjI0wxMThcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvd2VyQ2FtZWxDYXNlKHNuYWtlQ2FzZSkge1xuICAgIGxldCBjYXBOZXh0ID0gZmFsc2U7XG4gICAgY29uc3Qgc2IgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNuYWtlQ2FzZS5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgbmV4dCA9IHNuYWtlQ2FzZS5jaGFyQXQoaSk7XG4gICAgICAgIGlmIChuZXh0ID09ICdfJykge1xuICAgICAgICAgICAgY2FwTmV4dCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoL1xcZC8udGVzdChuZXh0KSkge1xuICAgICAgICAgICAgc2IucHVzaChuZXh0KTtcbiAgICAgICAgICAgIGNhcE5leHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNhcE5leHQpIHtcbiAgICAgICAgICAgIHNiLnB1c2gobmV4dC50b1VwcGVyQ2FzZSgpKTtcbiAgICAgICAgICAgIGNhcE5leHQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHNiLnB1c2gobmV4dC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNiLnB1c2gobmV4dCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNiLmpvaW4oJycpO1xufVxuIiwiLyoqXG4gKiBUaGUgc3ltYm9sIHVzZWQgYXMgYSBrZXkgb24gbWVzc2FnZSBvYmplY3RzIHRvIHN0b3JlIHRoZSBtZXNzYWdlIHR5cGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgLSBpdCBpcyBoZXJlIHRvIHN0YXksIGJ1dFxuICogaW1wbGVtZW50YXRpb24gZGV0YWlscyBtYXkgY2hhbmdlIHdpdGhvdXQgbm90aWNlLlxuICovXG5leHBvcnQgY29uc3QgTUVTU0FHRV9UWVBFID0gU3ltYm9sLmZvcihcInByb3RvYnVmLXRzL21lc3NhZ2UtdHlwZVwiKTtcbiIsImltcG9ydCB7IE1FU1NBR0VfVFlQRSB9IGZyb20gXCIuL21lc3NhZ2UtdHlwZS1jb250cmFjdFwiO1xuaW1wb3J0IHsgbm9ybWFsaXplRmllbGRJbmZvIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uVHlwZUNoZWNrIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi10eXBlLWNoZWNrXCI7XG5pbXBvcnQgeyBSZWZsZWN0aW9uSnNvblJlYWRlciB9IGZyb20gXCIuL3JlZmxlY3Rpb24tanNvbi1yZWFkZXJcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb25Kc29uV3JpdGVyIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1qc29uLXdyaXRlclwiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbkJpbmFyeVJlYWRlciB9IGZyb20gXCIuL3JlZmxlY3Rpb24tYmluYXJ5LXJlYWRlclwiO1xuaW1wb3J0IHsgUmVmbGVjdGlvbkJpbmFyeVdyaXRlciB9IGZyb20gXCIuL3JlZmxlY3Rpb24tYmluYXJ5LXdyaXRlclwiO1xuaW1wb3J0IHsgcmVmbGVjdGlvbkNyZWF0ZSB9IGZyb20gXCIuL3JlZmxlY3Rpb24tY3JlYXRlXCI7XG5pbXBvcnQgeyByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1tZXJnZS1wYXJ0aWFsXCI7XG5pbXBvcnQgeyB0eXBlb2ZKc29uVmFsdWUgfSBmcm9tIFwiLi9qc29uLXR5cGluZ3NcIjtcbmltcG9ydCB7IGpzb25SZWFkT3B0aW9ucywganNvbldyaXRlT3B0aW9ucywgfSBmcm9tIFwiLi9qc29uLWZvcm1hdC1jb250cmFjdFwiO1xuaW1wb3J0IHsgcmVmbGVjdGlvbkVxdWFscyB9IGZyb20gXCIuL3JlZmxlY3Rpb24tZXF1YWxzXCI7XG5pbXBvcnQgeyBiaW5hcnlXcml0ZU9wdGlvbnMgfSBmcm9tIFwiLi9iaW5hcnktd3JpdGVyXCI7XG5pbXBvcnQgeyBiaW5hcnlSZWFkT3B0aW9ucyB9IGZyb20gXCIuL2JpbmFyeS1yZWFkZXJcIjtcbmNvbnN0IGJhc2VEZXNjcmlwdG9ycyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKE9iamVjdC5nZXRQcm90b3R5cGVPZih7fSkpO1xuLyoqXG4gKiBUaGlzIHN0YW5kYXJkIG1lc3NhZ2UgdHlwZSBwcm92aWRlcyByZWZsZWN0aW9uLWJhc2VkXG4gKiBvcGVyYXRpb25zIHRvIHdvcmsgd2l0aCBhIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZXNzYWdlVHlwZSB7XG4gICAgY29uc3RydWN0b3IobmFtZSwgZmllbGRzLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdENoZWNrRGVwdGggPSAxNjtcbiAgICAgICAgdGhpcy50eXBlTmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuZmllbGRzID0gZmllbGRzLm1hcChub3JtYWxpemVGaWVsZEluZm8pO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zICE9PSBudWxsICYmIG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcbiAgICAgICAgdGhpcy5tZXNzYWdlUHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShudWxsLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGJhc2VEZXNjcmlwdG9ycyksIHsgW01FU1NBR0VfVFlQRV06IHsgdmFsdWU6IHRoaXMgfSB9KSk7XG4gICAgICAgIHRoaXMucmVmVHlwZUNoZWNrID0gbmV3IFJlZmxlY3Rpb25UeXBlQ2hlY2sodGhpcyk7XG4gICAgICAgIHRoaXMucmVmSnNvblJlYWRlciA9IG5ldyBSZWZsZWN0aW9uSnNvblJlYWRlcih0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZKc29uV3JpdGVyID0gbmV3IFJlZmxlY3Rpb25Kc29uV3JpdGVyKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZkJpblJlYWRlciA9IG5ldyBSZWZsZWN0aW9uQmluYXJ5UmVhZGVyKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZkJpbldyaXRlciA9IG5ldyBSZWZsZWN0aW9uQmluYXJ5V3JpdGVyKHRoaXMpO1xuICAgIH1cbiAgICBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSByZWZsZWN0aW9uQ3JlYXRlKHRoaXMpO1xuICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBtZXNzYWdlLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENsb25lIHRoZSBtZXNzYWdlLlxuICAgICAqXG4gICAgICogVW5rbm93biBmaWVsZHMgYXJlIGRpc2NhcmRlZC5cbiAgICAgKi9cbiAgICBjbG9uZShtZXNzYWdlKSB7XG4gICAgICAgIGxldCBjb3B5ID0gdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgcmVmbGVjdGlvbk1lcmdlUGFydGlhbCh0aGlzLCBjb3B5LCBtZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgd2hldGhlciB0d28gbWVzc2FnZSBvZiB0aGUgc2FtZSB0eXBlIGhhdmUgdGhlIHNhbWUgZmllbGQgdmFsdWVzLlxuICAgICAqIENoZWNrcyBmb3IgZGVlcCBlcXVhbGl0eSwgdHJhdmVyc2luZyByZXBlYXRlZCBmaWVsZHMsIG9uZW9mIGdyb3VwcywgbWFwc1xuICAgICAqIGFuZCBtZXNzYWdlcyByZWN1cnNpdmVseS5cbiAgICAgKiBXaWxsIGFsc28gcmV0dXJuIHRydWUgaWYgYm90aCBtZXNzYWdlcyBhcmUgYHVuZGVmaW5lZGAuXG4gICAgICovXG4gICAgZXF1YWxzKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25FcXVhbHModGhpcywgYSwgYik7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoZSBnaXZlbiB2YWx1ZSBhc3NpZ25hYmxlIHRvIG91ciBtZXNzYWdlIHR5cGVcbiAgICAgKiBhbmQgY29udGFpbnMgbm8gW2V4Y2VzcyBwcm9wZXJ0aWVzXShodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9pbnRlcmZhY2VzLmh0bWwjZXhjZXNzLXByb3BlcnR5LWNoZWNrcyk/XG4gICAgICovXG4gICAgaXMoYXJnLCBkZXB0aCA9IHRoaXMuZGVmYXVsdENoZWNrRGVwdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmVHlwZUNoZWNrLmlzKGFyZywgZGVwdGgsIGZhbHNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIGdpdmVuIHZhbHVlIGFzc2lnbmFibGUgdG8gb3VyIG1lc3NhZ2UgdHlwZSxcbiAgICAgKiByZWdhcmRsZXNzIG9mIFtleGNlc3MgcHJvcGVydGllc10oaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svaW50ZXJmYWNlcy5odG1sI2V4Y2Vzcy1wcm9wZXJ0eS1jaGVja3MpP1xuICAgICAqL1xuICAgIGlzQXNzaWduYWJsZShhcmcsIGRlcHRoID0gdGhpcy5kZWZhdWx0Q2hlY2tEZXB0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZUeXBlQ2hlY2suaXMoYXJnLCBkZXB0aCwgdHJ1ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvcHkgcGFydGlhbCBkYXRhIGludG8gdGhlIHRhcmdldCBtZXNzYWdlLlxuICAgICAqL1xuICAgIG1lcmdlUGFydGlhbCh0YXJnZXQsIHNvdXJjZSkge1xuICAgICAgICByZWZsZWN0aW9uTWVyZ2VQYXJ0aWFsKHRoaXMsIHRhcmdldCwgc291cmNlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IG1lc3NhZ2UgZnJvbSBiaW5hcnkgZm9ybWF0LlxuICAgICAqL1xuICAgIGZyb21CaW5hcnkoZGF0YSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgb3B0ID0gYmluYXJ5UmVhZE9wdGlvbnMob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsQmluYXJ5UmVhZChvcHQucmVhZGVyRmFjdG9yeShkYXRhKSwgZGF0YS5ieXRlTGVuZ3RoLCBvcHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkIGEgbmV3IG1lc3NhZ2UgZnJvbSBhIEpTT04gdmFsdWUuXG4gICAgICovXG4gICAgZnJvbUpzb24oanNvbiwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEpzb25SZWFkKGpzb24sIGpzb25SZWFkT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJlYWQgYSBuZXcgbWVzc2FnZSBmcm9tIGEgSlNPTiBzdHJpbmcuXG4gICAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBULmZyb21Kc29uKEpTT04ucGFyc2UoanNvbikpYC5cbiAgICAgKi9cbiAgICBmcm9tSnNvblN0cmluZyhqc29uLCBvcHRpb25zKSB7XG4gICAgICAgIGxldCB2YWx1ZSA9IEpTT04ucGFyc2UoanNvbik7XG4gICAgICAgIHJldHVybiB0aGlzLmZyb21Kc29uKHZhbHVlLCBvcHRpb25zKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogV3JpdGUgdGhlIG1lc3NhZ2UgdG8gY2Fub25pY2FsIEpTT04gdmFsdWUuXG4gICAgICovXG4gICAgdG9Kc29uKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxKc29uV3JpdGUobWVzc2FnZSwganNvbldyaXRlT3B0aW9ucyhvcHRpb25zKSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdGhlIG1lc3NhZ2UgdG8gY2Fub25pY2FsIEpTT04gc3RyaW5nLlxuICAgICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgSlNPTi5zdHJpbmdpZnkoVC50b0pzb24odCkpYFxuICAgICAqL1xuICAgIHRvSnNvblN0cmluZyhtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy50b0pzb24obWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZXR0eVNwYWNlcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFdyaXRlIHRoZSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQuXG4gICAgICovXG4gICAgdG9CaW5hcnkobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgb3B0ID0gYmluYXJ5V3JpdGVPcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEJpbmFyeVdyaXRlKG1lc3NhZ2UsIG9wdC53cml0ZXJGYWN0b3J5KCksIG9wdCkuZmluaXNoKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kLiBJZiB5b3UganVzdCB3YW50IHRvIHJlYWQgYSBtZXNzYWdlIGZyb21cbiAgICAgKiBKU09OLCB1c2UgYGZyb21Kc29uKClgIG9yIGBmcm9tSnNvblN0cmluZygpYC5cbiAgICAgKlxuICAgICAqIFJlYWRzIEpTT04gdmFsdWUgYW5kIG1lcmdlcyB0aGUgZmllbGRzIGludG8gdGhlIHRhcmdldFxuICAgICAqIGFjY29yZGluZyB0byBwcm90b2J1ZiBydWxlcy4gSWYgdGhlIHRhcmdldCBpcyBvbWl0dGVkLFxuICAgICAqIGEgbmV3IGluc3RhbmNlIGlzIGNyZWF0ZWQgZmlyc3QuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uUmVhZChqc29uLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgaWYgKGpzb24gIT09IG51bGwgJiYgdHlwZW9mIGpzb24gPT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShqc29uKSkge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5yZWZKc29uUmVhZGVyLnJlYWQoanNvbiwgbWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBwYXJzZSBtZXNzYWdlICR7dGhpcy50eXBlTmFtZX0gZnJvbSBKU09OICR7dHlwZW9mSnNvblZhbHVlKGpzb24pfS5gKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QuIElmIHlvdSBqdXN0IHdhbnQgdG8gd3JpdGUgYSBtZXNzYWdlXG4gICAgICogdG8gSlNPTiwgdXNlIGB0b0pzb24oKWAgb3IgYHRvSnNvblN0cmluZygpLlxuICAgICAqXG4gICAgICogV3JpdGVzIEpTT04gdmFsdWUgYW5kIHJldHVybnMgaXQuXG4gICAgICovXG4gICAgaW50ZXJuYWxKc29uV3JpdGUobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZKc29uV3JpdGVyLndyaXRlKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGFuIGludGVybmFsIG1ldGhvZC4gSWYgeW91IGp1c3Qgd2FudCB0byB3cml0ZSBhIG1lc3NhZ2VcbiAgICAgKiBpbiBiaW5hcnkgZm9ybWF0LCB1c2UgYHRvQmluYXJ5KClgLlxuICAgICAqXG4gICAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSBpbiBiaW5hcnkgZm9ybWF0IGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBnaXZlblxuICAgICAqIHdyaXRlci4gUmV0dXJucyBwYXNzZWQgd3JpdGVyLlxuICAgICAqL1xuICAgIGludGVybmFsQmluYXJ5V3JpdGUobWVzc2FnZSwgd3JpdGVyLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMucmVmQmluV3JpdGVyLndyaXRlKG1lc3NhZ2UsIHdyaXRlciwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB3cml0ZXI7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kLiBJZiB5b3UganVzdCB3YW50IHRvIHJlYWQgYSBtZXNzYWdlIGZyb21cbiAgICAgKiBiaW5hcnkgZGF0YSwgdXNlIGBmcm9tQmluYXJ5KClgLlxuICAgICAqXG4gICAgICogUmVhZHMgZGF0YSBmcm9tIGJpbmFyeSBmb3JtYXQgYW5kIG1lcmdlcyB0aGUgZmllbGRzIGludG9cbiAgICAgKiB0aGUgdGFyZ2V0IGFjY29yZGluZyB0byBwcm90b2J1ZiBydWxlcy4gSWYgdGhlIHRhcmdldCBpc1xuICAgICAqIG9taXR0ZWQsIGEgbmV3IGluc3RhbmNlIGlzIGNyZWF0ZWQgZmlyc3QuXG4gICAgICovXG4gICAgaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgbGVuZ3RoLCBvcHRpb25zLCB0YXJnZXQpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0YXJnZXQgIT09IG51bGwgJiYgdGFyZ2V0ICE9PSB2b2lkIDAgPyB0YXJnZXQgOiB0aGlzLmNyZWF0ZSgpO1xuICAgICAgICB0aGlzLnJlZkJpblJlYWRlci5yZWFkKHJlYWRlciwgbWVzc2FnZSwgb3B0aW9ucywgbGVuZ3RoKTtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBJcyB0aGUgZ2l2ZW4gdmFsdWUgYSB2YWxpZCBvbmVvZiBncm91cD9cbiAqXG4gKiBXZSByZXByZXNlbnQgcHJvdG9idWYgYG9uZW9mYCBhcyBhbGdlYnJhaWMgZGF0YSB0eXBlcyAoQURUKSBpbiBnZW5lcmF0ZWRcbiAqIGNvZGUuIEJ1dCB3aGVuIHdvcmtpbmcgd2l0aCBtZXNzYWdlcyBvZiB1bmtub3duIHR5cGUsIHRoZSBBRFQgZG9lcyBub3RcbiAqIGhlbHAgdXMuXG4gKlxuICogVGhpcyB0eXBlIGd1YXJkIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGFkaGVyZXMgdG8gdGhlIEFEVCBydWxlcywgd2hpY2hcbiAqIGFyZSBhcyBmb2xsb3dzOlxuICpcbiAqIDEpIE11c3QgYmUgYW4gb2JqZWN0LlxuICpcbiAqIDIpIE11c3QgaGF2ZSBhIFwib25lb2ZLaW5kXCIgZGlzY3JpbWluYXRvciBwcm9wZXJ0eS5cbiAqXG4gKiAzKSBJZiBcIm9uZW9mS2luZFwiIGlzIGB1bmRlZmluZWRgLCBubyBtZW1iZXIgZmllbGQgaXMgc2VsZWN0ZWQuIFRoZSBvYmplY3RcbiAqIG11c3Qgbm90IGhhdmUgYW55IG90aGVyIHByb3BlcnRpZXMuXG4gKlxuICogNCkgSWYgXCJvbmVvZktpbmRcIiBpcyBhIGBzdHJpbmdgLCB0aGUgbWVtYmVyIGZpZWxkIHdpdGggdGhpcyBuYW1lIGlzXG4gKiBzZWxlY3RlZC5cbiAqXG4gKiA1KSBJZiBhIG1lbWJlciBmaWVsZCBpcyBzZWxlY3RlZCwgdGhlIG9iamVjdCBtdXN0IGhhdmUgYSBzZWNvbmQgcHJvcGVydHlcbiAqIHdpdGggdGhpcyBuYW1lLiBUaGUgcHJvcGVydHkgbXVzdCBub3QgYmUgYHVuZGVmaW5lZGAuXG4gKlxuICogNikgTm8gZXh0cmEgcHJvcGVydGllcyBhcmUgYWxsb3dlZC4gVGhlIG9iamVjdCBoYXMgZWl0aGVyIG9uZSBwcm9wZXJ0eVxuICogKG5vIHNlbGVjdGlvbikgb3IgdHdvIHByb3BlcnRpZXMgKHNlbGVjdGlvbikuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPbmVvZkdyb3VwKGFueSkge1xuICAgIGlmICh0eXBlb2YgYW55ICE9ICdvYmplY3QnIHx8IGFueSA9PT0gbnVsbCB8fCAhYW55Lmhhc093blByb3BlcnR5KCdvbmVvZktpbmQnKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHN3aXRjaCAodHlwZW9mIGFueS5vbmVvZktpbmQpIHtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgaWYgKGFueVthbnkub25lb2ZLaW5kXSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhhbnkpLmxlbmd0aCA9PSAyO1xuICAgICAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoYW55KS5sZW5ndGggPT0gMTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vKipcbiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCBpbiBhIG9uZW9mIGdyb3VwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T25lb2ZWYWx1ZShvbmVvZiwga2luZCkge1xuICAgIHJldHVybiBvbmVvZltraW5kXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRPbmVvZlZhbHVlKG9uZW9mLCBraW5kLCB2YWx1ZSkge1xuICAgIGlmIChvbmVvZi5vbmVvZktpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkZWxldGUgb25lb2Zbb25lb2Yub25lb2ZLaW5kXTtcbiAgICB9XG4gICAgb25lb2Yub25lb2ZLaW5kID0ga2luZDtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBvbmVvZltraW5kXSA9IHZhbHVlO1xuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzZXRVbmtub3duT25lb2ZWYWx1ZShvbmVvZiwga2luZCwgdmFsdWUpIHtcbiAgICBpZiAob25lb2Yub25lb2ZLaW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIG9uZW9mW29uZW9mLm9uZW9mS2luZF07XG4gICAgfVxuICAgIG9uZW9mLm9uZW9mS2luZCA9IGtpbmQ7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYga2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG9uZW9mW2tpbmRdID0gdmFsdWU7XG4gICAgfVxufVxuLyoqXG4gKiBSZW1vdmVzIHRoZSBzZWxlY3RlZCBmaWVsZCBpbiBhIG9uZW9mIGdyb3VwLlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIG1vZGlmeSBhIG9uZW9mIGdyb3VwIGlzIHRvIHNldFxuICogYSBuZXcgb2JqZWN0OlxuICpcbiAqIGBgYHRzXG4gKiBtZXNzYWdlLnJlc3VsdCA9IHsgb25lb2ZLaW5kOiB1bmRlZmluZWQgfTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJPbmVvZlZhbHVlKG9uZW9mKSB7XG4gICAgaWYgKG9uZW9mLm9uZW9mS2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSBvbmVvZltvbmVvZi5vbmVvZktpbmRdO1xuICAgIH1cbiAgICBvbmVvZi5vbmVvZktpbmQgPSB1bmRlZmluZWQ7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHZhbHVlIG9mIHRoZSBnaXZlbiBvbmVvZiBncm91cC5cbiAqXG4gKiBOb3QgdGhhdCB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGFjY2VzcyBhIG9uZW9mIGdyb3VwIGlzIHRvIGNoZWNrXG4gKiB0aGUgXCJvbmVvZktpbmRcIiBwcm9wZXJ0eSBhbmQgbGV0IFR5cGVTY3JpcHQgbmFycm93IGRvd24gdGhlIHVuaW9uXG4gKiB0eXBlIGZvciB5b3U6XG4gKlxuICogYGBgdHNcbiAqIGlmIChtZXNzYWdlLnJlc3VsdC5vbmVvZktpbmQgPT09IFwiZXJyb3JcIikge1xuICogICBtZXNzYWdlLnJlc3VsdC5lcnJvcjsgLy8gc3RyaW5nXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBJbiB0aGUgcmFyZSBjYXNlIHlvdSBqdXN0IG5lZWQgdGhlIHZhbHVlLCBhbmQgZG8gbm90IGNhcmUgYWJvdXRcbiAqIHdoaWNoIHByb3RvYnVmIGZpZWxkIGlzIHNlbGVjdGVkLCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uXG4gKiBmb3IgY29udmVuaWVuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWxlY3RlZE9uZW9mVmFsdWUob25lb2YpIHtcbiAgICBpZiAob25lb2Yub25lb2ZLaW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIG9uZW9mW29uZW9mLm9uZW9mS2luZF07XG59XG4iLCJpbXBvcnQgeyBpbnQ2NGZyb21TdHJpbmcsIGludDY0dG9TdHJpbmcgfSBmcm9tIFwiLi9nb29nLXZhcmludFwiO1xubGV0IEJJO1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdEJpKCkge1xuICAgIGNvbnN0IGR2ID0gbmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcig4KSk7XG4gICAgY29uc3Qgb2sgPSBnbG9iYWxUaGlzLkJpZ0ludCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmIHR5cGVvZiBkdi5nZXRCaWdJbnQ2NCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICYmIHR5cGVvZiBkdi5nZXRCaWdVaW50NjQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAmJiB0eXBlb2YgZHYuc2V0QmlnSW50NjQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAmJiB0eXBlb2YgZHYuc2V0QmlnVWludDY0ID09PSBcImZ1bmN0aW9uXCI7XG4gICAgQkkgPSBvayA/IHtcbiAgICAgICAgTUlOOiBCaWdJbnQoXCItOTIyMzM3MjAzNjg1NDc3NTgwOFwiKSxcbiAgICAgICAgTUFYOiBCaWdJbnQoXCI5MjIzMzcyMDM2ODU0Nzc1ODA3XCIpLFxuICAgICAgICBVTUlOOiBCaWdJbnQoXCIwXCIpLFxuICAgICAgICBVTUFYOiBCaWdJbnQoXCIxODQ0Njc0NDA3MzcwOTU1MTYxNVwiKSxcbiAgICAgICAgQzogQmlnSW50LFxuICAgICAgICBWOiBkdixcbiAgICB9IDogdW5kZWZpbmVkO1xufVxuZGV0ZWN0QmkoKTtcbmZ1bmN0aW9uIGFzc2VydEJpKGJpKSB7XG4gICAgaWYgKCFiaSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQmlnSW50IHVuYXZhaWxhYmxlLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3RpbW9zdGFtbS9wcm90b2J1Zi10cy9ibG9iL3YxLjAuOC9NQU5VQUwubWQjYmlnaW50LXN1cHBvcnRcIik7XG59XG4vLyB1c2VkIHRvIHZhbGlkYXRlIGZyb20oc3RyaW5nKSBpbnB1dCAod2hlbiBiaWdpbnQgaXMgdW5hdmFpbGFibGUpXG5jb25zdCBSRV9ERUNJTUFMX1NUUiA9IC9eLT9bMC05XSskLztcbi8vIGNvbnN0YW50cyBmb3IgYmluYXJ5IG1hdGhcbmNvbnN0IFRXT19QV1JfMzJfREJMID0gMHgxMDAwMDAwMDA7XG5jb25zdCBIQUxGXzJfUFdSXzMyID0gMHgwODAwMDAwMDA7XG4vLyBiYXNlIGNsYXNzIGZvciBQYkxvbmcgYW5kIFBiVUxvbmcgcHJvdmlkZXMgc2hhcmVkIGNvZGVcbmNsYXNzIFNoYXJlZFBiTG9uZyB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIGJpdHMuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IobG8sIGhpKSB7XG4gICAgICAgIHRoaXMubG8gPSBsbyB8IDA7XG4gICAgICAgIHRoaXMuaGkgPSBoaSB8IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIElzIHRoaXMgaW5zdGFuY2UgZXF1YWwgdG8gMD9cbiAgICAgKi9cbiAgICBpc1plcm8oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvID09IDAgJiYgdGhpcy5oaSA9PSAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRvIGEgbmF0aXZlIG51bWJlci5cbiAgICAgKi9cbiAgICB0b051bWJlcigpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuaGkgKiBUV09fUFdSXzMyX0RCTCArICh0aGlzLmxvID4+PiAwKTtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihyZXN1bHQpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IGNvbnZlcnQgdG8gc2FmZSBudW1iZXJcIik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuLyoqXG4gKiA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciBhcyB0d28gMzItYml0IHZhbHVlcy5cbiAqIENvbnZlcnRzIGJldHdlZW4gYHN0cmluZ2AsIGBudW1iZXJgIGFuZCBgYmlnaW50YCByZXByZXNlbnRhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQYlVMb25nIGV4dGVuZHMgU2hhcmVkUGJMb25nIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgaW5zdGFuY2UgZnJvbSBhIGBzdHJpbmdgLCBgbnVtYmVyYCBvciBgYmlnaW50YC5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbSh2YWx1ZSkge1xuICAgICAgICBpZiAoQkkpXG4gICAgICAgICAgICAvLyBub2luc3BlY3Rpb24gRmFsbFRocm91Z2hJblN3aXRjaFN0YXRlbWVudEpTXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiMFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmluZyBpcyBubyBpbnRlZ2VyJyk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQkkuQyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEJJLkModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IEJJLlVNSU4pXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCB2YWx1ZSBmb3IgdWxvbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gQkkuVU1BWClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndWxvbmcgdG9vIGxhcmdlJyk7XG4gICAgICAgICAgICAgICAgICAgIEJJLlYuc2V0QmlnVWludDY0KDAsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYlVMb25nKEJJLlYuZ2V0SW50MzIoMCwgdHJ1ZSksIEJJLlYuZ2V0SW50MzIoNCwgdHJ1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiMFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghUkVfREVDSU1BTF9TVFIudGVzdCh2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmluZyBpcyBubyBpbnRlZ2VyJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBbbWludXMsIGxvLCBoaV0gPSBpbnQ2NGZyb21TdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWludXMpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25lZCB2YWx1ZSBmb3IgdWxvbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYlVMb25nKGxvLCBoaSk7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIodmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdudW1iZXIgaXMgbm8gaW50ZWdlcicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduZWQgdmFsdWUgZm9yIHVsb25nJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGJVTG9uZyh2YWx1ZSwgdmFsdWUgLyBUV09fUFdSXzMyX0RCTCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biB2YWx1ZSAnICsgdHlwZW9mIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCB0byBkZWNpbWFsIHN0cmluZy5cbiAgICAgKi9cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIEJJID8gdGhpcy50b0JpZ0ludCgpLnRvU3RyaW5nKCkgOiBpbnQ2NHRvU3RyaW5nKHRoaXMubG8sIHRoaXMuaGkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRvIG5hdGl2ZSBiaWdpbnQuXG4gICAgICovXG4gICAgdG9CaWdJbnQoKSB7XG4gICAgICAgIGFzc2VydEJpKEJJKTtcbiAgICAgICAgQkkuVi5zZXRJbnQzMigwLCB0aGlzLmxvLCB0cnVlKTtcbiAgICAgICAgQkkuVi5zZXRJbnQzMig0LCB0aGlzLmhpLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIEJJLlYuZ2V0QmlnVWludDY0KDAsIHRydWUpO1xuICAgIH1cbn1cbi8qKlxuICogdWxvbmcgMCBzaW5nbGV0b24uXG4gKi9cblBiVUxvbmcuWkVSTyA9IG5ldyBQYlVMb25nKDAsIDApO1xuLyoqXG4gKiA2NC1iaXQgc2lnbmVkIGludGVnZXIgYXMgdHdvIDMyLWJpdCB2YWx1ZXMuXG4gKiBDb252ZXJ0cyBiZXR3ZWVuIGBzdHJpbmdgLCBgbnVtYmVyYCBhbmQgYGJpZ2ludGAgcmVwcmVzZW50YXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgUGJMb25nIGV4dGVuZHMgU2hhcmVkUGJMb25nIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgaW5zdGFuY2UgZnJvbSBhIGBzdHJpbmdgLCBgbnVtYmVyYCBvciBgYmlnaW50YC5cbiAgICAgKi9cbiAgICBzdGF0aWMgZnJvbSh2YWx1ZSkge1xuICAgICAgICBpZiAoQkkpXG4gICAgICAgICAgICAvLyBub2luc3BlY3Rpb24gRmFsbFRocm91Z2hJblN3aXRjaFN0YXRlbWVudEpTXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiMFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmluZyBpcyBubyBpbnRlZ2VyJyk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gQkkuQyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5aRVJPO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEJJLkModmFsdWUpO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IEJJLk1JTilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVkIGxvbmcgdG9vIHNtYWxsJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IEJJLk1BWClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVkIGxvbmcgdG9vIGxhcmdlJyk7XG4gICAgICAgICAgICAgICAgICAgIEJJLlYuc2V0QmlnSW50NjQoMCwgdmFsdWUsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBiTG9uZyhCSS5WLmdldEludDMyKDAsIHRydWUpLCBCSS5WLmdldEludDMyKDQsIHRydWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBcIjBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlpFUk87XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVJFX0RFQ0lNQUxfU1RSLnRlc3QodmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdHJpbmcgaXMgbm8gaW50ZWdlcicpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgW21pbnVzLCBsbywgaGldID0gaW50NjRmcm9tU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1pbnVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGkgPiBIQUxGXzJfUFdSXzMyIHx8IChoaSA9PSBIQUxGXzJfUFdSXzMyICYmIGxvICE9IDApKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVkIGxvbmcgdG9vIHNtYWxsJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGkgPj0gSEFMRl8yX1BXUl8zMilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc2lnbmVkIGxvbmcgdG9vIGxhcmdlJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYmwgPSBuZXcgUGJMb25nKGxvLCBoaSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtaW51cyA/IHBibC5uZWdhdGUoKSA6IHBibDtcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuWkVSTztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ251bWJlciBpcyBubyBpbnRlZ2VyJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFBiTG9uZyh2YWx1ZSwgdmFsdWUgLyBUV09fUFdSXzMyX0RCTClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFBiTG9uZygtdmFsdWUsIC12YWx1ZSAvIFRXT19QV1JfMzJfREJMKS5uZWdhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIHZhbHVlICcgKyB0eXBlb2YgdmFsdWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEbyB3ZSBoYXZlIGEgbWludXMgc2lnbj9cbiAgICAgKi9cbiAgICBpc05lZ2F0aXZlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuaGkgJiBIQUxGXzJfUFdSXzMyKSAhPT0gMDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTmVnYXRlIHR3bydzIGNvbXBsZW1lbnQuXG4gICAgICogSW52ZXJ0IGFsbCB0aGUgYml0cyBhbmQgYWRkIG9uZSB0byB0aGUgcmVzdWx0LlxuICAgICAqL1xuICAgIG5lZ2F0ZSgpIHtcbiAgICAgICAgbGV0IGhpID0gfnRoaXMuaGksIGxvID0gdGhpcy5sbztcbiAgICAgICAgaWYgKGxvKVxuICAgICAgICAgICAgbG8gPSB+bG8gKyAxO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBoaSArPSAxO1xuICAgICAgICByZXR1cm4gbmV3IFBiTG9uZyhsbywgaGkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRvIGRlY2ltYWwgc3RyaW5nLlxuICAgICAqL1xuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICBpZiAoQkkpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0JpZ0ludCgpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmICh0aGlzLmlzTmVnYXRpdmUoKSkge1xuICAgICAgICAgICAgbGV0IG4gPSB0aGlzLm5lZ2F0ZSgpO1xuICAgICAgICAgICAgcmV0dXJuICctJyArIGludDY0dG9TdHJpbmcobi5sbywgbi5oaSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGludDY0dG9TdHJpbmcodGhpcy5sbywgdGhpcy5oaSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgdG8gbmF0aXZlIGJpZ2ludC5cbiAgICAgKi9cbiAgICB0b0JpZ0ludCgpIHtcbiAgICAgICAgYXNzZXJ0QmkoQkkpO1xuICAgICAgICBCSS5WLnNldEludDMyKDAsIHRoaXMubG8sIHRydWUpO1xuICAgICAgICBCSS5WLnNldEludDMyKDQsIHRoaXMuaGksIHRydWUpO1xuICAgICAgICByZXR1cm4gQkkuVi5nZXRCaWdJbnQ2NCgwLCB0cnVlKTtcbiAgICB9XG59XG4vKipcbiAqIGxvbmcgMCBzaW5nbGV0b24uXG4gKi9cblBiTG9uZy5aRVJPID0gbmV3IFBiTG9uZygwLCAwKTtcbiIsImltcG9ydCB7IFVua25vd25GaWVsZEhhbmRsZXIsIFdpcmVUeXBlIH0gZnJvbSBcIi4vYmluYXJ5LWZvcm1hdC1jb250cmFjdFwiO1xuaW1wb3J0IHsgTG9uZ1R5cGUsIFNjYWxhclR5cGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbmltcG9ydCB7IHJlZmxlY3Rpb25Mb25nQ29udmVydCB9IGZyb20gXCIuL3JlZmxlY3Rpb24tbG9uZy1jb252ZXJ0XCI7XG5pbXBvcnQgeyByZWZsZWN0aW9uU2NhbGFyRGVmYXVsdCB9IGZyb20gXCIuL3JlZmxlY3Rpb24tc2NhbGFyLWRlZmF1bHRcIjtcbi8qKlxuICogUmVhZHMgcHJvdG8zIG1lc3NhZ2VzIGluIGJpbmFyeSBmb3JtYXQgdXNpbmcgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvZW5jb2RpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZmxlY3Rpb25CaW5hcnlSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKGluZm8pIHtcbiAgICAgICAgdGhpcy5pbmZvID0gaW5mbztcbiAgICB9XG4gICAgcHJlcGFyZSgpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBpZiAoIXRoaXMuZmllbGROb1RvRmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkc0lucHV0ID0gKF9hID0gdGhpcy5pbmZvLmZpZWxkcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW107XG4gICAgICAgICAgICB0aGlzLmZpZWxkTm9Ub0ZpZWxkID0gbmV3IE1hcChmaWVsZHNJbnB1dC5tYXAoZmllbGQgPT4gW2ZpZWxkLm5vLCBmaWVsZF0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZWFkcyBhIG1lc3NhZ2UgZnJvbSBiaW5hcnkgZm9ybWF0IGludG8gdGhlIHRhcmdldCBtZXNzYWdlLlxuICAgICAqXG4gICAgICogUmVwZWF0ZWQgZmllbGRzIGFyZSBhcHBlbmRlZC4gTWFwIGVudHJpZXMgYXJlIGFkZGVkLCBvdmVyd3JpdGluZ1xuICAgICAqIGV4aXN0aW5nIGtleXMuXG4gICAgICpcbiAgICAgKiBJZiBhIG1lc3NhZ2UgZmllbGQgaXMgYWxyZWFkeSBwcmVzZW50LCBpdCB3aWxsIGJlIG1lcmdlZCB3aXRoIHRoZVxuICAgICAqIG5ldyBkYXRhLlxuICAgICAqL1xuICAgIHJlYWQocmVhZGVyLCBtZXNzYWdlLCBvcHRpb25zLCBsZW5ndGgpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgIGNvbnN0IGVuZCA9IGxlbmd0aCA9PT0gdW5kZWZpbmVkID8gcmVhZGVyLmxlbiA6IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIHdoaWxlIChyZWFkZXIucG9zIDwgZW5kKSB7XG4gICAgICAgICAgICAvLyByZWFkIHRoZSB0YWcgYW5kIGZpbmQgdGhlIGZpZWxkXG4gICAgICAgICAgICBjb25zdCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpLCBmaWVsZCA9IHRoaXMuZmllbGROb1RvRmllbGQuZ2V0KGZpZWxkTm8pO1xuICAgICAgICAgICAgaWYgKCFmaWVsZCkge1xuICAgICAgICAgICAgICAgIGxldCB1ID0gb3B0aW9ucy5yZWFkVW5rbm93bkZpZWxkO1xuICAgICAgICAgICAgICAgIGlmICh1ID09IFwidGhyb3dcIilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgZm9yICR7dGhpcy5pbmZvLnR5cGVOYW1lfWApO1xuICAgICAgICAgICAgICAgIGxldCBkID0gcmVhZGVyLnNraXAod2lyZVR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgKHUgPT09IHRydWUgPyBVbmtub3duRmllbGRIYW5kbGVyLm9uUmVhZCA6IHUpKHRoaXMuaW5mby50eXBlTmFtZSwgbWVzc2FnZSwgZmllbGRObywgd2lyZVR5cGUsIGQpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGFyZ2V0IG9iamVjdCBmb3IgdGhlIGZpZWxkIHdlIGFyZSByZWFkaW5nXG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gbWVzc2FnZSwgcmVwZWF0ZWQgPSBmaWVsZC5yZXBlYXQsIGxvY2FsTmFtZSA9IGZpZWxkLmxvY2FsTmFtZTtcbiAgICAgICAgICAgIC8vIGlmIGZpZWxkIGlzIG1lbWJlciBvZiBvbmVvZiBBRFQsIHVzZSBBRFQgYXMgdGFyZ2V0XG4gICAgICAgICAgICBpZiAoZmllbGQub25lb2YpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXRbZmllbGQub25lb2ZdO1xuICAgICAgICAgICAgICAgIC8vIGlmIG90aGVyIG9uZW9mIG1lbWJlciBzZWxlY3RlZCwgc2V0IG5ldyBBRFRcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lm9uZW9mS2luZCAhPT0gbG9jYWxOYW1lKVxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBtZXNzYWdlW2ZpZWxkLm9uZW9mXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uZW9mS2luZDogbG9jYWxOYW1lXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGhhbmRsZWQgb25lb2YgYWJvdmUsIHdlIGp1c3QgaGF2ZSByZWFkIHRoZSB2YWx1ZSBpbnRvIGB0YXJnZXRbbG9jYWxOYW1lXWBcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICBsZXQgVCA9IGZpZWxkLmtpbmQgPT0gXCJlbnVtXCIgPyBTY2FsYXJUeXBlLklOVDMyIDogZmllbGQuVDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IEwgPSBmaWVsZC5raW5kID09IFwic2NhbGFyXCIgPyBmaWVsZC5MIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVwZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcnIgPSB0YXJnZXRbbG9jYWxOYW1lXTsgLy8gc2FmZSB0byBhc3N1bWUgcHJlc2VuY2Ugb2YgYXJyYXksIG9uZW9mIGNhbm5vdCBjb250YWluIHJlcGVhdGVkIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpcmVUeXBlID09IFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCAmJiBUICE9IFNjYWxhclR5cGUuU1RSSU5HICYmIFQgIT0gU2NhbGFyVHlwZS5CWVRFUykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlID0gcmVhZGVyLnVpbnQzMigpICsgcmVhZGVyLnBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocmVhZGVyLnBvcyA8IGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuc2NhbGFyKHJlYWRlciwgVCwgTCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKHRoaXMuc2NhbGFyKHJlYWRlciwgVCwgTCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtsb2NhbE5hbWVdID0gdGhpcy5zY2FsYXIocmVhZGVyLCBULCBMKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJyID0gdGFyZ2V0W2xvY2FsTmFtZV07IC8vIHNhZmUgdG8gYXNzdW1lIHByZXNlbmNlIG9mIGFycmF5LCBvbmVvZiBjYW5ub3QgY29udGFpbiByZXBlYXRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtc2cgPSBmaWVsZC5UKCkuaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKG1zZyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2xvY2FsTmFtZV0gPSBmaWVsZC5UKCkuaW50ZXJuYWxCaW5hcnlSZWFkKHJlYWRlciwgcmVhZGVyLnVpbnQzMigpLCBvcHRpb25zLCB0YXJnZXRbbG9jYWxOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtYXBcIjpcbiAgICAgICAgICAgICAgICAgICAgbGV0IFttYXBLZXksIG1hcFZhbF0gPSB0aGlzLm1hcEVudHJ5KGZpZWxkLCByZWFkZXIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzYWZlIHRvIGFzc3VtZSBwcmVzZW5jZSBvZiBtYXAgb2JqZWN0LCBvbmVvZiBjYW5ub3QgY29udGFpbiByZXBlYXRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2xvY2FsTmFtZV1bbWFwS2V5XSA9IG1hcFZhbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZCBhIG1hcCBmaWVsZCwgZXhwZWN0aW5nIGtleSBmaWVsZCA9IDEsIHZhbHVlIGZpZWxkID0gMlxuICAgICAqL1xuICAgIG1hcEVudHJ5KGZpZWxkLCByZWFkZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGxlbmd0aCA9IHJlYWRlci51aW50MzIoKTtcbiAgICAgICAgbGV0IGVuZCA9IHJlYWRlci5wb3MgKyBsZW5ndGg7XG4gICAgICAgIGxldCBrZXkgPSB1bmRlZmluZWQ7IC8vIGphdmFzY3JpcHQgb25seSBhbGxvd3MgbnVtYmVyIG9yIHN0cmluZyBmb3Igb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgICAgbGV0IHZhbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgd2hpbGUgKHJlYWRlci5wb3MgPCBlbmQpIHtcbiAgICAgICAgICAgIGxldCBbZmllbGRObywgd2lyZVR5cGVdID0gcmVhZGVyLnRhZygpO1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZE5vKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuSyA9PSBTY2FsYXJUeXBlLkJPT0wpXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSByZWFkZXIuYm9vbCgpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvbmcgdHlwZXMgYXJlIHJlYWQgYXMgc3RyaW5nLCBudW1iZXIgdHlwZXMgYXJlIG9rYXkgYXMgbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSB0aGlzLnNjYWxhcihyZWFkZXIsIGZpZWxkLkssIExvbmdUeXBlLlNUUklORyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5WLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLnNjYWxhcihyZWFkZXIsIGZpZWxkLlYuVCwgZmllbGQuVi5MKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGZpZWxkLlYuVCgpLmludGVybmFsQmluYXJ5UmVhZChyZWFkZXIsIHJlYWRlci51aW50MzIoKSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGZpZWxkICR7ZmllbGROb30gKHdpcmUgdHlwZSAke3dpcmVUeXBlfSkgaW4gbWFwIGVudHJ5IGZvciAke3RoaXMuaW5mby50eXBlTmFtZX0jJHtmaWVsZC5uYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGtleVJhdyA9IHJlZmxlY3Rpb25TY2FsYXJEZWZhdWx0KGZpZWxkLkspO1xuICAgICAgICAgICAga2V5ID0gZmllbGQuSyA9PSBTY2FsYXJUeXBlLkJPT0wgPyBrZXlSYXcudG9TdHJpbmcoKSA6IGtleVJhdztcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgdmFsID0gcmVmbGVjdGlvblNjYWxhckRlZmF1bHQoZmllbGQuVi5ULCBmaWVsZC5WLkwpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICB2YWwgPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICB2YWwgPSBmaWVsZC5WLlQoKS5jcmVhdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIHJldHVybiBba2V5LCB2YWxdO1xuICAgIH1cbiAgICBzY2FsYXIocmVhZGVyLCB0eXBlLCBsb25nVHlwZSkge1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQzMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLmludDMyKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU1RSSU5HOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIuc3RyaW5nKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQk9PTDpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLmJvb2woKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5ET1VCTEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5kb3VibGUoKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GTE9BVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLmZsb2F0KCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UNjQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChyZWFkZXIuaW50NjQoKSwgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQ2NDpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KHJlYWRlci51aW50NjQoKSwgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChyZWFkZXIuZml4ZWQ2NCgpLCBsb25nVHlwZSk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQzMjpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLmZpeGVkMzIoKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CWVRFUzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLmJ5dGVzKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIudWludDMyKCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVEMzI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5zZml4ZWQzMigpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDY0OlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQocmVhZGVyLnNmaXhlZDY0KCksIGxvbmdUeXBlKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5zaW50MzIoKTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UNjQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChyZWFkZXIuc2ludDY0KCksIGxvbmdUeXBlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IFVua25vd25GaWVsZEhhbmRsZXIsIFdpcmVUeXBlIH0gZnJvbSBcIi4vYmluYXJ5LWZvcm1hdC1jb250cmFjdFwiO1xuaW1wb3J0IHsgUmVwZWF0VHlwZSwgU2NhbGFyVHlwZSB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuaW1wb3J0IHsgYXNzZXJ0IH0gZnJvbSBcIi4vYXNzZXJ0XCI7XG5pbXBvcnQgeyBQYkxvbmcsIFBiVUxvbmcgfSBmcm9tIFwiLi9wYi1sb25nXCI7XG4vKipcbiAqIFdyaXRlcyBwcm90bzMgbWVzc2FnZXMgaW4gYmluYXJ5IGZvcm1hdCB1c2luZyByZWZsZWN0aW9uIGluZm9ybWF0aW9uLlxuICpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZ1xuICovXG5leHBvcnQgY2xhc3MgUmVmbGVjdGlvbkJpbmFyeVdyaXRlciB7XG4gICAgY29uc3RydWN0b3IoaW5mbykge1xuICAgICAgICB0aGlzLmluZm8gPSBpbmZvO1xuICAgIH1cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICBpZiAoIXRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZHNJbnB1dCA9IHRoaXMuaW5mby5maWVsZHMgPyB0aGlzLmluZm8uZmllbGRzLmNvbmNhdCgpIDogW107XG4gICAgICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkc0lucHV0LnNvcnQoKGEsIGIpID0+IGEubm8gLSBiLm5vKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZXMgdGhlIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdC5cbiAgICAgKi9cbiAgICB3cml0ZShtZXNzYWdlLCB3cml0ZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5maWVsZHMpIHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSwgLy8gdGhpcyB3aWxsIGJlIG91ciBmaWVsZCB2YWx1ZSwgd2hldGhlciBpdCBpcyBtZW1iZXIgb2YgYSBvbmVvZiBvciBub3RcbiAgICAgICAgICAgIGVtaXREZWZhdWx0LCAvLyB3aGV0aGVyIHdlIGVtaXQgdGhlIGRlZmF1bHQgdmFsdWUgKG9ubHkgdHJ1ZSBmb3Igb25lb2YgbWVtYmVycylcbiAgICAgICAgICAgIHJlcGVhdGVkID0gZmllbGQucmVwZWF0LCBsb2NhbE5hbWUgPSBmaWVsZC5sb2NhbE5hbWU7XG4gICAgICAgICAgICAvLyBoYW5kbGUgb25lb2YgQURUXG4gICAgICAgICAgICBpZiAoZmllbGQub25lb2YpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IG1lc3NhZ2VbZmllbGQub25lb2ZdO1xuICAgICAgICAgICAgICAgIGlmIChncm91cC5vbmVvZktpbmQgIT09IGxvY2FsTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIGZpZWxkIGlzIG5vdCBzZWxlY3RlZCwgc2tpcFxuICAgICAgICAgICAgICAgIHZhbHVlID0gZ3JvdXBbbG9jYWxOYW1lXTtcbiAgICAgICAgICAgICAgICBlbWl0RGVmYXVsdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1lc3NhZ2VbbG9jYWxOYW1lXTtcbiAgICAgICAgICAgICAgICBlbWl0RGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2UgaGF2ZSBoYW5kbGVkIG9uZW9mIGFib3ZlLiB3ZSBqdXN0IGhhdmUgdG8gaG9ub3IgYGVtaXREZWZhdWx0YC5cbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICBsZXQgVCA9IGZpZWxkLmtpbmQgPT0gXCJlbnVtXCIgPyBTY2FsYXJUeXBlLklOVDMyIDogZmllbGQuVDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoQXJyYXkuaXNBcnJheSh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkID09IFJlcGVhdFR5cGUuUEFDS0VEKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFja2VkKHdyaXRlciwgVCwgZmllbGQubm8sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2NhbGFyKHdyaXRlciwgVCwgZmllbGQubm8sIGl0ZW0sIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoZmllbGQub3B0KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2FsYXIod3JpdGVyLCBULCBmaWVsZC5ubywgdmFsdWUsIGVtaXREZWZhdWx0IHx8IGZpZWxkLm9wdCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXBlYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KEFycmF5LmlzQXJyYXkodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2Uod3JpdGVyLCBvcHRpb25zLCBmaWVsZC5UKCksIGZpZWxkLm5vLCBpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSh3cml0ZXIsIG9wdGlvbnMsIGZpZWxkLlQoKSwgZmllbGQubm8sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBFbnRyeSh3cml0ZXIsIG9wdGlvbnMsIGZpZWxkLCBrZXksIHZhbCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCB1ID0gb3B0aW9ucy53cml0ZVVua25vd25GaWVsZHM7XG4gICAgICAgIGlmICh1ICE9PSBmYWxzZSlcbiAgICAgICAgICAgICh1ID09PSB0cnVlID8gVW5rbm93bkZpZWxkSGFuZGxlci5vbldyaXRlIDogdSkodGhpcy5pbmZvLnR5cGVOYW1lLCBtZXNzYWdlLCB3cml0ZXIpO1xuICAgIH1cbiAgICBtYXBFbnRyeSh3cml0ZXIsIG9wdGlvbnMsIGZpZWxkLCBrZXksIHZhbHVlKSB7XG4gICAgICAgIHdyaXRlci50YWcoZmllbGQubm8sIFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7XG4gICAgICAgIHdyaXRlci5mb3JrKCk7XG4gICAgICAgIC8vIGphdmFzY3JpcHQgb25seSBhbGxvd3MgbnVtYmVyIG9yIHN0cmluZyBmb3Igb2JqZWN0IHByb3BlcnRpZXNcbiAgICAgICAgLy8gd2UgY29udmVydCBmcm9tIG91ciByZXByZXNlbnRhdGlvbiB0byB0aGUgcHJvdG9idWYgdHlwZVxuICAgICAgICBsZXQga2V5VmFsdWUgPSBrZXk7XG4gICAgICAgIHN3aXRjaCAoZmllbGQuSykge1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNJTlQzMjpcbiAgICAgICAgICAgICAgICBrZXlWYWx1ZSA9IE51bWJlci5wYXJzZUludChrZXkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgYXNzZXJ0KGtleSA9PSAndHJ1ZScgfHwga2V5ID09ICdmYWxzZScpO1xuICAgICAgICAgICAgICAgIGtleVZhbHVlID0ga2V5ID09ICd0cnVlJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyB3cml0ZSBrZXksIGV4cGVjdGluZyBrZXkgZmllbGQgbnVtYmVyID0gMVxuICAgICAgICB0aGlzLnNjYWxhcih3cml0ZXIsIGZpZWxkLkssIDEsIGtleVZhbHVlLCB0cnVlKTtcbiAgICAgICAgLy8gd3JpdGUgdmFsdWUsIGV4cGVjdGluZyB2YWx1ZSBmaWVsZCBudW1iZXIgPSAyXG4gICAgICAgIHN3aXRjaCAoZmllbGQuVi5raW5kKSB7XG4gICAgICAgICAgICBjYXNlICdzY2FsYXInOlxuICAgICAgICAgICAgICAgIHRoaXMuc2NhbGFyKHdyaXRlciwgZmllbGQuVi5ULCAyLCB2YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdlbnVtJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNjYWxhcih3cml0ZXIsIFNjYWxhclR5cGUuSU5UMzIsIDIsIHZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21lc3NhZ2UnOlxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSh3cml0ZXIsIG9wdGlvbnMsIGZpZWxkLlYuVCgpLCAyLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgd3JpdGVyLmpvaW4oKTtcbiAgICB9XG4gICAgbWVzc2FnZSh3cml0ZXIsIG9wdGlvbnMsIGhhbmRsZXIsIGZpZWxkTm8sIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBoYW5kbGVyLmludGVybmFsQmluYXJ5V3JpdGUodmFsdWUsIHdyaXRlci50YWcoZmllbGRObywgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKS5mb3JrKCksIG9wdGlvbnMpO1xuICAgICAgICB3cml0ZXIuam9pbigpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhIHNpbmdsZSBzY2FsYXIgdmFsdWUuXG4gICAgICovXG4gICAgc2NhbGFyKHdyaXRlciwgdHlwZSwgZmllbGRObywgdmFsdWUsIGVtaXREZWZhdWx0KSB7XG4gICAgICAgIGxldCBbd2lyZVR5cGUsIG1ldGhvZCwgaXNEZWZhdWx0XSA9IHRoaXMuc2NhbGFySW5mbyh0eXBlLCB2YWx1ZSk7XG4gICAgICAgIGlmICghaXNEZWZhdWx0IHx8IGVtaXREZWZhdWx0KSB7XG4gICAgICAgICAgICB3cml0ZXIudGFnKGZpZWxkTm8sIHdpcmVUeXBlKTtcbiAgICAgICAgICAgIHdyaXRlclttZXRob2RdKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBXcml0ZSBhbiBhcnJheSBvZiBzY2FsYXIgdmFsdWVzIGluIHBhY2tlZCBmb3JtYXQuXG4gICAgICovXG4gICAgcGFja2VkKHdyaXRlciwgdHlwZSwgZmllbGRObywgdmFsdWUpIHtcbiAgICAgICAgaWYgKCF2YWx1ZS5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGFzc2VydCh0eXBlICE9PSBTY2FsYXJUeXBlLkJZVEVTICYmIHR5cGUgIT09IFNjYWxhclR5cGUuU1RSSU5HKTtcbiAgICAgICAgLy8gd3JpdGUgdGFnXG4gICAgICAgIHdyaXRlci50YWcoZmllbGRObywgV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTtcbiAgICAgICAgLy8gYmVnaW4gbGVuZ3RoLWRlbGltaXRlZFxuICAgICAgICB3cml0ZXIuZm9yaygpO1xuICAgICAgICAvLyB3cml0ZSB2YWx1ZXMgd2l0aG91dCB0YWdzXG4gICAgICAgIGxldCBbLCBtZXRob2QsXSA9IHRoaXMuc2NhbGFySW5mbyh0eXBlKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHdyaXRlclttZXRob2RdKHZhbHVlW2ldKTtcbiAgICAgICAgLy8gZW5kIGxlbmd0aCBkZWxpbWl0ZWRcbiAgICAgICAgd3JpdGVyLmpvaW4oKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGluZm9ybWF0aW9uIGZvciB3cml0aW5nIGEgc2NhbGFyIHZhbHVlLlxuICAgICAqXG4gICAgICogUmV0dXJucyB0dXBsZTpcbiAgICAgKiBbMF06IGFwcHJvcHJpYXRlIFdpcmVUeXBlXG4gICAgICogWzFdOiBuYW1lIG9mIHRoZSBhcHByb3ByaWF0ZSBtZXRob2Qgb2YgSUJpbmFyeVdyaXRlclxuICAgICAqIFsyXTogd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBkZWZhdWx0IHZhbHVlXG4gICAgICpcbiAgICAgKiBJZiBhcmd1bWVudCBgdmFsdWVgIGlzIG9taXR0ZWQsIFsyXSBpcyBhbHdheXMgZmFsc2UuXG4gICAgICovXG4gICAgc2NhbGFySW5mbyh0eXBlLCB2YWx1ZSkge1xuICAgICAgICBsZXQgdCA9IFdpcmVUeXBlLlZhcmludDtcbiAgICAgICAgbGV0IG07XG4gICAgICAgIGxldCBpID0gdmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGQgPSB2YWx1ZSA9PT0gMDtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICAgICAgbSA9IFwiaW50MzJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TVFJJTkc6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgIXZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB0ID0gV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkO1xuICAgICAgICAgICAgICAgIG0gPSBcInN0cmluZ1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgZCA9IHZhbHVlID09PSBmYWxzZTtcbiAgICAgICAgICAgICAgICBtID0gXCJib29sXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgICAgIG0gPSBcInVpbnQzMlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkRPVUJMRTpcbiAgICAgICAgICAgICAgICB0ID0gV2lyZVR5cGUuQml0NjQ7XG4gICAgICAgICAgICAgICAgbSA9IFwiZG91YmxlXCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkJpdDMyO1xuICAgICAgICAgICAgICAgIG0gPSBcImZsb2F0XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UNjQ6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgUGJMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIG0gPSBcImludDY0XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDY0OlxuICAgICAgICAgICAgICAgIGQgPSBpIHx8IFBiVUxvbmcuZnJvbSh2YWx1ZSkuaXNaZXJvKCk7XG4gICAgICAgICAgICAgICAgbSA9IFwidWludDY0XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQ2NDpcbiAgICAgICAgICAgICAgICBkID0gaSB8fCBQYlVMb25nLmZyb20odmFsdWUpLmlzWmVybygpO1xuICAgICAgICAgICAgICAgIHQgPSBXaXJlVHlwZS5CaXQ2NDtcbiAgICAgICAgICAgICAgICBtID0gXCJmaXhlZDY0XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICAgICAgZCA9IGkgfHwgIXZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkxlbmd0aERlbGltaXRlZDtcbiAgICAgICAgICAgICAgICBtID0gXCJieXRlc1wiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkJpdDMyO1xuICAgICAgICAgICAgICAgIG0gPSBcImZpeGVkMzJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgICAgICB0ID0gV2lyZVR5cGUuQml0MzI7XG4gICAgICAgICAgICAgICAgbSA9IFwic2ZpeGVkMzJcIjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgICAgICAgICBkID0gaSB8fCBQYkxvbmcuZnJvbSh2YWx1ZSkuaXNaZXJvKCk7XG4gICAgICAgICAgICAgICAgdCA9IFdpcmVUeXBlLkJpdDY0O1xuICAgICAgICAgICAgICAgIG0gPSBcInNmaXhlZDY0XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgICAgIG0gPSBcInNpbnQzMlwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNJTlQ2NDpcbiAgICAgICAgICAgICAgICBkID0gaSB8fCBQYkxvbmcuZnJvbSh2YWx1ZSkuaXNaZXJvKCk7XG4gICAgICAgICAgICAgICAgbSA9IFwic2ludDY0XCI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt0LCBtLCBpIHx8IGRdO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHJlZmxlY3Rpb25TY2FsYXJEZWZhdWx0IH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1zY2FsYXItZGVmYXVsdFwiO1xuaW1wb3J0IHsgTUVTU0FHRV9UWVBFIH0gZnJvbSAnLi9tZXNzYWdlLXR5cGUtY29udHJhY3QnO1xuLyoqXG4gKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBnZW5lcmljIG1lc3NhZ2UsIHVzaW5nIHRoZSBmaWVsZFxuICogaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWZsZWN0aW9uQ3JlYXRlKHR5cGUpIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIHRlcm5hcnkgY2FuIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbi5cbiAgICAgKiBUaGUgYE9iamVjdC5jcmVhdGUoKWAgY29kZSBwYXRoIHV0aWxpemVzIGEgbmV3IGBtZXNzYWdlUHJvdG90eXBlYFxuICAgICAqIHByb3BlcnR5IG9uIHRoZSBgSU1lc3NhZ2VUeXBlYCB3aGljaCBoYXMgdGhpcyBzYW1lIGBNRVNTQUdFX1RZUEVgXG4gICAgICogbm9uLWVudW1lcmFibGUgcHJvcGVydHkgb24gaXQuIERvaW5nIGl0IHRoaXMgd2F5IG1lYW5zIHRoYXQgd2Ugb25seVxuICAgICAqIHBheSB0aGUgY29zdCBvZiBgT2JqZWN0LmRlZmluZVByb3BlcnR5KClgIG9uY2UgcGVyIGBJTWVzc2FnZVR5cGVgXG4gICAgICogY2xhc3Mgb2Ygb25jZSBwZXIgXCJpbnN0YW5jZVwiLiBUaGUgZmFsc3kgY29kZSBwYXRoIGlzIG9ubHkgcHJvdmlkZWRcbiAgICAgKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaW4gY2FzZXMgd2hlcmUgdGhlIHJ1bnRpbWUgbGlicmFyeSBpc1xuICAgICAqIHVwZGF0ZWQgd2l0aG91dCBhbHNvIHVwZGF0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS5cbiAgICAgKi9cbiAgICBjb25zdCBtc2cgPSB0eXBlLm1lc3NhZ2VQcm90b3R5cGVcbiAgICAgICAgPyBPYmplY3QuY3JlYXRlKHR5cGUubWVzc2FnZVByb3RvdHlwZSlcbiAgICAgICAgOiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIE1FU1NBR0VfVFlQRSwgeyB2YWx1ZTogdHlwZSB9KTtcbiAgICBmb3IgKGxldCBmaWVsZCBvZiB0eXBlLmZpZWxkcykge1xuICAgICAgICBsZXQgbmFtZSA9IGZpZWxkLmxvY2FsTmFtZTtcbiAgICAgICAgaWYgKGZpZWxkLm9wdClcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBpZiAoZmllbGQub25lb2YpXG4gICAgICAgICAgICBtc2dbZmllbGQub25lb2ZdID0geyBvbmVvZktpbmQ6IHVuZGVmaW5lZCB9O1xuICAgICAgICBlbHNlIGlmIChmaWVsZC5yZXBlYXQpXG4gICAgICAgICAgICBtc2dbbmFtZV0gPSBbXTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5raW5kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICBtc2dbbmFtZV0gPSByZWZsZWN0aW9uU2NhbGFyRGVmYXVsdChmaWVsZC5ULCBmaWVsZC5MKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgcmVxdWlyZSAwIHRvIGJlIGRlZmF1bHQgdmFsdWUgZm9yIGFsbCBlbnVtc1xuICAgICAgICAgICAgICAgICAgICBtc2dbbmFtZV0gPSAwO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgICAgIG1zZ1tuYW1lXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1zZztcbn1cbiIsImltcG9ydCB7IFNjYWxhclR5cGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIHR3byBtZXNzYWdlIG9mIHRoZSBzYW1lIHR5cGUgaGF2ZSB0aGUgc2FtZSBmaWVsZCB2YWx1ZXMuXG4gKiBDaGVja3MgZm9yIGRlZXAgZXF1YWxpdHksIHRyYXZlcnNpbmcgcmVwZWF0ZWQgZmllbGRzLCBvbmVvZiBncm91cHMsIG1hcHNcbiAqIGFuZCBtZXNzYWdlcyByZWN1cnNpdmVseS5cbiAqIFdpbGwgYWxzbyByZXR1cm4gdHJ1ZSBpZiBib3RoIG1lc3NhZ2VzIGFyZSBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3Rpb25FcXVhbHMoaW5mbywgYSwgYikge1xuICAgIGlmIChhID09PSBiKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIWEgfHwgIWIpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBmaWVsZCBvZiBpbmZvLmZpZWxkcykge1xuICAgICAgICBsZXQgbG9jYWxOYW1lID0gZmllbGQubG9jYWxOYW1lO1xuICAgICAgICBsZXQgdmFsX2EgPSBmaWVsZC5vbmVvZiA/IGFbZmllbGQub25lb2ZdW2xvY2FsTmFtZV0gOiBhW2xvY2FsTmFtZV07XG4gICAgICAgIGxldCB2YWxfYiA9IGZpZWxkLm9uZW9mID8gYltmaWVsZC5vbmVvZl1bbG9jYWxOYW1lXSA6IGJbbG9jYWxOYW1lXTtcbiAgICAgICAgc3dpdGNoIChmaWVsZC5raW5kKSB7XG4gICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgIGxldCB0ID0gZmllbGQua2luZCA9PSBcImVudW1cIiA/IFNjYWxhclR5cGUuSU5UMzIgOiBmaWVsZC5UO1xuICAgICAgICAgICAgICAgIGlmICghKGZpZWxkLnJlcGVhdFxuICAgICAgICAgICAgICAgICAgICA/IHJlcGVhdGVkUHJpbWl0aXZlRXEodCwgdmFsX2EsIHZhbF9iKVxuICAgICAgICAgICAgICAgICAgICA6IHByaW1pdGl2ZUVxKHQsIHZhbF9hLCB2YWxfYikpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgaWYgKCEoZmllbGQuVi5raW5kID09IFwibWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgID8gcmVwZWF0ZWRNc2dFcShmaWVsZC5WLlQoKSwgb2JqZWN0VmFsdWVzKHZhbF9hKSwgb2JqZWN0VmFsdWVzKHZhbF9iKSlcbiAgICAgICAgICAgICAgICAgICAgOiByZXBlYXRlZFByaW1pdGl2ZUVxKGZpZWxkLlYua2luZCA9PSBcImVudW1cIiA/IFNjYWxhclR5cGUuSU5UMzIgOiBmaWVsZC5WLlQsIG9iamVjdFZhbHVlcyh2YWxfYSksIG9iamVjdFZhbHVlcyh2YWxfYikpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICBsZXQgVCA9IGZpZWxkLlQoKTtcbiAgICAgICAgICAgICAgICBpZiAoIShmaWVsZC5yZXBlYXRcbiAgICAgICAgICAgICAgICAgICAgPyByZXBlYXRlZE1zZ0VxKFQsIHZhbF9hLCB2YWxfYilcbiAgICAgICAgICAgICAgICAgICAgOiBULmVxdWFscyh2YWxfYSwgdmFsX2IpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuY29uc3Qgb2JqZWN0VmFsdWVzID0gT2JqZWN0LnZhbHVlcztcbmZ1bmN0aW9uIHByaW1pdGl2ZUVxKHR5cGUsIGEsIGIpIHtcbiAgICBpZiAoYSA9PT0gYilcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgaWYgKHR5cGUgIT09IFNjYWxhclR5cGUuQllURVMpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBsZXQgYmEgPSBhO1xuICAgIGxldCBiYiA9IGI7XG4gICAgaWYgKGJhLmxlbmd0aCAhPT0gYmIubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKGJhW2ldICE9IGJiW2ldKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0cnVlO1xufVxuZnVuY3Rpb24gcmVwZWF0ZWRQcmltaXRpdmVFcSh0eXBlLCBhLCBiKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKylcbiAgICAgICAgaWYgKCFwcmltaXRpdmVFcSh0eXBlLCBhW2ldLCBiW2ldKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHJlcGVhdGVkTXNnRXEodHlwZSwgYSwgYikge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmICghdHlwZS5lcXVhbHMoYVtpXSwgYltpXSkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgeyBsb3dlckNhbWVsQ2FzZSB9IGZyb20gXCIuL2xvd2VyLWNhbWVsLWNhc2VcIjtcbi8qKlxuICogU2NhbGFyIHZhbHVlIHR5cGVzLiBUaGlzIGlzIGEgc3Vic2V0IG9mIGZpZWxkIHR5cGVzIGRlY2xhcmVkIGJ5IHByb3RvYnVmXG4gKiBlbnVtIGdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIFRoZSB0eXBlcyBHUk9VUCBhbmQgTUVTU0FHRVxuICogYXJlIG9taXR0ZWQsIGJ1dCB0aGUgbnVtZXJpY2FsIHZhbHVlcyBhcmUgaWRlbnRpY2FsLlxuICovXG5leHBvcnQgdmFyIFNjYWxhclR5cGU7XG4oZnVuY3Rpb24gKFNjYWxhclR5cGUpIHtcbiAgICAvLyAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMuXG4gICAgLy8gT3JkZXIgaXMgd2VpcmQgZm9yIGhpc3RvcmljYWwgcmVhc29ucy5cbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJET1VCTEVcIl0gPSAxXSA9IFwiRE9VQkxFXCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiRkxPQVRcIl0gPSAyXSA9IFwiRkxPQVRcIjtcbiAgICAvLyBOb3QgWmlnWmFnIGVuY29kZWQuICBOZWdhdGl2ZSBudW1iZXJzIHRha2UgMTAgYnl0ZXMuICBVc2UgVFlQRV9TSU5UNjQgaWZcbiAgICAvLyBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGxpa2VseS5cbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJJTlQ2NFwiXSA9IDNdID0gXCJJTlQ2NFwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIlVJTlQ2NFwiXSA9IDRdID0gXCJVSU5UNjRcIjtcbiAgICAvLyBOb3QgWmlnWmFnIGVuY29kZWQuICBOZWdhdGl2ZSBudW1iZXJzIHRha2UgMTAgYnl0ZXMuICBVc2UgVFlQRV9TSU5UMzIgaWZcbiAgICAvLyBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGxpa2VseS5cbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJJTlQzMlwiXSA9IDVdID0gXCJJTlQzMlwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIkZJWEVENjRcIl0gPSA2XSA9IFwiRklYRUQ2NFwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIkZJWEVEMzJcIl0gPSA3XSA9IFwiRklYRUQzMlwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIkJPT0xcIl0gPSA4XSA9IFwiQk9PTFwiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIlNUUklOR1wiXSA9IDldID0gXCJTVFJJTkdcIjtcbiAgICAvLyBUYWctZGVsaW1pdGVkIGFnZ3JlZ2F0ZS5cbiAgICAvLyBHcm91cCB0eXBlIGlzIGRlcHJlY2F0ZWQgYW5kIG5vdCBzdXBwb3J0ZWQgaW4gcHJvdG8zLiBIb3dldmVyLCBQcm90bzNcbiAgICAvLyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcGFyc2UgdGhlIGdyb3VwIHdpcmUgZm9ybWF0IGFuZFxuICAgIC8vIHRyZWF0IGdyb3VwIGZpZWxkcyBhcyB1bmtub3duIGZpZWxkcy5cbiAgICAvLyBUWVBFX0dST1VQID0gMTAsXG4gICAgLy8gVFlQRV9NRVNTQUdFID0gMTEsICAvLyBMZW5ndGgtZGVsaW1pdGVkIGFnZ3JlZ2F0ZS5cbiAgICAvLyBOZXcgaW4gdmVyc2lvbiAyLlxuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIkJZVEVTXCJdID0gMTJdID0gXCJCWVRFU1wiO1xuICAgIFNjYWxhclR5cGVbU2NhbGFyVHlwZVtcIlVJTlQzMlwiXSA9IDEzXSA9IFwiVUlOVDMyXCI7XG4gICAgLy8gVFlQRV9FTlVNID0gMTQsXG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiU0ZJWEVEMzJcIl0gPSAxNV0gPSBcIlNGSVhFRDMyXCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiU0ZJWEVENjRcIl0gPSAxNl0gPSBcIlNGSVhFRDY0XCI7XG4gICAgU2NhbGFyVHlwZVtTY2FsYXJUeXBlW1wiU0lOVDMyXCJdID0gMTddID0gXCJTSU5UMzJcIjtcbiAgICBTY2FsYXJUeXBlW1NjYWxhclR5cGVbXCJTSU5UNjRcIl0gPSAxOF0gPSBcIlNJTlQ2NFwiO1xufSkoU2NhbGFyVHlwZSB8fCAoU2NhbGFyVHlwZSA9IHt9KSk7XG4vKipcbiAqIEphdmFTY3JpcHQgcmVwcmVzZW50YXRpb24gb2YgNjQgYml0IGludGVncmFsIHR5cGVzLiBFcXVpdmFsZW50IHRvIHRoZVxuICogZmllbGQgb3B0aW9uIFwianN0eXBlXCIuXG4gKlxuICogQnkgZGVmYXVsdCwgcHJvdG9idWYtdHMgcmVwcmVzZW50cyA2NCBiaXQgdHlwZXMgYXMgYGJpZ2ludGAuXG4gKlxuICogWW91IGNhbiBjaGFuZ2UgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGJ5IGVuYWJsaW5nIHRoZSBwbHVnaW4gcGFyYW1ldGVyXG4gKiBgbG9uZ190eXBlX3N0cmluZ2AsIHdoaWNoIHdpbGwgcmVwcmVzZW50IDY0IGJpdCB0eXBlcyBhcyBgc3RyaW5nYC5cbiAqXG4gKiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNoYW5nZSB0aGUgYmVoYXZpb3VyIGZvciBpbmRpdmlkdWFsIGZpZWxkc1xuICogd2l0aCB0aGUgZmllbGQgb3B0aW9uIFwianN0eXBlXCI6XG4gKlxuICogYGBgcHJvdG9idWZcbiAqIHVpbnQ2NCBteV9maWVsZCA9IDEgW2pzdHlwZSA9IEpTX1NUUklOR107XG4gKiB1aW50NjQgb3RoZXJfZmllbGQgPSAyIFtqc3R5cGUgPSBKU19OVU1CRVJdO1xuICogYGBgXG4gKi9cbmV4cG9ydCB2YXIgTG9uZ1R5cGU7XG4oZnVuY3Rpb24gKExvbmdUeXBlKSB7XG4gICAgLyoqXG4gICAgICogVXNlIEphdmFTY3JpcHQgYGJpZ2ludGAuXG4gICAgICpcbiAgICAgKiBGaWVsZCBvcHRpb24gYFtqc3R5cGUgPSBKU19OT1JNQUxdYC5cbiAgICAgKi9cbiAgICBMb25nVHlwZVtMb25nVHlwZVtcIkJJR0lOVFwiXSA9IDBdID0gXCJCSUdJTlRcIjtcbiAgICAvKipcbiAgICAgKiBVc2UgSmF2YVNjcmlwdCBgc3RyaW5nYC5cbiAgICAgKlxuICAgICAqIEZpZWxkIG9wdGlvbiBgW2pzdHlwZSA9IEpTX1NUUklOR11gLlxuICAgICAqL1xuICAgIExvbmdUeXBlW0xvbmdUeXBlW1wiU1RSSU5HXCJdID0gMV0gPSBcIlNUUklOR1wiO1xuICAgIC8qKlxuICAgICAqIFVzZSBKYXZhU2NyaXB0IGBudW1iZXJgLlxuICAgICAqXG4gICAgICogTGFyZ2UgdmFsdWVzIHdpbGwgbG9vc2UgcHJlY2lzaW9uLlxuICAgICAqXG4gICAgICogRmllbGQgb3B0aW9uIGBbanN0eXBlID0gSlNfTlVNQkVSXWAuXG4gICAgICovXG4gICAgTG9uZ1R5cGVbTG9uZ1R5cGVbXCJOVU1CRVJcIl0gPSAyXSA9IFwiTlVNQkVSXCI7XG59KShMb25nVHlwZSB8fCAoTG9uZ1R5cGUgPSB7fSkpO1xuLyoqXG4gKiBQcm90b2J1ZiAyLjEuMCBpbnRyb2R1Y2VkIHBhY2tlZCByZXBlYXRlZCBmaWVsZHMuXG4gKiBTZXR0aW5nIHRoZSBmaWVsZCBvcHRpb24gYFtwYWNrZWQgPSB0cnVlXWAgZW5hYmxlcyBwYWNraW5nLlxuICpcbiAqIEluIHByb3RvMywgYWxsIHJlcGVhdGVkIGZpZWxkcyBhcmUgcGFja2VkIGJ5IGRlZmF1bHQuXG4gKiBTZXR0aW5nIHRoZSBmaWVsZCBvcHRpb24gYFtwYWNrZWQgPSBmYWxzZV1gIGRpc2FibGVzIHBhY2tpbmcuXG4gKlxuICogUGFja2VkIHJlcGVhdGVkIGZpZWxkcyBhcmUgZW5jb2RlZCB3aXRoIGEgc2luZ2xlIHRhZyxcbiAqIHRoZW4gYSBsZW5ndGgtZGVsaW1pdGVyLCB0aGVuIHRoZSBlbGVtZW50IHZhbHVlcy5cbiAqXG4gKiBVbnBhY2tlZCByZXBlYXRlZCBmaWVsZHMgYXJlIGVuY29kZWQgd2l0aCBhIHRhZyBhbmRcbiAqIHZhbHVlIGZvciBlYWNoIGVsZW1lbnQuXG4gKlxuICogYGJ5dGVzYCBhbmQgYHN0cmluZ2AgY2Fubm90IGJlIHBhY2tlZC5cbiAqL1xuZXhwb3J0IHZhciBSZXBlYXRUeXBlO1xuKGZ1bmN0aW9uIChSZXBlYXRUeXBlKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIGlzIG5vdCByZXBlYXRlZC5cbiAgICAgKi9cbiAgICBSZXBlYXRUeXBlW1JlcGVhdFR5cGVbXCJOT1wiXSA9IDBdID0gXCJOT1wiO1xuICAgIC8qKlxuICAgICAqIFRoZSBmaWVsZCBpcyByZXBlYXRlZCBhbmQgc2hvdWxkIGJlIHBhY2tlZC5cbiAgICAgKiBJbnZhbGlkIGZvciBgYnl0ZXNgIGFuZCBgc3RyaW5nYCwgdGhleSBjYW5ub3QgYmUgcGFja2VkLlxuICAgICAqL1xuICAgIFJlcGVhdFR5cGVbUmVwZWF0VHlwZVtcIlBBQ0tFRFwiXSA9IDFdID0gXCJQQUNLRURcIjtcbiAgICAvKipcbiAgICAgKiBUaGUgZmllbGQgaXMgcmVwZWF0ZWQgYnV0IHNob3VsZCBub3QgYmUgcGFja2VkLlxuICAgICAqIFRoZSBvbmx5IHZhbGlkIHJlcGVhdCB0eXBlIGZvciByZXBlYXRlZCBgYnl0ZXNgIGFuZCBgc3RyaW5nYC5cbiAgICAgKi9cbiAgICBSZXBlYXRUeXBlW1JlcGVhdFR5cGVbXCJVTlBBQ0tFRFwiXSA9IDJdID0gXCJVTlBBQ0tFRFwiO1xufSkoUmVwZWF0VHlwZSB8fCAoUmVwZWF0VHlwZSA9IHt9KSk7XG4vKipcbiAqIFR1cm5zIFBhcnRpYWxGaWVsZEluZm8gaW50byBGaWVsZEluZm8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGaWVsZEluZm8oZmllbGQpIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgZmllbGQubG9jYWxOYW1lID0gKF9hID0gZmllbGQubG9jYWxOYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBsb3dlckNhbWVsQ2FzZShmaWVsZC5uYW1lKTtcbiAgICBmaWVsZC5qc29uTmFtZSA9IChfYiA9IGZpZWxkLmpzb25OYW1lKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBsb3dlckNhbWVsQ2FzZShmaWVsZC5uYW1lKTtcbiAgICBmaWVsZC5yZXBlYXQgPSAoX2MgPSBmaWVsZC5yZXBlYXQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IFJlcGVhdFR5cGUuTk87XG4gICAgZmllbGQub3B0ID0gKF9kID0gZmllbGQub3B0KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAoZmllbGQucmVwZWF0ID8gZmFsc2UgOiBmaWVsZC5vbmVvZiA/IGZhbHNlIDogZmllbGQua2luZCA9PSBcIm1lc3NhZ2VcIik7XG4gICAgcmV0dXJuIGZpZWxkO1xufVxuLyoqXG4gKiBSZWFkIGN1c3RvbSBmaWVsZCBvcHRpb25zIGZyb20gYSBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlLlxuICpcbiAqIEBkZXByZWNhdGVkIHVzZSByZWFkRmllbGRPcHRpb24oKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpZWxkT3B0aW9ucyhtZXNzYWdlVHlwZSwgZmllbGROYW1lLCBleHRlbnNpb25OYW1lLCBleHRlbnNpb25UeXBlKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG9wdGlvbnMgPSAoX2EgPSBtZXNzYWdlVHlwZS5maWVsZHMuZmluZCgobSwgaSkgPT4gbS5sb2NhbE5hbWUgPT0gZmllbGROYW1lIHx8IGkgPT0gZmllbGROYW1lKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm9wdGlvbnM7XG4gICAgcmV0dXJuIG9wdGlvbnMgJiYgb3B0aW9uc1tleHRlbnNpb25OYW1lXSA/IGV4dGVuc2lvblR5cGUuZnJvbUpzb24ob3B0aW9uc1tleHRlbnNpb25OYW1lXSkgOiB1bmRlZmluZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpZWxkT3B0aW9uKG1lc3NhZ2VUeXBlLCBmaWVsZE5hbWUsIGV4dGVuc2lvbk5hbWUsIGV4dGVuc2lvblR5cGUpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3Qgb3B0aW9ucyA9IChfYSA9IG1lc3NhZ2VUeXBlLmZpZWxkcy5maW5kKChtLCBpKSA9PiBtLmxvY2FsTmFtZSA9PSBmaWVsZE5hbWUgfHwgaSA9PSBmaWVsZE5hbWUpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub3B0aW9ucztcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgb3B0aW9uVmFsID0gb3B0aW9uc1tleHRlbnNpb25OYW1lXTtcbiAgICBpZiAob3B0aW9uVmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIG9wdGlvblZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGV4dGVuc2lvblR5cGUgPyBleHRlbnNpb25UeXBlLmZyb21Kc29uKG9wdGlvblZhbCkgOiBvcHRpb25WYWw7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVhZE1lc3NhZ2VPcHRpb24obWVzc2FnZVR5cGUsIGV4dGVuc2lvbk5hbWUsIGV4dGVuc2lvblR5cGUpIHtcbiAgICBjb25zdCBvcHRpb25zID0gbWVzc2FnZVR5cGUub3B0aW9ucztcbiAgICBjb25zdCBvcHRpb25WYWwgPSBvcHRpb25zW2V4dGVuc2lvbk5hbWVdO1xuICAgIGlmIChvcHRpb25WYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gb3B0aW9uVmFsO1xuICAgIH1cbiAgICByZXR1cm4gZXh0ZW5zaW9uVHlwZSA/IGV4dGVuc2lvblR5cGUuZnJvbUpzb24ob3B0aW9uVmFsKSA6IG9wdGlvblZhbDtcbn1cbiIsImltcG9ydCB7IGlzSnNvbk9iamVjdCwgdHlwZW9mSnNvblZhbHVlIH0gZnJvbSBcIi4vanNvbi10eXBpbmdzXCI7XG5pbXBvcnQgeyBiYXNlNjRkZWNvZGUgfSBmcm9tIFwiLi9iYXNlNjRcIjtcbmltcG9ydCB7IExvbmdUeXBlLCBTY2FsYXJUeXBlIH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1pbmZvXCI7XG5pbXBvcnQgeyBQYkxvbmcsIFBiVUxvbmcgfSBmcm9tIFwiLi9wYi1sb25nXCI7XG5pbXBvcnQgeyBhc3NlcnQsIGFzc2VydEZsb2F0MzIsIGFzc2VydEludDMyLCBhc3NlcnRVSW50MzIgfSBmcm9tIFwiLi9hc3NlcnRcIjtcbmltcG9ydCB7IHJlZmxlY3Rpb25Mb25nQ29udmVydCB9IGZyb20gXCIuL3JlZmxlY3Rpb24tbG9uZy1jb252ZXJ0XCI7XG4vKipcbiAqIFJlYWRzIHByb3RvMyBtZXNzYWdlcyBpbiBjYW5vbmljYWwgSlNPTiBmb3JtYXQgdXNpbmcgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZmxlY3Rpb25Kc29uUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3RvcihpbmZvKSB7XG4gICAgICAgIHRoaXMuaW5mbyA9IGluZm87XG4gICAgfVxuICAgIHByZXBhcmUoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKHRoaXMuZk1hcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmZNYXAgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkc0lucHV0ID0gKF9hID0gdGhpcy5pbmZvLmZpZWxkcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkc0lucHV0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mTWFwW2ZpZWxkLm5hbWVdID0gZmllbGQ7XG4gICAgICAgICAgICAgICAgdGhpcy5mTWFwW2ZpZWxkLmpzb25OYW1lXSA9IGZpZWxkO1xuICAgICAgICAgICAgICAgIHRoaXMuZk1hcFtmaWVsZC5sb2NhbE5hbWVdID0gZmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gQ2Fubm90IHBhcnNlIEpTT04gPHR5cGUgb2YganNvblZhbHVlPiBmb3IgPHR5cGUgbmFtZT4jPGZpZWxkTmFtZT4uXG4gICAgYXNzZXJ0KGNvbmRpdGlvbiwgZmllbGROYW1lLCBqc29uVmFsdWUpIHtcbiAgICAgICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgICAgICAgIGxldCB3aGF0ID0gdHlwZW9mSnNvblZhbHVlKGpzb25WYWx1ZSk7XG4gICAgICAgICAgICBpZiAod2hhdCA9PSBcIm51bWJlclwiIHx8IHdoYXQgPT0gXCJib29sZWFuXCIpXG4gICAgICAgICAgICAgICAgd2hhdCA9IGpzb25WYWx1ZS50b1N0cmluZygpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgSlNPTiAke3doYXR9IGZvciAke3RoaXMuaW5mby50eXBlTmFtZX0jJHtmaWVsZE5hbWV9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVhZHMgYSBtZXNzYWdlIGZyb20gY2Fub25pY2FsIEpTT04gZm9ybWF0IGludG8gdGhlIHRhcmdldCBtZXNzYWdlLlxuICAgICAqXG4gICAgICogUmVwZWF0ZWQgZmllbGRzIGFyZSBhcHBlbmRlZC4gTWFwIGVudHJpZXMgYXJlIGFkZGVkLCBvdmVyd3JpdGluZ1xuICAgICAqIGV4aXN0aW5nIGtleXMuXG4gICAgICpcbiAgICAgKiBJZiBhIG1lc3NhZ2UgZmllbGQgaXMgYWxyZWFkeSBwcmVzZW50LCBpdCB3aWxsIGJlIG1lcmdlZCB3aXRoIHRoZVxuICAgICAqIG5ldyBkYXRhLlxuICAgICAqL1xuICAgIHJlYWQoaW5wdXQsIG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgIGNvbnN0IG9uZW9mc0hhbmRsZWQgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBbanNvbktleSwganNvblZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5mTWFwW2pzb25LZXldO1xuICAgICAgICAgICAgaWYgKCFmaWVsZCkge1xuICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5pZ25vcmVVbmtub3duRmllbGRzKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIHVua25vd24gZmllbGQgd2hpbGUgcmVhZGluZyAke3RoaXMuaW5mby50eXBlTmFtZX0gZnJvbSBKU09OIGZvcm1hdC4gSlNPTiBrZXk6ICR7anNvbktleX1gKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsTmFtZSA9IGZpZWxkLmxvY2FsTmFtZTtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBvbmVvZiBBRFRcbiAgICAgICAgICAgIGxldCB0YXJnZXQ7IC8vIHRoaXMgd2lsbCBiZSB0aGUgdGFyZ2V0IGZvciB0aGUgZmllbGQgdmFsdWUsIHdoZXRoZXIgaXQgaXMgbWVtYmVyIG9mIGEgb25lb2Ygb3Igbm90XG4gICAgICAgICAgICBpZiAoZmllbGQub25lb2YpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNvblZhbHVlID09PSBudWxsICYmIChmaWVsZC5raW5kICE9PSAnZW51bScgfHwgZmllbGQuVCgpWzBdICE9PSAnZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBzaW5jZSBqc29uIG9iamVjdHMgYXJlIHVub3JkZXJlZCBieSBzcGVjaWZpY2F0aW9uLCBpdCBpcyBub3QgcG9zc2libGUgdG8gdGFrZSB0aGUgbGFzdCBvZiBtdWx0aXBsZSBvbmVvZnNcbiAgICAgICAgICAgICAgICBpZiAob25lb2ZzSGFuZGxlZC5pbmNsdWRlcyhmaWVsZC5vbmVvZikpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTXVsdGlwbGUgbWVtYmVycyBvZiB0aGUgb25lb2YgZ3JvdXAgXCIke2ZpZWxkLm9uZW9mfVwiIG9mICR7dGhpcy5pbmZvLnR5cGVOYW1lfSBhcmUgcHJlc2VudCBpbiBKU09OLmApO1xuICAgICAgICAgICAgICAgIG9uZW9mc0hhbmRsZWQucHVzaChmaWVsZC5vbmVvZik7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gbWVzc2FnZVtmaWVsZC5vbmVvZl0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG9uZW9mS2luZDogbG9jYWxOYW1lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB3ZSBoYXZlIGhhbmRsZWQgb25lb2YgYWJvdmUuIHdlIGp1c3QgaGF2ZSByZWFkIHRoZSB2YWx1ZSBpbnRvIGB0YXJnZXRgLlxuICAgICAgICAgICAgaWYgKGZpZWxkLmtpbmQgPT0gJ21hcCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNvblZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBpbnB1dFxuICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KGlzSnNvbk9iamVjdChqc29uVmFsdWUpLCBmaWVsZC5uYW1lLCBqc29uVmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIG91ciB0YXJnZXQgdG8gcHV0IG1hcCBlbnRyaWVzIGludG9cbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZE9iaiA9IHRhcmdldFtsb2NhbE5hbWVdO1xuICAgICAgICAgICAgICAgIC8vIHJlYWQgZW50cmllc1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2pzb25PYmpLZXksIGpzb25PYmpWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoanNvblZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFzc2VydChqc29uT2JqVmFsdWUgIT09IG51bGwsIGZpZWxkLm5hbWUgKyBcIiBtYXAgdmFsdWVcIiwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5WLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gZmllbGQuVi5UKCkuaW50ZXJuYWxKc29uUmVhZChqc29uT2JqVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLmVudW0oZmllbGQuVi5UKCksIGpzb25PYmpWYWx1ZSwgZmllbGQubmFtZSwgb3B0aW9ucy5pZ25vcmVVbmtub3duRmllbGRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdGhpcy5zY2FsYXIoanNvbk9ialZhbHVlLCBmaWVsZC5WLlQsIGZpZWxkLlYuTCwgZmllbGQubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQodmFsICE9PSB1bmRlZmluZWQsIGZpZWxkLm5hbWUgKyBcIiBtYXAgdmFsdWVcIiwganNvbk9ialZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCBrZXlcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IGpzb25PYmpLZXk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5LID09IFNjYWxhclR5cGUuQk9PTClcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleSA9PSBcInRydWVcIiA/IHRydWUgOiBrZXkgPT0gXCJmYWxzZVwiID8gZmFsc2UgOiBrZXk7XG4gICAgICAgICAgICAgICAgICAgIGtleSA9IHRoaXMuc2NhbGFyKGtleSwgZmllbGQuSywgTG9uZ1R5cGUuU1RSSU5HLCBmaWVsZC5uYW1lKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBmaWVsZE9ialtrZXldID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkLnJlcGVhdCkge1xuICAgICAgICAgICAgICAgIGlmIChqc29uVmFsdWUgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlucHV0XG4gICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoQXJyYXkuaXNBcnJheShqc29uVmFsdWUpLCBmaWVsZC5uYW1lLCBqc29uVmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIG91ciB0YXJnZXQgdG8gcHV0IGFycmF5IGVudHJpZXMgaW50b1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkQXJyID0gdGFyZ2V0W2xvY2FsTmFtZV07XG4gICAgICAgICAgICAgICAgLy8gcmVhZCBhcnJheSBlbnRyaWVzXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBqc29uSXRlbSBvZiBqc29uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hc3NlcnQoanNvbkl0ZW0gIT09IG51bGwsIGZpZWxkLm5hbWUsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gZmllbGQuVCgpLmludGVybmFsSnNvblJlYWQoanNvbkl0ZW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB0aGlzLmVudW0oZmllbGQuVCgpLCBqc29uSXRlbSwgZmllbGQubmFtZSwgb3B0aW9ucy5pZ25vcmVVbmtub3duRmllbGRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gdGhpcy5zY2FsYXIoanNvbkl0ZW0sIGZpZWxkLlQsIGZpZWxkLkwsIGZpZWxkLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkLCBmaWVsZC5uYW1lLCBqc29uVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICBmaWVsZEFyci5wdXNoKHZhbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNvblZhbHVlID09PSBudWxsICYmIGZpZWxkLlQoKS50eXBlTmFtZSAhPSAnZ29vZ2xlLnByb3RvYnVmLlZhbHVlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXNzZXJ0KGZpZWxkLm9uZW9mID09PSB1bmRlZmluZWQsIGZpZWxkLm5hbWUgKyBcIiAob25lb2YgbWVtYmVyKVwiLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtsb2NhbE5hbWVdID0gZmllbGQuVCgpLmludGVybmFsSnNvblJlYWQoanNvblZhbHVlLCBvcHRpb25zLCB0YXJnZXRbbG9jYWxOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWwgPSB0aGlzLmVudW0oZmllbGQuVCgpLCBqc29uVmFsdWUsIGZpZWxkLm5hbWUsIG9wdGlvbnMuaWdub3JlVW5rbm93bkZpZWxkcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtsb2NhbE5hbWVdID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtsb2NhbE5hbWVdID0gdGhpcy5zY2FsYXIoanNvblZhbHVlLCBmaWVsZC5ULCBmaWVsZC5MLCBmaWVsZC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGBmYWxzZWAgZm9yIHVucmVjb2duaXplZCBzdHJpbmcgcmVwcmVzZW50YXRpb25zLlxuICAgICAqXG4gICAgICogZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZSBhY2NlcHRzIG9ubHkgSlNPTiBgbnVsbGAgKG9yIHRoZSBvbGQgYFwiTlVMTF9WQUxVRVwiYCkuXG4gICAgICovXG4gICAgZW51bSh0eXBlLCBqc29uLCBmaWVsZE5hbWUsIGlnbm9yZVVua25vd25GaWVsZHMpIHtcbiAgICAgICAgaWYgKHR5cGVbMF0gPT0gJ2dvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUnKVxuICAgICAgICAgICAgYXNzZXJ0KGpzb24gPT09IG51bGwgfHwganNvbiA9PT0gXCJOVUxMX1ZBTFVFXCIsIGBVbmFibGUgdG8gcGFyc2UgZmllbGQgJHt0aGlzLmluZm8udHlwZU5hbWV9IyR7ZmllbGROYW1lfSwgZW51bSAke3R5cGVbMF19IG9ubHkgYWNjZXB0cyBudWxsLmApO1xuICAgICAgICBpZiAoanNvbiA9PT0gbnVsbClcbiAgICAgICAgICAgIC8vIHdlIHJlcXVpcmUgMCB0byBiZSBkZWZhdWx0IHZhbHVlIGZvciBhbGwgZW51bXNcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBqc29uKSB7XG4gICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgYXNzZXJ0KE51bWJlci5pc0ludGVnZXIoanNvbiksIGBVbmFibGUgdG8gcGFyc2UgZmllbGQgJHt0aGlzLmluZm8udHlwZU5hbWV9IyR7ZmllbGROYW1lfSwgZW51bSBjYW4gb25seSBiZSBpbnRlZ3JhbCBudW1iZXIsIGdvdCAke2pzb259LmApO1xuICAgICAgICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgICAgIGxldCBsb2NhbEVudW1OYW1lID0ganNvbjtcbiAgICAgICAgICAgICAgICBpZiAodHlwZVsyXSAmJiBqc29uLnN1YnN0cmluZygwLCB0eXBlWzJdLmxlbmd0aCkgPT09IHR5cGVbMl0pXG4gICAgICAgICAgICAgICAgICAgIC8vIGxvb2t1cCB3aXRob3V0IHRoZSBzaGFyZWQgcHJlZml4XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsRW51bU5hbWUgPSBqc29uLnN1YnN0cmluZyh0eXBlWzJdLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgbGV0IGVudW1OdW1iZXIgPSB0eXBlWzFdW2xvY2FsRW51bU5hbWVdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW51bU51bWJlciA9PT0gJ3VuZGVmaW5lZCcgJiYgaWdub3JlVW5rbm93bkZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgZW51bU51bWJlciA9PSBcIm51bWJlclwiLCBgVW5hYmxlIHRvIHBhcnNlIGZpZWxkICR7dGhpcy5pbmZvLnR5cGVOYW1lfSMke2ZpZWxkTmFtZX0sIGVudW0gJHt0eXBlWzBdfSBoYXMgbm8gdmFsdWUgZm9yIFwiJHtqc29ufVwiLmApO1xuICAgICAgICAgICAgICAgIHJldHVybiBlbnVtTnVtYmVyO1xuICAgICAgICB9XG4gICAgICAgIGFzc2VydChmYWxzZSwgYFVuYWJsZSB0byBwYXJzZSBmaWVsZCAke3RoaXMuaW5mby50eXBlTmFtZX0jJHtmaWVsZE5hbWV9LCBjYW5ub3QgcGFyc2UgZW51bSB2YWx1ZSBmcm9tICR7dHlwZW9mIGpzb259XCIuYCk7XG4gICAgfVxuICAgIHNjYWxhcihqc29uLCB0eXBlLCBsb25nVHlwZSwgZmllbGROYW1lKSB7XG4gICAgICAgIGxldCBlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgLy8gZmxvYXQsIGRvdWJsZTogSlNPTiB2YWx1ZSB3aWxsIGJlIGEgbnVtYmVyIG9yIG9uZSBvZiB0aGUgc3BlY2lhbCBzdHJpbmcgdmFsdWVzIFwiTmFOXCIsIFwiSW5maW5pdHlcIiwgYW5kIFwiLUluZmluaXR5XCIuXG4gICAgICAgICAgICAgICAgLy8gRWl0aGVyIG51bWJlcnMgb3Igc3RyaW5ncyBhcmUgYWNjZXB0ZWQuIEV4cG9uZW50IG5vdGF0aW9uIGlzIGFsc28gYWNjZXB0ZWQuXG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkRPVUJMRTpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC4wO1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gXCJOYU5cIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXIuTmFOO1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gXCJJbmZpbml0eVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IFwiLUluZmluaXR5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwiZW1wdHkgc3RyaW5nXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb24gPT0gXCJzdHJpbmdcIiAmJiBqc29uLnRyaW0oKS5sZW5ndGggIT09IGpzb24ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlID0gXCJleHRyYSB3aGl0ZXNwYWNlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb24gIT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YganNvbiAhPSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgZmxvYXQgPSBOdW1iZXIoanNvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4oZmxvYXQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlID0gXCJub3QgYSBudW1iZXJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGZsb2F0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5maW5pdHkgYW5kIC1pbmZpbml0eSBhcmUgaGFuZGxlZCBieSBzdHJpbmcgcmVwcmVzZW50YXRpb24gYWJvdmUsIHNvIHRoaXMgaXMgYW4gZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcInRvbyBsYXJnZSBvciBzbWFsbFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gU2NhbGFyVHlwZS5GTE9BVClcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEZsb2F0MzIoZmxvYXQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQ7XG4gICAgICAgICAgICAgICAgLy8gaW50MzIsIGZpeGVkMzIsIHVpbnQzMjogSlNPTiB2YWx1ZSB3aWxsIGJlIGEgZGVjaW1hbCBudW1iZXIuIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQzMjpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQzMjpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVEMzI6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNJTlQzMjpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW50MzI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiA9PSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgaW50MzIgPSBqc29uO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqc29uID09PSBcIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgZSA9IFwiZW1wdHkgc3RyaW5nXCI7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBqc29uID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc29uLnRyaW0oKS5sZW5ndGggIT09IGpzb24ubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBcImV4dHJhIHdoaXRlc3BhY2VcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiA9IE51bWJlcihqc29uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW50MzIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBTY2FsYXJUeXBlLlVJTlQzMilcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFVJbnQzMihpbnQzMik7XG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEludDMyKGludDMyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludDMyO1xuICAgICAgICAgICAgICAgIC8vIGludDY0LCBmaXhlZDY0LCB1aW50NjQ6IEpTT04gdmFsdWUgd2lsbCBiZSBhIGRlY2ltYWwgc3RyaW5nLiBFaXRoZXIgbnVtYmVycyBvciBzdHJpbmdzIGFyZSBhY2NlcHRlZC5cbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UNjQ6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDY0OlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UNjQ6XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc29uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChQYkxvbmcuWkVSTywgbG9uZ1R5cGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb24gIT0gXCJudW1iZXJcIiAmJiB0eXBlb2YganNvbiAhPSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQoUGJMb25nLmZyb20oanNvbiksIGxvbmdUeXBlKTtcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQ2NDpcbiAgICAgICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDY0OlxuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQoUGJVTG9uZy5aRVJPLCBsb25nVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YganNvbiAhPSBcIm51bWJlclwiICYmIHR5cGVvZiBqc29uICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChQYlVMb25nLmZyb20oanNvbiksIGxvbmdUeXBlKTtcbiAgICAgICAgICAgICAgICAvLyBib29sOlxuICAgICAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uICE9PSBcImJvb2xlYW5cIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ganNvbjtcbiAgICAgICAgICAgICAgICAvLyBzdHJpbmc6XG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNUUklORzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24gPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBqc29uICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlID0gXCJleHRyYSB3aGl0ZXNwYWNlXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KGpzb24pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlID0gXCJpbnZhbGlkIFVURjhcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBqc29uO1xuICAgICAgICAgICAgICAgIC8vIGJ5dGVzOiBKU09OIHZhbHVlIHdpbGwgYmUgdGhlIGRhdGEgZW5jb2RlZCBhcyBhIHN0cmluZyB1c2luZyBzdGFuZGFyZCBiYXNlNjQgZW5jb2Rpbmcgd2l0aCBwYWRkaW5ncy5cbiAgICAgICAgICAgICAgICAvLyBFaXRoZXIgc3RhbmRhcmQgb3IgVVJMLXNhZmUgYmFzZTY0IGVuY29kaW5nIHdpdGgvd2l0aG91dCBwYWRkaW5ncyBhcmUgYWNjZXB0ZWQuXG4gICAgICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJZVEVTOlxuICAgICAgICAgICAgICAgICAgICBpZiAoanNvbiA9PT0gbnVsbCB8fCBqc29uID09PSBcIlwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGpzb24gIT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjRkZWNvZGUoanNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBlID0gZXJyb3IubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFzc2VydChmYWxzZSwgZmllbGROYW1lICsgKGUgPyBcIiAtIFwiICsgZSA6IFwiXCIpLCBqc29uKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBiYXNlNjRlbmNvZGUgfSBmcm9tIFwiLi9iYXNlNjRcIjtcbmltcG9ydCB7IFBiTG9uZywgUGJVTG9uZyB9IGZyb20gXCIuL3BiLWxvbmdcIjtcbmltcG9ydCB7IFNjYWxhclR5cGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbmltcG9ydCB7IGFzc2VydCwgYXNzZXJ0RmxvYXQzMiwgYXNzZXJ0SW50MzIsIGFzc2VydFVJbnQzMiB9IGZyb20gXCIuL2Fzc2VydFwiO1xuLyoqXG4gKiBXcml0ZXMgcHJvdG8zIG1lc3NhZ2VzIGluIGNhbm9uaWNhbCBKU09OIGZvcm1hdCB1c2luZyByZWZsZWN0aW9uXG4gKiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZmxlY3Rpb25Kc29uV3JpdGVyIHtcbiAgICBjb25zdHJ1Y3RvcihpbmZvKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdGhpcy5maWVsZHMgPSAoX2EgPSBpbmZvLmZpZWxkcykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBtZXNzYWdlIHRvIGEgSlNPTiBvYmplY3QsIGJhc2VkIG9uIHRoZSBmaWVsZCBkZXNjcmlwdG9ycy5cbiAgICAgKi9cbiAgICB3cml0ZShtZXNzYWdlLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB7fSwgc291cmNlID0gbWVzc2FnZTtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiB0aGlzLmZpZWxkcykge1xuICAgICAgICAgICAgLy8gZmllbGQgaXMgbm90IHBhcnQgb2YgYSBvbmVvZiwgc2ltcGx5IHdyaXRlIGFzIGlzXG4gICAgICAgICAgICBpZiAoIWZpZWxkLm9uZW9mKSB7XG4gICAgICAgICAgICAgICAgbGV0IGpzb25WYWx1ZSA9IHRoaXMuZmllbGQoZmllbGQsIHNvdXJjZVtmaWVsZC5sb2NhbE5hbWVdLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBpZiAoanNvblZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIGpzb25bb3B0aW9ucy51c2VQcm90b0ZpZWxkTmFtZSA/IGZpZWxkLm5hbWUgOiBmaWVsZC5qc29uTmFtZV0gPSBqc29uVmFsdWU7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBmaWVsZCBpcyBwYXJ0IG9mIGEgb25lb2ZcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gc291cmNlW2ZpZWxkLm9uZW9mXTtcbiAgICAgICAgICAgIGlmIChncm91cC5vbmVvZktpbmQgIT09IGZpZWxkLmxvY2FsTmFtZSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbm90IHNlbGVjdGVkLCBza2lwXG4gICAgICAgICAgICBjb25zdCBvcHQgPSBmaWVsZC5raW5kID09ICdzY2FsYXInIHx8IGZpZWxkLmtpbmQgPT0gJ2VudW0nXG4gICAgICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IGVtaXREZWZhdWx0VmFsdWVzOiB0cnVlIH0pIDogb3B0aW9ucztcbiAgICAgICAgICAgIGxldCBqc29uVmFsdWUgPSB0aGlzLmZpZWxkKGZpZWxkLCBncm91cFtmaWVsZC5sb2NhbE5hbWVdLCBvcHQpO1xuICAgICAgICAgICAgYXNzZXJ0KGpzb25WYWx1ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGpzb25bb3B0aW9ucy51c2VQcm90b0ZpZWxkTmFtZSA/IGZpZWxkLm5hbWUgOiBmaWVsZC5qc29uTmFtZV0gPSBqc29uVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgfVxuICAgIGZpZWxkKGZpZWxkLCB2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQganNvblZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZmllbGQua2luZCA9PSAnbWFwJykge1xuICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IGpzb25PYmogPSB7fTtcbiAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuVi5raW5kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtlbnRyeUtleSwgZW50cnlWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLnNjYWxhcihmaWVsZC5WLlQsIGVudHJ5VmFsdWUsIGZpZWxkLm5hbWUsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uT2JqW2VudHJ5S2V5LnRvU3RyaW5nKCldID0gdmFsOyAvLyBKU09OIHN0YW5kYXJkIGFsbG93cyBvbmx5IChkb3VibGUgcXVvdGVkKSBzdHJpbmcgYXMgcHJvcGVydHkga2V5XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVR5cGUgPSBmaWVsZC5WLlQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbZW50cnlLZXksIGVudHJ5VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5tZXNzYWdlKG1lc3NhZ2VUeXBlLCBlbnRyeVZhbHVlLCBmaWVsZC5uYW1lLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uT2JqW2VudHJ5S2V5LnRvU3RyaW5nKCldID0gdmFsOyAvLyBKU09OIHN0YW5kYXJkIGFsbG93cyBvbmx5IChkb3VibGUgcXVvdGVkKSBzdHJpbmcgYXMgcHJvcGVydHkga2V5XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bUluZm8gPSBmaWVsZC5WLlQoKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbZW50cnlLZXksIGVudHJ5VmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGVudHJ5VmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgZW50cnlWYWx1ZSA9PSAnbnVtYmVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmVudW0oZW51bUluZm8sIGVudHJ5VmFsdWUsIGZpZWxkLm5hbWUsIGZhbHNlLCB0cnVlLCBvcHRpb25zLmVudW1Bc0ludGVnZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25PYmpbZW50cnlLZXkudG9TdHJpbmcoKV0gPSB2YWw7IC8vIEpTT04gc3RhbmRhcmQgYWxsb3dzIG9ubHkgKGRvdWJsZSBxdW90ZWQpIHN0cmluZyBhcyBwcm9wZXJ0eSBrZXlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVtaXREZWZhdWx0VmFsdWVzIHx8IE9iamVjdC5rZXlzKGpzb25PYmopLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAganNvblZhbHVlID0ganNvbk9iajtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmaWVsZC5yZXBlYXQpIHtcbiAgICAgICAgICAgIGFzc2VydChBcnJheS5pc0FycmF5KHZhbHVlKSk7XG4gICAgICAgICAgICBjb25zdCBqc29uQXJyID0gW107XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuc2NhbGFyKGZpZWxkLlQsIHZhbHVlW2ldLCBmaWVsZC5uYW1lLCBmaWVsZC5vcHQsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25BcnIucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudW1JbmZvID0gZmllbGQuVCgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQodmFsdWVbaV0gPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsdWVbaV0gPT0gJ251bWJlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5lbnVtKGVudW1JbmZvLCB2YWx1ZVtpXSwgZmllbGQubmFtZSwgZmllbGQub3B0LCB0cnVlLCBvcHRpb25zLmVudW1Bc0ludGVnZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzb25BcnIucHVzaCh2YWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VUeXBlID0gZmllbGQuVCgpO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLm1lc3NhZ2UobWVzc2FnZVR5cGUsIHZhbHVlW2ldLCBmaWVsZC5uYW1lLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCh2YWwgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBqc29uQXJyLnB1c2godmFsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZCBjb252ZXJ0ZWQgYXJyYXkgdG8ganNvbiBvdXRwdXRcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVtaXREZWZhdWx0VmFsdWVzIHx8IGpzb25BcnIubGVuZ3RoID4gMCB8fCBvcHRpb25zLmVtaXREZWZhdWx0VmFsdWVzKVxuICAgICAgICAgICAgICAgIGpzb25WYWx1ZSA9IGpzb25BcnI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgIGpzb25WYWx1ZSA9IHRoaXMuc2NhbGFyKGZpZWxkLlQsIHZhbHVlLCBmaWVsZC5uYW1lLCBmaWVsZC5vcHQsIG9wdGlvbnMuZW1pdERlZmF1bHRWYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICBqc29uVmFsdWUgPSB0aGlzLmVudW0oZmllbGQuVCgpLCB2YWx1ZSwgZmllbGQubmFtZSwgZmllbGQub3B0LCBvcHRpb25zLmVtaXREZWZhdWx0VmFsdWVzLCBvcHRpb25zLmVudW1Bc0ludGVnZXIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICBqc29uVmFsdWUgPSB0aGlzLm1lc3NhZ2UoZmllbGQuVCgpLCB2YWx1ZSwgZmllbGQubmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBqc29uVmFsdWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYG51bGxgIGFzIHRoZSBkZWZhdWx0IGZvciBnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlLlxuICAgICAqL1xuICAgIGVudW0odHlwZSwgdmFsdWUsIGZpZWxkTmFtZSwgb3B0aW9uYWwsIGVtaXREZWZhdWx0VmFsdWVzLCBlbnVtQXNJbnRlZ2VyKSB7XG4gICAgICAgIGlmICh0eXBlWzBdID09ICdnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlJylcbiAgICAgICAgICAgIHJldHVybiAhZW1pdERlZmF1bHRWYWx1ZXMgJiYgIW9wdGlvbmFsID8gdW5kZWZpbmVkIDogbnVsbDtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydChvcHRpb25hbCk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gMCAmJiAhZW1pdERlZmF1bHRWYWx1ZXMgJiYgIW9wdGlvbmFsKVxuICAgICAgICAgICAgLy8gd2UgcmVxdWlyZSAwIHRvIGJlIGRlZmF1bHQgdmFsdWUgZm9yIGFsbCBlbnVtc1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyk7XG4gICAgICAgIGFzc2VydChOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKSk7XG4gICAgICAgIGlmIChlbnVtQXNJbnRlZ2VyIHx8ICF0eXBlWzFdLmhhc093blByb3BlcnR5KHZhbHVlKSlcbiAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IG5vdyB0aGUgZW51bSB2YWx1ZSwganVzdCByZXR1cm4gdGhlIG51bWJlclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodHlwZVsyXSlcbiAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIGRyb3BwZWQgcHJlZml4XG4gICAgICAgICAgICByZXR1cm4gdHlwZVsyXSArIHR5cGVbMV1bdmFsdWVdO1xuICAgICAgICByZXR1cm4gdHlwZVsxXVt2YWx1ZV07XG4gICAgfVxuICAgIG1lc3NhZ2UodHlwZSwgdmFsdWUsIGZpZWxkTmFtZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmVtaXREZWZhdWx0VmFsdWVzID8gbnVsbCA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHR5cGUuaW50ZXJuYWxKc29uV3JpdGUodmFsdWUsIG9wdGlvbnMpO1xuICAgIH1cbiAgICBzY2FsYXIodHlwZSwgdmFsdWUsIGZpZWxkTmFtZSwgb3B0aW9uYWwsIGVtaXREZWZhdWx0VmFsdWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnQob3B0aW9uYWwpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlZCA9IGVtaXREZWZhdWx0VmFsdWVzIHx8IG9wdGlvbmFsO1xuICAgICAgICAvLyBub2luc3BlY3Rpb24gRmFsbFRocm91Z2hJblN3aXRjaFN0YXRlbWVudEpTXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgLy8gaW50MzIsIGZpeGVkMzIsIHVpbnQzMjogSlNPTiB2YWx1ZSB3aWxsIGJlIGEgZGVjaW1hbCBudW1iZXIuIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNJTlQzMjpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZCA/IDAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYXNzZXJ0SW50MzIodmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5GSVhFRDMyOlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlVJTlQzMjpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZCA/IDAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYXNzZXJ0VUludDMyKHZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAvLyBmbG9hdCwgZG91YmxlOiBKU09OIHZhbHVlIHdpbGwgYmUgYSBudW1iZXIgb3Igb25lIG9mIHRoZSBzcGVjaWFsIHN0cmluZyB2YWx1ZXMgXCJOYU5cIiwgXCJJbmZpbml0eVwiLCBhbmQgXCItSW5maW5pdHlcIi5cbiAgICAgICAgICAgIC8vIEVpdGhlciBudW1iZXJzIG9yIHN0cmluZ3MgYXJlIGFjY2VwdGVkLiBFeHBvbmVudCBub3RhdGlvbiBpcyBhbHNvIGFjY2VwdGVkLlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZMT0FUOlxuICAgICAgICAgICAgICAgIGFzc2VydEZsb2F0MzIodmFsdWUpO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkRPVUJMRTpcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZCA/IDAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyk7XG4gICAgICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnTmFOJztcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJbmZpbml0eSc7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnLUluZmluaXR5JztcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAvLyBzdHJpbmc6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU1RSSU5HOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVkID8gJycgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgLy8gYm9vbDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlZCA/IGZhbHNlIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT0gJ2Jvb2xlYW4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAvLyBKU09OIHZhbHVlIHdpbGwgYmUgYSBkZWNpbWFsIHN0cmluZy4gRWl0aGVyIG51bWJlcnMgb3Igc3RyaW5ncyBhcmUgYWNjZXB0ZWQuXG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDY0OlxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkZJWEVENjQ6XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09ICdiaWdpbnQnKTtcbiAgICAgICAgICAgICAgICBsZXQgdWxvbmcgPSBQYlVMb25nLmZyb20odmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmICh1bG9uZy5pc1plcm8oKSAmJiAhZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVsb25nLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAvLyBKU09OIHZhbHVlIHdpbGwgYmUgYSBkZWNpbWFsIHN0cmluZy4gRWl0aGVyIG51bWJlcnMgb3Igc3RyaW5ncyBhcmUgYWNjZXB0ZWQuXG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UNjQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0ZJWEVENjQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDY0OlxuICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgfHwgdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PSAnYmlnaW50Jyk7XG4gICAgICAgICAgICAgICAgbGV0IGxvbmcgPSBQYkxvbmcuZnJvbSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGxvbmcuaXNaZXJvKCkgJiYgIWVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBsb25nLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAvLyBieXRlczogSlNPTiB2YWx1ZSB3aWxsIGJlIHRoZSBkYXRhIGVuY29kZWQgYXMgYSBzdHJpbmcgdXNpbmcgc3RhbmRhcmQgYmFzZTY0IGVuY29kaW5nIHdpdGggcGFkZGluZ3MuXG4gICAgICAgICAgICAvLyBFaXRoZXIgc3RhbmRhcmQgb3IgVVJMLXNhZmUgYmFzZTY0IGVuY29kaW5nIHdpdGgvd2l0aG91dCBwYWRkaW5ncyBhcmUgYWNjZXB0ZWQuXG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSk7XG4gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5ieXRlTGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWQgPyBcIlwiIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHJldHVybiBiYXNlNjRlbmNvZGUodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgTG9uZ1R5cGUgfSBmcm9tIFwiLi9yZWZsZWN0aW9uLWluZm9cIjtcbi8qKlxuICogVXRpbGl0eSBtZXRob2QgdG8gY29udmVydCBhIFBiTG9uZyBvciBQYlVsb25nIHRvIGEgSmF2YVNjcmlwdFxuICogcmVwcmVzZW50YXRpb24gZHVyaW5nIHJ1bnRpbWUuXG4gKlxuICogV29ya3Mgd2l0aCBnZW5lcmF0ZWQgZmllbGQgaW5mb3JtYXRpb24sIGB1bmRlZmluZWRgIGlzIGVxdWl2YWxlbnRcbiAqIHRvIGBTVFJJTkdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVmbGVjdGlvbkxvbmdDb252ZXJ0KGxvbmcsIHR5cGUpIHtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBMb25nVHlwZS5CSUdJTlQ6XG4gICAgICAgICAgICByZXR1cm4gbG9uZy50b0JpZ0ludCgpO1xuICAgICAgICBjYXNlIExvbmdUeXBlLk5VTUJFUjpcbiAgICAgICAgICAgIHJldHVybiBsb25nLnRvTnVtYmVyKCk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAvLyBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgICAgIC8vIGNhc2UgTG9uZ1R5cGUuU1RSSU5HOlxuICAgICAgICAgICAgcmV0dXJuIGxvbmcudG9TdHJpbmcoKTtcbiAgICB9XG59XG4iLCIvKipcbiAqIENvcHkgcGFydGlhbCBkYXRhIGludG8gdGhlIHRhcmdldCBtZXNzYWdlLlxuICpcbiAqIElmIGEgc2luZ3VsYXIgc2NhbGFyIG9yIGVudW0gZmllbGQgaXMgcHJlc2VudCBpbiB0aGUgc291cmNlLCBpdFxuICogcmVwbGFjZXMgdGhlIGZpZWxkIGluIHRoZSB0YXJnZXQuXG4gKlxuICogSWYgYSBzaW5ndWxhciBtZXNzYWdlIGZpZWxkIGlzIHByZXNlbnQgaW4gdGhlIHNvdXJjZSwgaXQgaXMgbWVyZ2VkXG4gKiB3aXRoIHRoZSB0YXJnZXQgZmllbGQgYnkgY2FsbGluZyBtZXJnZVBhcnRpYWwoKSBvZiB0aGUgcmVzcG9uc2libGVcbiAqIG1lc3NhZ2UgdHlwZS5cbiAqXG4gKiBJZiBhIHJlcGVhdGVkIGZpZWxkIGlzIHByZXNlbnQgaW4gdGhlIHNvdXJjZSwgaXRzIHZhbHVlcyByZXBsYWNlXG4gKiBhbGwgdmFsdWVzIGluIHRoZSB0YXJnZXQgYXJyYXksIHJlbW92aW5nIGV4dHJhbmVvdXMgdmFsdWVzLlxuICogUmVwZWF0ZWQgbWVzc2FnZSBmaWVsZHMgYXJlIGNvcGllZCwgbm90IG1lcmdlZC5cbiAqXG4gKiBJZiBhIG1hcCBmaWVsZCBpcyBwcmVzZW50IGluIHRoZSBzb3VyY2UsIGVudHJpZXMgYXJlIGFkZGVkIHRvIHRoZVxuICogdGFyZ2V0IG1hcCwgcmVwbGFjaW5nIGVudHJpZXMgd2l0aCB0aGUgc2FtZSBrZXkuIEVudHJpZXMgdGhhdCBvbmx5XG4gKiBleGlzdCBpbiB0aGUgdGFyZ2V0IHJlbWFpbi4gRW50cmllcyB3aXRoIG1lc3NhZ2UgdmFsdWVzIGFyZSBjb3BpZWQsXG4gKiBub3QgbWVyZ2VkLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRpZmZlcnMgZnJvbSBwcm90b2J1ZiBtZXJnZSBzZW1hbnRpY3MsXG4gKiB3aGljaCBhcHBlbmRzIHJlcGVhdGVkIGZpZWxkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3Rpb25NZXJnZVBhcnRpYWwoaW5mbywgdGFyZ2V0LCBzb3VyY2UpIHtcbiAgICBsZXQgZmllbGRWYWx1ZSwgLy8gdGhlIGZpZWxkIHZhbHVlIHdlIGFyZSB3b3JraW5nIHdpdGhcbiAgICBpbnB1dCA9IHNvdXJjZSwgb3V0cHV0OyAvLyB3aGVyZSB3ZSB3YW50IG91ciBmaWVsZCB2YWx1ZSB0byBnb1xuICAgIGZvciAobGV0IGZpZWxkIG9mIGluZm8uZmllbGRzKSB7XG4gICAgICAgIGxldCBuYW1lID0gZmllbGQubG9jYWxOYW1lO1xuICAgICAgICBpZiAoZmllbGQub25lb2YpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gaW5wdXRbZmllbGQub25lb2ZdOyAvLyB0aGlzIGlzIHRoZSBvbmVvZmBzIGdyb3VwIGluIHRoZSBzb3VyY2VcbiAgICAgICAgICAgIGlmICgoZ3JvdXAgPT09IG51bGwgfHwgZ3JvdXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGdyb3VwLm9uZW9mS2luZCkgPT0gdW5kZWZpbmVkKSB7IC8vIHRoZSB1c2VyIGlzIGZyZWUgdG8gb21pdFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyB3ZSBza2lwIHRoaXMgZmllbGQsIGFuZCBhbGwgb3RoZXIgbWVtYmVycyB0b29cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBncm91cFtuYW1lXTsgLy8gb3VyIHZhbHVlIGNvbWVzIGZyb20gdGhlIHRoZSBvbmVvZiBncm91cCBvZiB0aGUgc291cmNlXG4gICAgICAgICAgICBvdXRwdXQgPSB0YXJnZXRbZmllbGQub25lb2ZdOyAvLyBhbmQgb3VyIG91dHB1dCBpcyB0aGUgb25lb2YgZ3JvdXAgb2YgdGhlIHRhcmdldFxuICAgICAgICAgICAgb3V0cHV0Lm9uZW9mS2luZCA9IGdyb3VwLm9uZW9mS2luZDsgLy8gYWx3YXlzIHVwZGF0ZSBkaXNjcmltaW5hdG9yXG4gICAgICAgICAgICBpZiAoZmllbGRWYWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgb3V0cHV0W25hbWVdOyAvLyByZW1vdmUgYW55IGV4aXN0aW5nIHZhbHVlXG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgZnVydGhlciB3b3JrIG9uIGZpZWxkXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmaWVsZFZhbHVlID0gaW5wdXRbbmFtZV07IC8vIHdlIGFyZSB1c2luZyB0aGUgc291cmNlIGRpcmVjdGx5XG4gICAgICAgICAgICBvdXRwdXQgPSB0YXJnZXQ7IC8vIHdlIHdhbnQgb3VyIGZpZWxkIHZhbHVlIHRvIGdvIGRpcmVjdGx5IGludG8gdGhlIHRhcmdldFxuICAgICAgICAgICAgaWYgKGZpZWxkVmFsdWUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7IC8vIHNraXAgZnVydGhlciB3b3JrIG9uIGZpZWxkLCBleGlzdGluZyB2YWx1ZSBpcyB1c2VkIGFzIGlzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpZWxkLnJlcGVhdClcbiAgICAgICAgICAgIG91dHB1dFtuYW1lXS5sZW5ndGggPSBmaWVsZFZhbHVlLmxlbmd0aDsgLy8gcmVzaXplIHRhcmdldCBhcnJheSB0byBtYXRjaCBzb3VyY2UgYXJyYXlcbiAgICAgICAgLy8gbm93IHdlIGp1c3Qgd29yayB3aXRoIGBmaWVsZFZhbHVlYCBhbmQgYG91dHB1dGAgdG8gbWVyZ2UgdGhlIHZhbHVlXG4gICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQucmVwZWF0KVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkVmFsdWUubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbmFtZV1baV0gPSBmaWVsZFZhbHVlW2ldOyAvLyBub3QgYSByZWZlcmVuY2UgdHlwZVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25hbWVdID0gZmllbGRWYWx1ZTsgLy8gbm90IGEgcmVmZXJlbmNlIHR5cGVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5UKCk7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkLnJlcGVhdClcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZFZhbHVlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25hbWVdW2ldID0gVC5jcmVhdGUoZmllbGRWYWx1ZVtpXSk7XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3V0cHV0W25hbWVdID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtuYW1lXSA9IFQuY3JlYXRlKGZpZWxkVmFsdWUpOyAvLyBub3RoaW5nIHRvIG1lcmdlIHdpdGhcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIFQubWVyZ2VQYXJ0aWFsKG91dHB1dFtuYW1lXSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgLy8gTWFwIGFuZCByZXBlYXRlZCBmaWVsZHMgYXJlIHNpbXBseSBvdmVyd3JpdHRlbiwgbm90IGFwcGVuZGVkIG9yIG1lcmdlZFxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuVi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzY2FsYXJcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3V0cHV0W25hbWVdLCBmaWVsZFZhbHVlKTsgLy8gZWxlbWVudHMgYXJlIG5vdCByZWZlcmVuY2UgdHlwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IFQgPSBmaWVsZC5WLlQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgb2YgT2JqZWN0LmtleXMoZmllbGRWYWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W25hbWVdW2tdID0gVC5jcmVhdGUoZmllbGRWYWx1ZVtrXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBMb25nVHlwZSwgU2NhbGFyVHlwZSB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuaW1wb3J0IHsgcmVmbGVjdGlvbkxvbmdDb252ZXJ0IH0gZnJvbSBcIi4vcmVmbGVjdGlvbi1sb25nLWNvbnZlcnRcIjtcbmltcG9ydCB7IFBiTG9uZywgUGJVTG9uZyB9IGZyb20gXCIuL3BiLWxvbmdcIjtcbi8qKlxuICogQ3JlYXRlcyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBzY2FsYXIgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3Rpb25TY2FsYXJEZWZhdWx0KHR5cGUsIGxvbmdUeXBlID0gTG9uZ1R5cGUuU1RSSU5HKSB7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CT09MOlxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDY0OlxuICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQ2NDpcbiAgICAgICAgICAgIHJldHVybiByZWZsZWN0aW9uTG9uZ0NvbnZlcnQoUGJVTG9uZy5aRVJPLCBsb25nVHlwZSk7XG4gICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQ2NDpcbiAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDY0OlxuICAgICAgICBjYXNlIFNjYWxhclR5cGUuU0lOVDY0OlxuICAgICAgICAgICAgcmV0dXJuIHJlZmxlY3Rpb25Mb25nQ29udmVydChQYkxvbmcuWkVSTywgbG9uZ1R5cGUpO1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuRE9VQkxFOlxuICAgICAgICBjYXNlIFNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICByZXR1cm4gMC4wO1xuICAgICAgICBjYXNlIFNjYWxhclR5cGUuQllURVM6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TVFJJTkc6XG4gICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5JTlQzMjpcbiAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5VSU5UMzI6XG4gICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuU0lOVDMyOlxuICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICAvLyBjYXNlIFNjYWxhclR5cGUuU0ZJWEVEMzI6XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBMb25nVHlwZSwgU2NhbGFyVHlwZSB9IGZyb20gXCIuL3JlZmxlY3Rpb24taW5mb1wiO1xuaW1wb3J0IHsgaXNPbmVvZkdyb3VwIH0gZnJvbSBcIi4vb25lb2ZcIjtcbi8vIG5vaW5zcGVjdGlvbiBKU01ldGhvZENhbkJlU3RhdGljXG5leHBvcnQgY2xhc3MgUmVmbGVjdGlvblR5cGVDaGVjayB7XG4gICAgY29uc3RydWN0b3IoaW5mbykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuZmllbGRzID0gKF9hID0gaW5mby5maWVsZHMpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdO1xuICAgIH1cbiAgICBwcmVwYXJlKCkge1xuICAgICAgICBpZiAodGhpcy5kYXRhKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCByZXEgPSBbXSwga25vd24gPSBbXSwgb25lb2ZzID0gW107XG4gICAgICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAoZmllbGQub25lb2YpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW9uZW9mcy5pbmNsdWRlcyhmaWVsZC5vbmVvZikpIHtcbiAgICAgICAgICAgICAgICAgICAgb25lb2ZzLnB1c2goZmllbGQub25lb2YpO1xuICAgICAgICAgICAgICAgICAgICByZXEucHVzaChmaWVsZC5vbmVvZik7XG4gICAgICAgICAgICAgICAgICAgIGtub3duLnB1c2goZmllbGQub25lb2YpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGtub3duLnB1c2goZmllbGQubG9jYWxOYW1lKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZC5vcHQgfHwgZmllbGQucmVwZWF0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5wdXNoKGZpZWxkLmxvY2FsTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm1lc3NhZ2VcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5yZXBlYXQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLnB1c2goZmllbGQubG9jYWxOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXEucHVzaChmaWVsZC5sb2NhbE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YSA9IHsgcmVxLCBrbm93biwgb25lb2ZzOiBPYmplY3QudmFsdWVzKG9uZW9mcykgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSXMgdGhlIGFyZ3VtZW50IGEgdmFsaWQgbWVzc2FnZSBhcyBzcGVjaWZpZWQgYnkgdGhlXG4gICAgICogcmVmbGVjdGlvbiBpbmZvcm1hdGlvbj9cbiAgICAgKlxuICAgICAqIENoZWNrcyBhbGwgZmllbGQgdHlwZXMgcmVjdXJzaXZlbHkuIFRoZSBgZGVwdGhgXG4gICAgICogc3BlY2lmaWVzIGhvdyBkZWVwIGludG8gdGhlIHN0cnVjdHVyZSB0aGUgY2hlY2sgd2lsbCBiZS5cbiAgICAgKlxuICAgICAqIFdpdGggYSBkZXB0aCBvZiAwLCBvbmx5IHRoZSBwcmVzZW5jZSBvZiBmaWVsZHNcbiAgICAgKiBpcyBjaGVja2VkLlxuICAgICAqXG4gICAgICogV2l0aCBhIGRlcHRoIG9mIDEgb3IgbW9yZSwgdGhlIGZpZWxkIHR5cGVzIGFyZSBjaGVja2VkLlxuICAgICAqXG4gICAgICogV2l0aCBhIGRlcHRoIG9mIDIgb3IgbW9yZSwgdGhlIG1lbWJlcnMgb2YgbWFwLCByZXBlYXRlZFxuICAgICAqIGFuZCBtZXNzYWdlIGZpZWxkcyBhcmUgY2hlY2tlZC5cbiAgICAgKlxuICAgICAqIE1lc3NhZ2UgZmllbGRzIHdpbGwgYmUgY2hlY2tlZCByZWN1cnNpdmVseSB3aXRoIGRlcHRoIC0gMS5cbiAgICAgKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbWFwIGVudHJpZXMgLyByZXBlYXRlZCB2YWx1ZXMgYmVpbmcgY2hlY2tlZFxuICAgICAqIGlzIDwgZGVwdGguXG4gICAgICovXG4gICAgaXMobWVzc2FnZSwgZGVwdGgsIGFsbG93RXhjZXNzUHJvcGVydGllcyA9IGZhbHNlKSB7XG4gICAgICAgIGlmIChkZXB0aCA8IDApXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXNzYWdlICE9ICdvYmplY3QnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB0aGlzLnByZXBhcmUoKTtcbiAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhtZXNzYWdlKSwgZGF0YSA9IHRoaXMuZGF0YTtcbiAgICAgICAgLy8gaWYgYSByZXF1aXJlZCBmaWVsZCBpcyBtaXNzaW5nIGluIGFyZywgdGhpcyBjYW5ub3QgYmUgYSBUXG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA8IGRhdGEucmVxLmxlbmd0aCB8fCBkYXRhLnJlcS5zb21lKG4gPT4gIWtleXMuaW5jbHVkZXMobikpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWFsbG93RXhjZXNzUHJvcGVydGllcykge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGFyZyBjb250YWlucyBhIGtleSB3ZSBkb250IGtub3csIHRoaXMgaXMgbm90IGEgbGl0ZXJhbCBUXG4gICAgICAgICAgICBpZiAoa2V5cy5zb21lKGsgPT4gIWRhdGEua25vd24uaW5jbHVkZXMoaykpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBcIldpdGggYSBkZXB0aCBvZiAwLCBvbmx5IHRoZSBwcmVzZW5jZSBhbmQgYWJzZW5jZSBvZiBmaWVsZHMgaXMgY2hlY2tlZC5cIlxuICAgICAgICAvLyBcIldpdGggYSBkZXB0aCBvZiAxIG9yIG1vcmUsIHRoZSBmaWVsZCB0eXBlcyBhcmUgY2hlY2tlZC5cIlxuICAgICAgICBpZiAoZGVwdGggPCAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjaGVjayBvbmVvZiBncm91cFxuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgZGF0YS5vbmVvZnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gbWVzc2FnZVtuYW1lXTtcbiAgICAgICAgICAgIGlmICghaXNPbmVvZkdyb3VwKGdyb3VwKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZ3JvdXAub25lb2ZLaW5kID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZmllbGRzLmZpbmQoZiA9PiBmLmxvY2FsTmFtZSA9PT0gZ3JvdXAub25lb2ZLaW5kKTtcbiAgICAgICAgICAgIGlmICghZmllbGQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyB3ZSBmb3VuZCBubyBmaWVsZCwgYnV0IGhhdmUgYSBraW5kLCBzb21ldGhpbmcgaXMgd3JvbmdcbiAgICAgICAgICAgIGlmICghdGhpcy5maWVsZChncm91cFtncm91cC5vbmVvZktpbmRdLCBmaWVsZCwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIHR5cGVzXG4gICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgdGhpcy5maWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmaWVsZC5vbmVvZiAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZpZWxkKG1lc3NhZ2VbZmllbGQubG9jYWxOYW1lXSwgZmllbGQsIGFsbG93RXhjZXNzUHJvcGVydGllcywgZGVwdGgpKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZmllbGQoYXJnLCBmaWVsZCwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCkge1xuICAgICAgICBsZXQgcmVwZWF0ZWQgPSBmaWVsZC5yZXBlYXQ7XG4gICAgICAgIHN3aXRjaCAoZmllbGQua2luZCkge1xuICAgICAgICAgICAgY2FzZSBcInNjYWxhclwiOlxuICAgICAgICAgICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLm9wdDtcbiAgICAgICAgICAgICAgICBpZiAocmVwZWF0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoYXJnLCBmaWVsZC5ULCBkZXB0aCwgZmllbGQuTCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFyKGFyZywgZmllbGQuVCwgZmllbGQuTCk7XG4gICAgICAgICAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgICAgICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkLm9wdDtcbiAgICAgICAgICAgICAgICBpZiAocmVwZWF0ZWQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoYXJnLCBTY2FsYXJUeXBlLklOVDMyLCBkZXB0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFyKGFyZywgU2NhbGFyVHlwZS5JTlQzMik7XG4gICAgICAgICAgICBjYXNlIFwibWVzc2FnZVwiOlxuICAgICAgICAgICAgICAgIGlmIChhcmcgPT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlcGVhdGVkKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlcyhhcmcsIGZpZWxkLlQoKSwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZShhcmcsIGZpZWxkLlQoKSwgYWxsb3dFeGNlc3NQcm9wZXJ0aWVzLCBkZXB0aCk7XG4gICAgICAgICAgICBjYXNlIFwibWFwXCI6XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmcgIT0gJ29iamVjdCcgfHwgYXJnID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKGRlcHRoIDwgMilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hcEtleXMoYXJnLCBmaWVsZC5LLCBkZXB0aCkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLlYua2luZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2NhbGFyXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKE9iamVjdC52YWx1ZXMoYXJnKSwgZmllbGQuVi5ULCBkZXB0aCwgZmllbGQuVi5MKTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoT2JqZWN0LnZhbHVlcyhhcmcpLCBTY2FsYXJUeXBlLklOVDMyLCBkZXB0aCk7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZXNzYWdlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlcyhPYmplY3QudmFsdWVzKGFyZyksIGZpZWxkLlYuVCgpLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMsIGRlcHRoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG1lc3NhZ2UoYXJnLCB0eXBlLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMsIGRlcHRoKSB7XG4gICAgICAgIGlmIChhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlLmlzQXNzaWduYWJsZShhcmcsIGRlcHRoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZS5pcyhhcmcsIGRlcHRoKTtcbiAgICB9XG4gICAgbWVzc2FnZXMoYXJnLCB0eXBlLCBhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMsIGRlcHRoKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmcpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGVwdGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChhbGxvd0V4Y2Vzc1Byb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJnLmxlbmd0aCAmJiBpIDwgZGVwdGg7IGkrKylcbiAgICAgICAgICAgICAgICBpZiAoIXR5cGUuaXNBc3NpZ25hYmxlKGFyZ1tpXSwgZGVwdGggLSAxKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmcubGVuZ3RoICYmIGkgPCBkZXB0aDsgaSsrKVxuICAgICAgICAgICAgICAgIGlmICghdHlwZS5pcyhhcmdbaV0sIGRlcHRoIC0gMSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgc2NhbGFyKGFyZywgdHlwZSwgbG9uZ1R5cGUpIHtcbiAgICAgICAgbGV0IGFyZ1R5cGUgPSB0eXBlb2YgYXJnO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5VSU5UNjQ6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5JTlQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQ2NDpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UNjQ6XG4gICAgICAgICAgICAgICAgc3dpdGNoIChsb25nVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExvbmdUeXBlLkJJR0lOVDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09IFwiYmlnaW50XCI7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgTG9uZ1R5cGUuTlVNQkVSOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZ1R5cGUgPT0gXCJudW1iZXJcIiAmJiAhaXNOYU4oYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09IFwic3RyaW5nXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLkJPT0w6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ1R5cGUgPT0gJ2Jvb2xlYW4nO1xuICAgICAgICAgICAgY2FzZSBTY2FsYXJUeXBlLlNUUklORzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnVHlwZSA9PSAnc3RyaW5nJztcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5CWVRFUzpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJnIGluc3RhbmNlb2YgVWludDhBcnJheTtcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5ET1VCTEU6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRkxPQVQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFyZ1R5cGUgPT0gJ251bWJlcicgJiYgIWlzTmFOKGFyZyk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5VSU5UMzI6XG4gICAgICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLkZJWEVEMzI6XG4gICAgICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLklOVDMyOlxuICAgICAgICAgICAgICAgIC8vIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICAgICAgLy8gY2FzZSBTY2FsYXJUeXBlLlNGSVhFRDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiBhcmdUeXBlID09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIoYXJnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzY2FsYXJzKGFyZywgdHlwZSwgZGVwdGgsIGxvbmdUeXBlKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmcpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoZGVwdGggPCAyKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZy5sZW5ndGggJiYgaSA8IGRlcHRoOyBpKyspXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNjYWxhcihhcmdbaV0sIHR5cGUsIGxvbmdUeXBlKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbWFwS2V5cyhtYXAsIHR5cGUsIGRlcHRoKSB7XG4gICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMobWFwKTtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuSU5UMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TRklYRUQzMjpcbiAgICAgICAgICAgIGNhc2UgU2NhbGFyVHlwZS5TSU5UMzI6XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuVUlOVDMyOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhcnMoa2V5cy5zbGljZSgwLCBkZXB0aCkubWFwKGsgPT4gcGFyc2VJbnQoaykpLCB0eXBlLCBkZXB0aCk7XG4gICAgICAgICAgICBjYXNlIFNjYWxhclR5cGUuQk9PTDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJzKGtleXMuc2xpY2UoMCwgZGVwdGgpLm1hcChrID0+IGsgPT0gJ3RydWUnID8gdHJ1ZSA6IGsgPT0gJ2ZhbHNlJyA/IGZhbHNlIDogayksIHR5cGUsIGRlcHRoKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGFycyhrZXlzLCB0eXBlLCBkZXB0aCwgTG9uZ1R5cGUuU1RSSU5HKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlcXVpcmVkQXJncyhyZXF1aXJlZCwgYXJncykge1xuICBpZiAoYXJncy5sZW5ndGggPCByZXF1aXJlZCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocmVxdWlyZWQgKyAnIGFyZ3VtZW50JyArIChyZXF1aXJlZCA+IDEgPyAncycgOiAnJykgKyAnIHJlcXVpcmVkLCBidXQgb25seSAnICsgYXJncy5sZW5ndGggKyAnIHByZXNlbnQnKTtcbiAgfVxufSIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvSW50ZWdlcihkaXJ0eU51bWJlcikge1xuICBpZiAoZGlydHlOdW1iZXIgPT09IG51bGwgfHwgZGlydHlOdW1iZXIgPT09IHRydWUgfHwgZGlydHlOdW1iZXIgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuICB2YXIgbnVtYmVyID0gTnVtYmVyKGRpcnR5TnVtYmVyKTtcbiAgaWYgKGlzTmFOKG51bWJlcikpIHtcbiAgICByZXR1cm4gbnVtYmVyO1xuICB9XG4gIHJldHVybiBudW1iZXIgPCAwID8gTWF0aC5jZWlsKG51bWJlcikgOiBNYXRoLmZsb29yKG51bWJlcik7XG59IiwiaW1wb3J0IHRvSW50ZWdlciBmcm9tIFwiLi4vX2xpYi90b0ludGVnZXIvaW5kZXguanNcIjtcbmltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgYWRkTWlsbGlzZWNvbmRzXG4gKiBAY2F0ZWdvcnkgTWlsbGlzZWNvbmQgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFkZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZSAtIHRoZSBkYXRlIHRvIGJlIGNoYW5nZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBhbW91bnQgLSB0aGUgYW1vdW50IG9mIG1pbGxpc2Vjb25kcyB0byBiZSBhZGRlZC4gUG9zaXRpdmUgZGVjaW1hbHMgd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmZsb29yYCwgZGVjaW1hbHMgbGVzcyB0aGFuIHplcm8gd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmNlaWxgLlxuICogQHJldHVybnMge0RhdGV9IHRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBtaWxsaXNlY29uZHMgYWRkZWRcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIDc1MCBtaWxsaXNlY29uZHMgdG8gMTAgSnVseSAyMDE0IDEyOjQ1OjMwLjAwMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZE1pbGxpc2Vjb25kcyhuZXcgRGF0ZSgyMDE0LCA2LCAxMCwgMTIsIDQ1LCAzMCwgMCksIDc1MClcbiAqIC8vPT4gVGh1IEp1bCAxMCAyMDE0IDEyOjQ1OjMwLjc1MFxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZGRNaWxsaXNlY29uZHMoZGlydHlEYXRlLCBkaXJ0eUFtb3VudCkge1xuICByZXF1aXJlZEFyZ3MoMiwgYXJndW1lbnRzKTtcbiAgdmFyIHRpbWVzdGFtcCA9IHRvRGF0ZShkaXJ0eURhdGUpLmdldFRpbWUoKTtcbiAgdmFyIGFtb3VudCA9IHRvSW50ZWdlcihkaXJ0eUFtb3VudCk7XG4gIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXAgKyBhbW91bnQpO1xufSIsImltcG9ydCB0b0ludGVnZXIgZnJvbSBcIi4uL19saWIvdG9JbnRlZ2VyL2luZGV4LmpzXCI7XG5pbXBvcnQgYWRkTWlsbGlzZWNvbmRzIGZyb20gXCIuLi9hZGRNaWxsaXNlY29uZHMvaW5kZXguanNcIjtcbmltcG9ydCByZXF1aXJlZEFyZ3MgZnJvbSBcIi4uL19saWIvcmVxdWlyZWRBcmdzL2luZGV4LmpzXCI7XG4vKipcbiAqIEBuYW1lIGFkZFNlY29uZHNcbiAqIEBjYXRlZ29yeSBTZWNvbmQgSGVscGVyc1xuICogQHN1bW1hcnkgQWRkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlY29uZHMgdG8gdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcyB0byB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAcGFyYW0ge0RhdGV8TnVtYmVyfSBkYXRlIC0gdGhlIGRhdGUgdG8gYmUgY2hhbmdlZFxuICogQHBhcmFtIHtOdW1iZXJ9IGFtb3VudCAtIHRoZSBhbW91bnQgb2Ygc2Vjb25kcyB0byBiZSBhZGRlZC4gUG9zaXRpdmUgZGVjaW1hbHMgd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmZsb29yYCwgZGVjaW1hbHMgbGVzcyB0aGFuIHplcm8gd2lsbCBiZSByb3VuZGVkIHVzaW5nIGBNYXRoLmNlaWxgLlxuICogQHJldHVybnMge0RhdGV9IHRoZSBuZXcgZGF0ZSB3aXRoIHRoZSBzZWNvbmRzIGFkZGVkXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDIgYXJndW1lbnRzIHJlcXVpcmVkXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFkZCAzMCBzZWNvbmRzIHRvIDEwIEp1bHkgMjAxNCAxMjo0NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IGFkZFNlY29uZHMobmV3IERhdGUoMjAxNCwgNiwgMTAsIDEyLCA0NSwgMCksIDMwKVxuICogLy89PiBUaHUgSnVsIDEwIDIwMTQgMTI6NDU6MzBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWRkU2Vjb25kcyhkaXJ0eURhdGUsIGRpcnR5QW1vdW50KSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgYW1vdW50ID0gdG9JbnRlZ2VyKGRpcnR5QW1vdW50KTtcbiAgcmV0dXJuIGFkZE1pbGxpc2Vjb25kcyhkaXJ0eURhdGUsIGFtb3VudCAqIDEwMDApO1xufSIsImltcG9ydCB0b0RhdGUgZnJvbSBcIi4uL3RvRGF0ZS9pbmRleC5qc1wiO1xuaW1wb3J0IHJlcXVpcmVkQXJncyBmcm9tIFwiLi4vX2xpYi9yZXF1aXJlZEFyZ3MvaW5kZXguanNcIjtcbi8qKlxuICogQG5hbWUgaXNCZWZvcmVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGZpcnN0IGRhdGUgYmVmb3JlIHRoZSBzZWNvbmQgb25lP1xuICpcbiAqIEBkZXNjcmlwdGlvblxuICogSXMgdGhlIGZpcnN0IGRhdGUgYmVmb3JlIHRoZSBzZWNvbmQgb25lP1xuICpcbiAqIEBwYXJhbSB7RGF0ZXxOdW1iZXJ9IGRhdGUgLSB0aGUgZGF0ZSB0aGF0IHNob3VsZCBiZSBiZWZvcmUgdGhlIG90aGVyIG9uZSB0byByZXR1cm4gdHJ1ZVxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gZGF0ZVRvQ29tcGFyZSAtIHRoZSBkYXRlIHRvIGNvbXBhcmUgd2l0aFxuICogQHJldHVybnMge0Jvb2xlYW59IHRoZSBmaXJzdCBkYXRlIGlzIGJlZm9yZSB0aGUgc2Vjb25kIGRhdGVcbiAqIEB0aHJvd3Mge1R5cGVFcnJvcn0gMiBhcmd1bWVudHMgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSXMgMTAgSnVseSAxOTg5IGJlZm9yZSAxMSBGZWJydWFyeSAxOTg3P1xuICogY29uc3QgcmVzdWx0ID0gaXNCZWZvcmUobmV3IERhdGUoMTk4OSwgNiwgMTApLCBuZXcgRGF0ZSgxOTg3LCAxLCAxMSkpXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzQmVmb3JlKGRpcnR5RGF0ZSwgZGlydHlEYXRlVG9Db21wYXJlKSB7XG4gIHJlcXVpcmVkQXJncygyLCBhcmd1bWVudHMpO1xuICB2YXIgZGF0ZSA9IHRvRGF0ZShkaXJ0eURhdGUpO1xuICB2YXIgZGF0ZVRvQ29tcGFyZSA9IHRvRGF0ZShkaXJ0eURhdGVUb0NvbXBhcmUpO1xuICByZXR1cm4gZGF0ZS5nZXRUaW1lKCkgPCBkYXRlVG9Db21wYXJlLmdldFRpbWUoKTtcbn0iLCJpbXBvcnQgX3R5cGVvZiBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdHlwZW9mXCI7XG5pbXBvcnQgcmVxdWlyZWRBcmdzIGZyb20gXCIuLi9fbGliL3JlcXVpcmVkQXJncy9pbmRleC5qc1wiO1xuLyoqXG4gKiBAbmFtZSB0b0RhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENvbnZlcnQgdGhlIGdpdmVuIGFyZ3VtZW50IHRvIGFuIGluc3RhbmNlIG9mIERhdGUuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mIERhdGUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGl0cyBjbG9uZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYSBudW1iZXIsIGl0IGlzIHRyZWF0ZWQgYXMgYSB0aW1lc3RhbXAuXG4gKlxuICogSWYgdGhlIGFyZ3VtZW50IGlzIG5vbmUgb2YgdGhlIGFib3ZlLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBJbnZhbGlkIERhdGUuXG4gKlxuICogKipOb3RlKio6ICphbGwqIERhdGUgYXJndW1lbnRzIHBhc3NlZCB0byBhbnkgKmRhdGUtZm5zKiBmdW5jdGlvbiBpcyBwcm9jZXNzZWQgYnkgYHRvRGF0ZWAuXG4gKlxuICogQHBhcmFtIHtEYXRlfE51bWJlcn0gYXJndW1lbnQgLSB0aGUgdmFsdWUgdG8gY29udmVydFxuICogQHJldHVybnMge0RhdGV9IHRoZSBwYXJzZWQgZGF0ZSBpbiB0aGUgbG9jYWwgdGltZSB6b25lXG4gKiBAdGhyb3dzIHtUeXBlRXJyb3J9IDEgYXJndW1lbnQgcmVxdWlyZWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ2xvbmUgdGhlIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSB0b0RhdGUobmV3IERhdGUoMjAxNCwgMSwgMTEsIDExLCAzMCwgMzApKVxuICogLy89PiBUdWUgRmViIDExIDIwMTQgMTE6MzA6MzBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCB0aGUgdGltZXN0YW1wIHRvIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSB0b0RhdGUoMTM5MjA5ODQzMDAwMClcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRvRGF0ZShhcmd1bWVudCkge1xuICByZXF1aXJlZEFyZ3MoMSwgYXJndW1lbnRzKTtcbiAgdmFyIGFyZ1N0ciA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmd1bWVudCk7XG5cbiAgLy8gQ2xvbmUgdGhlIGRhdGVcbiAgaWYgKGFyZ3VtZW50IGluc3RhbmNlb2YgRGF0ZSB8fCBfdHlwZW9mKGFyZ3VtZW50KSA9PT0gJ29iamVjdCcgJiYgYXJnU3RyID09PSAnW29iamVjdCBEYXRlXScpIHtcbiAgICAvLyBQcmV2ZW50IHRoZSBkYXRlIHRvIGxvc2UgdGhlIG1pbGxpc2Vjb25kcyB3aGVuIHBhc3NlZCB0byBuZXcgRGF0ZSgpIGluIElFMTBcbiAgICByZXR1cm4gbmV3IERhdGUoYXJndW1lbnQuZ2V0VGltZSgpKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdudW1iZXInIHx8IGFyZ1N0ciA9PT0gJ1tvYmplY3QgTnVtYmVyXScpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoYXJndW1lbnQpO1xuICB9IGVsc2Uge1xuICAgIGlmICgodHlwZW9mIGFyZ3VtZW50ID09PSAnc3RyaW5nJyB8fCBhcmdTdHIgPT09ICdbb2JqZWN0IFN0cmluZ10nKSAmJiB0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXCJTdGFydGluZyB3aXRoIHYyLjAuMC1iZXRhLjEgZGF0ZS1mbnMgZG9lc24ndCBhY2NlcHQgc3RyaW5ncyBhcyBkYXRlIGFyZ3VtZW50cy4gUGxlYXNlIHVzZSBgcGFyc2VJU09gIHRvIHBhcnNlIHN0cmluZ3MuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdXBncmFkZUd1aWRlLm1kI3N0cmluZy1hcmd1bWVudHNcIik7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKG5ldyBFcnJvcigpLnN0YWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRlKE5hTik7XG4gIH1cbn0iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby12YXIsIHByZWZlci10ZW1wbGF0ZSAqL1xudmFyIHVwcGVyY2FzZVBhdHRlcm4gPSAvW0EtWl0vZ1xudmFyIG1zUGF0dGVybiA9IC9ebXMtL1xudmFyIGNhY2hlID0ge31cblxuZnVuY3Rpb24gdG9IeXBoZW5Mb3dlcihtYXRjaCkge1xuICByZXR1cm4gJy0nICsgbWF0Y2gudG9Mb3dlckNhc2UoKVxufVxuXG5mdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUobmFtZSkge1xuICBpZiAoY2FjaGUuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICByZXR1cm4gY2FjaGVbbmFtZV1cbiAgfVxuXG4gIHZhciBoTmFtZSA9IG5hbWUucmVwbGFjZSh1cHBlcmNhc2VQYXR0ZXJuLCB0b0h5cGhlbkxvd2VyKVxuICByZXR1cm4gKGNhY2hlW25hbWVdID0gbXNQYXR0ZXJuLnRlc3QoaE5hbWUpID8gJy0nICsgaE5hbWUgOiBoTmFtZSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgaHlwaGVuYXRlU3R5bGVOYW1lXG4iLCJ2YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmV4cG9ydCB2YXIgaXNCcm93c2VyID0gKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZih3aW5kb3cpKSA9PT0gXCJvYmplY3RcIiAmJiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2YoZG9jdW1lbnQpKSA9PT0gJ29iamVjdCcgJiYgZG9jdW1lbnQubm9kZVR5cGUgPT09IDk7XG5cbmV4cG9ydCBkZWZhdWx0IGlzQnJvd3NlcjtcbiIsImltcG9ydCBoeXBoZW5hdGUgZnJvbSAnaHlwaGVuYXRlLXN0eWxlLW5hbWUnO1xuXG4vKipcbiAqIENvbnZlcnQgY2FtZWwgY2FzZWQgcHJvcGVydHkgbmFtZXMgdG8gZGFzaCBzZXBhcmF0ZWQuXG4gKi9cblxuZnVuY3Rpb24gY29udmVydENhc2Uoc3R5bGUpIHtcbiAgdmFyIGNvbnZlcnRlZCA9IHt9O1xuXG4gIGZvciAodmFyIHByb3AgaW4gc3R5bGUpIHtcbiAgICB2YXIga2V5ID0gcHJvcC5pbmRleE9mKCctLScpID09PSAwID8gcHJvcCA6IGh5cGhlbmF0ZShwcm9wKTtcbiAgICBjb252ZXJ0ZWRba2V5XSA9IHN0eWxlW3Byb3BdO1xuICB9XG5cbiAgaWYgKHN0eWxlLmZhbGxiYWNrcykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlLmZhbGxiYWNrcykpIGNvbnZlcnRlZC5mYWxsYmFja3MgPSBzdHlsZS5mYWxsYmFja3MubWFwKGNvbnZlcnRDYXNlKTtlbHNlIGNvbnZlcnRlZC5mYWxsYmFja3MgPSBjb252ZXJ0Q2FzZShzdHlsZS5mYWxsYmFja3MpO1xuICB9XG5cbiAgcmV0dXJuIGNvbnZlcnRlZDtcbn1cbi8qKlxuICogQWxsb3cgY2FtZWwgY2FzZWQgcHJvcGVydHkgbmFtZXMgYnkgY29udmVydGluZyB0aGVtIGJhY2sgdG8gZGFzaGVyaXplZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGNhbWVsQ2FzZSgpIHtcbiAgZnVuY3Rpb24gb25Qcm9jZXNzU3R5bGUoc3R5bGUpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZSkpIHtcbiAgICAgIC8vIEhhbmRsZSBydWxlcyBsaWtlIEBmb250LWZhY2UsIHdoaWNoIGNhbiBoYXZlIG11bHRpcGxlIHN0eWxlcyBpbiBhbiBhcnJheVxuICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHN0eWxlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBzdHlsZVtpbmRleF0gPSBjb252ZXJ0Q2FzZShzdHlsZVtpbmRleF0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3R5bGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnZlcnRDYXNlKHN0eWxlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uQ2hhbmdlVmFsdWUodmFsdWUsIHByb3AsIHJ1bGUpIHtcbiAgICBpZiAocHJvcC5pbmRleE9mKCctLScpID09PSAwKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgdmFyIGh5cGhlbmF0ZWRQcm9wID0gaHlwaGVuYXRlKHByb3ApOyAvLyBUaGVyZSB3YXMgbm8gY2FtZWwgY2FzZSBpbiBwbGFjZVxuXG4gICAgaWYgKHByb3AgPT09IGh5cGhlbmF0ZWRQcm9wKSByZXR1cm4gdmFsdWU7XG4gICAgcnVsZS5wcm9wKGh5cGhlbmF0ZWRQcm9wLCB2YWx1ZSk7IC8vIENvcmUgd2lsbCBpZ25vcmUgdGhhdCBwcm9wZXJ0eSB2YWx1ZSB3ZSBzZXQgdGhlIHByb3BlciBvbmUgYWJvdmUuXG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb25Qcm9jZXNzU3R5bGU6IG9uUHJvY2Vzc1N0eWxlLFxuICAgIG9uQ2hhbmdlVmFsdWU6IG9uQ2hhbmdlVmFsdWVcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2FtZWxDYXNlO1xuIiwiaW1wb3J0IF9leHRlbmRzIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMnO1xuaW1wb3J0IHsgUnVsZUxpc3QgfSBmcm9tICdqc3MnO1xuXG52YXIgYXQgPSAnQGdsb2JhbCc7XG52YXIgYXRQcmVmaXggPSAnQGdsb2JhbCAnO1xuXG52YXIgR2xvYmFsQ29udGFpbmVyUnVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEdsb2JhbENvbnRhaW5lclJ1bGUoa2V5LCBzdHlsZXMsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnR5cGUgPSAnZ2xvYmFsJztcbiAgICB0aGlzLmF0ID0gYXQ7XG4gICAgdGhpcy5pc1Byb2Nlc3NlZCA9IGZhbHNlO1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5ydWxlcyA9IG5ldyBSdWxlTGlzdChfZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgICAgcGFyZW50OiB0aGlzXG4gICAgfSkpO1xuXG4gICAgZm9yICh2YXIgc2VsZWN0b3IgaW4gc3R5bGVzKSB7XG4gICAgICB0aGlzLnJ1bGVzLmFkZChzZWxlY3Rvciwgc3R5bGVzW3NlbGVjdG9yXSk7XG4gICAgfVxuXG4gICAgdGhpcy5ydWxlcy5wcm9jZXNzKCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBhIHJ1bGUuXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IEdsb2JhbENvbnRhaW5lclJ1bGUucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXRSdWxlID0gZnVuY3Rpb24gZ2V0UnVsZShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMucnVsZXMuZ2V0KG5hbWUpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIHJ1bGUsIHJ1biBwbHVnaW5zLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5hZGRSdWxlID0gZnVuY3Rpb24gYWRkUnVsZShuYW1lLCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHZhciBydWxlID0gdGhpcy5ydWxlcy5hZGQobmFtZSwgc3R5bGUsIG9wdGlvbnMpO1xuICAgIGlmIChydWxlKSB0aGlzLm9wdGlvbnMuanNzLnBsdWdpbnMub25Qcm9jZXNzUnVsZShydWxlKTtcbiAgICByZXR1cm4gcnVsZTtcbiAgfVxuICAvKipcbiAgICogUmVwbGFjZSBydWxlLCBydW4gcGx1Z2lucy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucmVwbGFjZVJ1bGUgPSBmdW5jdGlvbiByZXBsYWNlUnVsZShuYW1lLCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHZhciBuZXdSdWxlID0gdGhpcy5ydWxlcy5yZXBsYWNlKG5hbWUsIHN0eWxlLCBvcHRpb25zKTtcbiAgICBpZiAobmV3UnVsZSkgdGhpcy5vcHRpb25zLmpzcy5wbHVnaW5zLm9uUHJvY2Vzc1J1bGUobmV3UnVsZSk7XG4gICAgcmV0dXJuIG5ld1J1bGU7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBpbmRleCBvZiBhIHJ1bGUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmluZGV4T2YgPSBmdW5jdGlvbiBpbmRleE9mKHJ1bGUpIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlcy5pbmRleE9mKHJ1bGUpO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBDU1Mgc3RyaW5nLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy5ydWxlcy50b1N0cmluZyhvcHRpb25zKTtcbiAgfTtcblxuICByZXR1cm4gR2xvYmFsQ29udGFpbmVyUnVsZTtcbn0oKTtcblxudmFyIEdsb2JhbFByZWZpeGVkUnVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEdsb2JhbFByZWZpeGVkUnVsZShrZXksIHN0eWxlLCBvcHRpb25zKSB7XG4gICAgdGhpcy50eXBlID0gJ2dsb2JhbCc7XG4gICAgdGhpcy5hdCA9IGF0O1xuICAgIHRoaXMuaXNQcm9jZXNzZWQgPSBmYWxzZTtcbiAgICB0aGlzLmtleSA9IGtleTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHZhciBzZWxlY3RvciA9IGtleS5zdWJzdHIoYXRQcmVmaXgubGVuZ3RoKTtcbiAgICB0aGlzLnJ1bGUgPSBvcHRpb25zLmpzcy5jcmVhdGVSdWxlKHNlbGVjdG9yLCBzdHlsZSwgX2V4dGVuZHMoe30sIG9wdGlvbnMsIHtcbiAgICAgIHBhcmVudDogdGhpc1xuICAgIH0pKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8yID0gR2xvYmFsUHJlZml4ZWRSdWxlLnByb3RvdHlwZTtcblxuICBfcHJvdG8yLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnJ1bGUgPyB0aGlzLnJ1bGUudG9TdHJpbmcob3B0aW9ucykgOiAnJztcbiAgfTtcblxuICByZXR1cm4gR2xvYmFsUHJlZml4ZWRSdWxlO1xufSgpO1xuXG52YXIgc2VwYXJhdG9yUmVnRXhwID0gL1xccyosXFxzKi9nO1xuXG5mdW5jdGlvbiBhZGRTY29wZShzZWxlY3Rvciwgc2NvcGUpIHtcbiAgdmFyIHBhcnRzID0gc2VsZWN0b3Iuc3BsaXQoc2VwYXJhdG9yUmVnRXhwKTtcbiAgdmFyIHNjb3BlZCA9ICcnO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICBzY29wZWQgKz0gc2NvcGUgKyBcIiBcIiArIHBhcnRzW2ldLnRyaW0oKTtcbiAgICBpZiAocGFydHNbaSArIDFdKSBzY29wZWQgKz0gJywgJztcbiAgfVxuXG4gIHJldHVybiBzY29wZWQ7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU5lc3RlZEdsb2JhbENvbnRhaW5lclJ1bGUocnVsZSwgc2hlZXQpIHtcbiAgdmFyIG9wdGlvbnMgPSBydWxlLm9wdGlvbnMsXG4gICAgICBzdHlsZSA9IHJ1bGUuc3R5bGU7XG4gIHZhciBydWxlcyA9IHN0eWxlID8gc3R5bGVbYXRdIDogbnVsbDtcbiAgaWYgKCFydWxlcykgcmV0dXJuO1xuXG4gIGZvciAodmFyIG5hbWUgaW4gcnVsZXMpIHtcbiAgICBzaGVldC5hZGRSdWxlKG5hbWUsIHJ1bGVzW25hbWVdLCBfZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgICAgc2VsZWN0b3I6IGFkZFNjb3BlKG5hbWUsIHJ1bGUuc2VsZWN0b3IpXG4gICAgfSkpO1xuICB9XG5cbiAgZGVsZXRlIHN0eWxlW2F0XTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlUHJlZml4ZWRHbG9iYWxSdWxlKHJ1bGUsIHNoZWV0KSB7XG4gIHZhciBvcHRpb25zID0gcnVsZS5vcHRpb25zLFxuICAgICAgc3R5bGUgPSBydWxlLnN0eWxlO1xuXG4gIGZvciAodmFyIHByb3AgaW4gc3R5bGUpIHtcbiAgICBpZiAocHJvcFswXSAhPT0gJ0AnIHx8IHByb3Auc3Vic3RyKDAsIGF0Lmxlbmd0aCkgIT09IGF0KSBjb250aW51ZTtcbiAgICB2YXIgc2VsZWN0b3IgPSBhZGRTY29wZShwcm9wLnN1YnN0cihhdC5sZW5ndGgpLCBydWxlLnNlbGVjdG9yKTtcbiAgICBzaGVldC5hZGRSdWxlKHNlbGVjdG9yLCBzdHlsZVtwcm9wXSwgX2V4dGVuZHMoe30sIG9wdGlvbnMsIHtcbiAgICAgIHNlbGVjdG9yOiBzZWxlY3RvclxuICAgIH0pKTtcbiAgICBkZWxldGUgc3R5bGVbcHJvcF07XG4gIH1cbn1cbi8qKlxuICogQ29udmVydCBuZXN0ZWQgcnVsZXMgdG8gc2VwYXJhdGUsIHJlbW92ZSB0aGVtIGZyb20gb3JpZ2luYWwgc3R5bGVzLlxuICovXG5cblxuZnVuY3Rpb24ganNzR2xvYmFsKCkge1xuICBmdW5jdGlvbiBvbkNyZWF0ZVJ1bGUobmFtZSwgc3R5bGVzLCBvcHRpb25zKSB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChuYW1lID09PSBhdCkge1xuICAgICAgcmV0dXJuIG5ldyBHbG9iYWxDb250YWluZXJSdWxlKG5hbWUsIHN0eWxlcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKG5hbWVbMF0gPT09ICdAJyAmJiBuYW1lLnN1YnN0cigwLCBhdFByZWZpeC5sZW5ndGgpID09PSBhdFByZWZpeCkge1xuICAgICAgcmV0dXJuIG5ldyBHbG9iYWxQcmVmaXhlZFJ1bGUobmFtZSwgc3R5bGVzLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICB2YXIgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG5cbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBpZiAocGFyZW50LnR5cGUgPT09ICdnbG9iYWwnIHx8IHBhcmVudC5vcHRpb25zLnBhcmVudCAmJiBwYXJlbnQub3B0aW9ucy5wYXJlbnQudHlwZSA9PT0gJ2dsb2JhbCcpIHtcbiAgICAgICAgb3B0aW9ucy5zY29wZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuc2VsZWN0b3IgJiYgb3B0aW9ucy5zY29wZWQgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnNlbGVjdG9yID0gbmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUHJvY2Vzc1J1bGUocnVsZSwgc2hlZXQpIHtcbiAgICBpZiAocnVsZS50eXBlICE9PSAnc3R5bGUnIHx8ICFzaGVldCkgcmV0dXJuO1xuICAgIGhhbmRsZU5lc3RlZEdsb2JhbENvbnRhaW5lclJ1bGUocnVsZSwgc2hlZXQpO1xuICAgIGhhbmRsZVByZWZpeGVkR2xvYmFsUnVsZShydWxlLCBzaGVldCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG9uQ3JlYXRlUnVsZTogb25DcmVhdGVSdWxlLFxuICAgIG9uUHJvY2Vzc1J1bGU6IG9uUHJvY2Vzc1J1bGVcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQganNzR2xvYmFsO1xuIiwiaW1wb3J0IF9leHRlbmRzIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMnO1xuaW1wb3J0IGlzSW5Ccm93c2VyIGZyb20gJ2lzLWluLWJyb3dzZXInO1xuaW1wb3J0IHdhcm5pbmcgZnJvbSAndGlueS13YXJuaW5nJztcbmltcG9ydCBfY3JlYXRlQ2xhc3MgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlQ2xhc3MnO1xuaW1wb3J0IF9pbmhlcml0c0xvb3NlIGZyb20gJ0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2luaGVyaXRzTG9vc2UnO1xuaW1wb3J0IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQgZnJvbSAnQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXNzZXJ0VGhpc0luaXRpYWxpemVkJztcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBmcm9tICdAYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlJztcblxudmFyIHBsYWluT2JqZWN0Q29uc3RydXJjdG9yID0ge30uY29uc3RydWN0b3I7XG5mdW5jdGlvbiBjbG9uZVN0eWxlKHN0eWxlKSB7XG4gIGlmIChzdHlsZSA9PSBudWxsIHx8IHR5cGVvZiBzdHlsZSAhPT0gJ29iamVjdCcpIHJldHVybiBzdHlsZTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUpKSByZXR1cm4gc3R5bGUubWFwKGNsb25lU3R5bGUpO1xuICBpZiAoc3R5bGUuY29uc3RydWN0b3IgIT09IHBsYWluT2JqZWN0Q29uc3RydXJjdG9yKSByZXR1cm4gc3R5bGU7XG4gIHZhciBuZXdTdHlsZSA9IHt9O1xuXG4gIGZvciAodmFyIG5hbWUgaW4gc3R5bGUpIHtcbiAgICBuZXdTdHlsZVtuYW1lXSA9IGNsb25lU3R5bGUoc3R5bGVbbmFtZV0pO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0eWxlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHJ1bGUgaW5zdGFuY2UuXG4gKi9cblxuZnVuY3Rpb24gY3JlYXRlUnVsZShuYW1lLCBkZWNsLCBvcHRpb25zKSB7XG4gIGlmIChuYW1lID09PSB2b2lkIDApIHtcbiAgICBuYW1lID0gJ3VubmFtZWQnO1xuICB9XG5cbiAgdmFyIGpzcyA9IG9wdGlvbnMuanNzO1xuICB2YXIgZGVjbENvcHkgPSBjbG9uZVN0eWxlKGRlY2wpO1xuICB2YXIgcnVsZSA9IGpzcy5wbHVnaW5zLm9uQ3JlYXRlUnVsZShuYW1lLCBkZWNsQ29weSwgb3B0aW9ucyk7XG4gIGlmIChydWxlKSByZXR1cm4gcnVsZTsgLy8gSXQgaXMgYW4gYXQtcnVsZSBhbmQgaXQgaGFzIG5vIGluc3RhbmNlLlxuXG4gIGlmIChuYW1lWzBdID09PSAnQCcpIHtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCBcIltKU1NdIFVua25vd24gcnVsZSBcIiArIG5hbWUpIDogdm9pZCAwO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbnZhciBqb2luID0gZnVuY3Rpb24gam9pbih2YWx1ZSwgYnkpIHtcbiAgdmFyIHJlc3VsdCA9ICcnO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBSZW1vdmUgIWltcG9ydGFudCBmcm9tIHRoZSB2YWx1ZSwgaXQgd2lsbCBiZSByZWFkZGVkIGxhdGVyLlxuICAgIGlmICh2YWx1ZVtpXSA9PT0gJyFpbXBvcnRhbnQnKSBicmVhaztcbiAgICBpZiAocmVzdWx0KSByZXN1bHQgKz0gYnk7XG4gICAgcmVzdWx0ICs9IHZhbHVlW2ldO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4vKipcbiAqIENvbnZlcnRzIEpTUyBhcnJheSB2YWx1ZSB0byBhIENTUyBzdHJpbmcuXG4gKlxuICogYG1hcmdpbjogW1snNXB4JywgJzEwcHgnXV1gID4gYG1hcmdpbjogNXB4IDEwcHg7YFxuICogYGJvcmRlcjogWycxcHgnLCAnMnB4J11gID4gYGJvcmRlcjogMXB4LCAycHg7YFxuICogYG1hcmdpbjogW1snNXB4JywgJzEwcHgnXSwgJyFpbXBvcnRhbnQnXWAgPiBgbWFyZ2luOiA1cHggMTBweCAhaW1wb3J0YW50O2BcbiAqIGBjb2xvcjogWydyZWQnLCAhaW1wb3J0YW50XWAgPiBgY29sb3I6IHJlZCAhaW1wb3J0YW50O2BcbiAqL1xuXG5cbnZhciB0b0Nzc1ZhbHVlID0gZnVuY3Rpb24gdG9Dc3NWYWx1ZSh2YWx1ZSkge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIHZhciBjc3NWYWx1ZSA9ICcnOyAvLyBTdXBwb3J0IHNwYWNlIHNlcGFyYXRlZCB2YWx1ZXMgdmlhIGBbWyc1cHgnLCAnMTBweCddXWAuXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVbMF0pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlW2ldID09PSAnIWltcG9ydGFudCcpIGJyZWFrO1xuICAgICAgaWYgKGNzc1ZhbHVlKSBjc3NWYWx1ZSArPSAnLCAnO1xuICAgICAgY3NzVmFsdWUgKz0gam9pbih2YWx1ZVtpXSwgJyAnKTtcbiAgICB9XG4gIH0gZWxzZSBjc3NWYWx1ZSA9IGpvaW4odmFsdWUsICcsICcpOyAvLyBBZGQgIWltcG9ydGFudCwgYmVjYXVzZSBpdCB3YXMgaWdub3JlZC5cblxuXG4gIGlmICh2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSA9PT0gJyFpbXBvcnRhbnQnKSB7XG4gICAgY3NzVmFsdWUgKz0gJyAhaW1wb3J0YW50JztcbiAgfVxuXG4gIHJldHVybiBjc3NWYWx1ZTtcbn07XG5cbmZ1bmN0aW9uIGdldFdoaXRlc3BhY2VTeW1ib2xzKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5mb3JtYXQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmVicmVhazogJycsXG4gICAgICBzcGFjZTogJydcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBsaW5lYnJlYWs6ICdcXG4nLFxuICAgIHNwYWNlOiAnICdcbiAgfTtcbn1cblxuLyoqXG4gKiBJbmRlbnQgYSBzdHJpbmcuXG4gKiBodHRwOi8vanNwZXJmLmNvbS9hcnJheS1qb2luLXZzLWZvclxuICovXG5cbmZ1bmN0aW9uIGluZGVudFN0cihzdHIsIGluZGVudCkge1xuICB2YXIgcmVzdWx0ID0gJyc7XG5cbiAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGluZGVudDsgaW5kZXgrKykge1xuICAgIHJlc3VsdCArPSAnICAnO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCArIHN0cjtcbn1cbi8qKlxuICogQ29udmVydHMgYSBSdWxlIHRvIENTUyBzdHJpbmcuXG4gKi9cblxuXG5mdW5jdGlvbiB0b0NzcyhzZWxlY3Rvciwgc3R5bGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgaWYgKCFzdHlsZSkgcmV0dXJuIHJlc3VsdDtcbiAgdmFyIF9vcHRpb25zID0gb3B0aW9ucyxcbiAgICAgIF9vcHRpb25zJGluZGVudCA9IF9vcHRpb25zLmluZGVudCxcbiAgICAgIGluZGVudCA9IF9vcHRpb25zJGluZGVudCA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJGluZGVudDtcbiAgdmFyIGZhbGxiYWNrcyA9IHN0eWxlLmZhbGxiYWNrcztcblxuICBpZiAob3B0aW9ucy5mb3JtYXQgPT09IGZhbHNlKSB7XG4gICAgaW5kZW50ID0gLUluZmluaXR5O1xuICB9XG5cbiAgdmFyIF9nZXRXaGl0ZXNwYWNlU3ltYm9scyA9IGdldFdoaXRlc3BhY2VTeW1ib2xzKG9wdGlvbnMpLFxuICAgICAgbGluZWJyZWFrID0gX2dldFdoaXRlc3BhY2VTeW1ib2xzLmxpbmVicmVhayxcbiAgICAgIHNwYWNlID0gX2dldFdoaXRlc3BhY2VTeW1ib2xzLnNwYWNlO1xuXG4gIGlmIChzZWxlY3RvcikgaW5kZW50Kys7IC8vIEFwcGx5IGZhbGxiYWNrcyBmaXJzdC5cblxuICBpZiAoZmFsbGJhY2tzKSB7XG4gICAgLy8gQXJyYXkgc3ludGF4IHtmYWxsYmFja3M6IFt7cHJvcDogdmFsdWV9XX1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShmYWxsYmFja3MpKSB7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgZmFsbGJhY2tzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB2YXIgZmFsbGJhY2sgPSBmYWxsYmFja3NbaW5kZXhdO1xuXG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gZmFsbGJhY2spIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBmYWxsYmFja1twcm9wXTtcblxuICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0KSByZXN1bHQgKz0gbGluZWJyZWFrO1xuICAgICAgICAgICAgcmVzdWx0ICs9IGluZGVudFN0cihwcm9wICsgXCI6XCIgKyBzcGFjZSArIHRvQ3NzVmFsdWUodmFsdWUpICsgXCI7XCIsIGluZGVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE9iamVjdCBzeW50YXgge2ZhbGxiYWNrczoge3Byb3A6IHZhbHVlfX1cbiAgICAgIGZvciAodmFyIF9wcm9wIGluIGZhbGxiYWNrcykge1xuICAgICAgICB2YXIgX3ZhbHVlID0gZmFsbGJhY2tzW19wcm9wXTtcblxuICAgICAgICBpZiAoX3ZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBpZiAocmVzdWx0KSByZXN1bHQgKz0gbGluZWJyZWFrO1xuICAgICAgICAgIHJlc3VsdCArPSBpbmRlbnRTdHIoX3Byb3AgKyBcIjpcIiArIHNwYWNlICsgdG9Dc3NWYWx1ZShfdmFsdWUpICsgXCI7XCIsIGluZGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBfcHJvcDIgaW4gc3R5bGUpIHtcbiAgICB2YXIgX3ZhbHVlMiA9IHN0eWxlW19wcm9wMl07XG5cbiAgICBpZiAoX3ZhbHVlMiAhPSBudWxsICYmIF9wcm9wMiAhPT0gJ2ZhbGxiYWNrcycpIHtcbiAgICAgIGlmIChyZXN1bHQpIHJlc3VsdCArPSBsaW5lYnJlYWs7XG4gICAgICByZXN1bHQgKz0gaW5kZW50U3RyKF9wcm9wMiArIFwiOlwiICsgc3BhY2UgKyB0b0Nzc1ZhbHVlKF92YWx1ZTIpICsgXCI7XCIsIGluZGVudCk7XG4gICAgfVxuICB9IC8vIEFsbG93IGVtcHR5IHN0eWxlIGluIHRoaXMgY2FzZSwgYmVjYXVzZSBwcm9wZXJ0aWVzIHdpbGwgYmUgYWRkZWQgZHluYW1pY2FsbHkuXG5cblxuICBpZiAoIXJlc3VsdCAmJiAhb3B0aW9ucy5hbGxvd0VtcHR5KSByZXR1cm4gcmVzdWx0OyAvLyBXaGVuIHJ1bGUgaXMgYmVpbmcgc3RyaW5naWZpZWQgYmVmb3JlIHNlbGVjdG9yIHdhcyBkZWZpbmVkLlxuXG4gIGlmICghc2VsZWN0b3IpIHJldHVybiByZXN1bHQ7XG4gIGluZGVudC0tO1xuICBpZiAocmVzdWx0KSByZXN1bHQgPSBcIlwiICsgbGluZWJyZWFrICsgcmVzdWx0ICsgbGluZWJyZWFrO1xuICByZXR1cm4gaW5kZW50U3RyKFwiXCIgKyBzZWxlY3RvciArIHNwYWNlICsgXCJ7XCIgKyByZXN1bHQsIGluZGVudCkgKyBpbmRlbnRTdHIoJ30nLCBpbmRlbnQpO1xufVxuXG52YXIgZXNjYXBlUmVnZXggPSAvKFtbXFxdLiMqJD48K349fF46KCksXCInYFxcc10pL2c7XG52YXIgbmF0aXZlRXNjYXBlID0gdHlwZW9mIENTUyAhPT0gJ3VuZGVmaW5lZCcgJiYgQ1NTLmVzY2FwZTtcbnZhciBlc2NhcGUgPSAoZnVuY3Rpb24gKHN0cikge1xuICByZXR1cm4gbmF0aXZlRXNjYXBlID8gbmF0aXZlRXNjYXBlKHN0cikgOiBzdHIucmVwbGFjZShlc2NhcGVSZWdleCwgJ1xcXFwkMScpO1xufSk7XG5cbnZhciBCYXNlU3R5bGVSdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQmFzZVN0eWxlUnVsZShrZXksIHN0eWxlLCBvcHRpb25zKSB7XG4gICAgdGhpcy50eXBlID0gJ3N0eWxlJztcbiAgICB0aGlzLmlzUHJvY2Vzc2VkID0gZmFsc2U7XG4gICAgdmFyIHNoZWV0ID0gb3B0aW9ucy5zaGVldCxcbiAgICAgICAgUmVuZGVyZXIgPSBvcHRpb25zLlJlbmRlcmVyO1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5zdHlsZSA9IHN0eWxlO1xuICAgIGlmIChzaGVldCkgdGhpcy5yZW5kZXJlciA9IHNoZWV0LnJlbmRlcmVyO2Vsc2UgaWYgKFJlbmRlcmVyKSB0aGlzLnJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKCk7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgYSBzdHlsZSBwcm9wZXJ0eS5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gQmFzZVN0eWxlUnVsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnByb3AgPSBmdW5jdGlvbiBwcm9wKG5hbWUsIHZhbHVlLCBvcHRpb25zKSB7XG4gICAgLy8gSXQncyBhIGdldHRlci5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuc3R5bGVbbmFtZV07IC8vIERvbid0IGRvIGFueXRoaW5nIGlmIHRoZSB2YWx1ZSBoYXMgbm90IGNoYW5nZWQuXG5cbiAgICB2YXIgZm9yY2UgPSBvcHRpb25zID8gb3B0aW9ucy5mb3JjZSA6IGZhbHNlO1xuICAgIGlmICghZm9yY2UgJiYgdGhpcy5zdHlsZVtuYW1lXSA9PT0gdmFsdWUpIHJldHVybiB0aGlzO1xuICAgIHZhciBuZXdWYWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMucHJvY2VzcyAhPT0gZmFsc2UpIHtcbiAgICAgIG5ld1ZhbHVlID0gdGhpcy5vcHRpb25zLmpzcy5wbHVnaW5zLm9uQ2hhbmdlVmFsdWUodmFsdWUsIG5hbWUsIHRoaXMpO1xuICAgIH1cblxuICAgIHZhciBpc0VtcHR5ID0gbmV3VmFsdWUgPT0gbnVsbCB8fCBuZXdWYWx1ZSA9PT0gZmFsc2U7XG4gICAgdmFyIGlzRGVmaW5lZCA9IG5hbWUgaW4gdGhpcy5zdHlsZTsgLy8gVmFsdWUgaXMgZW1wdHkgYW5kIHdhc24ndCBkZWZpbmVkIGJlZm9yZS5cblxuICAgIGlmIChpc0VtcHR5ICYmICFpc0RlZmluZWQgJiYgIWZvcmNlKSByZXR1cm4gdGhpczsgLy8gV2UgYXJlIGdvaW5nIHRvIHJlbW92ZSB0aGlzIHZhbHVlLlxuXG4gICAgdmFyIHJlbW92ZSA9IGlzRW1wdHkgJiYgaXNEZWZpbmVkO1xuICAgIGlmIChyZW1vdmUpIGRlbGV0ZSB0aGlzLnN0eWxlW25hbWVdO2Vsc2UgdGhpcy5zdHlsZVtuYW1lXSA9IG5ld1ZhbHVlOyAvLyBSZW5kZXJhYmxlIGlzIGRlZmluZWQgaWYgU3R5bGVTaGVldCBvcHRpb24gYGxpbmtgIGlzIHRydWUuXG5cbiAgICBpZiAodGhpcy5yZW5kZXJhYmxlICYmIHRoaXMucmVuZGVyZXIpIHtcbiAgICAgIGlmIChyZW1vdmUpIHRoaXMucmVuZGVyZXIucmVtb3ZlUHJvcGVydHkodGhpcy5yZW5kZXJhYmxlLCBuYW1lKTtlbHNlIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5yZW5kZXJhYmxlLCBuYW1lLCBuZXdWYWx1ZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB2YXIgc2hlZXQgPSB0aGlzLm9wdGlvbnMuc2hlZXQ7XG5cbiAgICBpZiAoc2hlZXQgJiYgc2hlZXQuYXR0YWNoZWQpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsICdbSlNTXSBSdWxlIGlzIG5vdCBsaW5rZWQuIE1pc3Npbmcgc2hlZXQgb3B0aW9uIFwibGluazogdHJ1ZVwiLicpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHJldHVybiBCYXNlU3R5bGVSdWxlO1xufSgpO1xudmFyIFN0eWxlUnVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0Jhc2VTdHlsZVJ1bGUpIHtcbiAgX2luaGVyaXRzTG9vc2UoU3R5bGVSdWxlLCBfQmFzZVN0eWxlUnVsZSk7XG5cbiAgZnVuY3Rpb24gU3R5bGVSdWxlKGtleSwgc3R5bGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfdGhpcyA9IF9CYXNlU3R5bGVSdWxlLmNhbGwodGhpcywga2V5LCBzdHlsZSwgb3B0aW9ucykgfHwgdGhpcztcbiAgICB2YXIgc2VsZWN0b3IgPSBvcHRpb25zLnNlbGVjdG9yLFxuICAgICAgICBzY29wZWQgPSBvcHRpb25zLnNjb3BlZCxcbiAgICAgICAgc2hlZXQgPSBvcHRpb25zLnNoZWV0LFxuICAgICAgICBnZW5lcmF0ZUlkID0gb3B0aW9ucy5nZW5lcmF0ZUlkO1xuXG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICBfdGhpcy5zZWxlY3RvclRleHQgPSBzZWxlY3RvcjtcbiAgICB9IGVsc2UgaWYgKHNjb3BlZCAhPT0gZmFsc2UpIHtcbiAgICAgIF90aGlzLmlkID0gZ2VuZXJhdGVJZChfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSwgc2hlZXQpO1xuICAgICAgX3RoaXMuc2VsZWN0b3JUZXh0ID0gXCIuXCIgKyBlc2NhcGUoX3RoaXMuaWQpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogU2V0IHNlbGVjdG9yIHN0cmluZy5cbiAgICogQXR0ZW50aW9uOiB1c2UgdGhpcyB3aXRoIGNhdXRpb24uIE1vc3QgYnJvd3NlcnMgZGlkbid0IGltcGxlbWVudFxuICAgKiBzZWxlY3RvclRleHQgc2V0dGVyLCBzbyB0aGlzIG1heSByZXN1bHQgaW4gcmVyZW5kZXJpbmcgb2YgZW50aXJlIFN0eWxlIFNoZWV0LlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8yID0gU3R5bGVSdWxlLnByb3RvdHlwZTtcblxuICAvKipcbiAgICogQXBwbHkgcnVsZSB0byBhbiBlbGVtZW50IGlubGluZS5cbiAgICovXG4gIF9wcm90bzIuYXBwbHlUbyA9IGZ1bmN0aW9uIGFwcGx5VG8ocmVuZGVyYWJsZSkge1xuICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XG5cbiAgICBpZiAocmVuZGVyZXIpIHtcbiAgICAgIHZhciBqc29uID0gdGhpcy50b0pTT04oKTtcblxuICAgICAgZm9yICh2YXIgcHJvcCBpbiBqc29uKSB7XG4gICAgICAgIHJlbmRlcmVyLnNldFByb3BlcnR5KHJlbmRlcmFibGUsIHByb3AsIGpzb25bcHJvcF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIHJ1bGUuXG4gICAqIEZhbGxiYWNrcyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICogVXNlZnVsIGZvciBpbmxpbmUgc3R5bGVzLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90bzIudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIHZhciBqc29uID0ge307XG5cbiAgICBmb3IgKHZhciBwcm9wIGluIHRoaXMuc3R5bGUpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuc3R5bGVbcHJvcF07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykganNvbltwcm9wXSA9IHZhbHVlO2Vsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSBqc29uW3Byb3BdID0gdG9Dc3NWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpzb247XG4gIH1cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIENTUyBzdHJpbmcuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvMi50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICB2YXIgc2hlZXQgPSB0aGlzLm9wdGlvbnMuc2hlZXQ7XG4gICAgdmFyIGxpbmsgPSBzaGVldCA/IHNoZWV0Lm9wdGlvbnMubGluayA6IGZhbHNlO1xuICAgIHZhciBvcHRzID0gbGluayA/IF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgICBhbGxvd0VtcHR5OiB0cnVlXG4gICAgfSkgOiBvcHRpb25zO1xuICAgIHJldHVybiB0b0Nzcyh0aGlzLnNlbGVjdG9yVGV4dCwgdGhpcy5zdHlsZSwgb3B0cyk7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKFN0eWxlUnVsZSwgW3tcbiAgICBrZXk6IFwic2VsZWN0b3JcIixcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChzZWxlY3Rvcikge1xuICAgICAgaWYgKHNlbGVjdG9yID09PSB0aGlzLnNlbGVjdG9yVGV4dCkgcmV0dXJuO1xuICAgICAgdGhpcy5zZWxlY3RvclRleHQgPSBzZWxlY3RvcjtcbiAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXIsXG4gICAgICAgICAgcmVuZGVyYWJsZSA9IHRoaXMucmVuZGVyYWJsZTtcbiAgICAgIGlmICghcmVuZGVyYWJsZSB8fCAhcmVuZGVyZXIpIHJldHVybjtcbiAgICAgIHZhciBoYXNDaGFuZ2VkID0gcmVuZGVyZXIuc2V0U2VsZWN0b3IocmVuZGVyYWJsZSwgc2VsZWN0b3IpOyAvLyBJZiBzZWxlY3RvciBzZXR0ZXIgaXMgbm90IGltcGxlbWVudGVkLCByZXJlbmRlciB0aGUgcnVsZS5cblxuICAgICAgaWYgKCFoYXNDaGFuZ2VkKSB7XG4gICAgICAgIHJlbmRlcmVyLnJlcGxhY2VSdWxlKHJlbmRlcmFibGUsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgc2VsZWN0b3Igc3RyaW5nLlxuICAgICAqL1xuICAgICxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdG9yVGV4dDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU3R5bGVSdWxlO1xufShCYXNlU3R5bGVSdWxlKTtcbnZhciBwbHVnaW5TdHlsZVJ1bGUgPSB7XG4gIG9uQ3JlYXRlUnVsZTogZnVuY3Rpb24gb25DcmVhdGVSdWxlKGtleSwgc3R5bGUsIG9wdGlvbnMpIHtcbiAgICBpZiAoa2V5WzBdID09PSAnQCcgfHwgb3B0aW9ucy5wYXJlbnQgJiYgb3B0aW9ucy5wYXJlbnQudHlwZSA9PT0gJ2tleWZyYW1lcycpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU3R5bGVSdWxlKGtleSwgc3R5bGUsIG9wdGlvbnMpO1xuICB9XG59O1xuXG52YXIgZGVmYXVsdFRvU3RyaW5nT3B0aW9ucyA9IHtcbiAgaW5kZW50OiAxLFxuICBjaGlsZHJlbjogdHJ1ZVxufTtcbnZhciBhdFJlZ0V4cCA9IC9AKFtcXHctXSspLztcbi8qKlxuICogQ29uZGl0aW9uYWwgcnVsZSBmb3IgQG1lZGlhLCBAc3VwcG9ydHNcbiAqL1xuXG52YXIgQ29uZGl0aW9uYWxSdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ29uZGl0aW9uYWxSdWxlKGtleSwgc3R5bGVzLCBvcHRpb25zKSB7XG4gICAgdGhpcy50eXBlID0gJ2NvbmRpdGlvbmFsJztcbiAgICB0aGlzLmlzUHJvY2Vzc2VkID0gZmFsc2U7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgdmFyIGF0TWF0Y2ggPSBrZXkubWF0Y2goYXRSZWdFeHApO1xuICAgIHRoaXMuYXQgPSBhdE1hdGNoID8gYXRNYXRjaFsxXSA6ICd1bmtub3duJzsgLy8gS2V5IG1pZ2h0IGNvbnRhaW4gYSB1bmlxdWUgc3VmZml4IGluIGNhc2UgdGhlIGBuYW1lYCBwYXNzZWQgYnkgdXNlciB3YXMgZHVwbGljYXRlLlxuXG4gICAgdGhpcy5xdWVyeSA9IG9wdGlvbnMubmFtZSB8fCBcIkBcIiArIHRoaXMuYXQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnJ1bGVzID0gbmV3IFJ1bGVMaXN0KF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgICBwYXJlbnQ6IHRoaXNcbiAgICB9KSk7XG5cbiAgICBmb3IgKHZhciBuYW1lIGluIHN0eWxlcykge1xuICAgICAgdGhpcy5ydWxlcy5hZGQobmFtZSwgc3R5bGVzW25hbWVdKTtcbiAgICB9XG5cbiAgICB0aGlzLnJ1bGVzLnByb2Nlc3MoKTtcbiAgfVxuICAvKipcbiAgICogR2V0IGEgcnVsZS5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gQ29uZGl0aW9uYWxSdWxlLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZ2V0UnVsZSA9IGZ1bmN0aW9uIGdldFJ1bGUobmFtZSkge1xuICAgIHJldHVybiB0aGlzLnJ1bGVzLmdldChuYW1lKTtcbiAgfVxuICAvKipcbiAgICogR2V0IGluZGV4IG9mIGEgcnVsZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YocnVsZSkge1xuICAgIHJldHVybiB0aGlzLnJ1bGVzLmluZGV4T2YocnVsZSk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgcnVsZSwgcnVuIHBsdWdpbnMuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmFkZFJ1bGUgPSBmdW5jdGlvbiBhZGRSdWxlKG5hbWUsIHN0eWxlLCBvcHRpb25zKSB7XG4gICAgdmFyIHJ1bGUgPSB0aGlzLnJ1bGVzLmFkZChuYW1lLCBzdHlsZSwgb3B0aW9ucyk7XG4gICAgaWYgKCFydWxlKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLm9wdGlvbnMuanNzLnBsdWdpbnMub25Qcm9jZXNzUnVsZShydWxlKTtcbiAgICByZXR1cm4gcnVsZTtcbiAgfVxuICAvKipcbiAgICogUmVwbGFjZSBydWxlLCBydW4gcGx1Z2lucy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucmVwbGFjZVJ1bGUgPSBmdW5jdGlvbiByZXBsYWNlUnVsZShuYW1lLCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHZhciBuZXdSdWxlID0gdGhpcy5ydWxlcy5yZXBsYWNlKG5hbWUsIHN0eWxlLCBvcHRpb25zKTtcbiAgICBpZiAobmV3UnVsZSkgdGhpcy5vcHRpb25zLmpzcy5wbHVnaW5zLm9uUHJvY2Vzc1J1bGUobmV3UnVsZSk7XG4gICAgcmV0dXJuIG5ld1J1bGU7XG4gIH1cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIENTUyBzdHJpbmcuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0VG9TdHJpbmdPcHRpb25zO1xuICAgIH1cblxuICAgIHZhciBfZ2V0V2hpdGVzcGFjZVN5bWJvbHMgPSBnZXRXaGl0ZXNwYWNlU3ltYm9scyhvcHRpb25zKSxcbiAgICAgICAgbGluZWJyZWFrID0gX2dldFdoaXRlc3BhY2VTeW1ib2xzLmxpbmVicmVhaztcblxuICAgIGlmIChvcHRpb25zLmluZGVudCA9PSBudWxsKSBvcHRpb25zLmluZGVudCA9IGRlZmF1bHRUb1N0cmluZ09wdGlvbnMuaW5kZW50O1xuICAgIGlmIChvcHRpb25zLmNoaWxkcmVuID09IG51bGwpIG9wdGlvbnMuY2hpbGRyZW4gPSBkZWZhdWx0VG9TdHJpbmdPcHRpb25zLmNoaWxkcmVuO1xuXG4gICAgaWYgKG9wdGlvbnMuY2hpbGRyZW4gPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWVyeSArIFwiIHt9XCI7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5ydWxlcy50b1N0cmluZyhvcHRpb25zKTtcbiAgICByZXR1cm4gY2hpbGRyZW4gPyB0aGlzLnF1ZXJ5ICsgXCIge1wiICsgbGluZWJyZWFrICsgY2hpbGRyZW4gKyBsaW5lYnJlYWsgKyBcIn1cIiA6ICcnO1xuICB9O1xuXG4gIHJldHVybiBDb25kaXRpb25hbFJ1bGU7XG59KCk7XG52YXIga2V5UmVnRXhwID0gL0Bjb250YWluZXJ8QG1lZGlhfEBzdXBwb3J0c1xccysvO1xudmFyIHBsdWdpbkNvbmRpdGlvbmFsUnVsZSA9IHtcbiAgb25DcmVhdGVSdWxlOiBmdW5jdGlvbiBvbkNyZWF0ZVJ1bGUoa2V5LCBzdHlsZXMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4ga2V5UmVnRXhwLnRlc3Qoa2V5KSA/IG5ldyBDb25kaXRpb25hbFJ1bGUoa2V5LCBzdHlsZXMsIG9wdGlvbnMpIDogbnVsbDtcbiAgfVxufTtcblxudmFyIGRlZmF1bHRUb1N0cmluZ09wdGlvbnMkMSA9IHtcbiAgaW5kZW50OiAxLFxuICBjaGlsZHJlbjogdHJ1ZVxufTtcbnZhciBuYW1lUmVnRXhwID0gL0BrZXlmcmFtZXNcXHMrKFtcXHctXSspLztcbi8qKlxuICogUnVsZSBmb3IgQGtleWZyYW1lc1xuICovXG5cbnZhciBLZXlmcmFtZXNSdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gS2V5ZnJhbWVzUnVsZShrZXksIGZyYW1lcywgb3B0aW9ucykge1xuICAgIHRoaXMudHlwZSA9ICdrZXlmcmFtZXMnO1xuICAgIHRoaXMuYXQgPSAnQGtleWZyYW1lcyc7XG4gICAgdGhpcy5pc1Byb2Nlc3NlZCA9IGZhbHNlO1xuICAgIHZhciBuYW1lTWF0Y2ggPSBrZXkubWF0Y2gobmFtZVJlZ0V4cCk7XG5cbiAgICBpZiAobmFtZU1hdGNoICYmIG5hbWVNYXRjaFsxXSkge1xuICAgICAgdGhpcy5uYW1lID0gbmFtZU1hdGNoWzFdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hbWUgPSAnbm9uYW1lJztcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsIFwiW0pTU10gQmFkIGtleWZyYW1lcyBuYW1lIFwiICsga2V5KSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICB0aGlzLmtleSA9IHRoaXMudHlwZSArIFwiLVwiICsgdGhpcy5uYW1lO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdmFyIHNjb3BlZCA9IG9wdGlvbnMuc2NvcGVkLFxuICAgICAgICBzaGVldCA9IG9wdGlvbnMuc2hlZXQsXG4gICAgICAgIGdlbmVyYXRlSWQgPSBvcHRpb25zLmdlbmVyYXRlSWQ7XG4gICAgdGhpcy5pZCA9IHNjb3BlZCA9PT0gZmFsc2UgPyB0aGlzLm5hbWUgOiBlc2NhcGUoZ2VuZXJhdGVJZCh0aGlzLCBzaGVldCkpO1xuICAgIHRoaXMucnVsZXMgPSBuZXcgUnVsZUxpc3QoX2V4dGVuZHMoe30sIG9wdGlvbnMsIHtcbiAgICAgIHBhcmVudDogdGhpc1xuICAgIH0pKTtcblxuICAgIGZvciAodmFyIG5hbWUgaW4gZnJhbWVzKSB7XG4gICAgICB0aGlzLnJ1bGVzLmFkZChuYW1lLCBmcmFtZXNbbmFtZV0sIF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgICAgIHBhcmVudDogdGhpc1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHRoaXMucnVsZXMucHJvY2VzcygpO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBDU1Mgc3RyaW5nLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBLZXlmcmFtZXNSdWxlLnByb3RvdHlwZTtcblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IGRlZmF1bHRUb1N0cmluZ09wdGlvbnMkMTtcbiAgICB9XG5cbiAgICB2YXIgX2dldFdoaXRlc3BhY2VTeW1ib2xzID0gZ2V0V2hpdGVzcGFjZVN5bWJvbHMob3B0aW9ucyksXG4gICAgICAgIGxpbmVicmVhayA9IF9nZXRXaGl0ZXNwYWNlU3ltYm9scy5saW5lYnJlYWs7XG5cbiAgICBpZiAob3B0aW9ucy5pbmRlbnQgPT0gbnVsbCkgb3B0aW9ucy5pbmRlbnQgPSBkZWZhdWx0VG9TdHJpbmdPcHRpb25zJDEuaW5kZW50O1xuICAgIGlmIChvcHRpb25zLmNoaWxkcmVuID09IG51bGwpIG9wdGlvbnMuY2hpbGRyZW4gPSBkZWZhdWx0VG9TdHJpbmdPcHRpb25zJDEuY2hpbGRyZW47XG5cbiAgICBpZiAob3B0aW9ucy5jaGlsZHJlbiA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0ICsgXCIgXCIgKyB0aGlzLmlkICsgXCIge31cIjtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnJ1bGVzLnRvU3RyaW5nKG9wdGlvbnMpO1xuICAgIGlmIChjaGlsZHJlbikgY2hpbGRyZW4gPSBcIlwiICsgbGluZWJyZWFrICsgY2hpbGRyZW4gKyBsaW5lYnJlYWs7XG4gICAgcmV0dXJuIHRoaXMuYXQgKyBcIiBcIiArIHRoaXMuaWQgKyBcIiB7XCIgKyBjaGlsZHJlbiArIFwifVwiO1xuICB9O1xuXG4gIHJldHVybiBLZXlmcmFtZXNSdWxlO1xufSgpO1xudmFyIGtleVJlZ0V4cCQxID0gL0BrZXlmcmFtZXNcXHMrLztcbnZhciByZWZSZWdFeHAgPSAvXFwkKFtcXHctXSspL2c7XG5cbnZhciBmaW5kUmVmZXJlbmNlZEtleWZyYW1lID0gZnVuY3Rpb24gZmluZFJlZmVyZW5jZWRLZXlmcmFtZSh2YWwsIGtleWZyYW1lcykge1xuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsLnJlcGxhY2UocmVmUmVnRXhwLCBmdW5jdGlvbiAobWF0Y2gsIG5hbWUpIHtcbiAgICAgIGlmIChuYW1lIGluIGtleWZyYW1lcykge1xuICAgICAgICByZXR1cm4ga2V5ZnJhbWVzW25hbWVdO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCBcIltKU1NdIFJlZmVyZW5jZWQga2V5ZnJhbWVzIHJ1bGUgXFxcIlwiICsgbmFtZSArIFwiXFxcIiBpcyBub3QgZGVmaW5lZC5cIikgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gbWF0Y2g7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdmFsO1xufTtcbi8qKlxuICogUmVwbGFjZSB0aGUgcmVmZXJlbmNlIGZvciBhIGFuaW1hdGlvbiBuYW1lLlxuICovXG5cblxudmFyIHJlcGxhY2VSZWYgPSBmdW5jdGlvbiByZXBsYWNlUmVmKHN0eWxlLCBwcm9wLCBrZXlmcmFtZXMpIHtcbiAgdmFyIHZhbHVlID0gc3R5bGVbcHJvcF07XG4gIHZhciByZWZLZXlmcmFtZSA9IGZpbmRSZWZlcmVuY2VkS2V5ZnJhbWUodmFsdWUsIGtleWZyYW1lcyk7XG5cbiAgaWYgKHJlZktleWZyYW1lICE9PSB2YWx1ZSkge1xuICAgIHN0eWxlW3Byb3BdID0gcmVmS2V5ZnJhbWU7XG4gIH1cbn07XG5cbnZhciBwbHVnaW5LZXlmcmFtZXNSdWxlID0ge1xuICBvbkNyZWF0ZVJ1bGU6IGZ1bmN0aW9uIG9uQ3JlYXRlUnVsZShrZXksIGZyYW1lcywgb3B0aW9ucykge1xuICAgIHJldHVybiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXlSZWdFeHAkMS50ZXN0KGtleSkgPyBuZXcgS2V5ZnJhbWVzUnVsZShrZXksIGZyYW1lcywgb3B0aW9ucykgOiBudWxsO1xuICB9LFxuICAvLyBBbmltYXRpb24gbmFtZSByZWYgcmVwbGFjZXIuXG4gIG9uUHJvY2Vzc1N0eWxlOiBmdW5jdGlvbiBvblByb2Nlc3NTdHlsZShzdHlsZSwgcnVsZSwgc2hlZXQpIHtcbiAgICBpZiAocnVsZS50eXBlICE9PSAnc3R5bGUnIHx8ICFzaGVldCkgcmV0dXJuIHN0eWxlO1xuICAgIGlmICgnYW5pbWF0aW9uLW5hbWUnIGluIHN0eWxlKSByZXBsYWNlUmVmKHN0eWxlLCAnYW5pbWF0aW9uLW5hbWUnLCBzaGVldC5rZXlmcmFtZXMpO1xuICAgIGlmICgnYW5pbWF0aW9uJyBpbiBzdHlsZSkgcmVwbGFjZVJlZihzdHlsZSwgJ2FuaW1hdGlvbicsIHNoZWV0LmtleWZyYW1lcyk7XG4gICAgcmV0dXJuIHN0eWxlO1xuICB9LFxuICBvbkNoYW5nZVZhbHVlOiBmdW5jdGlvbiBvbkNoYW5nZVZhbHVlKHZhbCwgcHJvcCwgcnVsZSkge1xuICAgIHZhciBzaGVldCA9IHJ1bGUub3B0aW9ucy5zaGVldDtcblxuICAgIGlmICghc2hlZXQpIHtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfVxuXG4gICAgc3dpdGNoIChwcm9wKSB7XG4gICAgICBjYXNlICdhbmltYXRpb24nOlxuICAgICAgICByZXR1cm4gZmluZFJlZmVyZW5jZWRLZXlmcmFtZSh2YWwsIHNoZWV0LmtleWZyYW1lcyk7XG5cbiAgICAgIGNhc2UgJ2FuaW1hdGlvbi1uYW1lJzpcbiAgICAgICAgcmV0dXJuIGZpbmRSZWZlcmVuY2VkS2V5ZnJhbWUodmFsLCBzaGVldC5rZXlmcmFtZXMpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgfVxufTtcblxudmFyIEtleWZyYW1lUnVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0Jhc2VTdHlsZVJ1bGUpIHtcbiAgX2luaGVyaXRzTG9vc2UoS2V5ZnJhbWVSdWxlLCBfQmFzZVN0eWxlUnVsZSk7XG5cbiAgZnVuY3Rpb24gS2V5ZnJhbWVSdWxlKCkge1xuICAgIHJldHVybiBfQmFzZVN0eWxlUnVsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gS2V5ZnJhbWVSdWxlLnByb3RvdHlwZTtcblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgQ1NTIHN0cmluZy5cbiAgICovXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICB2YXIgc2hlZXQgPSB0aGlzLm9wdGlvbnMuc2hlZXQ7XG4gICAgdmFyIGxpbmsgPSBzaGVldCA/IHNoZWV0Lm9wdGlvbnMubGluayA6IGZhbHNlO1xuICAgIHZhciBvcHRzID0gbGluayA/IF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgICBhbGxvd0VtcHR5OiB0cnVlXG4gICAgfSkgOiBvcHRpb25zO1xuICAgIHJldHVybiB0b0Nzcyh0aGlzLmtleSwgdGhpcy5zdHlsZSwgb3B0cyk7XG4gIH07XG5cbiAgcmV0dXJuIEtleWZyYW1lUnVsZTtcbn0oQmFzZVN0eWxlUnVsZSk7XG52YXIgcGx1Z2luS2V5ZnJhbWVSdWxlID0ge1xuICBvbkNyZWF0ZVJ1bGU6IGZ1bmN0aW9uIG9uQ3JlYXRlUnVsZShrZXksIHN0eWxlLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMucGFyZW50ICYmIG9wdGlvbnMucGFyZW50LnR5cGUgPT09ICdrZXlmcmFtZXMnKSB7XG4gICAgICByZXR1cm4gbmV3IEtleWZyYW1lUnVsZShrZXksIHN0eWxlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxudmFyIEZvbnRGYWNlUnVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEZvbnRGYWNlUnVsZShrZXksIHN0eWxlLCBvcHRpb25zKSB7XG4gICAgdGhpcy50eXBlID0gJ2ZvbnQtZmFjZSc7XG4gICAgdGhpcy5hdCA9ICdAZm9udC1mYWNlJztcbiAgICB0aGlzLmlzUHJvY2Vzc2VkID0gZmFsc2U7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgdGhpcy5zdHlsZSA9IHN0eWxlO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIENTUyBzdHJpbmcuXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IEZvbnRGYWNlUnVsZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcob3B0aW9ucykge1xuICAgIHZhciBfZ2V0V2hpdGVzcGFjZVN5bWJvbHMgPSBnZXRXaGl0ZXNwYWNlU3ltYm9scyhvcHRpb25zKSxcbiAgICAgICAgbGluZWJyZWFrID0gX2dldFdoaXRlc3BhY2VTeW1ib2xzLmxpbmVicmVhaztcblxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuc3R5bGUpKSB7XG4gICAgICB2YXIgc3RyID0gJyc7XG5cbiAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnN0eWxlLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBzdHIgKz0gdG9Dc3ModGhpcy5hdCwgdGhpcy5zdHlsZVtpbmRleF0pO1xuICAgICAgICBpZiAodGhpcy5zdHlsZVtpbmRleCArIDFdKSBzdHIgKz0gbGluZWJyZWFrO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIHJldHVybiB0b0Nzcyh0aGlzLmF0LCB0aGlzLnN0eWxlLCBvcHRpb25zKTtcbiAgfTtcblxuICByZXR1cm4gRm9udEZhY2VSdWxlO1xufSgpO1xudmFyIGtleVJlZ0V4cCQyID0gL0Bmb250LWZhY2UvO1xudmFyIHBsdWdpbkZvbnRGYWNlUnVsZSA9IHtcbiAgb25DcmVhdGVSdWxlOiBmdW5jdGlvbiBvbkNyZWF0ZVJ1bGUoa2V5LCBzdHlsZSwgb3B0aW9ucykge1xuICAgIHJldHVybiBrZXlSZWdFeHAkMi50ZXN0KGtleSkgPyBuZXcgRm9udEZhY2VSdWxlKGtleSwgc3R5bGUsIG9wdGlvbnMpIDogbnVsbDtcbiAgfVxufTtcblxudmFyIFZpZXdwb3J0UnVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFZpZXdwb3J0UnVsZShrZXksIHN0eWxlLCBvcHRpb25zKSB7XG4gICAgdGhpcy50eXBlID0gJ3ZpZXdwb3J0JztcbiAgICB0aGlzLmF0ID0gJ0B2aWV3cG9ydCc7XG4gICAgdGhpcy5pc1Byb2Nlc3NlZCA9IGZhbHNlO1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYSBDU1Mgc3RyaW5nLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBWaWV3cG9ydFJ1bGUucHJvdG90eXBlO1xuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdG9Dc3ModGhpcy5rZXksIHRoaXMuc3R5bGUsIG9wdGlvbnMpO1xuICB9O1xuXG4gIHJldHVybiBWaWV3cG9ydFJ1bGU7XG59KCk7XG52YXIgcGx1Z2luVmlld3BvcnRSdWxlID0ge1xuICBvbkNyZWF0ZVJ1bGU6IGZ1bmN0aW9uIG9uQ3JlYXRlUnVsZShrZXksIHN0eWxlLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGtleSA9PT0gJ0B2aWV3cG9ydCcgfHwga2V5ID09PSAnQC1tcy12aWV3cG9ydCcgPyBuZXcgVmlld3BvcnRSdWxlKGtleSwgc3R5bGUsIG9wdGlvbnMpIDogbnVsbDtcbiAgfVxufTtcblxudmFyIFNpbXBsZVJ1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTaW1wbGVSdWxlKGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnR5cGUgPSAnc2ltcGxlJztcbiAgICB0aGlzLmlzUHJvY2Vzc2VkID0gZmFsc2U7XG4gICAgdGhpcy5rZXkgPSBrZXk7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIENTUyBzdHJpbmcuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcblxuXG4gIHZhciBfcHJvdG8gPSBTaW1wbGVSdWxlLnByb3RvdHlwZTtcblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhvcHRpb25zKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkpIHtcbiAgICAgIHZhciBzdHIgPSAnJztcblxuICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHN0ciArPSB0aGlzLmtleSArIFwiIFwiICsgdGhpcy52YWx1ZVtpbmRleF0gKyBcIjtcIjtcbiAgICAgICAgaWYgKHRoaXMudmFsdWVbaW5kZXggKyAxXSkgc3RyICs9ICdcXG4nO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmtleSArIFwiIFwiICsgdGhpcy52YWx1ZSArIFwiO1wiO1xuICB9O1xuXG4gIHJldHVybiBTaW1wbGVSdWxlO1xufSgpO1xudmFyIGtleXNNYXAgPSB7XG4gICdAY2hhcnNldCc6IHRydWUsXG4gICdAaW1wb3J0JzogdHJ1ZSxcbiAgJ0BuYW1lc3BhY2UnOiB0cnVlXG59O1xudmFyIHBsdWdpblNpbXBsZVJ1bGUgPSB7XG4gIG9uQ3JlYXRlUnVsZTogZnVuY3Rpb24gb25DcmVhdGVSdWxlKGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4ga2V5IGluIGtleXNNYXAgPyBuZXcgU2ltcGxlUnVsZShrZXksIHZhbHVlLCBvcHRpb25zKSA6IG51bGw7XG4gIH1cbn07XG5cbnZhciBwbHVnaW5zID0gW3BsdWdpblN0eWxlUnVsZSwgcGx1Z2luQ29uZGl0aW9uYWxSdWxlLCBwbHVnaW5LZXlmcmFtZXNSdWxlLCBwbHVnaW5LZXlmcmFtZVJ1bGUsIHBsdWdpbkZvbnRGYWNlUnVsZSwgcGx1Z2luVmlld3BvcnRSdWxlLCBwbHVnaW5TaW1wbGVSdWxlXTtcblxudmFyIGRlZmF1bHRVcGRhdGVPcHRpb25zID0ge1xuICBwcm9jZXNzOiB0cnVlXG59O1xudmFyIGZvcmNlVXBkYXRlT3B0aW9ucyA9IHtcbiAgZm9yY2U6IHRydWUsXG4gIHByb2Nlc3M6IHRydWVcbiAgLyoqXG4gICAqIENvbnRhaW5zIHJ1bGVzIG9iamVjdHMgYW5kIGFsbG93cyBhZGRpbmcvcmVtb3ZpbmcgZXRjLlxuICAgKiBJcyB1c2VkIGZvciBlLmcuIGJ5IGBTdHlsZVNoZWV0YCBvciBgQ29uZGl0aW9uYWxSdWxlYC5cbiAgICovXG5cbn07XG5cbnZhciBSdWxlTGlzdCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8vIFJ1bGVzIHJlZ2lzdHJ5IGZvciBhY2Nlc3MgYnkgLmdldCgpIG1ldGhvZC5cbiAgLy8gSXQgY29udGFpbnMgdGhlIHNhbWUgcnVsZSByZWdpc3RlcmVkIGJ5IG5hbWUgYW5kIGJ5IHNlbGVjdG9yLlxuICAvLyBPcmlnaW5hbCBzdHlsZXMgb2JqZWN0LlxuICAvLyBVc2VkIHRvIGVuc3VyZSBjb3JyZWN0IHJ1bGVzIG9yZGVyLlxuICBmdW5jdGlvbiBSdWxlTGlzdChvcHRpb25zKSB7XG4gICAgdGhpcy5tYXAgPSB7fTtcbiAgICB0aGlzLnJhdyA9IHt9O1xuICAgIHRoaXMuaW5kZXggPSBbXTtcbiAgICB0aGlzLmNvdW50ZXIgPSAwO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5jbGFzc2VzID0gb3B0aW9ucy5jbGFzc2VzO1xuICAgIHRoaXMua2V5ZnJhbWVzID0gb3B0aW9ucy5rZXlmcmFtZXM7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgcnVsZS5cbiAgICpcbiAgICogV2lsbCBub3QgcmVuZGVyIGFmdGVyIFN0eWxlIFNoZWV0IHdhcyByZW5kZXJlZCB0aGUgZmlyc3QgdGltZS5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gUnVsZUxpc3QucHJvdG90eXBlO1xuXG4gIF9wcm90by5hZGQgPSBmdW5jdGlvbiBhZGQobmFtZSwgZGVjbCwgcnVsZU9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMkb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgcGFyZW50ID0gX3RoaXMkb3B0aW9ucy5wYXJlbnQsXG4gICAgICAgIHNoZWV0ID0gX3RoaXMkb3B0aW9ucy5zaGVldCxcbiAgICAgICAganNzID0gX3RoaXMkb3B0aW9ucy5qc3MsXG4gICAgICAgIFJlbmRlcmVyID0gX3RoaXMkb3B0aW9ucy5SZW5kZXJlcixcbiAgICAgICAgZ2VuZXJhdGVJZCA9IF90aGlzJG9wdGlvbnMuZ2VuZXJhdGVJZCxcbiAgICAgICAgc2NvcGVkID0gX3RoaXMkb3B0aW9ucy5zY29wZWQ7XG5cbiAgICB2YXIgb3B0aW9ucyA9IF9leHRlbmRzKHtcbiAgICAgIGNsYXNzZXM6IHRoaXMuY2xhc3NlcyxcbiAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgc2hlZXQ6IHNoZWV0LFxuICAgICAganNzOiBqc3MsXG4gICAgICBSZW5kZXJlcjogUmVuZGVyZXIsXG4gICAgICBnZW5lcmF0ZUlkOiBnZW5lcmF0ZUlkLFxuICAgICAgc2NvcGVkOiBzY29wZWQsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAga2V5ZnJhbWVzOiB0aGlzLmtleWZyYW1lcyxcbiAgICAgIHNlbGVjdG9yOiB1bmRlZmluZWRcbiAgICB9LCBydWxlT3B0aW9ucyk7IC8vIFdoZW4gdXNlciB1c2VzIC5jcmVhdGVTdHlsZVNoZWV0KCksIGR1cGxpY2F0ZSBuYW1lcyBhcmUgbm90IHBvc3NpYmxlLCBidXRcbiAgICAvLyBgc2hlZXQuYWRkUnVsZSgpYCBvcGVucyB0aGUgZG9vciBmb3IgYW55IGR1cGxpY2F0ZSBydWxlIG5hbWUuIFdoZW4gdGhpcyBoYXBwZW5zXG4gICAgLy8gd2UgbmVlZCB0byBtYWtlIHRoZSBrZXkgdW5pcXVlIHdpdGhpbiB0aGlzIFJ1bGVMaXN0IGluc3RhbmNlIHNjb3BlLlxuXG5cbiAgICB2YXIga2V5ID0gbmFtZTtcblxuICAgIGlmIChuYW1lIGluIHRoaXMucmF3KSB7XG4gICAgICBrZXkgPSBuYW1lICsgXCItZFwiICsgdGhpcy5jb3VudGVyKys7XG4gICAgfSAvLyBXZSBuZWVkIHRvIHNhdmUgdGhlIG9yaWdpbmFsIGRlY2wgYmVmb3JlIGNyZWF0aW5nIHRoZSBydWxlXG4gICAgLy8gYmVjYXVzZSBjYWNoZSBwbHVnaW4gbmVlZHMgdG8gdXNlIGl0IGFzIGEga2V5IHRvIHJldHVybiBhIGNhY2hlZCBydWxlLlxuXG5cbiAgICB0aGlzLnJhd1trZXldID0gZGVjbDtcblxuICAgIGlmIChrZXkgaW4gdGhpcy5jbGFzc2VzKSB7XG4gICAgICAvLyBFLmcuIHJ1bGVzIGluc2lkZSBvZiBAbWVkaWEgY29udGFpbmVyXG4gICAgICBvcHRpb25zLnNlbGVjdG9yID0gXCIuXCIgKyBlc2NhcGUodGhpcy5jbGFzc2VzW2tleV0pO1xuICAgIH1cblxuICAgIHZhciBydWxlID0gY3JlYXRlUnVsZShrZXksIGRlY2wsIG9wdGlvbnMpO1xuICAgIGlmICghcnVsZSkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5yZWdpc3RlcihydWxlKTtcbiAgICB2YXIgaW5kZXggPSBvcHRpb25zLmluZGV4ID09PSB1bmRlZmluZWQgPyB0aGlzLmluZGV4Lmxlbmd0aCA6IG9wdGlvbnMuaW5kZXg7XG4gICAgdGhpcy5pbmRleC5zcGxpY2UoaW5kZXgsIDAsIHJ1bGUpO1xuICAgIHJldHVybiBydWxlO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlIHJ1bGUuXG4gICAqIENyZWF0ZSBhIG5ldyBydWxlIGFuZCByZW1vdmUgb2xkIG9uZSBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nXG4gICAqIGJlY2F1c2Ugd2Ugd2FudCB0byBpbnZva2Ugb25DcmVhdGVSdWxlIGhvb2sgdG8gbWFrZSBwbHVnaW5zIHdvcmsuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJlcGxhY2UgPSBmdW5jdGlvbiByZXBsYWNlKG5hbWUsIGRlY2wsIHJ1bGVPcHRpb25zKSB7XG4gICAgdmFyIG9sZFJ1bGUgPSB0aGlzLmdldChuYW1lKTtcbiAgICB2YXIgb2xkSW5kZXggPSB0aGlzLmluZGV4LmluZGV4T2Yob2xkUnVsZSk7XG5cbiAgICBpZiAob2xkUnVsZSkge1xuICAgICAgdGhpcy5yZW1vdmUob2xkUnVsZSk7XG4gICAgfVxuXG4gICAgdmFyIG9wdGlvbnMgPSBydWxlT3B0aW9ucztcbiAgICBpZiAob2xkSW5kZXggIT09IC0xKSBvcHRpb25zID0gX2V4dGVuZHMoe30sIHJ1bGVPcHRpb25zLCB7XG4gICAgICBpbmRleDogb2xkSW5kZXhcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5hZGQobmFtZSwgZGVjbCwgb3B0aW9ucyk7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBhIHJ1bGUgYnkgbmFtZSBvciBzZWxlY3Rvci5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZ2V0ID0gZnVuY3Rpb24gZ2V0KG5hbWVPclNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMubWFwW25hbWVPclNlbGVjdG9yXTtcbiAgfVxuICAvKipcbiAgICogRGVsZXRlIGEgcnVsZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKHJ1bGUpIHtcbiAgICB0aGlzLnVucmVnaXN0ZXIocnVsZSk7XG4gICAgZGVsZXRlIHRoaXMucmF3W3J1bGUua2V5XTtcbiAgICB0aGlzLmluZGV4LnNwbGljZSh0aGlzLmluZGV4LmluZGV4T2YocnVsZSksIDEpO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgaW5kZXggb2YgYSBydWxlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZihydWxlKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5kZXguaW5kZXhPZihydWxlKTtcbiAgfVxuICAvKipcbiAgICogUnVuIGBvblByb2Nlc3NSdWxlKClgIHBsdWdpbnMgb24gZXZlcnkgcnVsZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucHJvY2VzcyA9IGZ1bmN0aW9uIHByb2Nlc3MoKSB7XG4gICAgdmFyIHBsdWdpbnMgPSB0aGlzLm9wdGlvbnMuanNzLnBsdWdpbnM7IC8vIFdlIG5lZWQgdG8gY2xvbmUgYXJyYXkgYmVjYXVzZSBpZiB3ZSBtb2RpZnkgdGhlIGluZGV4IHNvbWV3aGVyZSBlbHNlIGR1cmluZyBhIGxvb3BcbiAgICAvLyB3ZSBlbmQgdXAgd2l0aCB2ZXJ5IGhhcmQtdG8tdHJhY2stZG93biBzaWRlIGVmZmVjdHMuXG5cbiAgICB0aGlzLmluZGV4LnNsaWNlKDApLmZvckVhY2gocGx1Z2lucy5vblByb2Nlc3NSdWxlLCBwbHVnaW5zKTtcbiAgfVxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBydWxlIGluIGAubWFwYCwgYC5jbGFzc2VzYCBhbmQgYC5rZXlmcmFtZXNgIG1hcHMuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJlZ2lzdGVyID0gZnVuY3Rpb24gcmVnaXN0ZXIocnVsZSkge1xuICAgIHRoaXMubWFwW3J1bGUua2V5XSA9IHJ1bGU7XG5cbiAgICBpZiAocnVsZSBpbnN0YW5jZW9mIFN0eWxlUnVsZSkge1xuICAgICAgdGhpcy5tYXBbcnVsZS5zZWxlY3Rvcl0gPSBydWxlO1xuICAgICAgaWYgKHJ1bGUuaWQpIHRoaXMuY2xhc3Nlc1tydWxlLmtleV0gPSBydWxlLmlkO1xuICAgIH0gZWxzZSBpZiAocnVsZSBpbnN0YW5jZW9mIEtleWZyYW1lc1J1bGUgJiYgdGhpcy5rZXlmcmFtZXMpIHtcbiAgICAgIHRoaXMua2V5ZnJhbWVzW3J1bGUubmFtZV0gPSBydWxlLmlkO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVW5yZWdpc3RlciBhIHJ1bGUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnVucmVnaXN0ZXIgPSBmdW5jdGlvbiB1bnJlZ2lzdGVyKHJ1bGUpIHtcbiAgICBkZWxldGUgdGhpcy5tYXBbcnVsZS5rZXldO1xuXG4gICAgaWYgKHJ1bGUgaW5zdGFuY2VvZiBTdHlsZVJ1bGUpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLm1hcFtydWxlLnNlbGVjdG9yXTtcbiAgICAgIGRlbGV0ZSB0aGlzLmNsYXNzZXNbcnVsZS5rZXldO1xuICAgIH0gZWxzZSBpZiAocnVsZSBpbnN0YW5jZW9mIEtleWZyYW1lc1J1bGUpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmtleWZyYW1lc1tydWxlLm5hbWVdO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogVXBkYXRlIHRoZSBmdW5jdGlvbiB2YWx1ZXMgd2l0aCBhIG5ldyBkYXRhLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgdmFyIG5hbWU7XG4gICAgdmFyIGRhdGE7XG4gICAgdmFyIG9wdGlvbnM7XG5cbiAgICBpZiAodHlwZW9mIChhcmd1bWVudHMubGVuZ3RoIDw9IDAgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMF0pID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZSA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1swXTtcbiAgICAgIGRhdGEgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgPyB1bmRlZmluZWQgOiBhcmd1bWVudHNbMV07XG4gICAgICBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAyID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzJdO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwID8gdW5kZWZpbmVkIDogYXJndW1lbnRzWzBdO1xuICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMSA/IHVuZGVmaW5lZCA6IGFyZ3VtZW50c1sxXTtcbiAgICAgIG5hbWUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChuYW1lKSB7XG4gICAgICB0aGlzLnVwZGF0ZU9uZSh0aGlzLmdldChuYW1lKSwgZGF0YSwgb3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmluZGV4Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICB0aGlzLnVwZGF0ZU9uZSh0aGlzLmluZGV4W2luZGV4XSwgZGF0YSwgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBFeGVjdXRlIHBsdWdpbnMsIHVwZGF0ZSBydWxlIHByb3BzLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by51cGRhdGVPbmUgPSBmdW5jdGlvbiB1cGRhdGVPbmUocnVsZSwgZGF0YSwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0VXBkYXRlT3B0aW9ucztcbiAgICB9XG5cbiAgICB2YXIgX3RoaXMkb3B0aW9uczIgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIHBsdWdpbnMgPSBfdGhpcyRvcHRpb25zMi5qc3MucGx1Z2lucyxcbiAgICAgICAgc2hlZXQgPSBfdGhpcyRvcHRpb25zMi5zaGVldDsgLy8gSXQgaXMgYSBydWxlcyBjb250YWluZXIgbGlrZSBmb3IgZS5nLiBDb25kaXRpb25hbFJ1bGUuXG5cbiAgICBpZiAocnVsZS5ydWxlcyBpbnN0YW5jZW9mIFJ1bGVMaXN0KSB7XG4gICAgICBydWxlLnJ1bGVzLnVwZGF0ZShkYXRhLCBvcHRpb25zKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3R5bGUgPSBydWxlLnN0eWxlO1xuICAgIHBsdWdpbnMub25VcGRhdGUoZGF0YSwgcnVsZSwgc2hlZXQsIG9wdGlvbnMpOyAvLyBXZSByZWx5IG9uIGEgbmV3IGBzdHlsZWAgcmVmIGluIGNhc2UgaXQgd2FzIG11dGF0ZWQgZHVyaW5nIG9uVXBkYXRlIGhvb2suXG5cbiAgICBpZiAob3B0aW9ucy5wcm9jZXNzICYmIHN0eWxlICYmIHN0eWxlICE9PSBydWxlLnN0eWxlKSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIHJ1biB0aGUgcGx1Z2lucyBpbiBjYXNlIG5ldyBgc3R5bGVgIHJlbGllcyBvbiBzeW50YXggcGx1Z2lucy5cbiAgICAgIHBsdWdpbnMub25Qcm9jZXNzU3R5bGUocnVsZS5zdHlsZSwgcnVsZSwgc2hlZXQpOyAvLyBVcGRhdGUgYW5kIGFkZCBwcm9wcy5cblxuICAgICAgZm9yICh2YXIgcHJvcCBpbiBydWxlLnN0eWxlKSB7XG4gICAgICAgIHZhciBuZXh0VmFsdWUgPSBydWxlLnN0eWxlW3Byb3BdO1xuICAgICAgICB2YXIgcHJldlZhbHVlID0gc3R5bGVbcHJvcF07IC8vIFdlIG5lZWQgdG8gdXNlIGBmb3JjZTogdHJ1ZWAgYmVjYXVzZSBgcnVsZS5zdHlsZWAgaGFzIGJlZW4gdXBkYXRlZCBkdXJpbmcgb25VcGRhdGUgaG9vaywgc28gYHJ1bGUucHJvcCgpYCB3aWxsIG5vdCB1cGRhdGUgdGhlIENTU09NIHJ1bGUuXG4gICAgICAgIC8vIFdlIGRvIHRoaXMgY29tcGFyaXNvbiB0byBhdm9pZCB1bm5lZWRlZCBgcnVsZS5wcm9wKClgIGNhbGxzLCBzaW5jZSB3ZSBoYXZlIHRoZSBvbGQgYHN0eWxlYCBvYmplY3QgaGVyZS5cblxuICAgICAgICBpZiAobmV4dFZhbHVlICE9PSBwcmV2VmFsdWUpIHtcbiAgICAgICAgICBydWxlLnByb3AocHJvcCwgbmV4dFZhbHVlLCBmb3JjZVVwZGF0ZU9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IC8vIFJlbW92ZSBwcm9wcy5cblxuXG4gICAgICBmb3IgKHZhciBfcHJvcCBpbiBzdHlsZSkge1xuICAgICAgICB2YXIgX25leHRWYWx1ZSA9IHJ1bGUuc3R5bGVbX3Byb3BdO1xuICAgICAgICB2YXIgX3ByZXZWYWx1ZSA9IHN0eWxlW19wcm9wXTsgLy8gV2UgbmVlZCB0byB1c2UgYGZvcmNlOiB0cnVlYCBiZWNhdXNlIGBydWxlLnN0eWxlYCBoYXMgYmVlbiB1cGRhdGVkIGR1cmluZyBvblVwZGF0ZSBob29rLCBzbyBgcnVsZS5wcm9wKClgIHdpbGwgbm90IHVwZGF0ZSB0aGUgQ1NTT00gcnVsZS5cbiAgICAgICAgLy8gV2UgZG8gdGhpcyBjb21wYXJpc29uIHRvIGF2b2lkIHVubmVlZGVkIGBydWxlLnByb3AoKWAgY2FsbHMsIHNpbmNlIHdlIGhhdmUgdGhlIG9sZCBgc3R5bGVgIG9iamVjdCBoZXJlLlxuXG4gICAgICAgIGlmIChfbmV4dFZhbHVlID09IG51bGwgJiYgX25leHRWYWx1ZSAhPT0gX3ByZXZWYWx1ZSkge1xuICAgICAgICAgIHJ1bGUucHJvcChfcHJvcCwgbnVsbCwgZm9yY2VVcGRhdGVPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICAvKipcbiAgICogQ29udmVydCBydWxlcyB0byBhIENTUyBzdHJpbmcuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcob3B0aW9ucykge1xuICAgIHZhciBzdHIgPSAnJztcbiAgICB2YXIgc2hlZXQgPSB0aGlzLm9wdGlvbnMuc2hlZXQ7XG4gICAgdmFyIGxpbmsgPSBzaGVldCA/IHNoZWV0Lm9wdGlvbnMubGluayA6IGZhbHNlO1xuXG4gICAgdmFyIF9nZXRXaGl0ZXNwYWNlU3ltYm9scyA9IGdldFdoaXRlc3BhY2VTeW1ib2xzKG9wdGlvbnMpLFxuICAgICAgICBsaW5lYnJlYWsgPSBfZ2V0V2hpdGVzcGFjZVN5bWJvbHMubGluZWJyZWFrO1xuXG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuaW5kZXgubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIgcnVsZSA9IHRoaXMuaW5kZXhbaW5kZXhdO1xuICAgICAgdmFyIGNzcyA9IHJ1bGUudG9TdHJpbmcob3B0aW9ucyk7IC8vIE5vIG5lZWQgdG8gcmVuZGVyIGFuIGVtcHR5IHJ1bGUuXG5cbiAgICAgIGlmICghY3NzICYmICFsaW5rKSBjb250aW51ZTtcbiAgICAgIGlmIChzdHIpIHN0ciArPSBsaW5lYnJlYWs7XG4gICAgICBzdHIgKz0gY3NzO1xuICAgIH1cblxuICAgIHJldHVybiBzdHI7XG4gIH07XG5cbiAgcmV0dXJuIFJ1bGVMaXN0O1xufSgpO1xuXG52YXIgU3R5bGVTaGVldCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFN0eWxlU2hlZXQoc3R5bGVzLCBvcHRpb25zKSB7XG4gICAgdGhpcy5hdHRhY2hlZCA9IGZhbHNlO1xuICAgIHRoaXMuZGVwbG95ZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNsYXNzZXMgPSB7fTtcbiAgICB0aGlzLmtleWZyYW1lcyA9IHt9O1xuICAgIHRoaXMub3B0aW9ucyA9IF9leHRlbmRzKHt9LCBvcHRpb25zLCB7XG4gICAgICBzaGVldDogdGhpcyxcbiAgICAgIHBhcmVudDogdGhpcyxcbiAgICAgIGNsYXNzZXM6IHRoaXMuY2xhc3NlcyxcbiAgICAgIGtleWZyYW1lczogdGhpcy5rZXlmcmFtZXNcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLlJlbmRlcmVyKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyID0gbmV3IG9wdGlvbnMuUmVuZGVyZXIodGhpcyk7XG4gICAgfVxuXG4gICAgdGhpcy5ydWxlcyA9IG5ldyBSdWxlTGlzdCh0aGlzLm9wdGlvbnMpO1xuXG4gICAgZm9yICh2YXIgbmFtZSBpbiBzdHlsZXMpIHtcbiAgICAgIHRoaXMucnVsZXMuYWRkKG5hbWUsIHN0eWxlc1tuYW1lXSk7XG4gICAgfVxuXG4gICAgdGhpcy5ydWxlcy5wcm9jZXNzKCk7XG4gIH1cbiAgLyoqXG4gICAqIEF0dGFjaCByZW5kZXJhYmxlIHRvIHRoZSByZW5kZXIgdHJlZS5cbiAgICovXG5cblxuICB2YXIgX3Byb3RvID0gU3R5bGVTaGVldC5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmF0dGFjaCA9IGZ1bmN0aW9uIGF0dGFjaCgpIHtcbiAgICBpZiAodGhpcy5hdHRhY2hlZCkgcmV0dXJuIHRoaXM7XG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHRoaXMucmVuZGVyZXIuYXR0YWNoKCk7XG4gICAgdGhpcy5hdHRhY2hlZCA9IHRydWU7IC8vIE9yZGVyIGlzIGltcG9ydGFudCwgYmVjYXVzZSB3ZSBjYW4ndCB1c2UgaW5zZXJ0UnVsZSBBUEkgaWYgc3R5bGUgZWxlbWVudCBpcyBub3QgYXR0YWNoZWQuXG5cbiAgICBpZiAoIXRoaXMuZGVwbG95ZWQpIHRoaXMuZGVwbG95KCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZSByZW5kZXJhYmxlIGZyb20gcmVuZGVyIHRyZWUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmRldGFjaCA9IGZ1bmN0aW9uIGRldGFjaCgpIHtcbiAgICBpZiAoIXRoaXMuYXR0YWNoZWQpIHJldHVybiB0aGlzO1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB0aGlzLnJlbmRlcmVyLmRldGFjaCgpO1xuICAgIHRoaXMuYXR0YWNoZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQWRkIGEgcnVsZSB0byB0aGUgY3VycmVudCBzdHlsZXNoZWV0LlxuICAgKiBXaWxsIGluc2VydCBhIHJ1bGUgYWxzbyBhZnRlciB0aGUgc3R5bGVzaGVldCBoYXMgYmVlbiByZW5kZXJlZCBmaXJzdCB0aW1lLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5hZGRSdWxlID0gZnVuY3Rpb24gYWRkUnVsZShuYW1lLCBkZWNsLCBvcHRpb25zKSB7XG4gICAgdmFyIHF1ZXVlID0gdGhpcy5xdWV1ZTsgLy8gUGx1Z2lucyBjYW4gY3JlYXRlIHJ1bGVzLlxuICAgIC8vIEluIG9yZGVyIHRvIHByZXNlcnZlIHRoZSByaWdodCBvcmRlciwgd2UgbmVlZCB0byBxdWV1ZSBhbGwgYC5hZGRSdWxlYCBjYWxscyxcbiAgICAvLyB3aGljaCBoYXBwZW4gYWZ0ZXIgdGhlIGZpcnN0IGBydWxlcy5hZGQoKWAgY2FsbC5cblxuICAgIGlmICh0aGlzLmF0dGFjaGVkICYmICFxdWV1ZSkgdGhpcy5xdWV1ZSA9IFtdO1xuICAgIHZhciBydWxlID0gdGhpcy5ydWxlcy5hZGQobmFtZSwgZGVjbCwgb3B0aW9ucyk7XG4gICAgaWYgKCFydWxlKSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLm9wdGlvbnMuanNzLnBsdWdpbnMub25Qcm9jZXNzUnVsZShydWxlKTtcblxuICAgIGlmICh0aGlzLmF0dGFjaGVkKSB7XG4gICAgICBpZiAoIXRoaXMuZGVwbG95ZWQpIHJldHVybiBydWxlOyAvLyBEb24ndCBpbnNlcnQgcnVsZSBkaXJlY3RseSBpZiB0aGVyZSBpcyBubyBzdHJpbmdpZmllZCB2ZXJzaW9uIHlldC5cbiAgICAgIC8vIEl0IHdpbGwgYmUgaW5zZXJ0ZWQgYWxsIHRvZ2V0aGVyIHdoZW4gLmF0dGFjaCBpcyBjYWxsZWQuXG5cbiAgICAgIGlmIChxdWV1ZSkgcXVldWUucHVzaChydWxlKTtlbHNlIHtcbiAgICAgICAgdGhpcy5pbnNlcnRSdWxlKHJ1bGUpO1xuXG4gICAgICAgIGlmICh0aGlzLnF1ZXVlKSB7XG4gICAgICAgICAgdGhpcy5xdWV1ZS5mb3JFYWNoKHRoaXMuaW5zZXJ0UnVsZSwgdGhpcyk7XG4gICAgICAgICAgdGhpcy5xdWV1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJ1bGU7XG4gICAgfSAvLyBXZSBjYW4ndCBhZGQgcnVsZXMgdG8gYSBkZXRhY2hlZCBzdHlsZSBub2RlLlxuICAgIC8vIFdlIHdpbGwgcmVkZXBsb3kgdGhlIHNoZWV0IG9uY2UgdXNlciB3aWxsIGF0dGFjaCBpdC5cblxuXG4gICAgdGhpcy5kZXBsb3llZCA9IGZhbHNlO1xuICAgIHJldHVybiBydWxlO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlIGEgcnVsZSBpbiB0aGUgY3VycmVudCBzdHlsZXNoZWV0LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5yZXBsYWNlUnVsZSA9IGZ1bmN0aW9uIHJlcGxhY2VSdWxlKG5hbWVPclNlbGVjdG9yLCBkZWNsLCBvcHRpb25zKSB7XG4gICAgdmFyIG9sZFJ1bGUgPSB0aGlzLnJ1bGVzLmdldChuYW1lT3JTZWxlY3Rvcik7XG4gICAgaWYgKCFvbGRSdWxlKSByZXR1cm4gdGhpcy5hZGRSdWxlKG5hbWVPclNlbGVjdG9yLCBkZWNsLCBvcHRpb25zKTtcbiAgICB2YXIgbmV3UnVsZSA9IHRoaXMucnVsZXMucmVwbGFjZShuYW1lT3JTZWxlY3RvciwgZGVjbCwgb3B0aW9ucyk7XG5cbiAgICBpZiAobmV3UnVsZSkge1xuICAgICAgdGhpcy5vcHRpb25zLmpzcy5wbHVnaW5zLm9uUHJvY2Vzc1J1bGUobmV3UnVsZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXR0YWNoZWQpIHtcbiAgICAgIGlmICghdGhpcy5kZXBsb3llZCkgcmV0dXJuIG5ld1J1bGU7IC8vIERvbid0IHJlcGxhY2UgLyBkZWxldGUgcnVsZSBkaXJlY3RseSBpZiB0aGVyZSBpcyBubyBzdHJpbmdpZmllZCB2ZXJzaW9uIHlldC5cbiAgICAgIC8vIEl0IHdpbGwgYmUgaW5zZXJ0ZWQgYWxsIHRvZ2V0aGVyIHdoZW4gLmF0dGFjaCBpcyBjYWxsZWQuXG5cbiAgICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XG4gICAgICAgIGlmICghbmV3UnVsZSkge1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuZGVsZXRlUnVsZShvbGRSdWxlKTtcbiAgICAgICAgfSBlbHNlIGlmIChvbGRSdWxlLnJlbmRlcmFibGUpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlcGxhY2VSdWxlKG9sZFJ1bGUucmVuZGVyYWJsZSwgbmV3UnVsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ld1J1bGU7XG4gICAgfSAvLyBXZSBjYW4ndCByZXBsYWNlIHJ1bGVzIHRvIGEgZGV0YWNoZWQgc3R5bGUgbm9kZS5cbiAgICAvLyBXZSB3aWxsIHJlZGVwbG95IHRoZSBzaGVldCBvbmNlIHVzZXIgd2lsbCBhdHRhY2ggaXQuXG5cblxuICAgIHRoaXMuZGVwbG95ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gbmV3UnVsZTtcbiAgfVxuICAvKipcbiAgICogSW5zZXJ0IHJ1bGUgaW50byB0aGUgU3R5bGVTaGVldFxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5pbnNlcnRSdWxlID0gZnVuY3Rpb24gaW5zZXJ0UnVsZShydWxlKSB7XG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0UnVsZShydWxlKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhbmQgYWRkIHJ1bGVzLlxuICAgKiBXaWxsIHJlbmRlciBhbHNvIGFmdGVyIFN0eWxlIFNoZWV0IHdhcyByZW5kZXJlZCB0aGUgZmlyc3QgdGltZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uYWRkUnVsZXMgPSBmdW5jdGlvbiBhZGRSdWxlcyhzdHlsZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgYWRkZWQgPSBbXTtcblxuICAgIGZvciAodmFyIG5hbWUgaW4gc3R5bGVzKSB7XG4gICAgICB2YXIgcnVsZSA9IHRoaXMuYWRkUnVsZShuYW1lLCBzdHlsZXNbbmFtZV0sIG9wdGlvbnMpO1xuICAgICAgaWYgKHJ1bGUpIGFkZGVkLnB1c2gocnVsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFkZGVkO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgYSBydWxlIGJ5IG5hbWUgb3Igc2VsZWN0b3IuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmdldFJ1bGUgPSBmdW5jdGlvbiBnZXRSdWxlKG5hbWVPclNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMucnVsZXMuZ2V0KG5hbWVPclNlbGVjdG9yKTtcbiAgfVxuICAvKipcbiAgICogRGVsZXRlIGEgcnVsZSBieSBuYW1lLlxuICAgKiBSZXR1cm5zIGB0cnVlYDogaWYgcnVsZSBoYXMgYmVlbiBkZWxldGVkIGZyb20gdGhlIERPTS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZGVsZXRlUnVsZSA9IGZ1bmN0aW9uIGRlbGV0ZVJ1bGUobmFtZSkge1xuICAgIHZhciBydWxlID0gdHlwZW9mIG5hbWUgPT09ICdvYmplY3QnID8gbmFtZSA6IHRoaXMucnVsZXMuZ2V0KG5hbWUpO1xuXG4gICAgaWYgKCFydWxlIHx8IC8vIFN0eWxlIHNoZWV0IHdhcyBjcmVhdGVkIHdpdGhvdXQgbGluazogdHJ1ZSBhbmQgYXR0YWNoZWQsIGluIHRoaXMgY2FzZSB3ZVxuICAgIC8vIHdvbid0IGJlIGFibGUgdG8gcmVtb3ZlIHRoZSBDU1MgcnVsZSBmcm9tIHRoZSBET00uXG4gICAgdGhpcy5hdHRhY2hlZCAmJiAhcnVsZS5yZW5kZXJhYmxlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5ydWxlcy5yZW1vdmUocnVsZSk7XG5cbiAgICBpZiAodGhpcy5hdHRhY2hlZCAmJiBydWxlLnJlbmRlcmFibGUgJiYgdGhpcy5yZW5kZXJlcikge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZXIuZGVsZXRlUnVsZShydWxlLnJlbmRlcmFibGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgaW5kZXggb2YgYSBydWxlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZihydWxlKSB7XG4gICAgcmV0dXJuIHRoaXMucnVsZXMuaW5kZXhPZihydWxlKTtcbiAgfVxuICAvKipcbiAgICogRGVwbG95IHB1cmUgQ1NTIHN0cmluZyB0byBhIHJlbmRlcmFibGUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmRlcGxveSA9IGZ1bmN0aW9uIGRlcGxveSgpIHtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikgdGhpcy5yZW5kZXJlci5kZXBsb3koKTtcbiAgICB0aGlzLmRlcGxveWVkID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogVXBkYXRlIHRoZSBmdW5jdGlvbiB2YWx1ZXMgd2l0aCBhIG5ldyBkYXRhLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgdmFyIF90aGlzJHJ1bGVzO1xuXG4gICAgKF90aGlzJHJ1bGVzID0gdGhpcy5ydWxlcykudXBkYXRlLmFwcGx5KF90aGlzJHJ1bGVzLCBhcmd1bWVudHMpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFVwZGF0ZXMgYSBzaW5nbGUgcnVsZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udXBkYXRlT25lID0gZnVuY3Rpb24gdXBkYXRlT25lKHJ1bGUsIGRhdGEsIG9wdGlvbnMpIHtcbiAgICB0aGlzLnJ1bGVzLnVwZGF0ZU9uZShydWxlLCBkYXRhLCBvcHRpb25zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQ29udmVydCBydWxlcyB0byBhIENTUyBzdHJpbmcuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcob3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnJ1bGVzLnRvU3RyaW5nKG9wdGlvbnMpO1xuICB9O1xuXG4gIHJldHVybiBTdHlsZVNoZWV0O1xufSgpO1xuXG52YXIgUGx1Z2luc1JlZ2lzdHJ5ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUGx1Z2luc1JlZ2lzdHJ5KCkge1xuICAgIHRoaXMucGx1Z2lucyA9IHtcbiAgICAgIGludGVybmFsOiBbXSxcbiAgICAgIGV4dGVybmFsOiBbXVxuICAgIH07XG4gICAgdGhpcy5yZWdpc3RyeSA9IHt9O1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFBsdWdpbnNSZWdpc3RyeS5wcm90b3R5cGU7XG5cbiAgLyoqXG4gICAqIENhbGwgYG9uQ3JlYXRlUnVsZWAgaG9va3MgYW5kIHJldHVybiBhbiBvYmplY3QgaWYgcmV0dXJuZWQgYnkgYSBob29rLlxuICAgKi9cbiAgX3Byb3RvLm9uQ3JlYXRlUnVsZSA9IGZ1bmN0aW9uIG9uQ3JlYXRlUnVsZShuYW1lLCBkZWNsLCBvcHRpb25zKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJlZ2lzdHJ5Lm9uQ3JlYXRlUnVsZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJ1bGUgPSB0aGlzLnJlZ2lzdHJ5Lm9uQ3JlYXRlUnVsZVtpXShuYW1lLCBkZWNsLCBvcHRpb25zKTtcbiAgICAgIGlmIChydWxlKSByZXR1cm4gcnVsZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBgb25Qcm9jZXNzUnVsZWAgaG9va3MuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLm9uUHJvY2Vzc1J1bGUgPSBmdW5jdGlvbiBvblByb2Nlc3NSdWxlKHJ1bGUpIHtcbiAgICBpZiAocnVsZS5pc1Byb2Nlc3NlZCkgcmV0dXJuO1xuICAgIHZhciBzaGVldCA9IHJ1bGUub3B0aW9ucy5zaGVldDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yZWdpc3RyeS5vblByb2Nlc3NSdWxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnJlZ2lzdHJ5Lm9uUHJvY2Vzc1J1bGVbaV0ocnVsZSwgc2hlZXQpO1xuICAgIH1cblxuICAgIGlmIChydWxlLnN0eWxlKSB0aGlzLm9uUHJvY2Vzc1N0eWxlKHJ1bGUuc3R5bGUsIHJ1bGUsIHNoZWV0KTtcbiAgICBydWxlLmlzUHJvY2Vzc2VkID0gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICogQ2FsbCBgb25Qcm9jZXNzU3R5bGVgIGhvb2tzLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5vblByb2Nlc3NTdHlsZSA9IGZ1bmN0aW9uIG9uUHJvY2Vzc1N0eWxlKHN0eWxlLCBydWxlLCBzaGVldCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yZWdpc3RyeS5vblByb2Nlc3NTdHlsZS5sZW5ndGg7IGkrKykge1xuICAgICAgcnVsZS5zdHlsZSA9IHRoaXMucmVnaXN0cnkub25Qcm9jZXNzU3R5bGVbaV0ocnVsZS5zdHlsZSwgcnVsZSwgc2hlZXQpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQ2FsbCBgb25Qcm9jZXNzU2hlZXRgIGhvb2tzLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5vblByb2Nlc3NTaGVldCA9IGZ1bmN0aW9uIG9uUHJvY2Vzc1NoZWV0KHNoZWV0KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJlZ2lzdHJ5Lm9uUHJvY2Vzc1NoZWV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnJlZ2lzdHJ5Lm9uUHJvY2Vzc1NoZWV0W2ldKHNoZWV0KTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENhbGwgYG9uVXBkYXRlYCBob29rcy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ub25VcGRhdGUgPSBmdW5jdGlvbiBvblVwZGF0ZShkYXRhLCBydWxlLCBzaGVldCwgb3B0aW9ucykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yZWdpc3RyeS5vblVwZGF0ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5yZWdpc3RyeS5vblVwZGF0ZVtpXShkYXRhLCBydWxlLCBzaGVldCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDYWxsIGBvbkNoYW5nZVZhbHVlYCBob29rcy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ub25DaGFuZ2VWYWx1ZSA9IGZ1bmN0aW9uIG9uQ2hhbmdlVmFsdWUodmFsdWUsIHByb3AsIHJ1bGUpIHtcbiAgICB2YXIgcHJvY2Vzc2VkVmFsdWUgPSB2YWx1ZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yZWdpc3RyeS5vbkNoYW5nZVZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwcm9jZXNzZWRWYWx1ZSA9IHRoaXMucmVnaXN0cnkub25DaGFuZ2VWYWx1ZVtpXShwcm9jZXNzZWRWYWx1ZSwgcHJvcCwgcnVsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2Nlc3NlZFZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHBsdWdpbi5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udXNlID0gZnVuY3Rpb24gdXNlKG5ld1BsdWdpbiwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIHF1ZXVlOiAnZXh0ZXJuYWwnXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBwbHVnaW5zID0gdGhpcy5wbHVnaW5zW29wdGlvbnMucXVldWVdOyAvLyBBdm9pZHMgYXBwbHlpbmcgc2FtZSBwbHVnaW4gdHdpY2UsIGF0IGxlYXN0IGJhc2VkIG9uIHJlZi5cblxuICAgIGlmIChwbHVnaW5zLmluZGV4T2YobmV3UGx1Z2luKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwbHVnaW5zLnB1c2gobmV3UGx1Z2luKTtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gW10uY29uY2F0KHRoaXMucGx1Z2lucy5leHRlcm5hbCwgdGhpcy5wbHVnaW5zLmludGVybmFsKS5yZWR1Y2UoZnVuY3Rpb24gKHJlZ2lzdHJ5LCBwbHVnaW4pIHtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gcGx1Z2luKSB7XG4gICAgICAgIGlmIChuYW1lIGluIHJlZ2lzdHJ5KSB7XG4gICAgICAgICAgcmVnaXN0cnlbbmFtZV0ucHVzaChwbHVnaW5bbmFtZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoZmFsc2UsIFwiW0pTU10gVW5rbm93biBob29rIFxcXCJcIiArIG5hbWUgKyBcIlxcXCIuXCIpIDogdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZWdpc3RyeTtcbiAgICB9LCB7XG4gICAgICBvbkNyZWF0ZVJ1bGU6IFtdLFxuICAgICAgb25Qcm9jZXNzUnVsZTogW10sXG4gICAgICBvblByb2Nlc3NTdHlsZTogW10sXG4gICAgICBvblByb2Nlc3NTaGVldDogW10sXG4gICAgICBvbkNoYW5nZVZhbHVlOiBbXSxcbiAgICAgIG9uVXBkYXRlOiBbXVxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBQbHVnaW5zUmVnaXN0cnk7XG59KCk7XG5cbi8qKlxuICogU2hlZXRzIHJlZ2lzdHJ5IHRvIGFjY2VzcyBhbGwgaW5zdGFuY2VzIGluIG9uZSBwbGFjZS5cbiAqL1xuXG52YXIgU2hlZXRzUmVnaXN0cnkgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTaGVldHNSZWdpc3RyeSgpIHtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gW107XG4gIH1cblxuICB2YXIgX3Byb3RvID0gU2hlZXRzUmVnaXN0cnkucHJvdG90eXBlO1xuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIFN0eWxlIFNoZWV0LlxuICAgKi9cbiAgX3Byb3RvLmFkZCA9IGZ1bmN0aW9uIGFkZChzaGVldCkge1xuICAgIHZhciByZWdpc3RyeSA9IHRoaXMucmVnaXN0cnk7XG4gICAgdmFyIGluZGV4ID0gc2hlZXQub3B0aW9ucy5pbmRleDtcbiAgICBpZiAocmVnaXN0cnkuaW5kZXhPZihzaGVldCkgIT09IC0xKSByZXR1cm47XG5cbiAgICBpZiAocmVnaXN0cnkubGVuZ3RoID09PSAwIHx8IGluZGV4ID49IHRoaXMuaW5kZXgpIHtcbiAgICAgIHJlZ2lzdHJ5LnB1c2goc2hlZXQpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gRmluZCBhIHBvc2l0aW9uLlxuXG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlZ2lzdHJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVnaXN0cnlbaV0ub3B0aW9ucy5pbmRleCA+IGluZGV4KSB7XG4gICAgICAgIHJlZ2lzdHJ5LnNwbGljZShpLCAwLCBzaGVldCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSByZWdpc3RyeS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8ucmVzZXQgPSBmdW5jdGlvbiByZXNldCgpIHtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gW107XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZSBhIFN0eWxlIFNoZWV0LlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoc2hlZXQpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLnJlZ2lzdHJ5LmluZGV4T2Yoc2hlZXQpO1xuICAgIHRoaXMucmVnaXN0cnkuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuICAvKipcbiAgICogQ29udmVydCBhbGwgYXR0YWNoZWQgc2hlZXRzIHRvIGEgQ1NTIHN0cmluZy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhfdGVtcCkge1xuICAgIHZhciBfcmVmID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAsXG4gICAgICAgIGF0dGFjaGVkID0gX3JlZi5hdHRhY2hlZCxcbiAgICAgICAgb3B0aW9ucyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIFtcImF0dGFjaGVkXCJdKTtcblxuICAgIHZhciBfZ2V0V2hpdGVzcGFjZVN5bWJvbHMgPSBnZXRXaGl0ZXNwYWNlU3ltYm9scyhvcHRpb25zKSxcbiAgICAgICAgbGluZWJyZWFrID0gX2dldFdoaXRlc3BhY2VTeW1ib2xzLmxpbmVicmVhaztcblxuICAgIHZhciBjc3MgPSAnJztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yZWdpc3RyeS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNoZWV0ID0gdGhpcy5yZWdpc3RyeVtpXTtcblxuICAgICAgaWYgKGF0dGFjaGVkICE9IG51bGwgJiYgc2hlZXQuYXR0YWNoZWQgIT09IGF0dGFjaGVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY3NzKSBjc3MgKz0gbGluZWJyZWFrO1xuICAgICAgY3NzICs9IHNoZWV0LnRvU3RyaW5nKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHJldHVybiBjc3M7XG4gIH07XG5cbiAgX2NyZWF0ZUNsYXNzKFNoZWV0c1JlZ2lzdHJ5LCBbe1xuICAgIGtleTogXCJpbmRleFwiLFxuXG4gICAgLyoqXG4gICAgICogQ3VycmVudCBoaWdoZXN0IGluZGV4IG51bWJlci5cbiAgICAgKi9cbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5Lmxlbmd0aCA9PT0gMCA/IDAgOiB0aGlzLnJlZ2lzdHJ5W3RoaXMucmVnaXN0cnkubGVuZ3RoIC0gMV0ub3B0aW9ucy5pbmRleDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2hlZXRzUmVnaXN0cnk7XG59KCk7XG5cbi8qKlxuICogVGhpcyBpcyBhIGdsb2JhbCBzaGVldHMgcmVnaXN0cnkuIE9ubHkgRG9tUmVuZGVyZXIgd2lsbCBhZGQgc2hlZXRzIHRvIGl0LlxuICogT24gdGhlIHNlcnZlciBvbmUgc2hvdWxkIHVzZSBhbiBvd24gU2hlZXRzUmVnaXN0cnkgaW5zdGFuY2UgYW5kIGFkZCB0aGVcbiAqIHNoZWV0cyB0byBpdCwgYmVjYXVzZSB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdG8gY3JlYXRlIGEgbmV3IHJlZ2lzdHJ5IGZvclxuICogZWFjaCByZXF1ZXN0IGluIG9yZGVyIHRvIG5vdCBsZWFrIHNoZWV0cyBhY3Jvc3MgcmVxdWVzdHMuXG4gKi9cblxudmFyIHNoZWV0cyA9IG5ldyBTaGVldHNSZWdpc3RyeSgpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG4vKipcbiAqIE5vdyB0aGF0IGBnbG9iYWxUaGlzYCBpcyBhdmFpbGFibGUgb24gbW9zdCBwbGF0Zm9ybXNcbiAqIChodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9nbG9iYWxUaGlzI2Jyb3dzZXJfY29tcGF0aWJpbGl0eSlcbiAqIHdlIGNoZWNrIGZvciBgZ2xvYmFsVGhpc2AgZmlyc3QuIGBnbG9iYWxUaGlzYCBpcyBuZWNlc3NhcnkgZm9yIGpzc1xuICogdG8gcnVuIGluIEFnb3JpYydzIHNlY3VyZSB2ZXJzaW9uIG9mIEphdmFTY3JpcHQgKFNFUykuIFVuZGVyIFNFUyxcbiAqIGBnbG9iYWxUaGlzYCBleGlzdHMsIGJ1dCBgd2luZG93YCwgYHNlbGZgLCBhbmQgYEZ1bmN0aW9uKCdyZXR1cm5cbiAqIHRoaXMnKSgpYCBhcmUgYWxsIHVuZGVmaW5lZCBmb3Igc2VjdXJpdHkgcmVhc29ucy5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxuICovXG52YXIgZ2xvYmFsVGhpcyQxID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09PSBNYXRoID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PT0gTWF0aCA/IHNlbGYgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG52YXIgbnMgPSAnMmYxYWNjNmMzYTYwNmIwODJlNWVlZjVlNTQ0MTRmZmInO1xuaWYgKGdsb2JhbFRoaXMkMVtuc10gPT0gbnVsbCkgZ2xvYmFsVGhpcyQxW25zXSA9IDA7IC8vIEJ1bmRsZSBtYXkgY29udGFpbiBtdWx0aXBsZSBKU1MgdmVyc2lvbnMgYXQgdGhlIHNhbWUgdGltZS4gSW4gb3JkZXIgdG8gaWRlbnRpZnlcbi8vIHRoZSBjdXJyZW50IHZlcnNpb24gd2l0aCBqdXN0IG9uZSBzaG9ydCBudW1iZXIgYW5kIHVzZSBpdCBmb3IgY2xhc3NlcyBnZW5lcmF0aW9uXG4vLyB3ZSB1c2UgYSBjb3VudGVyLiBBbHNvIGl0IGlzIG1vcmUgYWNjdXJhdGUsIGJlY2F1c2UgdXNlciBjYW4gbWFudWFsbHkgcmVldmFsdWF0ZVxuLy8gdGhlIG1vZHVsZS5cblxudmFyIG1vZHVsZUlkID0gZ2xvYmFsVGhpcyQxW25zXSsrO1xuXG52YXIgbWF4UnVsZXMgPSAxZTEwO1xuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gd2hpY2ggZ2VuZXJhdGVzIHVuaXF1ZSBjbGFzcyBuYW1lcyBiYXNlZCBvbiBjb3VudGVycy5cbiAqIFdoZW4gbmV3IGdlbmVyYXRvciBmdW5jdGlvbiBpcyBjcmVhdGVkLCBydWxlIGNvdW50ZXIgaXMgcmVzZXRlZC5cbiAqIFdlIG5lZWQgdG8gcmVzZXQgdGhlIHJ1bGUgY291bnRlciBmb3IgU1NSIGZvciBlYWNoIHJlcXVlc3QuXG4gKi9cblxudmFyIGNyZWF0ZUdlbmVyYXRlSWQgPSBmdW5jdGlvbiBjcmVhdGVHZW5lcmF0ZUlkKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBydWxlQ291bnRlciA9IDA7XG5cbiAgdmFyIGdlbmVyYXRlSWQgPSBmdW5jdGlvbiBnZW5lcmF0ZUlkKHJ1bGUsIHNoZWV0KSB7XG4gICAgcnVsZUNvdW50ZXIgKz0gMTtcblxuICAgIGlmIChydWxlQ291bnRlciA+IG1heFJ1bGVzKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCBcIltKU1NdIFlvdSBtaWdodCBoYXZlIGEgbWVtb3J5IGxlYWsuIFJ1bGUgY291bnRlciBpcyBhdCBcIiArIHJ1bGVDb3VudGVyICsgXCIuXCIpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHZhciBqc3NJZCA9ICcnO1xuICAgIHZhciBwcmVmaXggPSAnJztcblxuICAgIGlmIChzaGVldCkge1xuICAgICAgaWYgKHNoZWV0Lm9wdGlvbnMuY2xhc3NOYW1lUHJlZml4KSB7XG4gICAgICAgIHByZWZpeCA9IHNoZWV0Lm9wdGlvbnMuY2xhc3NOYW1lUHJlZml4O1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hlZXQub3B0aW9ucy5qc3MuaWQgIT0gbnVsbCkge1xuICAgICAgICBqc3NJZCA9IFN0cmluZyhzaGVldC5vcHRpb25zLmpzcy5pZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubWluaWZ5KSB7XG4gICAgICAvLyBVc2luZyBcImNcIiBiZWNhdXNlIGEgbnVtYmVyIGNhbid0IGJlIHRoZSBmaXJzdCBjaGFyIGluIGEgY2xhc3MgbmFtZS5cbiAgICAgIHJldHVybiBcIlwiICsgKHByZWZpeCB8fCAnYycpICsgbW9kdWxlSWQgKyBqc3NJZCArIHJ1bGVDb3VudGVyO1xuICAgIH1cblxuICAgIHJldHVybiBwcmVmaXggKyBydWxlLmtleSArIFwiLVwiICsgbW9kdWxlSWQgKyAoanNzSWQgPyBcIi1cIiArIGpzc0lkIDogJycpICsgXCItXCIgKyBydWxlQ291bnRlcjtcbiAgfTtcblxuICByZXR1cm4gZ2VuZXJhdGVJZDtcbn07XG5cbi8qKlxuICogQ2FjaGUgdGhlIHZhbHVlIGZyb20gdGhlIGZpcnN0IHRpbWUgYSBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKi9cblxudmFyIG1lbW9pemUgPSBmdW5jdGlvbiBtZW1vaXplKGZuKSB7XG4gIHZhciB2YWx1ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXZhbHVlKSB2YWx1ZSA9IGZuKCk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xufTtcbi8qKlxuICogR2V0IGEgc3R5bGUgcHJvcGVydHkgdmFsdWUuXG4gKi9cblxuXG52YXIgZ2V0UHJvcGVydHlWYWx1ZSA9IGZ1bmN0aW9uIGdldFByb3BlcnR5VmFsdWUoY3NzUnVsZSwgcHJvcCkge1xuICB0cnkge1xuICAgIC8vIFN1cHBvcnQgQ1NTVE9NLlxuICAgIGlmIChjc3NSdWxlLmF0dHJpYnV0ZVN0eWxlTWFwKSB7XG4gICAgICByZXR1cm4gY3NzUnVsZS5hdHRyaWJ1dGVTdHlsZU1hcC5nZXQocHJvcCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNzc1J1bGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShwcm9wKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gSUUgbWF5IHRocm93IGlmIHByb3BlcnR5IGlzIHVua25vd24uXG4gICAgcmV0dXJuICcnO1xuICB9XG59O1xuLyoqXG4gKiBTZXQgYSBzdHlsZSBwcm9wZXJ0eS5cbiAqL1xuXG5cbnZhciBzZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIHNldFByb3BlcnR5KGNzc1J1bGUsIHByb3AsIHZhbHVlKSB7XG4gIHRyeSB7XG4gICAgdmFyIGNzc1ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIGNzc1ZhbHVlID0gdG9Dc3NWYWx1ZSh2YWx1ZSk7XG4gICAgfSAvLyBTdXBwb3J0IENTU1RPTS5cblxuXG4gICAgaWYgKGNzc1J1bGUuYXR0cmlidXRlU3R5bGVNYXApIHtcbiAgICAgIGNzc1J1bGUuYXR0cmlidXRlU3R5bGVNYXAuc2V0KHByb3AsIGNzc1ZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGluZGV4T2ZJbXBvcnRhbnRGbGFnID0gY3NzVmFsdWUgPyBjc3NWYWx1ZS5pbmRleE9mKCchaW1wb3J0YW50JykgOiAtMTtcbiAgICAgIHZhciBjc3NWYWx1ZVdpdGhvdXRJbXBvcnRhbnRGbGFnID0gaW5kZXhPZkltcG9ydGFudEZsYWcgPiAtMSA/IGNzc1ZhbHVlLnN1YnN0cigwLCBpbmRleE9mSW1wb3J0YW50RmxhZyAtIDEpIDogY3NzVmFsdWU7XG4gICAgICBjc3NSdWxlLnN0eWxlLnNldFByb3BlcnR5KHByb3AsIGNzc1ZhbHVlV2l0aG91dEltcG9ydGFudEZsYWcsIGluZGV4T2ZJbXBvcnRhbnRGbGFnID4gLTEgPyAnaW1wb3J0YW50JyA6ICcnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIElFIG1heSB0aHJvdyBpZiBwcm9wZXJ0eSBpcyB1bmtub3duLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbi8qKlxuICogUmVtb3ZlIGEgc3R5bGUgcHJvcGVydHkuXG4gKi9cblxuXG52YXIgcmVtb3ZlUHJvcGVydHkgPSBmdW5jdGlvbiByZW1vdmVQcm9wZXJ0eShjc3NSdWxlLCBwcm9wKSB7XG4gIHRyeSB7XG4gICAgLy8gU3VwcG9ydCBDU1NUT00uXG4gICAgaWYgKGNzc1J1bGUuYXR0cmlidXRlU3R5bGVNYXApIHtcbiAgICAgIGNzc1J1bGUuYXR0cmlidXRlU3R5bGVNYXAuZGVsZXRlKHByb3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjc3NSdWxlLnN0eWxlLnJlbW92ZVByb3BlcnR5KHByb3ApO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgXCJbSlNTXSBET01FeGNlcHRpb24gXFxcIlwiICsgZXJyLm1lc3NhZ2UgKyBcIlxcXCIgd2FzIHRocm93bi4gVHJpZWQgdG8gcmVtb3ZlIHByb3BlcnR5IFxcXCJcIiArIHByb3AgKyBcIlxcXCIuXCIpIDogdm9pZCAwO1xuICB9XG59O1xuLyoqXG4gKiBTZXQgdGhlIHNlbGVjdG9yLlxuICovXG5cblxudmFyIHNldFNlbGVjdG9yID0gZnVuY3Rpb24gc2V0U2VsZWN0b3IoY3NzUnVsZSwgc2VsZWN0b3JUZXh0KSB7XG4gIGNzc1J1bGUuc2VsZWN0b3JUZXh0ID0gc2VsZWN0b3JUZXh0OyAvLyBSZXR1cm4gZmFsc2UgaWYgc2V0dGVyIHdhcyBub3Qgc3VjY2Vzc2Z1bC5cbiAgLy8gQ3VycmVudGx5IHdvcmtzIGluIGNocm9tZSBvbmx5LlxuXG4gIHJldHVybiBjc3NSdWxlLnNlbGVjdG9yVGV4dCA9PT0gc2VsZWN0b3JUZXh0O1xufTtcbi8qKlxuICogR2V0cyB0aGUgYGhlYWRgIGVsZW1lbnQgdXBvbiB0aGUgZmlyc3QgY2FsbCBhbmQgY2FjaGVzIGl0LlxuICogV2UgYXNzdW1lIGl0IGNhbid0IGJlIG51bGwuXG4gKi9cblxuXG52YXIgZ2V0SGVhZCA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCcpO1xufSk7XG4vKipcbiAqIEZpbmQgYXR0YWNoZWQgc2hlZXQgd2l0aCBhbiBpbmRleCBoaWdoZXIgdGhhbiB0aGUgcGFzc2VkIG9uZS5cbiAqL1xuXG5mdW5jdGlvbiBmaW5kSGlnaGVyU2hlZXQocmVnaXN0cnksIG9wdGlvbnMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWdpc3RyeS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzaGVldCA9IHJlZ2lzdHJ5W2ldO1xuXG4gICAgaWYgKHNoZWV0LmF0dGFjaGVkICYmIHNoZWV0Lm9wdGlvbnMuaW5kZXggPiBvcHRpb25zLmluZGV4ICYmIHNoZWV0Lm9wdGlvbnMuaW5zZXJ0aW9uUG9pbnQgPT09IG9wdGlvbnMuaW5zZXJ0aW9uUG9pbnQpIHtcbiAgICAgIHJldHVybiBzaGVldDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogRmluZCBhdHRhY2hlZCBzaGVldCB3aXRoIHRoZSBoaWdoZXN0IGluZGV4LlxuICovXG5cblxuZnVuY3Rpb24gZmluZEhpZ2hlc3RTaGVldChyZWdpc3RyeSwgb3B0aW9ucykge1xuICBmb3IgKHZhciBpID0gcmVnaXN0cnkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgc2hlZXQgPSByZWdpc3RyeVtpXTtcblxuICAgIGlmIChzaGVldC5hdHRhY2hlZCAmJiBzaGVldC5vcHRpb25zLmluc2VydGlvblBvaW50ID09PSBvcHRpb25zLmluc2VydGlvblBvaW50KSB7XG4gICAgICByZXR1cm4gc2hlZXQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIEZpbmQgYSBjb21tZW50IHdpdGggXCJqc3NcIiBpbnNpZGUuXG4gKi9cblxuXG5mdW5jdGlvbiBmaW5kQ29tbWVudE5vZGUodGV4dCkge1xuICB2YXIgaGVhZCA9IGdldEhlYWQoKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGhlYWQuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBub2RlID0gaGVhZC5jaGlsZE5vZGVzW2ldO1xuXG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDggJiYgbm9kZS5ub2RlVmFsdWUudHJpbSgpID09PSB0ZXh0KSB7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbi8qKlxuICogRmluZCBhIG5vZGUgYmVmb3JlIHdoaWNoIHdlIGNhbiBpbnNlcnQgdGhlIHNoZWV0LlxuICovXG5cblxuZnVuY3Rpb24gZmluZFByZXZOb2RlKG9wdGlvbnMpIHtcbiAgdmFyIHJlZ2lzdHJ5ID0gc2hlZXRzLnJlZ2lzdHJ5O1xuXG4gIGlmIChyZWdpc3RyeS5sZW5ndGggPiAwKSB7XG4gICAgLy8gVHJ5IHRvIGluc2VydCBiZWZvcmUgdGhlIG5leHQgaGlnaGVyIHNoZWV0LlxuICAgIHZhciBzaGVldCA9IGZpbmRIaWdoZXJTaGVldChyZWdpc3RyeSwgb3B0aW9ucyk7XG5cbiAgICBpZiAoc2hlZXQgJiYgc2hlZXQucmVuZGVyZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhcmVudDogc2hlZXQucmVuZGVyZXIuZWxlbWVudC5wYXJlbnROb2RlLFxuICAgICAgICBub2RlOiBzaGVldC5yZW5kZXJlci5lbGVtZW50XG4gICAgICB9O1xuICAgIH0gLy8gT3RoZXJ3aXNlIGluc2VydCBhZnRlciB0aGUgbGFzdCBhdHRhY2hlZC5cblxuXG4gICAgc2hlZXQgPSBmaW5kSGlnaGVzdFNoZWV0KHJlZ2lzdHJ5LCBvcHRpb25zKTtcblxuICAgIGlmIChzaGVldCAmJiBzaGVldC5yZW5kZXJlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFyZW50OiBzaGVldC5yZW5kZXJlci5lbGVtZW50LnBhcmVudE5vZGUsXG4gICAgICAgIG5vZGU6IHNoZWV0LnJlbmRlcmVyLmVsZW1lbnQubmV4dFNpYmxpbmdcbiAgICAgIH07XG4gICAgfVxuICB9IC8vIFRyeSB0byBmaW5kIGEgY29tbWVudCBwbGFjZWhvbGRlciBpZiByZWdpc3RyeSBpcyBlbXB0eS5cblxuXG4gIHZhciBpbnNlcnRpb25Qb2ludCA9IG9wdGlvbnMuaW5zZXJ0aW9uUG9pbnQ7XG5cbiAgaWYgKGluc2VydGlvblBvaW50ICYmIHR5cGVvZiBpbnNlcnRpb25Qb2ludCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgY29tbWVudCA9IGZpbmRDb21tZW50Tm9kZShpbnNlcnRpb25Qb2ludCk7XG5cbiAgICBpZiAoY29tbWVudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGFyZW50OiBjb21tZW50LnBhcmVudE5vZGUsXG4gICAgICAgIG5vZGU6IGNvbW1lbnQubmV4dFNpYmxpbmdcbiAgICAgIH07XG4gICAgfSAvLyBJZiB1c2VyIHNwZWNpZmllcyBhbiBpbnNlcnRpb24gcG9pbnQgYW5kIGl0IGNhbid0IGJlIGZvdW5kIGluIHRoZSBkb2N1bWVudCAtXG4gICAgLy8gYmFkIHNwZWNpZmljaXR5IGlzc3VlcyBtYXkgYXBwZWFyLlxuXG5cbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCBcIltKU1NdIEluc2VydGlvbiBwb2ludCBcXFwiXCIgKyBpbnNlcnRpb25Qb2ludCArIFwiXFxcIiBub3QgZm91bmQuXCIpIDogdm9pZCAwO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuLyoqXG4gKiBJbnNlcnQgc3R5bGUgZWxlbWVudCBpbnRvIHRoZSBET00uXG4gKi9cblxuXG5mdW5jdGlvbiBpbnNlcnRTdHlsZShzdHlsZSwgb3B0aW9ucykge1xuICB2YXIgaW5zZXJ0aW9uUG9pbnQgPSBvcHRpb25zLmluc2VydGlvblBvaW50O1xuICB2YXIgbmV4dE5vZGUgPSBmaW5kUHJldk5vZGUob3B0aW9ucyk7XG5cbiAgaWYgKG5leHROb2RlICE9PSBmYWxzZSAmJiBuZXh0Tm9kZS5wYXJlbnQpIHtcbiAgICBuZXh0Tm9kZS5wYXJlbnQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBuZXh0Tm9kZS5ub2RlKTtcbiAgICByZXR1cm47XG4gIH0gLy8gV29ya3Mgd2l0aCBpZnJhbWVzIGFuZCBhbnkgbm9kZSB0eXBlcy5cblxuXG4gIGlmIChpbnNlcnRpb25Qb2ludCAmJiB0eXBlb2YgaW5zZXJ0aW9uUG9pbnQubm9kZVR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgdmFyIGluc2VydGlvblBvaW50RWxlbWVudCA9IGluc2VydGlvblBvaW50O1xuICAgIHZhciBwYXJlbnROb2RlID0gaW5zZXJ0aW9uUG9pbnRFbGVtZW50LnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudE5vZGUpIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHN0eWxlLCBpbnNlcnRpb25Qb2ludEVsZW1lbnQubmV4dFNpYmxpbmcpO2Vsc2UgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgJ1tKU1NdIEluc2VydGlvbiBwb2ludCBpcyBub3QgaW4gdGhlIERPTS4nKSA6IHZvaWQgMDtcbiAgICByZXR1cm47XG4gIH1cblxuICBnZXRIZWFkKCkuYXBwZW5kQ2hpbGQoc3R5bGUpO1xufVxuLyoqXG4gKiBSZWFkIGpzcyBub25jZSBzZXR0aW5nIGZyb20gdGhlIHBhZ2UgaWYgdGhlIHVzZXIgaGFzIHNldCBpdC5cbiAqL1xuXG5cbnZhciBnZXROb25jZSA9IG1lbW9pemUoZnVuY3Rpb24gKCkge1xuICB2YXIgbm9kZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbcHJvcGVydHk9XCJjc3Atbm9uY2VcIl0nKTtcbiAgcmV0dXJuIG5vZGUgPyBub2RlLmdldEF0dHJpYnV0ZSgnY29udGVudCcpIDogbnVsbDtcbn0pO1xuXG52YXIgX2luc2VydFJ1bGUgPSBmdW5jdGlvbiBpbnNlcnRSdWxlKGNvbnRhaW5lciwgcnVsZSwgaW5kZXgpIHtcbiAgdHJ5IHtcbiAgICBpZiAoJ2luc2VydFJ1bGUnIGluIGNvbnRhaW5lcikge1xuICAgICAgY29udGFpbmVyLmluc2VydFJ1bGUocnVsZSwgaW5kZXgpO1xuICAgIH0gLy8gS2V5ZnJhbWVzIHJ1bGUuXG4gICAgZWxzZSBpZiAoJ2FwcGVuZFJ1bGUnIGluIGNvbnRhaW5lcikge1xuICAgICAgICBjb250YWluZXIuYXBwZW5kUnVsZShydWxlKTtcbiAgICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmYWxzZSwgXCJbSlNTXSBcIiArIGVyci5tZXNzYWdlKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gY29udGFpbmVyLmNzc1J1bGVzW2luZGV4XTtcbn07XG5cbnZhciBnZXRWYWxpZFJ1bGVJbnNlcnRpb25JbmRleCA9IGZ1bmN0aW9uIGdldFZhbGlkUnVsZUluc2VydGlvbkluZGV4KGNvbnRhaW5lciwgaW5kZXgpIHtcbiAgdmFyIG1heEluZGV4ID0gY29udGFpbmVyLmNzc1J1bGVzLmxlbmd0aDsgLy8gSW4gY2FzZSBwcmV2aW91cyBpbnNlcnRpb24gZmFpbHMsIHBhc3NlZCBpbmRleCBtaWdodCBiZSB3cm9uZ1xuXG4gIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkIHx8IGluZGV4ID4gbWF4SW5kZXgpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICByZXR1cm4gbWF4SW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuXG52YXIgY3JlYXRlU3R5bGUgPSBmdW5jdGlvbiBjcmVhdGVTdHlsZSgpIHtcbiAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsgLy8gV2l0aG91dCBpdCwgSUUgd2lsbCBoYXZlIGEgYnJva2VuIHNvdXJjZSBvcmRlciBzcGVjaWZpY2l0eSBpZiB3ZVxuICAvLyBpbnNlcnQgcnVsZXMgYWZ0ZXIgd2UgaW5zZXJ0IHRoZSBzdHlsZSB0YWcuXG4gIC8vIEl0IHNlZW1zIHRvIGtpY2stb2ZmIHRoZSBzb3VyY2Ugb3JkZXIgc3BlY2lmaWNpdHkgYWxnb3JpdGhtLlxuXG4gIGVsLnRleHRDb250ZW50ID0gJ1xcbic7XG4gIHJldHVybiBlbDtcbn07XG5cbnZhciBEb21SZW5kZXJlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8vIFdpbGwgYmUgZW1wdHkgaWYgbGluazogdHJ1ZSBvcHRpb24gaXMgbm90IHNldCwgYmVjYXVzZVxuICAvLyBpdCBpcyBvbmx5IGZvciB1c2UgdG9nZXRoZXIgd2l0aCBpbnNlcnRSdWxlIEFQSS5cbiAgZnVuY3Rpb24gRG9tUmVuZGVyZXIoc2hlZXQpIHtcbiAgICB0aGlzLmdldFByb3BlcnR5VmFsdWUgPSBnZXRQcm9wZXJ0eVZhbHVlO1xuICAgIHRoaXMuc2V0UHJvcGVydHkgPSBzZXRQcm9wZXJ0eTtcbiAgICB0aGlzLnJlbW92ZVByb3BlcnR5ID0gcmVtb3ZlUHJvcGVydHk7XG4gICAgdGhpcy5zZXRTZWxlY3RvciA9IHNldFNlbGVjdG9yO1xuICAgIHRoaXMuaGFzSW5zZXJ0ZWRSdWxlcyA9IGZhbHNlO1xuICAgIHRoaXMuY3NzUnVsZXMgPSBbXTtcbiAgICAvLyBUaGVyZSBpcyBubyBzaGVldCB3aGVuIHRoZSByZW5kZXJlciBpcyB1c2VkIGZyb20gYSBzdGFuZGFsb25lIFN0eWxlUnVsZS5cbiAgICBpZiAoc2hlZXQpIHNoZWV0cy5hZGQoc2hlZXQpO1xuICAgIHRoaXMuc2hlZXQgPSBzaGVldDtcblxuICAgIHZhciBfcmVmID0gdGhpcy5zaGVldCA/IHRoaXMuc2hlZXQub3B0aW9ucyA6IHt9LFxuICAgICAgICBtZWRpYSA9IF9yZWYubWVkaWEsXG4gICAgICAgIG1ldGEgPSBfcmVmLm1ldGEsXG4gICAgICAgIGVsZW1lbnQgPSBfcmVmLmVsZW1lbnQ7XG5cbiAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50IHx8IGNyZWF0ZVN0eWxlKCk7XG4gICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1qc3MnLCAnJyk7XG4gICAgaWYgKG1lZGlhKSB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCdtZWRpYScsIG1lZGlhKTtcbiAgICBpZiAobWV0YSkgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1tZXRhJywgbWV0YSk7XG4gICAgdmFyIG5vbmNlID0gZ2V0Tm9uY2UoKTtcbiAgICBpZiAobm9uY2UpIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpO1xuICB9XG4gIC8qKlxuICAgKiBJbnNlcnQgc3R5bGUgZWxlbWVudCBpbnRvIHJlbmRlciB0cmVlLlxuICAgKi9cblxuXG4gIHZhciBfcHJvdG8gPSBEb21SZW5kZXJlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmF0dGFjaCA9IGZ1bmN0aW9uIGF0dGFjaCgpIHtcbiAgICAvLyBJbiB0aGUgY2FzZSB0aGUgZWxlbWVudCBub2RlIGlzIGV4dGVybmFsIGFuZCBpdCBpcyBhbHJlYWR5IGluIHRoZSBET00uXG4gICAgaWYgKHRoaXMuZWxlbWVudC5wYXJlbnROb2RlIHx8ICF0aGlzLnNoZWV0KSByZXR1cm47XG4gICAgaW5zZXJ0U3R5bGUodGhpcy5lbGVtZW50LCB0aGlzLnNoZWV0Lm9wdGlvbnMpOyAvLyBXaGVuIHJ1bGVzIGFyZSBpbnNlcnRlZCB1c2luZyBgaW5zZXJ0UnVsZWAgQVBJLCBhZnRlciBgc2hlZXQuZGV0YWNoKCkuYXR0YWNoKClgXG4gICAgLy8gbW9zdCBicm93c2VycyBjcmVhdGUgYSBuZXcgQ1NTU3R5bGVTaGVldCwgZXhjZXB0IG9mIGFsbCBJRXMuXG5cbiAgICB2YXIgZGVwbG95ZWQgPSBCb29sZWFuKHRoaXMuc2hlZXQgJiYgdGhpcy5zaGVldC5kZXBsb3llZCk7XG5cbiAgICBpZiAodGhpcy5oYXNJbnNlcnRlZFJ1bGVzICYmIGRlcGxveWVkKSB7XG4gICAgICB0aGlzLmhhc0luc2VydGVkUnVsZXMgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVwbG95KCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZW1vdmUgc3R5bGUgZWxlbWVudCBmcm9tIHJlbmRlciB0cmVlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5kZXRhY2ggPSBmdW5jdGlvbiBkZXRhY2goKSB7XG4gICAgaWYgKCF0aGlzLnNoZWV0KSByZXR1cm47XG4gICAgdmFyIHBhcmVudE5vZGUgPSB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICBpZiAocGFyZW50Tm9kZSkgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQpOyAvLyBJbiB0aGUgbW9zdCBicm93c2VycywgcnVsZXMgaW5zZXJ0ZWQgdXNpbmcgaW5zZXJ0UnVsZSgpIEFQSSB3aWxsIGJlIGxvc3Qgd2hlbiBzdHlsZSBlbGVtZW50IGlzIHJlbW92ZWQuXG4gICAgLy8gVGhvdWdoIElFIHdpbGwga2VlcCB0aGVtIGFuZCB3ZSBuZWVkIGEgY29uc2lzdGVudCBiZWhhdmlvci5cblxuICAgIGlmICh0aGlzLnNoZWV0Lm9wdGlvbnMubGluaykge1xuICAgICAgdGhpcy5jc3NSdWxlcyA9IFtdO1xuICAgICAgdGhpcy5lbGVtZW50LnRleHRDb250ZW50ID0gJ1xcbic7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBJbmplY3QgQ1NTIHN0cmluZyBpbnRvIGVsZW1lbnQuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmRlcGxveSA9IGZ1bmN0aW9uIGRlcGxveSgpIHtcbiAgICB2YXIgc2hlZXQgPSB0aGlzLnNoZWV0O1xuICAgIGlmICghc2hlZXQpIHJldHVybjtcblxuICAgIGlmIChzaGVldC5vcHRpb25zLmxpbmspIHtcbiAgICAgIHRoaXMuaW5zZXJ0UnVsZXMoc2hlZXQucnVsZXMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZWxlbWVudC50ZXh0Q29udGVudCA9IFwiXFxuXCIgKyBzaGVldC50b1N0cmluZygpICsgXCJcXG5cIjtcbiAgfVxuICAvKipcbiAgICogSW5zZXJ0IFJ1bGVMaXN0IGludG8gYW4gZWxlbWVudC5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uaW5zZXJ0UnVsZXMgPSBmdW5jdGlvbiBpbnNlcnRSdWxlcyhydWxlcywgbmF0aXZlUGFyZW50KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBydWxlcy5pbmRleC5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5pbnNlcnRSdWxlKHJ1bGVzLmluZGV4W2ldLCBpLCBuYXRpdmVQYXJlbnQpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogSW5zZXJ0IGEgcnVsZSBpbnRvIGVsZW1lbnQuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmluc2VydFJ1bGUgPSBmdW5jdGlvbiBpbnNlcnRSdWxlKHJ1bGUsIGluZGV4LCBuYXRpdmVQYXJlbnQpIHtcbiAgICBpZiAobmF0aXZlUGFyZW50ID09PSB2b2lkIDApIHtcbiAgICAgIG5hdGl2ZVBhcmVudCA9IHRoaXMuZWxlbWVudC5zaGVldDtcbiAgICB9XG5cbiAgICBpZiAocnVsZS5ydWxlcykge1xuICAgICAgdmFyIHBhcmVudCA9IHJ1bGU7XG4gICAgICB2YXIgbGF0ZXN0TmF0aXZlUGFyZW50ID0gbmF0aXZlUGFyZW50O1xuXG4gICAgICBpZiAocnVsZS50eXBlID09PSAnY29uZGl0aW9uYWwnIHx8IHJ1bGUudHlwZSA9PT0gJ2tleWZyYW1lcycpIHtcbiAgICAgICAgdmFyIF9pbnNlcnRpb25JbmRleCA9IGdldFZhbGlkUnVsZUluc2VydGlvbkluZGV4KG5hdGl2ZVBhcmVudCwgaW5kZXgpOyAvLyBXZSBuZWVkIHRvIHJlbmRlciB0aGUgY29udGFpbmVyIHdpdGhvdXQgY2hpbGRyZW4gZmlyc3QuXG5cblxuICAgICAgICBsYXRlc3ROYXRpdmVQYXJlbnQgPSBfaW5zZXJ0UnVsZShuYXRpdmVQYXJlbnQsIHBhcmVudC50b1N0cmluZyh7XG4gICAgICAgICAgY2hpbGRyZW46IGZhbHNlXG4gICAgICAgIH0pLCBfaW5zZXJ0aW9uSW5kZXgpO1xuXG4gICAgICAgIGlmIChsYXRlc3ROYXRpdmVQYXJlbnQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZWZDc3NSdWxlKHJ1bGUsIF9pbnNlcnRpb25JbmRleCwgbGF0ZXN0TmF0aXZlUGFyZW50KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbnNlcnRSdWxlcyhwYXJlbnQucnVsZXMsIGxhdGVzdE5hdGl2ZVBhcmVudCk7XG4gICAgICByZXR1cm4gbGF0ZXN0TmF0aXZlUGFyZW50O1xuICAgIH1cblxuICAgIHZhciBydWxlU3RyID0gcnVsZS50b1N0cmluZygpO1xuICAgIGlmICghcnVsZVN0cikgcmV0dXJuIGZhbHNlO1xuICAgIHZhciBpbnNlcnRpb25JbmRleCA9IGdldFZhbGlkUnVsZUluc2VydGlvbkluZGV4KG5hdGl2ZVBhcmVudCwgaW5kZXgpO1xuXG4gICAgdmFyIG5hdGl2ZVJ1bGUgPSBfaW5zZXJ0UnVsZShuYXRpdmVQYXJlbnQsIHJ1bGVTdHIsIGluc2VydGlvbkluZGV4KTtcblxuICAgIGlmIChuYXRpdmVSdWxlID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuaGFzSW5zZXJ0ZWRSdWxlcyA9IHRydWU7XG4gICAgdGhpcy5yZWZDc3NSdWxlKHJ1bGUsIGluc2VydGlvbkluZGV4LCBuYXRpdmVSdWxlKTtcbiAgICByZXR1cm4gbmF0aXZlUnVsZTtcbiAgfTtcblxuICBfcHJvdG8ucmVmQ3NzUnVsZSA9IGZ1bmN0aW9uIHJlZkNzc1J1bGUocnVsZSwgaW5kZXgsIGNzc1J1bGUpIHtcbiAgICBydWxlLnJlbmRlcmFibGUgPSBjc3NSdWxlOyAvLyBXZSBvbmx5IHdhbnQgdG8gcmVmZXJlbmNlIHRoZSB0b3AgbGV2ZWwgcnVsZXMsIGRlbGV0ZVJ1bGUgQVBJIGRvZXNuJ3Qgc3VwcG9ydCByZW1vdmluZyBuZXN0ZWQgcnVsZXNcbiAgICAvLyBsaWtlIHJ1bGVzIGluc2lkZSBtZWRpYSBxdWVyaWVzIG9yIGtleWZyYW1lc1xuXG4gICAgaWYgKHJ1bGUub3B0aW9ucy5wYXJlbnQgaW5zdGFuY2VvZiBTdHlsZVNoZWV0KSB7XG4gICAgICB0aGlzLmNzc1J1bGVzLnNwbGljZShpbmRleCwgMCwgY3NzUnVsZSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBEZWxldGUgYSBydWxlLlxuICAgKi9cbiAgO1xuXG4gIF9wcm90by5kZWxldGVSdWxlID0gZnVuY3Rpb24gZGVsZXRlUnVsZShjc3NSdWxlKSB7XG4gICAgdmFyIHNoZWV0ID0gdGhpcy5lbGVtZW50LnNoZWV0O1xuICAgIHZhciBpbmRleCA9IHRoaXMuaW5kZXhPZihjc3NSdWxlKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgc2hlZXQuZGVsZXRlUnVsZShpbmRleCk7XG4gICAgdGhpcy5jc3NSdWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgaW5kZXggb2YgYSBDU1MgUnVsZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YoY3NzUnVsZSkge1xuICAgIHJldHVybiB0aGlzLmNzc1J1bGVzLmluZGV4T2YoY3NzUnVsZSk7XG4gIH1cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgbmV3IENTUyBydWxlIGFuZCByZXBsYWNlIHRoZSBleGlzdGluZyBvbmUuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJlcGxhY2VSdWxlID0gZnVuY3Rpb24gcmVwbGFjZVJ1bGUoY3NzUnVsZSwgcnVsZSkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuaW5kZXhPZihjc3NSdWxlKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5lbGVtZW50LnNoZWV0LmRlbGV0ZVJ1bGUoaW5kZXgpO1xuICAgIHRoaXMuY3NzUnVsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICByZXR1cm4gdGhpcy5pbnNlcnRSdWxlKHJ1bGUsIGluZGV4KTtcbiAgfVxuICAvKipcbiAgICogR2V0IGFsbCBydWxlcyBlbGVtZW50cy5cbiAgICovXG4gIDtcblxuICBfcHJvdG8uZ2V0UnVsZXMgPSBmdW5jdGlvbiBnZXRSdWxlcygpIHtcbiAgICByZXR1cm4gdGhpcy5lbGVtZW50LnNoZWV0LmNzc1J1bGVzO1xuICB9O1xuXG4gIHJldHVybiBEb21SZW5kZXJlcjtcbn0oKTtcblxudmFyIGluc3RhbmNlQ291bnRlciA9IDA7XG5cbnZhciBKc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBKc3Mob3B0aW9ucykge1xuICAgIHRoaXMuaWQgPSBpbnN0YW5jZUNvdW50ZXIrKztcbiAgICB0aGlzLnZlcnNpb24gPSBcIjEwLjEwLjBcIjtcbiAgICB0aGlzLnBsdWdpbnMgPSBuZXcgUGx1Z2luc1JlZ2lzdHJ5KCk7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgaWQ6IHtcbiAgICAgICAgbWluaWZ5OiBmYWxzZVxuICAgICAgfSxcbiAgICAgIGNyZWF0ZUdlbmVyYXRlSWQ6IGNyZWF0ZUdlbmVyYXRlSWQsXG4gICAgICBSZW5kZXJlcjogaXNJbkJyb3dzZXIgPyBEb21SZW5kZXJlciA6IG51bGwsXG4gICAgICBwbHVnaW5zOiBbXVxuICAgIH07XG4gICAgdGhpcy5nZW5lcmF0ZUlkID0gY3JlYXRlR2VuZXJhdGVJZCh7XG4gICAgICBtaW5pZnk6IGZhbHNlXG4gICAgfSk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMucGx1Z2lucy51c2UocGx1Z2luc1tpXSwge1xuICAgICAgICBxdWV1ZTogJ2ludGVybmFsJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5zZXR1cChvcHRpb25zKTtcbiAgfVxuICAvKipcbiAgICogUHJlcGFyZXMgdmFyaW91cyBvcHRpb25zLCBhcHBsaWVzIHBsdWdpbnMuXG4gICAqIFNob3VsZCBub3QgYmUgdXNlZCB0d2ljZSBvbiB0aGUgc2FtZSBpbnN0YW5jZSwgYmVjYXVzZSB0aGVyZSBpcyBubyBwbHVnaW5zXG4gICAqIGRlZHVwbGljYXRpb24gbG9naWMuXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90byA9IEpzcy5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnNldHVwID0gZnVuY3Rpb24gc2V0dXAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5jcmVhdGVHZW5lcmF0ZUlkKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuY3JlYXRlR2VuZXJhdGVJZCA9IG9wdGlvbnMuY3JlYXRlR2VuZXJhdGVJZDtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5pZCkge1xuICAgICAgdGhpcy5vcHRpb25zLmlkID0gX2V4dGVuZHMoe30sIHRoaXMub3B0aW9ucy5pZCwgb3B0aW9ucy5pZCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuY3JlYXRlR2VuZXJhdGVJZCB8fCBvcHRpb25zLmlkKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlSWQgPSB0aGlzLm9wdGlvbnMuY3JlYXRlR2VuZXJhdGVJZCh0aGlzLm9wdGlvbnMuaWQpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmluc2VydGlvblBvaW50ICE9IG51bGwpIHRoaXMub3B0aW9ucy5pbnNlcnRpb25Qb2ludCA9IG9wdGlvbnMuaW5zZXJ0aW9uUG9pbnQ7XG5cbiAgICBpZiAoJ1JlbmRlcmVyJyBpbiBvcHRpb25zKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuUmVuZGVyZXIgPSBvcHRpb25zLlJlbmRlcmVyO1xuICAgIH0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1zcHJlYWRcblxuXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykgdGhpcy51c2UuYXBwbHkodGhpcywgb3B0aW9ucy5wbHVnaW5zKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgU3R5bGUgU2hlZXQuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmNyZWF0ZVN0eWxlU2hlZXQgPSBmdW5jdGlvbiBjcmVhdGVTdHlsZVNoZWV0KHN0eWxlcywgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgICBpbmRleCA9IF9vcHRpb25zLmluZGV4O1xuXG4gICAgaWYgKHR5cGVvZiBpbmRleCAhPT0gJ251bWJlcicpIHtcbiAgICAgIGluZGV4ID0gc2hlZXRzLmluZGV4ID09PSAwID8gMCA6IHNoZWV0cy5pbmRleCArIDE7XG4gICAgfVxuXG4gICAgdmFyIHNoZWV0ID0gbmV3IFN0eWxlU2hlZXQoc3R5bGVzLCBfZXh0ZW5kcyh7fSwgb3B0aW9ucywge1xuICAgICAganNzOiB0aGlzLFxuICAgICAgZ2VuZXJhdGVJZDogb3B0aW9ucy5nZW5lcmF0ZUlkIHx8IHRoaXMuZ2VuZXJhdGVJZCxcbiAgICAgIGluc2VydGlvblBvaW50OiB0aGlzLm9wdGlvbnMuaW5zZXJ0aW9uUG9pbnQsXG4gICAgICBSZW5kZXJlcjogdGhpcy5vcHRpb25zLlJlbmRlcmVyLFxuICAgICAgaW5kZXg6IGluZGV4XG4gICAgfSkpO1xuICAgIHRoaXMucGx1Z2lucy5vblByb2Nlc3NTaGVldChzaGVldCk7XG4gICAgcmV0dXJuIHNoZWV0O1xuICB9XG4gIC8qKlxuICAgKiBEZXRhY2ggdGhlIFN0eWxlIFNoZWV0IGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLnJlbW92ZVN0eWxlU2hlZXQgPSBmdW5jdGlvbiByZW1vdmVTdHlsZVNoZWV0KHNoZWV0KSB7XG4gICAgc2hlZXQuZGV0YWNoKCk7XG4gICAgc2hlZXRzLnJlbW92ZShzaGVldCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJ1bGUgd2l0aG91dCBhIFN0eWxlIFNoZWV0LlxuICAgKiBbRGVwcmVjYXRlZF0gd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24uXG4gICAqL1xuICA7XG5cbiAgX3Byb3RvLmNyZWF0ZVJ1bGUgPSBmdW5jdGlvbiBjcmVhdGVSdWxlJDEobmFtZSwgc3R5bGUsIG9wdGlvbnMpIHtcbiAgICBpZiAoc3R5bGUgPT09IHZvaWQgMCkge1xuICAgICAgc3R5bGUgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgLy8gRW5hYmxlIHJ1bGUgd2l0aG91dCBuYW1lIGZvciBpbmxpbmUgc3R5bGVzLlxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVJ1bGUodW5kZWZpbmVkLCBuYW1lLCBzdHlsZSk7XG4gICAgfVxuXG4gICAgdmFyIHJ1bGVPcHRpb25zID0gX2V4dGVuZHMoe30sIG9wdGlvbnMsIHtcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICBqc3M6IHRoaXMsXG4gICAgICBSZW5kZXJlcjogdGhpcy5vcHRpb25zLlJlbmRlcmVyXG4gICAgfSk7XG5cbiAgICBpZiAoIXJ1bGVPcHRpb25zLmdlbmVyYXRlSWQpIHJ1bGVPcHRpb25zLmdlbmVyYXRlSWQgPSB0aGlzLmdlbmVyYXRlSWQ7XG4gICAgaWYgKCFydWxlT3B0aW9ucy5jbGFzc2VzKSBydWxlT3B0aW9ucy5jbGFzc2VzID0ge307XG4gICAgaWYgKCFydWxlT3B0aW9ucy5rZXlmcmFtZXMpIHJ1bGVPcHRpb25zLmtleWZyYW1lcyA9IHt9O1xuXG4gICAgdmFyIHJ1bGUgPSBjcmVhdGVSdWxlKG5hbWUsIHN0eWxlLCBydWxlT3B0aW9ucyk7XG5cbiAgICBpZiAocnVsZSkgdGhpcy5wbHVnaW5zLm9uUHJvY2Vzc1J1bGUocnVsZSk7XG4gICAgcmV0dXJuIHJ1bGU7XG4gIH1cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHBsdWdpbi4gUGFzc2VkIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCB3aXRoIGEgcnVsZSBpbnN0YW5jZS5cbiAgICovXG4gIDtcblxuICBfcHJvdG8udXNlID0gZnVuY3Rpb24gdXNlKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcGx1Z2lucyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIHBsdWdpbnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIF90aGlzLnBsdWdpbnMudXNlKHBsdWdpbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgcmV0dXJuIEpzcztcbn0oKTtcblxudmFyIGNyZWF0ZUpzcyA9IGZ1bmN0aW9uIGNyZWF0ZUpzcyhvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgSnNzKG9wdGlvbnMpO1xufTtcblxuLyoqXG4gKiBTaGVldHNNYW5hZ2VyIGlzIGxpa2UgYSBXZWFrTWFwIHdoaWNoIGlzIGRlc2lnbmVkIHRvIGNvdW50IFN0eWxlU2hlZXRcbiAqIGluc3RhbmNlcyBhbmQgYXR0YWNoL2RldGFjaCBhdXRvbWF0aWNhbGx5LlxuICogVXNlZCBpbiByZWFjdC1qc3MuXG4gKi9cblxudmFyIFNoZWV0c01hbmFnZXIgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTaGVldHNNYW5hZ2VyKCkge1xuICAgIHRoaXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnNoZWV0cyA9IG5ldyBXZWFrTWFwKCk7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gU2hlZXRzTWFuYWdlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmdldCA9IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICB2YXIgZW50cnkgPSB0aGlzLnNoZWV0cy5nZXQoa2V5KTtcbiAgICByZXR1cm4gZW50cnkgJiYgZW50cnkuc2hlZXQ7XG4gIH07XG5cbiAgX3Byb3RvLmFkZCA9IGZ1bmN0aW9uIGFkZChrZXksIHNoZWV0KSB7XG4gICAgaWYgKHRoaXMuc2hlZXRzLmhhcyhrZXkpKSByZXR1cm47XG4gICAgdGhpcy5sZW5ndGgrKztcbiAgICB0aGlzLnNoZWV0cy5zZXQoa2V5LCB7XG4gICAgICBzaGVldDogc2hlZXQsXG4gICAgICByZWZzOiAwXG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLm1hbmFnZSA9IGZ1bmN0aW9uIG1hbmFnZShrZXkpIHtcbiAgICB2YXIgZW50cnkgPSB0aGlzLnNoZWV0cy5nZXQoa2V5KTtcblxuICAgIGlmIChlbnRyeSkge1xuICAgICAgaWYgKGVudHJ5LnJlZnMgPT09IDApIHtcbiAgICAgICAgZW50cnkuc2hlZXQuYXR0YWNoKCk7XG4gICAgICB9XG5cbiAgICAgIGVudHJ5LnJlZnMrKztcbiAgICAgIHJldHVybiBlbnRyeS5zaGVldDtcbiAgICB9XG5cbiAgICB3YXJuaW5nKGZhbHNlLCBcIltKU1NdIFNoZWV0c01hbmFnZXI6IGNhbid0IGZpbmQgc2hlZXQgdG8gbWFuYWdlXCIpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgX3Byb3RvLnVubWFuYWdlID0gZnVuY3Rpb24gdW5tYW5hZ2Uoa2V5KSB7XG4gICAgdmFyIGVudHJ5ID0gdGhpcy5zaGVldHMuZ2V0KGtleSk7XG5cbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGlmIChlbnRyeS5yZWZzID4gMCkge1xuICAgICAgICBlbnRyeS5yZWZzLS07XG4gICAgICAgIGlmIChlbnRyeS5yZWZzID09PSAwKSBlbnRyeS5zaGVldC5kZXRhY2goKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd2FybmluZyhmYWxzZSwgXCJTaGVldHNNYW5hZ2VyOiBjYW4ndCBmaW5kIHNoZWV0IHRvIHVubWFuYWdlXCIpO1xuICAgIH1cbiAgfTtcblxuICBfY3JlYXRlQ2xhc3MoU2hlZXRzTWFuYWdlciwgW3tcbiAgICBrZXk6IFwic2l6ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBTaGVldHNNYW5hZ2VyO1xufSgpO1xuXG4vKipcbiogRXhwb3J0IGEgY29uc3RhbnQgaW5kaWNhdGluZyBpZiB0aGlzIGJyb3dzZXIgaGFzIENTU1RPTSBzdXBwb3J0LlxuKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS93ZWIvdXBkYXRlcy8yMDE4LzAzL2Nzc29tXG4qL1xudmFyIGhhc0NTU1RPTVN1cHBvcnQgPSB0eXBlb2YgQ1NTID09PSAnb2JqZWN0JyAmJiBDU1MgIT0gbnVsbCAmJiAnbnVtYmVyJyBpbiBDU1M7XG5cbi8qKlxuICogRXh0cmFjdHMgYSBzdHlsZXMgb2JqZWN0IHdpdGggb25seSBwcm9wcyB0aGF0IGNvbnRhaW4gZnVuY3Rpb24gdmFsdWVzLlxuICovXG5mdW5jdGlvbiBnZXREeW5hbWljU3R5bGVzKHN0eWxlcykge1xuICB2YXIgdG8gPSBudWxsO1xuXG4gIGZvciAodmFyIGtleSBpbiBzdHlsZXMpIHtcbiAgICB2YXIgdmFsdWUgPSBzdHlsZXNba2V5XTtcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuICAgIGlmICh0eXBlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoIXRvKSB0byA9IHt9O1xuICAgICAgdG9ba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICB2YXIgZXh0cmFjdGVkID0gZ2V0RHluYW1pY1N0eWxlcyh2YWx1ZSk7XG5cbiAgICAgIGlmIChleHRyYWN0ZWQpIHtcbiAgICAgICAgaWYgKCF0bykgdG8gPSB7fTtcbiAgICAgICAgdG9ba2V5XSA9IGV4dHJhY3RlZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdG87XG59XG5cbi8qKlxuICogQSBiZXR0ZXIgYWJzdHJhY3Rpb24gb3ZlciBDU1MuXG4gKlxuICogQGNvcHlyaWdodCBPbGVnIElzb25lbiAoU2xvYm9kc2tvaSkgLyBJc29uZW4gMjAxNC1wcmVzZW50XG4gKiBAd2Vic2l0ZSBodHRwczovL2dpdGh1Yi5jb20vY3NzaW5qcy9qc3NcbiAqIEBsaWNlbnNlIE1JVFxuICovXG52YXIgaW5kZXggPSBjcmVhdGVKc3MoKTtcblxuZXhwb3J0IGRlZmF1bHQgaW5kZXg7XG5leHBvcnQgeyBSdWxlTGlzdCwgU2hlZXRzTWFuYWdlciwgU2hlZXRzUmVnaXN0cnksIGNyZWF0ZUpzcyBhcyBjcmVhdGUsIGNyZWF0ZUdlbmVyYXRlSWQsIGNyZWF0ZVJ1bGUsIGdldER5bmFtaWNTdHlsZXMsIGhhc0NTU1RPTVN1cHBvcnQsIHNoZWV0cywgdG9Dc3NWYWx1ZSB9O1xuIiwiLyogZXNsaW50LWVudiBub2RlICovXG4ndXNlIHN0cmljdCc7XG5cbi8vIFNEUCBoZWxwZXJzLlxuY29uc3QgU0RQVXRpbHMgPSB7fTtcblxuLy8gR2VuZXJhdGUgYW4gYWxwaGFudW1lcmljIGlkZW50aWZpZXIgZm9yIGNuYW1lIG9yIG1pZHMuXG4vLyBUT0RPOiB1c2UgVVVJRHMgaW5zdGVhZD8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vamVkLzk4Mjg4M1xuU0RQVXRpbHMuZ2VuZXJhdGVJZGVudGlmaWVyID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgMTIpO1xufTtcblxuLy8gVGhlIFJUQ1AgQ05BTUUgdXNlZCBieSBhbGwgcGVlcmNvbm5lY3Rpb25zIGZyb20gdGhlIHNhbWUgSlMuXG5TRFBVdGlscy5sb2NhbENOYW1lID0gU0RQVXRpbHMuZ2VuZXJhdGVJZGVudGlmaWVyKCk7XG5cbi8vIFNwbGl0cyBTRFAgaW50byBsaW5lcywgZGVhbGluZyB3aXRoIGJvdGggQ1JMRiBhbmQgTEYuXG5TRFBVdGlscy5zcGxpdExpbmVzID0gZnVuY3Rpb24oYmxvYikge1xuICByZXR1cm4gYmxvYi50cmltKCkuc3BsaXQoJ1xcbicpLm1hcChsaW5lID0+IGxpbmUudHJpbSgpKTtcbn07XG4vLyBTcGxpdHMgU0RQIGludG8gc2Vzc2lvbnBhcnQgYW5kIG1lZGlhc2VjdGlvbnMuIEVuc3VyZXMgQ1JMRi5cblNEUFV0aWxzLnNwbGl0U2VjdGlvbnMgPSBmdW5jdGlvbihibG9iKSB7XG4gIGNvbnN0IHBhcnRzID0gYmxvYi5zcGxpdCgnXFxubT0nKTtcbiAgcmV0dXJuIHBhcnRzLm1hcCgocGFydCwgaW5kZXgpID0+IChpbmRleCA+IDAgP1xuICAgICdtPScgKyBwYXJ0IDogcGFydCkudHJpbSgpICsgJ1xcclxcbicpO1xufTtcblxuLy8gUmV0dXJucyB0aGUgc2Vzc2lvbiBkZXNjcmlwdGlvbi5cblNEUFV0aWxzLmdldERlc2NyaXB0aW9uID0gZnVuY3Rpb24oYmxvYikge1xuICBjb25zdCBzZWN0aW9ucyA9IFNEUFV0aWxzLnNwbGl0U2VjdGlvbnMoYmxvYik7XG4gIHJldHVybiBzZWN0aW9ucyAmJiBzZWN0aW9uc1swXTtcbn07XG5cbi8vIFJldHVybnMgdGhlIGluZGl2aWR1YWwgbWVkaWEgc2VjdGlvbnMuXG5TRFBVdGlscy5nZXRNZWRpYVNlY3Rpb25zID0gZnVuY3Rpb24oYmxvYikge1xuICBjb25zdCBzZWN0aW9ucyA9IFNEUFV0aWxzLnNwbGl0U2VjdGlvbnMoYmxvYik7XG4gIHNlY3Rpb25zLnNoaWZ0KCk7XG4gIHJldHVybiBzZWN0aW9ucztcbn07XG5cbi8vIFJldHVybnMgbGluZXMgdGhhdCBzdGFydCB3aXRoIGEgY2VydGFpbiBwcmVmaXguXG5TRFBVdGlscy5tYXRjaFByZWZpeCA9IGZ1bmN0aW9uKGJsb2IsIHByZWZpeCkge1xuICByZXR1cm4gU0RQVXRpbHMuc3BsaXRMaW5lcyhibG9iKS5maWx0ZXIobGluZSA9PiBsaW5lLmluZGV4T2YocHJlZml4KSA9PT0gMCk7XG59O1xuXG4vLyBQYXJzZXMgYW4gSUNFIGNhbmRpZGF0ZSBsaW5lLiBTYW1wbGUgaW5wdXQ6XG4vLyBjYW5kaWRhdGU6NzAyNzg2MzUwIDIgdWRwIDQxODE5OTAyIDguOC44LjggNjA3NjkgdHlwIHJlbGF5IHJhZGRyIDguOC44Ljhcbi8vIHJwb3J0IDU1OTk2XCJcbi8vIElucHV0IGNhbiBiZSBwcmVmaXhlZCB3aXRoIGE9LlxuU0RQVXRpbHMucGFyc2VDYW5kaWRhdGUgPSBmdW5jdGlvbihsaW5lKSB7XG4gIGxldCBwYXJ0cztcbiAgLy8gUGFyc2UgYm90aCB2YXJpYW50cy5cbiAgaWYgKGxpbmUuaW5kZXhPZignYT1jYW5kaWRhdGU6JykgPT09IDApIHtcbiAgICBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKDEyKS5zcGxpdCgnICcpO1xuICB9IGVsc2Uge1xuICAgIHBhcnRzID0gbGluZS5zdWJzdHJpbmcoMTApLnNwbGl0KCcgJyk7XG4gIH1cblxuICBjb25zdCBjYW5kaWRhdGUgPSB7XG4gICAgZm91bmRhdGlvbjogcGFydHNbMF0sXG4gICAgY29tcG9uZW50OiB7MTogJ3J0cCcsIDI6ICdydGNwJ31bcGFydHNbMV1dIHx8IHBhcnRzWzFdLFxuICAgIHByb3RvY29sOiBwYXJ0c1syXS50b0xvd2VyQ2FzZSgpLFxuICAgIHByaW9yaXR5OiBwYXJzZUludChwYXJ0c1szXSwgMTApLFxuICAgIGlwOiBwYXJ0c1s0XSxcbiAgICBhZGRyZXNzOiBwYXJ0c1s0XSwgLy8gYWRkcmVzcyBpcyBhbiBhbGlhcyBmb3IgaXAuXG4gICAgcG9ydDogcGFyc2VJbnQocGFydHNbNV0sIDEwKSxcbiAgICAvLyBza2lwIHBhcnRzWzZdID09ICd0eXAnXG4gICAgdHlwZTogcGFydHNbN10sXG4gIH07XG5cbiAgZm9yIChsZXQgaSA9IDg7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHN3aXRjaCAocGFydHNbaV0pIHtcbiAgICAgIGNhc2UgJ3JhZGRyJzpcbiAgICAgICAgY2FuZGlkYXRlLnJlbGF0ZWRBZGRyZXNzID0gcGFydHNbaSArIDFdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Jwb3J0JzpcbiAgICAgICAgY2FuZGlkYXRlLnJlbGF0ZWRQb3J0ID0gcGFyc2VJbnQocGFydHNbaSArIDFdLCAxMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGNwdHlwZSc6XG4gICAgICAgIGNhbmRpZGF0ZS50Y3BUeXBlID0gcGFydHNbaSArIDFdO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3VmcmFnJzpcbiAgICAgICAgY2FuZGlkYXRlLnVmcmFnID0gcGFydHNbaSArIDFdOyAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cbiAgICAgICAgY2FuZGlkYXRlLnVzZXJuYW1lRnJhZ21lbnQgPSBwYXJ0c1tpICsgMV07XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDogLy8gZXh0ZW5zaW9uIGhhbmRsaW5nLCBpbiBwYXJ0aWN1bGFyIHVmcmFnLiBEb24ndCBvdmVyd3JpdGUuXG4gICAgICAgIGlmIChjYW5kaWRhdGVbcGFydHNbaV1dID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjYW5kaWRhdGVbcGFydHNbaV1dID0gcGFydHNbaSArIDFdO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlO1xufTtcblxuLy8gVHJhbnNsYXRlcyBhIGNhbmRpZGF0ZSBvYmplY3QgaW50byBTRFAgY2FuZGlkYXRlIGF0dHJpYnV0ZS5cbi8vIFRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgYT0gcHJlZml4IVxuU0RQVXRpbHMud3JpdGVDYW5kaWRhdGUgPSBmdW5jdGlvbihjYW5kaWRhdGUpIHtcbiAgY29uc3Qgc2RwID0gW107XG4gIHNkcC5wdXNoKGNhbmRpZGF0ZS5mb3VuZGF0aW9uKTtcblxuICBjb25zdCBjb21wb25lbnQgPSBjYW5kaWRhdGUuY29tcG9uZW50O1xuICBpZiAoY29tcG9uZW50ID09PSAncnRwJykge1xuICAgIHNkcC5wdXNoKDEpO1xuICB9IGVsc2UgaWYgKGNvbXBvbmVudCA9PT0gJ3J0Y3AnKSB7XG4gICAgc2RwLnB1c2goMik7XG4gIH0gZWxzZSB7XG4gICAgc2RwLnB1c2goY29tcG9uZW50KTtcbiAgfVxuICBzZHAucHVzaChjYW5kaWRhdGUucHJvdG9jb2wudG9VcHBlckNhc2UoKSk7XG4gIHNkcC5wdXNoKGNhbmRpZGF0ZS5wcmlvcml0eSk7XG4gIHNkcC5wdXNoKGNhbmRpZGF0ZS5hZGRyZXNzIHx8IGNhbmRpZGF0ZS5pcCk7XG4gIHNkcC5wdXNoKGNhbmRpZGF0ZS5wb3J0KTtcblxuICBjb25zdCB0eXBlID0gY2FuZGlkYXRlLnR5cGU7XG4gIHNkcC5wdXNoKCd0eXAnKTtcbiAgc2RwLnB1c2godHlwZSk7XG4gIGlmICh0eXBlICE9PSAnaG9zdCcgJiYgY2FuZGlkYXRlLnJlbGF0ZWRBZGRyZXNzICYmXG4gICAgICBjYW5kaWRhdGUucmVsYXRlZFBvcnQpIHtcbiAgICBzZHAucHVzaCgncmFkZHInKTtcbiAgICBzZHAucHVzaChjYW5kaWRhdGUucmVsYXRlZEFkZHJlc3MpO1xuICAgIHNkcC5wdXNoKCdycG9ydCcpO1xuICAgIHNkcC5wdXNoKGNhbmRpZGF0ZS5yZWxhdGVkUG9ydCk7XG4gIH1cbiAgaWYgKGNhbmRpZGF0ZS50Y3BUeXBlICYmIGNhbmRpZGF0ZS5wcm90b2NvbC50b0xvd2VyQ2FzZSgpID09PSAndGNwJykge1xuICAgIHNkcC5wdXNoKCd0Y3B0eXBlJyk7XG4gICAgc2RwLnB1c2goY2FuZGlkYXRlLnRjcFR5cGUpO1xuICB9XG4gIGlmIChjYW5kaWRhdGUudXNlcm5hbWVGcmFnbWVudCB8fCBjYW5kaWRhdGUudWZyYWcpIHtcbiAgICBzZHAucHVzaCgndWZyYWcnKTtcbiAgICBzZHAucHVzaChjYW5kaWRhdGUudXNlcm5hbWVGcmFnbWVudCB8fCBjYW5kaWRhdGUudWZyYWcpO1xuICB9XG4gIHJldHVybiAnY2FuZGlkYXRlOicgKyBzZHAuam9pbignICcpO1xufTtcblxuLy8gUGFyc2VzIGFuIGljZS1vcHRpb25zIGxpbmUsIHJldHVybnMgYW4gYXJyYXkgb2Ygb3B0aW9uIHRhZ3MuXG4vLyBTYW1wbGUgaW5wdXQ6XG4vLyBhPWljZS1vcHRpb25zOmZvbyBiYXJcblNEUFV0aWxzLnBhcnNlSWNlT3B0aW9ucyA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgcmV0dXJuIGxpbmUuc3Vic3RyaW5nKDE0KS5zcGxpdCgnICcpO1xufTtcblxuLy8gUGFyc2VzIGEgcnRwbWFwIGxpbmUsIHJldHVybnMgUlRDUnRwQ29kZGVjUGFyYW1ldGVycy4gU2FtcGxlIGlucHV0OlxuLy8gYT1ydHBtYXA6MTExIG9wdXMvNDgwMDAvMlxuU0RQVXRpbHMucGFyc2VSdHBNYXAgPSBmdW5jdGlvbihsaW5lKSB7XG4gIGxldCBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKDkpLnNwbGl0KCcgJyk7XG4gIGNvbnN0IHBhcnNlZCA9IHtcbiAgICBwYXlsb2FkVHlwZTogcGFyc2VJbnQocGFydHMuc2hpZnQoKSwgMTApLCAvLyB3YXM6IGlkXG4gIH07XG5cbiAgcGFydHMgPSBwYXJ0c1swXS5zcGxpdCgnLycpO1xuXG4gIHBhcnNlZC5uYW1lID0gcGFydHNbMF07XG4gIHBhcnNlZC5jbG9ja1JhdGUgPSBwYXJzZUludChwYXJ0c1sxXSwgMTApOyAvLyB3YXM6IGNsb2NrcmF0ZVxuICBwYXJzZWQuY2hhbm5lbHMgPSBwYXJ0cy5sZW5ndGggPT09IDMgPyBwYXJzZUludChwYXJ0c1syXSwgMTApIDogMTtcbiAgLy8gbGVnYWN5IGFsaWFzLCBnb3QgcmVuYW1lZCBiYWNrIHRvIGNoYW5uZWxzIGluIE9SVEMuXG4gIHBhcnNlZC5udW1DaGFubmVscyA9IHBhcnNlZC5jaGFubmVscztcbiAgcmV0dXJuIHBhcnNlZDtcbn07XG5cbi8vIEdlbmVyYXRlcyBhIHJ0cG1hcCBsaW5lIGZyb20gUlRDUnRwQ29kZWNDYXBhYmlsaXR5IG9yXG4vLyBSVENSdHBDb2RlY1BhcmFtZXRlcnMuXG5TRFBVdGlscy53cml0ZVJ0cE1hcCA9IGZ1bmN0aW9uKGNvZGVjKSB7XG4gIGxldCBwdCA9IGNvZGVjLnBheWxvYWRUeXBlO1xuICBpZiAoY29kZWMucHJlZmVycmVkUGF5bG9hZFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHB0ID0gY29kZWMucHJlZmVycmVkUGF5bG9hZFR5cGU7XG4gIH1cbiAgY29uc3QgY2hhbm5lbHMgPSBjb2RlYy5jaGFubmVscyB8fCBjb2RlYy5udW1DaGFubmVscyB8fCAxO1xuICByZXR1cm4gJ2E9cnRwbWFwOicgKyBwdCArICcgJyArIGNvZGVjLm5hbWUgKyAnLycgKyBjb2RlYy5jbG9ja1JhdGUgK1xuICAgICAgKGNoYW5uZWxzICE9PSAxID8gJy8nICsgY2hhbm5lbHMgOiAnJykgKyAnXFxyXFxuJztcbn07XG5cbi8vIFBhcnNlcyBhIGV4dG1hcCBsaW5lIChoZWFkZXJleHRlbnNpb24gZnJvbSBSRkMgNTI4NSkuIFNhbXBsZSBpbnB1dDpcbi8vIGE9ZXh0bWFwOjIgdXJuOmlldGY6cGFyYW1zOnJ0cC1oZHJleHQ6dG9mZnNldFxuLy8gYT1leHRtYXA6Mi9zZW5kb25seSB1cm46aWV0ZjpwYXJhbXM6cnRwLWhkcmV4dDp0b2Zmc2V0XG5TRFBVdGlscy5wYXJzZUV4dG1hcCA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgY29uc3QgcGFydHMgPSBsaW5lLnN1YnN0cmluZyg5KS5zcGxpdCgnICcpO1xuICByZXR1cm4ge1xuICAgIGlkOiBwYXJzZUludChwYXJ0c1swXSwgMTApLFxuICAgIGRpcmVjdGlvbjogcGFydHNbMF0uaW5kZXhPZignLycpID4gMCA/IHBhcnRzWzBdLnNwbGl0KCcvJylbMV0gOiAnc2VuZHJlY3YnLFxuICAgIHVyaTogcGFydHNbMV0sXG4gICAgYXR0cmlidXRlczogcGFydHMuc2xpY2UoMikuam9pbignICcpLFxuICB9O1xufTtcblxuLy8gR2VuZXJhdGVzIGFuIGV4dG1hcCBsaW5lIGZyb20gUlRDUnRwSGVhZGVyRXh0ZW5zaW9uUGFyYW1ldGVycyBvclxuLy8gUlRDUnRwSGVhZGVyRXh0ZW5zaW9uLlxuU0RQVXRpbHMud3JpdGVFeHRtYXAgPSBmdW5jdGlvbihoZWFkZXJFeHRlbnNpb24pIHtcbiAgcmV0dXJuICdhPWV4dG1hcDonICsgKGhlYWRlckV4dGVuc2lvbi5pZCB8fCBoZWFkZXJFeHRlbnNpb24ucHJlZmVycmVkSWQpICtcbiAgICAgIChoZWFkZXJFeHRlbnNpb24uZGlyZWN0aW9uICYmIGhlYWRlckV4dGVuc2lvbi5kaXJlY3Rpb24gIT09ICdzZW5kcmVjdidcbiAgICAgICAgPyAnLycgKyBoZWFkZXJFeHRlbnNpb24uZGlyZWN0aW9uXG4gICAgICAgIDogJycpICtcbiAgICAgICcgJyArIGhlYWRlckV4dGVuc2lvbi51cmkgK1xuICAgICAgKGhlYWRlckV4dGVuc2lvbi5hdHRyaWJ1dGVzID8gJyAnICsgaGVhZGVyRXh0ZW5zaW9uLmF0dHJpYnV0ZXMgOiAnJykgK1xuICAgICAgJ1xcclxcbic7XG59O1xuXG4vLyBQYXJzZXMgYSBmbXRwIGxpbmUsIHJldHVybnMgZGljdGlvbmFyeS4gU2FtcGxlIGlucHV0OlxuLy8gYT1mbXRwOjk2IHZicj1vbjtjbmc9b25cbi8vIEFsc28gZGVhbHMgd2l0aCB2YnI9b247IGNuZz1vblxuU0RQVXRpbHMucGFyc2VGbXRwID0gZnVuY3Rpb24obGluZSkge1xuICBjb25zdCBwYXJzZWQgPSB7fTtcbiAgbGV0IGt2O1xuICBjb25zdCBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKGxpbmUuaW5kZXhPZignICcpICsgMSkuc3BsaXQoJzsnKTtcbiAgZm9yIChsZXQgaiA9IDA7IGogPCBwYXJ0cy5sZW5ndGg7IGorKykge1xuICAgIGt2ID0gcGFydHNbal0udHJpbSgpLnNwbGl0KCc9Jyk7XG4gICAgcGFyc2VkW2t2WzBdLnRyaW0oKV0gPSBrdlsxXTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufTtcblxuLy8gR2VuZXJhdGVzIGEgZm10cCBsaW5lIGZyb20gUlRDUnRwQ29kZWNDYXBhYmlsaXR5IG9yIFJUQ1J0cENvZGVjUGFyYW1ldGVycy5cblNEUFV0aWxzLndyaXRlRm10cCA9IGZ1bmN0aW9uKGNvZGVjKSB7XG4gIGxldCBsaW5lID0gJyc7XG4gIGxldCBwdCA9IGNvZGVjLnBheWxvYWRUeXBlO1xuICBpZiAoY29kZWMucHJlZmVycmVkUGF5bG9hZFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgIHB0ID0gY29kZWMucHJlZmVycmVkUGF5bG9hZFR5cGU7XG4gIH1cbiAgaWYgKGNvZGVjLnBhcmFtZXRlcnMgJiYgT2JqZWN0LmtleXMoY29kZWMucGFyYW1ldGVycykubGVuZ3RoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gW107XG4gICAgT2JqZWN0LmtleXMoY29kZWMucGFyYW1ldGVycykuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICBpZiAoY29kZWMucGFyYW1ldGVyc1twYXJhbV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwYXJhbXMucHVzaChwYXJhbSArICc9JyArIGNvZGVjLnBhcmFtZXRlcnNbcGFyYW1dKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtcy5wdXNoKHBhcmFtKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsaW5lICs9ICdhPWZtdHA6JyArIHB0ICsgJyAnICsgcGFyYW1zLmpvaW4oJzsnKSArICdcXHJcXG4nO1xuICB9XG4gIHJldHVybiBsaW5lO1xufTtcblxuLy8gUGFyc2VzIGEgcnRjcC1mYiBsaW5lLCByZXR1cm5zIFJUQ1BSdGNwRmVlZGJhY2sgb2JqZWN0LiBTYW1wbGUgaW5wdXQ6XG4vLyBhPXJ0Y3AtZmI6OTggbmFjayBycHNpXG5TRFBVdGlscy5wYXJzZVJ0Y3BGYiA9IGZ1bmN0aW9uKGxpbmUpIHtcbiAgY29uc3QgcGFydHMgPSBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoJyAnKSArIDEpLnNwbGl0KCcgJyk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogcGFydHMuc2hpZnQoKSxcbiAgICBwYXJhbWV0ZXI6IHBhcnRzLmpvaW4oJyAnKSxcbiAgfTtcbn07XG5cbi8vIEdlbmVyYXRlIGE9cnRjcC1mYiBsaW5lcyBmcm9tIFJUQ1J0cENvZGVjQ2FwYWJpbGl0eSBvciBSVENSdHBDb2RlY1BhcmFtZXRlcnMuXG5TRFBVdGlscy53cml0ZVJ0Y3BGYiA9IGZ1bmN0aW9uKGNvZGVjKSB7XG4gIGxldCBsaW5lcyA9ICcnO1xuICBsZXQgcHQgPSBjb2RlYy5wYXlsb2FkVHlwZTtcbiAgaWYgKGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBwdCA9IGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlO1xuICB9XG4gIGlmIChjb2RlYy5ydGNwRmVlZGJhY2sgJiYgY29kZWMucnRjcEZlZWRiYWNrLmxlbmd0aCkge1xuICAgIC8vIEZJWE1FOiBzcGVjaWFsIGhhbmRsaW5nIGZvciB0cnItaW50P1xuICAgIGNvZGVjLnJ0Y3BGZWVkYmFjay5mb3JFYWNoKGZiID0+IHtcbiAgICAgIGxpbmVzICs9ICdhPXJ0Y3AtZmI6JyArIHB0ICsgJyAnICsgZmIudHlwZSArXG4gICAgICAoZmIucGFyYW1ldGVyICYmIGZiLnBhcmFtZXRlci5sZW5ndGggPyAnICcgKyBmYi5wYXJhbWV0ZXIgOiAnJykgK1xuICAgICAgICAgICdcXHJcXG4nO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBsaW5lcztcbn07XG5cbi8vIFBhcnNlcyBhIFJGQyA1NTc2IHNzcmMgbWVkaWEgYXR0cmlidXRlLiBTYW1wbGUgaW5wdXQ6XG4vLyBhPXNzcmM6MzczNTkyODU1OSBjbmFtZTpzb21ldGhpbmdcblNEUFV0aWxzLnBhcnNlU3NyY01lZGlhID0gZnVuY3Rpb24obGluZSkge1xuICBjb25zdCBzcCA9IGxpbmUuaW5kZXhPZignICcpO1xuICBjb25zdCBwYXJ0cyA9IHtcbiAgICBzc3JjOiBwYXJzZUludChsaW5lLnN1YnN0cmluZyg3LCBzcCksIDEwKSxcbiAgfTtcbiAgY29uc3QgY29sb24gPSBsaW5lLmluZGV4T2YoJzonLCBzcCk7XG4gIGlmIChjb2xvbiA+IC0xKSB7XG4gICAgcGFydHMuYXR0cmlidXRlID0gbGluZS5zdWJzdHJpbmcoc3AgKyAxLCBjb2xvbik7XG4gICAgcGFydHMudmFsdWUgPSBsaW5lLnN1YnN0cmluZyhjb2xvbiArIDEpO1xuICB9IGVsc2Uge1xuICAgIHBhcnRzLmF0dHJpYnV0ZSA9IGxpbmUuc3Vic3RyaW5nKHNwICsgMSk7XG4gIH1cbiAgcmV0dXJuIHBhcnRzO1xufTtcblxuLy8gUGFyc2UgYSBzc3JjLWdyb3VwIGxpbmUgKHNlZSBSRkMgNTU3NikuIFNhbXBsZSBpbnB1dDpcbi8vIGE9c3NyYy1ncm91cDpzZW1hbnRpY3MgMTIgMzRcblNEUFV0aWxzLnBhcnNlU3NyY0dyb3VwID0gZnVuY3Rpb24obGluZSkge1xuICBjb25zdCBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKDEzKS5zcGxpdCgnICcpO1xuICByZXR1cm4ge1xuICAgIHNlbWFudGljczogcGFydHMuc2hpZnQoKSxcbiAgICBzc3JjczogcGFydHMubWFwKHNzcmMgPT4gcGFyc2VJbnQoc3NyYywgMTApKSxcbiAgfTtcbn07XG5cbi8vIEV4dHJhY3RzIHRoZSBNSUQgKFJGQyA1ODg4KSBmcm9tIGEgbWVkaWEgc2VjdGlvbi5cbi8vIFJldHVybnMgdGhlIE1JRCBvciB1bmRlZmluZWQgaWYgbm8gbWlkIGxpbmUgd2FzIGZvdW5kLlxuU0RQVXRpbHMuZ2V0TWlkID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uKSB7XG4gIGNvbnN0IG1pZCA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9bWlkOicpWzBdO1xuICBpZiAobWlkKSB7XG4gICAgcmV0dXJuIG1pZC5zdWJzdHJpbmcoNik7XG4gIH1cbn07XG5cbi8vIFBhcnNlcyBhIGZpbmdlcnByaW50IGxpbmUgZm9yIERUTFMtU1JUUC5cblNEUFV0aWxzLnBhcnNlRmluZ2VycHJpbnQgPSBmdW5jdGlvbihsaW5lKSB7XG4gIGNvbnN0IHBhcnRzID0gbGluZS5zdWJzdHJpbmcoMTQpLnNwbGl0KCcgJyk7XG4gIHJldHVybiB7XG4gICAgYWxnb3JpdGhtOiBwYXJ0c1swXS50b0xvd2VyQ2FzZSgpLCAvLyBhbGdvcml0aG0gaXMgY2FzZS1zZW5zaXRpdmUgaW4gRWRnZS5cbiAgICB2YWx1ZTogcGFydHNbMV0udG9VcHBlckNhc2UoKSwgLy8gdGhlIGRlZmluaXRpb24gaXMgdXBwZXItY2FzZSBpbiBSRkMgNDU3Mi5cbiAgfTtcbn07XG5cbi8vIEV4dHJhY3RzIERUTFMgcGFyYW1ldGVycyBmcm9tIFNEUCBtZWRpYSBzZWN0aW9uIG9yIHNlc3Npb25wYXJ0LlxuLy8gRklYTUU6IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIGZ1bmN0aW9ucyB0aGlzIHNob3VsZCBvbmx5XG4vLyAgIGdldCB0aGUgZmluZ2VycHJpbnQgbGluZSBhcyBpbnB1dC4gU2VlIGFsc28gZ2V0SWNlUGFyYW1ldGVycy5cblNEUFV0aWxzLmdldER0bHNQYXJhbWV0ZXJzID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uLCBzZXNzaW9ucGFydCkge1xuICBjb25zdCBsaW5lcyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiArIHNlc3Npb25wYXJ0LFxuICAgICdhPWZpbmdlcnByaW50OicpO1xuICAvLyBOb3RlOiBhPXNldHVwIGxpbmUgaXMgaWdub3JlZCBzaW5jZSB3ZSB1c2UgdGhlICdhdXRvJyByb2xlIGluIEVkZ2UuXG4gIHJldHVybiB7XG4gICAgcm9sZTogJ2F1dG8nLFxuICAgIGZpbmdlcnByaW50czogbGluZXMubWFwKFNEUFV0aWxzLnBhcnNlRmluZ2VycHJpbnQpLFxuICB9O1xufTtcblxuLy8gU2VyaWFsaXplcyBEVExTIHBhcmFtZXRlcnMgdG8gU0RQLlxuU0RQVXRpbHMud3JpdGVEdGxzUGFyYW1ldGVycyA9IGZ1bmN0aW9uKHBhcmFtcywgc2V0dXBUeXBlKSB7XG4gIGxldCBzZHAgPSAnYT1zZXR1cDonICsgc2V0dXBUeXBlICsgJ1xcclxcbic7XG4gIHBhcmFtcy5maW5nZXJwcmludHMuZm9yRWFjaChmcCA9PiB7XG4gICAgc2RwICs9ICdhPWZpbmdlcnByaW50OicgKyBmcC5hbGdvcml0aG0gKyAnICcgKyBmcC52YWx1ZSArICdcXHJcXG4nO1xuICB9KTtcbiAgcmV0dXJuIHNkcDtcbn07XG5cbi8vIFBhcnNlcyBhPWNyeXB0byBsaW5lcyBpbnRvXG4vLyAgIGh0dHBzOi8vcmF3Z2l0LmNvbS9hYm9iYS9lZGdlcnRjL21hc3Rlci9tc29ydGMtcnM0Lmh0bWwjZGljdGlvbmFyeS1ydGNzcnRwc2Rlc3BhcmFtZXRlcnMtbWVtYmVyc1xuU0RQVXRpbHMucGFyc2VDcnlwdG9MaW5lID0gZnVuY3Rpb24obGluZSkge1xuICBjb25zdCBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKDkpLnNwbGl0KCcgJyk7XG4gIHJldHVybiB7XG4gICAgdGFnOiBwYXJzZUludChwYXJ0c1swXSwgMTApLFxuICAgIGNyeXB0b1N1aXRlOiBwYXJ0c1sxXSxcbiAgICBrZXlQYXJhbXM6IHBhcnRzWzJdLFxuICAgIHNlc3Npb25QYXJhbXM6IHBhcnRzLnNsaWNlKDMpLFxuICB9O1xufTtcblxuU0RQVXRpbHMud3JpdGVDcnlwdG9MaW5lID0gZnVuY3Rpb24ocGFyYW1ldGVycykge1xuICByZXR1cm4gJ2E9Y3J5cHRvOicgKyBwYXJhbWV0ZXJzLnRhZyArICcgJyArXG4gICAgcGFyYW1ldGVycy5jcnlwdG9TdWl0ZSArICcgJyArXG4gICAgKHR5cGVvZiBwYXJhbWV0ZXJzLmtleVBhcmFtcyA9PT0gJ29iamVjdCdcbiAgICAgID8gU0RQVXRpbHMud3JpdGVDcnlwdG9LZXlQYXJhbXMocGFyYW1ldGVycy5rZXlQYXJhbXMpXG4gICAgICA6IHBhcmFtZXRlcnMua2V5UGFyYW1zKSArXG4gICAgKHBhcmFtZXRlcnMuc2Vzc2lvblBhcmFtcyA/ICcgJyArIHBhcmFtZXRlcnMuc2Vzc2lvblBhcmFtcy5qb2luKCcgJykgOiAnJykgK1xuICAgICdcXHJcXG4nO1xufTtcblxuLy8gUGFyc2VzIHRoZSBjcnlwdG8ga2V5IHBhcmFtZXRlcnMgaW50b1xuLy8gICBodHRwczovL3Jhd2dpdC5jb20vYWJvYmEvZWRnZXJ0Yy9tYXN0ZXIvbXNvcnRjLXJzNC5odG1sI3J0Y3NydHBrZXlwYXJhbSpcblNEUFV0aWxzLnBhcnNlQ3J5cHRvS2V5UGFyYW1zID0gZnVuY3Rpb24oa2V5UGFyYW1zKSB7XG4gIGlmIChrZXlQYXJhbXMuaW5kZXhPZignaW5saW5lOicpICE9PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgcGFydHMgPSBrZXlQYXJhbXMuc3Vic3RyaW5nKDcpLnNwbGl0KCd8Jyk7XG4gIHJldHVybiB7XG4gICAga2V5TWV0aG9kOiAnaW5saW5lJyxcbiAgICBrZXlTYWx0OiBwYXJ0c1swXSxcbiAgICBsaWZlVGltZTogcGFydHNbMV0sXG4gICAgbWtpVmFsdWU6IHBhcnRzWzJdID8gcGFydHNbMl0uc3BsaXQoJzonKVswXSA6IHVuZGVmaW5lZCxcbiAgICBta2lMZW5ndGg6IHBhcnRzWzJdID8gcGFydHNbMl0uc3BsaXQoJzonKVsxXSA6IHVuZGVmaW5lZCxcbiAgfTtcbn07XG5cblNEUFV0aWxzLndyaXRlQ3J5cHRvS2V5UGFyYW1zID0gZnVuY3Rpb24oa2V5UGFyYW1zKSB7XG4gIHJldHVybiBrZXlQYXJhbXMua2V5TWV0aG9kICsgJzonXG4gICAgKyBrZXlQYXJhbXMua2V5U2FsdCArXG4gICAgKGtleVBhcmFtcy5saWZlVGltZSA/ICd8JyArIGtleVBhcmFtcy5saWZlVGltZSA6ICcnKSArXG4gICAgKGtleVBhcmFtcy5ta2lWYWx1ZSAmJiBrZXlQYXJhbXMubWtpTGVuZ3RoXG4gICAgICA/ICd8JyArIGtleVBhcmFtcy5ta2lWYWx1ZSArICc6JyArIGtleVBhcmFtcy5ta2lMZW5ndGhcbiAgICAgIDogJycpO1xufTtcblxuLy8gRXh0cmFjdHMgYWxsIFNERVMgcGFyYW1ldGVycy5cblNEUFV0aWxzLmdldENyeXB0b1BhcmFtZXRlcnMgPSBmdW5jdGlvbihtZWRpYVNlY3Rpb24sIHNlc3Npb25wYXJ0KSB7XG4gIGNvbnN0IGxpbmVzID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uICsgc2Vzc2lvbnBhcnQsXG4gICAgJ2E9Y3J5cHRvOicpO1xuICByZXR1cm4gbGluZXMubWFwKFNEUFV0aWxzLnBhcnNlQ3J5cHRvTGluZSk7XG59O1xuXG4vLyBQYXJzZXMgSUNFIGluZm9ybWF0aW9uIGZyb20gU0RQIG1lZGlhIHNlY3Rpb24gb3Igc2Vzc2lvbnBhcnQuXG4vLyBGSVhNRTogZm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgZnVuY3Rpb25zIHRoaXMgc2hvdWxkIG9ubHlcbi8vICAgZ2V0IHRoZSBpY2UtdWZyYWcgYW5kIGljZS1wd2QgbGluZXMgYXMgaW5wdXQuXG5TRFBVdGlscy5nZXRJY2VQYXJhbWV0ZXJzID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uLCBzZXNzaW9ucGFydCkge1xuICBjb25zdCB1ZnJhZyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiArIHNlc3Npb25wYXJ0LFxuICAgICdhPWljZS11ZnJhZzonKVswXTtcbiAgY29uc3QgcHdkID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uICsgc2Vzc2lvbnBhcnQsXG4gICAgJ2E9aWNlLXB3ZDonKVswXTtcbiAgaWYgKCEodWZyYWcgJiYgcHdkKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB7XG4gICAgdXNlcm5hbWVGcmFnbWVudDogdWZyYWcuc3Vic3RyaW5nKDEyKSxcbiAgICBwYXNzd29yZDogcHdkLnN1YnN0cmluZygxMCksXG4gIH07XG59O1xuXG4vLyBTZXJpYWxpemVzIElDRSBwYXJhbWV0ZXJzIHRvIFNEUC5cblNEUFV0aWxzLndyaXRlSWNlUGFyYW1ldGVycyA9IGZ1bmN0aW9uKHBhcmFtcykge1xuICBsZXQgc2RwID0gJ2E9aWNlLXVmcmFnOicgKyBwYXJhbXMudXNlcm5hbWVGcmFnbWVudCArICdcXHJcXG4nICtcbiAgICAgICdhPWljZS1wd2Q6JyArIHBhcmFtcy5wYXNzd29yZCArICdcXHJcXG4nO1xuICBpZiAocGFyYW1zLmljZUxpdGUpIHtcbiAgICBzZHAgKz0gJ2E9aWNlLWxpdGVcXHJcXG4nO1xuICB9XG4gIHJldHVybiBzZHA7XG59O1xuXG4vLyBQYXJzZXMgdGhlIFNEUCBtZWRpYSBzZWN0aW9uIGFuZCByZXR1cm5zIFJUQ1J0cFBhcmFtZXRlcnMuXG5TRFBVdGlscy5wYXJzZVJ0cFBhcmFtZXRlcnMgPSBmdW5jdGlvbihtZWRpYVNlY3Rpb24pIHtcbiAgY29uc3QgZGVzY3JpcHRpb24gPSB7XG4gICAgY29kZWNzOiBbXSxcbiAgICBoZWFkZXJFeHRlbnNpb25zOiBbXSxcbiAgICBmZWNNZWNoYW5pc21zOiBbXSxcbiAgICBydGNwOiBbXSxcbiAgfTtcbiAgY29uc3QgbGluZXMgPSBTRFBVdGlscy5zcGxpdExpbmVzKG1lZGlhU2VjdGlvbik7XG4gIGNvbnN0IG1saW5lID0gbGluZXNbMF0uc3BsaXQoJyAnKTtcbiAgZGVzY3JpcHRpb24ucHJvZmlsZSA9IG1saW5lWzJdO1xuICBmb3IgKGxldCBpID0gMzsgaSA8IG1saW5lLmxlbmd0aDsgaSsrKSB7IC8vIGZpbmQgYWxsIGNvZGVjcyBmcm9tIG1saW5lWzMuLl1cbiAgICBjb25zdCBwdCA9IG1saW5lW2ldO1xuICAgIGNvbnN0IHJ0cG1hcGxpbmUgPSBTRFBVdGlscy5tYXRjaFByZWZpeChcbiAgICAgIG1lZGlhU2VjdGlvbiwgJ2E9cnRwbWFwOicgKyBwdCArICcgJylbMF07XG4gICAgaWYgKHJ0cG1hcGxpbmUpIHtcbiAgICAgIGNvbnN0IGNvZGVjID0gU0RQVXRpbHMucGFyc2VSdHBNYXAocnRwbWFwbGluZSk7XG4gICAgICBjb25zdCBmbXRwcyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KFxuICAgICAgICBtZWRpYVNlY3Rpb24sICdhPWZtdHA6JyArIHB0ICsgJyAnKTtcbiAgICAgIC8vIE9ubHkgdGhlIGZpcnN0IGE9Zm10cDo8cHQ+IGlzIGNvbnNpZGVyZWQuXG4gICAgICBjb2RlYy5wYXJhbWV0ZXJzID0gZm10cHMubGVuZ3RoID8gU0RQVXRpbHMucGFyc2VGbXRwKGZtdHBzWzBdKSA6IHt9O1xuICAgICAgY29kZWMucnRjcEZlZWRiYWNrID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgoXG4gICAgICAgIG1lZGlhU2VjdGlvbiwgJ2E9cnRjcC1mYjonICsgcHQgKyAnICcpXG4gICAgICAgIC5tYXAoU0RQVXRpbHMucGFyc2VSdGNwRmIpO1xuICAgICAgZGVzY3JpcHRpb24uY29kZWNzLnB1c2goY29kZWMpO1xuICAgICAgLy8gcGFyc2UgRkVDIG1lY2hhbmlzbXMgZnJvbSBydHBtYXAgbGluZXMuXG4gICAgICBzd2l0Y2ggKGNvZGVjLm5hbWUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdSRUQnOlxuICAgICAgICBjYXNlICdVTFBGRUMnOlxuICAgICAgICAgIGRlc2NyaXB0aW9uLmZlY01lY2hhbmlzbXMucHVzaChjb2RlYy5uYW1lLnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OiAvLyBvbmx5IFJFRCBhbmQgVUxQRkVDIGFyZSByZWNvZ25pemVkIGFzIEZFQyBtZWNoYW5pc21zLlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPWV4dG1hcDonKS5mb3JFYWNoKGxpbmUgPT4ge1xuICAgIGRlc2NyaXB0aW9uLmhlYWRlckV4dGVuc2lvbnMucHVzaChTRFBVdGlscy5wYXJzZUV4dG1hcChsaW5lKSk7XG4gIH0pO1xuICBjb25zdCB3aWxkY2FyZFJ0Y3BGYiA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9cnRjcC1mYjoqICcpXG4gICAgLm1hcChTRFBVdGlscy5wYXJzZVJ0Y3BGYik7XG4gIGRlc2NyaXB0aW9uLmNvZGVjcy5mb3JFYWNoKGNvZGVjID0+IHtcbiAgICB3aWxkY2FyZFJ0Y3BGYi5mb3JFYWNoKGZiPT4ge1xuICAgICAgY29uc3QgZHVwbGljYXRlID0gY29kZWMucnRjcEZlZWRiYWNrLmZpbmQoZXhpc3RpbmdGZWVkYmFjayA9PiB7XG4gICAgICAgIHJldHVybiBleGlzdGluZ0ZlZWRiYWNrLnR5cGUgPT09IGZiLnR5cGUgJiZcbiAgICAgICAgICBleGlzdGluZ0ZlZWRiYWNrLnBhcmFtZXRlciA9PT0gZmIucGFyYW1ldGVyO1xuICAgICAgfSk7XG4gICAgICBpZiAoIWR1cGxpY2F0ZSkge1xuICAgICAgICBjb2RlYy5ydGNwRmVlZGJhY2sucHVzaChmYik7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICAvLyBGSVhNRTogcGFyc2UgcnRjcC5cbiAgcmV0dXJuIGRlc2NyaXB0aW9uO1xufTtcblxuLy8gR2VuZXJhdGVzIHBhcnRzIG9mIHRoZSBTRFAgbWVkaWEgc2VjdGlvbiBkZXNjcmliaW5nIHRoZSBjYXBhYmlsaXRpZXMgL1xuLy8gcGFyYW1ldGVycy5cblNEUFV0aWxzLndyaXRlUnRwRGVzY3JpcHRpb24gPSBmdW5jdGlvbihraW5kLCBjYXBzKSB7XG4gIGxldCBzZHAgPSAnJztcblxuICAvLyBCdWlsZCB0aGUgbWxpbmUuXG4gIHNkcCArPSAnbT0nICsga2luZCArICcgJztcbiAgc2RwICs9IGNhcHMuY29kZWNzLmxlbmd0aCA+IDAgPyAnOScgOiAnMCc7IC8vIHJlamVjdCBpZiBubyBjb2RlY3MuXG4gIHNkcCArPSAnICcgKyAoY2Fwcy5wcm9maWxlIHx8ICdVRFAvVExTL1JUUC9TQVZQRicpICsgJyAnO1xuICBzZHAgKz0gY2Fwcy5jb2RlY3MubWFwKGNvZGVjID0+IHtcbiAgICBpZiAoY29kZWMucHJlZmVycmVkUGF5bG9hZFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvZGVjLnByZWZlcnJlZFBheWxvYWRUeXBlO1xuICAgIH1cbiAgICByZXR1cm4gY29kZWMucGF5bG9hZFR5cGU7XG4gIH0pLmpvaW4oJyAnKSArICdcXHJcXG4nO1xuXG4gIHNkcCArPSAnYz1JTiBJUDQgMC4wLjAuMFxcclxcbic7XG4gIHNkcCArPSAnYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcXHJcXG4nO1xuXG4gIC8vIEFkZCBhPXJ0cG1hcCBsaW5lcyBmb3IgZWFjaCBjb2RlYy4gQWxzbyBmbXRwIGFuZCBydGNwLWZiLlxuICBjYXBzLmNvZGVjcy5mb3JFYWNoKGNvZGVjID0+IHtcbiAgICBzZHAgKz0gU0RQVXRpbHMud3JpdGVSdHBNYXAoY29kZWMpO1xuICAgIHNkcCArPSBTRFBVdGlscy53cml0ZUZtdHAoY29kZWMpO1xuICAgIHNkcCArPSBTRFBVdGlscy53cml0ZVJ0Y3BGYihjb2RlYyk7XG4gIH0pO1xuICBsZXQgbWF4cHRpbWUgPSAwO1xuICBjYXBzLmNvZGVjcy5mb3JFYWNoKGNvZGVjID0+IHtcbiAgICBpZiAoY29kZWMubWF4cHRpbWUgPiBtYXhwdGltZSkge1xuICAgICAgbWF4cHRpbWUgPSBjb2RlYy5tYXhwdGltZTtcbiAgICB9XG4gIH0pO1xuICBpZiAobWF4cHRpbWUgPiAwKSB7XG4gICAgc2RwICs9ICdhPW1heHB0aW1lOicgKyBtYXhwdGltZSArICdcXHJcXG4nO1xuICB9XG5cbiAgaWYgKGNhcHMuaGVhZGVyRXh0ZW5zaW9ucykge1xuICAgIGNhcHMuaGVhZGVyRXh0ZW5zaW9ucy5mb3JFYWNoKGV4dGVuc2lvbiA9PiB7XG4gICAgICBzZHAgKz0gU0RQVXRpbHMud3JpdGVFeHRtYXAoZXh0ZW5zaW9uKTtcbiAgICB9KTtcbiAgfVxuICAvLyBGSVhNRTogd3JpdGUgZmVjTWVjaGFuaXNtcy5cbiAgcmV0dXJuIHNkcDtcbn07XG5cbi8vIFBhcnNlcyB0aGUgU0RQIG1lZGlhIHNlY3Rpb24gYW5kIHJldHVybnMgYW4gYXJyYXkgb2Zcbi8vIFJUQ1J0cEVuY29kaW5nUGFyYW1ldGVycy5cblNEUFV0aWxzLnBhcnNlUnRwRW5jb2RpbmdQYXJhbWV0ZXJzID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uKSB7XG4gIGNvbnN0IGVuY29kaW5nUGFyYW1ldGVycyA9IFtdO1xuICBjb25zdCBkZXNjcmlwdGlvbiA9IFNEUFV0aWxzLnBhcnNlUnRwUGFyYW1ldGVycyhtZWRpYVNlY3Rpb24pO1xuICBjb25zdCBoYXNSZWQgPSBkZXNjcmlwdGlvbi5mZWNNZWNoYW5pc21zLmluZGV4T2YoJ1JFRCcpICE9PSAtMTtcbiAgY29uc3QgaGFzVWxwZmVjID0gZGVzY3JpcHRpb24uZmVjTWVjaGFuaXNtcy5pbmRleE9mKCdVTFBGRUMnKSAhPT0gLTE7XG5cbiAgLy8gZmlsdGVyIGE9c3NyYzouLi4gY25hbWU6LCBpZ25vcmUgUGxhbkItbXNpZFxuICBjb25zdCBzc3JjcyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9c3NyYzonKVxuICAgIC5tYXAobGluZSA9PiBTRFBVdGlscy5wYXJzZVNzcmNNZWRpYShsaW5lKSlcbiAgICAuZmlsdGVyKHBhcnRzID0+IHBhcnRzLmF0dHJpYnV0ZSA9PT0gJ2NuYW1lJyk7XG4gIGNvbnN0IHByaW1hcnlTc3JjID0gc3NyY3MubGVuZ3RoID4gMCAmJiBzc3Jjc1swXS5zc3JjO1xuICBsZXQgc2Vjb25kYXJ5U3NyYztcblxuICBjb25zdCBmbG93cyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9c3NyYy1ncm91cDpGSUQnKVxuICAgIC5tYXAobGluZSA9PiB7XG4gICAgICBjb25zdCBwYXJ0cyA9IGxpbmUuc3Vic3RyaW5nKDE3KS5zcGxpdCgnICcpO1xuICAgICAgcmV0dXJuIHBhcnRzLm1hcChwYXJ0ID0+IHBhcnNlSW50KHBhcnQsIDEwKSk7XG4gICAgfSk7XG4gIGlmIChmbG93cy5sZW5ndGggPiAwICYmIGZsb3dzWzBdLmxlbmd0aCA+IDEgJiYgZmxvd3NbMF1bMF0gPT09IHByaW1hcnlTc3JjKSB7XG4gICAgc2Vjb25kYXJ5U3NyYyA9IGZsb3dzWzBdWzFdO1xuICB9XG5cbiAgZGVzY3JpcHRpb24uY29kZWNzLmZvckVhY2goY29kZWMgPT4ge1xuICAgIGlmIChjb2RlYy5uYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdSVFgnICYmIGNvZGVjLnBhcmFtZXRlcnMuYXB0KSB7XG4gICAgICBsZXQgZW5jUGFyYW0gPSB7XG4gICAgICAgIHNzcmM6IHByaW1hcnlTc3JjLFxuICAgICAgICBjb2RlY1BheWxvYWRUeXBlOiBwYXJzZUludChjb2RlYy5wYXJhbWV0ZXJzLmFwdCwgMTApLFxuICAgICAgfTtcbiAgICAgIGlmIChwcmltYXJ5U3NyYyAmJiBzZWNvbmRhcnlTc3JjKSB7XG4gICAgICAgIGVuY1BhcmFtLnJ0eCA9IHtzc3JjOiBzZWNvbmRhcnlTc3JjfTtcbiAgICAgIH1cbiAgICAgIGVuY29kaW5nUGFyYW1ldGVycy5wdXNoKGVuY1BhcmFtKTtcbiAgICAgIGlmIChoYXNSZWQpIHtcbiAgICAgICAgZW5jUGFyYW0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGVuY1BhcmFtKSk7XG4gICAgICAgIGVuY1BhcmFtLmZlYyA9IHtcbiAgICAgICAgICBzc3JjOiBwcmltYXJ5U3NyYyxcbiAgICAgICAgICBtZWNoYW5pc206IGhhc1VscGZlYyA/ICdyZWQrdWxwZmVjJyA6ICdyZWQnLFxuICAgICAgICB9O1xuICAgICAgICBlbmNvZGluZ1BhcmFtZXRlcnMucHVzaChlbmNQYXJhbSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgaWYgKGVuY29kaW5nUGFyYW1ldGVycy5sZW5ndGggPT09IDAgJiYgcHJpbWFyeVNzcmMpIHtcbiAgICBlbmNvZGluZ1BhcmFtZXRlcnMucHVzaCh7XG4gICAgICBzc3JjOiBwcmltYXJ5U3NyYyxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHdlIHN1cHBvcnQgYm90aCBiPUFTIGFuZCBiPVRJQVMgYnV0IGludGVycHJldCBBUyBhcyBUSUFTLlxuICBsZXQgYmFuZHdpZHRoID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uLCAnYj0nKTtcbiAgaWYgKGJhbmR3aWR0aC5sZW5ndGgpIHtcbiAgICBpZiAoYmFuZHdpZHRoWzBdLmluZGV4T2YoJ2I9VElBUzonKSA9PT0gMCkge1xuICAgICAgYmFuZHdpZHRoID0gcGFyc2VJbnQoYmFuZHdpZHRoWzBdLnN1YnN0cmluZyg3KSwgMTApO1xuICAgIH0gZWxzZSBpZiAoYmFuZHdpZHRoWzBdLmluZGV4T2YoJ2I9QVM6JykgPT09IDApIHtcbiAgICAgIC8vIHVzZSBmb3JtdWxhIGZyb20gSlNFUCB0byBjb252ZXJ0IGI9QVMgdG8gVElBUyB2YWx1ZS5cbiAgICAgIGJhbmR3aWR0aCA9IHBhcnNlSW50KGJhbmR3aWR0aFswXS5zdWJzdHJpbmcoNSksIDEwKSAqIDEwMDAgKiAwLjk1XG4gICAgICAgICAgLSAoNTAgKiA0MCAqIDgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYW5kd2lkdGggPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVuY29kaW5nUGFyYW1ldGVycy5mb3JFYWNoKHBhcmFtcyA9PiB7XG4gICAgICBwYXJhbXMubWF4Qml0cmF0ZSA9IGJhbmR3aWR0aDtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZW5jb2RpbmdQYXJhbWV0ZXJzO1xufTtcblxuLy8gcGFyc2VzIGh0dHA6Ly9kcmFmdC5vcnRjLm9yZy8jcnRjcnRjcHBhcmFtZXRlcnMqXG5TRFBVdGlscy5wYXJzZVJ0Y3BQYXJhbWV0ZXJzID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uKSB7XG4gIGNvbnN0IHJ0Y3BQYXJhbWV0ZXJzID0ge307XG5cbiAgLy8gR2V0cyB0aGUgZmlyc3QgU1NSQy4gTm90ZSB0aGF0IHdpdGggUlRYIHRoZXJlIG1pZ2h0IGJlIG11bHRpcGxlXG4gIC8vIFNTUkNzLlxuICBjb25zdCByZW1vdGVTc3JjID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uLCAnYT1zc3JjOicpXG4gICAgLm1hcChsaW5lID0+IFNEUFV0aWxzLnBhcnNlU3NyY01lZGlhKGxpbmUpKVxuICAgIC5maWx0ZXIob2JqID0+IG9iai5hdHRyaWJ1dGUgPT09ICdjbmFtZScpWzBdO1xuICBpZiAocmVtb3RlU3NyYykge1xuICAgIHJ0Y3BQYXJhbWV0ZXJzLmNuYW1lID0gcmVtb3RlU3NyYy52YWx1ZTtcbiAgICBydGNwUGFyYW1ldGVycy5zc3JjID0gcmVtb3RlU3NyYy5zc3JjO1xuICB9XG5cbiAgLy8gRWRnZSB1c2VzIHRoZSBjb21wb3VuZCBhdHRyaWJ1dGUgaW5zdGVhZCBvZiByZWR1Y2VkU2l6ZVxuICAvLyBjb21wb3VuZCBpcyAhcmVkdWNlZFNpemVcbiAgY29uc3QgcnNpemUgPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPXJ0Y3AtcnNpemUnKTtcbiAgcnRjcFBhcmFtZXRlcnMucmVkdWNlZFNpemUgPSByc2l6ZS5sZW5ndGggPiAwO1xuICBydGNwUGFyYW1ldGVycy5jb21wb3VuZCA9IHJzaXplLmxlbmd0aCA9PT0gMDtcblxuICAvLyBwYXJzZXMgdGhlIHJ0Y3AtbXV4IGF0dHLRlmJ1dGUuXG4gIC8vIE5vdGUgdGhhdCBFZGdlIGRvZXMgbm90IHN1cHBvcnQgdW5tdXhlZCBSVENQLlxuICBjb25zdCBtdXggPSBTRFBVdGlscy5tYXRjaFByZWZpeChtZWRpYVNlY3Rpb24sICdhPXJ0Y3AtbXV4Jyk7XG4gIHJ0Y3BQYXJhbWV0ZXJzLm11eCA9IG11eC5sZW5ndGggPiAwO1xuXG4gIHJldHVybiBydGNwUGFyYW1ldGVycztcbn07XG5cblNEUFV0aWxzLndyaXRlUnRjcFBhcmFtZXRlcnMgPSBmdW5jdGlvbihydGNwUGFyYW1ldGVycykge1xuICBsZXQgc2RwID0gJyc7XG4gIGlmIChydGNwUGFyYW1ldGVycy5yZWR1Y2VkU2l6ZSkge1xuICAgIHNkcCArPSAnYT1ydGNwLXJzaXplXFxyXFxuJztcbiAgfVxuICBpZiAocnRjcFBhcmFtZXRlcnMubXV4KSB7XG4gICAgc2RwICs9ICdhPXJ0Y3AtbXV4XFxyXFxuJztcbiAgfVxuICBpZiAocnRjcFBhcmFtZXRlcnMuc3NyYyAhPT0gdW5kZWZpbmVkICYmIHJ0Y3BQYXJhbWV0ZXJzLmNuYW1lKSB7XG4gICAgc2RwICs9ICdhPXNzcmM6JyArIHJ0Y3BQYXJhbWV0ZXJzLnNzcmMgK1xuICAgICAgJyBjbmFtZTonICsgcnRjcFBhcmFtZXRlcnMuY25hbWUgKyAnXFxyXFxuJztcbiAgfVxuICByZXR1cm4gc2RwO1xufTtcblxuXG4vLyBwYXJzZXMgZWl0aGVyIGE9bXNpZDogb3IgYT1zc3JjOi4uLiBtc2lkIGxpbmVzIGFuZCByZXR1cm5zXG4vLyB0aGUgaWQgb2YgdGhlIE1lZGlhU3RyZWFtIGFuZCBNZWRpYVN0cmVhbVRyYWNrLlxuU0RQVXRpbHMucGFyc2VNc2lkID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uKSB7XG4gIGxldCBwYXJ0cztcbiAgY29uc3Qgc3BlYyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9bXNpZDonKTtcbiAgaWYgKHNwZWMubGVuZ3RoID09PSAxKSB7XG4gICAgcGFydHMgPSBzcGVjWzBdLnN1YnN0cmluZyg3KS5zcGxpdCgnICcpO1xuICAgIHJldHVybiB7c3RyZWFtOiBwYXJ0c1swXSwgdHJhY2s6IHBhcnRzWzFdfTtcbiAgfVxuICBjb25zdCBwbGFuQiA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9c3NyYzonKVxuICAgIC5tYXAobGluZSA9PiBTRFBVdGlscy5wYXJzZVNzcmNNZWRpYShsaW5lKSlcbiAgICAuZmlsdGVyKG1zaWRQYXJ0cyA9PiBtc2lkUGFydHMuYXR0cmlidXRlID09PSAnbXNpZCcpO1xuICBpZiAocGxhbkIubGVuZ3RoID4gMCkge1xuICAgIHBhcnRzID0gcGxhbkJbMF0udmFsdWUuc3BsaXQoJyAnKTtcbiAgICByZXR1cm4ge3N0cmVhbTogcGFydHNbMF0sIHRyYWNrOiBwYXJ0c1sxXX07XG4gIH1cbn07XG5cbi8vIFNDVFBcbi8vIHBhcnNlcyBkcmFmdC1pZXRmLW1tdXNpYy1zY3RwLXNkcC0yNiBmaXJzdCBhbmQgZmFsbHMgYmFja1xuLy8gdG8gZHJhZnQtaWV0Zi1tbXVzaWMtc2N0cC1zZHAtMDVcblNEUFV0aWxzLnBhcnNlU2N0cERlc2NyaXB0aW9uID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uKSB7XG4gIGNvbnN0IG1saW5lID0gU0RQVXRpbHMucGFyc2VNTGluZShtZWRpYVNlY3Rpb24pO1xuICBjb25zdCBtYXhTaXplTGluZSA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9bWF4LW1lc3NhZ2Utc2l6ZTonKTtcbiAgbGV0IG1heE1lc3NhZ2VTaXplO1xuICBpZiAobWF4U2l6ZUxpbmUubGVuZ3RoID4gMCkge1xuICAgIG1heE1lc3NhZ2VTaXplID0gcGFyc2VJbnQobWF4U2l6ZUxpbmVbMF0uc3Vic3RyaW5nKDE5KSwgMTApO1xuICB9XG4gIGlmIChpc05hTihtYXhNZXNzYWdlU2l6ZSkpIHtcbiAgICBtYXhNZXNzYWdlU2l6ZSA9IDY1NTM2O1xuICB9XG4gIGNvbnN0IHNjdHBQb3J0ID0gU0RQVXRpbHMubWF0Y2hQcmVmaXgobWVkaWFTZWN0aW9uLCAnYT1zY3RwLXBvcnQ6Jyk7XG4gIGlmIChzY3RwUG9ydC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvcnQ6IHBhcnNlSW50KHNjdHBQb3J0WzBdLnN1YnN0cmluZygxMiksIDEwKSxcbiAgICAgIHByb3RvY29sOiBtbGluZS5mbXQsXG4gICAgICBtYXhNZXNzYWdlU2l6ZSxcbiAgICB9O1xuICB9XG4gIGNvbnN0IHNjdHBNYXBMaW5lcyA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ2E9c2N0cG1hcDonKTtcbiAgaWYgKHNjdHBNYXBMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgcGFydHMgPSBzY3RwTWFwTGluZXNbMF1cbiAgICAgIC5zdWJzdHJpbmcoMTApXG4gICAgICAuc3BsaXQoJyAnKTtcbiAgICByZXR1cm4ge1xuICAgICAgcG9ydDogcGFyc2VJbnQocGFydHNbMF0sIDEwKSxcbiAgICAgIHByb3RvY29sOiBwYXJ0c1sxXSxcbiAgICAgIG1heE1lc3NhZ2VTaXplLFxuICAgIH07XG4gIH1cbn07XG5cbi8vIFNDVFBcbi8vIG91dHB1dHMgdGhlIGRyYWZ0LWlldGYtbW11c2ljLXNjdHAtc2RwLTI2IHZlcnNpb24gdGhhdCBhbGwgYnJvd3NlcnNcbi8vIHN1cHBvcnQgYnkgbm93IHJlY2VpdmluZyBpbiB0aGlzIGZvcm1hdCwgdW5sZXNzIHdlIG9yaWdpbmFsbHkgcGFyc2VkXG4vLyBhcyB0aGUgZHJhZnQtaWV0Zi1tbXVzaWMtc2N0cC1zZHAtMDUgZm9ybWF0IChpbmRpY2F0ZWQgYnkgdGhlIG0tbGluZVxuLy8gcHJvdG9jb2wgb2YgRFRMUy9TQ1RQIC0tIHdpdGhvdXQgVURQLyBvciBUQ1AvKVxuU0RQVXRpbHMud3JpdGVTY3RwRGVzY3JpcHRpb24gPSBmdW5jdGlvbihtZWRpYSwgc2N0cCkge1xuICBsZXQgb3V0cHV0ID0gW107XG4gIGlmIChtZWRpYS5wcm90b2NvbCAhPT0gJ0RUTFMvU0NUUCcpIHtcbiAgICBvdXRwdXQgPSBbXG4gICAgICAnbT0nICsgbWVkaWEua2luZCArICcgOSAnICsgbWVkaWEucHJvdG9jb2wgKyAnICcgKyBzY3RwLnByb3RvY29sICsgJ1xcclxcbicsXG4gICAgICAnYz1JTiBJUDQgMC4wLjAuMFxcclxcbicsXG4gICAgICAnYT1zY3RwLXBvcnQ6JyArIHNjdHAucG9ydCArICdcXHJcXG4nLFxuICAgIF07XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0gW1xuICAgICAgJ209JyArIG1lZGlhLmtpbmQgKyAnIDkgJyArIG1lZGlhLnByb3RvY29sICsgJyAnICsgc2N0cC5wb3J0ICsgJ1xcclxcbicsXG4gICAgICAnYz1JTiBJUDQgMC4wLjAuMFxcclxcbicsXG4gICAgICAnYT1zY3RwbWFwOicgKyBzY3RwLnBvcnQgKyAnICcgKyBzY3RwLnByb3RvY29sICsgJyA2NTUzNVxcclxcbicsXG4gICAgXTtcbiAgfVxuICBpZiAoc2N0cC5tYXhNZXNzYWdlU2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgb3V0cHV0LnB1c2goJ2E9bWF4LW1lc3NhZ2Utc2l6ZTonICsgc2N0cC5tYXhNZXNzYWdlU2l6ZSArICdcXHJcXG4nKTtcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xufTtcblxuLy8gR2VuZXJhdGUgYSBzZXNzaW9uIElEIGZvciBTRFAuXG4vLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaWV0Zi1ydGN3ZWItanNlcC0yMCNzZWN0aW9uLTUuMi4xXG4vLyByZWNvbW1lbmRzIHVzaW5nIGEgY3J5cHRvZ3JhcGhpY2FsbHkgcmFuZG9tICt2ZSA2NC1iaXQgdmFsdWVcbi8vIGJ1dCByaWdodCBub3cgdGhpcyBzaG91bGQgYmUgYWNjZXB0YWJsZSBhbmQgd2l0aGluIHRoZSByaWdodCByYW5nZVxuU0RQVXRpbHMuZ2VuZXJhdGVTZXNzaW9uSWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoKS5zdWJzdHIoMiwgMjIpO1xufTtcblxuLy8gV3JpdGUgYm9pbGVyIHBsYXRlIGZvciBzdGFydCBvZiBTRFBcbi8vIHNlc3NJZCBhcmd1bWVudCBpcyBvcHRpb25hbCAtIGlmIG5vdCBzdXBwbGllZCBpdCB3aWxsXG4vLyBiZSBnZW5lcmF0ZWQgcmFuZG9tbHlcbi8vIHNlc3NWZXJzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAyXG4vLyBzZXNzVXNlciBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gJ3RoaXNpc2FkYXB0ZXJvcnRjJ1xuU0RQVXRpbHMud3JpdGVTZXNzaW9uQm9pbGVycGxhdGUgPSBmdW5jdGlvbihzZXNzSWQsIHNlc3NWZXIsIHNlc3NVc2VyKSB7XG4gIGxldCBzZXNzaW9uSWQ7XG4gIGNvbnN0IHZlcnNpb24gPSBzZXNzVmVyICE9PSB1bmRlZmluZWQgPyBzZXNzVmVyIDogMjtcbiAgaWYgKHNlc3NJZCkge1xuICAgIHNlc3Npb25JZCA9IHNlc3NJZDtcbiAgfSBlbHNlIHtcbiAgICBzZXNzaW9uSWQgPSBTRFBVdGlscy5nZW5lcmF0ZVNlc3Npb25JZCgpO1xuICB9XG4gIGNvbnN0IHVzZXIgPSBzZXNzVXNlciB8fCAndGhpc2lzYWRhcHRlcm9ydGMnO1xuICAvLyBGSVhNRTogc2Vzcy1pZCBzaG91bGQgYmUgYW4gTlRQIHRpbWVzdGFtcC5cbiAgcmV0dXJuICd2PTBcXHJcXG4nICtcbiAgICAgICdvPScgKyB1c2VyICsgJyAnICsgc2Vzc2lvbklkICsgJyAnICsgdmVyc2lvbiArXG4gICAgICAgICcgSU4gSVA0IDEyNy4wLjAuMVxcclxcbicgK1xuICAgICAgJ3M9LVxcclxcbicgK1xuICAgICAgJ3Q9MCAwXFxyXFxuJztcbn07XG5cbi8vIEdldHMgdGhlIGRpcmVjdGlvbiBmcm9tIHRoZSBtZWRpYVNlY3Rpb24gb3IgdGhlIHNlc3Npb25wYXJ0LlxuU0RQVXRpbHMuZ2V0RGlyZWN0aW9uID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uLCBzZXNzaW9ucGFydCkge1xuICAvLyBMb29rIGZvciBzZW5kcmVjdiwgc2VuZG9ubHksIHJlY3Zvbmx5LCBpbmFjdGl2ZSwgZGVmYXVsdCB0byBzZW5kcmVjdi5cbiAgY29uc3QgbGluZXMgPSBTRFBVdGlscy5zcGxpdExpbmVzKG1lZGlhU2VjdGlvbik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHtcbiAgICBzd2l0Y2ggKGxpbmVzW2ldKSB7XG4gICAgICBjYXNlICdhPXNlbmRyZWN2JzpcbiAgICAgIGNhc2UgJ2E9c2VuZG9ubHknOlxuICAgICAgY2FzZSAnYT1yZWN2b25seSc6XG4gICAgICBjYXNlICdhPWluYWN0aXZlJzpcbiAgICAgICAgcmV0dXJuIGxpbmVzW2ldLnN1YnN0cmluZygyKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEZJWE1FOiBXaGF0IHNob3VsZCBoYXBwZW4gaGVyZT9cbiAgICB9XG4gIH1cbiAgaWYgKHNlc3Npb25wYXJ0KSB7XG4gICAgcmV0dXJuIFNEUFV0aWxzLmdldERpcmVjdGlvbihzZXNzaW9ucGFydCk7XG4gIH1cbiAgcmV0dXJuICdzZW5kcmVjdic7XG59O1xuXG5TRFBVdGlscy5nZXRLaW5kID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uKSB7XG4gIGNvbnN0IGxpbmVzID0gU0RQVXRpbHMuc3BsaXRMaW5lcyhtZWRpYVNlY3Rpb24pO1xuICBjb25zdCBtbGluZSA9IGxpbmVzWzBdLnNwbGl0KCcgJyk7XG4gIHJldHVybiBtbGluZVswXS5zdWJzdHJpbmcoMik7XG59O1xuXG5TRFBVdGlscy5pc1JlamVjdGVkID0gZnVuY3Rpb24obWVkaWFTZWN0aW9uKSB7XG4gIHJldHVybiBtZWRpYVNlY3Rpb24uc3BsaXQoJyAnLCAyKVsxXSA9PT0gJzAnO1xufTtcblxuU0RQVXRpbHMucGFyc2VNTGluZSA9IGZ1bmN0aW9uKG1lZGlhU2VjdGlvbikge1xuICBjb25zdCBsaW5lcyA9IFNEUFV0aWxzLnNwbGl0TGluZXMobWVkaWFTZWN0aW9uKTtcbiAgY29uc3QgcGFydHMgPSBsaW5lc1swXS5zdWJzdHJpbmcoMikuc3BsaXQoJyAnKTtcbiAgcmV0dXJuIHtcbiAgICBraW5kOiBwYXJ0c1swXSxcbiAgICBwb3J0OiBwYXJzZUludChwYXJ0c1sxXSwgMTApLFxuICAgIHByb3RvY29sOiBwYXJ0c1syXSxcbiAgICBmbXQ6IHBhcnRzLnNsaWNlKDMpLmpvaW4oJyAnKSxcbiAgfTtcbn07XG5cblNEUFV0aWxzLnBhcnNlT0xpbmUgPSBmdW5jdGlvbihtZWRpYVNlY3Rpb24pIHtcbiAgY29uc3QgbGluZSA9IFNEUFV0aWxzLm1hdGNoUHJlZml4KG1lZGlhU2VjdGlvbiwgJ289JylbMF07XG4gIGNvbnN0IHBhcnRzID0gbGluZS5zdWJzdHJpbmcoMikuc3BsaXQoJyAnKTtcbiAgcmV0dXJuIHtcbiAgICB1c2VybmFtZTogcGFydHNbMF0sXG4gICAgc2Vzc2lvbklkOiBwYXJ0c1sxXSxcbiAgICBzZXNzaW9uVmVyc2lvbjogcGFyc2VJbnQocGFydHNbMl0sIDEwKSxcbiAgICBuZXRUeXBlOiBwYXJ0c1szXSxcbiAgICBhZGRyZXNzVHlwZTogcGFydHNbNF0sXG4gICAgYWRkcmVzczogcGFydHNbNV0sXG4gIH07XG59O1xuXG4vLyBhIHZlcnkgbmFpdmUgaW50ZXJwcmV0YXRpb24gb2YgYSB2YWxpZCBTRFAuXG5TRFBVdGlscy5pc1ZhbGlkU0RQID0gZnVuY3Rpb24oYmxvYikge1xuICBpZiAodHlwZW9mIGJsb2IgIT09ICdzdHJpbmcnIHx8IGJsb2IubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGxpbmVzID0gU0RQVXRpbHMuc3BsaXRMaW5lcyhibG9iKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgIGlmIChsaW5lc1tpXS5sZW5ndGggPCAyIHx8IGxpbmVzW2ldLmNoYXJBdCgxKSAhPT0gJz0nKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFRPRE86IGNoZWNrIHRoZSBtb2RpZmllciBhIGJpdCBtb3JlLlxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLy8gRXhwb3NlIHB1YmxpYyBtZXRob2RzLlxuaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gU0RQVXRpbHM7XG59XG4iLCJ2YXIgaXNQcm9kdWN0aW9uID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJztcbmZ1bmN0aW9uIHdhcm5pbmcoY29uZGl0aW9uLCBtZXNzYWdlKSB7XG4gIGlmICghaXNQcm9kdWN0aW9uKSB7XG4gICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0ZXh0ID0gXCJXYXJuaW5nOiBcIiArIG1lc3NhZ2U7XG5cbiAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zb2xlLndhcm4odGV4dCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRocm93IEVycm9yKHRleHQpO1xuICAgIH0gY2F0Y2ggKHgpIHt9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgd2FybmluZztcbiIsImV4cG9ydCAqIGZyb20gXCJAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41XCI7XG5leHBvcnQgKiBmcm9tIFwiQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11aS11ZTUuNVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vbGliXCI7XG4iLCJpbXBvcnQgeyBQaXhlbFN0cmVhbWluZywgV2ViUnRjUGxheWVyQ29udHJvbGxlciB9IGZyb20gXCJAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41XCI7XG5pbXBvcnQgeyBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcgfSBmcm9tIFwiLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIFVybEJ1aWxkZXIoaW5wdXQ6ICgpID0+IHN0cmluZywgdXJsRmxhZ3M/OiBzdHJpbmcpIHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChkZWNvZGVVUklDb21wb25lbnQoaW5wdXQoKSkpO1xuICBjb25zdCBwYXJhbXMgPSB1cmwuc2VhcmNoUGFyYW1zO1xuXG4gIGxldCBmbGFncyA9IHVybEZsYWdzO1xuICBpZiAoZmxhZ3MpIHtcbiAgICBpZiAoZmxhZ3Muc3RhcnRzV2l0aChcIj9cIikpIGZsYWdzID0gZmxhZ3Muc3Vic3RyaW5nKDEpO1xuICAgIGZsYWdzLnNwbGl0KFwiJlwiKS5mb3JFYWNoKCh2YWwpID0+IHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHZhbC5zcGxpdChcIj1cIik7XG4gICAgICAvLyBFbnN1cmUgdGhlIHZhbHVlIGlzIGVuY29kZWRcbiAgICAgIHBhcmFtcy5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gdXJsLnRvU3RyaW5nKCk7XG59XG5cbi8vIEhhY2tcbmV4cG9ydCBmdW5jdGlvbiBBcHBseVVybEhhY2soKSB7XG4gIGNvbnN0IHNldFdlYlJ0Y1BsYXllckNvbnRyb2xsZXIgPSBQaXhlbFN0cmVhbWluZy5wcm90b3R5cGVbXCJzZXRXZWJSdGNQbGF5ZXJDb250cm9sbGVyXCJdO1xuICBQaXhlbFN0cmVhbWluZy5wcm90b3R5cGVbXCJzZXRXZWJSdGNQbGF5ZXJDb250cm9sbGVyXCJdID0gZnVuY3Rpb24gc2V0V2ViUnRjUGxheWVyQ29udHJvbGxlck92ZXJyaWRlKFxuICAgIHRoaXM6IEFyY3dhcmVQaXhlbFN0cmVhbWluZyxcbiAgICB3ZWJSdGNQbGF5ZXJDb250cm9sbGVyOiBXZWJSdGNQbGF5ZXJDb250cm9sbGVyXG4gICk6IHZvaWQge1xuICAgIC8qKiBUaGUgZGVmYXVsdCB1cmwgYnVpbGRlciB3aWxsIHNpbXBseSBhZGQgYSBxdWVyeS1wYXJhbWV0ZXIgd2l0aG91dCBjaGVja2luZyB0aGUgaW5pdGlhbCB1cmwuXG4gICAgICogVG8gZml4IHRoYXQgaWYgdGhlIHVybCBhbHJlYWR5IGNvbWVzIHdpdGggcXVlcnktcGFyYW1ldGVycyB0aGUgb3V0cHV0IGhhcyB0byBiZSByZXdyaXR0ZW4uICovXG4gICAgY29uc3Qgc2lnbmFsbGluZ1VybEJ1aWxkZXIgPSB3ZWJSdGNQbGF5ZXJDb250cm9sbGVyLnNpZ25hbGxpbmdVcmxCdWlsZGVyO1xuICAgIHdlYlJ0Y1BsYXllckNvbnRyb2xsZXIuc2lnbmFsbGluZ1VybEJ1aWxkZXIgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gVXJsQnVpbGRlcihzaWduYWxsaW5nVXJsQnVpbGRlciwgdGhpcy5jb25maWcudXJsRmxhZ3MpO1xuICAgIH07XG5cbiAgICBzZXRXZWJSdGNQbGF5ZXJDb250cm9sbGVyLmNhbGwodGhpcywgd2ViUnRjUGxheWVyQ29udHJvbGxlcik7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBNZXNzYWdlcyB9IGZyb20gXCJAYXJjd2FyZS1jbG91ZC9zaGFyZWQtcGl4ZWxzdHJlYW1pbmctd2Vic2RrXCI7XG5pbXBvcnQge1xuICBTZXR0aW5nRmxhZyxcbiAgU2V0dGluZ1RleHQsXG4gIFdlYlJ0Y1BsYXllckNvbnRyb2xsZXIsXG4gIENvbmZpZyxcbiAgRmxhZ3MsXG59IGZyb20gXCJAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVlNS41XCI7XG5pbXBvcnQge1xuICBBcHBsaWNhdGlvbixcbiAgU2V0dGluZ1VJRmxhZyxcbiAgU2V0dGluZ1VJVGV4dCxcbiAgVUlPcHRpb25zLFxuICBQaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGUsXG59IGZyb20gXCJAZXBpY2dhbWVzLXBzL2xpYi1waXhlbHN0cmVhbWluZ2Zyb250ZW5kLXVpLXVlNS41XCI7XG5pbXBvcnQgeyBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcgfSBmcm9tIFwiLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcbmltcG9ydCB7IEFyY3dhcmVTdHlsZXMgfSBmcm9tIFwiLi9zdHlsZXMvQXJjd2FyZVBpeGVsU3RyZWFtaW5nQXBwbGljYXRpb25TdHlsZXNcIjtcbmltcG9ydCB7IEF1ZGlvQnV0dG9uIH0gZnJvbSBcIi4vdWkvQXVkaW9CdXR0b25cIjtcbmltcG9ydCB7IE1pY0J1dHRvbiB9IGZyb20gXCIuL3VpL01pY0J1dHRvblwiO1xuaW1wb3J0IHsgU3RvcEJ1dHRvbiB9IGZyb20gXCIuL3VpL1N0b3BCdXR0b25cIjtcblxuY29uc3QgREVCVUcgPSBmYWxzZTtcblxuY29uc3QgVGV4dEtleVJlZ2V4ID0gL14oXFxbJyhbYS16QS1aIDAtOS1fXSspJ1xcXSApLztcblxuZnVuY3Rpb24gZmluZEVsZW1lbnRCeVRleHRDb250ZW50KHJvb3Q6IEhUTUxFbGVtZW50IHwgbnVsbCwgc2VsZWN0b3I6IHN0cmluZyk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IG1hdGNoID0gVGV4dEtleVJlZ2V4LmV4ZWMoc2VsZWN0b3IpO1xuICBpZiAoIW1hdGNoKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgYWN0dWFsU2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKG1hdGNoWzFdLCBcIlwiKTtcbiAgY29uc3QgdGV4dCA9IG1hdGNoWzJdLnRyaW0oKTtcblxuICBjb25zdCBlbGVtZW50cyA9IChyb290IHx8IGRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihhY3R1YWxTZWxlY3Rvcik7XG4gIGxldCByZXN1bHQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRUZXh0OiBzdHJpbmcgPSBlbGVtZW50Py5pbm5lckhUTUwudHJpbSgpO1xuICAgIGlmICghcmVzdWx0ICYmIGVsZW1lbnQ/LmlubmVySFRNTD8uaW5jbHVkZXMoYD4ke3RleHR9PGApKSB7XG4gICAgICByZXN1bHQgPSBlbGVtZW50O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IHJlbW92YWxzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHtcbiAgLy8gSXMgbm90IHVzZWQgYnkgQXJjd2FyZSBzeXN0ZW0gLSBtYXkgbmVlZCBhZGRpdGlvbmFsIGNoZWNraW5nLlxuICBcIiNTdHJlYW1lcklkXCI6IHRydWUsXG4gIC8vIFNpZ25hbGxpbmctU2VydmVyXG4gIFwiI3NzXCI6IHRydWUsXG4gIC8vIElzIG5vdCB3b3JraW5nIHdpdGggb3VyIEFGSyBTZXR1cC5cbiAgXCIjVGltZW91dElmSWRsZVwiOiB0cnVlLFxuICAvLyBPZmZlclRvUmVjZWl2ZSBuZWVkcyB0byBiZSBlbmFibGVkIGluIEFyY3dhcmUgY2xvdWQgZW52aXJvbm1lbnQuXG4gIFwiI09mZmVyVG9SZWNlaXZlXCI6IHRydWUsXG4gIC8vIFNGVSBjYW4ndCBiZSBoYW5kbGVkIGluIGNsb3VkIGVudmlyb25tZW50LlxuICBcIiNwcmVmZXJTRlVcIjogdHJ1ZSxcbiAgLy8gU1RVTiAvIFRVUk4gY2FuJ3QgYmUgaGFuZGxlZCBpbiBjbG91ZCBlbnZpcm9ubWVudC5cbiAgXCIjRm9yY2VUVVJOXCI6IHRydWUsXG4gIC8vIEFyY3dhcmUgVUkgZG9lcyBub3Qgc3VwcG9ydCBMaWdodCBvciBEYXJrIG1vZGUuXG4gIFwiI0xpZ2h0TW9kZVwiOiB0cnVlLFxuICAvLyBCeSBkZWZhdWx0IHRoZSBVc2VNaWMgc2V0dGluZyBzaG91bGQgYmUgZGlzYWJsZWQsIHNpbmNlIHRoZSB3b24ndCB3b3JrIHdpdGggNC4yNyBhbnl3YXkuXG4gIFwiI1VzZU1pY1wiOiB0cnVlLFxuICAvLyBCeSBkZWZhdWx0IHRoZSBNYXRjaFZpZXdwb3J0UmVzIHNldHRpbmcgc2hvdWxkIGJlIGRpc2FibGVkLCBzaW5jZSB3ZSBoYXZlIGEgY3VzdG9tIG1ldGhvZCBmb3IgdGhhdC5cbiAgXCIjTWF0Y2hWaWV3cG9ydFJlc1wiOiB0cnVlLFxuICAvLyBCeSBkZWZhdWx0IHRoZSBIb3ZlcmluZ01vdXNlIHNldHRpbmcgc2hvdWxkIGJlIGRpc2FibGVkLCBzaW5jZSB3ZSBoYXZlIGEgY3VzdG9tIG1ldGhvZCBmb3IgdGhhdC5cbiAgXCIjSG92ZXJpbmdNb3VzZVwiOiB0cnVlLFxuICAvLyBBRksgSWRsZSB0aW1lLlxuICBcIlsnQUZLIHRpbWVvdXQnXSBkaXYuc2V0dGluZy5mb3JtLWdyb3VwOm5vdChbaWRdKVwiOiB0cnVlLFxuICAvLyBCeSBkZWZhdWx0IHRoZSBlbmNvZGVyIHNldHRpbmdzIHNob3VsZCBiZSBkaXNhYmxlZCwgc2luY2UgdGhlIHdvbid0IHdvcmsgd2l0aCA0LjI3IGFueXdheS5cbiAgXCJbJ0VuY29kZXInXSBzZWN0aW9uLnNldHRpbmdzQ29udGFpbmVyOm5vdChbaWRdKVwiOiB0cnVlLFxuICAvLyBCeSBkZWZhdWx0IHRoZSBXZWJSVEMgc2V0dGluZ3Mgc2hvdWxkIGJlIGRpc2FibGVkLCBzaW5jZSB0aGUgd29uJ3Qgd29yayB3aXRoIDQuMjcgYW55d2F5LlxuICBcIlsnV2ViUlRDJ10gc2VjdGlvbi5zZXR0aW5nc0NvbnRhaW5lcjpub3QoW2lkXSlcIjogdHJ1ZSxcbiAgLy8gQnkgZGVmYXVsdCB0aGUgVUkgc2V0dGluZ3Mgc2hvdWxkIGJlIGRpc2FibGVkLCBzaW5jZSB3ZSBoYXZlIGEgY3VzdG9tIG1ldGhvZCBmb3IgdGhlbS5cbiAgXCJbJ1VJJ10gc2VjdGlvbi5zZXR0aW5nc0NvbnRhaW5lcjpub3QoW2lkXSlcIjogdHJ1ZSxcbiAgLy8gSGlkZSBvcHRpb24gb2Ygc3RhcnQgYXVkaW8gbXV0ZWQgb3Igbm90XG4gIFwiI1N0YXJ0VmlkZW9NdXRlZFwiOiB0cnVlLFxufTtcblxuaWYgKERFQlVHKVxuICBPYmplY3Qua2V5cyhyZW1vdmFscykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgcmVtb3ZhbHNba2V5XSA9IGZhbHNlO1xuICB9KTtcblxuZnVuY3Rpb24gcmVtb3ZlKGtleTogc3RyaW5nLCBlbGVtZW50PzogSFRNTEVsZW1lbnQgfCBudWxsKSB7XG4gIGlmIChyZW1vdmFsc1trZXldID09PSB0cnVlKSB7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIH1cbiAgfSBlbHNlIGlmIChERUJVRykge1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBlbGVtZW50LnN0eWxlLmNvbG9yID0gXCJyZWRcIjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFyY3dhcmVBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHtcbiAgc3RhdGljIEZsYWdzID0gY2xhc3Mge1xuICAgIHN0YXRpYyBub1Nlc3Npb24gPSBcIm5vU2Vzc2lvblwiIGFzIGNvbnN0O1xuICB9O1xuXG4gIHB1YmxpYyBvdmVycmlkZSBzdHJlYW06IEFyY3dhcmVQaXhlbFN0cmVhbWluZztcbiAgcHJpdmF0ZSB2aWRlb0VsZW1lbnRQYXJlbnQ6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgcHJpdmF0ZSByZXNwb25zZUNhbGxiYWNrOiAoKHJlc3BvbnNlOiBzdHJpbmcpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgd2ViUnRjQ29udHJvbGxlcjogV2ViUnRjUGxheWVyQ29udHJvbGxlcjtcblxuICBvdmVycmlkZSBnZXQgcm9vdEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiBzdXBlci5yb290RWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgQXJjd2FyZVNlY3Rpb246IEhUTUxFbGVtZW50ID0gdGhpcy5jb25maWdVSS5idWlsZFNlY3Rpb25XaXRoSGVhZGluZyhcbiAgICB0aGlzLnNldHRpbmdzUGFuZWwuc2V0dGluZ3NDb250ZW50RWxlbWVudCxcbiAgICBcIkFyY3dhcmUgQ2xvdWRcIlxuICApO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFVJT3B0aW9ucyAmIHsgc3RyZWFtOiBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcgfSkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMuc3RyZWFtID0gb3B0aW9ucz8uc3RyZWFtO1xuICAgIHRoaXMuZW1pdFVJSW50ZXJhY3Rpb24gPSB0aGlzLmVtaXRVSUludGVyYWN0aW9uLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLmFkanVzdFNldHRpbmdzUGFuZWwoKTtcbiAgICB0aGlzLmNyZWF0ZUF1ZGlvVG9nZ2xlQnV0dG9uKCk7XG4gICAgdGhpcy5jcmVhdGVNaWNUb2dnbGVCdXR0b24oKTtcbiAgICB0aGlzLmNyZWF0ZVN0b3BCdXR0b24oKTtcbiAgICB0aGlzLmFwcGx5QXJjd2FyZVN0eWxlcygpO1xuXG4gICAgdGhpcy52aWRlb0VsZW1lbnRQYXJlbnQgPSB0aGlzPy5zdHJlYW0/LnZpZGVvRWxlbWVudFBhcmVudDtcbiAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSB0aGlzPy52aWRlb0VsZW1lbnRQYXJlbnQ/LnBhcmVudEVsZW1lbnQ7XG4gICAgdGhpcy53ZWJSdGNDb250cm9sbGVyID0gdGhpcz8uc3RyZWFtPy5bXCJfd2ViUnRjQ29udHJvbGxlclwiXTtcbiAgICBcbiAgICB0aGlzLmFkZExvdmVMZXR0ZXJoYW5kbGVyKClcblxuICAgIHRoaXM/LnN0cmVhbT8uYWRkUmVzcG9uc2VFdmVudExpc3RlbmVyKFwidWUtcmVzcG9uc2VcIiwgKHJlc3BvbnNlKSA9PiB0aGlzPy5hcHBsaWNhdGlvblJlc3BvbnNlKHJlc3BvbnNlKSk7XG5cbiAgICB0aGlzPy5zdHJlYW0/LnNlc3Npb25JZEhhbmRsZXI/LmFkZCgoc2Vzc2lvbklkKSA9PiB7XG4gICAgICB0aGlzPy5zdGF0c1BhbmVsPy5hZGRPclVwZGF0ZVNlc3Npb25TdGF0KFwic2Vzc2lvbklkXCIsIFwiU2Vzc2lvbklkXCIsIHNlc3Npb25JZCk7XG4gICAgfSk7XG5cbiAgICB0aGlzPy5zdHJlYW0/LnZpZGVvSW5pdGlhbGl6ZWRIYW5kbGVyPy5hZGQoKCkgPT4ge1xuICAgICAgdGhpcz8uY3VycmVudE92ZXJsYXk/LmhpZGUoKTtcbiAgICAgIGlmICh0aGlzPy5zdHJlYW0/LnN0cmVhbUluZm8pIHRoaXM/LmF1dG9QbGF5SGFuZGxlcih0aGlzPy5zdHJlYW0/LnN0cmVhbUluZm8pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdWlIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgLy8gUmVtb3ZlIGZ1bGxzY3JlZW4gVUkgRGVmYXVsdCBidXR0b25zIGZyb20gRE9NXG4gICAgICB0aGlzPy51aURlZmF1bHRCdXR0b25WaXNpYmlsdHkoXCJmdWxsc2NyZWVuQnV0dG9uXCIsIFwiI2Z1bGxzY3JlZW4tYnRuXCIpO1xuICAgICAgdGhpcz8udWlEZWZhdWx0QnV0dG9uVmlzaWJpbHR5KFwic2V0dGluZ3NCdXR0b25cIiwgXCIjc2V0dGluZ3NCdG5cIik7XG4gICAgICB0aGlzPy51aURlZmF1bHRCdXR0b25WaXNpYmlsdHkoXCJpbmZvQnV0dG9uXCIsIFwiI3N0YXRzQnRuXCIpO1xuICAgICAgdGhpcz8udWlEZWZhdWx0QnV0dG9uVmlzaWJpbHR5KFwiYXVkaW9CdXR0b25cIiwgXCIjYXVkaW9CdG5cIik7XG4gICAgICB0aGlzPy51aURlZmF1bHRCdXR0b25WaXNpYmlsdHkoXCJzdG9wQnV0dG9uXCIsIFwiI3N0b3BCdG5cIik7XG4gICAgICB0aGlzPy51aURlZmF1bHRCdXR0b25WaXNpYmlsdHkoXCJjb25uZWN0aW9uU3RyZW5ndGhJY29uXCIsIFwiI2Nvbm5lY3Rpb25cIik7XG4gICAgICB0aGlzPy51aURlZmF1bHRCdXR0b25WaXNpYmlsdHkoXCJtaWNCdXR0b25cIiwgXCIjbWljQnRuXCIpO1xuXG4gICAgICB0aGlzLnVpRWxlbWVudHNWaXNpYmlsaXR5KHRydWUpO1xuICAgIH07XG5cbiAgICAvLyBFaXRoZXIgb24gc3RyZWFtSW5mb1xuICAgIC8vIHRoaXM/LnN0cmVhbS5zdHJlYW1JbmZvSGFuZGxlci5hZGQodWlIYW5kbGVyLmJpbmQodGhpcykpO1xuICAgIC8vIE9yIG9uIGluaXRpYWxpemUuXG4gICAgdGhpcz8uc3RyZWFtPy52aWRlb0luaXRpYWxpemVkSGFuZGxlcj8uYWRkKHVpSGFuZGxlci5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMudWlFbGVtZW50c1Zpc2liaWxpdHkoZmFsc2UpO1xuICAgIHRoaXMuYWRkVGV4dFRvQ29ubmVjdE92ZXJsYXkoKTtcbiAgICB0aGlzLnByZXZlbnREZWZhdWx0S2V5Ym9hcmRFdmVudHMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRMb3ZlTGV0dGVyaGFuZGxlcigpXG4gIHtcbiAgICB0aGlzPy5zdHJlYW0/LmxvdmVMZXR0ZXJIYW5kbGVyPy5hZGQoKGxvdmVMZXR0ZXIpID0+IHtcbiAgICAgIGlmICh0aGlzPy5wbGF5T3ZlcmxheSAmJiBsb3ZlTGV0dGVyICYmIHRoaXM/LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgaW5mb092ZXJsYXkgPSB0aGlzPy5wYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yKFwiI2luZm9PdmVybGF5XCIpO1xuICAgICAgICBpZiAoaW5mb092ZXJsYXkpIHtcbiAgICAgICAgICBpbmZvT3ZlcmxheT8uY2xhc3NMaXN0Py5yZW1vdmUoXCJoaWRkZW5TdGF0ZVwiKTtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlID0gaW5mb092ZXJsYXk/LnF1ZXJ5U2VsZWN0b3IoXCIjbWVzc2FnZU92ZXJsYXlJbm5lclwiKTtcbiAgICAgICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICAgICAgbWVzc2FnZS5pbm5lckhUTUwgPSBsb3ZlTGV0dGVyPy5yZWFzb24/LnJlcGxhY2UoXCJMTDogXCIsIFwiXCIpO1xuICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhpcy5wbGF5T3ZlcmxheS50ZXh0RWxlbWVudC5pbm5lclRleHQgPSBsb3ZlTGV0dGVyLnJlYXNvbi5yZXBsYWNlKFwiTEw6IFwiLCBcIlwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBTZXQncyBhbmQgcmVzZXRzIGhpZGRlbiBzdGF0ZSBvZiBcImFkZGl0aW9uYWxcIiBVSSBFbGVtZW50cy5cbiAgICogRm9yIGV4YW1wbGUgYnV0dG9ucyBvciBjb25uZWN0aW9uIGljb24uXG4gICAqIFRoZXNlIHdpbGwgZmFkZSBpbiB0aHJvdWdoIGNzcyBhbmltYXRpb24gdXBvbiB0aGUgdmlkZW9Jbml0aWFsaXplZCBldmVudC5cbiAgICogQXQgdGhpcyBwb2ludCBpbiB0aW1lIHRoZSBzdHJlYW1JbmZvIGlzIGFscmVhZHkgcHJvY2Vzc2VkLlxuICAgKi9cbiAgcHJpdmF0ZSB1aUVsZW1lbnRzVmlzaWJpbGl0eShzdGF0ZTogYm9vbGVhbikge1xuICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcz8ucGFyZW50RWxlbWVudD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXCIjY29udHJvbHNcIik7XG4gICAgaWYgKGNvbnRyb2xzKSB7XG4gICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgY29udHJvbHM/LmNsYXNzTGlzdD8ucmVtb3ZlKFwiaGlkZGVuXCIpO1xuICAgICAgICBjb250cm9scz8uY2xhc3NMaXN0Py5hZGQoXCJ2aXNpYmxlXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udHJvbHM/LmNsYXNzTGlzdD8ucmVtb3ZlKFwidmlzaWJsZVwiKTtcbiAgICAgICAgY29udHJvbHM/LmNsYXNzTGlzdD8uYWRkKFwiaGlkZGVuXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB0aGlzPy5wYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcIiNjb25uZWN0aW9uXCIpO1xuICAgIGlmIChjb25uZWN0aW9uKSB7XG4gICAgICBpZiAoc3RhdGUpIHtcbiAgICAgICAgY29ubmVjdGlvbj8uY2xhc3NMaXN0Py5yZW1vdmUoXCJoaWRkZW5cIik7XG4gICAgICAgIGNvbm5lY3Rpb24/LmNsYXNzTGlzdD8uYWRkKFwidmlzaWJsZVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbm5lY3Rpb24/LmNsYXNzTGlzdD8ucmVtb3ZlKFwidmlzaWJsZVwiKTtcbiAgICAgICAgY29ubmVjdGlvbj8uY2xhc3NMaXN0Py5hZGQoXCJoaWRkZW5cIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGp1c3RTZXR0aW5nc1BhbmVsKCkge1xuICAgIC8vIE1ha2UgQXJjd2FyZSBDbG91ZCBzZXR0aW5ncyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgc2V0dGluZ3MgcGFuZWwuXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcz8uQXJjd2FyZVNlY3Rpb24/LnBhcmVudEVsZW1lbnQ7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgcGFyZW50Py5yZW1vdmVDaGlsZCh0aGlzPy5BcmN3YXJlU2VjdGlvbik7XG4gICAgICBwYXJlbnQ/Lmluc2VydEJlZm9yZSh0aGlzPy5BcmN3YXJlU2VjdGlvbiwgcGFyZW50Py5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYWxsIHRoZSBzZXR0aW5ncyBzcGVjaWZpZWQgYnkgXCJyZW1vdmFsc1wiIG9iamVjdC5cbiAgICBjb25zdCBTZXR0aW5nc0NvbnRlbnQgPSB0aGlzPy5zZXR0aW5nc1BhbmVsPy5zZXR0aW5nc0NvbnRlbnRFbGVtZW50O1xuICAgIGlmIChTZXR0aW5nc0NvbnRlbnQpIHtcbiAgICAgIFNldHRpbmdzQ29udGVudC5zdHlsZS5taW5XaWR0aCA9IFwiNDAwcHhcIjtcblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVtb3ZhbHMpIHtcbiAgICAgICAgaWYgKFRleHRLZXlSZWdleC50ZXN0KGtleSkpIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZmluZEVsZW1lbnRCeVRleHRDb250ZW50KFNldHRpbmdzQ29udGVudCwga2V5KTtcbiAgICAgICAgICByZW1vdmUoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gU2V0dGluZ3NDb250ZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGtleSk7XG4gICAgICAgICAgcmVtb3ZlKGtleSwgZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUmVuYW1pbmcgdGhlIFwiUmVzdGFydCBTdHJlYW1cIiBidXR0b24gdG8gXCJSZWNvbm5lY3QgdG8gU3RyZWFtXCIuXG4gICAgICBjb25zdCByZXN0YXJ0U3RyZWFtQnV0dG9uID0gZmluZEVsZW1lbnRCeVRleHRDb250ZW50KFNldHRpbmdzQ29udGVudCwgXCJbJ1Jlc3RhcnQgU3RyZWFtJ10gc2VjdGlvbiA+IGRpdi5zZXR0aW5nXCIpO1xuICAgICAgaWYgKHJlc3RhcnRTdHJlYW1CdXR0b24pIHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSByZXN0YXJ0U3RyZWFtQnV0dG9uPy5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcImRpdlwiKTtcbiAgICAgICAgaWYgKGxhYmVsKSBsYWJlbC50ZXh0Q29udGVudCA9IFwiUmVjb25uZWN0IHRvIFN0cmVhbVwiO1xuICAgICAgICBjb25zdCBidXR0b24gPSByZXN0YXJ0U3RyZWFtQnV0dG9uPy5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KFwibGFiZWwgPiBpbnB1dFwiKTtcbiAgICAgICAgaWYgKGJ1dHRvbikgYnV0dG9uLnZhbHVlID0gXCJyZWNvbm5lY3RcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgZGlzY2xhaW1lclxuICAgIHtcbiAgICAgIGNvbnN0IGRpc2NsYWltZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgZGlzY2xhaW1lcj8uY2xhc3NMaXN0Py5hZGQoXCJzZXR0aW5nXCIpO1xuICAgICAgZGlzY2xhaW1lci50ZXh0Q29udGVudCA9IFwiS2VlcCBpbiBtaW5kLCB0aGVzZSBzZXR0aW5ncyB3aWxsIGJlIGFwcGxpZWQgaW4geW91ciBjdXJyZW50IHNlc3Npb24gb25seS5cIjtcbiAgICAgIGRpc2NsYWltZXIuc3R5bGUucGFkZGluZ0JvdHRvbSA9IFwiMTVweFwiO1xuICAgICAgdGhpcz8uQXJjd2FyZVNlY3Rpb24/LmFwcGVuZENoaWxkKGRpc2NsYWltZXIpO1xuICAgIH1cblxuICAgIC8vIEFkZCBkaXNhYmxlIFNlc3Npb25JZCBidXR0b24uXG4gICAgdGhpcz8uQXJjd2FyZVNlY3Rpb24/LmFwcGVuZENoaWxkKFxuICAgICAgbmV3IFNldHRpbmdVSUZsYWcoXG4gICAgICAgIG5ldyBTZXR0aW5nRmxhZyhcbiAgICAgICAgICBBcmN3YXJlQXBwbGljYXRpb24/LkZsYWdzPy5ub1Nlc3Npb24sXG4gICAgICAgICAgXCJEaXNhYmxlIFNlc3Npb25JZFwiLFxuICAgICAgICAgIFwiRGlzYWJsZSBzZXNzaW9uSWQgYmFzZWQgcmVjb25uZWN0aW9uLlwiLFxuICAgICAgICAgIHRoaXM/LnN0cmVhbT8uc2Vzc2lvbj8ubm9TZXNzaW9uLFxuICAgICAgICAgIHRydWVcbiAgICAgICAgKVxuICAgICAgKS5yb290RWxlbWVudFxuICAgICk7XG5cbiAgICAvLyBBZGQgcmVwaHJhc2luZyBvZiBzaWduYWxsaW5nIFVybC5cbiAgICB0aGlzPy5BcmN3YXJlU2VjdGlvbj8uYXBwZW5kQ2hpbGQoXG4gICAgICBuZXcgU2V0dGluZ1VJVGV4dChcbiAgICAgICAgbmV3IFNldHRpbmdUZXh0KFxuICAgICAgICAgIFwic2lnbmFsbGluZy11cmxcIixcbiAgICAgICAgICBcIlNpZ25hbGxpbmcgVVJMXCIsXG4gICAgICAgICAgXCJTaWduYWxsaW5nIFVSTFwiLFxuICAgICAgICAgIGAke3RoaXM/LnN0cmVhbT8uY29uZmlnPy5nZXRUZXh0U2V0dGluZ1ZhbHVlKFwic3NcIil9PyR7dGhpcz8uc3RyZWFtPy5jb25maWc/LnVybEZsYWdzPy5zbGljZSgxKX1gLFxuICAgICAgICAgIGZhbHNlXG4gICAgICAgIClcbiAgICAgICkucm9vdEVsZW1lbnRcbiAgICApO1xuXG4gICAgaWYgKERFQlVHKVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEJ1dHRvbkVsZW1lbnQ+KFwiI3NldHRpbmdzQnRuXCIpPy5jbGljaygpO1xuICAgICAgfSwgMjAwMCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUF1ZGlvVG9nZ2xlQnV0dG9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGF1ZGlvQnV0dG9uID0gbmV3IEF1ZGlvQnV0dG9uKHRoaXM/LnN0cmVhbSk7XG4gICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcz8uc3RyZWFtPy52aWRlb0VsZW1lbnRQYXJlbnQ7XG4gICAgY29uc3QgcGxheWVyVUkgPSB2aWRlb0VsZW1lbnRQYXJlbnQhLnBhcmVudEVsZW1lbnQ7XG4gICAgLy8gQXBwZW5kIHRoZSBidXR0b24gdG8gdGhlIHZpZGVvRWxlbWVudFBhcmVudFxuICAgIGlmIChwbGF5ZXJVSSkge1xuICAgICAgY29uc3QgdWlGZWF0dXJlcyA9IHBsYXllclVJPy5xdWVyeVNlbGVjdG9yKFwiI3VpRmVhdHVyZXNcIik7XG4gICAgICBpZiAodWlGZWF0dXJlcykge1xuICAgICAgICBjb25zdCB1aUNvbnRyb2xzID0gdWlGZWF0dXJlcz8ucXVlcnlTZWxlY3RvcihcIiNjb250cm9sc1wiKTtcbiAgICAgICAgaWYgKHVpQ29udHJvbHMpIHtcbiAgICAgICAgICB1aUNvbnRyb2xzPy5hcHBlbmRDaGlsZChhdWRpb0J1dHRvbj8uZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pY1RvZ2dsZUJ1dHRvbigpOiB2b2lkIHtcbiAgICBjb25zdCBtaWNCdXR0b24gPSBuZXcgTWljQnV0dG9uKHRoaXM/LnN0cmVhbSk7XG4gICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcz8uc3RyZWFtPy52aWRlb0VsZW1lbnRQYXJlbnQ7XG4gICAgY29uc3QgcGxheWVyVUkgPSB2aWRlb0VsZW1lbnRQYXJlbnQhLnBhcmVudEVsZW1lbnQ7XG4gICAgLy8gQXBwZW5kIHRoZSBidXR0b24gdG8gdGhlIHZpZGVvRWxlbWVudFBhcmVudFxuICAgIGlmIChwbGF5ZXJVSSkge1xuICAgICAgY29uc3QgdWlGZWF0dXJlcyA9IHBsYXllclVJPy5xdWVyeVNlbGVjdG9yKFwiI3VpRmVhdHVyZXNcIik7XG4gICAgICBpZiAodWlGZWF0dXJlcykge1xuICAgICAgICBjb25zdCB1aUNvbnRyb2xzID0gdWlGZWF0dXJlcz8ucXVlcnlTZWxlY3RvcihcIiNjb250cm9sc1wiKTtcbiAgICAgICAgaWYgKHVpQ29udHJvbHMpIHtcbiAgICAgICAgICB1aUNvbnRyb2xzPy5hcHBlbmRDaGlsZChtaWNCdXR0b24/LmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTdG9wQnV0dG9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0cmVhbT8uY29uZmlnPy5zZXR0aW5ncz8uc3RvcEJ1dHRvbiA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3Qgc3RvcEJ1dHRvbiA9IG5ldyBTdG9wQnV0dG9uKHRoaXM/LnN0cmVhbSk7XG4gICAgICBjb25zdCB2aWRlb0VsZW1lbnRQYXJlbnQgPSB0aGlzPy5zdHJlYW0/LnZpZGVvRWxlbWVudFBhcmVudDtcbiAgICAgIGNvbnN0IHBsYXllclVJID0gdmlkZW9FbGVtZW50UGFyZW50IS5wYXJlbnRFbGVtZW50O1xuICAgICAgLy8gQXBwZW5kIHRoZSBidXR0b24gdG8gdGhlIHZpZGVvRWxlbWVudFBhcmVudFxuICAgICAgaWYgKHBsYXllclVJKSB7XG4gICAgICAgIGNvbnN0IHVpRmVhdHVyZXMgPSBwbGF5ZXJVST8ucXVlcnlTZWxlY3RvcihcIiN1aUZlYXR1cmVzXCIpO1xuICAgICAgICBpZiAodWlGZWF0dXJlcykge1xuICAgICAgICAgIGNvbnN0IHVpQ29udHJvbHMgPSB1aUZlYXR1cmVzPy5xdWVyeVNlbGVjdG9yKFwiI2NvbnRyb2xzXCIpO1xuICAgICAgICAgIGlmICh1aUNvbnRyb2xzKSB7XG4gICAgICAgICAgICB1aUNvbnRyb2xzPy5hcHBlbmRDaGlsZChzdG9wQnV0dG9uPy5lbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVpRGVmYXVsdEJ1dHRvblZpc2liaWx0eShidXR0b25UeXBlOiBrZXlvZiB0eXBlb2YgdGhpcy5zdHJlYW0uY29uZmlnLnNldHRpbmdzLCBpZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXM/LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXM/LnBhcmVudEVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoaWQpO1xuICAgICAgaWYgKHRoaXM/LnN0cmVhbT8uY29uZmlnPy5zZXR0aW5nc1tidXR0b25UeXBlXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGJ1dHRvbikge1xuICAgICAgICAgIGJ1dHRvbj8ucmVtb3ZlKCk7XG4gICAgICAgICAgY29uc3QgdWlGZWF0dXJlc0VsZW1lbnQgPSB0aGlzLnVpRmVhdHVyZXNFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IHN0YXRzUGFuZWwgPSB1aUZlYXR1cmVzRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI3N0YXRzLXBhbmVsXCIpO1xuICAgICAgICAgIGNvbnN0IHNldHRpbmdzUGFuZWwgPSB1aUZlYXR1cmVzRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI3NldHRpbmdzLXBhbmVsXCIpO1xuICAgICAgICAgIGlmICh1aUZlYXR1cmVzRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKGJ1dHRvblR5cGUgPT09IFwiaW5mb0J1dHRvblwiKSB7XG4gICAgICAgICAgICAgIHN0YXRzUGFuZWw/LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ1dHRvblR5cGUgPT09IFwic2V0dGluZ3NCdXR0b25cIikge1xuICAgICAgICAgICAgICBzZXR0aW5nc1BhbmVsPy5yZW1vdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGlzSU9TID0gL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yPy51c2VyQWdlbnQpO1xuICAgICAgaWYgKGJ1dHRvblR5cGUgPT09IFwiZnVsbHNjcmVlbkJ1dHRvblwiICYmIGlzSU9TICYmIGJ1dHRvbikge1xuICAgICAgICBidXR0b24/LnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHJldmVudERlZmF1bHRLZXlib2FyZEV2ZW50cygpIHtcbiAgICBpZiAodGhpcy52aWRlb0VsZW1lbnRQYXJlbnQpIHtcbiAgICAgIHRoaXMudmlkZW9FbGVtZW50UGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIFwia2V5ZG93blwiLFxuICAgICAgICBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIlRhYlwiIHx8IGV2ZW50LmtleSA9PT0gXCIgXCIgfHwgZXZlbnQua2V5ID09PSBcIlNwYWNlYmFyXCIpIHtcbiAgICAgICAgICAgIC8vIFByZXZlbnQgdGhlIGRlZmF1bHQgYWN0aW9uIGFuZCBzdG9wIHByb3BhZ2F0aW9uXG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0cnVlXG4gICAgICApOyAvLyBVc2UgY2FwdHVyaW5nIGluc3RlYWQgb2YgYnViYmxpbmdcblxuICAgICAgY29uc3QgYnV0dG9ucyA9IHRoaXMudWlGZWF0dXJlc0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcImJ1dHRvblwiKTtcbiAgICAgIGJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSBcIiBcIiB8fCBldmVudC5rZXkgPT09IFwiU3BhY2ViYXJcIikge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGJ1dHRvbi5ibHVyKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXV0b1BsYXlIYW5kbGVyKHN0cmVhbUluZm86IE1lc3NhZ2VzLlN0cmVhbUluZm8pIHtcbiAgICBjb25zdCB7IHZpZGVvUGxheWVyIH0gPSB0aGlzPy53ZWJSdGNDb250cm9sbGVyO1xuICAgIGNvbnN0IGF1dG9QbGF5ID0gc3RyZWFtSW5mbz8uc3RyZWFtSW5mbz8uYXV0b1BsYXk7XG4gICAgY29uc3QgaXNQYXVzZWQgPSB2aWRlb1BsYXllcj8uaXNQYXVzZWQoKTtcbiAgICBpZiAoYXV0b1BsYXkgJiYgaXNQYXVzZWQpIHtcbiAgICAgIGlmICh2aWRlb1BsYXllcikge1xuICAgICAgICBjb25zdCB2aWRlb0VsZW1lbnQgPSB2aWRlb1BsYXllcj8uZ2V0VmlkZW9FbGVtZW50KCk7XG4gICAgICAgIGlmICh2aWRlb0VsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdmlkZW9FbGVtZW50Py5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBwbGF5T3ZlcmxheSA9IHBhcmVudEVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIjcGxheU92ZXJsYXlcIik7XG4gICAgICAgICAgICBpZiAocGxheU92ZXJsYXkpIHBsYXlPdmVybGF5Py5yZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmlkZW9FbGVtZW50Py5wbGF5KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogUmVxdWVzdCBhIHJlc3BvbnNlIGZyb20geW91IFVFIEFwcGxpY2F0aW9uLlxuICAgKiBUaGUgcmV0dXJuZWQgcmVzcG9uc2UgZGVwZW5kcyBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgeW91ciBVRSBBcHBsaWNhdGlvbi5cbiAgICogSXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBhcHBsaWNhdGlvbiwgc3VjaCBhczpcbiAgICogLSBhIHN0YXRlIHRvIHVwZGF0ZSB5b3VyIGN1c3RvbSB1aVxuICAgKiAtIGdldCB0aGUgdXJsIHRvIHRoZSBwZGYgaXQgdXBsb2FkZWQgdG8gc29tZSByZW1vdGUgc2VydmljZSBvZiB5b3Vyc1xuICAgKiAtIHRoZSBpZCBvZiB0aGUgc2F2ZS1nYW1lXG4gICAqIC4uIGFueXRoaW5nIGVsc2UgeW91IGNvdWxkIGltYWdpbmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0QXBwbGljYXRpb25SZXNwb25zZShjYWxsYmFjazogKHJlc3BvbnNlOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzPy5zdHJlYW0/LmFkZFJlc3BvbnNlRXZlbnRMaXN0ZW5lcihcInVlLXJlc3BvbnNlXCIsIChyZXNwb25zZSkgPT4ge1xuICAgICAgY2FsbGJhY2socmVzcG9uc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGxpY2F0aW9uUmVzcG9uc2UocmVzcG9uc2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzPy5yZXNwb25zZUNhbGxiYWNrKSB7XG4gICAgICB0aGlzPy5yZXNwb25zZUNhbGxiYWNrKHJlc3BvbnNlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFwcGx5QXJjd2FyZVN0eWxlcygpIHtcbiAgICBjb25zdCBQaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGVzID0gbmV3IFBpeGVsU3RyZWFtaW5nQXBwbGljYXRpb25TdHlsZShBcmN3YXJlU3R5bGVzKTtcbiAgICBQaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGVzPy5hcHBseVN0eWxlU2hlZXQoKTtcbiAgfVxuXG4gIC8qKiBFbWl0IGFuIGV2ZW50IHRvd2FyZHMgdGhlIFVFIEFwcGxpY2F0aW9uLlxuICAgKiBNYWlubHkgdXNlZCB0byBidWJibGUgZXZlbnRzIGxpa2UgYSBidXR0b24gcHJlc3Mgb3Igb3RoZXIgY29tbWFuZCBpbnB1dHMgdG93YXJkcyB0aGUgVUUgQXBwbGljYXRpb24uXG4gICAqL1xuICBwdWJsaWMgZW1pdFVJSW50ZXJhY3Rpb24oZGVzY3JpcHRvcjogb2JqZWN0IHwgc3RyaW5nKSB7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIHRoaXM/LndlYlJ0Y0NvbnRyb2xsZXI/LmVtaXRVSUludGVyYWN0aW9uKGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENyZWF0ZXMgYSBoZWxwZXIgdGV4dCBmb3IgdGhlIENvbm5lY3Rpb24gT3ZlcmxheVxuICBwcml2YXRlIGFkZFRleHRUb0Nvbm5lY3RPdmVybGF5KCkge1xuICAgIGlmICghdGhpcz8uc3RyZWFtPy5jb25maWc/LmluaXRpYWxTZXR0aW5ncz8uQXV0b0Nvbm5lY3QpIHtcbiAgICAgIGlmICh0aGlzLnZpZGVvRWxlbWVudFBhcmVudCkge1xuICAgICAgICBjb25zdCBjb25uZWN0T3ZlcmxheSA9IHRoaXM/LnBhcmVudEVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIjY29ubmVjdE92ZXJsYXlcIik7XG4gICAgICAgIGlmIChjb25uZWN0T3ZlcmxheSkge1xuICAgICAgICAgIGNvbnN0IGNvbm5lY3Rpb25UZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgICAgICBjb25uZWN0aW9uVGV4dC5jbGFzc05hbWUgPSBcImNvbm5lY3Rpb24tdGV4dFwiO1xuICAgICAgICAgIGNvbm5lY3RPdmVybGF5LmFwcGVuZENoaWxkKGNvbm5lY3Rpb25UZXh0KTtcblxuICAgICAgICAgIGNvbnN0IHRpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICAgICAgdGl0bGUuY2xhc3NOYW1lID0gXCJ0aXRsZVwiO1xuICAgICAgICAgIHRpdGxlLnRleHRDb250ZW50ID0gXCJDbGljayBvbiB0aGUgYnV0dG9uIGJlbG93IHRvIHN0YXJ0IHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzdHJlYW1pbmcuXCI7XG4gICAgICAgICAgY29ubmVjdGlvblRleHQuYXBwZW5kQ2hpbGQodGl0bGUpO1xuXG4gICAgICAgICAgY29uc3Qgc3VidGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcbiAgICAgICAgICBzdWJ0aXRsZS5jbGFzc05hbWUgPSBcInN1YnRpdGxlXCI7XG4gICAgICAgICAgc3VidGl0bGUudGV4dENvbnRlbnQgPVxuICAgICAgICAgICAgXCJBZnRlciBjbGlja2luZyB0aGUgYnV0dG9uLCBpdCBtYXkgdGFrZSBhIGZldyBzZWNvbmRzIGZvciB0aGUgY29ubmVjdGlvbiB0byBzdGFydC4gRG9uJ3Qgd29ycnkgaWYgeW91IGRvbid0IHNlZSBhbiBpbW1lZGlhdGUgcmVhY3Rpb24uXCI7XG5cbiAgICAgICAgICBjb25uZWN0aW9uVGV4dC5hcHBlbmRDaGlsZChzdWJ0aXRsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBDb25maWcsIEZsYWdzLCBMb2dnZXIsIENvbmZpZ1BhcmFtcywgb3ZlcnJpZGVMb2dnZXIgfSBmcm9tIFwiQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNVwiO1xuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gXCIuL2RvbWFpbi9TZXNzaW9uXCI7XG5pbXBvcnQgeyBBcmN3YXJlU2V0dGluZ3NTY2hlbWEsIFNldHRpbmdzIH0gZnJvbSBcIi4vZG9tYWluL0FyY3dhcmVTZXR0aW5nc1NjaGVtYVwiO1xuXG4vKiogRGVmYXVsdCBhcmN3YXJlIHNpZ25hbGxpbmcgZW5kcG9pbnQuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdFVybCA9IGB3c3M6Ly9zaWduYWxsaW5nLWNsaWVudC5yYWduYXJvay5hcmN3YXJlLmNsb3VkYCBhcyBjb25zdDtcblxuLy8gVGhlIGJlbG93IExvZ2dlciBvdmVycmlkZXMgY2FuIGxpa2VseSBiZSByZW1vdmVkIGFzIFBTSW5mcmEgNS41IGxvZ2dlciBzdXBwb3J0cyBzZXR0aW5nIGxvZyB2ZXJib3NpdHlcbi8vIGFuZCB0aGVzZSBvdmVycmlkZXMgYXJlIG1hdGNoaW5nIHRoZSBkZWZhdWx0IGxvZ2dpbmcgYmVoYXZpb3VyIGFueXdheSAoZXhjZXB0IGluZm8pLlxuLypMb2dnZXIuSW5mbyA9IChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgLy8gY29uc29sZS5pbmZvKG1lc3NhZ2UpO1xufTtcbkxvZ2dlci5XYXJuaW5nID0gKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG59O1xuTG9nZ2VyLkVycm9yID0gKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICBpZiAobWVzc2FnZT8uc3RhcnRzV2l0aChcInVuaGFuZGxlZCBTdGF0IFR5cGVcIikpIHJldHVybjtcbiAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbn07Ki9cbkxvZ2dlci5Jbml0TG9nZ2luZygyLCBmYWxzZSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXJjd2FyZUNvbmZpZ1BhcmFtcyBleHRlbmRzIENvbmZpZ1BhcmFtcyB7XG4gIHNldHRpbmdzOiBTZXR0aW5ncztcbn1cblxuZXhwb3J0IGNsYXNzIEFyY3dhcmVDb25maWcgZXh0ZW5kcyBDb25maWcge1xuICAvKipcbiAgICogQ2FuIGJlIHVzZWQgdG8gZmV0Y2ggcHJvamVjdElkIGFuZCBzaGFyZUlkIGZyb20gdGhlIGN1cnJlbnQgdXJsLlxuICAgKiBFeGFtcGxlOlxuICAgKiAvc29tZXRoaW5nLzpwcm9qZWN0SWQvOnNoYXJlSWQvc29tZXRoaW5nP3NvbWV0aGluZyA9PiB7IHByb2plY3RJZCwgc2hhcmVJZCB9XG4gICAqIC86cHJvamVjdElkID0+IHsgcHJvamVjdElkIH1cbiAgICogLzpzaGFyZUlkID0+IHsgc2hhcmVJZCB9XG4gICAqIC86c2hhcmVJZC86cHJvamVjdElkID0+IHsgcHJvamVjdElkLCBzaGFyZUlkIH1cbiAgICpcbiAgICogVGhlIHByb2plY3RJZCBtdXN0IGJlIHV1aWR2NC5cbiAgICogVGhlIHNoYXJlSWQgbXVzdCBiZSBcInNoYXJlSWQtXCIgcHJlZml4ZWQuXG4gICAqXG4gICAqIFVzYWdlOlxuICAgKiAvLyBUaGlzIHdpbGwgc3ByZWFkIHRoZSBwcm9qZWN0SWQgYW5kIHRoZSBzaGFyZUlkIGludG8gdGhlIHNldHRpbmdzLiBEZWZpbmUgYW55dGhpbmcgeW91IHdhbnQgdG8gb3ZlcnJpZGUgYWZ0ZXIgdGhlIHNwcmVhZCBvcGVyYXRpb24uXG4gICAqIG5ldyBBcmN3YXJlQ29uZmlnKHsgc2V0dGluZ3M6IHsgLi4uQXJjd2FyZUNvbmZpZy5QaWNrSWRzT2ZVcmwoKSB9IH0pO1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBQaWNrSWRzT2ZVcmwoKTogUGljazxTZXR0aW5ncywgXCJzaGFyZUlkXCIgfCBcInByb2plY3RJZFwiPiB7XG4gICAgY29uc3QgeyBwYXRobmFtZSB9ID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgY29uc3Qgc2VjdGlvbnMgPSBwYXRobmFtZS5zcGxpdChcIi9cIik7XG4gICAgY29uc3QgcHJvamVjdElkID0gc2VjdGlvbnMuZmluZCgoc2VjdGlvbikgPT4gei5zdHJpbmcoKS51dWlkKCkuc2FmZVBhcnNlKHNlY3Rpb24pLnN1Y2Nlc3MpO1xuICAgIGNvbnN0IHNoYXJlSWQgPSBzZWN0aW9ucy5maW5kKChzZWN0aW9uKSA9PiB6LnN0cmluZygpLnN0YXJ0c1dpdGgoXCJzaGFyZS1cIikuc2FmZVBhcnNlKHNlY3Rpb24pLnN1Y2Nlc3MpO1xuICAgIHJldHVybiB7XG4gICAgICBwcm9qZWN0SWQsXG4gICAgICBzaGFyZUlkXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBzZXNzaW9uOiBTZXNzaW9uO1xuXG4gIHB1YmxpYyByZWFkb25seSBzZXR0aW5nczogU2V0dGluZ3M7XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbFNldHRpbmdzO1xuXG4gIHB1YmxpYyByZWFkb25seSBWRVJTSU9OID0gXCIxLjIuMTNcIjtcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEFyY3dhcmVDb25maWdQYXJhbXMpIHtcbiAgICBjb25zdCBkZlRva2VuID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoXG4gICAgICAuc2xpY2UoMSlcbiAgICAgIC5zcGxpdChcIiZcIilcbiAgICAgIC5maW5kKChxcCkgPT4gcXAuc3RhcnRzV2l0aChcImRmLVwiKSk7XG4gICAgaWYgKCFkZlRva2VuICYmICFjb25maWcuc2V0dGluZ3Muc2hhcmVJZCAmJiAhY29uZmlnLnNldHRpbmdzLnByb2plY3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTaGFyZUlkIG9yIFByb2plY3RJZCBtdXN0IGJlIHNwZWNpZmllZC5gKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBzZXR0aW5ncyBpbnB1dC5cbiAgICBjb25zdCBzZXR0aW5ncyA9IEFyY3dhcmVTZXR0aW5nc1NjaGVtYS5wYXJzZShjb25maWcuc2V0dGluZ3MpO1xuXG4gICAgLy8gU2V0dXAgYXJjd2FyZSBkZWZhdWx0IHNldHRpbmdzLlxuICAgIGlmICghY29uZmlnLmluaXRpYWxTZXR0aW5ncykgY29uZmlnLmluaXRpYWxTZXR0aW5ncyA9IHt9O1xuICAgIGlmICghY29uZmlnLmluaXRpYWxTZXR0aW5ncz8uaGFzT3duUHJvcGVydHkoXCJBdXRvQ29ubmVjdFwiKSkgY29uZmlnLmluaXRpYWxTZXR0aW5ncy5BdXRvQ29ubmVjdCA9IGZhbHNlO1xuICAgIC8vIGlmICghY29uZmlnLmluaXRpYWxTZXR0aW5ncz8uaGFzT3duUHJvcGVydHkoXCJIb3ZlcmluZ01vdXNlXCIpKSBjb25maWcuaW5pdGlhbFNldHRpbmdzLkhvdmVyaW5nTW91c2UgPSB0cnVlO1xuICAgIGlmICghY29uZmlnLmluaXRpYWxTZXR0aW5ncz8uaGFzT3duUHJvcGVydHkoXCJBRktUaW1lb3V0XCIpKSBjb25maWcuaW5pdGlhbFNldHRpbmdzLkFGS1RpbWVvdXQgPSA2MDA7XG4gICAgaWYgKCFjb25maWcuaW5pdGlhbFNldHRpbmdzLnNzKSBjb25maWcuaW5pdGlhbFNldHRpbmdzLnNzID0gRGVmYXVsdFVybDtcblxuICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNldHRpbmdzO1xuICAgIHRoaXMuc2Vzc2lvbiA9IG5ldyBTZXNzaW9uKCk7XG4gICAgdGhpcy5faW5pdGlhbFNldHRpbmdzID0gY29uZmlnLmluaXRpYWxTZXR0aW5ncztcblxuICAgIC8vIFNldHVwIGFyY3dhcmUgZGVmYXVsdCBzZXR0aW5ncy5cblxuICAgIHRoaXMuc2V0RmxhZ0VuYWJsZWQoRmxhZ3MuQUZLRGV0ZWN0aW9uLCB0cnVlKTtcblxuICAgIC8vIElNUE9SVEFOVCBOT1RFOiBUaGUgZmVhdHVyZSBCcm93c2VyU2VuZE9mZmVyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gUFNJbmZyYSA1LjUuXG4gICAgLy8gVGhlIG9mZmVyIGlzIG5vdyBleHBlY3RlZCB0byBjb21lIGZyb20gVUUuIEVuc3VyZSB0aGF0IHlvdXIgc2lnbmFsbGluZyBzZXJ2ZXIgc3VwcG9ydHMgdGhpcyBiZWhhdmlvdXIuXG5cbiAgICAvL3RoaXMuc2V0RmxhZ0VuYWJsZWQoRmxhZ3MuQnJvd3NlclNlbmRPZmZlciwgdHJ1ZSk7XG4gIH1cblxuICAvKiogU2V0dXAgY29ubmVjdGlvbiBzdHJpbmcuICovXG4gIHB1YmxpYyBnZXQgdXJsRmxhZ3MoKTogc3RyaW5nIHtcbiAgICBsZXQgZmxhZ3MgPSBcIlwiO1xuXG4gICAgLy8gU2V0dXAgY29ubmVjdGlvbiB2aWEgc2hhcmVJZC5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zaGFyZUlkKSBmbGFncyArPSBgJnNoPSR7dGhpcy5zZXR0aW5ncy5zaGFyZUlkfWA7XG4gICAgLy8gQWRkaXRpb25hbGx5IHNldHVwIHRoZSBwcm9qZWN0SWQgcHJvcGVydHkgaWYgdGhlIHNoYXJlSWQgaXMgc2V0IHVwIHdpdGggbXVsdGlwbGUgcHJvamVjdHMuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MucHJvamVjdElkKSBmbGFncyArPSBgJnA9JHt0aGlzLnNldHRpbmdzLnByb2plY3RJZH1gO1xuXG4gICAgLy8gU2V0dXAgZGlyZWN0IHNlc3Npb24gY29ubmVjdGlvbi5cbiAgICBpZiAodHlwZW9mIHRoaXMuc2V0dGluZ3Muc2Vzc2lvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZmxhZ3MgKz0gYCZzPSR7dGhpcy5zZXR0aW5ncy5zZXNzaW9ufWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNldHVwIHNlc3Npb24gcmVjb25uZWN0LlxuICAgICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5zZXNzaW9uLmlkO1xuICAgICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgICBmbGFncyArPSBgJnM9JHtzZXNzaW9uSWR9YDtcbiAgICAgICAgLy8gSWYgYSBzZXNzaW9uSWQgaXMgZmV0Y2hlZCBvdXQgb2YgdGhlIFNlc3Npb24gY2xhc3MsIGl0J3MgYSByZWNvbm5lY3Rpb24gYXR0ZW1wdC5cbiAgICAgICAgZmxhZ3MgKz0gYCZyPXRydWVgO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldHVwIGJ5cGFzcyBmbGFnLlxuICAgIGlmICh0aGlzLnNldHRpbmdzLmJ5cGFzcykgZmxhZ3MgKz0gYCZiPXRydWVgO1xuXG4gICAgLy8gU2V0dXAgYXV0aGVudGljYXRpb24gdG9rZW4gZm9yIHBsYXRmb3JtIGludGVybmFsIHByZXZpZXdpbmcuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MudG9rZW4pIGZsYWdzICs9IGAmdD0ke3RoaXMuc2V0dGluZ3MudG9rZW59YDtcblxuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcblxuICAgIC8vIEZldGNoIHJJZCBwYXJhbWV0ZXIgZnJvbSB0aGUgdXJsIGFuZCBwYXNzIGl0IHRvIHRoZSBjb25uZWN0aW9uIHN0cmluZy5cbiAgICBjb25zdCBySWQgPSBxdWVyeS5nZXQoXCJySWRcIikgPz8gdW5kZWZpbmVkO1xuICAgIGlmIChySWQpIGZsYWdzICs9IGAmcklkPSR7cklkfWA7XG5cbiAgICAvLyBTZXR1cCBEaXJlY3RGbG93LlxuICAgIGNvbnN0IGRmVG9rZW4gPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hcbiAgICAgIC5zbGljZSgxKVxuICAgICAgLnNwbGl0KFwiJlwiKVxuICAgICAgLmZpbmQoKHFwKSA9PiBxcC5zdGFydHNXaXRoKFwiZGYtXCIpKTtcbiAgICBpZiAoZGZUb2tlbikgZmxhZ3MgKz0gYCYke2RmVG9rZW59YDtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnN0YXJ0SGVpZ2h0ICYmIHRoaXMuc2V0dGluZ3Muc3RhcnRIZWlnaHQgPiAyMDApIGZsYWdzICs9IGAmaD0ke3RoaXMuc2V0dGluZ3Muc3RhcnRIZWlnaHR9YDtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLnN0YXJ0V2lkdGggJiYgdGhpcy5zZXR0aW5ncy5zdGFydFdpZHRoID4gMjAwKSBmbGFncyArPSBgJnc9JHt0aGlzLnNldHRpbmdzLnN0YXJ0V2lkdGh9YDtcblxuICAgIHJldHVybiBmbGFncztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5pdGlhbFNldHRpbmdzKCkge1xuICAgIHJldHVybiB0aGlzLl9pbml0aWFsU2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgbW9kaWZ5SW5pdGlhbFNldHRpbmdzKG1vdXNlTG9jazogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuc2V0RmxhZ0VuYWJsZWQoRmxhZ3MuSG92ZXJpbmdNb3VzZU1vZGUsIG1vdXNlTG9jayk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEFyY3dhcmVDb25maWcsIEFyY3dhcmVDb25maWdQYXJhbXMsIERlZmF1bHRVcmwgfSBmcm9tIFwiLi9BcmN3YXJlQ29uZmlnXCI7XG5pbXBvcnQgeyBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcgfSBmcm9tIFwiLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcbmltcG9ydCB7IEFyY3dhcmVBcHBsaWNhdGlvbiB9IGZyb20gXCIuL0FyY3dhcmVBcHBsaWNhdGlvblwiO1xuaW1wb3J0IHsgV2Vic29ja2V0U3RhdGUgfSBmcm9tIFwiLi9kb21haW4vQ29ubmVjdGlvbklkZW50aWZpZXJcIjtcblxudHlwZSBEZWVwUGFydGlhbDxUPiA9IFQgZXh0ZW5kcyBGdW5jdGlvbiA/IFQgOiBUIGV4dGVuZHMgb2JqZWN0ID8geyBbUCBpbiBrZXlvZiBUXT86IERlZXBQYXJ0aWFsPFRbUF0+IH0gOiBUO1xuXG5sZXQgZ2xvYmFsUGl4ZWxTdHJlYW1pbmc6IEFyY3dhcmVQaXhlbFN0cmVhbWluZyB8IG51bGwgPSBudWxsO1xubGV0IGdsb2JhbENvbmZpZzogQXJjd2FyZUNvbmZpZyB8IG51bGwgPSBudWxsO1xubGV0IGdsb2JhbEFwcGxpY2F0aW9uOiBBcmN3YXJlQXBwbGljYXRpb24gfCBudWxsID0gbnVsbDtcbmxldCBwcmV2aW91c1NoYXJlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xubGV0IHByZXZpb3VzUHJvamVjdElkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGZ1bmN0aW9uIEFyY3dhcmVJbml0KFxuICB7IHNoYXJlSWQsIHByb2plY3RJZCB9OiB7IHNoYXJlSWQ/OiBzdHJpbmc7IHByb2plY3RJZD86IHN0cmluZyB9LFxuICBjb25maWd1cmF0aW9uPzogRGVlcFBhcnRpYWw8QXJjd2FyZUNvbmZpZ1BhcmFtcz4sXG4gIGZvcmNlUmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgaWYgKHNoYXJlSWQgJiYgIXNoYXJlSWQuc3RhcnRzV2l0aChcInNoYXJlLVwiKSkgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHNoYXJlSWQtZm9ybWF0OiAnJHtzaGFyZUlkfScuYCk7XG5cbiAgaWYgKHNoYXJlSWQgJiYgcHJldmlvdXNTaGFyZUlkICE9PSBzaGFyZUlkKSB7XG4gICAgZ2xvYmFsQ29uZmlnID0gbnVsbDtcbiAgICBnbG9iYWxQaXhlbFN0cmVhbWluZyA9IG51bGw7XG4gICAgZ2xvYmFsQXBwbGljYXRpb24gPSBudWxsO1xuICAgIHByZXZpb3VzU2hhcmVJZCA9IHNoYXJlSWQ7XG4gIH1cbiAgaWYgKHByb2plY3RJZCAmJiBwcmV2aW91c1Byb2plY3RJZCAhPT0gcHJvamVjdElkKSB7XG4gICAgZ2xvYmFsQ29uZmlnID0gbnVsbDtcbiAgICBnbG9iYWxQaXhlbFN0cmVhbWluZyA9IG51bGw7XG4gICAgZ2xvYmFsQXBwbGljYXRpb24gPSBudWxsO1xuICAgIHByZXZpb3VzUHJvamVjdElkID0gcHJvamVjdElkO1xuICB9XG4gIGlmIChmb3JjZVJlZnJlc2gpIHtcbiAgICBnbG9iYWxDb25maWcgPSBudWxsO1xuICAgIGdsb2JhbFBpeGVsU3RyZWFtaW5nID0gbnVsbDtcbiAgICBnbG9iYWxBcHBsaWNhdGlvbiA9IG51bGw7XG4gICAgY29uc29sZS5pbmZvKFwiQXJjd2FyZUluaXQ6IEZvcmNlZCByZS1pbml0aWFsaXphdGlvblwiKTtcbiAgfVxuXG4gIGlmIChnbG9iYWxQaXhlbFN0cmVhbWluZyAmJiBnbG9iYWxDb25maWcgJiYgZ2xvYmFsQXBwbGljYXRpb24pIHtcbiAgICBjb25zb2xlLndhcm4oXCJBcmN3YXJlSW5pdDogUmV0dXJuaW5nIGV4aXN0aW5nIGluc3RhbmNlIHRvIHByZXZlbnQgbXVsdGlwbGUgV2ViU29ja2V0IGNvbm5lY3Rpb25zLlwiKTtcblxuICAgIHJldHVybiB7XG4gICAgICBDb25maWc6IGdsb2JhbENvbmZpZyxcbiAgICAgIFBpeGVsU3RyZWFtaW5nOiBnbG9iYWxQaXhlbFN0cmVhbWluZyxcbiAgICAgIEFwcGxpY2F0aW9uOiBnbG9iYWxBcHBsaWNhdGlvblxuICAgIH07XG4gIH1cblxuICBjb25zdCBDb25maWcgPSBuZXcgQXJjd2FyZUNvbmZpZyh7XG4gICAgdXNlVXJsUGFyYW1zOiBjb25maWd1cmF0aW9uPy51c2VVcmxQYXJhbXMgPT09IHRydWUsXG4gICAgaW5pdGlhbFNldHRpbmdzOiB7XG4gICAgICBzczogRGVmYXVsdFVybCxcbiAgICAgIEF1dG9Db25uZWN0OiBmYWxzZSxcbiAgICAgIFN0YXJ0VmlkZW9NdXRlZDogdHJ1ZSxcbiAgICAgIEF1dG9QbGF5VmlkZW86IHRydWUsXG4gICAgICBLZXlib2FyZElucHV0OiB0cnVlLFxuICAgICAgTW91c2VJbnB1dDogdHJ1ZSxcbiAgICAgIEdhbWVwYWRJbnB1dDogdHJ1ZSxcbiAgICAgIFRvdWNoSW5wdXQ6IHRydWUsXG4gICAgICBYUkNvbnRyb2xsZXJJbnB1dDogdHJ1ZSxcbiAgICAgIFVzZU1pYzogdHJ1ZSxcbiAgICAgIFN1cHByZXNzQnJvd3NlcktleXM6IHRydWUsXG4gICAgICBGYWtlTW91c2VXaXRoVG91Y2hlczogZmFsc2UsXG4gICAgICBGb3JjZU1vbm9BdWRpbzogZmFsc2UsXG4gICAgICBIb3ZlcmluZ01vdXNlOiB0cnVlLFxuICAgICAgLi4uY29uZmlndXJhdGlvbj8uaW5pdGlhbFNldHRpbmdzXG4gICAgfSxcbiAgICBzZXR0aW5nczoge1xuICAgICAgc2hhcmVJZCxcbiAgICAgIHByb2plY3RJZCxcbiAgICAgIGZ1bGxzY3JlZW5CdXR0b246IHRydWUsXG4gICAgICBhdWRpb0J1dHRvbjogdHJ1ZSxcbiAgICAgIHN0b3BCdXR0b246IGZhbHNlLFxuICAgICAgaW5mb0J1dHRvbjogZmFsc2UsXG4gICAgICBtaWNCdXR0b246IGZhbHNlLFxuICAgICAgc2V0dGluZ3NCdXR0b246IGZhbHNlLFxuICAgICAgY29ubmVjdGlvblN0cmVuZ3RoSWNvbjogZmFsc2UsXG4gICAgICBjb25uZWN0aW9uSWRlbnRpZmllckxvZ2dpbmdEaXNhYmxlZDogdW5kZWZpbmVkLFxuICAgICAgZXJyb3JIYW5kbGVyOiB1bmRlZmluZWQsXG4gICAgICBsb3ZlTGV0dGVySGFuZGxlcjogdW5kZWZpbmVkLFxuICAgICAgbG92ZUxldHRlckxvZ2dpbmc6IHVuZGVmaW5lZCxcbiAgICAgIHF1ZXVlSGFuZGxlcjogdW5kZWZpbmVkLFxuICAgICAgc2Vzc2lvbklkSGFuZGxlcjogdW5kZWZpbmVkLFxuICAgICAgc3RhcnRIZWlnaHQ6IHVuZGVmaW5lZCxcbiAgICAgIHN0YXJ0V2lkdGg6IHVuZGVmaW5lZCxcbiAgICAgIC4uLmNvbmZpZ3VyYXRpb24/LnNldHRpbmdzXG4gICAgfVxuICB9KTtcblxuICBjb25zdCBQaXhlbFN0cmVhbWluZyA9IG5ldyBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcoQ29uZmlnKTtcbiAgY29uc3QgQXBwbGljYXRpb24gPSBuZXcgQXJjd2FyZUFwcGxpY2F0aW9uKHsgc3RyZWFtOiBQaXhlbFN0cmVhbWluZyB9KTtcblxuICAvLyBTdG9yZSBnbG9iYWxseSB0byBwcmV2ZW50IG11bHRpcGxlIGluc3RhbmNlc1xuICBnbG9iYWxDb25maWcgPSBDb25maWc7XG4gIGdsb2JhbFBpeGVsU3RyZWFtaW5nID0gUGl4ZWxTdHJlYW1pbmc7XG4gIGdsb2JhbEFwcGxpY2F0aW9uID0gQXBwbGljYXRpb247XG5cbiAgcmV0dXJuIHtcbiAgICBDb25maWcsXG4gICAgUGl4ZWxTdHJlYW1pbmcsXG4gICAgQXBwbGljYXRpb25cbiAgfTtcbn1cbiIsImltcG9ydCB7IE1lc3NhZ2VzIH0gZnJvbSBcIkBhcmN3YXJlLWNsb3VkL3NoYXJlZC1waXhlbHN0cmVhbWluZy13ZWJzZGtcIjtcbmltcG9ydCB7XG4gIEFnZ3JlZ2F0ZWRTdGF0cyxcbiAgQmFzZU1lc3NhZ2UsXG4gIEZsYWdzLFxuICBMb2dnZXIsXG4gIE51bWVyaWNQYXJhbWV0ZXJzLFxuICBQaXhlbFN0cmVhbWluZyxcbiAgV2ViU29ja2V0VHJhbnNwb3J0LFxuICBQaXhlbFN0cmVhbWluZ092ZXJyaWRlc1xufSBmcm9tIFwiQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNVwiO1xuXG5pbXBvcnQgeyB6LCBab2RUeXBlIH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgQXJjd2FyZUNvbmZpZyB9IGZyb20gXCIuL0FyY3dhcmVDb25maWdcIjtcbmltcG9ydCB7IEFwcGx5VXJsSGFjayB9IGZyb20gXCIuL0FwcGx5VXJsSGFja1wiO1xuaW1wb3J0IHsgRXZlbnRIYW5kbGVyIH0gZnJvbSBcIi4vZG9tYWluL0V2ZW50SGFuZGxlclwiO1xuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gXCIuL2RvbWFpbi9TZXNzaW9uXCI7XG5pbXBvcnQgeyBTdGF0cyB9IGZyb20gXCIuL2RvbWFpbi9TdGF0c1wiO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gXCIuL2RvbWFpbi9kZWJvdW5jZVwiO1xuaW1wb3J0IHsgTG92ZUxldHRlcnMgfSBmcm9tIFwiLi91aS9Mb3ZlTGV0dGVyc1wiO1xuaW1wb3J0IHsgQXJjd2FyZUxvZ29Mb2FkZXIgfSBmcm9tIFwiLi91aS9BcmN3YXJlTG9nb0xvYWRlclwiO1xuaW1wb3J0IHsgTWljcm9waG9uZU92ZXJsYXkgfSBmcm9tIFwiLi91aS9NaWNyb3Bob25lT3ZlcmxheVwiO1xuaW1wb3J0IHsgQ29ubmVjdGlvbklkZW50aWZpZXIsIFdlYnNvY2tldFN0YXRlIH0gZnJvbSBcIi4vZG9tYWluL0Nvbm5lY3Rpb25JZGVudGlmaWVyXCI7XG5cbmV4cG9ydCBjbGFzcyBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcgZXh0ZW5kcyBQaXhlbFN0cmVhbWluZyB7XG4gIC8qKiBPdmVycmlkZSBkZWZhdWx0IGNvbmZpZyB3aXRoIEFyY3dhcmVDb25maWcuICovXG4gIHB1YmxpYyBvdmVycmlkZSBjb25maWc6IEFyY3dhcmVDb25maWc7XG4gIHB1YmxpYyBzdHJlYW1JbmZvPzogTWVzc2FnZXMuU3RyZWFtSW5mbztcbiAgcHVibGljIGxvdmVMZXR0ZXJzQ29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBsb3ZlTGV0dGVyc0xpc3Q6IHN0cmluZ1tdO1xuICBwcml2YXRlIGxvdmVMZXR0ZXJzUXVldWU6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgaXNQcm9jZXNzaW5nUXVldWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBtaWNyb3Bob25lT3ZlcmxheTogTWljcm9waG9uZU92ZXJsYXk7XG5cbiAgLyoqIFJldHVybnMgYSBsaXN0IG9mIFdlYlNvY2tldFN0YXRlcyBvZiBhbGwgUGl4ZWxTdHJlYW1pbmcgSW5zdGFuY2VzIGdlbmVyYXRlZC4gKi9cbiAgcHVibGljIGdldCBXZWJzb2NrZXRTdGF0ZXMoKSB7XG4gICAgcmV0dXJuIENvbm5lY3Rpb25JZGVudGlmaWVyLkluc3RhbmNlLkdldFdlYlNvY2tldFN0YXRlcygpO1xuICB9XG5cbiAgLyoqIENvdW50cyBhbGwgYWN0aXZlIFBpeGVsU3RyZWFtaW5nIEluc3RhbmNlcyBnZW5lcmF0ZWQuIChDT05ORUNUSU5HICYgQ09OTkVDVEVEKSAqL1xuICBwdWJsaWMgZ2V0IEFjdGl2ZUluc3RhbmNlcygpIHtcbiAgICByZXR1cm4gQ29ubmVjdGlvbklkZW50aWZpZXIuSW5zdGFuY2UuQWN0aXZlSW5zdGFuY2VzO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhpcyBQaXhlbFN0cmVhbWluZyBJbnN0YW5jZXMgd2Vic29ja2V0IHN0YXRlLiAqL1xuICBwdWJsaWMgZ2V0IHdlYnNvY2tldFN0YXRlKCk6IFdlYnNvY2tldFN0YXRlIHtcbiAgICBsZXQgc3RhdGU6IGFueSA9ICh0aGlzLndlYlJ0Y0NvbnRyb2xsZXI/LnRyYW5zcG9ydCBhcyBXZWJTb2NrZXRUcmFuc3BvcnQpPy53ZWJTb2NrZXQ/LnJlYWR5U3RhdGU7XG4gICAgcmV0dXJuIHN0YXRlICE9PSB1bmRlZmluZWQgPyAoc3RhdGUgYXMgV2Vic29ja2V0U3RhdGUpIDogV2ViU29ja2V0LkNMT1NFRDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQXJjd2FyZUNvbmZpZywgb3ZlcnJpZGVzPzogUGl4ZWxTdHJlYW1pbmdPdmVycmlkZXMpIHtcbiAgICAvKiogQXMgc29vbiBhcyB1cHN0cmVhbSBpcyBmaXhlZCwgd2UgZ290IHRvIGFkanVzdCB0aGUgdXJsIGJ1aWxkaW5nIHByb2Nlc3MuICovXG4gICAgQXBwbHlVcmxIYWNrKCk7XG5cbiAgICBzdXBlcihjb25maWcsIG92ZXJyaWRlcyk7XG5cbiAgICAvKiogVGhlb3JldGljYWxseSB0aGlzIGNhbGwgc2hvdWxkIGJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBzaWduYWxsaW5nIHVybCwgYnV0IHRoaXMgd291bGQgbm90IHdvcmsgYXQgYWxsLCBpZiBjb25maWcgaXMgc2V0dXAgZm9yIFwiQXV0b0Nvbm5lY3Q9dHJ1ZVwiXG4gICAgICogSW5zdGVhZCB3ZSB1c2UgQXBwbHlVcmxIYWNrKCk7XG4gICAgICovXG4gICAgLy8gdGhpcy5zZXRTaWduYWxsaW5nVXJsQnVpbGRlcigoKSA9PiB7XG4gICAgLy8gICBjb25zdCByZWdleCA9IC8oPzw9XFw/LiopXFw/L2c7XG4gICAgLy8gICBjb25zdCBzaWduYWxsaW5nU2VydmVyVXJsID0gdGhpcy5jb25maWcuZ2V0VGV4dFNldHRpbmdWYWx1ZShUZXh0UGFyYW1ldGVycy5TaWduYWxsaW5nU2VydmVyVXJsKTtcbiAgICAvLyAgIHJldHVybiBzaWduYWxsaW5nU2VydmVyVXJsICsgXCI/XCIgKyB0aGlzLmNvbmZpZy51cmxGbGFncztcbiAgICAvLyB9KTtcblxuICAgIC8vIFNldCBvdmVycmlkZSBjb25maWcuXG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5sb3ZlTGV0dGVyc0xpc3QgPSBbXTtcbiAgICB0aGlzLm1pY3JvcGhvbmVPdmVybGF5ID0gbmV3IE1pY3JvcGhvbmVPdmVybGF5KHRoaXMpO1xuXG4gICAgLy8gdGhpcy5sb3ZlTGV0dGVyc0NvbnRhaW5lciA9IG51bGw7XG5cbiAgICB0aGlzLndyYXBXZWJTb2NrZXRPbkNsb3NlSGFuZGxlcigpO1xuXG4gICAgLy8gQmluZCB0aGUgZXZlbnQgbGlzdGVuZXIgZnVuY3Rpb24gdG8gdGhlIGNsYXNzIGluc3RhbmNlXG4gICAgdGhpcy5oYW5kbGVSZXNvbHV0aW9uQ2hhbmdlID0gdGhpcy5oYW5kbGVSZXNvbHV0aW9uQ2hhbmdlLmJpbmQodGhpcyk7XG5cbiAgICAvLyBSZWdpc3RlciBtZXNzYWdlIGhhbmRsZXJzLlxuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXCJsZXR0ZXJcIiwgTWVzc2FnZXMuWkxvdmVMZXR0ZXIsIHRoaXMub25Mb3ZlTGV0dGVyKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFwic3RyZWFtSW5mb1wiLCBNZXNzYWdlcy5aU3RyZWFtSW5mbywgdGhpcy5vblN0cmVhbUluZm8pO1xuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXCJzZXNzaW9uSWRcIiwgTWVzc2FnZXMuWlNlc3Npb25JZCwgdGhpcy5vblNlc3Npb25JZCk7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcImVycm9yXCIsIE1lc3NhZ2VzLlpFcnJvck1lc3NhZ2UsIHRoaXMub25FcnJvcik7XG4gICAgdGhpcy5hZGRNZXNzYWdlSGFuZGxlcihcInBpbmdcIiwgTWVzc2FnZXMuWlBpbmcsIHRoaXMub25QaW5nKTtcbiAgICB0aGlzLmFkZE1lc3NhZ2VIYW5kbGVyKFwicXVldWVcIiwgTWVzc2FnZXMuWlF1ZXVlLCB0aGlzLm9uUXVldWUpO1xuICAgIHRoaXMuYWRkTWVzc2FnZUhhbmRsZXIoXCJ2ZXJzaW9uXCIsIE1lc3NhZ2VzLlpWZXJzaW9uLCB0aGlzLm9uVmVyc2lvbik7XG5cbiAgICAvLyBDcmVhdGUgYSBkZWJvdW5jZWQgdmVyc2lvbiBvZiB0aGUgaGFuZGxlUmVzb2x1dGlvbkNoYW5nZSBmdW5jdGlvblxuICAgIGNvbnN0IGRlYm91bmNlZFJlc29sdXRpb25DaGFuZ2UgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgICB0aGlzLmhhbmRsZVJlc29sdXRpb25DaGFuZ2UoKTtcbiAgICB9LCAwKTtcblxuICAgIC8vIFJlZ2lzdGVyIGV2ZW50IGxpc3RlbmVycy5cbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJ2aWRlb0luaXRpYWxpemVkXCIsIHRoaXMub25WaWRlb0luaXRpYWxpemVkLmJpbmQodGhpcykpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcInN0YXRzUmVjZWl2ZWRcIiwgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLnNlbmRTdGF0cyhldmVudC5kYXRhLmFnZ3JlZ2F0ZWRTdGF0cyk7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgdGhlIHdpbmRvdyByZXNpemUgZXZlbnQgbGlzdGVuZXJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCBkZWJvdW5jZWRSZXNvbHV0aW9uQ2hhbmdlKTtcblxuICAgIHRoaXMud2ViUnRjQ29udHJvbGxlci5zdHJlYW1NZXNzYWdlQ29udHJvbGxlci5yZWdpc3Rlck1lc3NhZ2VIYW5kbGVyKFxuICAgICAgMCwgLy8gTWVzc2FnZURpcmVjdGlvbi5Ub1N0cmVhbWVyLFxuICAgICAgXCJUZXh0Ym94RW50cnlcIixcbiAgICAgIChtZXNzYWdlRGF0YT86IHVua25vd24pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLndlYlJ0Y0NvbnRyb2xsZXIuc2VuZE1lc3NhZ2VDb250cm9sbGVyLnNlbmRNZXNzYWdlVG9TdHJlYW1lcihcbiAgICAgICAgICAgICdUZXh0Ym94RW50cnknLFxuICAgICAgICAgICAgbWVzc2FnZURhdGEgYXMgQXJyYXk8bnVtYmVyIHwgc3RyaW5nPlxuICAgICAgICAgIClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBUb1N0cmVhbWVyLlRleHRib3hFbnRyeWAsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcblxuICAgIHRoaXMuaW5pdExvdmVMZXR0ZXJzQ29udGFpbmVyKCk7XG4gICAgdGhpcy5jcmVhdGVNaWNyb3Bob25lT3ZlcmxheSgpO1xuXG4gICAgLy8gU2V0IHByZSBjb25maWd1cmVkIGhhbmRsZXJzLlxuICAgIGlmICh0aGlzLmNvbmZpZy5zZXR0aW5ncy5lcnJvckhhbmRsZXIpIHRoaXMuZXJyb3JIYW5kbGVyLmFkZCh0aGlzLmNvbmZpZy5zZXR0aW5ncy5lcnJvckhhbmRsZXIpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5zZXR0aW5ncy5xdWV1ZUhhbmRsZXIpIHRoaXMucXVldWVIYW5kbGVyLmFkZCh0aGlzLmNvbmZpZy5zZXR0aW5ncy5xdWV1ZUhhbmRsZXIpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5zZXR0aW5ncy5zZXNzaW9uSWRIYW5kbGVyKSB0aGlzLnNlc3Npb25JZEhhbmRsZXIuYWRkKHRoaXMuY29uZmlnLnNldHRpbmdzLnNlc3Npb25JZEhhbmRsZXIpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5zZXR0aW5ncy5sb3ZlTGV0dGVySGFuZGxlcikgdGhpcy5sb3ZlTGV0dGVySGFuZGxlci5hZGQodGhpcy5jb25maWcuc2V0dGluZ3MubG92ZUxldHRlckhhbmRsZXIpO1xuXG4gICAgQ29ubmVjdGlvbklkZW50aWZpZXIuSW5zdGFuY2UucmVnaXN0ZXIodGhpcyk7XG5cbiAgICB0aGlzLnJlbW92ZVhSSWNvbklmRGlzYWJsZWQoKTtcblxuICAgIHRoaXMuaGFuZGxlTW91c2VMb2NrKCk7XG4gIH1cblxuICAvKiogR2V0dGVyIGZvciB0aGUgc2Vzc2lvbiBvYmplY3QuICovXG4gIHB1YmxpYyBnZXQgc2Vzc2lvbigpOiBTZXNzaW9uIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuc2Vzc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiAqICogKiAqICogKlxuICAgKiAgTGlzdGVuICAgKlxuICAgKiAqICogKiAqICogKlxuICAgKi9cbiAgLyoqIE9uIHZlcnNpb24gcmVxdWVzdGVkLCB0aGUgdmVyc2lvbiBvZiB0aGUgV2ViU0RLIHdvdWxkIGJlIHJldHVybmVkLiAqL1xuICBwcml2YXRlIG9uVmVyc2lvbihtZXNzYWdlOiBNZXNzYWdlcy5WZXJzaW9uKSB7XG4gICAgdGhpcy5zZW5kKHsgdHlwZTogXCJ2ZXJzaW9uXCIsIHZlcnNpb246IHRoaXMuY29uZmlnLlZFUlNJT04gfSk7XG4gIH1cblxuICAvKiogT24gcGluZyB0aGUgc2Vzc2lvbiBjcmVhdGlvbiB0aW1lc3RhbXAgd2lsbCBiZSB1cGRhdGVkLiAqL1xuICBwcml2YXRlIG9uUGluZyhtZXNzYWdlOiBNZXNzYWdlcy5QaW5nKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmlzRmxhZ0VuYWJsZWQoXCJIb3ZlcmluZ01vdXNlXCIpICE9PSAhdGhpcz8uc3RyZWFtSW5mbz8uc3RyZWFtSW5mby5tZXRhPy5tb3VzZUxvY2spXG4gICAgICB0aGlzLmhhbmRsZU1vdXNlTG9jaygpO1xuICAgIGlmICh0aGlzLnNlc3Npb24uY3VycmVudCkgdGhpcy5zZXNzaW9uLnNldCh0aGlzLnNlc3Npb24uY3VycmVudCk7XG4gIH1cblxuICAvKiogSGFuZGxlIGluY29taW5nIGNvbmZpZ3VyYXRpb25zLiAqL1xuICAvLyBwdWJsaWMgcmVhZG9ubHkgc3RyZWFtSW5mb0hhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyPG5ldmVyPigpO1xuICBwcml2YXRlIG9uU3RyZWFtSW5mbyhzdHJlYW1JbmZvOiBNZXNzYWdlcy5TdHJlYW1JbmZvKSB7XG4gICAgTG9nZ2VyLkluZm8oYFN0cmVhbUluZm8gcmVjZWl2ZWQuYCk7XG5cbiAgICAvLyBTYXZlIHRoZSBzdHJlYW1JbmZvIHRvIHRoZSBpbnN0YW5jZSB2YXJpYWJsZVxuICAgIHRoaXMuc3RyZWFtSW5mbyA9IHN0cmVhbUluZm87XG5cbiAgICAvLyBCeSBzZXR0aW5nIHRoaXMgaGlkZGVuIGZsYWcsIHRoZSBldmFsdWF0aW9uIG9mIHRoZSBzdHJlYW1JbmZvIGNhbiBiZSBjdXQgb2ZmLlxuICAgIC8vIEN1dHRpbmcgb2YgdGhlIHN0cmVhbUluZm8gY2FuIGxlYWQgdG8gdW53YW50ZWQgYmVoYXZpb3IsIHRoZXJlZm9yZSBpdCdzIG5vdCBhZHZlcnRpc2VkLlxuICAgIGlmICghKHRoaXMuY29uZmlnPy5zZXR0aW5ncyBhcyB7IFwiZG8tbm90LWV2YWwtc3RyZWFtSW5mb1wiPzogdHJ1ZSB9KT8uW1wiZG8tbm90LWV2YWwtc3RyZWFtSW5mb1wiXSkge1xuICAgICAgY29uc3QgeyBhZmsgfSA9IHN0cmVhbUluZm8uc3RyZWFtSW5mbztcbiAgICAgIGlmIChhZmspIHtcbiAgICAgICAgdGhpcy5jb25maWcuc2V0RmxhZ0VuYWJsZWQoRmxhZ3MuQUZLRGV0ZWN0aW9uLCBhZmsuZW5hYmxlZCk7XG4gICAgICAgIHRoaXMuY29uZmlnLnNldE51bWVyaWNTZXR0aW5nKE51bWVyaWNQYXJhbWV0ZXJzLkFGS1RpbWVvdXRTZWNzLCBhZmsud2FybiArIGFmay5lcnJvcik7XG4gICAgICAgIC8vIEhhY2tcbiAgICAgICAgY29uc3QgeyBhZmtDb250cm9sbGVyIH0gPSB0aGlzLndlYlJ0Y0NvbnRyb2xsZXI7XG4gICAgICAgIGFma0NvbnRyb2xsZXIuY291bnREb3duID0gYWZrLmFjdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVsZXZhbnQgc2V0dGluZ3MgbmVlZCB0byBiZSBpbnRlcnByZXRlZCB3aGVuIHRoZXkgY29tZSB0aHJvdWdoIHRoZSBzdHJlYW1JbmZvIHRvIHRoZSBjbGllbnQuXG4gICAgICBpZiAoc3RyZWFtSW5mby5zdHJlYW1JbmZvLndlYlNka1NldHRpbmdzPy5pbml0KSB7XG4gICAgICAgIHRoaXMuY29uZmlnLnNldFNldHRpbmdzKHN0cmVhbUluZm8uc3RyZWFtSW5mby53ZWJTZGtTZXR0aW5ncy5pbml0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0cmVhbUluZm8uc3RyZWFtSW5mby53ZWJTZGtTZXR0aW5ncz8uY29uZikge1xuICAgICAgICBPYmplY3QuZW50cmllcyhzdHJlYW1JbmZvLnN0cmVhbUluZm8ud2ViU2RrU2V0dGluZ3MuY29uZikuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgY29uc3QgayA9IGtleSBhcyBrZXlvZiB0eXBlb2YgdGhpcy5jb25maWcuc2V0dGluZ3M7XG4gICAgICAgICAgdGhpcy5jb25maWcuc2V0dGluZ3Nba10gPSB2YWx1ZSBhcyBuZXZlcjtcblxuICAgICAgICAgIGlmIChrZXkgPT09IFwiY29ubmVjdGlvbklkZW50aWZpZXJMb2dnaW5nRGlzYWJsZWRcIiAmJiB2YWx1ZSA9PT0gdHJ1ZSkgQ29ubmVjdGlvbklkZW50aWZpZXIuSW5zdGFuY2UuZGlzYWJsZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZU1vdXNlTG9jaygpO1xuICAgIHRoaXMuaW5qZWN0Q3VzdG9tVUkoKTtcblxuICAgIC8vIEV2ZW50SGFuZGxlci5FbWl0KHRoaXMuc3RyZWFtSW5mb0hhbmRsZXIsIHVuZGVmaW5lZCBhcyBuZXZlcik7XG4gIH1cblxuICAvLyBFeHRlcm5hbGl6ZWRcblxuICAvKiogT24gcGluZyB0aGUgc2Vzc2lvbiBjcmVhdGlvbiB0aW1lc3RhbXAgd2lsbCBiZSB1cGRhdGVkLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcXVldWVIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcjxNZXNzYWdlcy5RdWV1ZT4oKTtcbiAgcHJpdmF0ZSBvblF1ZXVlKG1lc3NhZ2U6IE1lc3NhZ2VzLlF1ZXVlKSB7XG4gICAgTG9nZ2VyLkluZm8oYFF1ZXVlSW5mbyByZWNlaXZlZC5gKTtcbiAgICBFdmVudEhhbmRsZXIuRW1pdCh0aGlzLnF1ZXVlSGFuZGxlciwgbWVzc2FnZSk7XG4gIH1cblxuICAvKiogRXJyb3IgcmVjZWl2ZXIuICovXG4gIHB1YmxpYyByZWFkb25seSBlcnJvckhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyPE1lc3NhZ2VzLkVycm9yTWVzc2FnZT4oKTtcbiAgcHJpdmF0ZSBvbkVycm9yKGVycm9yOiBNZXNzYWdlcy5FcnJvck1lc3NhZ2UpIHtcbiAgICBMb2dnZXIuRXJyb3IoZXJyb3IudHlwZSk7XG4gICAgRXZlbnRIYW5kbGVyLkVtaXQodGhpcy5lcnJvckhhbmRsZXIsIGVycm9yKTtcbiAgfVxuXG4gIC8qKiBMb3ZlTGV0dGVyICovXG4gIHB1YmxpYyByZWFkb25seSBsb3ZlTGV0dGVySGFuZGxlciA9IG5ldyBFdmVudEhhbmRsZXI8TWVzc2FnZXMuTG92ZUxldHRlcj4oKTtcbiAgcHJpdmF0ZSBvbkxvdmVMZXR0ZXIobG92ZUxldHRlcjogTWVzc2FnZXMuTG92ZUxldHRlcikge1xuICAgIC8vIExvZ2dlci5JbmZvKExvZ2dlci5HZXRTdGFja1RyYWNlKCksIGxvdmVMZXR0ZXIucmVhc29uKTtcbiAgICBpZiAodGhpcy5jb25maWcuc2V0dGluZ3MubG92ZUxldHRlckxvZ2dpbmcpIGNvbnNvbGUuaW5mbyhsb3ZlTGV0dGVyLnJlYXNvbik7XG4gICAgRXZlbnRIYW5kbGVyLkVtaXQodGhpcy5sb3ZlTGV0dGVySGFuZGxlciwgbG92ZUxldHRlcik7XG4gICAgdGhpcy5wdXNoTGV0dGVyKGxvdmVMZXR0ZXIucmVhc29uKTtcbiAgfVxuXG4gIC8qKiBTZXNzaW9uSWQgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlc3Npb25JZEhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyPHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBvblNlc3Npb25JZChtZXNzYWdlOiBNZXNzYWdlcy5TZXNzaW9uSWQpIHtcbiAgICBMb2dnZXIuSW5mbyhtZXNzYWdlLnNlc3Npb25JZCk7XG4gICAgLy8gY29uc29sZS5pbmZvKGBTZXNzaW9uOiAke21lc3NhZ2Uuc2Vzc2lvbklkfWApO1xuICAgIHRoaXMuc2Vzc2lvbi5zZXQobWVzc2FnZS5zZXNzaW9uSWQpO1xuXG4gICAgRXZlbnRIYW5kbGVyLkVtaXQodGhpcy5zZXNzaW9uSWRIYW5kbGVyLCBtZXNzYWdlLnNlc3Npb25JZCk7XG4gIH1cblxuICAvKiogVmlkZW9Jbml0aWFsaXplZCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdmlkZW9Jbml0aWFsaXplZEhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyPG5ldmVyPigpO1xuICBwcml2YXRlIG9uVmlkZW9Jbml0aWFsaXplZCgpOiB2b2lkIHtcbiAgICAvKiogVGhlIHZpZGVvSW5pdGlhbGl6ZWQgZXZlbnQgaXMgaW1wb3J0YW50IGZvciB0aGUgQXJjd2FyZSBDbG91ZCBCQWNrZW5kLCBzaW5jZSB3aXRob3V0IHRoYXQgZXZlbnQgdGhlIGluc3RhbmNlIHdpbGwgYmUgY2xlYW5lZCB1cCAoa2lsbGVkKS4gKi9cbiAgICB0aGlzLmhhbmRsZU1vdXNlTG9jaygpO1xuICAgIHRoaXMuc2VuZCh7IHR5cGU6IFwib25WaWRlb0luaXRpYWxpemVkXCIgfSk7XG4gICAgRXZlbnRIYW5kbGVyLkVtaXQodGhpcy52aWRlb0luaXRpYWxpemVkSGFuZGxlciwgdW5kZWZpbmVkIGFzIG5ldmVyKTtcbiAgICB0aGlzLmhhbmRsZVJlc29sdXRpb25DaGFuZ2UoKTtcbiAgICB0aGlzLmhhbmRsZVJlbW92ZUxvdmVMZXR0ZXJzKCk7XG4gICAgdGhpcy5taWNyb3Bob25lT3ZlcmxheS50b2dnbGVWaXNpYmlsaXR5KGZhbHNlKTtcbiAgICB0aGlzLmFwcGx5UmVzb2x1dGlvbklmUGxheWluZygpO1xuICAgIHRoaXMucmVtb3ZlWFJJY29uSWZEaXNhYmxlZCgpO1xuICB9XG5cbiAgLy8gSW50ZXJuYWxcbiAgLyoqIFdlYlNvY2tldCBDbG9zZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd2Vic29ja2V0T25DbG9zZUhhbmRsZXIgPSBuZXcgRXZlbnRIYW5kbGVyPENsb3NlRXZlbnQ+KCk7XG5cbiAgLyoqIEFkZGluZyBhIHpvZC1zYWZlIGhhbmRsZXIuICovXG4gIHByaXZhdGUgYWRkTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIHsgdHlwZT86IHN0cmluZyB9PihcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgem9kOiBab2RUeXBlPFQ+LFxuICAgIGJvdW5kTWV0aG9kOiAodGhpczogdGhpcywgcGF5bG9hZDogei5pbmZlcjx0eXBlb2Ygem9kPikgPT4gdm9pZFxuICApIHtcbiAgICB0aGlzLnNpZ25hbGxpbmdQcm90b2NvbC5hZGRMaXN0ZW5lcih0eXBlLCAocGF5bG9hZDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBwYXJzZWQgPSB6b2Quc2FmZVBhcnNlKHBheWxvYWQpO1xuICAgICAgaWYgKHBhcnNlZC5zdWNjZXNzKSBib3VuZE1ldGhvZC5jYWxsKHRoaXMsIHBhcnNlZC5kYXRhKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGNhc3QgaGFzIHRvIGJlIGRvbmUsIHNpbmNlIEZyb250ZW5kIGRvZXMgbm90IHVzZSB0eXBlc2NyaXB0LXN0cmljdCBzZXR0aW5nLlxuICAgICAgICBjb25zdCBwYXJzZWRFcnJvciA9IHBhcnNlZCBhcyB1bmtub3duIGFzIHouU2FmZVBhcnNlRXJyb3I8VD47XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBVbmV4cGVjdGVkIG1lc3NhZ2UgY29udGVudC4gRXZlbnQ6JyR7dHlwZX0nLCBab2RFcnJvcjogJHtwYXJzZWRFcnJvci5lcnJvci5tZXNzYWdlfWApO1xuICAgICAgICBMb2dnZXIuRXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICogKiAqICogKlxuICAgKiAgU2VuZCAgICpcbiAgICogKiAqICogKiAqXG4gICAqL1xuICBwcml2YXRlIHNlbmRTdGF0cyhzdGF0czogQWdncmVnYXRlZFN0YXRzKSB7XG4gICAgY29uc3QgbWVzc2FnZTogTWVzc2FnZXMuU3RhdHMgPSB7IHR5cGU6IFwic3RhdHNcIiwgc3RhdHM6IFN0YXRzKHN0YXRzKSB9O1xuICAgIC8vIFRoaXMgY2FzdCBoYXMgdG8gYmUgZG9uZSwgc2luY2UgRnJvbnRlbmQgZG9lcyBub3QgdXNlIHR5cGVzY3JpcHQtc3RyaWN0IHNldHRpbmcuXG4gICAgdGhpcy5zZW5kKG1lc3NhZ2UgYXMgeyB0eXBlOiBzdHJpbmcgfSk7XG4gIH1cblxuICBwcml2YXRlIHNlbmQ8VCBleHRlbmRzIHsgdHlwZTogc3RyaW5nIH0+KG1lc3NhZ2U6IFQpOiB2b2lkO1xuICBwcml2YXRlIHNlbmQ8SyBleHRlbmRzIGtleW9mIHR5cGVvZiBNZXNzYWdlcy5TZW5kPihtZXNzYWdlOiB7IHR5cGU6IEsgfSAmIHouaW5mZXI8KHR5cGVvZiBNZXNzYWdlcy5TZW5kKVtLXT4pOiB2b2lkO1xuICBwcml2YXRlIHNlbmQ8VCBleHRlbmRzIHsgdHlwZTogc3RyaW5nIH0sIEsgZXh0ZW5kcyBrZXlvZiB0eXBlb2YgTWVzc2FnZXMuU2VuZD4oXG4gICAgbWVzc2FnZTogVCB8ICh7IHR5cGU6IEsgfSAmIHouaW5mZXI8KHR5cGVvZiBNZXNzYWdlcy5TZW5kKVtLXT4pXG4gICkge1xuICAgIGlmIChNZXNzYWdlcy5TZW5kW21lc3NhZ2UudHlwZSBhcyBLXSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gTWVzc2FnZXMuU2VuZFttZXNzYWdlLnR5cGUgYXMgS10hLnNhZmVQYXJzZShtZXNzYWdlKTtcbiAgICAgIGlmIChyZXN1bHQuc3VjY2VzcykgdGhpcy5zaWduYWxsaW5nUHJvdG9jb2wuc2VuZE1lc3NhZ2UocmVzdWx0LmRhdGEgYXMgQmFzZU1lc3NhZ2UpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgY2FzdCBoYXMgdG8gYmUgZG9uZSwgc2luY2UgRnJvbnRlbmQgZG9lcyBub3QgdXNlIHR5cGVzY3JpcHQtc3RyaWN0IHNldHRpbmcuXG4gICAgICAgIGNvbnN0IHBhcnNlZEVycm9yID0gcmVzdWx0IGFzIHVua25vd24gYXMgei5TYWZlUGFyc2VFcnJvcjxUPjtcbiAgICAgICAgTG9nZ2VyLkVycm9yKGBGYWlsZWQgdG8gc2VuZC4gJHtwYXJzZWRFcnJvci5lcnJvcn1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaWduYWxsaW5nUHJvdG9jb2wuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZXNvbHV0aW9uQ2hhbmdlKCkge1xuICAgIC8vIEdldCB0aGUgcmVzb2x1dGlvbiBmcm9tIHRoZSBzdHJlYW1JbmZvIGlmIGF2YWlsYWJsZVxuICAgIGlmICghdGhpcz8uc3RyZWFtSW5mbyB8fCAhdGhpcz8ud2ViUnRjQ29udHJvbGxlciB8fCAhdGhpcz8ud2ViUnRjQ29udHJvbGxlcj8udmlkZW9QbGF5ZXI/LmdldFZpZGVvRWxlbWVudCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEdldCB0aGUgcmVzb2x1dGlvbiBmcm9tIHRoZSBzdHJlYW1JbmZvIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IHJlc29sdXRpb24gPSB0aGlzPy5zdHJlYW1JbmZvPy5zdHJlYW1JbmZvPy5yZXNvbHV0aW9uO1xuICAgIGNvbnN0IHVucmVhbFZlcnNpb24gPSB0aGlzPy5zdHJlYW1JbmZvPy5zdHJlYW1JbmZvPy5tZXRhPy52ZXJzaW9uO1xuICAgIC8vIENoZWNrIGlmIHJlc29sdXRpb24uZHluYW1pYyBpcyB0cnVlXG4gICAgaWYgKHJlc29sdXRpb24gJiYgcmVzb2x1dGlvbj8uZHluYW1pYykge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgdmlkZW9QbGF5ZXIgfSA9IHRoaXM/LndlYlJ0Y0NvbnRyb2xsZXI7XG4gICAgICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHZpZGVvUGxheWVyPy5nZXRWaWRlb1BhcmVudEVsZW1lbnQoKTtcbiAgICAgICAgY29uc3QgYnJvd3NlcldpZHRoID0gdmlkZW9FbGVtZW50UGFyZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgY29uc3QgYnJvd3NlckhlaWdodCA9IHZpZGVvRWxlbWVudFBhcmVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgIC8vIERlZmluZSBtYXhpbXVtIGFsbG93ZWQgcmVzb2x1dGlvblxuICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHJlc29sdXRpb24/LndpZHRoO1xuICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSByZXNvbHV0aW9uPy5oZWlnaHQ7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGJyb3dzZXIgdmlld3BvcnRcbiAgICAgICAgY29uc3QgYXNwZWN0UmF0aW8gPSBicm93c2VyV2lkdGghIC8gYnJvd3NlckhlaWdodCE7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBuZXcgd2lkdGggYW5kIGhlaWdodCBiYXNlZCBvbiB0aGUgYXNwZWN0IHJhdGlvXG4gICAgICAgIGxldCBsaW1pdGVkV2lkdGgsIGxpbWl0ZWRIZWlnaHQ7XG4gICAgICAgIGlmIChhc3BlY3RSYXRpbyA+IG1heFdpZHRoIC8gbWF4SGVpZ2h0KSB7XG4gICAgICAgICAgLy8gV2lkdGggaXMgdGhlIGxpbWl0aW5nIGZhY3RvclxuICAgICAgICAgIGxpbWl0ZWRXaWR0aCA9IG1heFdpZHRoO1xuICAgICAgICAgIGxpbWl0ZWRIZWlnaHQgPSBtYXhXaWR0aCAvIGFzcGVjdFJhdGlvO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEhlaWdodCBpcyB0aGUgbGltaXRpbmcgZmFjdG9yXG4gICAgICAgICAgbGltaXRlZEhlaWdodCA9IG1heEhlaWdodDtcbiAgICAgICAgICBsaW1pdGVkV2lkdGggPSBtYXhIZWlnaHQgKiBhc3BlY3RSYXRpbztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2aWRlb1BsYXllcikge1xuICAgICAgICAgIC8vIENoZWNrIFVucmVhbCBFbmdpbmUgdmVyc2lvblxuICAgICAgICAgIGlmICghdW5yZWFsVmVyc2lvbiB8fCB1bnJlYWxWZXJzaW9uPy5zdGFydHNXaXRoKFwiNC4yN1wiKSkge1xuICAgICAgICAgICAgLy8gVXNlIHRoZSBhc3BlY3QgcmF0aW8gbGltaXRlZCByZXNvbHV0aW9uIGZvciB0aGUgci5zZXRyZXMgY29tbWFuZFxuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHsgQ29uc29sZTogYHIuc2V0cmVzICR7TWF0aC5yb3VuZChsaW1pdGVkV2lkdGgpfXgke01hdGgucm91bmQobGltaXRlZEhlaWdodCl9d2AgfTtcbiAgICAgICAgICAgIHRoaXM/LndlYlJ0Y0NvbnRyb2xsZXI/LmVtaXRVSUludGVyYWN0aW9uKGRlc2NyaXB0b3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBVc2UgdGhlIGFzcGVjdCByYXRpbyBsaW1pdGVkIHJlc29sdXRpb24gZm9yIHRoZSBvbk1hdGNoVmlld3BvcnRSZXNvbHV0aW9uQ2FsbGJhY2tcbiAgICAgICAgICAgIHZpZGVvUGxheWVyLm9uTWF0Y2hWaWV3cG9ydFJlc29sdXRpb25DYWxsYmFjayhNYXRoLnJvdW5kKGxpbWl0ZWRXaWR0aCksIE1hdGgucm91bmQobGltaXRlZEhlaWdodCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVJlc29sdXRpb25JZlBsYXlpbmcoKSB7XG4gICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdGhpcz8ud2ViUnRjQ29udHJvbGxlcj8udmlkZW9QbGF5ZXIuZ2V0VmlkZW9FbGVtZW50KCk7XG4gICAgaWYgKHZpZGVvRWxlbWVudCkge1xuICAgICAgdmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwbGF5aW5nXCIsICgpID0+IHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcz8uaGFuZGxlUmVzb2x1dGlvbkNoYW5nZSgpO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVQbGF5ZXIoKSB7XG4gICAgLy90aGlzLnNpZ25hbGxpbmdQcm90b2NvbC5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1vdXNlTG9jaygpIHtcbiAgICB0aGlzPy5jb25maWc/Lm1vZGlmeUluaXRpYWxTZXR0aW5ncyghdGhpcz8uc3RyZWFtSW5mbz8uc3RyZWFtSW5mby5tZXRhPy5tb3VzZUxvY2spO1xuICB9XG5cbiAgcHVibGljIGluaXRMb3ZlTGV0dGVyc0NvbnRhaW5lcigpIHtcbiAgICBjb25zdCBsb2dvTG9hZGVyID0gbmV3IEFyY3dhcmVMb2dvTG9hZGVyKCk7XG4gICAgaWYgKCF0aGlzLmxvdmVMZXR0ZXJzQ29udGFpbmVyKSB7XG4gICAgICBjb25zdCBsb3ZlTGV0dGVyc0NvbnRhaW5lciA9IGRvY3VtZW50Py5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgY29uc3QgeyB2aWRlb1BsYXllciB9ID0gdGhpcz8ud2ViUnRjQ29udHJvbGxlcjtcbiAgICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHZpZGVvUGxheWVyLmdldFZpZGVvUGFyZW50RWxlbWVudCgpO1xuICAgICAgbG92ZUxldHRlcnNDb250YWluZXI/LmNsYXNzTGlzdD8uYWRkKFwibG92ZS1sZXR0ZXJzLWJveC1yb290XCIpO1xuICAgICAgdmlkZW9FbGVtZW50UGFyZW50Py5hcHBlbmRDaGlsZChsb3ZlTGV0dGVyc0NvbnRhaW5lcik7XG4gICAgICBjb25zdCBsZXR0ZXJzQmxvY2sgPSBkb2N1bWVudD8uY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGxldHRlcnNCbG9jay5pZCA9IFwibGV0dGVycy1ibG9ja1wiO1xuICAgICAgY29uc3QgbGV0dGVyc1dyYXBwZXIgPSBkb2N1bWVudD8uY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGxldHRlcnNXcmFwcGVyLmlkID0gXCJsZXR0ZXJzLXdyYXBwZXJcIjtcbiAgICAgIGlmIChsb3ZlTGV0dGVyc0NvbnRhaW5lcikge1xuICAgICAgICBsZXR0ZXJzQmxvY2s/LmFwcGVuZENoaWxkKGxvZ29Mb2FkZXI/LmFyY3dhcmVMb2dvTG9hZGVyKTtcbiAgICAgICAgbG92ZUxldHRlcnNDb250YWluZXI/LmFwcGVuZENoaWxkKGxldHRlcnNCbG9jayk7XG4gICAgICAgIGxldHRlcnNCbG9jaz8uYXBwZW5kQ2hpbGQobGV0dGVyc1dyYXBwZXIpO1xuICAgICAgfVxuXG4gICAgICBsZXR0ZXJzQmxvY2suaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgIGlmIChsZXR0ZXJzQmxvY2spIHtcbiAgICAgICAgbGV0dGVyc0Jsb2NrPy5hcHBlbmRDaGlsZChsb2dvTG9hZGVyPy5hcmN3YXJlTG9nb0xvYWRlcik7XG4gICAgICAgIGxldHRlcnNCbG9jaz8uYXBwZW5kQ2hpbGQobGV0dGVyc1dyYXBwZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcHVzaExldHRlcihsZXR0ZXI6IHN0cmluZykge1xuICAgIC8vIEFkZCB0aGUgbGV0dGVyIHRvIHRoZSBxdWV1ZVxuICAgIHRoaXM/LmxvdmVMZXR0ZXJzUXVldWU/LnB1c2gobGV0dGVyKTtcblxuICAgIC8vIElmIG5vdCBhbHJlYWR5IHByb2Nlc3NpbmcgdGhlIHF1ZXVlLCBzdGFydCBwcm9jZXNzaW5nXG4gICAgaWYgKCF0aGlzLmlzUHJvY2Vzc2luZ1F1ZXVlKSB7XG4gICAgICB0aGlzPy5wcm9jZXNzTG92ZUxldHRlclF1ZXVlKCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcHJvY2Vzc0xvdmVMZXR0ZXJRdWV1ZSgpIHtcbiAgICAvLyBTZXQgdGhlIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgcHJvY2Vzc2luZyB0aGUgcXVldWVcbiAgICB0aGlzLmlzUHJvY2Vzc2luZ1F1ZXVlID0gdHJ1ZTtcbiAgICAvLyBUYWtlIHRoZSBmaXJzdCBpdGVtIGZyb20gdGhlIHF1ZXVlXG4gICAgY29uc3QgbGV0dGVyID0gdGhpcy5sb3ZlTGV0dGVyc1F1ZXVlLnNoaWZ0KCk7XG4gICAgaWYgKGxldHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRMb3ZlTGV0dGVyOiBzdHJpbmcgPSBsZXR0ZXI/LnJlcGxhY2UoL0xMOiB8XFwuJC9nLCBcIlwiKTtcbiAgICAgIHRoaXM/LmxvdmVMZXR0ZXJzTGlzdD8ucHVzaChmb3JtYXR0ZWRMb3ZlTGV0dGVyKTtcbiAgICAgIGNvbnN0IGxvdmVMZXR0ZXJzQm94ID0gbmV3IExvdmVMZXR0ZXJzKCk7XG4gICAgICBsb3ZlTGV0dGVyc0JveD8uYWRkTGV0dGVyKGZvcm1hdHRlZExvdmVMZXR0ZXIsIHRoaXM/LmxvdmVMZXR0ZXJzTGlzdD8ubGVuZ3RoKTtcbiAgICAgIC8vIFByb2Nlc3MgdGhlIG5leHQgaXRlbSBpbiB0aGUgcXVldWUgYWZ0ZXIgYSBkZWxheVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xvdmVMZXR0ZXJRdWV1ZSgpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgcmVzZXQgdGhlIGZsYWdcbiAgICAgIHRoaXMuaXNQcm9jZXNzaW5nUXVldWUgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlbW92ZUxvdmVMZXR0ZXJzKCkge1xuICAgIGNvbnN0IGxvdmVMZXR0ZXJzQ29udGFpbmVyID0gZG9jdW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIubG92ZS1sZXR0ZXJzLWJveC1yb290XCIpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKGxvdmVMZXR0ZXJzQ29udGFpbmVyKSB7XG4gICAgICAgIGxvdmVMZXR0ZXJzQ29udGFpbmVyPy5jbGFzc0xpc3Q/LmFkZChcImZhZGUtb3V0XCIpO1xuICAgICAgfVxuICAgIH0sIDEwMDApO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKGxvdmVMZXR0ZXJzQ29udGFpbmVyICYmIGxvdmVMZXR0ZXJzQ29udGFpbmVyPy5wYXJlbnROb2RlKSB7XG4gICAgICAgIGxvdmVMZXR0ZXJzQ29udGFpbmVyPy5wYXJlbnROb2RlPy5yZW1vdmVDaGlsZChsb3ZlTGV0dGVyc0NvbnRhaW5lcik7XG4gICAgICB9XG4gICAgfSwgMTYwMCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlQXVkaW8odmlkZW9FbGVtZW50OiBIVE1MVmlkZW9FbGVtZW50LCBlbmFibGVkOiBib29sZWFuKSB7XG4gICAgY29uc3QgeyBzdHJlYW1Db250cm9sbGVyIH0gPSB0aGlzLndlYlJ0Y0NvbnRyb2xsZXI7XG4gICAgaWYgKHZpZGVvRWxlbWVudCkge1xuICAgICAgdmlkZW9FbGVtZW50Lm11dGVkID0gZW5hYmxlZDtcbiAgICAgIGlmIChzdHJlYW1Db250cm9sbGVyKSB7XG4gICAgICAgIHN0cmVhbUNvbnRyb2xsZXIuYXVkaW9FbGVtZW50Lm11dGVkID0gZW5hYmxlZDtcbiAgICAgICAgaWYgKHZpZGVvRWxlbWVudD8uY3VycmVudFRpbWUgPiAwICYmICF2aWRlb0VsZW1lbnQ/LnBhdXNlZCAmJiBzdHJlYW1Db250cm9sbGVyPy5hdWRpb0VsZW1lbnQ/LnBhdXNlZClcbiAgICAgICAgICBzdHJlYW1Db250cm9sbGVyPy5hdWRpb0VsZW1lbnQ/LnBsYXkoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pY3JvcGhvbmVPdmVybGF5KCkge1xuICAgIHRoaXM/Lm1pY3JvcGhvbmVPdmVybGF5Py5jcmVhdGVPdmVybGF5KCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlTWljKGVuYWJsZTogYm9vbGVhbiwgaXNEZWZhdWx0OiBib29sZWFuKSB7XG4gICAgdGhpcz8uY29uZmlnPy5zZXRGbGFnRW5hYmxlZChGbGFncy5Vc2VNaWMsIGVuYWJsZSk7XG4gICAgaWYgKCFpc0RlZmF1bHQpIHtcbiAgICAgIHRoaXM/Lm1pY3JvcGhvbmVPdmVybGF5Py50b2dnbGVNZXNzYWdlKGVuYWJsZSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcz8ubWljcm9waG9uZU92ZXJsYXk/LnRvZ2dsZVZpc2liaWxpdHkodHJ1ZSk7XG4gICAgICB9LCAyMDApO1xuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWNvbm5lY3QoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgd3JhcFdlYlNvY2tldE9uQ2xvc2VIYW5kbGVyKCkge1xuICAgIGxldCBzZWxmID0gdGhpcztcbiAgICB0aGlzLndlYlJ0Y0NvbnRyb2xsZXI/LnRyYW5zcG9ydD8uYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsIChldmVudCkgPT4ge1xuICAgICAgRXZlbnRIYW5kbGVyLkVtaXQoc2VsZi53ZWJzb2NrZXRPbkNsb3NlSGFuZGxlciwgZXZlbnQgYXMgQ2xvc2VFdmVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgb25TdHJlYW1pbmdTdGF0ZUNoYW5nZShjYWxsYmFjazogKGlzU3RyZWFtaW5nOiBib29sZWFuKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgLy8gTGlzdGVuIHRvIHZpZGVvIGVsZW1lbnQgZXZlbnRzXG4gICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdGhpcz8ud2ViUnRjQ29udHJvbGxlcj8udmlkZW9QbGF5ZXI/LmdldFZpZGVvRWxlbWVudCgpO1xuICAgIHZpZGVvRWxlbWVudD8uYWRkRXZlbnRMaXN0ZW5lcihcInBsYXlcIiwgKCkgPT4gY2FsbGJhY2sodHJ1ZSkpO1xuICAgIHZpZGVvRWxlbWVudD8uYWRkRXZlbnRMaXN0ZW5lcihcInBhdXNlXCIsICgpID0+IGNhbGxiYWNrKGZhbHNlKSk7XG4gICAgdmlkZW9FbGVtZW50Py5hZGRFdmVudExpc3RlbmVyKFwiZW5kZWRcIiwgKCkgPT4gY2FsbGJhY2soZmFsc2UpKTtcblxuICAgIC8vIExpc3RlbiB0byBXZWJTb2NrZXQgZXZlbnRzXG4gICAgdGhpcy53ZWJSdGNDb250cm9sbGVyPy50cmFuc3BvcnQuYWRkRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgKCkgPT4ge1xuICAgICAgY2FsbGJhY2sodHJ1ZSk7XG4gICAgfSk7XG4gICAgdGhpcy53ZWJSdGNDb250cm9sbGVyPy50cmFuc3BvcnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIGNhbGxiYWNrKGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlWFJJY29uSWZEaXNhYmxlZCgpIHtcbiAgICBpZiAoIXRoaXM/LmNvbmZpZz8uaW5pdGlhbFNldHRpbmdzPy5YUkNvbnRyb2xsZXJJbnB1dCkge1xuICAgICAgdGhpcz8uY29uZmlnPy5zZXRGbGFnRW5hYmxlZChGbGFncy5YUkNvbnRyb2xsZXJJbnB1dCwgZmFsc2UpO1xuICAgICAgaWYgKHRoaXMudmlkZW9FbGVtZW50UGFyZW50KSB7XG4gICAgICAgIGlmICh0aGlzPy52aWRlb0VsZW1lbnRQYXJlbnQ/LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCB4ckJ0biA9IHRoaXM/LnZpZGVvRWxlbWVudFBhcmVudD8ucGFyZW50RWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiI3hyQnRuXCIpO1xuICAgICAgICAgIHhyQnRuPy5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5qZWN0Q3VzdG9tVUkoKSB7XG4gICAgY29uc3QgY3VzdG9tVUkgPSBkb2N1bWVudD8uZ2V0RWxlbWVudEJ5SWQoXCJzdHJlYW0tdWlcIik7XG4gICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcz8udmlkZW9FbGVtZW50UGFyZW50Py5wYXJlbnRFbGVtZW50O1xuICAgIGlmIChjdXN0b21VSSAmJiB2aWRlb0VsZW1lbnRQYXJlbnQpIHZpZGVvRWxlbWVudFBhcmVudD8uYXBwZW5kQ2hpbGQoY3VzdG9tVUkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgTWVzc2FnZXMgfSBmcm9tIFwiQGFyY3dhcmUtY2xvdWQvc2hhcmVkLXBpeGVsc3RyZWFtaW5nLXdlYnNka1wiO1xuXG4vKiogQXJjd2FyZSBTZXR0aW5ncy4gKi9cbmV4cG9ydCBjb25zdCBBcmN3YXJlU2V0dGluZ3NTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIC8qKiBPdmVyd3JpdGVzIHRoZSBTZXNzaW9uLVRvb2wgYW5kIHVzZXMgdGhlIHByb3ZpZGVkIHNlc3Npb24gaW5zdGVhZC4gKi9cbiAgc2Vzc2lvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAvKiogQ2FuIGJlIHVzZWQgdG8gYmUgYWRkZWQgdG8gdGhlIHJlcXVlc3QgaW4gb3JkZXIgdG8gdmVyaWZ5IGFjY2VzcyB0byBwcml2YXRlIHByb2plY3RzLlxuICAgKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuID0+IFByZXZpZXcgcGFnZS5cbiAgICovXG4gIHRva2VuOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gIC8qKiBAZGVwcmVjYXRlZCBpbiB0aGVyZSBmb3IgbGVnYWN5IHVzZS4gQ2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRva2VuIGlzIHByb3ZpZGVkLiAqL1xuICBieXBhc3M6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIC8vIC8qKiBDb25maWd1cmUgRGlyZWN0RmxvdyBUb2tlbi4gKi9cbiAgLy8gZGlyZWN0Rmxvdzogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAvKiogSGFuZGxlciBmb3Igc2VydmVyIHNpZGUgZXJyb3IgbWVzc2FnZXMuICovXG4gIGVycm9ySGFuZGxlcjogei5mdW5jdGlvbigpLmFyZ3MoTWVzc2FnZXMuWkVycm9yTWVzc2FnZSkucmV0dXJucyh6LnZvaWQoKSkub3B0aW9uYWwoKSxcbiAgLyoqIEhhbmRsZXIgZm9yIHF1ZXVlIGV2ZW50cy4gKi9cbiAgcXVldWVIYW5kbGVyOiB6LmZ1bmN0aW9uKCkuYXJncyhNZXNzYWdlcy5aUXVldWUpLnJldHVybnMoei52b2lkKCkpLm9wdGlvbmFsKCksXG4gIC8qKiBIYW5kbGVyIGZvciBzZXNzaW9uSWQgbWVzc2FnZS4gKi9cbiAgc2Vzc2lvbklkSGFuZGxlcjogei5mdW5jdGlvbigpLmFyZ3Moei5zdHJpbmcoKSkucmV0dXJucyh6LnZvaWQoKSkub3B0aW9uYWwoKSxcbiAgLyoqIEhhbmRsZXIgZm9yIGxvdmUgbGV0dGVycy5cbiAgICogXCJMb3ZlTGV0dGVyc1wiIGFyZSBzZW5kIGZyb20gYmFja2VuZCB0byB0aGUgU0RLIHRvIHN0YXRlIHdoYXQgcGhhc2UgdGhlIGNvbm5lY3Rpb24gY3VycmVudGx5IGlzIGluLiAqL1xuICBsb3ZlTGV0dGVySGFuZGxlcjogei5mdW5jdGlvbigpLmFyZ3MoTWVzc2FnZXMuWkxvdmVMZXR0ZXIpLnJldHVybnMoei52b2lkKCkpLm9wdGlvbmFsKCksXG4gIC8qKiBTaG93IG9yIGhpZGUgdGhlIGZ1bGxzY3JlZW4gYnV0dG9uLiAqL1xuICBmdWxsc2NyZWVuQnV0dG9uOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAvKiogU2hvdyBvciBoaWRlIHRoZSBzZXR0aW5ncyBidXR0b24uICovXG4gIHNldHRpbmdzQnV0dG9uOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAvKiogU2hvdyBvciBoaWRlIHRoZSBpbmZvIGJ1dHRvbi4gKi9cbiAgaW5mb0J1dHRvbjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgLyoqIFNob3cgb3IgaGlkZSB0aGUgYXVkaW8gYnV0dG9uLiAqL1xuICBhdWRpb0J1dHRvbjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgLyoqIFNob3cgb3IgaGlkZSB0aGUgbWljcm9waG9uZSBidXR0b24uICovXG4gIG1pY0J1dHRvbjogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgLyoqIFNob3cgb3IgaGlkZSB0aGUgbWljcm9waG9uZSBidXR0b24uICovXG4gIHN0b3BCdXR0b246IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIC8qKiBTaG93IG9yIGhpZGUgdGhlIGNvbm5lY3Rpb25TdHJlbmd0aEljb24gYnV0dG9uLiAqL1xuICBjb25uZWN0aW9uU3RyZW5ndGhJY29uOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuXG4gIC8qKiBTaGFyZUlkLCB1c2VkIGZvciBzaGFyaW5nIHlvdXIgcHJvamVjdC5cbiAgICogVXNpbmcgQXJjd2FyZUluaXQgd2lsbCBzZXQgdGhpcyByZXF1aXJlZCBwcm9wZXJ0eSBmb3IgeW91LiAqL1xuICBzaGFyZUlkOiB6LnN0cmluZygpLnN0YXJ0c1dpdGgoXCJzaGFyZS1cIikub3B0aW9uYWwoKSxcbiAgLyoqIElkIG9mIHlvdXIgcHJvamVjdCwgb25seSByZXF1aXJlZCBpZiB5b3VyIHNoYXJlSWQgcmVmZXJzIHRvIG11bHRpcGxlIHByb2plY3RzLlxuICAgKiBVc2luZyBBcmN3YXJlSW5pdCB3aWxsIHNldCB0aGlzIHJlcXVpcmVkIHByb3BlcnR5IGZvciB5b3UuICovXG4gIHByb2plY3RJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuXG4gIC8qKiBFbmFibGUvRGlzYWJsZSBMb3ZlTGV0dGVyIGxvZ2dpbmcgdG8gdGhlIGNvbnNvbGUuICovXG4gIGxvdmVMZXR0ZXJMb2dnaW5nOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAvKiogRW5hYmxlL0Rpc2FibGUgQ29ubmVjdGlvbiBJZGVudGlmaWVyIGxvZ2dpbmcgdG8gdGhlIGNvbnNvbGUuICovXG4gIGNvbm5lY3Rpb25JZGVudGlmaWVyTG9nZ2luZ0Rpc2FibGVkOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAvKiogV2lkdGggd2l0aCB3aGljaCBpbnN0YW5jZSBzaG91bGQgYmUgc3RhcnRlZCAqL1xuICBzdGFydFdpZHRoOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gIC8qKiBIZWlnaHQgd2l0aCB3aGljaCBpbnN0YW5jZSBzaG91bGQgYmUgc3RhcnRlZCAqL1xuICBzdGFydEhlaWdodDogei5udW1iZXIoKS5vcHRpb25hbCgpXG59KTtcblxuZXhwb3J0IHR5cGUgU2V0dGluZ3MgPSB6LmluZmVyPHR5cGVvZiBBcmN3YXJlU2V0dGluZ3NTY2hlbWE+O1xuIiwiaW1wb3J0IHsgQXJjd2FyZVBpeGVsU3RyZWFtaW5nIH0gZnJvbSBcIi4uL0FyY3dhcmVQaXhlbFN0cmVhbWluZ1wiO1xuXG5leHBvcnQgZW51bSBXZWJzb2NrZXRTdGF0ZSB7XG4gIC8vIFNvY2tldCBoYXMgYmVlbiBjcmVhdGVkLiBUaGUgY29ubmVjdGlvbiBpcyBub3QgeWV0IG9wZW4uXG4gIENPTk5FQ1RJTkcgPSAwLFxuICAvLyBUaGUgY29ubmVjdGlvbiBpcyBvcGVuIGFuZCByZWFkeSB0byBjb21tdW5pY2F0ZS5cbiAgT1BFTiA9IDEsXG4gIC8vIFRoZSBjb25uZWN0aW9uIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNsb3NpbmcuXG4gIENMT1NJTkcgPSAyLFxuICAvLyBUaGUgY29ubmVjdGlvbiBpcyBjbG9zZWQgb3IgY291bGRuJ3QgYmUgb3BlbmVkLlxuICBDTE9TRUQgPSAzLFxufVxuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGlvbklkZW50aWZpZXIge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQ29ubmVjdGlvbklkZW50aWZpZXI7XG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCkge1xuICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xuICAgICAgdGhpcy5pbnN0YW5jZSA9IG5ldyBDb25uZWN0aW9uSWRlbnRpZmllcigpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpbnRlcnZhbDogYW55O1xuXG4gIHByaXZhdGUgYXBzOiBBcmN3YXJlUGl4ZWxTdHJlYW1pbmdbXSA9IFtdO1xuXG4gIHB1YmxpYyBnZXQgV2Vic29ja2V0U3RhdGVzKCkge1xuICAgIHJldHVybiB0aGlzLmFwcy5tYXAoKHBzKSA9PiBwcy53ZWJzb2NrZXRTdGF0ZSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBwdWJsaWMgcmVnaXN0ZXIocHM6IEFyY3dhcmVQaXhlbFN0cmVhbWluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5hcHMuaW5jbHVkZXMocHMpKSB7XG4gICAgICB0aGlzLmFwcy5wdXNoKHBzKTtcblxuICAgICAgaWYgKHBzLmNvbmZpZy5zZXR0aW5ncz8uY29ubmVjdGlvbklkZW50aWZpZXJMb2dnaW5nRGlzYWJsZWQpIHRoaXMuZGlzYWJsZSgpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaW50ZXJ2YWwpIHRoaXMuaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCh0aGlzLmNvbm5lY3Rpb25XYXRjaGVyLmJpbmQodGhpcyksIDEwICogMTAwMCk7XG4gIH1cblxuICBwdWJsaWMgR2V0V2ViU29ja2V0U3RhdGVzKCkge1xuICAgIHJldHVybiB0aGlzLmFwcy5tYXAoKHBzKSA9PiBwcy53ZWJzb2NrZXRTdGF0ZSk7XG4gIH1cblxuICBwdWJsaWMgQWN0aXZlSW5zdGFuY2VzKCkge1xuICAgIHJldHVybiB0aGlzLkdldFdlYlNvY2tldFN0YXRlcygpLmZpbHRlcigoc3RhdGUpID0+IHN0YXRlIDw9IFdlYnNvY2tldFN0YXRlLk9QRU4pLmxlbmd0aDtcbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlZCA9IHRydWU7XG4gIHB1YmxpYyBkaXNhYmxlKCkge1xuICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHBlcmlvZGljYWxseSB0ZWxsIHRoZSBkZXZlbG9wZXIgdGhlIGFtb3VudCBvZiBjb25uZWN0ZWQgaW5zdGFuY2VzLlxuICAgKiBUaGlzIHdheSB0aGUgZGV2ZWxvcGVyIGNhbiBmaWd1cmUgb3V0LCB3aGVuIHRoZXkgbWVzc2VkIHVwIHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlcmUncyBzaGFkb3cgaW5zdGFuY2VzIHN0aWxsIHJ1bm5pbmcuXG4gICAqIE9yIHdoZW4gdGhleSBhY2NpZGVudGFsbHkgc2V0IHVwIG11bHRpcGxlIGNvbm5lY3Rpb25zIVxuICAgKiBUaGluZ3MgbGlrZSB0aGF0IGNhbiBoYXBwZW4sIGZvciBleGFtcGxlIGlmIHRoZSBSZWFjdC51c2VFZmZlY3Qgd2FzIG5vdCBzZXR1cCBwZXJmZWN0bHkhXG4gICAqL1xuICBwcml2YXRlIGNvbm5lY3Rpb25XYXRjaGVyKCkge1xuICAgIGlmICghdGhpcy5lbmFibGVkKSByZXR1cm47XG4gICAgY29uc3QgYWN0aXZlU3RhdGVzID0gdGhpcy5HZXRXZWJTb2NrZXRTdGF0ZXMoKS5maWx0ZXIoKHN0YXRlKSA9PiBzdGF0ZSA8PSBXZWJzb2NrZXRTdGF0ZS5PUEVOKTtcblxuICAgIGlmIChhY3RpdmVTdGF0ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zb2xlLmxvZyhgUGl4ZWxTdHJlYW1pbmcgSW5zdGFuY2UgaXMgY29ubmVjdGVkLmApO1xuICAgIH0gZWxzZSBpZiAoYWN0aXZlU3RhdGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKGAke2FjdGl2ZVN0YXRlcy5sZW5ndGh9IFBpeGVsU3RyZWFtaW5nIEluc3RhbmNlcyBhcmUgY29ubmVjdGVkIWApO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqIEEgaGVscGVyIGNsYXNzIHRvIHNwcmVhZCB0aGUgZXZlbnQgdG8gYWRkaXRpb25hbCBldmVudCBoYW5kbGVycyBhZGRlZCBmcm9tIGV4dGVybmFsIHNvdXJjZXMuICovXG5leHBvcnQgY2xhc3MgRXZlbnRIYW5kbGVyPFR5cGU+IHtcbiAgcHJpdmF0ZSBjYWxsYmFja3M6IEFycmF5PChhcmc6IFR5cGUpID0+IHZvaWQ+O1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBhZGRlZCBjYWxsYmFjayBvbiBzdWNjZXNzIG9yIG51bGwsIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLiAqL1xuICBwdWJsaWMgYWRkPENhbGxiYWNrIGV4dGVuZHMgKGFyZzogVHlwZSkgPT4gdm9pZD4oY2FsbGJhY2s6IENhbGxiYWNrKTogQ2FsbGJhY2sgfCBudWxsIHtcbiAgICBjb25zdCBjYiA9IHRoaXMuY2FsbGJhY2tzLmZpbmQoKGNiKSA9PiBjYiA9PT0gY2FsbGJhY2spO1xuICAgIGlmIChjYikgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgcmV0dXJuIGNhbGxiYWNrO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5wdXQgY2FsbGJhY2sgaGFzIGJlZW4gZm91bmQgYW5kIHJlbW92ZWQgYW5kIGZhbHNlIGlmIG5vdC4gKi9cbiAgcHVibGljIHJlbW92ZTxDYWxsYmFjayBleHRlbmRzIChhcmc6IFR5cGUpID0+IHZvaWQ+KGNhbGxiYWNrOiBDYWxsYmFjayk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNiID0gdGhpcy5jYWxsYmFja3MuZmluZCgoY2IpID0+IGNiID09PSBjYWxsYmFjayk7XG4gICAgaWYgKGNiKSB0aGlzLmNhbGxiYWNrcy5zcGxpY2UodGhpcy5jYWxsYmFja3MuaW5kZXhPZihjYiksIDEpO1xuICAgIHJldHVybiAhIWNiO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jYWxsYmFja3MgPSBuZXcgQXJyYXk8KGFyZzogVHlwZSkgPT4gdm9pZD4oKTtcbiAgfVxuXG4gIC8qKiBFbWl0cyB0aGUgZXZlbnQtZGF0YSBmb3IgZWFjaCBvZiB0aGUgZXhpc3RpbmcgaGFuZGxlcnMuICovXG4gIHB1YmxpYyBzdGF0aWMgRW1pdDxUeXBlPihoYW5kbGVyOiBFdmVudEhhbmRsZXI8VHlwZT4sIGV2ZW50OiBUeXBlKTogdm9pZCB7XG4gICAgaGFuZGxlci5jYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKGV2ZW50KSk7XG4gIH1cbn1cbiIsImltcG9ydCBhZGRTZWNvbmRzIGZyb20gJ2RhdGUtZm5zL2FkZFNlY29uZHMnO1xuaW1wb3J0IGlzQmVmb3JlIGZyb20gJ2RhdGUtZm5zL2lzQmVmb3JlJztcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmNvbnN0IFpTZXNzaW9uID0gelxuICAub2JqZWN0KHtcbiAgICBpZDogei5zdHJpbmcoKS5taW4oMSksXG4gICAgY3JlYXRlZDogelxuICAgICAgLmRhdGUoKVxuICAgICAgLm9yKHouc3RyaW5nKCkpXG4gICAgICAudHJhbnNmb3JtKChhcmcpID0+IG5ldyBEYXRlKGFyZykpLFxuICAgIGV4cGlyZTogei5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSkub3B0aW9uYWwoKSxcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBaT3B0aW9ucyA9IHoub2JqZWN0KHtcbiAgbG9jYWxTdG9yYWdlS2V5OiB6LnN0cmluZygpLm1pbigzKS5kZWZhdWx0KFwicHhzc1wiKSxcbiAga2VlcFNlc3Npb246IHpcbiAgICAubnVtYmVyKClcbiAgICAuaW50KClcbiAgICAubWluKDMpXG4gICAgLyoqIERlZmF1bHQga2VlcCBpcyAxMCwgc2luY2UgdGhpcyBpcyBob3cgbG9uZyBpbnN0YW5jZXMgd2lsbCBiZSBrZXB0IGFsaXZlIGJ5IGRlZmF1bHQuICovXG4gICAgLmRlZmF1bHQoMTApLFxufSk7XG5cbnR5cGUgT3B0aW9ucyA9IHouaW5mZXI8dHlwZW9mIFpPcHRpb25zPjtcblxuLyoqIFRoZSBzZXNzaW9uSWQgaXMgc3RvcmVkIGluIHRoZSBsb2NhbFN0b3JhZ2UgdG8gYWxsb3cgZm9yIHJlY29ubmVjdGlvbiBhbmRcbiAqIHRvIHByZXZlbnQgc3BhbW1pbmcgc3RhcnQgcmVxdWVzdHMgb2YgaW5zdGFuY2VzLCB3aGVuIHNtYXNoaW5nIEY1LlxuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbiB7XG4gIHByaXZhdGUgX2N1cnJlbnQ/OiBzdHJpbmc7XG4gIHB1YmxpYyBnZXQgY3VycmVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbm9TZXNzaW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmhhcyhcIm5vU2Vzc2lvblwiKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gSWYgdGhlIHF1ZXJ5LXBhcmFtZXRlciBcIm5vU2Vzc2lvblwiIG9yIFwibm9zZXNzaW9uXCIgaXMgc2V0LCBpdCB3aWxsIGJlIHNraXBwZWQuXG4gICAgaWYgKHRoaXMubm9TZXNzaW9uKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IHNlc3Npb25TdHJpbmcgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VLZXkpO1xuICAgIC8vIE5vIHNlc3Npb24geWV0IHNldC5cbiAgICBpZiAoc2Vzc2lvblN0cmluZyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gWlNlc3Npb24uc2FmZVBhcnNlKEpTT04ucGFyc2Uoc2Vzc2lvblN0cmluZykpO1xuICAgIC8vIENsZWFyIHRoZSBzZXNzaW9uIGlmIGl0J3Mgbm90IHZhbGlkLlxuICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMudW5zZXQoKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHNlc3Npb24gPSBwYXJzZWQuZGF0YTtcbiAgICBjb25zdCBleHBpcmF0aW9uVGltZSA9IGFkZFNlY29uZHMobmV3IERhdGUoc2Vzc2lvbi5jcmVhdGVkKSwgdGhpcy5vcHRpb25zLmtlZXBTZXNzaW9uKTtcbiAgICBpZiAoaXNCZWZvcmUoZXhwaXJhdGlvblRpbWUsIG5ldyBEYXRlKCkpKSB7XG4gICAgICB0aGlzLnVuc2V0KCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIHNlc3Npb25JZC5cbiAgICByZXR1cm4gc2Vzc2lvbi5pZDtcbiAgfVxuXG4gIHByaXZhdGUgb3B0aW9uczogT3B0aW9ucztcblxuICBwcml2YXRlIGdldCBsb2NhbFN0b3JhZ2VLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sb2NhbFN0b3JhZ2VLZXk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogT3B0aW9ucykge1xuICAgIHRoaXMub3B0aW9ucyA9IFpPcHRpb25zLnBhcnNlKG9wdGlvbnMgfHwge30pO1xuICB9XG5cbiAgLyoqIFNldCdzIHRoZSBzZXNzaW9uIHdpdGggY3JlYXRpb24gZGF0ZSBmb3IgdGhlIGdpdmVuIHN0b3JhZ2Uga2V5IHRvIHRoZSBsb2NhbFN0b3JhZ2UuICovXG4gIHB1YmxpYyBzZXQoc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBaU2Vzc2lvbi5zaGFwZS5pZC5wYXJzZShzZXNzaW9uSWQpO1xuICAgIHRoaXMuX2N1cnJlbnQgPSBzZXNzaW9uSWQ7XG5cbiAgICBjb25zdCBzZXNzaW9uOiB6LmluZmVyPHR5cGVvZiBaU2Vzc2lvbj4gPSB7XG4gICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgY3JlYXRlZDogbmV3IERhdGUoKSxcbiAgICAgIGV4cGlyZTogZmFsc2UsXG4gICAgfTtcblxuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSwgSlNPTi5zdHJpbmdpZnkoc2Vzc2lvbikpO1xuICB9XG5cbiAgLyoqIFJlbW92ZXMgYSBzZXNzaW9uIGZyb20gdGhlIGxvY2FsU3RvcmFnZS4gKi9cbiAgcHVibGljIHVuc2V0KCk6IHZvaWQge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsU3RvcmFnZUtleSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1lc3NhZ2VzIH0gZnJvbSBcIkBhcmN3YXJlLWNsb3VkL3NoYXJlZC1waXhlbHN0cmVhbWluZy13ZWJzZGtcIjtcbmltcG9ydCB7IEFnZ3JlZ2F0ZWRTdGF0cywgQ2FuZGlkYXRlUGFpclN0YXRzIH0gZnJvbSBcIkBlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjVcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIFN0YXRzKHN0YXRzOiBBZ2dyZWdhdGVkU3RhdHMpIHtcbiAgY29uc3QgcmVzdWx0ID0gTWVzc2FnZXMuWlN0YXRzLnNoYXBlLnN0YXRzLnBhcnNlKHtcbiAgICAvKipcbiAgICAgKiBPdGhlciBrbm93biBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIGNvZGVjczogc3RhdHMuY29kZWNzLFxuICAgIGNhbmRpZGF0ZVBhaXI6IHN0YXRzLmNhbmRpZGF0ZVBhaXJzLFxuICAgIGxvY2FsQ2FuZGlkYXRlczogc3RhdHMubG9jYWxDYW5kaWRhdGVzLFxuICAgIHJlbW90ZUNhbmRpZGF0ZXM6IHN0YXRzLnJlbW90ZUNhbmRpZGF0ZXMsXG4gICAgRGF0YUNoYW5uZWxTdGF0czogc3RhdHMuZGF0YWNoYW5uZWxTdGF0cyxcblxuICAgIC8vIFJlY2VpdmVkIChsYXN0KSBmb3IgdGlja2V0XG4gICAgYnl0ZXNSZWNlaXZlZDogZm9yY2VOdW1iZXIoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuYnl0ZXNSZWNlaXZlZCksXG4gICAgLy8gUGFja2V0cyBMb3N0IChsYXN0KSBmb3IgdGlja2V0XG4gICAgcGFja2V0c0xvc3Q6IGZvcmNlTnVtYmVyKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLnBhY2tldHNMb3N0KSxcbiAgICAvLyBWaWRlbyByZXNvbHV0aW9uOiBoaWdoZXN0IGxvd2VzdCBhdmVyYWdlIChwb3J0cmFpdCkgYW5kIGhpZ2hlc3QgbG93ZXN0IGF2ZXJhZ2UgKGxhbmRzY2FwZSkgZm9yIHRpY2tldFxuICAgIGZyYW1lV2lkdGg6IGZvcmNlTnVtYmVyKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lV2lkdGghKSxcbiAgICAvLyBWaWRlbyByZXNvbHV0aW9uOiBoaWdoZXN0IGxvd2VzdCBhdmVyYWdlIChwb3J0cmFpdCkgYW5kIGhpZ2hlc3QgbG93ZXN0IGF2ZXJhZ2UgKGxhbmRzY2FwZSkgZm9yIHRpY2tldFxuICAgIGZyYW1lSGVpZ2h0OiBmb3JjZU51bWJlcihzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZUhlaWdodCEpLFxuICAgIC8vIEZyYW1lcyBkZWNvZGVkIChMYXN0KSBmb3IgdGlja2V0XG4gICAgZnJhbWVzRGVjb2RlZDogZm9yY2VOdW1iZXIoc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuZnJhbWVzRGVjb2RlZCEpLFxuICAgIC8vIEZyYW1lcmF0ZSAobG93IC8gaGlnaCwgYXZnKSBmb3IgdGlja2V0XG4gICAgZnJhbWVzUGVyU2Vjb25kOiBmb3JjZU51bWJlcihzdGF0cy5pbmJvdW5kVmlkZW9TdGF0cy5mcmFtZXNQZXJTZWNvbmQhKSxcbiAgICAvLyBmcmFtZXMgZHJvcHBlZCAobGFzdCkgZm9yIHRpY2tldFxuICAgIGZyYW1lc0Ryb3BwZWQ6IGZvcmNlTnVtYmVyKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmZyYW1lc0Ryb3BwZWQhKSxcbiAgICAvLyBWaWRlb2NvZGVjIChvbmNlKSBmb3IgdGlja2V0XG4gICAgdmlkZW9Db2RlYzogc3RhdHMuaW5ib3VuZFZpZGVvU3RhdHMuY29kZWNJZCxcbiAgICAvLyBhdWRpb2NvZGVjIChvbmNlKSBmb3IgdGlja2V0XG4gICAgYXVkaW9Db2RlYzogc3RhdHMuaW5ib3VuZEF1ZGlvU3RhdHMuY29kZWNJZCxcbiAgICAvLyBicm93c2VyIHR5cGUgYW5kIHZlcnNpb24gZm9yIHRpY2tldCAoYXJjd2FyZSAvIGFkZGl0aW9uKVxuICAgIGJyb3dzZXJJbmZvOiB7XG4gICAgICAvLyB0byBiZSByZWNlaXZlZCFcbiAgICAgIHVzZXJBZ2VudDogbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgIHBsYXRmb3JtOiAobmF2aWdhdG9yIGFzIGFueSkub3NjcHUgfHwgbmF2aWdhdG9yLnBsYXRmb3JtIHx8IG51bGwsIC8vIG5hdmlnYXRvci5vc2NwdSxcbiAgICAgIGxhbmd1YWdlOiBuYXZpZ2F0b3IubGFuZ3VhZ2UsXG4gICAgfSxcbiAgICAvLyBOZXQgUlRUIChsb3csIGhpZ2gsIGF2ZylcbiAgICAvLyBCRUdJTiBUVyBDSEFOR0VcbiAgICBjdXJyZW50UlRUOiBjYWxjUlRUKHN0YXRzLmNhbmRpZGF0ZVBhaXJzKSxcbiAgICAvLyBFTkQgVFcgQ0hBTkdFXG4gICAgLy8gRHVyYXRpb24gKGxhc3QpXG4gICAgc2Vzc2lvblJ1blRpbWU6IHN0YXRzLnNlc3Npb25TdGF0cy5ydW5UaW1lLFxuICAgIC8vIENvbnRyb2xzIHN0cmVhbSBpbnB1dCAoPz8pXG4gICAgY29udHJvbHNTdHJlYW1JbnB1dDogc3RhdHMuc2Vzc2lvblN0YXRzLmNvbnRyb2xzU3RyZWFtSW5wdXQsXG4gICAgLy8gdmlkZW8gcXVhbnRpemF0aW9uIHBhcmFtZXRlciAobG93IC8gaGlnaCAvIGF2ZyBpZiBhcHBsaWNhYmxlKVxuICAgIHZpZGVvRW5jb2RlckF2Z1FQOiBmb3JjZU51bWJlcihzdGF0cy5zZXNzaW9uU3RhdHMudmlkZW9FbmNvZGVyQXZnUVApLFxuICAgIC8vIFZpZGVvIGJpdHJhdGUgKG1pbiAvIG1heCAvIGF2ZylcbiAgICB2aWRlb0JpdHJhdGU6IGZvcmNlTnVtYmVyKHN0YXRzLmluYm91bmRWaWRlb1N0YXRzLmJpdHJhdGUhKSxcbiAgICAvLyBBdWRpbyBiaXRyYXRlIChtaW4gLyBtYXggLyBhdmcpXG4gICAgYXVkaW9CaXRyYXRlOiBmb3JjZU51bWJlcihzdGF0cy5pbmJvdW5kQXVkaW9TdGF0cy5iaXRyYXRlISksXG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogR2l2ZW4gYW4gYXJyYXkgb2YgY2FuZGlkYXRlIHBhaXJzIHRoaXMgZnVuY3Rpb24gd2lsbCBmaW5kIHRoZSBoaWdoZXN0IFJUVCBmb3IgdGhlIHNlbGVjdGVkIHBhaXJcbiAqIEBwYXJhbSBwYWlycyAtIEFuIGFycmF5IG9mIGNhbmRpZGF0ZSBwYWlyc1xuICogQHJldHVybnMgVGhlIGhpZ2hlc3Qgcm91bmQgdHJpcCB0aW1lIG9mIGEgc2VsZWN0ZWQgY2FuZGlkYXRlIHBhaXJcbiAqL1xuZnVuY3Rpb24gY2FsY1JUVChwYWlyczogQ2FuZGlkYXRlUGFpclN0YXRzW10pOiBOdW1iZXIge1xuXG4gIGxldCBydHQgPSAwO1xuICBwYWlycy5mb3JFYWNoKChwYWlyOiBDYW5kaWRhdGVQYWlyU3RhdHMpID0+IHtcblxuICAgIGlmIChwYWlyLnNlbGVjdGVkICYmIHBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWUgPiBydHQpIHtcbiAgICAgIHJ0dCA9IHBhaXIuY3VycmVudFJvdW5kVHJpcFRpbWU7XG4gICAgfVxuICB9KVxuXG4gIHJldHVybiBydHQ7XG59XG5cbi8qKlxuICogVGFrZXMgYSBudW1iZXIgYW5kIGZvcmNlcyBpdCB0byByZXR1cm4gYSBudW1iZXIuIElmIHRoZSB2YWx1ZSBwYXNzZWQgaW4gaXMgTmFOLCAwIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0gdmFsdWUgLSBBIG51bWJlclxuICogQHJldHVybnMgVGhlIG51bWJlciBwYXNzZWQgaW4gYXMgdmFsdWUgb3IgMCBpZiB2bGF1ZSB3YXMgTmFOXG4gKi9cbmZ1bmN0aW9uIGZvcmNlTnVtYmVyKHZhbHVlOiBudW1iZXIpOiBOdW1iZXIge1xuICByZXR1cm4gaXNOYU4odmFsdWUpID8gMCA6IHZhbHVlO1xufVxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGVib3VuY2U8VCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZD4oXG4gIGZ1bmM6IFQsXG4gIHdhaXQ6IG51bWJlclxuKTogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IHZvaWQge1xuICBsZXQgdGltZW91dDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pIHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGZ1bmMoLi4uYXJncyksIHdhaXQpO1xuICB9O1xufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vQXJjd2FyZUFwcGxpY2F0aW9uXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9BcmN3YXJlQ29uZmlnXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0FyY3dhcmVJbml0XCI7XG5leHBvcnQgdHlwZSAqIGZyb20gXCIuL01lc3NhZ2VUeXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVzL0FyY3dhcmVQaXhlbFN0cmVhbWluZ0FwcGxpY2F0aW9uU3R5bGVzXCI7XG4iLCJleHBvcnQgY29uc3QgQXJjd2FyZVN0eWxlcyA9IHtcbiAgY3VzdG9tU3R5bGVzOiB7XG4gICAgXCI6cm9vdFwiOiB7XG4gICAgICBcIi0tY29sb3IwXCI6IFwiIzE4MTgxQSAhaW1wb3J0YW50XCIsXG4gICAgICBcIi0tY29sb3IxXCI6IFwiIzAwMDAwMFwiLFxuICAgICAgXCItLWNvbG9yMlwiOiBcIiNGRkZGRkZcIixcbiAgICAgIFwiLS1jb2xvcjNcIjogXCIjREFGNjkzICFpbXBvcnRhbnRcIixcbiAgICAgIFwiLS1jb2xvcjRcIjogXCIjMzViMzUwXCIsXG4gICAgICBcIi0tY29sb3I1XCI6IFwiI2ZmYWIwMFwiLFxuICAgICAgXCItLWNvbG9yNlwiOiBcIiM4NTg1ODggIWltcG9ydGFudFwiLFxuICAgICAgXCItLWNvbG9yN1wiOiBcIiNCNUI1QjcgIWltcG9ydGFudFwiLFxuICAgICAgXCItLWNvbG9yOFwiOiBcIiM0MTAwOGNcIixcbiAgICAgIFwiLS1jb2xvcjlcIjogXCIjM2UwMDcwXCIsXG4gICAgICBcIi0tY29sb3IxMFwiOiBcIiMyZTAwNTJcIixcbiAgICAgIFwiLS1jb2xvcjExXCI6IFwicmdiYSg2NSwwLDEzOSwxKSAhaW1wb3J0YW50XCIsXG4gICAgICBcIi0tY29sb3IxMlwiOiBcIiMyMjIyMjQgIWltcG9ydGFudFwiLFxuICAgICAgXCItLWNvbG9yMTNcIjogXCIjZjBmMGYyICFpbXBvcnRhbnRcIixcbiAgICAgIFwiLS1jb2xvckJveFNoYWRvd1wiOiBcInJnYmEoMCwgMCwgMCwgMC4yMCkgIWltcG9ydGFudFwiLFxuICAgIH0sXG4gICAgXCIjcGxheWVyVUkgKlwiOiB7XG4gICAgICBmb250RmFtaWx5OiBcInN5c3RlbS11aVwiLFxuICAgIH0sXG4gICAgXCIjc2hhcmVkLXN0cmVhbS1jb250YWluZXJcIjoge1xuICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICB9LFxuICAgIFwiI3NoYXJlZC1zdHJlYW0tY29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhclwiOiB7XG4gICAgICB3aWR0aDogXCIxMHB4XCIsXG4gICAgfSxcbiAgICBcIiNzaGFyZWQtc3RyZWFtLWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2tcIjoge1xuICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1jb2xvcjEzKVwiLFxuICAgICAgb3BhY2l0eTogXCIwLjVcIixcbiAgICAgIGJvcmRlclJhZGl1czogXCIzMHB4XCIsXG4gICAgICBib3JkZXJUb3A6IFwiMjBweCBzb2xpZCB2YXIoLS1jb2xvcjApXCIsXG4gICAgICBib3JkZXJSaWdodDogXCI1cHggc29saWQgdmFyKC0tY29sb3IwKVwiLFxuICAgICAgYm9yZGVyQm90dG9tOiBcIjIwcHggc29saWQgdmFyKC0tY29sb3IwKVwiLFxuICAgICAgYm9yZGVyTGVmdDogXCI1cHggc29saWQgdmFyKC0tY29sb3IwKVwiLFxuICAgIH0sXG4gICAgXCIjc2hhcmVkLXN0cmVhbS1jb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrLXBpZWNlXCI6IHtcbiAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICB9LFxuICAgIFwiI3NoYXJlZC1zdHJlYW0tY29udGFpbmVyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYlwiOiB7XG4gICAgICBiYWNrZ3JvdW5kOiBcInZhcigtLWNvbG9yMTMpXCIsXG4gICAgICB3aWR0aDogXCI4cHhcIixcbiAgICAgIGJvcmRlclJpZ2h0OiBcIjJweCBzb2xpZCB2YXIoLS1jb2xvcjApXCIsXG4gICAgICBib3JkZXJMZWZ0OiBcIjJweCBzb2xpZCB2YXIoLS1jb2xvcjApXCIsXG4gICAgICB0cmFuc2l0aW9uOiBcImFsbCBlYXNlLWluLW91dCAwLjNzXCIsXG4gICAgICBib3JkZXJSYWRpdXM6IFwiN3B4XCIsXG4gICAgfSxcbiAgICBcIiNzaGFyZWQtc3RyZWFtLWNvbnRhaW5lcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWI6aG92ZXJcIjoge1xuICAgICAgdHJhbnNpdGlvbjogXCJhbGwgZWFzZS1pbi1vdXQgMC4zc1wiLFxuICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1jb2xvcjMpXCIsXG4gICAgfSxcbiAgICBcIiNwbGF5ZXJVSSwgI3ZpZGVvRWxlbWVudFBhcmVudFwiOiB7XG4gICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgaGVpZ2h0OiBcIjEwMCVcIixcbiAgICAgIG1heFdpZHRoOiBcIjEwMCVcIixcbiAgICAgIG1heEhlaWdodDogXCIxMDAlXCIsXG4gICAgICB0b3A6IDAsXG4gICAgICByaWdodDogMCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICBtYXJnaW46IFwiYXV0b1wiLFxuICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgIHBvaW50ZXJFdmVudHM6IFwiYWxsXCIsXG4gICAgfSxcbiAgICBcIiNzdHJlYW1pbmdWaWRlb1wiOiB7XG4gICAgICBtYXhXaWR0aDogXCIxMDAlXCIsXG4gICAgICBtYXhIZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgYm94U2l6aW5nOiBcImJvcmRlci1ib3hcIixcbiAgICAgIGJhY2tncm91bmQ6IFwiIzE4MTgxQVwiLFxuICAgIH0sXG4gICAgXCIjdWlGZWF0dXJlcyAjY29udHJvbHNcIjoge1xuICAgICAgdG9wOiBcImF1dG9cIixcbiAgICAgIGxlZnQ6IFwiYXV0b1wiLFxuICAgICAgYm90dG9tOiBcIjEwcHhcIixcbiAgICAgIHJpZ2h0OiBcIjIwcHhcIixcbiAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW4tcmV2ZXJzZVwiLFxuICAgIH0sXG4gICAgXCIjdWlGZWF0dXJlcyAjY29ubmVjdGlvblwiOiB7XG4gICAgICBib3R0b206IFwiNXB4XCIsXG4gICAgICBsZWZ0OiBcIjEwcHhcIixcbiAgICAgIHdpZHRoOiBcIjIuNXJlbVwiLFxuICAgICAgaGVpaGd0OiBcIjIuNXJlbVwiLFxuICAgIH0sXG4gICAgXCIjdWlGZWF0dXJlcyBidXR0b25cIjoge1xuICAgICAgYmFja2dyb3VuZENvbG9yOiBcInZhcigtLWNvbG9yMTIpXCIsXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgcG9zaXRpb246IFwicmVsYXRpdmVcIixcbiAgICAgIHdpZHRoOiBcIjQ1cHhcIixcbiAgICAgIGhlaWdodDogXCI0NXB4XCIsXG4gICAgICBwYWRkaW5nOiBcIjAuNXJlbVwiLFxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIixcbiAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgZmxleERpcmVjdGlvbjogXCJyb3dcIixcbiAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgIGJveFNoYWRvdzogXCIwcHggMHB4IDI0cHggMHB4IHZhcigtLWNvbG9yQm94U2hhZG93KVwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjNweFwiLFxuICAgICAgb3V0bGluZTogXCJub25lXCIsXG4gICAgfSxcbiAgICBcIiN1aUZlYXR1cmVzIGJ1dHRvbjpob3ZlciwgI3VpRmVhdHVyZXMgYnV0dG9uOmFjdGl2ZVwiOiB7XG4gICAgICBwYWRkaW5nOiBcIjAgIWltcG9ydGFudFwiLFxuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICB9LFxuICAgIFwiI3VpRmVhdHVyZXMgYnV0dG9uICNhdWRpb0ljb25NdXRlZCwgI3VpRmVhdHVyZXMgYnV0dG9uICNhdWRpb0ljb25Vbm11dGVkLCAjdWlGZWF0dXJlcyBidXR0b24gI21pY0ljb25NdXRlZCwgI3VpRmVhdHVyZXMgYnV0dG9uICNtaWNJY29uVW5tdXRlZFwiOlxuICAgICAge1xuICAgICAgICB3aWR0aDogXCIzMXB4XCIsXG4gICAgICAgIGhlaWdodDogXCIyOHB4XCIsXG4gICAgICB9LFxuICAgIFwiI3VpRmVhdHVyZXMgYnV0dG9uICNtYXhpbWl6ZUljb24sICN1aUZlYXR1cmVzIGJ1dHRvbiAjbWluaW1pemVJY29uXCI6IHtcbiAgICAgIHdpZHRoOiBcIjI1cHhcIixcbiAgICAgIGhlaWdodDogXCIyNXB4XCIsXG4gICAgfSxcbiAgICBcIiNzdG9wSWNvbiwgI3BsYXlJY29uXCI6IHtcbiAgICAgIHdpZHRoOiBcIjMwcHhcIixcbiAgICAgIGhlaWdodDogXCIzMHB4XCIsXG4gICAgfSxcbiAgICBcIiN1aUZlYXR1cmVzIGJ1dHRvbiAudG9vbHRpcHRleHRcIjoge1xuICAgICAgcmlnaHQ6IFwiMTI1JVwiLFxuICAgICAgbGVmdDogXCJhdXRvXCIsXG4gICAgICBib3hTaGFkb3c6IFwiMHB4IDBweCAyNHB4IDBweCB2YXIoLS1jb2xvckJveFNoYWRvdylcIixcbiAgICAgIGJvcmRlclJhZGl1czogXCIzcHhcIixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1jb2xvcjEyKVwiLFxuICAgICAgd2lkdGg6IFwiOTVweFwiLFxuICAgICAgdmlzaWJpbGl0eTogXCJoaWRkZW4haW1wb3J0YW50XCIsXG4gICAgfSxcbiAgICBcIkBtZWRpYSAoaG92ZXI6IGhvdmVyKSBhbmQgKHBvaW50ZXI6IGZpbmUpXCI6IHtcbiAgICAgIFwiI3VpRmVhdHVyZXMgYnV0dG9uOmhvdmVyIC50b29sdGlwdGV4dFwiOiB7XG4gICAgICAgIHZpc2liaWxpdHk6IFwidmlzaWJsZSFpbXBvcnRhbnRcIixcbiAgICAgIH0sXG4gICAgfSxcbiAgICBcIiNjb250cm9scz4qXCI6IHtcbiAgICAgIG1hcmdpbkJvdHRvbTogXCIwLjVyZW1cIixcbiAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIixcbiAgICAgIGxpbmVIZWlnaHQ6IFwiMS43NXJlbVwiLFxuICAgICAgcGFkZGluZzogXCIwLjVyZW1cIixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1jb2xvcjEyKVwiLFxuICAgIH0sXG4gICAgXCIjdWlGZWF0dXJlcyAjc2V0dGluZ3NJY29uLCAjdWlGZWF0dXJlcyAjc3RhdHNJY29uXCI6IHtcbiAgICAgIHdpZHRoOiBcIjI3cHhcIixcbiAgICAgIGhlaWdodDogXCIyN3B4XCIsXG4gICAgfSxcbiAgICBcIi5zdmdJY29uXCI6IHtcbiAgICAgIGZpbGw6IFwidmFyKC0tY29sb3IxMylcIixcbiAgICB9LFxuICAgIFwiI3VpRmVhdHVyZXMgYnV0dG9uOmhvdmVyIC5zdmdJY29uLCAjdWlGZWF0dXJlcyBidXR0b246YWN0aXZlIC5zdmdJY29uXCI6IHtcbiAgICAgIGZpbGw6IFwidmFyKC0tY29sb3IxMilcIixcbiAgICB9LFxuICAgIFwiLnRnbC1zd2l0Y2ggLnRnbC1zbGlkZXIsIC50Z2wtZmxhdDpjaGVja2VkKy50Z2wtc2xpZGVyXCI6IHtcbiAgICAgIGJvcmRlcjogXCIzcHggc29saWQgdHJhbnNwYXJlbnRcIixcbiAgICB9LFxuICAgIFwiLnRnbC1zd2l0Y2ggLnRnbC1zbGlkZXJcIjoge1xuICAgICAgYmFja2dyb3VuZDogXCJub25lXCIsXG4gICAgfSxcbiAgICBcIi50Z2wtc3dpdGNoIC50Z2wtc2xpZGVyOjpiZWZvcmVcIjoge1xuICAgICAgY29udGVudDogXCInJ1wiLFxuICAgICAgZGlzcGxheTogXCJibG9ja1wiLFxuICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1jb2xvcjYpXCIsXG4gICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgaGVpZ2h0OiBcIjUwJVwiLFxuICAgICAgd2lkdGg6IFwiOTAlXCIsXG4gICAgICBib3JkZXJSYWRpdXM6IFwiNXB4XCIsXG4gICAgICBtYXJnaW46IFwiYXV0b1wiLFxuICAgICAgdG9wOiBcIjBcIixcbiAgICAgIGJvdHRvbTogXCIwXCIsXG4gICAgICBsZWZ0OiBcIjBcIixcbiAgICAgIHJpZ2h0OiBcIjBcIixcbiAgICB9LFxuICAgIFwiLnRnbC1zd2l0Y2ggLnRnbC1zbGlkZXI6OmFmdGVyXCI6IHtcbiAgICAgIGhlaWdodDogXCIxM3B4XCIsXG4gICAgICB3aWR0aDogXCIxM3B4XCIsXG4gICAgICBib3JkZXJSYWRpdXM6IFwiNTAlXCIsXG4gICAgICB0b3A6IFwiLTJweFwiLFxuICAgICAgbGVmdDogXCItMSVcIixcbiAgICB9LFxuICAgIFwiLnRnbC1mbGF0OmNoZWNrZWQrLnRnbC1zbGlkZXI6YWZ0ZXJcIjoge1xuICAgICAgbGVmdDogXCI2MiVcIixcbiAgICAgIGJhY2tncm91bmQ6IFwidmFyKC0tY29sb3IzKVwiLFxuICAgIH0sXG4gICAgXCIuZm9ybS1jb250cm9sXCI6IHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ0cmFuc3BhcmVudFwiLFxuICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCB2YXIoLS1jb2xvcjEzKVwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjJweFwiLFxuICAgICAgY29sb3I6IFwidmFyKC0tY29sb3IxMylcIixcbiAgICAgIHRleHRBbGlnbjogXCJsZWZ0XCIsXG4gICAgICBmb250RmFtaWx5OiBcImluaGVyaXRcIixcbiAgICAgIHBhZGRpbmc6IFwiNXB4IDE1cHggXCIsXG4gICAgfSxcbiAgICBcIi5idG4tZmxhdFwiOiB7XG4gICAgICBiYWNrZ3JvdW5kOiBcInZhcigtLWNvbG9yMylcIixcbiAgICAgIGNvbG9yOiBcInZhcigtLWNvbG9yMTIpXCIsXG4gICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgcGFkZGluZzogXCI3cHggNTBweFwiLFxuICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIixcbiAgICAgIGJvcmRlclJhZGl1czogXCI0cHhcIixcbiAgICAgIHRleHRUcmFuc2Zvcm06IFwidXBwZXJjYXNlXCIsXG4gICAgICBtaW5XaWR0aDogXCIxNzVweFwiLFxuICAgIH0sXG4gICAgXCIuYnRuLWZsYXQ6ZGlzYWJsZWRcIjoge1xuICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1jb2xvcjcpXCIsXG4gICAgICBib3JkZXJDb2xvcjogXCJ2YXIoLS1jb2xvcjMpXCIsXG4gICAgICBjb2xvcjogXCJ2YXIoLS1jb2xvcjMpXCIsXG4gICAgICBjdXJzb3I6IFwiZGVmYXVsdFwiLFxuICAgIH0sXG4gICAgXCIuYnRuLWZsYXQ6Zm9jdXNcIjoge1xuICAgICAgb3V0bGluZTogXCJub25lXCIsXG4gICAgfSxcbiAgICBcIi5hcmN3YXJlLWxvZ28tbG9hZGVyXCI6IHtcbiAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICBkaXNwbGF5OiBcImJsb2NrXCIsXG4gICAgICB3aWR0aDogXCIxMi41JVwiLFxuICAgICAgaGVpZ2h0OiBcIjEyLjUlXCIsXG4gICAgfSxcbiAgICBcIiNwbGF5T3ZlcmxheSBpbWcjcGxheUJ1dHRvblwiOiB7XG4gICAgICB3aWR0aDogXCI1JVwiLFxuICAgIH0sXG4gICAgXCIjZGlzY29ubmVjdE92ZXJsYXksICNlcnJvck92ZXJsYXlcIjoge1xuICAgICAgdGV4dFRyYW5zZm9ybTogXCJpbml0aWFsXCIsXG4gICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXG4gICAgICBmb250U2l6ZTogXCIyMHB4XCIsXG4gICAgICBsaW5lSGVpZ2h0OiAyLjUsXG4gICAgfSxcbiAgICBcIiNkaXNjb25uZWN0T3ZlcmxheSAuY2xpY2thYmxlU3RhdGVcIjoge1xuICAgICAgdGV4dFRyYW5zZm9ybTogXCJpbml0aWFsXCIsXG4gICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXG4gICAgICBjb2xvcjogXCIjREFGNjkzXCIsXG4gICAgICBwYWRkaW5nOiBcIjVweFwiLFxuICAgICAgZm9udFNpemU6IFwiMThweFwiLFxuICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjREFGNjkzXCIsXG4gICAgICBtYXJnaW46IFwiMjVweCBhdXRvIDBcIixcbiAgICAgIHdpZHRoOiBcIjE4MHB4XCIsXG4gICAgfSxcbiAgICBcIiNhZmtPdmVybGF5XCI6IHtcbiAgICAgIGJhY2tncm91bmQ6IFwibm9uZVwiLFxuICAgICAgdHJhbnNpdGlvbjogXCJhbGwgZWFzZS1pbi1vdXQgMC41c1wiLFxuICAgICAgb3BhY2l0eTogMSxcbiAgICAgIHBvaW50ZXJFdmVudHM6IFwiaW5pdGlhbFwiLFxuICAgIH0sXG4gICAgXCIjYWZrT3ZlcmxheUlubmVyXCI6IHtcbiAgICAgIHRleHRUcmFuc2Zvcm06IFwiaW5pdGlhbFwiLFxuICAgICAgYmFja2dyb3VuZDogXCIjMTgxODFBXCIsXG4gICAgICBwYWRkaW5nOiBcIjIwcHggMTBweCAzMHB4XCIsXG4gICAgICBmb250U2l6ZTogXCIxOHB4XCIsXG4gICAgICB3aWR0aDogXCIzNjBweFwiLFxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgbGluZUhlaWdodDogMi41LFxuICAgIH0sXG4gICAgXCIjYWZrT3ZlcmxheUlubmVyIGNlbnRlcjo6Zmlyc3QtbGluZVwiOiB7XG4gICAgICB0ZXh0VHJhbnNmb3JtOiBcInVwcGVyY2FzZVwiLFxuICAgICAgY29sb3I6IFwiI0ZGODQ2MVwiLFxuICAgICAgZm9udFdlaWdodDogXCJib2xkXCIsXG4gICAgICBmb250U2l6ZTogXCIyNHB4XCIsXG4gICAgfSxcbiAgICBcIiNhZmtPdmVybGF5SW5uZXIgI2Fma0NvdW50RG93bk51bWJlclwiOiB7XG4gICAgICBjb2xvcjogXCIjREFGNjkzXCIsXG4gICAgICBmb250U2l6ZTogXCIyNnB4XCIsXG4gICAgICBsaW5lSGVpZ2h0OiBcIjIycHhcIixcbiAgICB9LFxuICAgIFwiI2Fma092ZXJsYXlJbm5lciBjZW50ZXIgLnJldHJ5LWJ1dHRvblwiOiB7XG4gICAgICB0ZXh0VHJhbnNmb3JtOiBcImluaXRpYWxcIixcbiAgICAgIHRleHRBbGlnbjogXCJjZW50ZXJcIixcbiAgICAgIGNvbG9yOiBcIiNEQUY2OTNcIixcbiAgICAgIHBhZGRpbmc6IFwiNXB4XCIsXG4gICAgICBmb250U2l6ZTogXCIxOHB4XCIsXG4gICAgICBib3JkZXI6IFwiMXB4IHNvbGlkICNEQUY2OTNcIixcbiAgICAgIG1hcmdpbjogXCIyNXB4IGF1dG8gMFwiLFxuICAgICAgd2lkdGg6IFwiMTgwcHhcIixcbiAgICB9LFxuICAgIFwiI2Nvbm5lY3RPdmVybGF5ICNjb25uZWN0QnV0dG9uXCI6IHtcbiAgICAgIHRleHRUcmFuc2Zvcm06IFwiaW5pdGlhbFwiLFxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgY29sb3I6IFwiI0RBRjY5M1wiLFxuICAgICAgcGFkZGluZzogXCI1cHggNXB4IDhweFwiLFxuICAgICAgZm9udFNpemU6IFwiMThweFwiLFxuICAgICAgYm9yZGVyOiBcIjFweCBzb2xpZCAjREFGNjkzXCIsXG4gICAgICBtYXJnaW46IFwiMjVweCBhdXRvIDBcIixcbiAgICAgIHdpZHRoOiBcIjE4MHB4XCIsXG4gICAgfSxcblxuICAgIFwiI2Nvbm5lY3RPdmVybGF5IC5jb25uZWN0aW9uLXRleHRcIjoge1xuICAgICAgdGV4dFRyYW5zZm9ybTogXCJpbml0aWFsXCIsXG4gICAgICB0ZXh0QWxpZ246IFwiY2VudGVyXCIsXG4gICAgICBtYXJnaW46IFwiMjVweCBhdXRvIDBcIixcbiAgICB9LFxuICAgIFwiI2Nvbm5lY3RPdmVybGF5IC5jb25uZWN0aW9uLXRleHQgLnRpdGxlXCI6IHtcbiAgICAgIGNvbG9yOiBcIiNmZmZmZmZcIixcbiAgICAgIGZvbnRTaXplOiBcIjE4cHhcIixcbiAgICAgIG1hcmdpbjogXCI1cHggMFwiLFxuICAgIH0sXG4gICAgXCIjY29ubmVjdE92ZXJsYXkgLmNvbm5lY3Rpb24tdGV4dCAuc3VidGl0bGVcIjoge1xuICAgICAgY29sb3I6IFwiI2ZmZmZmZlwiLFxuICAgICAgb3BhY2l0eTogMC41LFxuICAgICAgZm9udFNpemU6IFwiMTJweFwiLFxuICAgICAgbWFyZ2luOiBcIjEwcHggMFwiLFxuICAgIH0sXG4gICAgXCIjaW5mb092ZXJsYXkuaGlkZGVuU3RhdGVcIjoge1xuICAgICAgZGlzcGxheTogXCJub25lXCIsXG4gICAgfSxcbiAgICBcIiNkaXNjb25uZWN0T3ZlcmxheSwgI3BsYXlPdmVybGF5LCAjZXJyb3JPdmVybGF5LCAjbWljcm9waG9uZU92ZXJsYXksICNjb25uZWN0T3ZlcmxheVwiOiB7XG4gICAgICBiYWNrZ3JvdW5kOiBcIiMxODE4MUFcIixcbiAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgdHJhbnNpdGlvbjogXCJhbGwgZWFzZS1pbi1vdXQgMC41c1wiLFxuICAgICAgb3BhY2l0eTogMSxcbiAgICAgIHBvaW50ZXJFdmVudHM6IFwiaW5pdGlhbFwiLFxuICAgIH0sXG4gICAgXCIjbWljcm9waG9uZU92ZXJsYXlcIjoge1xuICAgICAgdGV4dFRyYW5zZm9ybTogXCJpbml0aWFsXCIsXG4gICAgICBwYWRkaW5nOiBcIjIwcHggMzBweFwiLFxuICAgICAgZm9udFNpemU6IFwiMTRweFwiLFxuICAgICAgaGVpZ2h0OiBcIjIzMHB4XCIsXG4gICAgICB3aWR0aDogXCIzNjBweFwiLFxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgbGluZUhlaWdodDogMS4yNSxcbiAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICBtYXJnaW46IFwiYXV0b1wiLFxuICAgICAgdG9wOiBcIjBcIixcbiAgICAgIGJvdHRvbTogXCIwXCIsXG4gICAgICBsZWZ0OiBcIjBcIixcbiAgICAgIHJpZ2h0OiBcIjBcIixcbiAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICB6SW5kZXg6IDk5OTk5LFxuICAgIH0sXG4gICAgXCIjbWljcm9waG9uZU92ZXJsYXkgLnRpdGxlXCI6IHtcbiAgICAgIGZvbnRTaXplOiBcIjI0cHhcIixcbiAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICBtYXJnaW5Cb3R0b206IFwiMjBweFwiLFxuICAgICAgY29sb3I6IFwiI0YwRjBGMlwiLFxuICAgIH0sXG4gICAgXCIjbWljcm9waG9uZU92ZXJsYXkgLnRpdGxlOmFmdGVyXCI6IHtcbiAgICAgIGNvbnRlbnQ6IFwiJydcIixcbiAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgICBhbmltYXRpb246IFwiZG90dHkgc3RlcHMoMSxlbmQpIDFzIGluZmluaXRlXCIsXG4gICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgIH0sXG4gICAgXCIjbWljcm9waG9uZU92ZXJsYXkgcFwiOiB7XG4gICAgICBtYXJnaW46IDAsXG4gICAgICBjb2xvcjogXCIjODU4NTg4XCIsXG4gICAgfSxcbiAgICBcIiNtaWNyb3Bob25lT3ZlcmxheSBzdmdcIjoge1xuICAgICAgaGVpZ2h0OiBcIjY1cHhcIixcbiAgICAgIG1hcmdpbkJvdHRvbTogXCIxNXB4XCIsXG4gICAgICBtYXJnaW5Ub3A6IFwiLTVweFwiLFxuICAgIH0sXG4gICAgXCIjbWljcm9waG9uZU92ZXJsYXkgLnN2Z0ljb25cIjoge1xuICAgICAgZmlsbDogXCIjREFGNjkzXCIsXG4gICAgfSxcbiAgICBcIiNkaXNjb25uZWN0T3ZlcmxheS5oaWRkZW5TdGF0ZSwgI3BsYXlPdmVybGF5LmhpZGRlblN0YXRlLCAjZXJyb3JPdmVybGF5LmhpZGRlblN0YXRlLCAjYWZrT3ZlcmxheS5oaWRkZW5TdGF0ZSwgI21pY3JvcGhvbmVPdmVybGF5LmhpZGRlblN0YXRlXCI6XG4gICAgICB7XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiLFxuICAgICAgfSxcbiAgICBcIiNkaXNjb25uZWN0T3ZlcmxheS5taWMtb3ZlcmxheS1pcy12aXNpYmxlLCAjZXJyb3JPdmVybGF5Lm1pYy1vdmVybGF5LWlzLXZpc2libGUsICNpbmZvT3ZlcmxheS5taWMtb3ZlcmxheS1pcy12aXNpYmxlXCI6XG4gICAgICB7XG4gICAgICAgIG9wYWNpdHk6IDAsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6IFwibm9uZVwiLFxuICAgICAgfSxcbiAgICBcIiNpbmZvT3ZlcmxheS5oaWRkZW5TdGF0ZSwgI2Nvbm5lY3RPdmVybGF5LmhpZGRlblN0YXRlXCI6IHtcbiAgICAgIGRpc3BsYXk6IFwibm9uZVwiLFxuICAgIH0sXG4gICAgXCIjY29ubmVjdE92ZXJsYXlcIjoge1xuICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtbi1yZXZlcnNlXCIsXG4gICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gICAgfSxcbiAgICBcIiNpbmZvT3ZlcmxheVwiOiB7XG4gICAgICBkaXNwbGF5OiBcIm5vbmVcIixcbiAgICB9LFxuICAgIFwiLmxvdmUtbGV0dGVycy1ib3gtcm9vdFwiOiB7XG4gICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICB3aWR0aDogXCIxMDAlXCIsXG4gICAgICBoZWlnaHQ6IFwiMTAwJVwiLFxuICAgICAgY29sb3I6IFwiI2ZmZmZmZlwiLFxuICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgIGJhY2tncm91bmQ6IFwiIzE4MTgxQVwiLFxuICAgICAgekluZGV4OiAxLFxuICAgIH0sXG4gICAgXCIubG92ZS1sZXR0ZXJzLWJveC1yb290LmZhZGUtb3V0XCI6IHtcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgICB0cmFuc2l0aW9uOiBcIm9wYWNpdHkgMC41c1wiLFxuICAgIH0sXG4gICAgXCIjbGV0dGVycy1ibG9ja1wiOiB7XG4gICAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgICAgdG9wOiAwLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgYm90dG9tOiAwLFxuICAgICAgbWFyZ2luOiBcImF1dG9cIixcbiAgICAgIGNvbG9yOiBcIiNmZmZmZmZcIixcbiAgICAgIHpJbmRleDogNCxcbiAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgZmxleERpcmVjdGlvbjogXCJjb2x1bW5cIixcbiAgICAgIGp1c3RpZnlDb250ZW50OiBcImNlbnRlclwiLFxuICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIixcbiAgICAgIGZvbnRTaXplOiBcIjE2cHhcIixcbiAgICAgIHRleHRUcmFuc2Zvcm06IFwiaW5pdGlhbFwiLFxuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgIH0sXG4gICAgXCIjbGV0dGVycy13cmFwcGVyXCI6IHtcbiAgICAgIGhlaWdodDogXCI3N3B4XCIsXG4gICAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAgIHBvc2l0aW9uOiBcInJlbGF0aXZlXCIsXG4gICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgIGZsZXhEaXJlY3Rpb246IFwiY29sdW1uXCIsXG4gICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAganVzdGlmeUNvbnRlbnQ6IFwiZmxleC1lbmRcIixcbiAgICAgIG1hcmdpblRvcDogXCIxMHB4XCIsXG4gICAgICBwYWRkaW5nQm90dG9tOiBcIjJweFwiLFxuICAgIH0sXG4gICAgXCIjbGV0dGVycy13cmFwcGVyIHBcIjoge1xuICAgICAgdGV4dEFsaWduOiBcImNlbnRlclwiLFxuICAgICAgbGluZUhlaWdodDogMS4yNSxcbiAgICAgIGZvbnRTaXplOiBcIjE2cHhcIixcbiAgICB9LFxuICAgIFwiLmxldHRlci1hbmltYXRpb246bnRoLWxhc3Qtb2YtdHlwZSgxKTo6YWZ0ZXJcIjoge1xuICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgIGFuaW1hdGlvbjogXCJkb3R0eSBzdGVwcygxLGVuZCkgMXMgaW5maW5pdGVcIixcbiAgICAgIGNvbnRlbnQ6IFwiJydcIixcbiAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgfSxcbiAgICBcIi5sZXR0ZXItYW5pbWF0aW9uXCI6IHtcbiAgICAgIHRyYW5zaXRpb246IFwiYWxsIDAuNXMgZWFzZS1pbi1vdXRcIixcbiAgICAgIHRyYW5zZm9ybU9yaWdpbjogXCJib3R0b21cIixcbiAgICAgIG1hcmdpbjogXCIwIGF1dG9cIixcbiAgICB9LFxuXG4gICAgXCIubGV0dGVyLWFuaW1hdGlvbi1lbnRlclwiOiB7XG4gICAgICBhbmltYXRpb246IFwiZmFkZUluVXAgMC43NXMgZWFzZS1vdXRcIixcbiAgICB9LFxuICAgIFwiLmxldHRlci1hbmltYXRpb24tZXhpdFwiOiB7XG4gICAgICBvcGFjaXR5OiAwLFxuICAgICAgc2NhbGU6IDAuOSxcbiAgICAgIHRyYW5zaXRpb246IFwiYWxsIGVhc2UtaW4tb3V0IDFzXCIsXG4gICAgICBtYXJnaW46IDAsXG4gICAgfSxcbiAgICBcIkBrZXlmcmFtZXMgZG90dHlcIjoge1xuICAgICAgXCIwJVwiOiB7IGNvbnRlbnQ6IFwiJydcIiB9LFxuICAgICAgXCIyNSVcIjogeyBjb250ZW50OiBcIicuJ1wiIH0sXG4gICAgICBcIjUwJVwiOiB7IGNvbnRlbnQ6IFwiJy4uJ1wiIH0sXG4gICAgICBcIjc1JVwiOiB7IGNvbnRlbnQ6IFwiJy4uLidcIiB9LFxuICAgICAgXCIxMDAlXCI6IHsgY29udGVudDogXCInJ1wiIH0sXG4gICAgfSxcbiAgICBcIkBrZXlmcmFtZXMgZmFkZUluVXBcIjoge1xuICAgICAgZnJvbToge1xuICAgICAgICBvcGFjaXR5OiAwLFxuICAgICAgICB0cmFuc2Zvcm06IFwiIHRyYW5zbGF0ZVkoNXB4KVwiLFxuICAgICAgICBzY2FsZTogMC45LFxuICAgICAgfSxcbiAgICAgIHRvOiB7XG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVZKDApXCIsXG4gICAgICAgIHNjYWxlOiAxLFxuICAgICAgfSxcbiAgICB9LFxuICAgIFwiLmhpZGRlblwiOiB7XG4gICAgICBkaXNwbGF5OiBcIm5vbmVcIixcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgfSxcbiAgICBcIi52aXNpYmxlXCI6IHtcbiAgICAgIGRpc3BsYXk6IFwiYmxvY2tcIixcbiAgICAgIG9wYWNpdHk6IDEsXG4gICAgICB0cmFuc2l0aW9uOiBcIm9wYWNpdHkgMXMgZWFzZS1vdXRcIixcbiAgICB9LFxuICB9LFxufTtcbiIsImV4cG9ydCBjbGFzcyBBcmN3YXJlTG9nb0xvYWRlciB7XG4gIHB1YmxpYyBhcmN3YXJlTG9nb0xvYWRlcjogSFRNTERpdkVsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hcmN3YXJlTG9nb0xvYWRlciA9IHRoaXMuY3JlYXRlQXJjd2FyZUxvZ29Mb2FkZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXJjd2FyZUxvZ29Mb2FkZXIoKTogSFRNTERpdkVsZW1lbnQge1xuICAgIGNvbnN0IGFyY3dhcmVMb2dvTG9hZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBhcmN3YXJlTG9nb0xvYWRlci5jbGFzc0xpc3QuYWRkKFwiYXJjd2FyZS1sb2dvLWxvYWRlclwiKTtcbiAgICBhcmN3YXJlTG9nb0xvYWRlci5pbm5lckhUTUwgPSB0aGlzLmdldFN2ZygpO1xuICAgIHJldHVybiBhcmN3YXJlTG9nb0xvYWRlcjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3ZnKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxzdmcgd2lkdGg9XCI0MlwiIGhlaWdodD1cIjgwXCIgdmlld0JveD1cIjAgMCA0MiA4MFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHN0eWxlPlxuICAgICAgICAgIEBrZXlmcmFtZXMgcmlwcGxlLTEtZG93biB7XG4gICAgICAgICAgICAwJSwgNTAlIHsgdHJhbnNsYXRlOiAwIDA7IH1cbiAgICAgICAgICAgIDYwJSwgMTAwJSB7IHRyYW5zbGF0ZTogMCA1cHg7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQGtleWZyYW1lcyByaXBwbGUtMS11cCB7XG4gICAgICAgICAgICAwJSwgNTAlIHsgdHJhbnNsYXRlOiAwIDA7IH1cbiAgICAgICAgICAgIDYwJSwgMTAwJSB7IHRyYW5zbGF0ZTogMCAtNXB4OyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIEBrZXlmcmFtZXMgcmlwcGxlLTItZG93biB7XG4gICAgICAgICAgICAwJSwgNTUlIHsgdHJhbnNsYXRlOiAwIDA7IH1cbiAgICAgICAgICAgIDY1JSwgMTAwJSB7IHRyYW5zbGF0ZTogMCA1cHg7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQGtleWZyYW1lcyByaXBwbGUtMy1kb3duIHtcbiAgICAgICAgICAgIDAlLCA2MCUgeyB0cmFuc2xhdGU6IDAgMDsgfVxuICAgICAgICAgICAgNzAlLCAxMDAlIHsgdHJhbnNsYXRlOiAwIDVweDsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBAa2V5ZnJhbWVzIHJpcHBsZS0zLXVwIHtcbiAgICAgICAgICAgIDAlLCA2MCUgeyB0cmFuc2xhdGU6IDAgMDsgfVxuICAgICAgICAgICAgNzAlLCAxMDAlIHsgdHJhbnNsYXRlOiAwIC01cHg7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgQGtleWZyYW1lcyByaXBwbGUtNC11cCB7XG4gICAgICAgICAgICAwJSwgNjUlIHsgdHJhbnNsYXRlOiAwIDA7IH1cbiAgICAgICAgICAgIDc1JSwgMTAwJSB7IHRyYW5zbGF0ZTogMCAtNXB4OyB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLnJpcHBsZS0xLWRvd24geyBhbmltYXRpb246IHJpcHBsZS0xLWRvd24gMC42cyBpbmZpbml0ZSBhbHRlcm5hdGU7IH1cbiAgICAgICAgICAucmlwcGxlLTEtdXAgICB7IGFuaW1hdGlvbjogcmlwcGxlLTEtdXAgMC42cyBpbmZpbml0ZSBhbHRlcm5hdGU7IH1cbiAgICAgICAgICAucmlwcGxlLTItZG93biB7IGFuaW1hdGlvbjogcmlwcGxlLTItZG93biAwLjZzIGluZmluaXRlIGFsdGVybmF0ZTsgfVxuICAgICAgICAgIC5yaXBwbGUtMy1kb3duIHsgYW5pbWF0aW9uOiByaXBwbGUtMy1kb3duIDAuNnMgaW5maW5pdGUgYWx0ZXJuYXRlOyB9XG4gICAgICAgICAgLnJpcHBsZS0zLXVwICAgeyBhbmltYXRpb246IHJpcHBsZS0zLXVwIDAuNnMgaW5maW5pdGUgYWx0ZXJuYXRlOyB9XG4gICAgICAgICAgLnJpcHBsZS00LXVwICAgeyBhbmltYXRpb246IHJpcHBsZS00LXVwIDAuNnMgaW5maW5pdGUgYWx0ZXJuYXRlOyB9XG4gICAgICAgIDwvc3R5bGU+XG5cbiAgICAgICAgPGcgY2xhc3M9XCJyaXBwbGUtMS1kb3duXCIgZmlsbD1cIiNmMWYxZjFcIj5cbiAgICAgICAgICA8cmVjdCB5PVwiMzhcIiB3aWR0aD1cIjZcIiBoZWlnaHQ9XCIyMlwiIC8+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgY2xhc3M9XCJyaXBwbGUtMS11cFwiIGZpbGw9XCIjZjFmMWYxXCI+XG4gICAgICAgICAgPHJlY3QgeT1cIjEwXCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiMjJcIiAvPlxuICAgICAgICA8L2c+XG4gICAgICAgIDxnIGNsYXNzPVwicmlwcGxlLTItZG93blwiIGZpbGw9XCIjZjFmMWYxXCI+XG4gICAgICAgICAgPHJlY3QgeD1cIjEyXCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiMzJcIiAvPlxuICAgICAgICAgIDxyZWN0IHg9XCIxMlwiIHk9XCIzOFwiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjIyXCIgLz5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyBjbGFzcz1cInJpcHBsZS0zLWRvd25cIiBmaWxsPVwiI2YxZjFmMVwiPlxuICAgICAgICAgIDxyZWN0IHg9XCIyNFwiIHk9XCIzOFwiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjIyXCIgLz5cbiAgICAgICAgPC9nPlxuICAgICAgICA8ZyBjbGFzcz1cInJpcHBsZS0zLXVwXCIgZmlsbD1cIiNmMWYxZjFcIj5cbiAgICAgICAgICA8cmVjdCB4PVwiMjRcIiB5PVwiMTBcIiB3aWR0aD1cIjZcIiBoZWlnaHQ9XCIyMlwiIC8+XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgY2xhc3M9XCJyaXBwbGUtNC11cFwiIGZpbGw9XCIjZjFmMWYxXCI+XG4gICAgICAgICAgPHJlY3QgeD1cIjM2XCIgeT1cIjEwXCIgd2lkdGg9XCI2XCIgaGVpZ2h0PVwiMjJcIiAvPlxuICAgICAgICAgIDxyZWN0IHg9XCIzNlwiIHk9XCIzOFwiIHdpZHRoPVwiNlwiIGhlaWdodD1cIjMyXCIgLz5cbiAgICAgICAgPC9nPlxuICAgICAgPC9zdmc+XG4gICAgYDtcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIEF1ZGlvSWNvbiB7XG4gIHB1YmxpYyBhdWRpb0ljb25Vbm11dGVkOiBTVkdFbGVtZW50O1xuICBwdWJsaWMgYXVkaW9JY29uTXV0ZWQ6IFNWR0VsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5hdWRpb0ljb25Vbm11dGVkID0gdGhpcy5jcmVhdGVBdWRpb0ljb25Vbm11dGVkKCk7XG4gICAgdGhpcy5hdWRpb0ljb25NdXRlZCA9IHRoaXMuY3JlYXRlQXVkaW9JY29uTXV0ZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXVkaW9JY29uVW5tdXRlZCgpOiBTVkdFbGVtZW50IHtcbiAgICBjb25zdCBhdWRpb0ljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInN2Z1wiKTtcbiAgICBhdWRpb0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBcImF1ZGlvSWNvblVubXV0ZWRcIik7XG4gICAgYXVkaW9JY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIjMxcHhcIik7XG4gICAgYXVkaW9JY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjI4cHhcIik7XG4gICAgYXVkaW9JY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwidmlld0JveFwiLCBcIjAgMCAzMSAyOFwiKTtcblxuICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICAgIHN2Z0dyb3VwPy5jbGFzc0xpc3Q/LmFkZChcInN2Z0ljb25cIik7XG4gICAgYXVkaW9JY29uLmFwcGVuZENoaWxkKHN2Z0dyb3VwKTtcblxuICAgIGNvbnN0IHBhdGgxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuICAgIHBhdGgxLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgbnVsbCxcbiAgICAgIFwiZFwiLFxuICAgICAgXCJNMjEuMDAwOCwwLjA3MjAzMThDMjAuNTU2LC0wLjExNzgxMSwyMC4wMzc5LDAuMDgwNTU2OSwxOS44NDM1LDAuNTE0ODI3QzE5LjY0OTIsMC45NDkwOTgsMTkuODUyMiwxLjQ1NTEyLDIwLjI5NywxLjY0NDlDMjUuMTIzMywzLjcwNDM0LDI4LjI0Miw4LjM1NzYxLDI4LjI0MjIsMTMuNDk5OEMyOC4yNDIyLDE4LjY0MjMsMjUuMTIzNCwyMy4yOTU3LDIwLjI5NjYsMjUuMzU1MUMxOS44NTE4LDI1LjU0NDgsMTkuNjQ4OCwyNi4wNTA4LDE5Ljg0MzEsMjYuNDg1MkMxOS45ODc0LDI2LjgwNzcsMjAuMzEwMiwyNywyMC42NDksMjdDMjAuNzY2NCwyNywyMC44ODU5LDI2Ljk3NjksMjEuMDAwNCwyNi45MjhDMjYuNDY3NCwyNC41OTU0LDMwLDE5LjMyNDYsMzAsMTMuNDk5N0MyOS45OTk4LDcuNjc1MzEsMjYuNDY3NCwyLjQwNDYyLDIxLjAwMDgsMC4wNzIwMzE4WlwiXG4gICAgKTtcblxuICAgIGNvbnN0IHBhdGgyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuICAgIHBhdGgyLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgbnVsbCxcbiAgICAgIFwiZFwiLFxuICAgICAgXCJNMjEuMjM1MSw2LjY5NDM0QzIwLjg3MzUsNi4zNzgyMiwyMC4zMTc5LDYuNDA4MiwxOS45OTQxLDYuNzYxMzRDMTkuNjcwMyw3LjExNDU0LDE5LjcwMSw3LjY1NzA2LDIwLjA2MjcsNy45NzMyNEMyMS42NzEyLDkuMzc5MzIsMjIuNTkzNywxMS4zOTM3LDIyLjU5MzcsMTMuNUMyMi41OTM3LDE1LjYwNjIsMjEuNjcxMSwxNy42MjA2LDIwLjA2MjcsMTkuMDI2N0MxOS43MDEsMTkuMzQyOCwxOS42NzAzLDE5Ljg4NTQsMTkuOTk0MSwyMC4yMzg2QzIwLjE2NzcsMjAuNDI3OSwyMC40MDc5LDIwLjUyNDQsMjAuNjQ5MiwyMC41MjQ0QzIwLjg1NzksMjAuNTI0NCwyMS4wNjc0LDIwLjQ1MjIsMjEuMjM1MSwyMC4zMDU2QzIzLjIxNTcsMTguNTc0NCwyNC4zNTE1LDE2LjA5MzcsMjQuMzUxNSwxMy40OTk5QzI0LjM1MTUsMTAuOTA2MSwyMy4yMTU2LDguNDI1NTMsMjEuMjM1MSw2LjY5NDM0WlwiXG4gICAgKTtcblxuICAgIGNvbnN0IHBhdGgzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuICAgIHBhdGgzLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgbnVsbCxcbiAgICAgIFwiZFwiLFxuICAgICAgXCJNMTUuMzk3MywyLjE2Mjc3QzE1LjEwMTgsMi4wMTY1OCwxNC43NDczLDIuMDQ1MDIsMTQuNDgwMywyLjIzNjIzTDcuNjUxNzYsNy4xMjU5OEgwLjg3ODkwNkMwLjM5MzUxNiw3LjEyNTk4LDAsNy41MTAyNCwwLDcuOTg0MjJWMTkuMDE1NUMwLDE5LjQ4OTUsMC4zOTM1MTYsMTkuODczOCwwLjg3ODkwNiwxOS44NzM4SDcuNjUxN0wxNC40ODAyLDI0Ljc2MzdDMTQuNjMzOSwyNC44NzM3LDE0LjgxNjQsMjQuOTI5OCwxNS4wMDAxLDI0LjkyOThDMTUuMTM1NiwyNC45Mjk4LDE1LjI3MTgsMjQuODk5MiwxNS4zOTczLDI0LjgzNzFDMTUuNjkyNywyNC42OTA5LDE1Ljg3ODksMjQuMzk1LDE1Ljg3ODksMjQuMDcxNlYyLjkyODJDMTUuODc4OSwyLjYwNDgyLDE1LjY5MjcsMi4zMDg4NCwxNS4zOTczLDIuMTYyNzdaTTE0LjEyMSwyMi4zNzc4TDguNDU5MTgsMTguMzIzNEM4LjMwODQyLDE4LjIxNTQsOC4xMjYzNywxOC4xNTcyLDcuOTM5MzksMTguMTU3MkgxLjc1NzgxVjguODQyNDZINy45MzkzOUM4LjEyNjMxLDguODQyNDYsOC4zMDg0Miw4Ljc4NDIyLDguNDU5MTIsOC42NzYzNkwxNC4xMjEsNC42MjE5N1YyMi4zNzc4WlwiXG4gICAgKTtcblxuICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgxKTtcbiAgICBzdmdHcm91cC5hcHBlbmRDaGlsZChwYXRoMik7XG4gICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDMpO1xuXG4gICAgcmV0dXJuIGF1ZGlvSWNvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXVkaW9JY29uTXV0ZWQoKTogU1ZHRWxlbWVudCB7XG4gICAgY29uc3QgYXVkaW9JY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJzdmdcIik7XG4gICAgYXVkaW9JY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgXCJhdWRpb0ljb25NdXRlZFwiKTtcbiAgICBhdWRpb0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMzFweFwiKTtcbiAgICBhdWRpb0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIFwiMjhweFwiKTtcbiAgICBhdWRpb0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ2aWV3Qm94XCIsIFwiMCAtMSAzMSAyOFwiKTtcblxuICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICAgIHN2Z0dyb3VwLmNsYXNzTGlzdD8uYWRkKFwic3ZnSWNvblwiKTtcbiAgICBhdWRpb0ljb24uYXBwZW5kQ2hpbGQoc3ZnR3JvdXApO1xuXG4gICAgY29uc3QgcGF0aDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInBhdGhcIik7XG4gICAgcGF0aDEuc2V0QXR0cmlidXRlTlMoXG4gICAgICBudWxsLFxuICAgICAgXCJkXCIsXG4gICAgICBcIk0xNi4zNTAxLDAuODI5Mjg2QzE2LjA0NiwwLjY3ODc5OSwxNS42ODExLDAuNzA4MDcyLDE1LjQwNjIsMC45MDQ5MTJMOC4zNzY4MSw1LjkzODQ4SDEuNDA0NzZDMC45MDUwOSw1LjkzODQ4LDAuNSw2LjMzNDA0LDAuNSw2LjgyMTk2VjE4LjE3NzdDMC41LDE4LjY2NTcsMC45MDUwOSwxOS4wNjEyLDEuNDA0NzYsMTkuMDYxMkg4LjM3Njc1TDE1LjQwNjEsMjQuMDk0OUMxNS41NjQzLDI0LjIwODIsMTUuNzUyMiwyNC4yNjU5LDE1Ljk0MTIsMjQuMjY1OUMxNi4wODA4LDI0LjI2NTksMTYuMjIxLDI0LjIzNDQsMTYuMzUwMSwyNC4xNzA1QzE2LjY1NDIsMjQuMDIsMTYuODQ1OSwyMy43MTU0LDE2Ljg0NTksMjMuMzgyNVYxLjYxNzI0QzE2Ljg0NTksMS4yODQzNCwxNi42NTQyLDAuOTc5NjU1LDE2LjM1MDEsMC44MjkyODZaTTE1LjAzNjQsMjEuNjM4OUw5LjIwNzk4LDE3LjQ2NTJDOS4wNTI3OCwxNy4zNTQxLDguODY1MzgsMTcuMjk0Miw4LjY3MjksMTcuMjk0MkgyLjMwOTUxVjcuNzA1NDRIOC42NzI5QzguODY1MzIsNy43MDU0NCw5LjA1Mjc4LDcuNjQ1NDgsOS4yMDc5Miw3LjUzNDQ2TDE1LjAzNjQsMy4zNjA4MlYyMS42Mzg5WlwiXG4gICAgKTtcblxuICAgIGNvbnN0IHBhdGgyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuICAgIHBhdGgyLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgbnVsbCxcbiAgICAgIFwiZFwiLFxuICAgICAgXCJNMjUuMjc5OSwxMS43NjM0TDIxLjg0NDIsOC4zMjc0OEMyMS42MjA2LDguMTAzOTksMjEuNjIwNiw3Ljc0MjY0LDIxLjg0NDIsNy41MTkxNUMyMi4wNjc2LDcuMjk1NjYsMjIuNDI5LDcuMjk1NjYsMjIuNjUyNSw3LjUxOTE1TDI2LjA4ODMsMTAuOTU1TDI5LjUyNCw3LjUxOTE1QzI5Ljc0NzYsNy4yOTU2NiwzMC4xMDg4LDcuMjk1NjYsMzAuMzMyMyw3LjUxOTE1QzMwLjU1NTksNy43NDI2NCwzMC41NTU5LDguMTAzOTksMzAuMzMyMyw4LjMyNzQ4TDI2Ljg5NjYsMTEuNzYzNEwzMC4zMzIzLDE1LjE5OTJDMzAuNTU1OSwxNS40MjI3LDMwLjU1NTksMTUuNzg0MSwzMC4zMzIzLDE2LjAwNzZDMzAuMjIwOSwxNi4xMTkxLDMwLjA3NDUsMTYuMTc1MSwyOS45MjgxLDE2LjE3NTFDMjkuNzgxOCwxNi4xNzUxLDI5LjYzNTUsMTYuMTE5MSwyOS41MjQsMTYuMDA3NkwyNi4wODgzLDEyLjU3MTdMMjIuNjUyNSwxNi4wMDc2QzIyLjU0MSwxNi4xMTkxLDIyLjM5NDcsMTYuMTc1MSwyMi4yNDgzLDE2LjE3NTFDMjIuMTAyLDE2LjE3NTEsMjEuOTU1NiwxNi4xMTkxLDIxLjg0NDIsMTYuMDA3NkMyMS42MjA2LDE1Ljc4NDEsMjEuNjIwNiwxNS40MjI3LDIxLjg0NDIsMTUuMTk5MkwyNS4yNzk5LDExLjc2MzRaXCJcbiAgICApO1xuXG4gICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDEpO1xuICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgyKTtcblxuICAgIHJldHVybiBhdWRpb0ljb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEFyY3dhcmVQaXhlbFN0cmVhbWluZyB9IGZyb20gXCIuLi8uLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcbmltcG9ydCB7IEF1ZGlvSWNvbiB9IGZyb20gXCIuL0F1ZGlvSWNvblwiO1xuXG5leHBvcnQgY2xhc3MgQXVkaW9CdXR0b24ge1xuICBwcml2YXRlIGJ1dHRvbjogSFRNTEJ1dHRvbkVsZW1lbnQ7XG4gIHByaXZhdGUgc3RyZWFtOiBBcmN3YXJlUGl4ZWxTdHJlYW1pbmc7XG4gIHByaXZhdGUgYXVkaW9JY29uOiBBdWRpb0ljb247XG4gIHByaXZhdGUgdG9vbHRpcFRleHQ6IEhUTUxFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5zZXRBdWRpb011dGVkQnlEZWZhdWx0KCk7XG4gICAgdGhpcy5idXR0b24gPSB0aGlzLmNyZWF0ZUJ1dHRvbigpO1xuICAgIHRoaXMuYXVkaW9JY29uID0gbmV3IEF1ZGlvSWNvbigpO1xuICAgIHRoaXMudG9vbHRpcFRleHQgPSB0aGlzLmNyZWF0ZVRvb2x0aXBUZXh0KCk7XG4gICAgdGhpcy5idXR0b24uYXBwZW5kQ2hpbGQodGhpcy50b29sdGlwVGV4dCk7XG4gICAgdGhpcy5idXR0b24uYXBwZW5kQ2hpbGQodGhpcy5hdWRpb0ljb24uYXVkaW9JY29uTXV0ZWQpO1xuICAgIHRoaXMuYnV0dG9uLmFwcGVuZENoaWxkKHRoaXMuYXVkaW9JY29uLmF1ZGlvSWNvblVubXV0ZWQpO1xuICAgIHRoaXMuYXVkaW9JY29uLmF1ZGlvSWNvblVubXV0ZWQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIHRoaXMuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLnRvZ2dsZUF1ZGlvLmJpbmQodGhpcykpO1xuXG4gICAgLy8gQmluZCB0aGUgb25Wb2x1bWVDaGFuZ2UgbWV0aG9kIHRvIHRoZSBjdXJyZW50IGluc3RhbmNlXG4gICAgdGhpcy5vblZvbHVtZUNoYW5nZSA9IHRoaXMub25Wb2x1bWVDaGFuZ2UuYmluZCh0aGlzKTtcblxuICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IHRoaXMuc3RyZWFtW1wid2ViUnRjQ29udHJvbGxlclwiXS52aWRlb1BsYXllcltcInZpZGVvRWxlbWVudFwiXTtcbiAgICB2aWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInZvbHVtZWNoYW5nZVwiLCB0aGlzLm9uVm9sdW1lQ2hhbmdlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBdWRpb011dGVkQnlEZWZhdWx0KCk6IHZvaWQge1xuICAgIGNvbnN0IHZpZGVvRWxlbWVudFBhcmVudCA9IHRoaXMuc3RyZWFtLnZpZGVvRWxlbWVudFBhcmVudDtcbiAgICBpZiAodmlkZW9FbGVtZW50UGFyZW50KSB7XG4gICAgICBjb25zdCB2aWRlb0VsZW1lbnQgPSB2aWRlb0VsZW1lbnRQYXJlbnQucXVlcnlTZWxlY3RvcihcInZpZGVvXCIpO1xuICAgICAgaWYgKHZpZGVvRWxlbWVudCkge1xuICAgICAgICB0aGlzLnN0cmVhbS50b2dnbGVBdWRpbyh2aWRlb0VsZW1lbnQsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQnV0dG9uKCk6IEhUTUxCdXR0b25FbGVtZW50IHtcbiAgICBjb25zdCBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgIGJ1dHRvbj8uc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJhdWRpb0J0blwiKTtcbiAgICBidXR0b24/LnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJidXR0b25cIik7XG4gICAgYnV0dG9uPy5jbGFzc0xpc3Q/LmFkZChcIlVpVG9vbFwiKTtcbiAgICByZXR1cm4gYnV0dG9uO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUb29sdGlwVGV4dCgpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgdG9vbHRpcFRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICB0b29sdGlwVGV4dD8uY2xhc3NMaXN0Py5hZGQoXCJ0b29sdGlwdGV4dFwiKTtcbiAgICB0b29sdGlwVGV4dC5pbm5lckhUTUwgPSBcIk11dGUvVW5tdXRlXCI7XG4gICAgcmV0dXJuIHRvb2x0aXBUZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVBdWRpbygpOiB2b2lkIHtcbiAgICBjb25zdCB2aWRlb0VsZW1lbnRQYXJlbnQgPSB0aGlzLnN0cmVhbS52aWRlb0VsZW1lbnRQYXJlbnQ7XG4gICAgaWYgKHZpZGVvRWxlbWVudFBhcmVudCkge1xuICAgICAgY29uc3QgdmlkZW9FbGVtZW50ID0gdmlkZW9FbGVtZW50UGFyZW50LnF1ZXJ5U2VsZWN0b3IoXCJ2aWRlb1wiKTtcbiAgICAgIGlmICh2aWRlb0VsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgbXV0ZWQgPSAhdmlkZW9FbGVtZW50Lm11dGVkO1xuICAgICAgICB0aGlzLnN0cmVhbS50b2dnbGVBdWRpbyh2aWRlb0VsZW1lbnQsIG11dGVkKTtcbiAgICAgICAgdGhpcy51cGRhdGVBdWRpb0ljb24obXV0ZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQXVkaW9JY29uKG11dGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKG11dGVkKSB7XG4gICAgICB0aGlzLmF1ZGlvSWNvbi5hdWRpb0ljb25Vbm11dGVkLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIHRoaXMuYXVkaW9JY29uLmF1ZGlvSWNvbk11dGVkLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXVkaW9JY29uLmF1ZGlvSWNvbk11dGVkLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIHRoaXMuYXVkaW9JY29uLmF1ZGlvSWNvblVubXV0ZWQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVsZW1lbnQoKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmJ1dHRvbjtcbiAgfVxuXG4gIHByaXZhdGUgb25Wb2x1bWVDaGFuZ2UoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgdmlkZW9FbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxNZWRpYUVsZW1lbnQ7XG4gICAgdGhpcy51cGRhdGVBdWRpb0ljb24odmlkZW9FbGVtZW50Lm11dGVkKTtcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIExvdmVMZXR0ZXJzIHtcbiAgbG92ZUxldHRlcnNSb290OiBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb3ZlTGV0dGVyc1Jvb3QgPSBudWxsO1xuICB9XG5cbiAgYWRkTGV0dGVyKGxldHRlcjogc3RyaW5nLCBsaXN0TGVuZ3RoOiBudW1iZXIpIHtcbiAgICBjb25zdCBsZXR0ZXJzQmxvY2sgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2xldHRlcnMtd3JhcHBlclwiKTtcblxuICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwicFwiKTtcbiAgICBwLnRleHRDb250ZW50ID0gbGV0dGVyO1xuICAgIHA/LmNsYXNzTGlzdD8uYWRkKFwibGV0dGVyLWFuaW1hdGlvblwiLCBcImxldHRlci1hbmltYXRpb24tZW50ZXJcIik7XG5cbiAgICBpZiAobGV0dGVyc0Jsb2NrKSB7XG4gICAgICBsZXR0ZXJzQmxvY2suYXBwZW5kQ2hpbGQocCk7XG4gICAgICB0aGlzLnVwZGF0ZU9wYWNpdHkobGlzdExlbmd0aCk7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBwPy5jbGFzc0xpc3Q/LnJlbW92ZShcImxldHRlci1hbmltYXRpb24tZW50ZXJcIik7XG4gICAgICBwPy5hZGRFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVkXCIsICgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVPcGFjaXR5KGxpc3RMZW5ndGgpO1xuICAgICAgfSk7XG4gICAgfSwgMTAwMCk7XG4gIH1cblxuICB1cGRhdGVPcGFjaXR5KGxpc3RMZW5ndGg6IG51bWJlcikge1xuICAgIGNvbnN0IGxldHRlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiI2xldHRlcnMtYmxvY2sgcFwiKTtcbiAgICBjb25zdCBtYXhPcGFjaXR5ID0gMC42O1xuICAgIGNvbnN0IG1pbk9wYWNpdHkgPSAwO1xuICAgIGNvbnN0IG11bHRpcGx5Q29lZmljaWVudCA9IDEuMiAvIGxldHRlcnMubGVuZ3RoO1xuXG4gICAgbGV0dGVycy5mb3JFYWNoKChsZXR0ZXIsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBodG1sTGV0dGVyID0gbGV0dGVyIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgcmV2ZXJzZUluZGV4ID0gbGV0dGVycy5sZW5ndGggLSAxIC0gaW5kZXg7XG4gICAgICBjb25zdCBvcGFjaXR5ID0gbWF4T3BhY2l0eSAtIHJldmVyc2VJbmRleCAqIG11bHRpcGx5Q29lZmljaWVudCAqIChtYXhPcGFjaXR5IC0gbWluT3BhY2l0eSk7XG4gICAgICBpZiAobGlzdExlbmd0aCAhPT0gaW5kZXggKyAxKSB7XG4gICAgICAgIGh0bWxMZXR0ZXIuc3R5bGUub3BhY2l0eSA9IE1hdGgubWF4KG1pbk9wYWNpdHksIG9wYWNpdHkpLnRvU3RyaW5nKCk7XG4gICAgICAgIGh0bWxMZXR0ZXI/LmNsYXNzTGlzdD8uYWRkKFwibGV0dGVyLWFuaW1hdGlvbi1leGl0XCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaHRtbExldHRlci5zdHlsZS5vcGFjaXR5ID0gXCIxXCI7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEZsYWdzIH0gZnJvbSBcIkBlcGljZ2FtZXMtcHMvbGliLXBpeGVsc3RyZWFtaW5nZnJvbnRlbmQtdWU1LjVcIjtcbmltcG9ydCB7IEFyY3dhcmVQaXhlbFN0cmVhbWluZyB9IGZyb20gXCIuLi8uLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcbmltcG9ydCB7IE1pY0ljb24gfSBmcm9tIFwiLi4vTWljSWNvblwiO1xuXG5leHBvcnQgY2xhc3MgTWljQnV0dG9uIHtcbiAgcHJpdmF0ZSBidXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xuICBwcml2YXRlIHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nO1xuICBwcml2YXRlIG1pY0ljb246IE1pY0ljb247XG4gIHByaXZhdGUgdG9vbHRpcFRleHQ6IEhUTUxFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5zZXRNaWNNdXRlZEJ5RGVmYXVsdCgpO1xuICAgIHRoaXMuYnV0dG9uID0gdGhpcy5jcmVhdGVCdXR0b24oKTtcbiAgICB0aGlzLm1pY0ljb24gPSBuZXcgTWljSWNvbigpO1xuICAgIHRoaXMudG9vbHRpcFRleHQgPSB0aGlzLmNyZWF0ZVRvb2x0aXBUZXh0KCk7XG4gICAgdGhpcy5idXR0b24uYXBwZW5kQ2hpbGQodGhpcy50b29sdGlwVGV4dCk7XG4gICAgdGhpcy5idXR0b24uYXBwZW5kQ2hpbGQodGhpcy5taWNJY29uLm1pY0ljb25NdXRlZCk7XG4gICAgdGhpcy5idXR0b24uYXBwZW5kQ2hpbGQodGhpcy5taWNJY29uLm1pY0ljb25Vbm11dGVkKTtcbiAgICB0aGlzLm1pY0ljb24ubWljSWNvblVubXV0ZWQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgIHRoaXMuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLnRvZ2dsZU1pYy5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TWljTXV0ZWRCeURlZmF1bHQoKTogdm9pZCB7XG4gICAgY29uc3QgdmlkZW9FbGVtZW50UGFyZW50ID0gdGhpcy5zdHJlYW0udmlkZW9FbGVtZW50UGFyZW50O1xuICAgIGlmICh2aWRlb0VsZW1lbnRQYXJlbnQpIHtcbiAgICAgIGNvbnN0IHZpZGVvRWxlbWVudCA9IHZpZGVvRWxlbWVudFBhcmVudC5xdWVyeVNlbGVjdG9yKFwidmlkZW9cIik7XG4gICAgICBpZiAodmlkZW9FbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc3RyZWFtLnRvZ2dsZU1pYyhmYWxzZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCdXR0b24oKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgYnV0dG9uLnNldEF0dHJpYnV0ZShcImlkXCIsIFwibWljQnRuXCIpO1xuICAgIGJ1dHRvbi5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgIGJ1dHRvbj8uY2xhc3NMaXN0Py5hZGQoXCJVaVRvb2xcIik7XG4gICAgcmV0dXJuIGJ1dHRvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVG9vbHRpcFRleHQoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IHRvb2x0aXBUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgdG9vbHRpcFRleHQ/LmNsYXNzTGlzdD8uYWRkKFwidG9vbHRpcHRleHRcIik7XG4gICAgdG9vbHRpcFRleHQuaW5uZXJIVE1MID0gXCJNaWMgb24vb2ZmXCI7XG4gICAgcmV0dXJuIHRvb2x0aXBUZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVNaWMoKTogdm9pZCB7XG4gICAgY29uc3QgbWljRmxhZyA9IHRoaXM/LnN0cmVhbT8uY29uZmlnPy5pc0ZsYWdFbmFibGVkKEZsYWdzLlVzZU1pYyk7XG4gICAgdGhpcy5zdHJlYW0udG9nZ2xlTWljKCFtaWNGbGFnLCBmYWxzZSk7XG4gICAgdGhpcy51cGRhdGVNaWNJY29uKCFtaWNGbGFnKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTWljSWNvbihtaWNBY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIW1pY0FjdGl2ZSkge1xuICAgICAgdGhpcy5taWNJY29uLm1pY0ljb25Vbm11dGVkLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIHRoaXMubWljSWNvbi5taWNJY29uTXV0ZWQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5taWNJY29uLm1pY0ljb25NdXRlZC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICB0aGlzLm1pY0ljb24ubWljSWNvblVubXV0ZWQuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVsZW1lbnQoKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmJ1dHRvbjtcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIE1pY0ljb24ge1xuICBwdWJsaWMgbWljSWNvblVubXV0ZWQ6IFNWR0VsZW1lbnQ7XG4gIHB1YmxpYyBtaWNJY29uTXV0ZWQ6IFNWR0VsZW1lbnQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5taWNJY29uVW5tdXRlZCA9IHRoaXMuY3JlYXRlTWljSWNvblVubXV0ZWQoKTtcbiAgICB0aGlzLm1pY0ljb25NdXRlZCA9IHRoaXMuY3JlYXRlTWljSWNvbk11dGVkKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pY0ljb25Vbm11dGVkKCk6IFNWR0VsZW1lbnQge1xuICAgIGNvbnN0IG1pY0ljb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInN2Z1wiKTtcbiAgICBtaWNJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgXCJtaWNJY29uVW5tdXRlZFwiKTtcbiAgICBtaWNJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIjI0cHhcIik7XG4gICAgbWljSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInlcIiwgXCIyNHB4XCIpO1xuICAgIG1pY0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ2aWV3Qm94XCIsIFwiMCAtMSAyNCAyNFwiKTtcblxuICAgIGNvbnN0IHN2Z0dyb3VwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJnXCIpO1xuICAgIHN2Z0dyb3VwPy5jbGFzc0xpc3Q/LmFkZChcInN2Z0ljb25cIik7XG4gICAgbWljSWNvbi5hcHBlbmRDaGlsZChzdmdHcm91cCk7XG5cbiAgICBjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwicGF0aFwiKTtcbiAgICBwYXRoMS5zZXRBdHRyaWJ1dGVOUyhcbiAgICAgIG51bGwsXG4gICAgICBcImRcIixcbiAgICAgIFwiTTEyIDE0YzEuNjYsMCwyLjk5LTEuMzQsMi45OS0zTDE1LDVjMC0xLjY2LTEuMzQtMy0zLTNTOSwzLjM0LDksNXY2YzAsMS42NiwxLjM0LDMsMywzem01LjMtM2MwLDMtMi41NCw1LjEtNS4zLDUuMVM2LjcsMTQsNi43LDExSDVjMCwzLjQxLDIuNzIsNi4yMyw2LDYuNzJWMjFoMnYtMy4yOGMzLjI4LS40OCw2LTMuMyw2LTYuNzJoLTEuN3pcIlxuICAgICk7XG4gICAgc3ZnR3JvdXAuYXBwZW5kQ2hpbGQocGF0aDEpO1xuXG4gICAgcmV0dXJuIG1pY0ljb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1pY0ljb25NdXRlZCgpOiBTVkdFbGVtZW50IHtcbiAgICBjb25zdCBtaWNJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJzdmdcIik7XG4gICAgbWljSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImlkXCIsIFwibWljSWNvbk11dGVkXCIpO1xuICAgIG1pY0ljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ4XCIsIFwiMjRweFwiKTtcbiAgICBtaWNJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjI0cHhcIik7XG4gICAgbWljSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInZpZXdCb3hcIiwgXCIwIC0xIDI0IDI0XCIpO1xuXG4gICAgY29uc3Qgc3ZnR3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gICAgc3ZnR3JvdXA/LmNsYXNzTGlzdD8uYWRkKFwic3ZnSWNvblwiKTtcbiAgICBtaWNJY29uLmFwcGVuZENoaWxkKHN2Z0dyb3VwKTtcblxuICAgIGNvbnN0IHBhdGgxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJwYXRoXCIpO1xuICAgIHBhdGgxLnNldEF0dHJpYnV0ZU5TKFxuICAgICAgbnVsbCxcbiAgICAgIFwiZFwiLFxuICAgICAgXCJNMTksMTFoLTEuN2MwLC43NC0uMTYsMS40My0uNDMsMi4wNWwxLjIzLDEuMjNjLjU2LS45OC45LTIuMDkuOS0zLjI4em0tNC4wMi4xN2MwLS4wNi4wMi0uMTEuMDItLjE3VjVjMC0xLjY2LTEuMzQtMy0zLTNTOSwzLjM0LDksNXYuMThsNS45OCw1Ljk5ek00LjI3LDMsMyw0LjI3bDYuMDEsNi4wMVYxMWMwLDEuNjYsMS4zMywzLDIuOTksMywuMjIsMCwuNDQtLjAzLjY1LS4wOGwxLjY2LDEuNjZjLS43MS4zMy0xLjUuNTItMi4zMS41Mi0yLjc2LDAtNS4zLTIuMS01LjMtNS4xSDVjMCwzLjQxLDIuNzIsNi4yMyw2LDYuNzJWMjFoMnYtMy4yOGMuOTEtLjEzLDEuNzctLjQ1LDIuNTQtLjlMMTkuNzMsMjEsMjEsMTkuNzMsNC4yNywzelwiXG4gICAgKTtcblxuICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgxKTtcblxuICAgIHJldHVybiBtaWNJY29uO1xuICB9XG59XG4iLCJpbXBvcnQgeyBNaWNJY29uIH0gZnJvbSBcIi4uL01pY0ljb25cIjtcbmltcG9ydCB7IEFyY3dhcmVQaXhlbFN0cmVhbWluZyB9IGZyb20gXCIuLi8uLi9BcmN3YXJlUGl4ZWxTdHJlYW1pbmdcIjtcblxuZXhwb3J0IGNsYXNzIE1pY3JvcGhvbmVPdmVybGF5IHtcbiAgcHJpdmF0ZSBvdmVybGF5OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgcHJpdmF0ZSBtaWNJY29uOiBNaWNJY29uO1xuICBwcml2YXRlIHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nKSB7XG4gICAgdGhpcy5zdHJlYW0gPSBzdHJlYW07XG4gICAgdGhpcy5taWNJY29uID0gbmV3IE1pY0ljb24oKTtcbiAgICB0aGlzLnBhcmVudEVsZW1lbnQgPSBzdHJlYW0/LnZpZGVvRWxlbWVudFBhcmVudDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVPdmVybGF5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIGlmICh0aGlzLm92ZXJsYXkpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMub3ZlcmxheSk7XG4gICAgICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgb3ZlcmxheSBlbGVtZW50XG4gICAgICB0aGlzLm92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgdGhpcy5vdmVybGF5LmlkID0gXCJtaWNyb3Bob25lT3ZlcmxheVwiO1xuICAgICAgdGhpcy5vdmVybGF5Py5jbGFzc0xpc3Q/LmFkZChcImhpZGRlblN0YXRlXCIpO1xuXG4gICAgICAvLyBBcHBlbmQgdGhlIGljb25zIHRvIHRoZSBvdmVybGF5XG4gICAgICB0aGlzLm92ZXJsYXkuYXBwZW5kQ2hpbGQodGhpcy5taWNJY29uLm1pY0ljb25Vbm11dGVkKTtcbiAgICAgIHRoaXMub3ZlcmxheS5hcHBlbmRDaGlsZCh0aGlzLm1pY0ljb24ubWljSWNvbk11dGVkKTtcbiAgICAgIHRoaXMubWljSWNvbi5taWNJY29uTXV0ZWQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHRpdGxlIGRpdiBlbGVtZW50XG4gICAgICBjb25zdCB0aXRsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICB0aXRsZURpdi5jbGFzc05hbWUgPSBcInRpdGxlXCI7XG4gICAgICB0aXRsZURpdi50ZXh0Q29udGVudCA9IFwiRW5hYmxpbmcgbWljcm9waG9uZS4uLlwiOyAvLyBEZWZhdWx0IHRleHRcblxuICAgICAgLy8gQ3JlYXRlIHRoZSBwYXJhZ3JhcGggZWxlbWVudFxuICAgICAgY29uc3QgcGFyYWdyYXBoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7XG4gICAgICBwYXJhZ3JhcGgudGV4dENvbnRlbnQgPVxuICAgICAgICBcIlBsZWFzZSBjaGVjayB5b3VyIGJyb3dzZXIncyBwcm9tcHQgdG8gYWxsb3cgbWljcm9waG9uZSBhY2Nlc3MuIFlvdSBtYXkgYWxzbyBuZWVkIHRvIHJlLWVuYWJsZSB0aGUgc291bmQuXCI7IC8vIERlZmF1bHQgdGV4dFxuXG4gICAgICAvLyBBcHBlbmQgdGhlIHRpdGxlIGFuZCBwYXJhZ3JhcGggdG8gdGhlIG92ZXJsYXlcbiAgICAgIHRoaXMub3ZlcmxheS5hcHBlbmRDaGlsZCh0aXRsZURpdik7XG4gICAgICB0aGlzLm92ZXJsYXkuYXBwZW5kQ2hpbGQocGFyYWdyYXBoKTtcblxuICAgICAgLy8gQXBwZW5kIHRoZSBvdmVybGF5IHRvIHRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMub3ZlcmxheSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvZ2dsZU1lc3NhZ2UoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIGlmICh0aGlzLm92ZXJsYXkpIHtcbiAgICAgICAgLy8gRmluZCB0aGUgdGl0bGUgYW5kIHBhcmFncmFwaCBlbGVtZW50c1xuICAgICAgICBjb25zdCB0aXRsZUVsZW1lbnQgPSB0aGlzLm92ZXJsYXkucXVlcnlTZWxlY3RvcihcIi50aXRsZVwiKTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoRWxlbWVudCA9IHRoaXMub3ZlcmxheS5xdWVyeVNlbGVjdG9yKFwicFwiKTtcblxuICAgICAgICB0aGlzLm1pY0ljb24ubWljSWNvbk11dGVkLnN0eWxlLmRpc3BsYXkgPSBlbmFibGVkID8gXCJub25lXCIgOiBcImJsb2NrXCI7XG4gICAgICAgIHRoaXMubWljSWNvbi5taWNJY29uVW5tdXRlZC5zdHlsZS5kaXNwbGF5ID0gZW5hYmxlZCA/IFwiYmxvY2tcIiA6IFwibm9uZVwiO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgdGl0bGUgYW5kIHBhcmFncmFwaCB0ZXh0XG4gICAgICAgIGlmICh0aXRsZUVsZW1lbnQpIHRpdGxlRWxlbWVudC50ZXh0Q29udGVudCA9IGVuYWJsZWQgPyBcIkVuYWJsaW5nIG1pY3JvcGhvbmVcIiA6IFwiRGlzYWJsaW5nIG1pY3JvcGhvbmVcIjtcbiAgICAgICAgaWYgKHBhcmFncmFwaEVsZW1lbnQpXG4gICAgICAgICAgcGFyYWdyYXBoRWxlbWVudC50ZXh0Q29udGVudCA9IGVuYWJsZWRcbiAgICAgICAgICAgID8gXCJQbGVhc2UgY2hlY2sgeW91ciBicm93c2VyJ3MgcHJvbXB0IHRvIGFsbG93IG1pY3JvcGhvbmUgYWNjZXNzLiBZb3UgbWF5IGFsc28gbmVlZCB0byByZS1lbmFibGUgdGhlIHNvdW5kLlwiXG4gICAgICAgICAgICA6IFwiUGxlYXNlIHdhaXQuIFlvdSBtYXkgbmVlZCB0byByZS1lbmFibGUgdGhlIHNvdW5kLlwiO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVWaXNpYmlsaXR5KHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXJlbnRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbmZvT3ZlcmxheSA9IHRoaXM/LnBhcmVudEVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIjaW5mb092ZXJsYXlcIik7XG4gICAgICBjb25zdCBkaXNjb25uZWN0T3ZlcmxheSA9IHRoaXM/LnBhcmVudEVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXCIjZGlzY29ubmVjdE92ZXJsYXlcIik7XG4gICAgICBjb25zdCBlcnJvck92ZXJsYXkgPSB0aGlzPy5wYXJlbnRFbGVtZW50Py5xdWVyeVNlbGVjdG9yKFwiI2Vycm9yT3ZlcmxheVwiKTtcblxuICAgICAgY29uc3QgY2xhc3NOYW1lID0gXCJtaWMtb3ZlcmxheS1pcy12aXNpYmxlXCI7XG5cbiAgICAgIGlmICh0aGlzLm92ZXJsYXkgJiYgaW5mb092ZXJsYXkgJiYgZGlzY29ubmVjdE92ZXJsYXkgJiYgZXJyb3JPdmVybGF5KSB7XG4gICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgaW5mb092ZXJsYXk/LmNsYXNzTGlzdD8uYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgICAgZGlzY29ubmVjdE92ZXJsYXk/LmNsYXNzTGlzdD8uYWRkKGNsYXNzTmFtZSk7XG4gICAgICAgICAgZXJyb3JPdmVybGF5Py5jbGFzc0xpc3Q/LmFkZChjbGFzc05hbWUpO1xuICAgICAgICAgIHRoaXM/Lm92ZXJsYXk/LmNsYXNzTGlzdD8ucmVtb3ZlKFwiaGlkZGVuU3RhdGVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcz8ub3ZlcmxheT8uY2xhc3NMaXN0Py5hZGQoXCJoaWRkZW5TdGF0ZVwiKTtcbiAgICAgICAgICBpbmZvT3ZlcmxheT8uY2xhc3NMaXN0Py5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICAgICAgICBkaXNjb25uZWN0T3ZlcmxheT8uY2xhc3NMaXN0Py5yZW1vdmUoY2xhc3NOYW1lKTtcbiAgICAgICAgICBlcnJvck92ZXJsYXk/LmNsYXNzTGlzdD8ucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBQbGF5SWNvbiB7XG4gIHB1YmxpYyBwbGF5SWNvbjogU1ZHRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnBsYXlJY29uID0gdGhpcy5jcmVhdGVQbGF5SWNvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVQbGF5SWNvbigpOiBTVkdFbGVtZW50IHtcbiAgICBjb25zdCBwbGF5SWNvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwic3ZnXCIpO1xuICAgIHBsYXlJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwiaWRcIiwgXCJwbGF5SWNvblwiKTtcbiAgICBwbGF5SWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInhcIiwgXCIyNHB4XCIpO1xuICAgIHBsYXlJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieVwiLCBcIjI0cHhcIik7XG4gICAgcGxheUljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ2aWV3Qm94XCIsIFwiMCAwIDI0IDI0XCIpO1xuXG4gICAgY29uc3Qgc3ZnR3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gICAgc3ZnR3JvdXA/LmNsYXNzTGlzdD8uYWRkKFwic3ZnSWNvblwiKTtcbiAgICBwbGF5SWNvbi5hcHBlbmRDaGlsZChzdmdHcm91cCk7XG5cbiAgICBjb25zdCBwYXRoMSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIFwicGF0aFwiKTtcbiAgICBwYXRoMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcImRcIiwgXCJNOCA1djE0bDExLTd6XCIpO1xuICAgIHN2Z0dyb3VwLmFwcGVuZENoaWxkKHBhdGgxKTtcblxuICAgIHJldHVybiBwbGF5SWNvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQXJjd2FyZVBpeGVsU3RyZWFtaW5nIH0gZnJvbSBcIi4uLy4uL0FyY3dhcmVQaXhlbFN0cmVhbWluZ1wiO1xuaW1wb3J0IHsgU3RvcEljb24gfSBmcm9tIFwiLi4vU3RvcEljb25cIjtcbmltcG9ydCB7IFBsYXlJY29uIH0gZnJvbSBcIi4uL1BsYXlJY29uXCI7XG5cbmV4cG9ydCBjbGFzcyBTdG9wQnV0dG9uIHtcbiAgcHJpdmF0ZSBidXR0b246IEhUTUxCdXR0b25FbGVtZW50O1xuICBwcml2YXRlIHN0cmVhbTogQXJjd2FyZVBpeGVsU3RyZWFtaW5nO1xuICBwcml2YXRlIHN0b3BJY29uOiBTdG9wSWNvbjtcbiAgcHJpdmF0ZSBwbGF5SWNvbjogUGxheUljb247XG4gIHByaXZhdGUgdG9vbHRpcFRleHQ6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIGlzU3RyZWFtaW5nOiBib29sZWFuID0gdHJ1ZTsgLy8gQXNzdW1pbmcgc3RyZWFtaW5nIHN0YXJ0cyBieSBkZWZhdWx0XG5cbiAgY29uc3RydWN0b3Ioc3RyZWFtOiBBcmN3YXJlUGl4ZWxTdHJlYW1pbmcpIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgICB0aGlzLmJ1dHRvbiA9IHRoaXMuY3JlYXRlQnV0dG9uKCk7XG4gICAgdGhpcy5zdG9wSWNvbiA9IG5ldyBTdG9wSWNvbigpO1xuICAgIHRoaXMucGxheUljb24gPSBuZXcgUGxheUljb24oKTtcbiAgICB0aGlzLnRvb2x0aXBUZXh0ID0gdGhpcy5jcmVhdGVUb29sdGlwVGV4dCgpO1xuICAgIHRoaXMuYnV0dG9uLmFwcGVuZENoaWxkKHRoaXMudG9vbHRpcFRleHQpO1xuICAgIHRoaXMuYnV0dG9uLmFwcGVuZENoaWxkKHRoaXMuc3RvcEljb24uc3RvcEljb24pO1xuICAgIHRoaXMuYnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLnRvZ2dsZVN0cmVhbWluZy5iaW5kKHRoaXMpKTtcbiAgICBzdHJlYW0ub25TdHJlYW1pbmdTdGF0ZUNoYW5nZSh0aGlzLnVwZGF0ZUJ1dHRvblN0YXRlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCdXR0b24oKTogSFRNTEJ1dHRvbkVsZW1lbnQge1xuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgYnV0dG9uPy5zZXRBdHRyaWJ1dGUoXCJpZFwiLCBcInN0b3BCdG5cIik7XG4gICAgYnV0dG9uPy5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiYnV0dG9uXCIpO1xuICAgIGJ1dHRvbj8uY2xhc3NMaXN0Py5hZGQoXCJVaVRvb2xcIik7XG4gICAgcmV0dXJuIGJ1dHRvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVG9vbHRpcFRleHQoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IHRvb2x0aXBUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gICAgdG9vbHRpcFRleHQ/LmNsYXNzTGlzdD8uYWRkKFwidG9vbHRpcHRleHRcIik7XG4gICAgdG9vbHRpcFRleHQuaW5uZXJIVE1MID0gXCJEaXNjb25uZWN0XCI7XG4gICAgcmV0dXJuIHRvb2x0aXBUZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVTdHJlYW1pbmcoKTogdm9pZCB7XG4gICAgdGhpcy5pc1N0cmVhbWluZyA9ICF0aGlzLmlzU3RyZWFtaW5nO1xuICAgIHRoaXMudXBkYXRlQnV0dG9uSWNvbigpO1xuICAgIGlmICh0aGlzLmlzU3RyZWFtaW5nKSB7XG4gICAgICB0aGlzLnN0cmVhbS5yZWNvbm5lY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdHJlYW0uZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQnV0dG9uSWNvbigpOiB2b2lkIHtcbiAgICAvLyBEZXRlcm1pbmUgd2hpY2ggaWNvbiArIHRvb2x0aXAgc2hvdWxkIGJlIGN1cnJlbnRseSBkaXNwbGF5ZWRcbiAgICBjb25zdCBjdXJyZW50SWNvbiA9IHRoaXMuaXNTdHJlYW1pbmcgPyB0aGlzLnN0b3BJY29uLnN0b3BJY29uIDogdGhpcy5wbGF5SWNvbi5wbGF5SWNvbjtcbiAgICBjb25zdCBjdXJyZW50VG9vbHRpcFRleHQgPSB0aGlzLmlzU3RyZWFtaW5nID8gXCJEaXNjb25uZWN0XCIgOiBcIlJlY29ubmVjdFwiO1xuXG4gICAgLy8gVXBkYXRlIHRvb2x0aXAgdGV4dFxuICAgIHRoaXMudG9vbHRpcFRleHQuaW5uZXJIVE1MID0gY3VycmVudFRvb2x0aXBUZXh0O1xuICAgIC8vIFJlbW92ZSB0aGUgZmlyc3QgY2hpbGQgaWYgaXQgZXhpc3RzXG4gICAgaWYgKHRoaXMuYnV0dG9uLmZpcnN0Q2hpbGQpIHtcbiAgICAgIHRoaXMuYnV0dG9uLnJlbW92ZUNoaWxkKHRoaXMuYnV0dG9uLmNoaWxkcmVuWzFdKTtcbiAgICB9XG4gICAgLy8gQXBwZW5kIHRoZSBuZXcgaWNvblxuICAgIHRoaXMuYnV0dG9uLmFwcGVuZENoaWxkKGN1cnJlbnRJY29uKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZWxlbWVudCgpOiBIVE1MQnV0dG9uRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuYnV0dG9uO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVCdXR0b25TdGF0ZShpc1N0cmVhbWluZzogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNTdHJlYW1pbmcgPSBpc1N0cmVhbWluZztcbiAgICB0aGlzLnVwZGF0ZUJ1dHRvbkljb24oKTtcbiAgfVxufVxuIiwiZXhwb3J0IGNsYXNzIFN0b3BJY29uIHtcbiAgcHVibGljIHN0b3BJY29uOiBTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3RvcEljb24gPSB0aGlzLmNyZWF0ZVN0b3BJY29uKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVN0b3BJY29uKCk6IFNWR0VsZW1lbnQge1xuICAgIGNvbnN0IHN0b3BJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgXCJzdmdcIik7XG4gICAgc3RvcEljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJpZFwiLCBcInN0b3BJY29uXCIpO1xuICAgIHN0b3BJY29uLnNldEF0dHJpYnV0ZU5TKG51bGwsIFwieFwiLCBcIjI0cHhcIik7XG4gICAgc3RvcEljb24uc2V0QXR0cmlidXRlTlMobnVsbCwgXCJ5XCIsIFwiMjRweFwiKTtcbiAgICBzdG9wSWNvbi5zZXRBdHRyaWJ1dGVOUyhudWxsLCBcInZpZXdCb3hcIiwgXCIwIC0xIDI0IDI0XCIpO1xuXG4gICAgY29uc3Qgc3ZnR3JvdXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcImdcIik7XG4gICAgc3ZnR3JvdXA/LmNsYXNzTGlzdD8uYWRkKFwic3ZnSWNvblwiKTtcbiAgICBzdG9wSWNvbj8uYXBwZW5kQ2hpbGQoc3ZnR3JvdXApO1xuXG4gICAgY29uc3QgcGF0aDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCBcInBhdGhcIik7XG4gICAgcGF0aDEuc2V0QXR0cmlidXRlTlMobnVsbCwgXCJkXCIsIFwiTTYgNmgxMnYxMkg2elwiKTtcbiAgICBzdmdHcm91cC5hcHBlbmRDaGlsZChwYXRoMSk7XG5cbiAgICByZXR1cm4gc3RvcEljb247XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL2xpYlwiO1xuIiwiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuZXhwb3J0IGNvbnN0IFpFcnJvck1lc3NhZ2UgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcImVycm9yXCIpLFxuICBjb2RlOiB6Lm51bWJlcigpLmludCgpLFxuICByZWFzb246IHouc3RyaW5nKCksXG4gIHZlcmJvc2l0eTogei5udW1iZXIoKSxcbn0pO1xuZXhwb3J0IHR5cGUgRXJyb3JNZXNzYWdlID0gei5pbmZlcjx0eXBlb2YgWkVycm9yTWVzc2FnZT47XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5leHBvcnQgY29uc3QgWkxvdmVMZXR0ZXIgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcImxldHRlclwiKSxcbiAgcmVhc29uOiB6LnN0cmluZygpLnN0YXJ0c1dpdGgoXCJMTDogXCIpLFxuICBjb2RlOiB6Lm51bWJlcigpLFxuICB2ZXJib3NpdHk6IHoubnVtYmVyKCksXG59KTtcbmV4cG9ydCB0eXBlIExvdmVMZXR0ZXIgPSB6LmluZmVyPHR5cGVvZiBaTG92ZUxldHRlcj47XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5leHBvcnQgY29uc3QgWlBpbmcgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInBpbmdcIiksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdGltZTogei5udW1iZXIoKVxufSk7XG5leHBvcnQgdHlwZSBQaW5nID0gei5pbmZlcjx0eXBlb2YgWlBpbmc+O1xuIiwiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuZXhwb3J0IGNvbnN0IFpRdWV1ZSA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5saXRlcmFsKFwicXVldWVcIiksXG4gIHF1ZXVlOiB6Lm9iamVjdCh7XG4gICAgLyoqIFRpY2tldC5faWQgLSB3aWxsIG5vdCBiZSBleHBvc2VkIHRvIGZyb250ZW5kLiAqL1xuICAgIC8vIF9pZDogei5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgLyoqIFBvc2l0aW9uIGluIHF1ZXVlICh6ZXJvIGJhc2VkKS4gKi9cbiAgICBpbmRleDogei5udW1iZXIoKS5pbnQoKS5vcHRpb25hbCgpLFxuICAgIC8qKiBMZW5ndGggb2YgdGhlIHF1ZXVlLiAqL1xuICAgIHF1ZXVlTGVuZ3RoOiB6Lm51bWJlcigpLmludCgpLm9wdGlvbmFsKCksXG4gICAgLyoqIEFscmVhZHkgd2FpdGVkIGZvci4gKi9cbiAgICB3YWl0ZWQ6IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICAvKiogQmFzZWQgb24gQXZlcmFnZSBXYXRjaCBUaW1lLFxuICAgICAqIHdlIGNhbGN1bGF0ZSBhbiBhdmVyYWdlIGludGVydmFsIG9mIGV4cGVjdGVkIGNvbm5lY3Rpb24gY2xvc2luZ3MgYW5kIGJhc2VkIG9uIHRoZSBhbW91bnQgb2YgY29uY3VycmVudCBzZXNzaW9ucyxcbiAgICAgKiB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBlc3RpbWF0ZWQgdGltZSB1bnRpbCBhbm90aGVyIHNsb3Qgd2lsbCBiZSBmcmVlZCB1cC4gKi9cbiAgICBlc3RpbWF0ZWRXYWl0VGltZTogei5udW1iZXIoKS5vcHRpb25hbCgpLm51bGxhYmxlKCksXG4gICAgLyoqIFRoZSBhdmVyYWdlIHRpbWUgYWxsIGN1cnJlbnQgc2Vzc2lvbnMuXG4gICAgICogKEhvdyBsb25nIGRpZCBpdCBhY3R1YWxseSB0YWtlIHRob3NlIHRoYXQgd2FpdGVkIGZvciB0aGVtIHRoYXQgcmVjZWl2ZWQgYSBjb25uZWN0aW9uIHRvIHRoZSBjdXJyZW50bHkgcnVubmluZyBpbnN0YW5jZXMuKVxuICAgICAqL1xuICAgIGF2ZXJhZ2VXYWl0VGltZTogei5udW1iZXIoKS5vcHRpb25hbCgpLm51bGxhYmxlKCksXG4gICAgLyoqIFR5cGUgb2YgYWxsIHRpbWUtdmFsdWVzIGluIHRoZSBxdWUuICovXG4gICAgdmFsdWVUeXBlOiB6LmVudW0oW1wibWlsbGlzZWNvbmRzXCIsIFwic2Vjb25kc1wiLCBcIm1pbnV0ZXNcIiwgXCJob3Vyc1wiLCBcImRheXNcIl0pLFxuICB9KSxcbn0pO1xuZXhwb3J0IHR5cGUgUXVldWUgPSB6LmluZmVyPHR5cGVvZiBaUXVldWU+O1xuIiwiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuZXhwb3J0IGNvbnN0IFpTZXNzaW9uSWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInNlc3Npb25JZFwiKSxcbiAgc2Vzc2lvbklkOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgdHlwZSBTZXNzaW9uSWQgPSB6LmluZmVyPHR5cGVvZiBaU2Vzc2lvbklkPjtcbiIsImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBBZ2dyZWdhdGVkU3RhdHMgfSBmcm9tIFwiQGVwaWNnYW1lcy1wcy9saWItcGl4ZWxzdHJlYW1pbmdmcm9udGVuZC11ZTUuNVwiO1xuXG5leHBvcnQgY29uc3QgWlN0YXRzID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoXCJzdGF0c1wiKSxcbiAgc3RhdHM6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIC8qKlxuICAgICAgICogT3RoZXIga25vd24gcHJvcGVydGllcy5cbiAgICAgICAqL1xuICAgICAgY29kZWNzOiB6LmN1c3RvbTxBZ2dyZWdhdGVkU3RhdHNbXCJjb2RlY3NcIl0+KCksXG4gICAgICBjYW5kaWRhdGVQYWlyOiB6LmN1c3RvbTxBZ2dyZWdhdGVkU3RhdHNbXCJjYW5kaWRhdGVQYWlyc1wiXT4oKSxcbiAgICAgIGxvY2FsQ2FuZGlkYXRlczogei5jdXN0b208QWdncmVnYXRlZFN0YXRzW1wibG9jYWxDYW5kaWRhdGVzXCJdPigpLFxuICAgICAgcmVtb3RlQ2FuZGlkYXRlczogei5jdXN0b208QWdncmVnYXRlZFN0YXRzW1wicmVtb3RlQ2FuZGlkYXRlc1wiXT4oKSxcbiAgICAgIERhdGFDaGFubmVsU3RhdHM6IHouY3VzdG9tPEFnZ3JlZ2F0ZWRTdGF0c1tcImRhdGFjaGFubmVsU3RhdHNcIl0+KCksXG5cblxuICAgICAgLy8gUmVjZWl2ZWQgKGxhc3QpIGZvciB0aWNrZXRcbiAgICAgIGJ5dGVzUmVjZWl2ZWQ6IHoubnVtYmVyKCksXG4gICAgICAvLyBQYWNrZXRzIExvc3QgKGxhc3QpIGZvciB0aWNrZXRcbiAgICAgIHBhY2tldHNMb3N0OiB6Lm51bWJlcigpLFxuICAgICAgLy8gVmlkZW8gcmVzb2x1dGlvbjogaGlnaGVzdCBsb3dlc3QgYXZlcmFnZSAocG9ydHJhaXQpIGFuZCBoaWdoZXN0IGxvd2VzdCBhdmVyYWdlIChsYW5kc2NhcGUpIGZvciB0aWNrZXRcbiAgICAgIGZyYW1lV2lkdGg6IHoubnVtYmVyKCksXG4gICAgICAvLyBWaWRlbyByZXNvbHV0aW9uOiBoaWdoZXN0IGxvd2VzdCBhdmVyYWdlIChwb3J0cmFpdCkgYW5kIGhpZ2hlc3QgbG93ZXN0IGF2ZXJhZ2UgKGxhbmRzY2FwZSkgZm9yIHRpY2tldFxuICAgICAgZnJhbWVIZWlnaHQ6IHoubnVtYmVyKCksXG4gICAgICAvLyBGcmFtZXMgZGVjb2RlZCAoTGFzdCkgZm9yIHRpY2tldFxuICAgICAgZnJhbWVzRGVjb2RlZDogei5udW1iZXIoKSxcbiAgICAgIC8vIEZyYW1lcmF0ZSAobG93IC8gaGlnaCwgYXZnKSBmb3IgdGlja2V0XG4gICAgICBmcmFtZXNQZXJTZWNvbmQ6IHoubnVtYmVyKCksXG4gICAgICAvLyBmcmFtZXMgZHJvcHBlZCAobGFzdCkgZm9yIHRpY2tldFxuICAgICAgZnJhbWVzRHJvcHBlZDogei5udW1iZXIoKSxcbiAgICAgIC8vIFZpZGVvY29kZWMgKG9uY2UpIGZvciB0aWNrZXRcbiAgICAgIHZpZGVvQ29kZWM6IHouc3RyaW5nKCksXG4gICAgICAvLyBhdWRpb2NvZGVjIChvbmNlKSBmb3IgdGlja2V0XG4gICAgICBhdWRpb0NvZGVjOiB6LnN0cmluZygpLFxuICAgICAgLy8gYnJvd3NlciB0eXBlIGFuZCB2ZXJzaW9uIGZvciB0aWNrZXQgKGFyY3dhcmUgLyBhZGRpdGlvbilcbiAgICAgIGJyb3dzZXJJbmZvOiB6XG4gICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgIHVzZXJBZ2VudDogei5zdHJpbmcoKSxcbiAgICAgICAgICBwbGF0Zm9ybTogei5zdHJpbmcoKS5udWxsYWJsZSgpLFxuICAgICAgICAgIGxhbmd1YWdlOiB6LnN0cmluZygpLFxuICAgICAgICB9KVxuICAgICAgICAucGFzc3Rocm91Z2goKVxuICAgICAgICAucGFydGlhbCgpLFxuICAgICAgLy8gTmV0IFJUVCAobG93LCBoaWdoLCBhdmcpXG4gICAgICBjdXJyZW50UlRUOiB6Lm51bWJlcigpLFxuICAgICAgLy8gRHVyYXRpb24gKGxhc3QpXG4gICAgICBzZXNzaW9uUnVuVGltZTogei5zdHJpbmcoKSxcbiAgICAgIC8vIENvbnRyb2xzIHN0cmVhbSBpbnB1dCAoPz8pXG4gICAgICBjb250cm9sc1N0cmVhbUlucHV0OiB6LnN0cmluZygpLnJlZmluZSgoYXJnKSA9PiBhcmcgPT09IFwidHJ1ZVwiIHx8IGFyZyA9PT0gXCJmYWxzZVwiKSxcbiAgICAgIC8vIHZpZGVvIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKGxvdyAvIGhpZ2ggLyBhdmcgaWYgYXBwbGljYWJsZSlcbiAgICAgIHZpZGVvRW5jb2RlckF2Z1FQOiB6Lm51bWJlcigpLFxuICAgICAgLy8gVmlkZW8gYml0cmF0ZSAobWluIC8gbWF4IC8gYXZnKVxuICAgICAgdmlkZW9CaXRyYXRlOiB6Lm51bWJlcigpLFxuICAgICAgLy8gQXVkaW8gYml0cmF0ZSAobWluIC8gbWF4IC8gYXZnKVxuICAgICAgYXVkaW9CaXRyYXRlOiB6Lm51bWJlcigpLFxuICAgIH0pXG4gICAgLnBhc3N0aHJvdWdoKClcbiAgICAucGFydGlhbCgpLFxufSk7XG5leHBvcnQgdHlwZSBTdGF0cyA9IHouaW5mZXI8dHlwZW9mIFpTdGF0cz47XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgV2ViU2RrU2V0dGluZ3MgfSBmcm9tIFwiLi9XZWJTZGtTZXR0aW5nc1wiO1xuXG5leHBvcnQgY29uc3QgWlN0cmVhbUluZm8gPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChcInN0cmVhbUluZm9cIiksXG4gIHN0cmVhbUluZm86IHoub2JqZWN0KHtcbiAgICBndWlkOiB6LnN0cmluZygpLFxuICAgIGF1dG9QbGF5OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgIHRvdWNoQ2FwYWJsZTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICByZXNvbHV0aW9uOiB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgd2lkdGg6IHoubnVtYmVyKCkuaW50KCkubm9ubmVnYXRpdmUoKSxcbiAgICAgICAgaGVpZ2h0OiB6Lm51bWJlcigpLmludCgpLm5vbm5lZ2F0aXZlKCksXG4gICAgICAgIGR5bmFtaWM6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAgIGZpeGVkOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpXG4gICAgICB9KVxuICAgICAgLm9wdGlvbmFsKCksXG4gICAgbWV0YTogelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgIGZyaWVuZGx5TmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgICBpc1RyaWFsOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgICAgICBtb3VzZUxvY2s6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gICAgICAgIHBvd2VyZWRCeTogei5ib29sZWFuKCkub3B0aW9uYWwoKSxcbiAgICAgICAgdmVyc2lvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpXG4gICAgICB9KVxuICAgICAgLm9wdGlvbmFsKCksXG4gICAgd2ViU2RrU2V0dGluZ3M6IFdlYlNka1NldHRpbmdzLm9wdGlvbmFsKCksXG4gICAgYWZrOiB6XG4gICAgICAub2JqZWN0KFxuICAgICAgICB7XG4gICAgICAgICAgZW5hYmxlZDogei5ib29sZWFuKCkuZGVzY3JpYmUoXCJFbmFibGVzIC8gRGlzYWJsZXMgQUZLIGZ1bmN0aW9uYWxpdHkuXCIpLFxuICAgICAgICAgIHdhcm46IHpcbiAgICAgICAgICAgIC5udW1iZXIoKVxuICAgICAgICAgICAgLmludCgpXG4gICAgICAgICAgICAubm9ubmVnYXRpdmUoKVxuICAgICAgICAgICAgLmRlc2NyaWJlKFwiVGltZSBpbiBzZWNvbmRzLCBhZnRlciBsYXN0IGludGVyYWN0aW9uLCB3aGVuIHRoZSBmaXJzdCB3YXJuaW5nIHdpbGwgYmUgdHJpZ2dlcmVkLlwiKSxcbiAgICAgICAgICBlcnJvcjogelxuICAgICAgICAgICAgLm51bWJlcigpXG4gICAgICAgICAgICAuaW50KClcbiAgICAgICAgICAgIC5ub25uZWdhdGl2ZSgpXG4gICAgICAgICAgICAuZGVzY3JpYmUoXCJUaW1lIGluIHNlY29uZHMsIGFmdGVyIHdhcm4gdHJpZ2dlciwgd2hlbiBhIG1vcmUgcHVzaHkgd2FybmluZyB3aWxsIGJlIHRyaWdnZXJlZC5cIiksXG4gICAgICAgICAgYWN0aW9uOiB6XG4gICAgICAgICAgICAubnVtYmVyKClcbiAgICAgICAgICAgIC5pbnQoKVxuICAgICAgICAgICAgLm5vbm5lZ2F0aXZlKClcbiAgICAgICAgICAgIC5kZXNjcmliZShcIlRpbWUgaW4gc2Vjb25kcywgYWZ0ZXIgZXJyb3IgdHJpZ2dlciwgdGhlIGFjdHVhbCBkaXNjb25uZWN0aW9uIGFjdGlvbiB3aWxsIHRha2UgcGxhY2UuXCIpXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgIFwiQUZLIHN0YW5kcyBmb3IgJ2F3YXkgZnJvbSBrZXlib2FyZCcgYW5kIGRlc2NyaWJlcyBhIHRpbWVvdXQgYmFzZWQgb24gYWN0aXZpdHkgb2YgdGhlIGFjdHVhbCBwcm9qZWN0LiBBbGwgZXhlY3V0aW9uIG9mIHRoZXNlIHNldHRpbmdzIGFyZSBwcm9uZSB0byBmcm9udGVuZCBhbmQgdGhlcmVmb3JlIG5vIGZ1bGwgc2VjdXJpdHkgbWVhc3VyZSBmb3IgYWJ1c2UhIFRoZXNlIHNldHRpbmdzIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBzaGFyZUlkLCBidXQgd291bGQgb3ZlcndyaXRlIHRoZSBzZXR0aW5ncyBnaXZlbiB0aHJvdWdoIGZyb250ZW5kIGNvbmZpZ3VyYXRpb24uXCJcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgLm9wdGlvbmFsKClcbiAgfSlcbn0pO1xuZXhwb3J0IHR5cGUgU3RyZWFtSW5mbyA9IHouaW5mZXI8dHlwZW9mIFpTdHJlYW1JbmZvPjtcbiIsImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmV4cG9ydCBjb25zdCBaVmVyc2lvbiA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5saXRlcmFsKFwidmVyc2lvblwiKSxcbiAgdmVyc2lvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgdHlwZSBWZXJzaW9uID0gei5pbmZlcjx0eXBlb2YgWlZlcnNpb24+O1xuIiwiaW1wb3J0IHsgWm9kVHlwZSwgeiB9IGZyb20gXCJ6b2RcIjtcblxuY29uc3QgZGlzYWJsZWREaXNjbGFpbWVyID1cbiAgXCJEaXNhYmxlZDogVG8gcHVyY2hhc2UgdGhpcyBvcHRpb24sIHBsZWFzZSBjb250YWN0IG91ciBzYWxlcyBkZXBhcnRtZW50IGJ5IGNsaWNraW5nIHRoZSAnQ3JlYXRlIFN1cHBvcnQgVGlja2V0JyBidXR0b24gb24gdGhlIEhlbHAgQ2VudGVyIHBhZ2UuXCI7XG5cbmV4cG9ydCBjb25zdCBXZWJTZGtTZXR0aW5ncyA9IHpcbiAgLm9iamVjdCh7XG4gICAgY29uZjogelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgIGZ1bGxzY3JlZW5CdXR0b246IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlZmF1bHQodHJ1ZSlcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiRnVsbC1TY3JlZW4gQnV0dG9ufFwiLFxuICAgICAgICAgICAgICBcIk92ZXJyaWRlIEVuYWJsZS9EaXNhYmxlIEVuYWJsZS9EaXNhYmxlIHRoZSBmdWxsLXNjcmVlbiBidXR0b24uXCIsXG4gICAgICAgICAgICAgIFwiSW5mbzogUGxlYXNlIGJlIGF3YXJlIHRoYXQgaU9TIChpUGhvbmUgZGV2aWNlcykgZG9lcyBub3Qgc3VwcG9ydCBmdWxsLXNjcmVlbiBtb2RlLCBhbmQgYXMgYSByZXN1bHQsIHRoZSBidXR0b24gd2lsbCBub3QgYmUgZGlzcGxheWVkIG9uIHRoZXNlIGRldmljZXMuXCIsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICApXG4gICAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICAgIHN0b3BCdXR0b246IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlZmF1bHQodHJ1ZSlcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiU3RvcCBCdXR0b258XCIsXG4gICAgICAgICAgICAgIFwiT3ZlcnJpZGUgRW5hYmxlL0Rpc2FibGUgdGhlIHN0b3Agb3ZlcmxheS1idXR0b24uXCIsXG4gICAgICAgICAgICAgIFwiSW5mbzogTWFudWFsbHkgc3RvcHMgdGhlIGNvbm5lY3Rpb24uXCIsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICApXG4gICAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIERlZmF1bHQ6IGZhbHNlLCBmb3IgY2xlYW5lciBVSS5cbiAgICAgICAgYXVkaW9CdXR0b246IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBcIkF1ZGlvIEJ1dHRvbnxcIixcbiAgICAgICAgICAgICAgXCJPdmVycmlkZSBFbmFibGUvRGlzYWJsZSB0aGUgYXVkaW8gb3ZlcmxheS1idXR0b24uXCIsXG4gICAgICAgICAgICAgIFwiSW5mbzogRGlzcGxheXMgdGhlIGF1ZGlvIGJ1dHRvbiBpZiB5b3VyIFVucmVhbCBFbmdpbmUgYXBwbGljYXRpb24gaW5jbHVkZXMgYXVkaW8uXCIsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICApXG4gICAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIEV2ZW4gdGhvdWdoIGl0J3MgZGVmYXVsdGVkIHRvIGZhbHNlLCBpdCBjYW4gc3RpbGwgYmUgZW5hYmxlZCB3aGlsZSBiZWluZyBmYWxzZSBieSB1c2luZyB0aGUgXCJpXCIgcXVlcnkgcGFyYW1ldGVyOiBodHRwczovL3NvbWUtdXJsLz9pXG4gICAgICAgIGluZm9CdXR0b246IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgICAgLmRlc2NyaWJlKFtcIkluZm8gQnV0dG9ufFwiLCBcIk92ZXJyaWRlIEVuYWJsZS9EaXNhYmxlIHRoZSBpbmZvIG92ZXJsYXktYnV0dG9uLlwiXS5qb2luKFwiXFxuXCIpKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICBtaWNCdXR0b246IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBcIk1pYyBCdXR0b258XCIsXG4gICAgICAgICAgICAgIFwiT3ZlcnJpZGUgRW5hYmxlL0Rpc2FibGUgdGhlIG1pY3JvcGhvbmUgb3ZlcmxheS1idXR0b24uXCIsXG4gICAgICAgICAgICAgIFwiSW5mbzogRW5hYmxlcyB1c2VycyB0byBpbnRlcmFjdCB3aXRoIHRoZSBVbnJlYWwgRW5naW5lIGFwcGxpY2F0aW9uIHVzaW5nIGEgbWljcm9waG9uZSwgd2hpY2ggbXVzdCBiZSBtYW51YWxseSBlbmFibGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICBzZXR0aW5nc0J1dHRvbjogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgICAuZGVzY3JpYmUoW1wiU2V0dGluZ3MgQnV0dG9ufFwiLCBcIk92ZXJyaWRlIEVuYWJsZS9EaXNhYmxlIHRoZSBzZXR0aW5ncyBvdmVybGF5LWJ1dHRvbi5cIl0uam9pbihcIlxcblwiKSlcbiAgICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgICAgY29ubmVjdGlvblN0cmVuZ3RoSWNvbjogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBbXCJDb25uZWN0aW9uIFN0cmVuZ3RofFwiLCBcIk92ZXJyaWRlIEVuYWJsZS9EaXNhYmxlIHRoZSBjb25uZWN0aW9uIHN0cmVuZ3RoIG92ZXJsYXktaWNvbi5cIl0uam9pbihcIlxcblwiKVxuICAgICAgICAgIClcbiAgICAgICAgICAub3B0aW9uYWwoKSxcblxuICAgICAgICAvLyBlcnJvckhhbmRsZXI6IHphdCh6LmJvb2xlYW4oKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gbG92ZUxldHRlckhhbmRsZXI6IHphdCh6LmJvb2xlYW4oKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gbG92ZUxldHRlckxvZ2dpbmc6IHphdCh6LmJvb2xlYW4oKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gRW5hYmxlZCBieSBkZWZhdWx0LlxuICAgICAgICAvLyBjb25uZWN0aW9uSWRlbnRpZmllckxvZ2dpbmdEaXNhYmxlZDogemF0KHouYm9vbGVhbigpKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBxdWV1ZUhhbmRsZXI6IHphdCh6LmJvb2xlYW4oKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gc2Vzc2lvbklkSGFuZGxlcjogemF0KHouYm9vbGVhbigpKS5vcHRpb25hbCgpLFxuICAgICAgfSlcbiAgICAgIC5vcHRpb25hbCgpLFxuICAgIGluaXQ6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICAvLyBJbnB1dFxuICAgICAgICBLZXlib2FyZElucHV0OiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZWZhdWx0KHRydWUpXG4gICAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICBcIktleWJvYXJkIElucHV0fFwiLFxuICAgICAgICAgICAgICBcIk92ZXJyaWRlICdLZXlib2FyZElucHV0JyBwcm9wZXJ0eSBvZiB0aGUgV2ViU0RLIGludGVncmF0aW9uLlwiLFxuICAgICAgICAgICAgICBcIkluZm86IEFsbG93cyBrZXlib2FyZCBpbnB1dCBldmVudHMuXCIsXG4gICAgICAgICAgICBdLmpvaW4oXCJcXG5cIilcbiAgICAgICAgICApXG4gICAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICAgIE1vdXNlSW5wdXQ6IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlZmF1bHQodHJ1ZSlcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiTW91c2UgSW5wdXR8XCIsXG4gICAgICAgICAgICAgIFwiT3ZlcnJpZGUgJ01vdXNlSW5wdXQnIHByb3BlcnR5IG9mIHRoZSBXZWJTREsgaW50ZWdyYXRpb24uXCIsXG4gICAgICAgICAgICAgIFwiSW5mbzogQWxsb3dzIG1vdXNlIGlucHV0IGV2ZW50cy5cIixcbiAgICAgICAgICAgIF0uam9pbihcIlxcblwiKVxuICAgICAgICAgIClcbiAgICAgICAgICAub3B0aW9uYWwoKSxcbiAgICAgICAgR2FtZXBhZElucHV0OiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgXCJHYW1lIHBhZCBJbnB1dHxcIixcbiAgICAgICAgICAgICAgXCJPdmVycmlkZSAnR2FtZXBhZElucHV0JyBwcm9wZXJ0eSBvZiB0aGUgV2ViU0RLIGludGVncmF0aW9uLlwiLFxuICAgICAgICAgICAgICBcIkluZm86IEFsbG93cyBpbnB1dCBldmVudHMgZnJvbSBnYW1lcGFkIGNvbnRyb2xsZXJzLlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICBUb3VjaElucHV0OiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgXCJUb3VjaCBJbnB1dHxcIixcbiAgICAgICAgICAgICAgXCJPdmVycmlkZSAnVG91Y2hJbnB1dCcgcHJvcGVydHkgb2YgdGhlIFdlYlNESyBpbnRlZ3JhdGlvbi5cIixcbiAgICAgICAgICAgICAgXCJJbmZvOiBBbGxvd3MgdG91Y2ggZXZlbnRzIG9uIG1vYmlsZSBkZXZpY2VzIGFuZCB0YWJsZXRzLlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICBYUkNvbnRyb2xsZXJJbnB1dDogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgIFwiWFIgQ29udHJvbGxlciBJbnB1dHxcIixcbiAgICAgICAgICAgICAgXCJPdmVycmlkZSAnWFJDb250cm9sbGVySW5wdXQnIHByb3BlcnR5IG9mIHRoZSBXZWJTREsgaW50ZWdyYXRpb24uXCIsXG4gICAgICAgICAgICAgIFwiSW5mbzogQWxsb3dzIGlucHV0IGV2ZW50cyBmcm9tIFhSIGNvbnRyb2xsZXJzIGZvciB1c2Ugd2l0aCBBUiBhbmQgVlIgc2V0dXBzLlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICAvLyBVc2VNaWM6XG4gICAgICAgIC8vICAgei5ib29sZWFuKCkuZGVzY3JpYmUoW1wiVXNlTWljfFwiLCBcIk92ZXJyaWRlIHVzZSBtaWMgcHJvcGVydHkgb2YgdGhlIFdlYlNESyBpbnRlZ3JhdGlvbi5cIl0uam9pbihcIlxcblwiKSlcbiAgICAgICAgLy8gIC5vcHRpb25hbCgpLFxuXG4gICAgICAgIEZha2VNb3VzZVdpdGhUb3VjaGVzOiB6XG4gICAgICAgICAgLmJvb2xlYW4oKVxuICAgICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgXCJGYWtlIG1vdXNlIHdpdGggdG91Y2hlcyB8XCIsXG4gICAgICAgICAgICAgIFwiT3ZlcnJpZGUgJ0Zha2VNb3VzZVdpdGhUb3VjaGVzJyBwcm9wZXJ0eSBvZiB0aGUgV2ViU0RLIGludGVncmF0aW9uLiBXaGVuIGVuYWJsZWQgdGhpcyBzZXR0aW5nIHdpbGwgY29udmVydCBzaW5nbGUtZmluZ2VyIHRvdWNoIGlucHV0IHRvIG1vdXNlIGlucHV0LlwiLFxuICAgICAgICAgICAgICBcIkluZm86IFdoZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgYW5kIHRoZSB1c2VyIGlzIHZpZXdpbmcgdGhlIHN0cmVhbSBvbiBhIGRldmljZSB3aXRoIGEgdG91Y2ggc2NyZWVuIHN1Y2ggYXMgYSBzbWFydHBob25lIG9yIHRhYmxldCwgdGhpcyBzZXR0aW5nIGNhdXNlcyBzaW5nbGUtZmluZ2VyIHRvdWNoIGV2ZW50cyB0byBiZSBpbnRlcnByZXRlZCBieSB0aGUgVW5yZWFsIEVuZ2luZSBhcHBsaWNhdGlvbiBhcyBtb3VzZSBjbGlja3MgYW5kIGRyYWcgZXZlbnRzLiBFbmFibGluZyB0aGlzIHNldHRpbmcgY2FuIHByb3ZpZGUgdXNlcnMgb24gbW9iaWxlIGRldmljZXMgd2l0aCB0aGUgYWJpbGl0eSB0byBwYXJ0aWFsbHkgY29udHJvbCB5b3VyIFVucmVhbCBFbmdpbmUgYXBwbGljYXRpb24sIGV2ZW4gd2hlbiB0aGUgYXBwbGljYXRpb24ncyBpbnB1dCBjb250cm9sbGVyIGRvZXMgbm90IHNwZWNpZmljYWxseSBoYW5kbGUgdG91Y2ggaW5wdXQgZXZlbnRzLlwiLFxuICAgICAgICAgICAgXS5qb2luKFwiXFxuXCIpXG4gICAgICAgICAgKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICBGb3JjZU1vbm9BdWRpbzogelxuICAgICAgICAgIC5ib29sZWFuKClcbiAgICAgICAgICAuZGVzY3JpYmUoW1wiRm9yY2UgbW9ubyBhdWRpb3xcIiwgXCJPdmVycmlkZSAnRm9yY2VNb25vQXVkaW8nIG9mIHRoZSBXZWJTREsgaW50ZWdyYXRpb24uXCJdLmpvaW4oXCJcXG5cIikpXG4gICAgICAgICAgLm9wdGlvbmFsKCksXG4gICAgICAgIEhvdmVyaW5nTW91c2U6IHpcbiAgICAgICAgICAuYm9vbGVhbigpXG4gICAgICAgICAgLmRlc2NyaWJlKFtcIkhvdmVyaW5nIG1vdXNlfFwiLCBcIk92ZXJyaWRlICdIb3ZlcmluZ01vdXNlJyBwcm9wZXJ0eSBvZiB0aGUgV2ViU0RLIGludGVncmF0aW9uLlwiXS5qb2luKFwiXFxuXCIpKVxuICAgICAgICAgIC5vcHRpb25hbCgpLFxuICAgICAgICAvLyBNYXRjaFZpZXdwb3J0UmVzOiB6YXQoXG4gICAgICAgIC8vICAgelxuICAgICAgICAvLyAgICAgLmJvb2xlYW4oKVxuICAgICAgICAvLyAgICAgLmRlc2NyaWJlKFtcIk1hdGNoVmlld3BvcnRSZXN8XCIsIFwiT3ZlcnJpZGUgbWF0Y2ggdmlld3BvcnQgcmVzIHByb3BlcnR5IG9mIHRoZSBXZWJTREsgaW50ZWdyYXRpb24uXCJdLmpvaW4oXCJcXG5cIikpXG4gICAgICAgIC8vICkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gU3VwcHJlc3NCcm93c2VyS2V5czogemF0KFxuICAgICAgICAvLyAgIHpcbiAgICAgICAgLy8gICAgIC5ib29sZWFuKClcbiAgICAgICAgLy8gICAgIC5kZXNjcmliZShcbiAgICAgICAgLy8gICAgICAgW1wiU3VwcHJlc3NCcm93c2VyS2V5c3xcIiwgXCJPdmVycmlkZSBzdXBwcmVzcyBicm93c2VyIGtleXMgcHJvcGVydHkgb2YgdGhlIFdlYlNESyBpbnRlZ3JhdGlvbi5cIl0uam9pbihcIlxcblwiKVxuICAgICAgICAvLyAgICAgKVxuICAgICAgICAvLyApLm9wdGlvbmFsKCksXG5cbiAgICAgICAgLy8gVGhlc2UgbWFrZSBubyBzZW5zZSwgc2luY2UgdGhlIGRhdGEgZmxvd3Mgb25seSB3aXRoIHRoZSBzdHJlYW1JbmZvXG4gICAgICAgIC8vIEF1dG9Db25uZWN0OiB6YXQoXG4gICAgICAgIC8vICAgei5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSkuZGVzY3JpYmUoW1wiQXV0b0Nvbm5lY3R8XCIsIFwiVG8gYmUgZGVzY3JpYmVkLlwiXS5qb2luKFwiXFxuXCIpKVxuICAgICAgICAvLyApLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIFN0YXJ0VmlkZW9NdXRlZDogemF0KFxuICAgICAgICAvLyAgIHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSkuZGVzY3JpYmUoW1wiU3RhcnRWaWRlb011dGVkfFwiLCBcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSlcbiAgICAgICAgLy8gKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBBdXRvUGxheVZpZGVvOiB6YXQoXG4gICAgICAgIC8vICAgei5ib29sZWFuKCkuZGVmYXVsdCh0cnVlKS5kZXNjcmliZShbXCJBdXRvUGxheVZpZGVvfFwiLCBcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSlcbiAgICAgICAgLy8gKS5vcHRpb25hbCgpLFxuXG4gICAgICAgIC8vIE5vIGVmZmVjdDpcbiAgICAgICAgLy8gRm9yY2VUVVJOOiB6YXQoei5ib29sZWFuKCkuZGVzY3JpYmUoW1wiRm9yY2VUVVJOfFwiLCBcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIEFGS1RpbWVvdXQ6IHphdCh6Lm51bWJlcigpLmRlc2NyaWJlKFtcIkFGS1RpbWVvdXR8XCIsIFwiVG8gYmUgZGVzY3JpYmVkLlwiXS5qb2luKFwiXFxuXCIpKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gTWF4UVA6IHphdCh6Lm51bWJlcigpLmludCgpLm1pbigpLm1heCgpLmRlc2NyaWJlKFtcIlRvZG8gVGl0bGV8XCIsXCJUbyBiZSBkZXNjcmliZWQuXCJdLmpvaW4oXCJcXG5cIikpKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBNaW5RUDogemF0KHoubnVtYmVyKCkuaW50KCkubWluKCkubWF4KCkuZGVzY3JpYmUoW1wiVG9kbyBUaXRsZXxcIixcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIE9mZmVyVG9SZWNlaXZlOiB6YXQoei5ib29sZWFuKCkuZGVzY3JpYmUoW1wiVG9kbyBUaXRsZXxcIixcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIFByZWZlcnJlZENvZGVjOiB6YXQoei5saXRlcmFsKCkuZGVzY3JpYmUoW1wiVG9kbyBUaXRsZXxcIixcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIHByZWZlclNGVTogemF0KHouYm9vbGVhbigpLmRlc2NyaWJlKFtcIlRvZG8gVGl0bGV8XCIsXCJUbyBiZSBkZXNjcmliZWQuXCJdLmpvaW4oXCJcXG5cIikpKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBTdHJlYW1lcklkOiB6YXQoei5ib29sZWFuKCkuZGVzY3JpYmUoW1wiVG9kbyBUaXRsZXxcIixcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICAgIC8vIFRpbWVvdXRJZklkbGU6IHphdCh6LmJvb2xlYW4oKS5kZXNjcmliZShbXCJUb2RvIFRpdGxlfFwiLFwiVG8gYmUgZGVzY3JpYmVkLlwiXS5qb2luKFwiXFxuXCIpKSkub3B0aW9uYWwoKSxcblxuICAgICAgICAvLyBEb24ndCBrbm93IHdoZXRoZXIgd2Ugd2FudCB0byBoYXZlIHRoYXQgb3Igbm90LlxuICAgICAgICAvLyBDb250cm9sc1F1YWxpdHk6IHphdCh6LmJvb2xlYW4oKS5kZXNjcmliZShbXCJDb250cm9sc1F1YWxpdHl8XCIsIFwiVG8gYmUgZGVzY3JpYmVkLlwiXS5qb2luKFwiXFxuXCIpKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gV2ViUlRDRlBTOiB6YXQoei5udW1iZXIoKS5kZXNjcmliZShbXCJXZWJSVENGUFN8XCIsIFwiVG8gYmUgZGVzY3JpYmVkLlwiXS5qb2luKFwiXFxuXCIpKSkub3B0aW9uYWwoKSxcbiAgICAgICAgLy8gV2ViUlRDTWF4Qml0cmF0ZTogemF0KHoubnVtYmVyKCkuZGVzY3JpYmUoW1wiV2ViUlRDTWF4Qml0cmF0ZXxcIiwgXCJUbyBiZSBkZXNjcmliZWQuXCJdLmpvaW4oXCJcXG5cIikpKS5vcHRpb25hbCgpLFxuICAgICAgICAvLyBXZWJSVENNaW5CaXRyYXRlOiB6YXQoei5udW1iZXIoKS5kZXNjcmliZShbXCJXZWJSVENNaW5CaXRyYXRlfFwiLCBcIlRvIGJlIGRlc2NyaWJlZC5cIl0uam9pbihcIlxcblwiKSkpLm9wdGlvbmFsKCksXG4gICAgICB9KVxuICAgICAgLm9wdGlvbmFsKCksXG4gIH0pXG4gIC5zdHJpY3QoKTtcbiIsImV4cG9ydCAqIGZyb20gXCIuL0Vycm9yTWVzc2FnZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vTG92ZUxldHRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vU2Vzc2lvbklkXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9TdHJlYW1JbmZvXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9TdGF0c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vUGluZ1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vUXVldWVcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1ZlcnNpb25cIjtcbmV4cG9ydCAqIGZyb20gXCIuL1dlYlNka1NldHRpbmdzXCI7XG5cbmltcG9ydCB7IFpTdGF0cyB9IGZyb20gXCIuL1N0YXRzXCI7XG5cbmV4cG9ydCBjb25zdCBTZW5kID0ge1xuICBzdGF0czogWlN0YXRzLFxufTtcblxuZXhwb3J0IHR5cGUgU2VuZCA9IFwib25WaWRlb0luaXRpYWxpemVkXCI7XG4iLCJleHBvcnQgKiBhcyBNZXNzYWdlcyBmcm9tIFwiLi9NZXNzYWdlc1wiO1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG5Db3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi5cclxuXHJcblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxyXG5wdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuXHJcblxyXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXHJcblJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWVxyXG5BTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsXHJcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxyXG5MT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUlxyXG5PVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SXHJcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXHJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovXHJcbi8qIGdsb2JhbCBSZWZsZWN0LCBQcm9taXNlICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcclxuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxyXG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcclxuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xyXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XHJcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xyXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xyXG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnB1c2goXyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xyXG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMucHVzaChfKTtcclxuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcclxuICAgIGRvbmUgPSB0cnVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcclxuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xyXG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xyXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xyXG4gICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcclxuICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgd2hpbGUgKGcgJiYgKGcgPSAwLCBvcFswXSAmJiAoXyA9IDApKSwgXykgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fY3JlYXRlQmluZGluZyA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XHJcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xyXG4gICAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XHJcbiAgICB9XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIGRlc2MpO1xyXG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIG9bazJdID0gbVtrXTtcclxufSk7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcclxuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgcCkpIF9fY3JlYXRlQmluZGluZyhvLCBtLCBwKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fdmFsdWVzKG8pIHtcclxuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgIGlmIChvICYmIHR5cGVvZiBvLmxlbmd0aCA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHtcclxuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gXCJPYmplY3QgaXMgbm90IGl0ZXJhYmxlLlwiIDogXCJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHtcclxuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcclxuICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cclxuICAgIGZpbmFsbHkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgIH1cclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZCgpIHtcclxuICAgIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgIHJldHVybiBhcjtcclxufVxyXG5cclxuLyoqIEBkZXByZWNhdGVkICovXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5cygpIHtcclxuICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgIGZvciAodmFyIGEgPSBhcmd1bWVudHNbaV0sIGogPSAwLCBqbCA9IGEubGVuZ3RoOyBqIDwgamw7IGorKywgaysrKVxyXG4gICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgIHJldHVybiByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xyXG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICBpZiAoYXIgfHwgIShpIGluIGZyb20pKSB7XHJcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XHJcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgJ3dzIGRvZXMgbm90IHdvcmsgaW4gdGhlIGJyb3dzZXIuIEJyb3dzZXIgY2xpZW50cyBtdXN0IHVzZSB0aGUgbmF0aXZlICcgK1xuICAgICAgJ1dlYlNvY2tldCBvYmplY3QnXG4gICk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlpvZEVycm9yID0gZXhwb3J0cy5xdW90ZWxlc3NKc29uID0gZXhwb3J0cy5ab2RJc3N1ZUNvZGUgPSB2b2lkIDA7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3V0aWxcIik7XG5leHBvcnRzLlpvZElzc3VlQ29kZSA9IHV0aWxfMS51dGlsLmFycmF5VG9FbnVtKFtcbiAgICBcImludmFsaWRfdHlwZVwiLFxuICAgIFwiaW52YWxpZF9saXRlcmFsXCIsXG4gICAgXCJjdXN0b21cIixcbiAgICBcImludmFsaWRfdW5pb25cIixcbiAgICBcImludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvclwiLFxuICAgIFwiaW52YWxpZF9lbnVtX3ZhbHVlXCIsXG4gICAgXCJ1bnJlY29nbml6ZWRfa2V5c1wiLFxuICAgIFwiaW52YWxpZF9hcmd1bWVudHNcIixcbiAgICBcImludmFsaWRfcmV0dXJuX3R5cGVcIixcbiAgICBcImludmFsaWRfZGF0ZVwiLFxuICAgIFwiaW52YWxpZF9zdHJpbmdcIixcbiAgICBcInRvb19zbWFsbFwiLFxuICAgIFwidG9vX2JpZ1wiLFxuICAgIFwiaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXNcIixcbiAgICBcIm5vdF9tdWx0aXBsZV9vZlwiLFxuICAgIFwibm90X2Zpbml0ZVwiLFxuXSk7XG5jb25zdCBxdW90ZWxlc3NKc29uID0gKG9iaikgPT4ge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpO1xuICAgIHJldHVybiBqc29uLnJlcGxhY2UoL1wiKFteXCJdKylcIjovZywgXCIkMTpcIik7XG59O1xuZXhwb3J0cy5xdW90ZWxlc3NKc29uID0gcXVvdGVsZXNzSnNvbjtcbmNsYXNzIFpvZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGlzc3Vlcykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmlzc3VlcyA9IFtdO1xuICAgICAgICB0aGlzLmFkZElzc3VlID0gKHN1YikgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc3N1ZXMgPSBbLi4udGhpcy5pc3N1ZXMsIHN1Yl07XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYWRkSXNzdWVzID0gKHN1YnMgPSBbXSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc3N1ZXMgPSBbLi4udGhpcy5pc3N1ZXMsIC4uLnN1YnNdO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBhY3R1YWxQcm90byA9IG5ldy50YXJnZXQucHJvdG90eXBlO1xuICAgICAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgYmFuL2JhblxuICAgICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIGFjdHVhbFByb3RvKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX19wcm90b19fID0gYWN0dWFsUHJvdG87XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5uYW1lID0gXCJab2RFcnJvclwiO1xuICAgICAgICB0aGlzLmlzc3VlcyA9IGlzc3VlcztcbiAgICB9XG4gICAgZ2V0IGVycm9ycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNzdWVzO1xuICAgIH1cbiAgICBmb3JtYXQoX21hcHBlcikge1xuICAgICAgICBjb25zdCBtYXBwZXIgPSBfbWFwcGVyIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoaXNzdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNzdWUubWVzc2FnZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZpZWxkRXJyb3JzID0geyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICBjb25zdCBwcm9jZXNzRXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXNzdWUgb2YgZXJyb3IuaXNzdWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF91bmlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlLnVuaW9uRXJyb3JzLm1hcChwcm9jZXNzRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfcmV0dXJuX3R5cGVcIikge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3IoaXNzdWUucmV0dXJuVHlwZUVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX2FyZ3VtZW50c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcihpc3N1ZS5hcmd1bWVudHNFcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkRXJyb3JzLl9lcnJvcnMucHVzaChtYXBwZXIoaXNzdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyID0gZmllbGRFcnJvcnM7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBpc3N1ZS5wYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSBpc3N1ZS5wYXRoW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVybWluYWwgPSBpID09PSBpc3N1ZS5wYXRoLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCB7IF9lcnJvcnM6IFtdIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHR5cGVvZiBlbCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCB7IF9lcnJvcnM6IFtdIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmICh0eXBlb2YgZWwgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNvbnN0IGVycm9yQXJyYXk6IGFueSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZXJyb3JBcnJheS5fZXJyb3JzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IGVycm9yQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCB7IF9lcnJvcnM6IFtdIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0uX2Vycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnJbZWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBwcm9jZXNzRXJyb3IodGhpcyk7XG4gICAgICAgIHJldHVybiBmaWVsZEVycm9ycztcbiAgICB9XG4gICAgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lc3NhZ2U7XG4gICAgfVxuICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5pc3N1ZXMsIHV0aWxfMS51dGlsLmpzb25TdHJpbmdpZnlSZXBsYWNlciwgMik7XG4gICAgfVxuICAgIGdldCBpc0VtcHR5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc3N1ZXMubGVuZ3RoID09PSAwO1xuICAgIH1cbiAgICBmbGF0dGVuKG1hcHBlciA9IChpc3N1ZSkgPT4gaXNzdWUubWVzc2FnZSkge1xuICAgICAgICBjb25zdCBmaWVsZEVycm9ycyA9IHt9O1xuICAgICAgICBjb25zdCBmb3JtRXJyb3JzID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgc3ViIG9mIHRoaXMuaXNzdWVzKSB7XG4gICAgICAgICAgICBpZiAoc3ViLnBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXSA9IGZpZWxkRXJyb3JzW3N1Yi5wYXRoWzBdXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBmaWVsZEVycm9yc1tzdWIucGF0aFswXV0ucHVzaChtYXBwZXIoc3ViKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3JtRXJyb3JzLnB1c2gobWFwcGVyKHN1YikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGZvcm1FcnJvcnMsIGZpZWxkRXJyb3JzIH07XG4gICAgfVxuICAgIGdldCBmb3JtRXJyb3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mbGF0dGVuKCk7XG4gICAgfVxufVxuZXhwb3J0cy5ab2RFcnJvciA9IFpvZEVycm9yO1xuWm9kRXJyb3IuY3JlYXRlID0gKGlzc3VlcykgPT4ge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IFpvZEVycm9yKGlzc3Vlcyk7XG4gICAgcmV0dXJuIGVycm9yO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRFcnJvck1hcCA9IGV4cG9ydHMuc2V0RXJyb3JNYXAgPSBleHBvcnRzLmRlZmF1bHRFcnJvck1hcCA9IHZvaWQgMDtcbmNvbnN0IGVuXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIi4vbG9jYWxlcy9lblwiKSk7XG5leHBvcnRzLmRlZmF1bHRFcnJvck1hcCA9IGVuXzEuZGVmYXVsdDtcbmxldCBvdmVycmlkZUVycm9yTWFwID0gZW5fMS5kZWZhdWx0O1xuZnVuY3Rpb24gc2V0RXJyb3JNYXAobWFwKSB7XG4gICAgb3ZlcnJpZGVFcnJvck1hcCA9IG1hcDtcbn1cbmV4cG9ydHMuc2V0RXJyb3JNYXAgPSBzZXRFcnJvck1hcDtcbmZ1bmN0aW9uIGdldEVycm9yTWFwKCkge1xuICAgIHJldHVybiBvdmVycmlkZUVycm9yTWFwO1xufVxuZXhwb3J0cy5nZXRFcnJvck1hcCA9IGdldEVycm9yTWFwO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9lcnJvcnNcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL2hlbHBlcnMvcGFyc2VVdGlsXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9oZWxwZXJzL3R5cGVBbGlhc2VzXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9oZWxwZXJzL3V0aWxcIiksIGV4cG9ydHMpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3R5cGVzXCIpLCBleHBvcnRzKTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi9ab2RFcnJvclwiKSwgZXhwb3J0cyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZXJyb3JVdGlsID0gdm9pZCAwO1xudmFyIGVycm9yVXRpbDtcbihmdW5jdGlvbiAoZXJyb3JVdGlsKSB7XG4gICAgZXJyb3JVdGlsLmVyclRvT2JqID0gKG1lc3NhZ2UpID0+IHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiID8geyBtZXNzYWdlIH0gOiBtZXNzYWdlIHx8IHt9O1xuICAgIGVycm9yVXRpbC50b1N0cmluZyA9IChtZXNzYWdlKSA9PiB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/IG1lc3NhZ2UgOiBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UubWVzc2FnZTtcbn0pKGVycm9yVXRpbCA9IGV4cG9ydHMuZXJyb3JVdGlsIHx8IChleHBvcnRzLmVycm9yVXRpbCA9IHt9KSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuaXNBc3luYyA9IGV4cG9ydHMuaXNWYWxpZCA9IGV4cG9ydHMuaXNEaXJ0eSA9IGV4cG9ydHMuaXNBYm9ydGVkID0gZXhwb3J0cy5PSyA9IGV4cG9ydHMuRElSVFkgPSBleHBvcnRzLklOVkFMSUQgPSBleHBvcnRzLlBhcnNlU3RhdHVzID0gZXhwb3J0cy5hZGRJc3N1ZVRvQ29udGV4dCA9IGV4cG9ydHMuRU1QVFlfUEFUSCA9IGV4cG9ydHMubWFrZUlzc3VlID0gdm9pZCAwO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiLi4vZXJyb3JzXCIpO1xuY29uc3QgZW5fMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiLi4vbG9jYWxlcy9lblwiKSk7XG5jb25zdCBtYWtlSXNzdWUgPSAocGFyYW1zKSA9PiB7XG4gICAgY29uc3QgeyBkYXRhLCBwYXRoLCBlcnJvck1hcHMsIGlzc3VlRGF0YSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gWy4uLnBhdGgsIC4uLihpc3N1ZURhdGEucGF0aCB8fCBbXSldO1xuICAgIGNvbnN0IGZ1bGxJc3N1ZSA9IHtcbiAgICAgICAgLi4uaXNzdWVEYXRhLFxuICAgICAgICBwYXRoOiBmdWxsUGF0aCxcbiAgICB9O1xuICAgIGxldCBlcnJvck1lc3NhZ2UgPSBcIlwiO1xuICAgIGNvbnN0IG1hcHMgPSBlcnJvck1hcHNcbiAgICAgICAgLmZpbHRlcigobSkgPT4gISFtKVxuICAgICAgICAuc2xpY2UoKVxuICAgICAgICAucmV2ZXJzZSgpO1xuICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHMpIHtcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gbWFwKGZ1bGxJc3N1ZSwgeyBkYXRhLCBkZWZhdWx0RXJyb3I6IGVycm9yTWVzc2FnZSB9KS5tZXNzYWdlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5pc3N1ZURhdGEsXG4gICAgICAgIHBhdGg6IGZ1bGxQYXRoLFxuICAgICAgICBtZXNzYWdlOiBpc3N1ZURhdGEubWVzc2FnZSB8fCBlcnJvck1lc3NhZ2UsXG4gICAgfTtcbn07XG5leHBvcnRzLm1ha2VJc3N1ZSA9IG1ha2VJc3N1ZTtcbmV4cG9ydHMuRU1QVFlfUEFUSCA9IFtdO1xuZnVuY3Rpb24gYWRkSXNzdWVUb0NvbnRleHQoY3R4LCBpc3N1ZURhdGEpIHtcbiAgICBjb25zdCBpc3N1ZSA9ICgwLCBleHBvcnRzLm1ha2VJc3N1ZSkoe1xuICAgICAgICBpc3N1ZURhdGE6IGlzc3VlRGF0YSxcbiAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICBlcnJvck1hcHM6IFtcbiAgICAgICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgY3R4LnNjaGVtYUVycm9yTWFwLFxuICAgICAgICAgICAgKDAsIGVycm9yc18xLmdldEVycm9yTWFwKSgpLFxuICAgICAgICAgICAgZW5fMS5kZWZhdWx0LCAvLyB0aGVuIGdsb2JhbCBkZWZhdWx0IG1hcFxuICAgICAgICBdLmZpbHRlcigoeCkgPT4gISF4KSxcbiAgICB9KTtcbiAgICBjdHguY29tbW9uLmlzc3Vlcy5wdXNoKGlzc3VlKTtcbn1cbmV4cG9ydHMuYWRkSXNzdWVUb0NvbnRleHQgPSBhZGRJc3N1ZVRvQ29udGV4dDtcbmNsYXNzIFBhcnNlU3RhdHVzIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IFwidmFsaWRcIjtcbiAgICB9XG4gICAgZGlydHkoKSB7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlID09PSBcInZhbGlkXCIpXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJkaXJ0eVwiO1xuICAgIH1cbiAgICBhYm9ydCgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgIT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFwiYWJvcnRlZFwiO1xuICAgIH1cbiAgICBzdGF0aWMgbWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdHMpIHtcbiAgICAgICAgY29uc3QgYXJyYXlWYWx1ZSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHMgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgaWYgKHMuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5JTlZBTElEO1xuICAgICAgICAgICAgaWYgKHMuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICBhcnJheVZhbHVlLnB1c2gocy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBhcnJheVZhbHVlIH07XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBtZXJnZU9iamVjdEFzeW5jKHN0YXR1cywgcGFpcnMpIHtcbiAgICAgICAgY29uc3Qgc3luY1BhaXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgc3luY1BhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogYXdhaXQgcGFpci5rZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IGF3YWl0IHBhaXIudmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgc3luY1BhaXJzKTtcbiAgICB9XG4gICAgc3RhdGljIG1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHBhaXJzKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsT2JqZWN0ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgY29uc3QgeyBrZXksIHZhbHVlIH0gPSBwYWlyO1xuICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzLklOVkFMSUQ7XG4gICAgICAgICAgICBpZiAodmFsdWUuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5JTlZBTElEO1xuICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIGlmIChrZXkudmFsdWUgIT09IFwiX19wcm90b19fXCIgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIHZhbHVlLnZhbHVlICE9PSBcInVuZGVmaW5lZFwiIHx8IHBhaXIuYWx3YXlzU2V0KSkge1xuICAgICAgICAgICAgICAgIGZpbmFsT2JqZWN0W2tleS52YWx1ZV0gPSB2YWx1ZS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGZpbmFsT2JqZWN0IH07XG4gICAgfVxufVxuZXhwb3J0cy5QYXJzZVN0YXR1cyA9IFBhcnNlU3RhdHVzO1xuZXhwb3J0cy5JTlZBTElEID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgc3RhdHVzOiBcImFib3J0ZWRcIixcbn0pO1xuY29uc3QgRElSVFkgPSAodmFsdWUpID0+ICh7IHN0YXR1czogXCJkaXJ0eVwiLCB2YWx1ZSB9KTtcbmV4cG9ydHMuRElSVFkgPSBESVJUWTtcbmNvbnN0IE9LID0gKHZhbHVlKSA9PiAoeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWUgfSk7XG5leHBvcnRzLk9LID0gT0s7XG5jb25zdCBpc0Fib3J0ZWQgPSAoeCkgPT4geC5zdGF0dXMgPT09IFwiYWJvcnRlZFwiO1xuZXhwb3J0cy5pc0Fib3J0ZWQgPSBpc0Fib3J0ZWQ7XG5jb25zdCBpc0RpcnR5ID0gKHgpID0+IHguc3RhdHVzID09PSBcImRpcnR5XCI7XG5leHBvcnRzLmlzRGlydHkgPSBpc0RpcnR5O1xuY29uc3QgaXNWYWxpZCA9ICh4KSA9PiB4LnN0YXR1cyA9PT0gXCJ2YWxpZFwiO1xuZXhwb3J0cy5pc1ZhbGlkID0gaXNWYWxpZDtcbmNvbnN0IGlzQXN5bmMgPSAoeCkgPT4gdHlwZW9mIFByb21pc2UgIT09IFwidW5kZWZpbmVkXCIgJiYgeCBpbnN0YW5jZW9mIFByb21pc2U7XG5leHBvcnRzLmlzQXN5bmMgPSBpc0FzeW5jO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0UGFyc2VkVHlwZSA9IGV4cG9ydHMuWm9kUGFyc2VkVHlwZSA9IGV4cG9ydHMub2JqZWN0VXRpbCA9IGV4cG9ydHMudXRpbCA9IHZvaWQgMDtcbnZhciB1dGlsO1xuKGZ1bmN0aW9uICh1dGlsKSB7XG4gICAgdXRpbC5hc3NlcnRFcXVhbCA9ICh2YWwpID0+IHZhbDtcbiAgICBmdW5jdGlvbiBhc3NlcnRJcyhfYXJnKSB7IH1cbiAgICB1dGlsLmFzc2VydElzID0gYXNzZXJ0SXM7XG4gICAgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIoX3gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0TmV2ZXIgPSBhc3NlcnROZXZlcjtcbiAgICB1dGlsLmFycmF5VG9FbnVtID0gKGl0ZW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIG9ialtpdGVtXSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICAgIHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzID0gKG9iaikgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZEtleXMgPSB1dGlsLm9iamVjdEtleXMob2JqKS5maWx0ZXIoKGspID0+IHR5cGVvZiBvYmpbb2JqW2tdXSAhPT0gXCJudW1iZXJcIik7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0ge307XG4gICAgICAgIGZvciAoY29uc3QgayBvZiB2YWxpZEtleXMpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkW2tdID0gb2JqW2tdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1dGlsLm9iamVjdFZhbHVlcyhmaWx0ZXJlZCk7XG4gICAgfTtcbiAgICB1dGlsLm9iamVjdFZhbHVlcyA9IChvYmopID0+IHtcbiAgICAgICAgcmV0dXJuIHV0aWwub2JqZWN0S2V5cyhvYmopLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9ialtlXTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB1dGlsLm9iamVjdEtleXMgPSB0eXBlb2YgT2JqZWN0LmtleXMgPT09IFwiZnVuY3Rpb25cIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJhbi9iYW5cbiAgICAgICAgPyAob2JqKSA9PiBPYmplY3Qua2V5cyhvYmopIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYmFuL2JhblxuICAgICAgICA6IChvYmplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9O1xuICAgIHV0aWwuZmluZCA9IChhcnIsIGNoZWNrZXIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFycikge1xuICAgICAgICAgICAgaWYgKGNoZWNrZXIoaXRlbSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHV0aWwuaXNJbnRlZ2VyID0gdHlwZW9mIE51bWJlci5pc0ludGVnZXIgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/ICh2YWwpID0+IE51bWJlci5pc0ludGVnZXIodmFsKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJhbi9iYW5cbiAgICAgICAgOiAodmFsKSA9PiB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICYmIGlzRmluaXRlKHZhbCkgJiYgTWF0aC5mbG9vcih2YWwpID09PSB2YWw7XG4gICAgZnVuY3Rpb24gam9pblZhbHVlcyhhcnJheSwgc2VwYXJhdG9yID0gXCIgfCBcIikge1xuICAgICAgICByZXR1cm4gYXJyYXlcbiAgICAgICAgICAgIC5tYXAoKHZhbCkgPT4gKHR5cGVvZiB2YWwgPT09IFwic3RyaW5nXCIgPyBgJyR7dmFsfSdgIDogdmFsKSlcbiAgICAgICAgICAgIC5qb2luKHNlcGFyYXRvcik7XG4gICAgfVxuICAgIHV0aWwuam9pblZhbHVlcyA9IGpvaW5WYWx1ZXM7XG4gICAgdXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIgPSAoXywgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG59KSh1dGlsID0gZXhwb3J0cy51dGlsIHx8IChleHBvcnRzLnV0aWwgPSB7fSkpO1xudmFyIG9iamVjdFV0aWw7XG4oZnVuY3Rpb24gKG9iamVjdFV0aWwpIHtcbiAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzID0gKGZpcnN0LCBzZWNvbmQpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmZpcnN0LFxuICAgICAgICAgICAgLi4uc2Vjb25kLCAvLyBzZWNvbmQgb3ZlcndyaXRlcyBmaXJzdFxuICAgICAgICB9O1xuICAgIH07XG59KShvYmplY3RVdGlsID0gZXhwb3J0cy5vYmplY3RVdGlsIHx8IChleHBvcnRzLm9iamVjdFV0aWwgPSB7fSkpO1xuZXhwb3J0cy5ab2RQYXJzZWRUeXBlID0gdXRpbC5hcnJheVRvRW51bShbXG4gICAgXCJzdHJpbmdcIixcbiAgICBcIm5hblwiLFxuICAgIFwibnVtYmVyXCIsXG4gICAgXCJpbnRlZ2VyXCIsXG4gICAgXCJmbG9hdFwiLFxuICAgIFwiYm9vbGVhblwiLFxuICAgIFwiZGF0ZVwiLFxuICAgIFwiYmlnaW50XCIsXG4gICAgXCJzeW1ib2xcIixcbiAgICBcImZ1bmN0aW9uXCIsXG4gICAgXCJ1bmRlZmluZWRcIixcbiAgICBcIm51bGxcIixcbiAgICBcImFycmF5XCIsXG4gICAgXCJvYmplY3RcIixcbiAgICBcInVua25vd25cIixcbiAgICBcInByb21pc2VcIixcbiAgICBcInZvaWRcIixcbiAgICBcIm5ldmVyXCIsXG4gICAgXCJtYXBcIixcbiAgICBcInNldFwiLFxuXSk7XG5jb25zdCBnZXRQYXJzZWRUeXBlID0gKGRhdGEpID0+IHtcbiAgICBjb25zdCB0ID0gdHlwZW9mIGRhdGE7XG4gICAgc3dpdGNoICh0KSB7XG4gICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICAgIHJldHVybiBleHBvcnRzLlpvZFBhcnNlZFR5cGUudW5kZWZpbmVkO1xuICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5ab2RQYXJzZWRUeXBlLnN0cmluZztcbiAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgcmV0dXJuIGlzTmFOKGRhdGEpID8gZXhwb3J0cy5ab2RQYXJzZWRUeXBlLm5hbiA6IGV4cG9ydHMuWm9kUGFyc2VkVHlwZS5udW1iZXI7XG4gICAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5ab2RQYXJzZWRUeXBlLmJvb2xlYW47XG4gICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHMuWm9kUGFyc2VkVHlwZS5mdW5jdGlvbjtcbiAgICAgICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHMuWm9kUGFyc2VkVHlwZS5iaWdpbnQ7XG4gICAgICAgIGNhc2UgXCJzeW1ib2xcIjpcbiAgICAgICAgICAgIHJldHVybiBleHBvcnRzLlpvZFBhcnNlZFR5cGUuc3ltYm9sO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzLlpvZFBhcnNlZFR5cGUuYXJyYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0YSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzLlpvZFBhcnNlZFR5cGUubnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChkYXRhLnRoZW4gJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZGF0YS50aGVuID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICAgICAgICBkYXRhLmNhdGNoICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGRhdGEuY2F0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzLlpvZFBhcnNlZFR5cGUucHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWFwICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5ab2RQYXJzZWRUeXBlLm1hcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgU2V0ICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXhwb3J0cy5ab2RQYXJzZWRUeXBlLnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgRGF0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBleHBvcnRzLlpvZFBhcnNlZFR5cGUuZGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBleHBvcnRzLlpvZFBhcnNlZFR5cGUub2JqZWN0O1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGV4cG9ydHMuWm9kUGFyc2VkVHlwZS51bmtub3duO1xuICAgIH1cbn07XG5leHBvcnRzLmdldFBhcnNlZFR5cGUgPSBnZXRQYXJzZWRUeXBlO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXhwb3J0cywgcCkpIF9fY3JlYXRlQmluZGluZyhleHBvcnRzLCBtLCBwKTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnogPSB2b2lkIDA7XG5jb25zdCB6ID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2V4dGVybmFsXCIpKTtcbmV4cG9ydHMueiA9IHo7XG5fX2V4cG9ydFN0YXIocmVxdWlyZShcIi4vZXh0ZXJuYWxcIiksIGV4cG9ydHMpO1xuZXhwb3J0cy5kZWZhdWx0ID0gejtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgdXRpbF8xID0gcmVxdWlyZShcIi4uL2hlbHBlcnMvdXRpbFwiKTtcbmNvbnN0IFpvZEVycm9yXzEgPSByZXF1aXJlKFwiLi4vWm9kRXJyb3JcIik7XG5jb25zdCBlcnJvck1hcCA9IChpc3N1ZSwgX2N0eCkgPT4ge1xuICAgIGxldCBtZXNzYWdlO1xuICAgIHN3aXRjaCAoaXNzdWUuY29kZSkge1xuICAgICAgICBjYXNlIFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZTpcbiAgICAgICAgICAgIGlmIChpc3N1ZS5yZWNlaXZlZCA9PT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiUmVxdWlyZWRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgRXhwZWN0ZWQgJHtpc3N1ZS5leHBlY3RlZH0sIHJlY2VpdmVkICR7aXNzdWUucmVjZWl2ZWR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfbGl0ZXJhbDpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBsaXRlcmFsIHZhbHVlLCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KGlzc3VlLmV4cGVjdGVkLCB1dGlsXzEudXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIpfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS51bnJlY29nbml6ZWRfa2V5czpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgVW5yZWNvZ25pemVkIGtleShzKSBpbiBvYmplY3Q6ICR7dXRpbF8xLnV0aWwuam9pblZhbHVlcyhpc3N1ZS5rZXlzLCBcIiwgXCIpfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3VuaW9uOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcjpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBkaXNjcmltaW5hdG9yIHZhbHVlLiBFeHBlY3RlZCAke3V0aWxfMS51dGlsLmpvaW5WYWx1ZXMoaXNzdWUub3B0aW9ucyl9YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfZW51bV92YWx1ZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBlbnVtIHZhbHVlLiBFeHBlY3RlZCAke3V0aWxfMS51dGlsLmpvaW5WYWx1ZXMoaXNzdWUub3B0aW9ucyl9LCByZWNlaXZlZCAnJHtpc3N1ZS5yZWNlaXZlZH0nYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfYXJndW1lbnRzOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGZ1bmN0aW9uIGFyZ3VtZW50c2A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3JldHVybl90eXBlOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGZ1bmN0aW9uIHJldHVybiB0eXBlYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfZGF0ZTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBkYXRlYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nOlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpc3N1ZS52YWxpZGF0aW9uID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKFwiaW5jbHVkZXNcIiBpbiBpc3N1ZS52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dDogbXVzdCBpbmNsdWRlIFwiJHtpc3N1ZS52YWxpZGF0aW9uLmluY2x1ZGVzfVwiYDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpc3N1ZS52YWxpZGF0aW9uLnBvc2l0aW9uID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYCR7bWVzc2FnZX0gYXQgb25lIG9yIG1vcmUgcG9zaXRpb25zIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAke2lzc3VlLnZhbGlkYXRpb24ucG9zaXRpb259YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcInN0YXJ0c1dpdGhcIiBpbiBpc3N1ZS52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dDogbXVzdCBzdGFydCB3aXRoIFwiJHtpc3N1ZS52YWxpZGF0aW9uLnN0YXJ0c1dpdGh9XCJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChcImVuZHNXaXRoXCIgaW4gaXNzdWUudmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgaW5wdXQ6IG11c3QgZW5kIHdpdGggXCIke2lzc3VlLnZhbGlkYXRpb24uZW5kc1dpdGh9XCJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdXRpbF8xLnV0aWwuYXNzZXJ0TmV2ZXIoaXNzdWUudmFsaWRhdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudmFsaWRhdGlvbiAhPT0gXCJyZWdleFwiKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkICR7aXNzdWUudmFsaWRhdGlvbn1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiSW52YWxpZFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX3NtYWxsOlxuICAgICAgICAgICAgaWYgKGlzc3VlLnR5cGUgPT09IFwiYXJyYXlcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gXCJleGFjdGx5XCIgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbGVhc3RgIDogYG1vcmUgdGhhbmB9ICR7aXNzdWUubWluaW11bX0gZWxlbWVudChzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gXCJleGFjdGx5XCIgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgYXQgbGVhc3RgIDogYG92ZXJgfSAke2lzc3VlLm1pbmltdW19IGNoYXJhY3RlcihzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgTnVtYmVyIG11c3QgYmUgJHtpc3N1ZS5leGFjdFxuICAgICAgICAgICAgICAgICAgICA/IGBleGFjdGx5IGVxdWFsIHRvIGBcbiAgICAgICAgICAgICAgICAgICAgOiBpc3N1ZS5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBncmVhdGVyIHRoYW4gYH0ke2lzc3VlLm1pbmltdW19YDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwiZGF0ZVwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgRGF0ZSBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseSBlcXVhbCB0byBgXG4gICAgICAgICAgICAgICAgICAgIDogaXNzdWUuaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBgZ3JlYXRlciB0aGFuIGB9JHtuZXcgRGF0ZShOdW1iZXIoaXNzdWUubWluaW11bSkpfWA7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiSW52YWxpZCBpbnB1dFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX2JpZzpcbiAgICAgICAgICAgIGlmIChpc3N1ZS50eXBlID09PSBcImFycmF5XCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBBcnJheSBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IGBleGFjdGx5YCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBhdCBtb3N0YCA6IGBsZXNzIHRoYW5gfSAke2lzc3VlLm1heGltdW19IGVsZW1lbnQocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYFN0cmluZyBtdXN0IGNvbnRhaW4gJHtpc3N1ZS5leGFjdCA/IGBleGFjdGx5YCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBhdCBtb3N0YCA6IGB1bmRlcmB9ICR7aXNzdWUubWF4aW11bX0gY2hhcmFjdGVyKHMpYDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwibnVtYmVyXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBOdW1iZXIgbXVzdCBiZSAke2lzc3VlLmV4YWN0XG4gICAgICAgICAgICAgICAgICAgID8gYGV4YWN0bHlgXG4gICAgICAgICAgICAgICAgICAgIDogaXNzdWUuaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBsZXNzIHRoYW4gb3IgZXF1YWwgdG9gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBsZXNzIHRoYW5gfSAke2lzc3VlLm1heGltdW19YDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwiYmlnaW50XCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBCaWdJbnQgbXVzdCBiZSAke2lzc3VlLmV4YWN0XG4gICAgICAgICAgICAgICAgICAgID8gYGV4YWN0bHlgXG4gICAgICAgICAgICAgICAgICAgIDogaXNzdWUuaW5jbHVzaXZlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBsZXNzIHRoYW4gb3IgZXF1YWwgdG9gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBsZXNzIHRoYW5gfSAke2lzc3VlLm1heGltdW19YDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwiZGF0ZVwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgRGF0ZSBtdXN0IGJlICR7aXNzdWUuZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgPyBgZXhhY3RseWBcbiAgICAgICAgICAgICAgICAgICAgOiBpc3N1ZS5pbmNsdXNpdmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0b2BcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYHNtYWxsZXIgdGhhbmB9ICR7bmV3IERhdGUoTnVtYmVyKGlzc3VlLm1heGltdW0pKX1gO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIkludmFsaWQgaW5wdXRcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmN1c3RvbTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dGA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlczpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW50ZXJzZWN0aW9uIHJlc3VsdHMgY291bGQgbm90IGJlIG1lcmdlZGA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5ub3RfbXVsdGlwbGVfb2Y6XG4gICAgICAgICAgICBtZXNzYWdlID0gYE51bWJlciBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgJHtpc3N1ZS5tdWx0aXBsZU9mfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5ub3RfZmluaXRlOlxuICAgICAgICAgICAgbWVzc2FnZSA9IFwiTnVtYmVyIG11c3QgYmUgZmluaXRlXCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBfY3R4LmRlZmF1bHRFcnJvcjtcbiAgICAgICAgICAgIHV0aWxfMS51dGlsLmFzc2VydE5ldmVyKGlzc3VlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbWVzc2FnZSB9O1xufTtcbmV4cG9ydHMuZGVmYXVsdCA9IGVycm9yTWFwO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRhdGUgPSBleHBvcnRzLmJvb2xlYW4gPSBleHBvcnRzLmJpZ2ludCA9IGV4cG9ydHMuYXJyYXkgPSBleHBvcnRzLmFueSA9IGV4cG9ydHMuY29lcmNlID0gZXhwb3J0cy5ab2RGaXJzdFBhcnR5VHlwZUtpbmQgPSBleHBvcnRzLmxhdGUgPSBleHBvcnRzLlpvZFNjaGVtYSA9IGV4cG9ydHMuU2NoZW1hID0gZXhwb3J0cy5jdXN0b20gPSBleHBvcnRzLlpvZFJlYWRvbmx5ID0gZXhwb3J0cy5ab2RQaXBlbGluZSA9IGV4cG9ydHMuWm9kQnJhbmRlZCA9IGV4cG9ydHMuQlJBTkQgPSBleHBvcnRzLlpvZE5hTiA9IGV4cG9ydHMuWm9kQ2F0Y2ggPSBleHBvcnRzLlpvZERlZmF1bHQgPSBleHBvcnRzLlpvZE51bGxhYmxlID0gZXhwb3J0cy5ab2RPcHRpb25hbCA9IGV4cG9ydHMuWm9kVHJhbnNmb3JtZXIgPSBleHBvcnRzLlpvZEVmZmVjdHMgPSBleHBvcnRzLlpvZFByb21pc2UgPSBleHBvcnRzLlpvZE5hdGl2ZUVudW0gPSBleHBvcnRzLlpvZEVudW0gPSBleHBvcnRzLlpvZExpdGVyYWwgPSBleHBvcnRzLlpvZExhenkgPSBleHBvcnRzLlpvZEZ1bmN0aW9uID0gZXhwb3J0cy5ab2RTZXQgPSBleHBvcnRzLlpvZE1hcCA9IGV4cG9ydHMuWm9kUmVjb3JkID0gZXhwb3J0cy5ab2RUdXBsZSA9IGV4cG9ydHMuWm9kSW50ZXJzZWN0aW9uID0gZXhwb3J0cy5ab2REaXNjcmltaW5hdGVkVW5pb24gPSBleHBvcnRzLlpvZFVuaW9uID0gZXhwb3J0cy5ab2RPYmplY3QgPSBleHBvcnRzLlpvZEFycmF5ID0gZXhwb3J0cy5ab2RWb2lkID0gZXhwb3J0cy5ab2ROZXZlciA9IGV4cG9ydHMuWm9kVW5rbm93biA9IGV4cG9ydHMuWm9kQW55ID0gZXhwb3J0cy5ab2ROdWxsID0gZXhwb3J0cy5ab2RVbmRlZmluZWQgPSBleHBvcnRzLlpvZFN5bWJvbCA9IGV4cG9ydHMuWm9kRGF0ZSA9IGV4cG9ydHMuWm9kQm9vbGVhbiA9IGV4cG9ydHMuWm9kQmlnSW50ID0gZXhwb3J0cy5ab2ROdW1iZXIgPSBleHBvcnRzLlpvZFN0cmluZyA9IGV4cG9ydHMuWm9kVHlwZSA9IHZvaWQgMDtcbmV4cG9ydHMuTkVWRVIgPSBleHBvcnRzLnZvaWQgPSBleHBvcnRzLnVua25vd24gPSBleHBvcnRzLnVuaW9uID0gZXhwb3J0cy51bmRlZmluZWQgPSBleHBvcnRzLnR1cGxlID0gZXhwb3J0cy50cmFuc2Zvcm1lciA9IGV4cG9ydHMuc3ltYm9sID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLnN0cmljdE9iamVjdCA9IGV4cG9ydHMuc2V0ID0gZXhwb3J0cy5yZWNvcmQgPSBleHBvcnRzLnByb21pc2UgPSBleHBvcnRzLnByZXByb2Nlc3MgPSBleHBvcnRzLnBpcGVsaW5lID0gZXhwb3J0cy5vc3RyaW5nID0gZXhwb3J0cy5vcHRpb25hbCA9IGV4cG9ydHMub251bWJlciA9IGV4cG9ydHMub2Jvb2xlYW4gPSBleHBvcnRzLm9iamVjdCA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5udWxsYWJsZSA9IGV4cG9ydHMubnVsbCA9IGV4cG9ydHMubmV2ZXIgPSBleHBvcnRzLm5hdGl2ZUVudW0gPSBleHBvcnRzLm5hbiA9IGV4cG9ydHMubWFwID0gZXhwb3J0cy5saXRlcmFsID0gZXhwb3J0cy5sYXp5ID0gZXhwb3J0cy5pbnRlcnNlY3Rpb24gPSBleHBvcnRzLmluc3RhbmNlb2YgPSBleHBvcnRzLmZ1bmN0aW9uID0gZXhwb3J0cy5lbnVtID0gZXhwb3J0cy5lZmZlY3QgPSBleHBvcnRzLmRpc2NyaW1pbmF0ZWRVbmlvbiA9IHZvaWQgMDtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIi4vZXJyb3JzXCIpO1xuY29uc3QgZXJyb3JVdGlsXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL2Vycm9yVXRpbFwiKTtcbmNvbnN0IHBhcnNlVXRpbF8xID0gcmVxdWlyZShcIi4vaGVscGVycy9wYXJzZVV0aWxcIik7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwiLi9oZWxwZXJzL3V0aWxcIik7XG5jb25zdCBab2RFcnJvcl8xID0gcmVxdWlyZShcIi4vWm9kRXJyb3JcIik7XG5jbGFzcyBQYXJzZUlucHV0TGF6eVBhdGgge1xuICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgdmFsdWUsIHBhdGgsIGtleSkge1xuICAgICAgICB0aGlzLl9jYWNoZWRQYXRoID0gW107XG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgICB0aGlzLmRhdGEgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fcGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuX2tleSA9IGtleTtcbiAgICB9XG4gICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FjaGVkUGF0aC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9rZXkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLCAuLi50aGlzLl9rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsIHRoaXMuX2tleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFBhdGg7XG4gICAgfVxufVxuY29uc3QgaGFuZGxlUmVzdWx0ID0gKGN0eCwgcmVzdWx0KSA9PiB7XG4gICAgaWYgKCgwLCBwYXJzZVV0aWxfMS5pc1ZhbGlkKShyZXN1bHQpKSB7XG4gICAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHJlc3VsdC52YWx1ZSB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKCFjdHguY29tbW9uLmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlZhbGlkYXRpb24gZmFpbGVkIGJ1dCBubyBpc3N1ZXMgZGV0ZWN0ZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIGdldCBlcnJvcigpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBab2RFcnJvcl8xLlpvZEVycm9yKGN0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lcnJvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxufTtcbmZ1bmN0aW9uIHByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSB7XG4gICAgaWYgKCFwYXJhbXMpXG4gICAgICAgIHJldHVybiB7fTtcbiAgICBjb25zdCB7IGVycm9yTWFwLCBpbnZhbGlkX3R5cGVfZXJyb3IsIHJlcXVpcmVkX2Vycm9yLCBkZXNjcmlwdGlvbiB9ID0gcGFyYW1zO1xuICAgIGlmIChlcnJvck1hcCAmJiAoaW52YWxpZF90eXBlX2Vycm9yIHx8IHJlcXVpcmVkX2Vycm9yKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHVzZSBcImludmFsaWRfdHlwZV9lcnJvclwiIG9yIFwicmVxdWlyZWRfZXJyb3JcIiBpbiBjb25qdW5jdGlvbiB3aXRoIGN1c3RvbSBlcnJvciBtYXAuYCk7XG4gICAgfVxuICAgIGlmIChlcnJvck1hcClcbiAgICAgICAgcmV0dXJuIHsgZXJyb3JNYXA6IGVycm9yTWFwLCBkZXNjcmlwdGlvbiB9O1xuICAgIGNvbnN0IGN1c3RvbU1hcCA9IChpc3MsIGN0eCkgPT4ge1xuICAgICAgICBpZiAoaXNzLmNvZGUgIT09IFwiaW52YWxpZF90eXBlXCIpXG4gICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBjdHguZGVmYXVsdEVycm9yIH07XG4gICAgICAgIGlmICh0eXBlb2YgY3R4LmRhdGEgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IHJlcXVpcmVkX2Vycm9yICE9PSBudWxsICYmIHJlcXVpcmVkX2Vycm9yICE9PSB2b2lkIDAgPyByZXF1aXJlZF9lcnJvciA6IGN0eC5kZWZhdWx0RXJyb3IgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBpbnZhbGlkX3R5cGVfZXJyb3IgIT09IG51bGwgJiYgaW52YWxpZF90eXBlX2Vycm9yICE9PSB2b2lkIDAgPyBpbnZhbGlkX3R5cGVfZXJyb3IgOiBjdHguZGVmYXVsdEVycm9yIH07XG4gICAgfTtcbiAgICByZXR1cm4geyBlcnJvck1hcDogY3VzdG9tTWFwLCBkZXNjcmlwdGlvbiB9O1xufVxuY2xhc3MgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoZGVmKSB7XG4gICAgICAgIC8qKiBBbGlhcyBvZiBzYWZlUGFyc2VBc3luYyAqL1xuICAgICAgICB0aGlzLnNwYSA9IHRoaXMuc2FmZVBhcnNlQXN5bmM7XG4gICAgICAgIHRoaXMuX2RlZiA9IGRlZjtcbiAgICAgICAgdGhpcy5wYXJzZSA9IHRoaXMucGFyc2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zYWZlUGFyc2UgPSB0aGlzLnNhZmVQYXJzZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnBhcnNlQXN5bmMgPSB0aGlzLnBhcnNlQXN5bmMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zYWZlUGFyc2VBc3luYyA9IHRoaXMuc2FmZVBhcnNlQXN5bmMuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5zcGEgPSB0aGlzLnNwYS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnJlZmluZSA9IHRoaXMucmVmaW5lLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucmVmaW5lbWVudCA9IHRoaXMucmVmaW5lbWVudC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnN1cGVyUmVmaW5lID0gdGhpcy5zdXBlclJlZmluZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm9wdGlvbmFsID0gdGhpcy5vcHRpb25hbC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm51bGxhYmxlID0gdGhpcy5udWxsYWJsZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLm51bGxpc2ggPSB0aGlzLm51bGxpc2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5hcnJheSA9IHRoaXMuYXJyYXkuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5wcm9taXNlID0gdGhpcy5wcm9taXNlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub3IgPSB0aGlzLm9yLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYW5kID0gdGhpcy5hbmQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmJyYW5kID0gdGhpcy5icmFuZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmRlZmF1bHQgPSB0aGlzLmRlZmF1bHQuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5jYXRjaCA9IHRoaXMuY2F0Y2guYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5kZXNjcmliZSA9IHRoaXMuZGVzY3JpYmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5waXBlID0gdGhpcy5waXBlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucmVhZG9ubHkgPSB0aGlzLnJlYWRvbmx5LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaXNOdWxsYWJsZSA9IHRoaXMuaXNOdWxsYWJsZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmlzT3B0aW9uYWwgPSB0aGlzLmlzT3B0aW9uYWwuYmluZCh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBfZ2V0VHlwZShpbnB1dCkge1xuICAgICAgICByZXR1cm4gKDAsIHV0aWxfMS5nZXRQYXJzZWRUeXBlKShpbnB1dC5kYXRhKTtcbiAgICB9XG4gICAgX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpIHtcbiAgICAgICAgcmV0dXJuIChjdHggfHwge1xuICAgICAgICAgICAgY29tbW9uOiBpbnB1dC5wYXJlbnQuY29tbW9uLFxuICAgICAgICAgICAgZGF0YTogaW5wdXQuZGF0YSxcbiAgICAgICAgICAgIHBhcnNlZFR5cGU6ICgwLCB1dGlsXzEuZ2V0UGFyc2VkVHlwZSkoaW5wdXQuZGF0YSksXG4gICAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICAgICAgcGF0aDogaW5wdXQucGF0aCxcbiAgICAgICAgICAgIHBhcmVudDogaW5wdXQucGFyZW50LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3RhdHVzOiBuZXcgcGFyc2VVdGlsXzEuUGFyc2VTdGF0dXMoKSxcbiAgICAgICAgICAgIGN0eDoge1xuICAgICAgICAgICAgICAgIGNvbW1vbjogaW5wdXQucGFyZW50LmNvbW1vbixcbiAgICAgICAgICAgICAgICBkYXRhOiBpbnB1dC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhcnNlZFR5cGU6ICgwLCB1dGlsXzEuZ2V0UGFyc2VkVHlwZSkoaW5wdXQuZGF0YSksXG4gICAgICAgICAgICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgICAgICAgICAgICBwYXRoOiBpbnB1dC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogaW5wdXQucGFyZW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX3BhcnNlU3luYyhpbnB1dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZShpbnB1dCk7XG4gICAgICAgIGlmICgoMCwgcGFyc2VVdGlsXzEuaXNBc3luYykocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY2hyb25vdXMgcGFyc2UgZW5jb3VudGVyZWQgcHJvbWlzZS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgX3BhcnNlQXN5bmMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2UoaW5wdXQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgfVxuICAgIHBhcnNlKGRhdGEsIHBhcmFtcykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNhZmVQYXJzZShkYXRhLCBwYXJhbXMpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICB9XG4gICAgc2FmZVBhcnNlKGRhdGEsIHBhcmFtcykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgYXN5bmM6IChfYSA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5hc3luYykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgY29udGV4dHVhbEVycm9yTWFwOiBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuZXJyb3JNYXAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGF0aDogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5wYXRoKSB8fCBbXSxcbiAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGFyc2VkVHlwZTogKDAsIHV0aWxfMS5nZXRQYXJzZWRUeXBlKShkYXRhKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2VTeW5jKHsgZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pO1xuICAgICAgICByZXR1cm4gaGFuZGxlUmVzdWx0KGN0eCwgcmVzdWx0KTtcbiAgICB9XG4gICAgYXN5bmMgcGFyc2VBc3luYyhkYXRhLCBwYXJhbXMpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zYWZlUGFyc2VBc3luYyhkYXRhLCBwYXJhbXMpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICB9XG4gICAgYXN5bmMgc2FmZVBhcnNlQXN5bmMoZGF0YSwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHtcbiAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgY29udGV4dHVhbEVycm9yTWFwOiBwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuZXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgYXN5bmM6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGF0aDogKHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5wYXRoKSB8fCBbXSxcbiAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGFyc2VkVHlwZTogKDAsIHV0aWxfMS5nZXRQYXJzZWRUeXBlKShkYXRhKSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbWF5YmVBc3luY1Jlc3VsdCA9IHRoaXMuX3BhcnNlKHsgZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAoKDAsIHBhcnNlVXRpbF8xLmlzQXN5bmMpKG1heWJlQXN5bmNSZXN1bHQpXG4gICAgICAgICAgICA/IG1heWJlQXN5bmNSZXN1bHRcbiAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKG1heWJlQXN5bmNSZXN1bHQpKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlc3VsdChjdHgsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJlZmluZShjaGVjaywgbWVzc2FnZSkge1xuICAgICAgICBjb25zdCBnZXRJc3N1ZVByb3BlcnRpZXMgPSAodmFsKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIG1lc3NhZ2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UodmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmaW5lbWVudCgodmFsLCBjdHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrKHZhbCk7XG4gICAgICAgICAgICBjb25zdCBzZXRFcnJvciA9ICgpID0+IGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuY3VzdG9tLFxuICAgICAgICAgICAgICAgIC4uLmdldElzc3VlUHJvcGVydGllcyh2YWwpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIFByb21pc2UgIT09IFwidW5kZWZpbmVkXCIgJiYgcmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBzZXRFcnJvcigpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVmaW5lbWVudChjaGVjaywgcmVmaW5lbWVudERhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHZhbCwgY3R4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNoZWNrKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBjdHguYWRkSXNzdWUodHlwZW9mIHJlZmluZW1lbnREYXRhID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgPyByZWZpbmVtZW50RGF0YSh2YWwsIGN0eClcbiAgICAgICAgICAgICAgICAgICAgOiByZWZpbmVtZW50RGF0YSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcmVmaW5lbWVudChyZWZpbmVtZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgICAgICBzY2hlbWE6IHRoaXMsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gICAgICAgICAgICBlZmZlY3Q6IHsgdHlwZTogXCJyZWZpbmVtZW50XCIsIHJlZmluZW1lbnQgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN1cGVyUmVmaW5lKHJlZmluZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JlZmluZW1lbnQocmVmaW5lbWVudCk7XG4gICAgfVxuICAgIG9wdGlvbmFsKCkge1xuICAgICAgICByZXR1cm4gWm9kT3B0aW9uYWwuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIG51bGxhYmxlKCkge1xuICAgICAgICByZXR1cm4gWm9kTnVsbGFibGUuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIG51bGxpc2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm51bGxhYmxlKCkub3B0aW9uYWwoKTtcbiAgICB9XG4gICAgYXJyYXkoKSB7XG4gICAgICAgIHJldHVybiBab2RBcnJheS5jcmVhdGUodGhpcywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgcHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZFByb21pc2UuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIG9yKG9wdGlvbikge1xuICAgICAgICByZXR1cm4gWm9kVW5pb24uY3JlYXRlKFt0aGlzLCBvcHRpb25dLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBhbmQoaW5jb21pbmcpIHtcbiAgICAgICAgcmV0dXJuIFpvZEludGVyc2VjdGlvbi5jcmVhdGUodGhpcywgaW5jb21pbmcsIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIHRyYW5zZm9ybSh0cmFuc2Zvcm0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHtcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSxcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcyxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cyxcbiAgICAgICAgICAgIGVmZmVjdDogeyB0eXBlOiBcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0gfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRlZmF1bHQoZGVmKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZUZ1bmMgPSB0eXBlb2YgZGVmID09PSBcImZ1bmN0aW9uXCIgPyBkZWYgOiAoKSA9PiBkZWY7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRGVmYXVsdCh7XG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXMuX2RlZiksXG4gICAgICAgICAgICBpbm5lclR5cGU6IHRoaXMsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZUZ1bmMsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBicmFuZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RCcmFuZGVkKHtcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQnJhbmRlZCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMsXG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXMuX2RlZiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaChkZWYpIHtcbiAgICAgICAgY29uc3QgY2F0Y2hWYWx1ZUZ1bmMgPSB0eXBlb2YgZGVmID09PSBcImZ1bmN0aW9uXCIgPyBkZWYgOiAoKSA9PiBkZWY7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQ2F0Y2goe1xuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICAgICAgaW5uZXJUeXBlOiB0aGlzLFxuICAgICAgICAgICAgY2F0Y2hWYWx1ZTogY2F0Y2hWYWx1ZUZ1bmMsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZENhdGNoLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVzY3JpYmUoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgVGhpcyA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHJldHVybiBuZXcgVGhpcyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBpcGUodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBab2RQaXBlbGluZS5jcmVhdGUodGhpcywgdGFyZ2V0KTtcbiAgICB9XG4gICAgcmVhZG9ubHkoKSB7XG4gICAgICAgIHJldHVybiBab2RSZWFkb25seS5jcmVhdGUodGhpcyk7XG4gICAgfVxuICAgIGlzT3B0aW9uYWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhZmVQYXJzZSh1bmRlZmluZWQpLnN1Y2Nlc3M7XG4gICAgfVxuICAgIGlzTnVsbGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhZmVQYXJzZShudWxsKS5zdWNjZXNzO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kVHlwZSA9IFpvZFR5cGU7XG5leHBvcnRzLlNjaGVtYSA9IFpvZFR5cGU7XG5leHBvcnRzLlpvZFNjaGVtYSA9IFpvZFR5cGU7XG5jb25zdCBjdWlkUmVnZXggPSAvXmNbXlxccy1dezgsfSQvaTtcbmNvbnN0IGN1aWQyUmVnZXggPSAvXlthLXpdW2EtejAtOV0qJC87XG5jb25zdCB1bGlkUmVnZXggPSAvXlswLTlBLUhKS01OUC1UVi1aXXsyNn0kLztcbi8vIGNvbnN0IHV1aWRSZWdleCA9XG4vLyAgIC9eKFthLWYwLTldezh9LVthLWYwLTldezR9LVsxLTVdW2EtZjAtOV17M30tW2EtZjAtOV17NH0tW2EtZjAtOV17MTJ9fDAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCkkL2k7XG5jb25zdCB1dWlkUmVnZXggPSAvXlswLTlhLWZBLUZdezh9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezR9XFxiLVswLTlhLWZBLUZdezEyfSQvaTtcbi8vIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2MTgxLzE1NTAxNTVcbi8vIG9sZCB2ZXJzaW9uOiB0b28gc2xvdywgZGlkbid0IHN1cHBvcnQgdW5pY29kZVxuLy8gY29uc3QgZW1haWxSZWdleCA9IC9eKCgoW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKyhcXC4oW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKykqKXwoKFxceDIyKSgoKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KChbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHg3Zl18XFx4MjF8W1xceDIzLVxceDViXXxbXFx4NWQtXFx4N2VdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoXFxcXChbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGQtXFx4N2ZdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpKSooKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KFxceDIyKSkpQCgoKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4pKygoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKSQvaTtcbi8vb2xkIGVtYWlsIHJlZ2V4XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID0gL14oKFtePD4oKVtcXF0uLDs6XFxzQFwiXSsoXFwuW148PigpW1xcXS4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKCg/IS0pKFtePD4oKVtcXF0uLDs6XFxzQFwiXStcXC4pK1tePD4oKVtcXF0uLDs6XFxzQFwiXXsxLH0pW14tPD4oKVtcXF0uLDs6XFxzQFwiXSQvaTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuLy8gY29uc3QgZW1haWxSZWdleCA9XG4vLyAgIC9eKChbXjw+KClbXFxdXFxcXC4sOzpcXHNAXFxcIl0rKFxcLltePD4oKVtcXF1cXFxcLiw7Olxcc0BcXFwiXSspKil8KFxcXCIuK1xcXCIpKUAoKFxcWygoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcXSl8KFxcW0lQdjY6KChbYS1mMC05XXsxLDR9Oil7N318OjooW2EtZjAtOV17MSw0fTopezAsNn18KFthLWYwLTldezEsNH06KXsxfTooW2EtZjAtOV17MSw0fTopezAsNX18KFthLWYwLTldezEsNH06KXsyfTooW2EtZjAtOV17MSw0fTopezAsNH18KFthLWYwLTldezEsNH06KXszfTooW2EtZjAtOV17MSw0fTopezAsM318KFthLWYwLTldezEsNH06KXs0fTooW2EtZjAtOV17MSw0fTopezAsMn18KFthLWYwLTldezEsNH06KXs1fTooW2EtZjAtOV17MSw0fTopezAsMX0pKFthLWYwLTldezEsNH18KCgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpXFwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpKVxcXSl8KFtBLVphLXowLTldKFtBLVphLXowLTktXSpbQS1aYS16MC05XSkqKFxcLltBLVphLXpdezIsfSkrKSkkLztcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXlthLXpBLVowLTlcXC5cXCFcXCNcXCRcXCVcXCZcXCdcXCpcXCtcXC9cXD1cXD9cXF5cXF9cXGBcXHtcXHxcXH1cXH5cXC1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvO1xuLy8gY29uc3QgZW1haWxSZWdleCA9XG4vLyAgIC9eKD86W2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKnxcIig/OltcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDIxXFx4MjMtXFx4NWJcXHg1ZC1cXHg3Zl18XFxcXFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZS1cXHg3Zl0pKlwiKUAoPzooPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XFwuKStbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/fFxcWyg/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/fFthLXowLTktXSpbYS16MC05XTooPzpbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHgyMS1cXHg1YVxceDUzLVxceDdmXXxcXFxcW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBlLVxceDdmXSkrKVxcXSkkL2k7XG5jb25zdCBlbWFpbFJlZ2V4ID0gL14oPyFcXC4pKD8hLipcXC5cXC4pKFtBLVowLTlfKy1cXC5dKilbQS1aMC05XystXUAoW0EtWjAtOV1bQS1aMC05XFwtXSpcXC4pK1tBLVpdezIsfSQvaTtcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXlthLXowLTkuISMkJSbigJkqKy89P15fYHt8fX4tXStAW2EtejAtOS1dKyg/OlxcLlthLXowLTlcXC1dKykqJC9pO1xuLy8gZnJvbSBodHRwczovL3RoZWtldmluc2NvdHQuY29tL2Vtb2ppcy1pbi1qYXZhc2NyaXB0LyN3cml0aW5nLWEtcmVndWxhci1leHByZXNzaW9uXG5jb25zdCBfZW1vamlSZWdleCA9IGBeKFxcXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxcXHB7RW1vamlfQ29tcG9uZW50fSkrJGA7XG5sZXQgZW1vamlSZWdleDtcbmNvbnN0IGlwdjRSZWdleCA9IC9eKCgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpXFwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpJC87XG5jb25zdCBpcHY2UmVnZXggPSAvXigoW2EtZjAtOV17MSw0fTopezd9fDo6KFthLWYwLTldezEsNH06KXswLDZ9fChbYS1mMC05XXsxLDR9Oil7MX06KFthLWYwLTldezEsNH06KXswLDV9fChbYS1mMC05XXsxLDR9Oil7Mn06KFthLWYwLTldezEsNH06KXswLDR9fChbYS1mMC05XXsxLDR9Oil7M306KFthLWYwLTldezEsNH06KXswLDN9fChbYS1mMC05XXsxLDR9Oil7NH06KFthLWYwLTldezEsNH06KXswLDJ9fChbYS1mMC05XXsxLDR9Oil7NX06KFthLWYwLTldezEsNH06KXswLDF9KShbYS1mMC05XXsxLDR9fCgoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKSkkLztcbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzE0MzIzMVxuY29uc3QgZGF0ZXRpbWVSZWdleCA9IChhcmdzKSA9PiB7XG4gICAgaWYgKGFyZ3MucHJlY2lzaW9uKSB7XG4gICAgICAgIGlmIChhcmdzLm9mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoYF5cXFxcZHs0fS1cXFxcZHsyfS1cXFxcZHsyfVRcXFxcZHsyfTpcXFxcZHsyfTpcXFxcZHsyfVxcXFwuXFxcXGR7JHthcmdzLnByZWNpc2lvbn19KChbKy1dXFxcXGR7Mn0oOj9cXFxcZHsyfSk/KXxaKSRgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn1UXFxcXGR7Mn06XFxcXGR7Mn06XFxcXGR7Mn1cXFxcLlxcXFxkeyR7YXJncy5wcmVjaXNpb259fVokYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXJncy5wcmVjaXNpb24gPT09IDApIHtcbiAgICAgICAgaWYgKGFyZ3Mub2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9KChbKy1dXFxcXGR7Mn0oOj9cXFxcZHsyfSk/KXxaKSRgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn1UXFxcXGR7Mn06XFxcXGR7Mn06XFxcXGR7Mn1aJGApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoYXJncy5vZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKGBeXFxcXGR7NH0tXFxcXGR7Mn0tXFxcXGR7Mn1UXFxcXGR7Mn06XFxcXGR7Mn06XFxcXGR7Mn0oXFxcXC5cXFxcZCspPygoWystXVxcXFxkezJ9KDo/XFxcXGR7Mn0pPyl8WikkYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChgXlxcXFxkezR9LVxcXFxkezJ9LVxcXFxkezJ9VFxcXFxkezJ9OlxcXFxkezJ9OlxcXFxkezJ9KFxcXFwuXFxcXGQrKT9aJGApO1xuICAgICAgICB9XG4gICAgfVxufTtcbmZ1bmN0aW9uIGlzVmFsaWRJUChpcCwgdmVyc2lvbikge1xuICAgIGlmICgodmVyc2lvbiA9PT0gXCJ2NFwiIHx8ICF2ZXJzaW9uKSAmJiBpcHY0UmVnZXgudGVzdChpcCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICgodmVyc2lvbiA9PT0gXCJ2NlwiIHx8ICF2ZXJzaW9uKSAmJiBpcHY2UmVnZXgudGVzdChpcCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cbmNsYXNzIFpvZFN0cmluZyBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IFN0cmluZyhpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5zdHJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsXzEuWm9kUGFyc2VkVHlwZS5zdHJpbmcsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgcGFyc2VVdGlsXzEuUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmxlbmd0aCA8IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5sZW5ndGggPiBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJsZW5ndGhcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb0JpZyA9IGlucHV0LmRhdGEubGVuZ3RoID4gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9vU21hbGwgPSBpbnB1dC5kYXRhLmxlbmd0aCA8IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29CaWcgfHwgdG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b29CaWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImVtYWlsXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVtYWlsUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZW1haWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZW1vamlcIikge1xuICAgICAgICAgICAgICAgIGlmICghZW1vamlSZWdleCkge1xuICAgICAgICAgICAgICAgICAgICBlbW9qaVJlZ2V4ID0gbmV3IFJlZ0V4cChfZW1vamlSZWdleCwgXCJ1XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWVtb2ppUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZW1vamlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidXVpZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1dWlkUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwidXVpZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJjdWlkXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1aWRSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJjdWlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImN1aWQyXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1aWQyUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZDJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidWxpZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1bGlkUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwidWxpZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ1cmxcIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoaW5wdXQuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChfYSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwidXJsXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInJlZ2V4XCIpIHtcbiAgICAgICAgICAgICAgICBjaGVjay5yZWdleC5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RSZXN1bHQgPSBjaGVjay5yZWdleC50ZXN0KGlucHV0LmRhdGEpO1xuICAgICAgICAgICAgICAgIGlmICghdGVzdFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwicmVnZXhcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidHJpbVwiKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0YSA9IGlucHV0LmRhdGEudHJpbSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJpbmNsdWRlc1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnB1dC5kYXRhLmluY2x1ZGVzKGNoZWNrLnZhbHVlLCBjaGVjay5wb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IHsgaW5jbHVkZXM6IGNoZWNrLnZhbHVlLCBwb3NpdGlvbjogY2hlY2sucG9zaXRpb24gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInRvTG93ZXJDYXNlXCIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5kYXRhID0gaW5wdXQuZGF0YS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ0b1VwcGVyQ2FzZVwiKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0YSA9IGlucHV0LmRhdGEudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwic3RhcnRzV2l0aFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnB1dC5kYXRhLnN0YXJ0c1dpdGgoY2hlY2sudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB7IHN0YXJ0c1dpdGg6IGNoZWNrLnZhbHVlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJlbmRzV2l0aFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnB1dC5kYXRhLmVuZHNXaXRoKGNoZWNrLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogeyBlbmRzV2l0aDogY2hlY2sudmFsdWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImRhdGV0aW1lXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IGRhdGV0aW1lUmVnZXgoY2hlY2spO1xuICAgICAgICAgICAgICAgIGlmICghcmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiaXBcIikge1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZElQKGlucHV0LmRhdGEsIGNoZWNrLnZlcnNpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJpcFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbF8xLnV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBfcmVnZXgocmVnZXgsIHZhbGlkYXRpb24sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVmaW5lbWVudCgoZGF0YSkgPT4gcmVnZXgudGVzdChkYXRhKSwge1xuICAgICAgICAgICAgdmFsaWRhdGlvbixcbiAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsXzEuZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVtYWlsKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJlbWFpbFwiLCAuLi5lcnJvclV0aWxfMS5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIHVybChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwidXJsXCIsIC4uLmVycm9yVXRpbF8xLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgZW1vamkobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImVtb2ppXCIsIC4uLmVycm9yVXRpbF8xLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgdXVpZChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwidXVpZFwiLCAuLi5lcnJvclV0aWxfMS5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGN1aWQobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImN1aWRcIiwgLi4uZXJyb3JVdGlsXzEuZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBjdWlkMihtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiY3VpZDJcIiwgLi4uZXJyb3JVdGlsXzEuZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICB1bGlkKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJ1bGlkXCIsIC4uLmVycm9yVXRpbF8xLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgaXAob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImlwXCIsIC4uLmVycm9yVXRpbF8xLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zKSB9KTtcbiAgICB9XG4gICAgZGF0ZXRpbWUob3B0aW9ucykge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgICAgICBraW5kOiBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiBudWxsLFxuICAgICAgICAgICAgICAgIG9mZnNldDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogb3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICBwcmVjaXNpb246IHR5cGVvZiAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZWNpc2lvbikgPT09IFwidW5kZWZpbmVkXCIgPyBudWxsIDogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnByZWNpc2lvbixcbiAgICAgICAgICAgIG9mZnNldDogKF9hID0gb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm9mZnNldCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWxfMS5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLm1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVnZXgocmVnZXgsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwicmVnZXhcIixcbiAgICAgICAgICAgIHJlZ2V4OiByZWdleCxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbF8xLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGluY2x1ZGVzKHZhbHVlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImluY2x1ZGVzXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBwb3NpdGlvbjogb3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLnBvc2l0aW9uLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsXzEuZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMgPT09IG51bGwgfHwgb3B0aW9ucyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0aW9ucy5tZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHN0YXJ0c1dpdGgodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwic3RhcnRzV2l0aFwiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsXzEuZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZW5kc1dpdGgodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiZW5kc1dpdGhcIixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbF8xLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1pbihtaW5MZW5ndGgsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogbWluTGVuZ3RoLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsXzEuZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWF4KG1heExlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBtYXhMZW5ndGgsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWxfMS5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBsZW5ndGgobGVuLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImxlbmd0aFwiLFxuICAgICAgICAgICAgdmFsdWU6IGxlbixcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbF8xLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB6LnN0cmluZygpLm1pbigxKSBpbnN0ZWFkLlxuICAgICAqIEBzZWUge0BsaW5rIFpvZFN0cmluZy5taW59XG4gICAgICovXG4gICAgbm9uZW1wdHkobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4oMSwgZXJyb3JVdGlsXzEuZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgdHJpbSgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiBcInRyaW1cIiB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvTG93ZXJDYXNlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6IFwidG9Mb3dlckNhc2VcIiB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHRvVXBwZXJDYXNlKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6IFwidG9VcHBlckNhc2VcIiB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBpc0RhdGV0aW1lKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImRhdGV0aW1lXCIpO1xuICAgIH1cbiAgICBnZXQgaXNFbWFpbCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJlbWFpbFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzVVJMKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcInVybFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzRW1vamkoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZW1vamlcIik7XG4gICAgfVxuICAgIGdldCBpc1VVSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwidXVpZFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzQ1VJRCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJjdWlkXCIpO1xuICAgIH1cbiAgICBnZXQgaXNDVUlEMigpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJjdWlkMlwiKTtcbiAgICB9XG4gICAgZ2V0IGlzVUxJRCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJ1bGlkXCIpO1xuICAgIH1cbiAgICBnZXQgaXNJUCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJpcFwiKTtcbiAgICB9XG4gICAgZ2V0IG1pbkxlbmd0aCgpIHtcbiAgICAgICAgbGV0IG1pbiA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKVxuICAgICAgICAgICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICBnZXQgbWF4TGVuZ3RoKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxufVxuZXhwb3J0cy5ab2RTdHJpbmcgPSBab2RTdHJpbmc7XG5ab2RTdHJpbmcuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU3RyaW5nLFxuICAgICAgICBjb2VyY2U6IChfYSA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzk2NjQ4NC93aHktZG9lcy1tb2R1bHVzLW9wZXJhdG9yLXJldHVybi1mcmFjdGlvbmFsLW51bWJlci1pbi1qYXZhc2NyaXB0LzMxNzExMDM0IzMxNzExMDM0XG5mdW5jdGlvbiBmbG9hdFNhZmVSZW1haW5kZXIodmFsLCBzdGVwKSB7XG4gICAgY29uc3QgdmFsRGVjQ291bnQgPSAodmFsLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdIHx8IFwiXCIpLmxlbmd0aDtcbiAgICBjb25zdCBzdGVwRGVjQ291bnQgPSAoc3RlcC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgY29uc3QgZGVjQ291bnQgPSB2YWxEZWNDb3VudCA+IHN0ZXBEZWNDb3VudCA/IHZhbERlY0NvdW50IDogc3RlcERlY0NvdW50O1xuICAgIGNvbnN0IHZhbEludCA9IHBhcnNlSW50KHZhbC50b0ZpeGVkKGRlY0NvdW50KS5yZXBsYWNlKFwiLlwiLCBcIlwiKSk7XG4gICAgY29uc3Qgc3RlcEludCA9IHBhcnNlSW50KHN0ZXAudG9GaXhlZChkZWNDb3VudCkucmVwbGFjZShcIi5cIiwgXCJcIikpO1xuICAgIHJldHVybiAodmFsSW50ICUgc3RlcEludCkgLyBNYXRoLnBvdygxMCwgZGVjQ291bnQpO1xufVxuY2xhc3MgWm9kTnVtYmVyIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubWluID0gdGhpcy5ndGU7XG4gICAgICAgIHRoaXMubWF4ID0gdGhpcy5sdGU7XG4gICAgICAgIHRoaXMuc3RlcCA9IHRoaXMubXVsdGlwbGVPZjtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gTnVtYmVyKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLm51bWJlcikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLm51bWJlcixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IG5ldyBwYXJzZVV0aWxfMS5QYXJzZVN0YXR1cygpO1xuICAgICAgICBmb3IgKGNvbnN0IGNoZWNrIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaGVjay5raW5kID09PSBcImludFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1dGlsXzEudXRpbC5pc0ludGVnZXIoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZDogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZDogXCJmbG9hdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGNoZWNrLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmRhdGEgPCBjaGVjay52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGlucHV0LmRhdGEgPD0gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb0JpZyA9IGNoZWNrLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmRhdGEgPiBjaGVjay52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGlucHV0LmRhdGEgPj0gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb0JpZykge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIGlmIChmbG9hdFNhZmVSZW1haW5kZXIoaW5wdXQuZGF0YSwgY2hlY2sudmFsdWUpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVPZjogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJmaW5pdGVcIikge1xuICAgICAgICAgICAgICAgIGlmICghTnVtYmVyLmlzRmluaXRlKGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUubm90X2Zpbml0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1dGlsXzEudXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxuICAgIGd0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgZ3QodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBsdGUodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0KHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIHZhbHVlLCBmYWxzZSwgZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgc2V0TGltaXQoa2luZCwgdmFsdWUsIGluY2x1c2l2ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE51bWJlcih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuY2hlY2tzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGludChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImludFwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5lZ2F0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25wb3NpdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25uZWdhdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtdWx0aXBsZU9mKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm11bHRpcGxlT2ZcIixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZpbml0ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImZpbml0ZVwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2FmZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KS5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBtaW5WYWx1ZSgpIHtcbiAgICAgICAgbGV0IG1pbiA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKVxuICAgICAgICAgICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICBnZXQgbWF4VmFsdWUoKSB7XG4gICAgICAgIGxldCBtYXggPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heClcbiAgICAgICAgICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICB9XG4gICAgZ2V0IGlzSW50KCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImludFwiIHx8XG4gICAgICAgICAgICAoY2gua2luZCA9PT0gXCJtdWx0aXBsZU9mXCIgJiYgdXRpbF8xLnV0aWwuaXNJbnRlZ2VyKGNoLnZhbHVlKSkpO1xuICAgIH1cbiAgICBnZXQgaXNGaW5pdGUoKSB7XG4gICAgICAgIGxldCBtYXggPSBudWxsLCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcImZpbml0ZVwiIHx8XG4gICAgICAgICAgICAgICAgY2gua2luZCA9PT0gXCJpbnRcIiB8fFxuICAgICAgICAgICAgICAgIGNoLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaC5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heClcbiAgICAgICAgICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShtaW4pICYmIE51bWJlci5pc0Zpbml0ZShtYXgpO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kTnVtYmVyID0gWm9kTnVtYmVyO1xuWm9kTnVtYmVyLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE51bWJlcih7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTnVtYmVyLFxuICAgICAgICBjb2VyY2U6IChwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuY29lcmNlKSB8fCBmYWxzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEJpZ0ludCBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm1pbiA9IHRoaXMuZ3RlO1xuICAgICAgICB0aGlzLm1heCA9IHRoaXMubHRlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBCaWdJbnQoaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUuYmlnaW50KSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbF8xLlpvZFBhcnNlZFR5cGUuYmlnaW50LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IHBhcnNlVXRpbF8xLlBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGNoZWNrLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmRhdGEgPCBjaGVjay52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGlucHV0LmRhdGEgPD0gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiBjaGVjay5pbmNsdXNpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb0JpZyA9IGNoZWNrLmluY2x1c2l2ZVxuICAgICAgICAgICAgICAgICAgICA/IGlucHV0LmRhdGEgPiBjaGVjay52YWx1ZVxuICAgICAgICAgICAgICAgICAgICA6IGlucHV0LmRhdGEgPj0gY2hlY2sudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKHRvb0JpZykge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhICUgY2hlY2sudmFsdWUgIT09IEJpZ0ludCgwKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLm5vdF9tdWx0aXBsZV9vZixcbiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlT2Y6IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWxfMS51dGlsLmFzc2VydE5ldmVyKGNoZWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgZ3RlKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWluXCIsIHZhbHVlLCB0cnVlLCBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBndCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1heFwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgbHQodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBzZXRMaW1pdChraW5kLCB2YWx1ZSwgaW5jbHVzaXZlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5jaGVja3MsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfYWRkQ2hlY2soY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RCaWdJbnQoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ucG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25uZWdhdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IEJpZ0ludCgwKSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG11bHRpcGxlT2YodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibXVsdGlwbGVPZlwiLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgbWluVmFsdWUoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgZ2V0IG1heFZhbHVlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxufVxuZXhwb3J0cy5ab2RCaWdJbnQgPSBab2RCaWdJbnQ7XG5ab2RCaWdJbnQuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gbmV3IFpvZEJpZ0ludCh7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQmlnSW50LFxuICAgICAgICBjb2VyY2U6IChfYSA9IHBhcmFtcyA9PT0gbnVsbCB8fCBwYXJhbXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHBhcmFtcy5jb2VyY2UpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kQm9vbGVhbiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IEJvb2xlYW4oaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUuYm9vbGVhbikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLmJvb2xlYW4sXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLk9LKShpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5leHBvcnRzLlpvZEJvb2xlYW4gPSBab2RCb29sZWFuO1xuWm9kQm9vbGVhbi5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RCb29sZWFuKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RCb29sZWFuLFxuICAgICAgICBjb2VyY2U6IChwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuY29lcmNlKSB8fCBmYWxzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZERhdGUgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBuZXcgRGF0ZShpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5kYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbF8xLlpvZFBhcnNlZFR5cGUuZGF0ZSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc05hTihpbnB1dC5kYXRhLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9kYXRlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgcGFyc2VVdGlsXzEuUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmdldFRpbWUoKSA8IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmRhdGEuZ2V0VGltZSgpID4gY2hlY2sudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heGltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1dGlsXzEudXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLnZhbHVlLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBEYXRlKGlucHV0LmRhdGEuZ2V0VGltZSgpKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCBjaGVja10sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtaW4obWluRGF0ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBtaW5EYXRlLmdldFRpbWUoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1heChtYXhEYXRlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IG1heERhdGUuZ2V0VGltZSgpLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IG1pbkRhdGUoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbiAhPSBudWxsID8gbmV3IERhdGUobWluKSA6IG51bGw7XG4gICAgfVxuICAgIGdldCBtYXhEYXRlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXggIT0gbnVsbCA/IG5ldyBEYXRlKG1heCkgOiBudWxsO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kRGF0ZSA9IFpvZERhdGU7XG5ab2REYXRlLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZERhdGUoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICBjb2VyY2U6IChwYXJhbXMgPT09IG51bGwgfHwgcGFyYW1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwYXJhbXMuY29lcmNlKSB8fCBmYWxzZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REYXRlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kU3ltYm9sIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLnN5bWJvbCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLnN5bWJvbCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoMCwgcGFyc2VVdGlsXzEuT0spKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kU3ltYm9sID0gWm9kU3ltYm9sO1xuWm9kU3ltYm9sLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFN5bWJvbCh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU3ltYm9sLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kVW5kZWZpbmVkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoMCwgcGFyc2VVdGlsXzEuT0spKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kVW5kZWZpbmVkID0gWm9kVW5kZWZpbmVkO1xuWm9kVW5kZWZpbmVkLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFVuZGVmaW5lZCh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVW5kZWZpbmVkLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kTnVsbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5udWxsKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbF8xLlpvZFBhcnNlZFR5cGUubnVsbCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoMCwgcGFyc2VVdGlsXzEuT0spKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kTnVsbCA9IFpvZE51bGw7XG5ab2ROdWxsLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE51bGwoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bGwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RBbnkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgLy8gdG8gcHJldmVudCBpbnN0YW5jZXMgb2Ygb3RoZXIgY2xhc3NlcyBmcm9tIGV4dGVuZGluZyBab2RBbnkuIHRoaXMgY2F1c2VzIGlzc3VlcyB3aXRoIGNhdGNoYWxsIGluIFpvZE9iamVjdC5cbiAgICAgICAgdGhpcy5fYW55ID0gdHJ1ZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoMCwgcGFyc2VVdGlsXzEuT0spKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kQW55ID0gWm9kQW55O1xuWm9kQW55LmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEFueSh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQW55LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kVW5rbm93biBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICAvLyByZXF1aXJlZFxuICAgICAgICB0aGlzLl91bmtub3duID0gdHJ1ZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAoMCwgcGFyc2VVdGlsXzEuT0spKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kVW5rbm93biA9IFpvZFVua25vd247XG5ab2RVbmtub3duLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFVua25vd24oe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFVua25vd24sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2ROZXZlciBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICBleHBlY3RlZDogdXRpbF8xLlpvZFBhcnNlZFR5cGUubmV2ZXIsXG4gICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICB9XG59XG5leHBvcnRzLlpvZE5ldmVyID0gWm9kTmV2ZXI7XG5ab2ROZXZlci5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROZXZlcih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTmV2ZXIsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RWb2lkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLnZvaWQsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLk9LKShpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5leHBvcnRzLlpvZFZvaWQgPSBab2RWb2lkO1xuWm9kVm9pZC5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RWb2lkKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RWb2lkLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kQXJyYXkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHgsIHN0YXR1cyB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5fZGVmO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLmFycmF5KSB7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbF8xLlpvZFBhcnNlZFR5cGUuYXJyYXksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLmV4YWN0TGVuZ3RoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjdHguZGF0YS5sZW5ndGggPiBkZWYuZXhhY3RMZW5ndGgudmFsdWU7XG4gICAgICAgICAgICBjb25zdCB0b29TbWFsbCA9IGN0eC5kYXRhLmxlbmd0aCA8IGRlZi5leGFjdExlbmd0aC52YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b29CaWcgfHwgdG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiB0b29CaWcgPyBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS50b29fYmlnIDogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiAodG9vU21hbGwgPyBkZWYuZXhhY3RMZW5ndGgudmFsdWUgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiAodG9vQmlnID8gZGVmLmV4YWN0TGVuZ3RoLnZhbHVlIDogdW5kZWZpbmVkKSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGV4YWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYuZXhhY3RMZW5ndGgubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLm1pbkxlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLmxlbmd0aCA8IGRlZi5taW5MZW5ndGgudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGRlZi5taW5MZW5ndGgudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5taW5MZW5ndGgubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVmLm1heExlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLmxlbmd0aCA+IGRlZi5tYXhMZW5ndGgudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBkZWYubWF4TGVuZ3RoLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYubWF4TGVuZ3RoLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbLi4uY3R4LmRhdGFdLm1hcCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWYudHlwZS5fcGFyc2VBc3luYyhuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGkpKTtcbiAgICAgICAgICAgIH0pKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbLi4uY3R4LmRhdGFdLm1hcCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGRlZi50eXBlLl9wYXJzZVN5bmMobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdCk7XG4gICAgfVxuICAgIGdldCBlbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7XG4gICAgfVxuICAgIG1pbihtaW5MZW5ndGgsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBtaW5MZW5ndGg6IHsgdmFsdWU6IG1pbkxlbmd0aCwgbWVzc2FnZTogZXJyb3JVdGlsXzEuZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4TGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWF4TGVuZ3RoOiB7IHZhbHVlOiBtYXhMZW5ndGgsIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGVuZ3RoKGxlbiwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGV4YWN0TGVuZ3RoOiB7IHZhbHVlOiBsZW4sIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9uZW1wdHkobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4oMSwgbWVzc2FnZSk7XG4gICAgfVxufVxuZXhwb3J0cy5ab2RBcnJheSA9IFpvZEFycmF5O1xuWm9kQXJyYXkuY3JlYXRlID0gKHNjaGVtYSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgIHR5cGU6IHNjaGVtYSxcbiAgICAgICAgbWluTGVuZ3RoOiBudWxsLFxuICAgICAgICBtYXhMZW5ndGg6IG51bGwsXG4gICAgICAgIGV4YWN0TGVuZ3RoOiBudWxsLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEFycmF5LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZnVuY3Rpb24gZGVlcFBhcnRpYWxpZnkoc2NoZW1hKSB7XG4gICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE9iamVjdCkge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuc2hhcGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkU2NoZW1hID0gc2NoZW1hLnNoYXBlW2tleV07XG4gICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gWm9kT3B0aW9uYWwuY3JlYXRlKGRlZXBQYXJ0aWFsaWZ5KGZpZWxkU2NoZW1hKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4uc2NoZW1hLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gbmV3U2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RBcnJheSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgICAgIC4uLnNjaGVtYS5fZGVmLFxuICAgICAgICAgICAgdHlwZTogZGVlcFBhcnRpYWxpZnkoc2NoZW1hLmVsZW1lbnQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kT3B0aW9uYWwpIHtcbiAgICAgICAgcmV0dXJuIFpvZE9wdGlvbmFsLmNyZWF0ZShkZWVwUGFydGlhbGlmeShzY2hlbWEudW53cmFwKCkpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kTnVsbGFibGUpIHtcbiAgICAgICAgcmV0dXJuIFpvZE51bGxhYmxlLmNyZWF0ZShkZWVwUGFydGlhbGlmeShzY2hlbWEudW53cmFwKCkpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kVHVwbGUpIHtcbiAgICAgICAgcmV0dXJuIFpvZFR1cGxlLmNyZWF0ZShzY2hlbWEuaXRlbXMubWFwKChpdGVtKSA9PiBkZWVwUGFydGlhbGlmeShpdGVtKSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYTtcbiAgICB9XG59XG5jbGFzcyBab2RPYmplY3QgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5fY2FjaGVkID0gbnVsbDtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXByZWNhdGVkIEluIG1vc3QgY2FzZXMsIHRoaXMgaXMgbm8gbG9uZ2VyIG5lZWRlZCAtIHVua25vd24gcHJvcGVydGllcyBhcmUgbm93IHNpbGVudGx5IHN0cmlwcGVkLlxuICAgICAgICAgKiBJZiB5b3Ugd2FudCB0byBwYXNzIHRocm91Z2ggdW5rbm93biBwcm9wZXJ0aWVzLCB1c2UgYC5wYXNzdGhyb3VnaCgpYCBpbnN0ZWFkLlxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5ub25zdHJpY3QgPSB0aGlzLnBhc3N0aHJvdWdoO1xuICAgICAgICAvLyBleHRlbmQ8XG4gICAgICAgIC8vICAgQXVnbWVudGF0aW9uIGV4dGVuZHMgWm9kUmF3U2hhcGUsXG4gICAgICAgIC8vICAgTmV3T3V0cHV0IGV4dGVuZHMgdXRpbC5mbGF0dGVuPHtcbiAgICAgICAgLy8gICAgIFtrIGluIGtleW9mIEF1Z21lbnRhdGlvbiB8IGtleW9mIE91dHB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAgICAgLy8gICAgICAgPyBBdWdtZW50YXRpb25ba11bXCJfb3V0cHV0XCJdXG4gICAgICAgIC8vICAgICAgIDogayBleHRlbmRzIGtleW9mIE91dHB1dFxuICAgICAgICAvLyAgICAgICA/IE91dHB1dFtrXVxuICAgICAgICAvLyAgICAgICA6IG5ldmVyO1xuICAgICAgICAvLyAgIH0+LFxuICAgICAgICAvLyAgIE5ld0lucHV0IGV4dGVuZHMgdXRpbC5mbGF0dGVuPHtcbiAgICAgICAgLy8gICAgIFtrIGluIGtleW9mIEF1Z21lbnRhdGlvbiB8IGtleW9mIElucHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAgICAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9pbnB1dFwiXVxuICAgICAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBJbnB1dFxuICAgICAgICAvLyAgICAgICA/IElucHV0W2tdXG4gICAgICAgIC8vICAgICAgIDogbmV2ZXI7XG4gICAgICAgIC8vICAgfT5cbiAgICAgICAgLy8gPihcbiAgICAgICAgLy8gICBhdWdtZW50YXRpb246IEF1Z21lbnRhdGlvblxuICAgICAgICAvLyApOiBab2RPYmplY3Q8XG4gICAgICAgIC8vICAgZXh0ZW5kU2hhcGU8VCwgQXVnbWVudGF0aW9uPixcbiAgICAgICAgLy8gICBVbmtub3duS2V5cyxcbiAgICAgICAgLy8gICBDYXRjaGFsbCxcbiAgICAgICAgLy8gICBOZXdPdXRwdXQsXG4gICAgICAgIC8vICAgTmV3SW5wdXRcbiAgICAgICAgLy8gPiB7XG4gICAgICAgIC8vICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAvLyAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAvLyAgICAgc2hhcGU6ICgpID0+ICh7XG4gICAgICAgIC8vICAgICAgIC4uLnRoaXMuX2RlZi5zaGFwZSgpLFxuICAgICAgICAvLyAgICAgICAuLi5hdWdtZW50YXRpb24sXG4gICAgICAgIC8vICAgICB9KSxcbiAgICAgICAgLy8gICB9KSBhcyBhbnk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEBkZXByZWNhdGVkIFVzZSBgLmV4dGVuZGAgaW5zdGVhZFxuICAgICAgICAgKiAgKi9cbiAgICAgICAgdGhpcy5hdWdtZW50ID0gdGhpcy5leHRlbmQ7XG4gICAgfVxuICAgIF9nZXRDYWNoZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWNoZWQgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkO1xuICAgICAgICBjb25zdCBzaGFwZSA9IHRoaXMuX2RlZi5zaGFwZSgpO1xuICAgICAgICBjb25zdCBrZXlzID0gdXRpbF8xLnV0aWwub2JqZWN0S2V5cyhzaGFwZSk7XG4gICAgICAgIHJldHVybiAodGhpcy5fY2FjaGVkID0geyBzaGFwZSwga2V5cyB9KTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IHsgc2hhcGUsIGtleXM6IHNoYXBlS2V5cyB9ID0gdGhpcy5fZ2V0Q2FjaGVkKCk7XG4gICAgICAgIGNvbnN0IGV4dHJhS2V5cyA9IFtdO1xuICAgICAgICBpZiAoISh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBab2ROZXZlciAmJlxuICAgICAgICAgICAgdGhpcy5fZGVmLnVua25vd25LZXlzID09PSBcInN0cmlwXCIpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjdHguZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmICghc2hhcGVLZXlzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXh0cmFLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFpcnMgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc2hhcGVLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlWYWxpZGF0b3IgPSBzaGFwZVtrZXldO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjdHguZGF0YVtrZXldO1xuICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZToga2V5IH0sXG4gICAgICAgICAgICAgICAgdmFsdWU6IGtleVZhbGlkYXRvci5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIHZhbHVlLCBjdHgucGF0aCwga2V5KSksXG4gICAgICAgICAgICAgICAgYWx3YXlzU2V0OiBrZXkgaW4gY3R4LmRhdGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgWm9kTmV2ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHVua25vd25LZXlzID0gdGhpcy5fZGVmLnVua25vd25LZXlzO1xuICAgICAgICAgICAgaWYgKHVua25vd25LZXlzID09PSBcInBhc3N0aHJvdWdoXCIpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBleHRyYUtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBrZXkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZTogY3R4LmRhdGFba2V5XSB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1bmtub3duS2V5cyA9PT0gXCJzdHJpY3RcIikge1xuICAgICAgICAgICAgICAgIGlmIChleHRyYUtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudW5yZWNvZ25pemVkX2tleXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzOiBleHRyYUtleXMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh1bmtub3duS2V5cyA9PT0gXCJzdHJpcFwiKSB7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVybmFsIFpvZE9iamVjdCBlcnJvcjogaW52YWxpZCB1bmtub3duS2V5cyB2YWx1ZS5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJ1biBjYXRjaGFsbCB2YWxpZGF0aW9uXG4gICAgICAgICAgICBjb25zdCBjYXRjaGFsbCA9IHRoaXMuX2RlZi5jYXRjaGFsbDtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGV4dHJhS2V5cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY3R4LmRhdGFba2V5XTtcbiAgICAgICAgICAgICAgICBwYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZToga2V5IH0sXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjYXRjaGFsbC5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIHZhbHVlLCBjdHgucGF0aCwga2V5KSAvLywgY3R4LmNoaWxkKGtleSksIHZhbHVlLCBnZXRQYXJzZWRUeXBlKHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBhbHdheXNTZXQ6IGtleSBpbiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN5bmNQYWlycyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBwYWlyLmtleTtcbiAgICAgICAgICAgICAgICAgICAgc3luY1BhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGF3YWl0IHBhaXIudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHdheXNTZXQ6IHBhaXIuYWx3YXlzU2V0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bmNQYWlycztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHN5bmNQYWlycykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5QYXJzZVN0YXR1cy5tZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBzeW5jUGFpcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBzaGFwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zaGFwZSgpO1xuICAgIH1cbiAgICBzdHJpY3QobWVzc2FnZSkge1xuICAgICAgICBlcnJvclV0aWxfMS5lcnJvclV0aWwuZXJyVG9PYmo7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBcInN0cmljdFwiLFxuICAgICAgICAgICAgLi4uKG1lc3NhZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1hcDogKGlzc3VlLCBjdHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRFcnJvciA9IChfYyA9IChfYiA9IChfYSA9IHRoaXMuX2RlZikuZXJyb3JNYXApID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jYWxsKF9hLCBpc3N1ZSwgY3R4KS5tZXNzYWdlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBjdHguZGVmYXVsdEVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzc3VlLmNvZGUgPT09IFwidW5yZWNvZ25pemVkX2tleXNcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAoX2QgPSBlcnJvclV0aWxfMS5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkubWVzc2FnZSkgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogZGVmYXVsdEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZmF1bHRFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RyaXAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXNzdGhyb3VnaCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgdW5rbm93bktleXM6IFwicGFzc3Rocm91Z2hcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGNvbnN0IEF1Z21lbnRGYWN0b3J5ID1cbiAgICAvLyAgIDxEZWYgZXh0ZW5kcyBab2RPYmplY3REZWY+KGRlZjogRGVmKSA9PlxuICAgIC8vICAgPEF1Z21lbnRhdGlvbiBleHRlbmRzIFpvZFJhd1NoYXBlPihcbiAgICAvLyAgICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb25cbiAgICAvLyAgICk6IFpvZE9iamVjdDxcbiAgICAvLyAgICAgZXh0ZW5kU2hhcGU8UmV0dXJuVHlwZTxEZWZbXCJzaGFwZVwiXT4sIEF1Z21lbnRhdGlvbj4sXG4gICAgLy8gICAgIERlZltcInVua25vd25LZXlzXCJdLFxuICAgIC8vICAgICBEZWZbXCJjYXRjaGFsbFwiXVxuICAgIC8vICAgPiA9PiB7XG4gICAgLy8gICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAvLyAgICAgICAuLi5kZWYsXG4gICAgLy8gICAgICAgc2hhcGU6ICgpID0+ICh7XG4gICAgLy8gICAgICAgICAuLi5kZWYuc2hhcGUoKSxcbiAgICAvLyAgICAgICAgIC4uLmF1Z21lbnRhdGlvbixcbiAgICAvLyAgICAgICB9KSxcbiAgICAvLyAgICAgfSkgYXMgYW55O1xuICAgIC8vICAgfTtcbiAgICBleHRlbmQoYXVnbWVudGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5zaGFwZSgpLFxuICAgICAgICAgICAgICAgIC4uLmF1Z21lbnRhdGlvbixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJpb3IgdG8gem9kQDEuMC4xMiB0aGVyZSB3YXMgYSBidWcgaW4gdGhlXG4gICAgICogaW5mZXJyZWQgdHlwZSBvZiBtZXJnZWQgb2JqZWN0cy4gUGxlYXNlXG4gICAgICogdXBncmFkZSBpZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBpc3N1ZXMuXG4gICAgICovXG4gICAgbWVyZ2UobWVyZ2luZykge1xuICAgICAgICBjb25zdCBtZXJnZWQgPSBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgICAgICAgICBjYXRjaGFsbDogbWVyZ2luZy5fZGVmLmNhdGNoYWxsLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksXG4gICAgICAgICAgICAgICAgLi4ubWVyZ2luZy5fZGVmLnNoYXBlKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG4gICAgLy8gbWVyZ2U8XG4gICAgLy8gICBJbmNvbWluZyBleHRlbmRzIEFueVpvZE9iamVjdCxcbiAgICAvLyAgIEF1Z21lbnRhdGlvbiBleHRlbmRzIEluY29taW5nW1wic2hhcGVcIl0sXG4gICAgLy8gICBOZXdPdXRwdXQgZXh0ZW5kcyB7XG4gICAgLy8gICAgIFtrIGluIGtleW9mIEF1Z21lbnRhdGlvbiB8IGtleW9mIE91dHB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9vdXRwdXRcIl1cbiAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBPdXRwdXRcbiAgICAvLyAgICAgICA/IE91dHB1dFtrXVxuICAgIC8vICAgICAgIDogbmV2ZXI7XG4gICAgLy8gICB9LFxuICAgIC8vICAgTmV3SW5wdXQgZXh0ZW5kcyB7XG4gICAgLy8gICAgIFtrIGluIGtleW9mIEF1Z21lbnRhdGlvbiB8IGtleW9mIElucHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX2lucHV0XCJdXG4gICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgSW5wdXRcbiAgICAvLyAgICAgICA/IElucHV0W2tdXG4gICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAvLyAgIH1cbiAgICAvLyA+KFxuICAgIC8vICAgbWVyZ2luZzogSW5jb21pbmdcbiAgICAvLyApOiBab2RPYmplY3Q8XG4gICAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nW1wiX2RlZlwiXVtcInNoYXBlXCJdPj4sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJ1bmtub3duS2V5c1wiXSxcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcImNhdGNoYWxsXCJdLFxuICAgIC8vICAgTmV3T3V0cHV0LFxuICAgIC8vICAgTmV3SW5wdXRcbiAgICAvLyA+IHtcbiAgICAvLyAgIGNvbnN0IG1lcmdlZDogYW55ID0gbmV3IFpvZE9iamVjdCh7XG4gICAgLy8gICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgLy8gICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsXG4gICAgLy8gICAgIHNoYXBlOiAoKSA9PlxuICAgIC8vICAgICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXModGhpcy5fZGVmLnNoYXBlKCksIG1lcmdpbmcuX2RlZi5zaGFwZSgpKSxcbiAgICAvLyAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgLy8gICB9KSBhcyBhbnk7XG4gICAgLy8gICByZXR1cm4gbWVyZ2VkO1xuICAgIC8vIH1cbiAgICBzZXRLZXkoa2V5LCBzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVnbWVudCh7IFtrZXldOiBzY2hlbWEgfSk7XG4gICAgfVxuICAgIC8vIG1lcmdlPEluY29taW5nIGV4dGVuZHMgQW55Wm9kT2JqZWN0PihcbiAgICAvLyAgIG1lcmdpbmc6IEluY29taW5nXG4gICAgLy8gKTogLy9ab2RPYmplY3Q8VCAmIEluY29taW5nW1wiX3NoYXBlXCJdLCBVbmtub3duS2V5cywgQ2F0Y2hhbGw+ID0gKG1lcmdpbmcpID0+IHtcbiAgICAvLyBab2RPYmplY3Q8XG4gICAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nW1wiX2RlZlwiXVtcInNoYXBlXCJdPj4sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJ1bmtub3duS2V5c1wiXSxcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcImNhdGNoYWxsXCJdXG4gICAgLy8gPiB7XG4gICAgLy8gICAvLyBjb25zdCBtZXJnZWRTaGFwZSA9IG9iamVjdFV0aWwubWVyZ2VTaGFwZXMoXG4gICAgLy8gICAvLyAgIHRoaXMuX2RlZi5zaGFwZSgpLFxuICAgIC8vICAgLy8gICBtZXJnaW5nLl9kZWYuc2hhcGUoKVxuICAgIC8vICAgLy8gKTtcbiAgICAvLyAgIGNvbnN0IG1lcmdlZDogYW55ID0gbmV3IFpvZE9iamVjdCh7XG4gICAgLy8gICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgLy8gICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsXG4gICAgLy8gICAgIHNoYXBlOiAoKSA9PlxuICAgIC8vICAgICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXModGhpcy5fZGVmLnNoYXBlKCksIG1lcmdpbmcuX2RlZi5zaGFwZSgpKSxcbiAgICAvLyAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgLy8gICB9KSBhcyBhbnk7XG4gICAgLy8gICByZXR1cm4gbWVyZ2VkO1xuICAgIC8vIH1cbiAgICBjYXRjaGFsbChpbmRleCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjYXRjaGFsbDogaW5kZXgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwaWNrKG1hc2spIHtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB7fTtcbiAgICAgICAgdXRpbF8xLnV0aWwub2JqZWN0S2V5cyhtYXNrKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmIChtYXNrW2tleV0gJiYgdGhpcy5zaGFwZVtrZXldKSB7XG4gICAgICAgICAgICAgICAgc2hhcGVba2V5XSA9IHRoaXMuc2hhcGVba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG9taXQobWFzaykge1xuICAgICAgICBjb25zdCBzaGFwZSA9IHt9O1xuICAgICAgICB1dGlsXzEudXRpbC5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFtYXNrW2tleV0pIHtcbiAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBkZWVwUGFydGlhbCgpIHtcbiAgICAgICAgcmV0dXJuIGRlZXBQYXJ0aWFsaWZ5KHRoaXMpO1xuICAgIH1cbiAgICBwYXJ0aWFsKG1hc2spIHtcbiAgICAgICAgY29uc3QgbmV3U2hhcGUgPSB7fTtcbiAgICAgICAgdXRpbF8xLnV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkU2NoZW1hID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgaWYgKG1hc2sgJiYgIW1hc2tba2V5XSkge1xuICAgICAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBmaWVsZFNjaGVtYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSBmaWVsZFNjaGVtYS5vcHRpb25hbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVxdWlyZWQobWFzaykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IHt9O1xuICAgICAgICB1dGlsXzEudXRpbC5vYmplY3RLZXlzKHRoaXMuc2hhcGUpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaWYgKG1hc2sgJiYgIW1hc2tba2V5XSkge1xuICAgICAgICAgICAgICAgIG5ld1NoYXBlW2tleV0gPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFNjaGVtYSA9IHRoaXMuc2hhcGVba2V5XTtcbiAgICAgICAgICAgICAgICBsZXQgbmV3RmllbGQgPSBmaWVsZFNjaGVtYTtcbiAgICAgICAgICAgICAgICB3aGlsZSAobmV3RmllbGQgaW5zdGFuY2VvZiBab2RPcHRpb25hbCkge1xuICAgICAgICAgICAgICAgICAgICBuZXdGaWVsZCA9IG5ld0ZpZWxkLl9kZWYuaW5uZXJUeXBlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gbmV3RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gbmV3U2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBrZXlvZigpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZVpvZEVudW0odXRpbF8xLnV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSk7XG4gICAgfVxufVxuZXhwb3J0cy5ab2RPYmplY3QgPSBab2RPYmplY3Q7XG5ab2RPYmplY3QuY3JlYXRlID0gKHNoYXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgdW5rbm93bktleXM6IFwic3RyaXBcIixcbiAgICAgICAgY2F0Y2hhbGw6IFpvZE5ldmVyLmNyZWF0ZSgpLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcblpvZE9iamVjdC5zdHJpY3RDcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB1bmtub3duS2V5czogXCJzdHJpY3RcIixcbiAgICAgICAgY2F0Y2hhbGw6IFpvZE5ldmVyLmNyZWF0ZSgpLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcblpvZE9iamVjdC5sYXp5Y3JlYXRlID0gKHNoYXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgIHNoYXBlLFxuICAgICAgICB1bmtub3duS2V5czogXCJzdHJpcFwiLFxuICAgICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kVW5pb24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9kZWYub3B0aW9ucztcbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUmVzdWx0cyhyZXN1bHRzKSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gZmlyc3QgaXNzdWUtZnJlZSB2YWxpZGF0aW9uIGlmIGl0IGV4aXN0c1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgaXNzdWVzIGZyb20gZGlydHkgb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goLi4ucmVzdWx0LmN0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmV0dXJuIGludmFsaWRcbiAgICAgICAgICAgIGNvbnN0IHVuaW9uRXJyb3JzID0gcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gbmV3IFpvZEVycm9yXzEuWm9kRXJyb3IocmVzdWx0LmN0eC5jb21tb24uaXNzdWVzKSk7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb24sXG4gICAgICAgICAgICAgICAgdW5pb25FcnJvcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwob3B0aW9ucy5tYXAoYXN5bmMgKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkQ3R4ID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jdHgsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3R4LmNvbW1vbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogYXdhaXQgb3B0aW9uLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGNoaWxkQ3R4LFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgY3R4OiBjaGlsZEN0eCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkpLnRoZW4oaGFuZGxlUmVzdWx0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZGlydHkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBpc3N1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEN0eCA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb24uX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjaGlsZEN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIiAmJiAhZGlydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlydHkgPSB7IHJlc3VsdCwgY3R4OiBjaGlsZEN0eCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRDdHguY29tbW9uLmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzLnB1c2goY2hpbGRDdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRpcnR5KSB7XG4gICAgICAgICAgICAgICAgY3R4LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5kaXJ0eS5jdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpcnR5LnJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHVuaW9uRXJyb3JzID0gaXNzdWVzLm1hcCgoaXNzdWVzKSA9PiBuZXcgWm9kRXJyb3JfMS5ab2RFcnJvcihpc3N1ZXMpKTtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbixcbiAgICAgICAgICAgICAgICB1bmlvbkVycm9ycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9ucztcbiAgICB9XG59XG5leHBvcnRzLlpvZFVuaW9uID0gWm9kVW5pb247XG5ab2RVbmlvbi5jcmVhdGUgPSAodHlwZXMsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVW5pb24oe1xuICAgICAgICBvcHRpb25zOiB0eXBlcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RVbmlvbixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy9cbi8vLy8vLy8vLy8gICAgICBab2REaXNjcmltaW5hdGVkVW5pb24gICAgICAvLy8vLy8vLy8vXG4vLy8vLy8vLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5jb25zdCBnZXREaXNjcmltaW5hdG9yID0gKHR5cGUpID0+IHtcbiAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZExhenkpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5zY2hlbWEpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kRWZmZWN0cykge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLmlubmVyVHlwZSgpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZExpdGVyYWwpIHtcbiAgICAgICAgcmV0dXJuIFt0eXBlLnZhbHVlXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZEVudW0pIHtcbiAgICAgICAgcmV0dXJuIHR5cGUub3B0aW9ucztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZE5hdGl2ZUVudW0pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGJhbi9iYW5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHR5cGUuZW51bSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2REZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUuX2RlZi5pbm5lclR5cGUpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kVW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbdW5kZWZpbmVkXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZE51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtudWxsXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn07XG5jbGFzcyBab2REaXNjcmltaW5hdGVkVW5pb24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbF8xLlpvZFBhcnNlZFR5cGUub2JqZWN0LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlzY3JpbWluYXRvciA9IHRoaXMuZGlzY3JpbWluYXRvcjtcbiAgICAgICAgY29uc3QgZGlzY3JpbWluYXRvclZhbHVlID0gY3R4LmRhdGFbZGlzY3JpbWluYXRvcl07XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMub3B0aW9uc01hcC5nZXQoZGlzY3JpbWluYXRvclZhbHVlKTtcbiAgICAgICAgaWYgKCFvcHRpb24pIHtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IEFycmF5LmZyb20odGhpcy5vcHRpb25zTWFwLmtleXMoKSksXG4gICAgICAgICAgICAgICAgcGF0aDogW2Rpc2NyaW1pbmF0b3JdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24uX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgZGlzY3JpbWluYXRvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5kaXNjcmltaW5hdG9yO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zO1xuICAgIH1cbiAgICBnZXQgb3B0aW9uc01hcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zTWFwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhlIGRpc2NyaW1pbmF0ZWQgdW5pb24gc2NoZW1hLiBJdHMgYmVoYXZpb3VyIGlzIHZlcnkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSBub3JtYWwgei51bmlvbigpIGNvbnN0cnVjdG9yLlxuICAgICAqIEhvd2V2ZXIsIGl0IG9ubHkgYWxsb3dzIGEgdW5pb24gb2Ygb2JqZWN0cywgYWxsIG9mIHdoaWNoIG5lZWQgdG8gc2hhcmUgYSBkaXNjcmltaW5hdG9yIHByb3BlcnR5LiBUaGlzIHByb3BlcnR5IG11c3RcbiAgICAgKiBoYXZlIGEgZGlmZmVyZW50IHZhbHVlIGZvciBlYWNoIG9iamVjdCBpbiB0aGUgdW5pb24uXG4gICAgICogQHBhcmFtIGRpc2NyaW1pbmF0b3IgdGhlIG5hbWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgcHJvcGVydHlcbiAgICAgKiBAcGFyYW0gdHlwZXMgYW4gYXJyYXkgb2Ygb2JqZWN0IHNjaGVtYXNcbiAgICAgKiBAcGFyYW0gcGFyYW1zXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShkaXNjcmltaW5hdG9yLCBvcHRpb25zLCBwYXJhbXMpIHtcbiAgICAgICAgLy8gR2V0IGFsbCB0aGUgdmFsaWQgZGlzY3JpbWluYXRvciB2YWx1ZXNcbiAgICAgICAgY29uc3Qgb3B0aW9uc01hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgLy8gdHJ5IHtcbiAgICAgICAgZm9yIChjb25zdCB0eXBlIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGRpc2NyaW1pbmF0b3JWYWx1ZXMgPSBnZXREaXNjcmltaW5hdG9yKHR5cGUuc2hhcGVbZGlzY3JpbWluYXRvcl0pO1xuICAgICAgICAgICAgaWYgKCFkaXNjcmltaW5hdG9yVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBIGRpc2NyaW1pbmF0b3IgdmFsdWUgZm9yIGtleSBcXGAke2Rpc2NyaW1pbmF0b3J9XFxgIGNvdWxkIG5vdCBiZSBleHRyYWN0ZWQgZnJvbSBhbGwgc2NoZW1hIG9wdGlvbnNgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgZGlzY3JpbWluYXRvclZhbHVlcykge1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zTWFwLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaXNjcmltaW5hdG9yIHByb3BlcnR5ICR7U3RyaW5nKGRpc2NyaW1pbmF0b3IpfSBoYXMgZHVwbGljYXRlIHZhbHVlICR7U3RyaW5nKHZhbHVlKX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb3B0aW9uc01hcC5zZXQodmFsdWUsIHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kRGlzY3JpbWluYXRlZFVuaW9uKHtcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGlzY3JpbWluYXRlZFVuaW9uLFxuICAgICAgICAgICAgZGlzY3JpbWluYXRvcixcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBvcHRpb25zTWFwLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnRzLlpvZERpc2NyaW1pbmF0ZWRVbmlvbiA9IFpvZERpc2NyaW1pbmF0ZWRVbmlvbjtcbmZ1bmN0aW9uIG1lcmdlVmFsdWVzKGEsIGIpIHtcbiAgICBjb25zdCBhVHlwZSA9ICgwLCB1dGlsXzEuZ2V0UGFyc2VkVHlwZSkoYSk7XG4gICAgY29uc3QgYlR5cGUgPSAoMCwgdXRpbF8xLmdldFBhcnNlZFR5cGUpKGIpO1xuICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBkYXRhOiBhIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGFUeXBlID09PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5vYmplY3QgJiYgYlR5cGUgPT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICBjb25zdCBiS2V5cyA9IHV0aWxfMS51dGlsLm9iamVjdEtleXMoYik7XG4gICAgICAgIGNvbnN0IHNoYXJlZEtleXMgPSB1dGlsXzEudXRpbFxuICAgICAgICAgICAgLm9iamVjdEtleXMoYSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGtleSkgPT4gYktleXMuaW5kZXhPZihrZXkpICE9PSAtMSk7XG4gICAgICAgIGNvbnN0IG5ld09iaiA9IHsgLi4uYSwgLi4uYiB9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBzaGFyZWRLZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBzaGFyZWRWYWx1ZSA9IG1lcmdlVmFsdWVzKGFba2V5XSwgYltrZXldKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkVmFsdWUudmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld09ialtrZXldID0gc2hhcmVkVmFsdWUuZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogbmV3T2JqIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGFUeXBlID09PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5hcnJheSAmJiBiVHlwZSA9PT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUuYXJyYXkpIHtcbiAgICAgICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3QXJyYXkgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGEubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtQSA9IGFbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgaXRlbUIgPSBiW2luZGV4XTtcbiAgICAgICAgICAgIGNvbnN0IHNoYXJlZFZhbHVlID0gbWVyZ2VWYWx1ZXMoaXRlbUEsIGl0ZW1CKTtcbiAgICAgICAgICAgIGlmICghc2hhcmVkVmFsdWUudmFsaWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5ld0FycmF5LnB1c2goc2hhcmVkVmFsdWUuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IG5ld0FycmF5IH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGFUeXBlID09PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5kYXRlICYmXG4gICAgICAgIGJUeXBlID09PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5kYXRlICYmXG4gICAgICAgICthID09PSArYikge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogYSB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgfVxufVxuY2xhc3MgWm9kSW50ZXJzZWN0aW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGhhbmRsZVBhcnNlZCA9IChwYXJzZWRMZWZ0LCBwYXJzZWRSaWdodCkgPT4ge1xuICAgICAgICAgICAgaWYgKCgwLCBwYXJzZVV0aWxfMS5pc0Fib3J0ZWQpKHBhcnNlZExlZnQpIHx8ICgwLCBwYXJzZVV0aWxfMS5pc0Fib3J0ZWQpKHBhcnNlZFJpZ2h0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VWYWx1ZXMocGFyc2VkTGVmdC52YWx1ZSwgcGFyc2VkUmlnaHQudmFsdWUpO1xuICAgICAgICAgICAgaWYgKCFtZXJnZWQudmFsaWQpIHtcbiAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlcyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoMCwgcGFyc2VVdGlsXzEuaXNEaXJ0eSkocGFyc2VkTGVmdCkgfHwgKDAsIHBhcnNlVXRpbF8xLmlzRGlydHkpKHBhcnNlZFJpZ2h0KSkge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBtZXJnZWQuZGF0YSB9O1xuICAgICAgICB9O1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWYubGVmdC5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVmLnJpZ2h0Ll9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIF0pLnRoZW4oKFtsZWZ0LCByaWdodF0pID0+IGhhbmRsZVBhcnNlZChsZWZ0LCByaWdodCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVBhcnNlZCh0aGlzLl9kZWYubGVmdC5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgIH0pLCB0aGlzLl9kZWYucmlnaHQuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLlpvZEludGVyc2VjdGlvbiA9IFpvZEludGVyc2VjdGlvbjtcblpvZEludGVyc2VjdGlvbi5jcmVhdGUgPSAobGVmdCwgcmlnaHQsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kSW50ZXJzZWN0aW9uKHtcbiAgICAgICAgbGVmdDogbGVmdCxcbiAgICAgICAgcmlnaHQ6IHJpZ2h0LFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEludGVyc2VjdGlvbixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFR1cGxlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUuYXJyYXkpIHtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsXzEuWm9kUGFyc2VkVHlwZS5hcnJheSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguZGF0YS5sZW5ndGggPCB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICBtaW5pbXVtOiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN0ID0gdGhpcy5fZGVmLnJlc3Q7XG4gICAgICAgIGlmICghcmVzdCAmJiBjdHguZGF0YS5sZW5ndGggPiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgbWF4aW11bTogdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBbLi4uY3R4LmRhdGFdXG4gICAgICAgICAgICAubWFwKChpdGVtLCBpdGVtSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuX2RlZi5pdGVtc1tpdGVtSW5kZXhdIHx8IHRoaXMuX2RlZi5yZXN0O1xuICAgICAgICAgICAgaWYgKCFzY2hlbWEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGl0ZW1JbmRleCkpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcigoeCkgPT4gISF4KTsgLy8gZmlsdGVyIG51bGxzXG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoaXRlbXMpLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIGl0ZW1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXRlbXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaXRlbXM7XG4gICAgfVxuICAgIHJlc3QocmVzdCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFR1cGxlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHJlc3QsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kVHVwbGUgPSBab2RUdXBsZTtcblpvZFR1cGxlLmNyZWF0ZSA9IChzY2hlbWFzLCBwYXJhbXMpID0+IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3QgcGFzcyBhbiBhcnJheSBvZiBzY2hlbWFzIHRvIHoudHVwbGUoWyAuLi4gXSlcIik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgWm9kVHVwbGUoe1xuICAgICAgICBpdGVtczogc2NoZW1hcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RUdXBsZSxcbiAgICAgICAgcmVzdDogbnVsbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFJlY29yZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIGdldCBrZXlTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYua2V5VHlwZTtcbiAgICB9XG4gICAgZ2V0IHZhbHVlU2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbF8xLlpvZFBhcnNlZFR5cGUub2JqZWN0LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFpcnMgPSBbXTtcbiAgICAgICAgY29uc3Qga2V5VHlwZSA9IHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBjdHguZGF0YSkge1xuICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiBrZXlUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwga2V5LCBjdHgucGF0aCwga2V5KSksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlVHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGN0eC5kYXRhW2tleV0sIGN0eC5wYXRoLCBrZXkpKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RBc3luYyhzdGF0dXMsIHBhaXJzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5QYXJzZVN0YXR1cy5tZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBwYWlycyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlKGZpcnN0LCBzZWNvbmQsIHRoaXJkKSB7XG4gICAgICAgIGlmIChzZWNvbmQgaW5zdGFuY2VvZiBab2RUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFpvZFJlY29yZCh7XG4gICAgICAgICAgICAgICAga2V5VHlwZTogZmlyc3QsXG4gICAgICAgICAgICAgICAgdmFsdWVUeXBlOiBzZWNvbmQsXG4gICAgICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RSZWNvcmQsXG4gICAgICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlyZCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFpvZFJlY29yZCh7XG4gICAgICAgICAgICBrZXlUeXBlOiBab2RTdHJpbmcuY3JlYXRlKCksXG4gICAgICAgICAgICB2YWx1ZVR5cGU6IGZpcnN0LFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RSZWNvcmQsXG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHNlY29uZCksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kUmVjb3JkID0gWm9kUmVjb3JkO1xuY2xhc3MgWm9kTWFwIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgZ2V0IGtleVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgIH1cbiAgICBnZXQgdmFsdWVTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5tYXApIHtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsXzEuWm9kUGFyc2VkVHlwZS5tYXAsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlUeXBlID0gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgICAgIGNvbnN0IHBhaXJzID0gWy4uLmN0eC5kYXRhLmVudHJpZXMoKV0ubWFwKChba2V5LCB2YWx1ZV0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGtleToga2V5VHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGtleSwgY3R4LnBhdGgsIFtpbmRleCwgXCJrZXlcIl0pKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgdmFsdWUsIGN0eC5wYXRoLCBbaW5kZXgsIFwidmFsdWVcIl0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgY29uc3QgZmluYWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBhaXIudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImFib3J0ZWRcIiB8fCB2YWx1ZS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJkaXJ0eVwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbE1hcC5zZXQoa2V5LnZhbHVlLCB2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmluYWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBwYWlyLmtleTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhaXIudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImRpcnR5XCIgfHwgdmFsdWUuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsTWFwLnNldChrZXkudmFsdWUsIHZhbHVlLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuWm9kTWFwID0gWm9kTWFwO1xuWm9kTWFwLmNyZWF0ZSA9IChrZXlUeXBlLCB2YWx1ZVR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTWFwKHtcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgICBrZXlUeXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE1hcCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZFNldCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLnNldCkge1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLnNldCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRlZiA9IHRoaXMuX2RlZjtcbiAgICAgICAgaWYgKGRlZi5taW5TaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmRhdGEuc2l6ZSA8IGRlZi5taW5TaXplLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBkZWYubWluU2l6ZS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5taW5TaXplLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5tYXhTaXplICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmRhdGEuc2l6ZSA+IGRlZi5tYXhTaXplLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heFNpemUudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYubWF4U2l6ZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgICAgIGZ1bmN0aW9uIGZpbmFsaXplU2V0KGVsZW1lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgcGFyc2VkU2V0LmFkZChlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogcGFyc2VkU2V0IH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBbLi4uY3R4LmRhdGEudmFsdWVzKCldLm1hcCgoaXRlbSwgaSkgPT4gdmFsdWVUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGkpKSk7XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZWxlbWVudHMpLnRoZW4oKGVsZW1lbnRzKSA9PiBmaW5hbGl6ZVNldChlbGVtZW50cykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmFsaXplU2V0KGVsZW1lbnRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtaW4obWluU2l6ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFNldCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBtaW5TaXplOiB7IHZhbHVlOiBtaW5TaXplLCBtZXNzYWdlOiBlcnJvclV0aWxfMS5lcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1heChtYXhTaXplLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU2V0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1heFNpemU6IHsgdmFsdWU6IG1heFNpemUsIG1lc3NhZ2U6IGVycm9yVXRpbF8xLmVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2l6ZShzaXplLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbihzaXplLCBtZXNzYWdlKS5tYXgoc2l6ZSwgbWVzc2FnZSk7XG4gICAgfVxuICAgIG5vbmVtcHR5KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKDEsIG1lc3NhZ2UpO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kU2V0ID0gWm9kU2V0O1xuWm9kU2V0LmNyZWF0ZSA9ICh2YWx1ZVR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kU2V0KHtcbiAgICAgICAgdmFsdWVUeXBlLFxuICAgICAgICBtaW5TaXplOiBudWxsLFxuICAgICAgICBtYXhTaXplOiBudWxsLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFNldCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZEZ1bmN0aW9uIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudmFsaWRhdGUgPSB0aGlzLmltcGxlbWVudDtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLmZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbF8xLlpvZFBhcnNlZFR5cGUuZnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYWtlQXJnc0lzc3VlKGFyZ3MsIGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLm1ha2VJc3N1ZSkoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGFyZ3MsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3JNYXBzOiBbXG4gICAgICAgICAgICAgICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgICAgICAgICBjdHguc2NoZW1hRXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgICAgICgwLCBlcnJvcnNfMS5nZXRFcnJvck1hcCkoKSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzXzEuZGVmYXVsdEVycm9yTWFwLFxuICAgICAgICAgICAgICAgIF0uZmlsdGVyKCh4KSA9PiAhIXgpLFxuICAgICAgICAgICAgICAgIGlzc3VlRGF0YToge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX2FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzRXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYWtlUmV0dXJuc0lzc3VlKHJldHVybnMsIGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLm1ha2VJc3N1ZSkoe1xuICAgICAgICAgICAgICAgIGRhdGE6IHJldHVybnMsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3JNYXBzOiBbXG4gICAgICAgICAgICAgICAgICAgIGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgICAgICAgICBjdHguc2NoZW1hRXJyb3JNYXAsXG4gICAgICAgICAgICAgICAgICAgICgwLCBlcnJvcnNfMS5nZXRFcnJvck1hcCkoKSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzXzEuZGVmYXVsdEVycm9yTWFwLFxuICAgICAgICAgICAgICAgIF0uZmlsdGVyKCh4KSA9PiAhIXgpLFxuICAgICAgICAgICAgICAgIGlzc3VlRGF0YToge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3JldHVybl90eXBlLFxuICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlRXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7IGVycm9yTWFwOiBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCB9O1xuICAgICAgICBjb25zdCBmbiA9IGN0eC5kYXRhO1xuICAgICAgICBpZiAodGhpcy5fZGVmLnJldHVybnMgaW5zdGFuY2VvZiBab2RQcm9taXNlKSB7XG4gICAgICAgICAgICAvLyBXb3VsZCBsb3ZlIGEgd2F5IHRvIGF2b2lkIGRpc2FibGluZyB0aGlzIHJ1bGUsIGJ1dCB3ZSBuZWVkXG4gICAgICAgICAgICAvLyBhbiBhbGlhcyAodXNpbmcgYW4gYXJyb3cgZnVuY3Rpb24gd2FzIHdoYXQgY2F1c2VkIDI2NTEpLlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgICAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLk9LKShhc3luYyBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFpvZEVycm9yXzEuWm9kRXJyb3IoW10pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBhd2FpdCBtZS5fZGVmLmFyZ3NcbiAgICAgICAgICAgICAgICAgICAgLnBhcnNlQXN5bmMoYXJncywgcGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuYWRkSXNzdWUobWFrZUFyZ3NJc3N1ZShhcmdzLCBlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFJlZmxlY3QuYXBwbHkoZm4sIHRoaXMsIHBhcnNlZEFyZ3MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFJldHVybnMgPSBhd2FpdCBtZS5fZGVmLnJldHVybnMuX2RlZi50eXBlXG4gICAgICAgICAgICAgICAgICAgIC5wYXJzZUFzeW5jKHJlc3VsdCwgcGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IuYWRkSXNzdWUobWFrZVJldHVybnNJc3N1ZShyZXN1bHQsIGUpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlZFJldHVybnM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdvdWxkIGxvdmUgYSB3YXkgdG8gYXZvaWQgZGlzYWJsaW5nIHRoaXMgcnVsZSwgYnV0IHdlIG5lZWRcbiAgICAgICAgICAgIC8vIGFuIGFsaWFzICh1c2luZyBhbiBhcnJvdyBmdW5jdGlvbiB3YXMgd2hhdCBjYXVzZWQgMjY1MSkuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgICAgICAgIGNvbnN0IG1lID0gdGhpcztcbiAgICAgICAgICAgIHJldHVybiAoMCwgcGFyc2VVdGlsXzEuT0spKGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkQXJncyA9IG1lLl9kZWYuYXJncy5zYWZlUGFyc2UoYXJncywgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZEFyZ3Muc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWm9kRXJyb3JfMS5ab2RFcnJvcihbbWFrZUFyZ3NJc3N1ZShhcmdzLCBwYXJzZWRBcmdzLmVycm9yKV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmFwcGx5KGZuLCB0aGlzLCBwYXJzZWRBcmdzLmRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFJldHVybnMgPSBtZS5fZGVmLnJldHVybnMuc2FmZVBhcnNlKHJlc3VsdCwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZFJldHVybnMuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWm9kRXJyb3JfMS5ab2RFcnJvcihbbWFrZVJldHVybnNJc3N1ZShyZXN1bHQsIHBhcnNlZFJldHVybnMuZXJyb3IpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRSZXR1cm5zLmRhdGE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYXJhbWV0ZXJzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmFyZ3M7XG4gICAgfVxuICAgIHJldHVyblR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYucmV0dXJucztcbiAgICB9XG4gICAgYXJncyguLi5pdGVtcykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEZ1bmN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGFyZ3M6IFpvZFR1cGxlLmNyZWF0ZShpdGVtcykucmVzdChab2RVbmtub3duLmNyZWF0ZSgpKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybnMocmV0dXJuVHlwZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEZ1bmN0aW9uKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHJldHVybnM6IHJldHVyblR5cGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbXBsZW1lbnQoZnVuYykge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRGdW5jID0gdGhpcy5wYXJzZShmdW5jKTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlZEZ1bmM7XG4gICAgfVxuICAgIHN0cmljdEltcGxlbWVudChmdW5jKSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlZEZ1bmMgPSB0aGlzLnBhcnNlKGZ1bmMpO1xuICAgICAgICByZXR1cm4gdmFsaWRhdGVkRnVuYztcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShhcmdzLCByZXR1cm5zLCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgICAgICBhcmdzOiAoYXJnc1xuICAgICAgICAgICAgICAgID8gYXJnc1xuICAgICAgICAgICAgICAgIDogWm9kVHVwbGUuY3JlYXRlKFtdKS5yZXN0KFpvZFVua25vd24uY3JlYXRlKCkpKSxcbiAgICAgICAgICAgIHJldHVybnM6IHJldHVybnMgfHwgWm9kVW5rbm93bi5jcmVhdGUoKSxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRnVuY3Rpb24sXG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kRnVuY3Rpb24gPSBab2RGdW5jdGlvbjtcbmNsYXNzIFpvZExhenkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBnZXQgc2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmdldHRlcigpO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IGxhenlTY2hlbWEgPSB0aGlzLl9kZWYuZ2V0dGVyKCk7XG4gICAgICAgIHJldHVybiBsYXp5U2NoZW1hLl9wYXJzZSh7IGRhdGE6IGN0eC5kYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSk7XG4gICAgfVxufVxuZXhwb3J0cy5ab2RMYXp5ID0gWm9kTGF6eTtcblpvZExhenkuY3JlYXRlID0gKGdldHRlciwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RMYXp5KHtcbiAgICAgICAgZ2V0dGVyOiBnZXR0ZXIsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTGF6eSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZExpdGVyYWwgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlucHV0LmRhdGEgIT09IHRoaXMuX2RlZi52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9saXRlcmFsLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB0aGlzLl9kZWYudmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWU7XG4gICAgfVxufVxuZXhwb3J0cy5ab2RMaXRlcmFsID0gWm9kTGl0ZXJhbDtcblpvZExpdGVyYWwuY3JlYXRlID0gKHZhbHVlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZExpdGVyYWwoe1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTGl0ZXJhbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmZ1bmN0aW9uIGNyZWF0ZVpvZEVudW0odmFsdWVzLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFpvZEVudW0oe1xuICAgICAgICB2YWx1ZXMsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRW51bSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufVxuY2xhc3MgWm9kRW51bSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0LmRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdGhpcy5fZGVmLnZhbHVlcztcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS51dGlsLmpvaW5WYWx1ZXMoZXhwZWN0ZWRWYWx1ZXMpLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kZWYudmFsdWVzLmluZGV4T2YoaW5wdXQuZGF0YSkgPT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBjb25zdCBleHBlY3RlZFZhbHVlcyA9IHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX2VudW1fdmFsdWUsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogZXhwZWN0ZWRWYWx1ZXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoMCwgcGFyc2VVdGlsXzEuT0spKGlucHV0LmRhdGEpO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZXM7XG4gICAgfVxuICAgIGdldCBlbnVtKCkge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuX2RlZi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGVudW1WYWx1ZXNbdmFsXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW51bVZhbHVlcztcbiAgICB9XG4gICAgZ2V0IFZhbHVlcygpIHtcbiAgICAgICAgY29uc3QgZW51bVZhbHVlcyA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLl9kZWYudmFsdWVzKSB7XG4gICAgICAgICAgICBlbnVtVmFsdWVzW3ZhbF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudW1WYWx1ZXM7XG4gICAgfVxuICAgIGdldCBFbnVtKCkge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuX2RlZi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGVudW1WYWx1ZXNbdmFsXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW51bVZhbHVlcztcbiAgICB9XG4gICAgZXh0cmFjdCh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFpvZEVudW0uY3JlYXRlKHZhbHVlcyk7XG4gICAgfVxuICAgIGV4Y2x1ZGUodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBab2RFbnVtLmNyZWF0ZSh0aGlzLm9wdGlvbnMuZmlsdGVyKChvcHQpID0+ICF2YWx1ZXMuaW5jbHVkZXMob3B0KSkpO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kRW51bSA9IFpvZEVudW07XG5ab2RFbnVtLmNyZWF0ZSA9IGNyZWF0ZVpvZEVudW07XG5jbGFzcyBab2ROYXRpdmVFbnVtIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IG5hdGl2ZUVudW1WYWx1ZXMgPSB1dGlsXzEudXRpbC5nZXRWYWxpZEVudW1WYWx1ZXModGhpcy5fZGVmLnZhbHVlcyk7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5zdHJpbmcgJiZcbiAgICAgICAgICAgIGN0eC5wYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5udW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdXRpbF8xLnV0aWwub2JqZWN0VmFsdWVzKG5hdGl2ZUVudW1WYWx1ZXMpO1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbF8xLnV0aWwuam9pblZhbHVlcyhleHBlY3RlZFZhbHVlcyksXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgICAgIGNvZGU6IFpvZEVycm9yXzEuWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdGl2ZUVudW1WYWx1ZXMuaW5kZXhPZihpbnB1dC5kYXRhKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdXRpbF8xLnV0aWwub2JqZWN0VmFsdWVzKG5hdGl2ZUVudW1WYWx1ZXMpO1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF9lbnVtX3ZhbHVlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGV4cGVjdGVkVmFsdWVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLk9LKShpbnB1dC5kYXRhKTtcbiAgICB9XG4gICAgZ2V0IGVudW0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVzO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kTmF0aXZlRW51bSA9IFpvZE5hdGl2ZUVudW07XG5ab2ROYXRpdmVFbnVtLmNyZWF0ZSA9ICh2YWx1ZXMsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmF0aXZlRW51bSh7XG4gICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5hdGl2ZUVudW0sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5jbGFzcyBab2RQcm9taXNlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5wcm9taXNlICYmXG4gICAgICAgICAgICBjdHguY29tbW9uLmFzeW5jID09PSBmYWxzZSkge1xuICAgICAgICAgICAgKDAsIHBhcnNlVXRpbF8xLmFkZElzc3VlVG9Db250ZXh0KShjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RFcnJvcl8xLlpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IHV0aWxfMS5ab2RQYXJzZWRUeXBlLnByb21pc2UsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9taXNpZmllZCA9IGN0eC5wYXJzZWRUeXBlID09PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5wcm9taXNlXG4gICAgICAgICAgICA/IGN0eC5kYXRhXG4gICAgICAgICAgICA6IFByb21pc2UucmVzb2x2ZShjdHguZGF0YSk7XG4gICAgICAgIHJldHVybiAoMCwgcGFyc2VVdGlsXzEuT0spKHByb21pc2lmaWVkLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZS5wYXJzZUFzeW5jKGRhdGEsIHtcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBlcnJvck1hcDogY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kUHJvbWlzZSA9IFpvZFByb21pc2U7XG5ab2RQcm9taXNlLmNyZWF0ZSA9IChzY2hlbWEsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kUHJvbWlzZSh7XG4gICAgICAgIHR5cGU6IHNjaGVtYSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RQcm9taXNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kRWZmZWN0cyBleHRlbmRzIFpvZFR5cGUge1xuICAgIGlubmVyVHlwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWE7XG4gICAgfVxuICAgIHNvdXJjZVR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9kZWYudHlwZU5hbWUgPT09IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzXG4gICAgICAgICAgICA/IHRoaXMuX2RlZi5zY2hlbWEuc291cmNlVHlwZSgpXG4gICAgICAgICAgICA6IHRoaXMuX2RlZi5zY2hlbWE7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBlZmZlY3QgPSB0aGlzLl9kZWYuZWZmZWN0IHx8IG51bGw7XG4gICAgICAgIGNvbnN0IGNoZWNrQ3R4ID0ge1xuICAgICAgICAgICAgYWRkSXNzdWU6IChhcmcpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgcGFyc2VVdGlsXzEuYWRkSXNzdWVUb0NvbnRleHQpKGN0eCwgYXJnKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJnLmZhdGFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5hYm9ydCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBwYXRoKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdHgucGF0aDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNoZWNrQ3R4LmFkZElzc3VlID0gY2hlY2tDdHguYWRkSXNzdWUuYmluZChjaGVja0N0eCk7XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJwcmVwcm9jZXNzXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NlZCA9IGVmZmVjdC50cmFuc2Zvcm0oY3R4LmRhdGEsIGNoZWNrQ3R4KTtcbiAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwiZGlydHlcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocHJvY2Vzc2VkKS50aGVuKChwcm9jZXNzZWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcHJvY2Vzc2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogcHJvY2Vzc2VkLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVmZmVjdC50eXBlID09PSBcInJlZmluZW1lbnRcIikge1xuICAgICAgICAgICAgY29uc3QgZXhlY3V0ZVJlZmluZW1lbnQgPSAoYWNjXG4gICAgICAgICAgICAvLyBlZmZlY3Q6IFJlZmluZW1lbnRFZmZlY3Q8YW55PlxuICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZWZmZWN0LnJlZmluZW1lbnQoYWNjLCBjaGVja0N0eCk7XG4gICAgICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBc3luYyByZWZpbmVtZW50IGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbm5lciA9IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZVV0aWxfMS5JTlZBTElEO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgLy8gcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWRcbiAgICAgICAgICAgICAgICBleGVjdXRlUmVmaW5lbWVudChpbm5lci52YWx1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbm5lci52YWx1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWFcbiAgICAgICAgICAgICAgICAgICAgLl9wYXJzZUFzeW5jKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoaW5uZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRlUmVmaW5lbWVudChpbm5lci52YWx1ZSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlubmVyLnZhbHVlIH07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIikge1xuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFzZSA9IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCEoMCwgcGFyc2VVdGlsXzEuaXNWYWxpZCkoYmFzZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGVmZmVjdC50cmFuc2Zvcm0oYmFzZS52YWx1ZSwgY2hlY2tDdHgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXN5bmNocm9ub3VzIHRyYW5zZm9ybSBlbmNvdW50ZXJlZCBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2Ugb3BlcmF0aW9uLiBVc2UgLnBhcnNlQXN5bmMgaW5zdGVhZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiByZXN1bHQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hXG4gICAgICAgICAgICAgICAgICAgIC5fcGFyc2VBc3luYyh7IGRhdGE6IGN0eC5kYXRhLCBwYXRoOiBjdHgucGF0aCwgcGFyZW50OiBjdHggfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGJhc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoMCwgcGFyc2VVdGlsXzEuaXNWYWxpZCkoYmFzZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlZmZlY3QudHJhbnNmb3JtKGJhc2UudmFsdWUsIGNoZWNrQ3R4KSkudGhlbigocmVzdWx0KSA9PiAoeyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IHJlc3VsdCB9KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdXRpbF8xLnV0aWwuYXNzZXJ0TmV2ZXIoZWZmZWN0KTtcbiAgICB9XG59XG5leHBvcnRzLlpvZEVmZmVjdHMgPSBab2RFZmZlY3RzO1xuZXhwb3J0cy5ab2RUcmFuc2Zvcm1lciA9IFpvZEVmZmVjdHM7XG5ab2RFZmZlY3RzLmNyZWF0ZSA9IChzY2hlbWEsIGVmZmVjdCwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gICAgICAgIGVmZmVjdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcblpvZEVmZmVjdHMuY3JlYXRlV2l0aFByZXByb2Nlc3MgPSAocHJlcHJvY2Vzcywgc2NoZW1hLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICBzY2hlbWEsXG4gICAgICAgIGVmZmVjdDogeyB0eXBlOiBcInByZXByb2Nlc3NcIiwgdHJhbnNmb3JtOiBwcmVwcm9jZXNzIH0sXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cyxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE9wdGlvbmFsIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgPT09IHV0aWxfMS5ab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuICgwLCBwYXJzZVV0aWxfMS5PSykodW5kZWZpbmVkKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoaW5wdXQpO1xuICAgIH1cbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kT3B0aW9uYWwgPSBab2RPcHRpb25hbDtcblpvZE9wdGlvbmFsLmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE9wdGlvbmFsKHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9wdGlvbmFsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY2xhc3MgWm9kTnVsbGFibGUgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSA9PT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUubnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuICgwLCBwYXJzZVV0aWxfMS5PSykobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGlucHV0KTtcbiAgICB9XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5leHBvcnRzLlpvZE51bGxhYmxlID0gWm9kTnVsbGFibGU7XG5ab2ROdWxsYWJsZS5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROdWxsYWJsZSh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROdWxsYWJsZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZERlZmF1bHQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGxldCBkYXRhID0gY3R4LmRhdGE7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSA9PT0gdXRpbF8xLlpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy5fZGVmLmRlZmF1bHRWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZURlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kRGVmYXVsdCA9IFpvZERlZmF1bHQ7XG5ab2REZWZhdWx0LmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZERlZmF1bHQoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdCxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiB0eXBlb2YgcGFyYW1zLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBwYXJhbXMuZGVmYXVsdFxuICAgICAgICAgICAgOiAoKSA9PiBwYXJhbXMuZGVmYXVsdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZENhdGNoIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICAvLyBuZXdDdHggaXMgdXNlZCB0byBub3QgY29sbGVjdCBpc3N1ZXMgZnJvbSBpbm5lciB0eXBlcyBpbiBjdHhcbiAgICAgICAgY29uc3QgbmV3Q3R4ID0ge1xuICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAgICAgLi4uY3R4LmNvbW1vbixcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2Uoe1xuICAgICAgICAgICAgZGF0YTogbmV3Q3R4LmRhdGEsXG4gICAgICAgICAgICBwYXRoOiBuZXdDdHgucGF0aCxcbiAgICAgICAgICAgIHBhcmVudDoge1xuICAgICAgICAgICAgICAgIC4uLm5ld0N0eCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoKDAsIHBhcnNlVXRpbF8xLmlzQXN5bmMpKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBcInZhbGlkXCIsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQuc3RhdHVzID09PSBcInZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX2RlZi5jYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgWm9kRXJyb3JfMS5ab2RFcnJvcihuZXdDdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogbmV3Q3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogXCJ2YWxpZFwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQuc3RhdHVzID09PSBcInZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RFcnJvcl8xLlpvZEVycm9yKG5ld0N0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogbmV3Q3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVDYXRjaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuZXhwb3J0cy5ab2RDYXRjaCA9IFpvZENhdGNoO1xuWm9kQ2F0Y2guY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQ2F0Y2goe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQ2F0Y2gsXG4gICAgICAgIGNhdGNoVmFsdWU6IHR5cGVvZiBwYXJhbXMuY2F0Y2ggPT09IFwiZnVuY3Rpb25cIiA/IHBhcmFtcy5jYXRjaCA6ICgpID0+IHBhcmFtcy5jYXRjaCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmNsYXNzIFpvZE5hTiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSB1dGlsXzEuWm9kUGFyc2VkVHlwZS5uYW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgICgwLCBwYXJzZVV0aWxfMS5hZGRJc3N1ZVRvQ29udGV4dCkoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kRXJyb3JfMS5ab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsXzEuWm9kUGFyc2VkVHlwZS5uYW4sXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG59XG5leHBvcnRzLlpvZE5hTiA9IFpvZE5hTjtcblpvZE5hTi5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROYU4oe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5hTixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydHMuQlJBTkQgPSBTeW1ib2woXCJ6b2RfYnJhbmRcIik7XG5jbGFzcyBab2RCcmFuZGVkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBkYXRhID0gY3R4LmRhdGE7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZS5fcGFyc2Uoe1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZTtcbiAgICB9XG59XG5leHBvcnRzLlpvZEJyYW5kZWQgPSBab2RCcmFuZGVkO1xuY2xhc3MgWm9kUGlwZWxpbmUgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZUFzeW5jID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluUmVzdWx0ID0gYXdhaXQgdGhpcy5fZGVmLmluLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlVXRpbF8xLklOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDAsIHBhcnNlVXRpbF8xLkRJUlRZKShpblJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLm91dC5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBpblJlc3VsdC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlQXN5bmMoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGluUmVzdWx0ID0gdGhpcy5fZGVmLmluLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiAgICAgICAgICAgIGlmIChpblJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogXCJkaXJ0eVwiLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaW5SZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYub3V0Ll9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBpblJlc3VsdC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGUoYSwgYikge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFBpcGVsaW5lKHtcbiAgICAgICAgICAgIGluOiBhLFxuICAgICAgICAgICAgb3V0OiBiLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RQaXBlbGluZSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuZXhwb3J0cy5ab2RQaXBlbGluZSA9IFpvZFBpcGVsaW5lO1xuY2xhc3MgWm9kUmVhZG9ubHkgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoaW5wdXQpO1xuICAgICAgICBpZiAoKDAsIHBhcnNlVXRpbF8xLmlzVmFsaWQpKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC52YWx1ZSA9IE9iamVjdC5mcmVlemUocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbmV4cG9ydHMuWm9kUmVhZG9ubHkgPSBab2RSZWFkb25seTtcblpvZFJlYWRvbmx5LmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFJlYWRvbmx5KHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFJlYWRvbmx5LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuY29uc3QgY3VzdG9tID0gKGNoZWNrLCBwYXJhbXMgPSB7fSwgXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKlxuICogUGFzcyBgZmF0YWxgIGludG8gdGhlIHBhcmFtcyBvYmplY3QgaW5zdGVhZDpcbiAqXG4gKiBgYGB0c1xuICogei5zdHJpbmcoKS5jdXN0b20oKHZhbCkgPT4gdmFsLmxlbmd0aCA+IDUsIHsgZmF0YWw6IGZhbHNlIH0pXG4gKiBgYGBcbiAqXG4gKi9cbmZhdGFsKSA9PiB7XG4gICAgaWYgKGNoZWNrKVxuICAgICAgICByZXR1cm4gWm9kQW55LmNyZWF0ZSgpLnN1cGVyUmVmaW5lKChkYXRhLCBjdHgpID0+IHtcbiAgICAgICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgICAgICBpZiAoIWNoZWNrKGRhdGEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcCA9IHR5cGVvZiBwYXJhbXMgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICA/IHBhcmFtcyhkYXRhKVxuICAgICAgICAgICAgICAgICAgICA6IHR5cGVvZiBwYXJhbXMgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8geyBtZXNzYWdlOiBwYXJhbXMgfVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBwYXJhbXM7XG4gICAgICAgICAgICAgICAgY29uc3QgX2ZhdGFsID0gKF9iID0gKF9hID0gcC5mYXRhbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmF0YWwpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHRydWU7XG4gICAgICAgICAgICAgICAgY29uc3QgcDIgPSB0eXBlb2YgcCA9PT0gXCJzdHJpbmdcIiA/IHsgbWVzc2FnZTogcCB9IDogcDtcbiAgICAgICAgICAgICAgICBjdHguYWRkSXNzdWUoeyBjb2RlOiBcImN1c3RvbVwiLCAuLi5wMiwgZmF0YWw6IF9mYXRhbCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgcmV0dXJuIFpvZEFueS5jcmVhdGUoKTtcbn07XG5leHBvcnRzLmN1c3RvbSA9IGN1c3RvbTtcbmV4cG9ydHMubGF0ZSA9IHtcbiAgICBvYmplY3Q6IFpvZE9iamVjdC5sYXp5Y3JlYXRlLFxufTtcbnZhciBab2RGaXJzdFBhcnR5VHlwZUtpbmQ7XG4oZnVuY3Rpb24gKFpvZEZpcnN0UGFydHlUeXBlS2luZCkge1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFN0cmluZ1wiXSA9IFwiWm9kU3RyaW5nXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTnVtYmVyXCJdID0gXCJab2ROdW1iZXJcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROYU5cIl0gPSBcIlpvZE5hTlwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEJpZ0ludFwiXSA9IFwiWm9kQmlnSW50XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQm9vbGVhblwiXSA9IFwiWm9kQm9vbGVhblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZERhdGVcIl0gPSBcIlpvZERhdGVcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RTeW1ib2xcIl0gPSBcIlpvZFN5bWJvbFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFVuZGVmaW5lZFwiXSA9IFwiWm9kVW5kZWZpbmVkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTnVsbFwiXSA9IFwiWm9kTnVsbFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEFueVwiXSA9IFwiWm9kQW55XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVW5rbm93blwiXSA9IFwiWm9kVW5rbm93blwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE5ldmVyXCJdID0gXCJab2ROZXZlclwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFZvaWRcIl0gPSBcIlpvZFZvaWRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RBcnJheVwiXSA9IFwiWm9kQXJyYXlcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RPYmplY3RcIl0gPSBcIlpvZE9iamVjdFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFVuaW9uXCJdID0gXCJab2RVbmlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiXSA9IFwiWm9kRGlzY3JpbWluYXRlZFVuaW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kSW50ZXJzZWN0aW9uXCJdID0gXCJab2RJbnRlcnNlY3Rpb25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RUdXBsZVwiXSA9IFwiWm9kVHVwbGVcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RSZWNvcmRcIl0gPSBcIlpvZFJlY29yZFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE1hcFwiXSA9IFwiWm9kTWFwXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kU2V0XCJdID0gXCJab2RTZXRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RGdW5jdGlvblwiXSA9IFwiWm9kRnVuY3Rpb25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RMYXp5XCJdID0gXCJab2RMYXp5XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTGl0ZXJhbFwiXSA9IFwiWm9kTGl0ZXJhbFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEVudW1cIl0gPSBcIlpvZEVudW1cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RFZmZlY3RzXCJdID0gXCJab2RFZmZlY3RzXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTmF0aXZlRW51bVwiXSA9IFwiWm9kTmF0aXZlRW51bVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE9wdGlvbmFsXCJdID0gXCJab2RPcHRpb25hbFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE51bGxhYmxlXCJdID0gXCJab2ROdWxsYWJsZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZERlZmF1bHRcIl0gPSBcIlpvZERlZmF1bHRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RDYXRjaFwiXSA9IFwiWm9kQ2F0Y2hcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RQcm9taXNlXCJdID0gXCJab2RQcm9taXNlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQnJhbmRlZFwiXSA9IFwiWm9kQnJhbmRlZFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFBpcGVsaW5lXCJdID0gXCJab2RQaXBlbGluZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFJlYWRvbmx5XCJdID0gXCJab2RSZWFkb25seVwiO1xufSkoWm9kRmlyc3RQYXJ0eVR5cGVLaW5kID0gZXhwb3J0cy5ab2RGaXJzdFBhcnR5VHlwZUtpbmQgfHwgKGV4cG9ydHMuWm9kRmlyc3RQYXJ0eVR5cGVLaW5kID0ge30pKTtcbi8vIHJlcXVpcmVzIFRTIDQuNCtcbmNsYXNzIENsYXNzIHtcbiAgICBjb25zdHJ1Y3RvciguLi5fKSB7IH1cbn1cbmNvbnN0IGluc3RhbmNlT2ZUeXBlID0gKFxuLy8gY29uc3QgaW5zdGFuY2VPZlR5cGUgPSA8VCBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueT4oXG5jbHMsIHBhcmFtcyA9IHtcbiAgICBtZXNzYWdlOiBgSW5wdXQgbm90IGluc3RhbmNlIG9mICR7Y2xzLm5hbWV9YCxcbn0pID0+ICgwLCBleHBvcnRzLmN1c3RvbSkoKGRhdGEpID0+IGRhdGEgaW5zdGFuY2VvZiBjbHMsIHBhcmFtcyk7XG5leHBvcnRzLmluc3RhbmNlb2YgPSBpbnN0YW5jZU9mVHlwZTtcbmNvbnN0IHN0cmluZ1R5cGUgPSBab2RTdHJpbmcuY3JlYXRlO1xuZXhwb3J0cy5zdHJpbmcgPSBzdHJpbmdUeXBlO1xuY29uc3QgbnVtYmVyVHlwZSA9IFpvZE51bWJlci5jcmVhdGU7XG5leHBvcnRzLm51bWJlciA9IG51bWJlclR5cGU7XG5jb25zdCBuYW5UeXBlID0gWm9kTmFOLmNyZWF0ZTtcbmV4cG9ydHMubmFuID0gbmFuVHlwZTtcbmNvbnN0IGJpZ0ludFR5cGUgPSBab2RCaWdJbnQuY3JlYXRlO1xuZXhwb3J0cy5iaWdpbnQgPSBiaWdJbnRUeXBlO1xuY29uc3QgYm9vbGVhblR5cGUgPSBab2RCb29sZWFuLmNyZWF0ZTtcbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW5UeXBlO1xuY29uc3QgZGF0ZVR5cGUgPSBab2REYXRlLmNyZWF0ZTtcbmV4cG9ydHMuZGF0ZSA9IGRhdGVUeXBlO1xuY29uc3Qgc3ltYm9sVHlwZSA9IFpvZFN5bWJvbC5jcmVhdGU7XG5leHBvcnRzLnN5bWJvbCA9IHN5bWJvbFR5cGU7XG5jb25zdCB1bmRlZmluZWRUeXBlID0gWm9kVW5kZWZpbmVkLmNyZWF0ZTtcbmV4cG9ydHMudW5kZWZpbmVkID0gdW5kZWZpbmVkVHlwZTtcbmNvbnN0IG51bGxUeXBlID0gWm9kTnVsbC5jcmVhdGU7XG5leHBvcnRzLm51bGwgPSBudWxsVHlwZTtcbmNvbnN0IGFueVR5cGUgPSBab2RBbnkuY3JlYXRlO1xuZXhwb3J0cy5hbnkgPSBhbnlUeXBlO1xuY29uc3QgdW5rbm93blR5cGUgPSBab2RVbmtub3duLmNyZWF0ZTtcbmV4cG9ydHMudW5rbm93biA9IHVua25vd25UeXBlO1xuY29uc3QgbmV2ZXJUeXBlID0gWm9kTmV2ZXIuY3JlYXRlO1xuZXhwb3J0cy5uZXZlciA9IG5ldmVyVHlwZTtcbmNvbnN0IHZvaWRUeXBlID0gWm9kVm9pZC5jcmVhdGU7XG5leHBvcnRzLnZvaWQgPSB2b2lkVHlwZTtcbmNvbnN0IGFycmF5VHlwZSA9IFpvZEFycmF5LmNyZWF0ZTtcbmV4cG9ydHMuYXJyYXkgPSBhcnJheVR5cGU7XG5jb25zdCBvYmplY3RUeXBlID0gWm9kT2JqZWN0LmNyZWF0ZTtcbmV4cG9ydHMub2JqZWN0ID0gb2JqZWN0VHlwZTtcbmNvbnN0IHN0cmljdE9iamVjdFR5cGUgPSBab2RPYmplY3Quc3RyaWN0Q3JlYXRlO1xuZXhwb3J0cy5zdHJpY3RPYmplY3QgPSBzdHJpY3RPYmplY3RUeXBlO1xuY29uc3QgdW5pb25UeXBlID0gWm9kVW5pb24uY3JlYXRlO1xuZXhwb3J0cy51bmlvbiA9IHVuaW9uVHlwZTtcbmNvbnN0IGRpc2NyaW1pbmF0ZWRVbmlvblR5cGUgPSBab2REaXNjcmltaW5hdGVkVW5pb24uY3JlYXRlO1xuZXhwb3J0cy5kaXNjcmltaW5hdGVkVW5pb24gPSBkaXNjcmltaW5hdGVkVW5pb25UeXBlO1xuY29uc3QgaW50ZXJzZWN0aW9uVHlwZSA9IFpvZEludGVyc2VjdGlvbi5jcmVhdGU7XG5leHBvcnRzLmludGVyc2VjdGlvbiA9IGludGVyc2VjdGlvblR5cGU7XG5jb25zdCB0dXBsZVR5cGUgPSBab2RUdXBsZS5jcmVhdGU7XG5leHBvcnRzLnR1cGxlID0gdHVwbGVUeXBlO1xuY29uc3QgcmVjb3JkVHlwZSA9IFpvZFJlY29yZC5jcmVhdGU7XG5leHBvcnRzLnJlY29yZCA9IHJlY29yZFR5cGU7XG5jb25zdCBtYXBUeXBlID0gWm9kTWFwLmNyZWF0ZTtcbmV4cG9ydHMubWFwID0gbWFwVHlwZTtcbmNvbnN0IHNldFR5cGUgPSBab2RTZXQuY3JlYXRlO1xuZXhwb3J0cy5zZXQgPSBzZXRUeXBlO1xuY29uc3QgZnVuY3Rpb25UeXBlID0gWm9kRnVuY3Rpb24uY3JlYXRlO1xuZXhwb3J0cy5mdW5jdGlvbiA9IGZ1bmN0aW9uVHlwZTtcbmNvbnN0IGxhenlUeXBlID0gWm9kTGF6eS5jcmVhdGU7XG5leHBvcnRzLmxhenkgPSBsYXp5VHlwZTtcbmNvbnN0IGxpdGVyYWxUeXBlID0gWm9kTGl0ZXJhbC5jcmVhdGU7XG5leHBvcnRzLmxpdGVyYWwgPSBsaXRlcmFsVHlwZTtcbmNvbnN0IGVudW1UeXBlID0gWm9kRW51bS5jcmVhdGU7XG5leHBvcnRzLmVudW0gPSBlbnVtVHlwZTtcbmNvbnN0IG5hdGl2ZUVudW1UeXBlID0gWm9kTmF0aXZlRW51bS5jcmVhdGU7XG5leHBvcnRzLm5hdGl2ZUVudW0gPSBuYXRpdmVFbnVtVHlwZTtcbmNvbnN0IHByb21pc2VUeXBlID0gWm9kUHJvbWlzZS5jcmVhdGU7XG5leHBvcnRzLnByb21pc2UgPSBwcm9taXNlVHlwZTtcbmNvbnN0IGVmZmVjdHNUeXBlID0gWm9kRWZmZWN0cy5jcmVhdGU7XG5leHBvcnRzLmVmZmVjdCA9IGVmZmVjdHNUeXBlO1xuZXhwb3J0cy50cmFuc2Zvcm1lciA9IGVmZmVjdHNUeXBlO1xuY29uc3Qgb3B0aW9uYWxUeXBlID0gWm9kT3B0aW9uYWwuY3JlYXRlO1xuZXhwb3J0cy5vcHRpb25hbCA9IG9wdGlvbmFsVHlwZTtcbmNvbnN0IG51bGxhYmxlVHlwZSA9IFpvZE51bGxhYmxlLmNyZWF0ZTtcbmV4cG9ydHMubnVsbGFibGUgPSBudWxsYWJsZVR5cGU7XG5jb25zdCBwcmVwcm9jZXNzVHlwZSA9IFpvZEVmZmVjdHMuY3JlYXRlV2l0aFByZXByb2Nlc3M7XG5leHBvcnRzLnByZXByb2Nlc3MgPSBwcmVwcm9jZXNzVHlwZTtcbmNvbnN0IHBpcGVsaW5lVHlwZSA9IFpvZFBpcGVsaW5lLmNyZWF0ZTtcbmV4cG9ydHMucGlwZWxpbmUgPSBwaXBlbGluZVR5cGU7XG5jb25zdCBvc3RyaW5nID0gKCkgPT4gc3RyaW5nVHlwZSgpLm9wdGlvbmFsKCk7XG5leHBvcnRzLm9zdHJpbmcgPSBvc3RyaW5nO1xuY29uc3Qgb251bWJlciA9ICgpID0+IG51bWJlclR5cGUoKS5vcHRpb25hbCgpO1xuZXhwb3J0cy5vbnVtYmVyID0gb251bWJlcjtcbmNvbnN0IG9ib29sZWFuID0gKCkgPT4gYm9vbGVhblR5cGUoKS5vcHRpb25hbCgpO1xuZXhwb3J0cy5vYm9vbGVhbiA9IG9ib29sZWFuO1xuZXhwb3J0cy5jb2VyY2UgPSB7XG4gICAgc3RyaW5nOiAoKGFyZykgPT4gWm9kU3RyaW5nLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbiAgICBudW1iZXI6ICgoYXJnKSA9PiBab2ROdW1iZXIuY3JlYXRlKHsgLi4uYXJnLCBjb2VyY2U6IHRydWUgfSkpLFxuICAgIGJvb2xlYW46ICgoYXJnKSA9PiBab2RCb29sZWFuLmNyZWF0ZSh7XG4gICAgICAgIC4uLmFyZyxcbiAgICAgICAgY29lcmNlOiB0cnVlLFxuICAgIH0pKSxcbiAgICBiaWdpbnQ6ICgoYXJnKSA9PiBab2RCaWdJbnQuY3JlYXRlKHsgLi4uYXJnLCBjb2VyY2U6IHRydWUgfSkpLFxuICAgIGRhdGU6ICgoYXJnKSA9PiBab2REYXRlLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbn07XG5leHBvcnRzLk5FVkVSID0gcGFyc2VVdGlsXzEuSU5WQUxJRDtcbiIsImZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoZSkge1xuICBpZiAodm9pZCAwID09PSBlKSB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIHJldHVybiBlO1xufVxuZXhwb3J0IHsgX2Fzc2VydFRoaXNJbml0aWFsaXplZCBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IHRvUHJvcGVydHlLZXkgZnJvbSBcIi4vdG9Qcm9wZXJ0eUtleS5qc1wiO1xuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXMoZSwgcikge1xuICBmb3IgKHZhciB0ID0gMDsgdCA8IHIubGVuZ3RoOyB0KyspIHtcbiAgICB2YXIgbyA9IHJbdF07XG4gICAgby5lbnVtZXJhYmxlID0gby5lbnVtZXJhYmxlIHx8ICExLCBvLmNvbmZpZ3VyYWJsZSA9ICEwLCBcInZhbHVlXCIgaW4gbyAmJiAoby53cml0YWJsZSA9ICEwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIHRvUHJvcGVydHlLZXkoby5rZXkpLCBvKTtcbiAgfVxufVxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKGUsIHIsIHQpIHtcbiAgcmV0dXJuIHIgJiYgX2RlZmluZVByb3BlcnRpZXMoZS5wcm90b3R5cGUsIHIpLCB0ICYmIF9kZWZpbmVQcm9wZXJ0aWVzKGUsIHQpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwgXCJwcm90b3R5cGVcIiwge1xuICAgIHdyaXRhYmxlOiAhMVxuICB9KSwgZTtcbn1cbmV4cG9ydCB7IF9jcmVhdGVDbGFzcyBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIHJldHVybiBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gPyBPYmplY3QuYXNzaWduLmJpbmQoKSA6IGZ1bmN0aW9uIChuKSB7XG4gICAgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHtcbiAgICAgIHZhciB0ID0gYXJndW1lbnRzW2VdO1xuICAgICAgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKG5bcl0gPSB0W3JdKTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG4gIH0sIF9leHRlbmRzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5leHBvcnQgeyBfZXh0ZW5kcyBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IHNldFByb3RvdHlwZU9mIGZyb20gXCIuL3NldFByb3RvdHlwZU9mLmpzXCI7XG5mdW5jdGlvbiBfaW5oZXJpdHNMb29zZSh0LCBvKSB7XG4gIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSksIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gdCwgc2V0UHJvdG90eXBlT2YodCwgbyk7XG59XG5leHBvcnQgeyBfaW5oZXJpdHNMb29zZSBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UociwgZSkge1xuICBpZiAobnVsbCA9PSByKSByZXR1cm4ge307XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIG4gaW4gcikgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwociwgbikpIHtcbiAgICBpZiAoLTEgIT09IGUuaW5kZXhPZihuKSkgY29udGludWU7XG4gICAgdFtuXSA9IHJbbl07XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5leHBvcnQgeyBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSBhcyBkZWZhdWx0IH07IiwiZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKHQsIGUpIHtcbiAgcmV0dXJuIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZi5iaW5kKCkgOiBmdW5jdGlvbiAodCwgZSkge1xuICAgIHJldHVybiB0Ll9fcHJvdG9fXyA9IGUsIHQ7XG4gIH0sIF9zZXRQcm90b3R5cGVPZih0LCBlKTtcbn1cbmV4cG9ydCB7IF9zZXRQcm90b3R5cGVPZiBhcyBkZWZhdWx0IH07IiwiaW1wb3J0IF90eXBlb2YgZnJvbSBcIi4vdHlwZW9mLmpzXCI7XG5mdW5jdGlvbiB0b1ByaW1pdGl2ZSh0LCByKSB7XG4gIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YodCkgfHwgIXQpIHJldHVybiB0O1xuICB2YXIgZSA9IHRbU3ltYm9sLnRvUHJpbWl0aXZlXTtcbiAgaWYgKHZvaWQgMCAhPT0gZSkge1xuICAgIHZhciBpID0gZS5jYWxsKHQsIHIgfHwgXCJkZWZhdWx0XCIpO1xuICAgIGlmIChcIm9iamVjdFwiICE9IF90eXBlb2YoaSkpIHJldHVybiBpO1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLlwiKTtcbiAgfVxuICByZXR1cm4gKFwic3RyaW5nXCIgPT09IHIgPyBTdHJpbmcgOiBOdW1iZXIpKHQpO1xufVxuZXhwb3J0IHsgdG9QcmltaXRpdmUgYXMgZGVmYXVsdCB9OyIsImltcG9ydCBfdHlwZW9mIGZyb20gXCIuL3R5cGVvZi5qc1wiO1xuaW1wb3J0IHRvUHJpbWl0aXZlIGZyb20gXCIuL3RvUHJpbWl0aXZlLmpzXCI7XG5mdW5jdGlvbiB0b1Byb3BlcnR5S2V5KHQpIHtcbiAgdmFyIGkgPSB0b1ByaW1pdGl2ZSh0LCBcInN0cmluZ1wiKTtcbiAgcmV0dXJuIFwic3ltYm9sXCIgPT0gX3R5cGVvZihpKSA/IGkgOiBpICsgXCJcIjtcbn1cbmV4cG9ydCB7IHRvUHJvcGVydHlLZXkgYXMgZGVmYXVsdCB9OyIsImZ1bmN0aW9uIF90eXBlb2Yobykge1xuICBcIkBiYWJlbC9oZWxwZXJzIC0gdHlwZW9mXCI7XG5cbiAgcmV0dXJuIF90eXBlb2YgPSBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIFN5bWJvbCAmJiBcInN5bWJvbFwiID09IHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPyBmdW5jdGlvbiAobykge1xuICAgIHJldHVybiB0eXBlb2YgbztcbiAgfSA6IGZ1bmN0aW9uIChvKSB7XG4gICAgcmV0dXJuIG8gJiYgXCJmdW5jdGlvblwiID09IHR5cGVvZiBTeW1ib2wgJiYgby5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG8gIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG87XG4gIH0sIF90eXBlb2Yobyk7XG59XG5leHBvcnQgeyBfdHlwZW9mIGFzIGRlZmF1bHQgfTsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiIiwiLy8gc3RhcnR1cFxuLy8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4vLyBUaGlzIGVudHJ5IG1vZHVsZSBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIG1vZHVsZXMgc28gaXQgY2FuJ3QgYmUgaW5saW5lZFxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDk5ODApO1xuIiwiIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
30989
+ });