@ukwhatn/wikidot 4.4.0 → 4.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +46 -25
- package/dist/index.d.cts +14 -3
- package/dist/index.d.ts +14 -3
- package/dist/index.js +46 -25
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -297,7 +297,9 @@ var init_amc_config = __esm(() => {
|
|
|
297
297
|
retryInterval: 1000,
|
|
298
298
|
maxBackoff: 60000,
|
|
299
299
|
backoffFactor: 2,
|
|
300
|
-
semaphoreLimit: 10
|
|
300
|
+
semaphoreLimit: 10,
|
|
301
|
+
retryBatchSize: 50,
|
|
302
|
+
retryMaxRetries: 3
|
|
301
303
|
};
|
|
302
304
|
});
|
|
303
305
|
|
|
@@ -5048,37 +5050,56 @@ class Site {
|
|
|
5048
5050
|
returnExceptions: options?.returnExceptions ?? false
|
|
5049
5051
|
});
|
|
5050
5052
|
}
|
|
5051
|
-
amcRequestWithRetry(bodies) {
|
|
5053
|
+
amcRequestWithRetry(bodies, options) {
|
|
5054
|
+
const batchSize = options?.batchSize ?? this.client.amcClient.config.retryBatchSize;
|
|
5055
|
+
const maxRetries = options?.maxRetries ?? this.client.amcClient.config.retryMaxRetries;
|
|
5052
5056
|
return fromPromise((async () => {
|
|
5053
|
-
|
|
5054
|
-
|
|
5055
|
-
|
|
5056
|
-
|
|
5057
|
-
|
|
5058
|
-
|
|
5059
|
-
|
|
5060
|
-
|
|
5061
|
-
|
|
5062
|
-
|
|
5063
|
-
|
|
5057
|
+
if (!Number.isInteger(batchSize) || batchSize <= 0) {
|
|
5058
|
+
throw new Error(`Invalid batchSize: ${batchSize}. Must be a positive integer.`);
|
|
5059
|
+
}
|
|
5060
|
+
if (!Number.isInteger(maxRetries) || maxRetries < 0) {
|
|
5061
|
+
throw new Error(`Invalid maxRetries: ${maxRetries}. Must be a non-negative integer.`);
|
|
5062
|
+
}
|
|
5063
|
+
const allResults = [];
|
|
5064
|
+
for (let batchStart = 0;batchStart < bodies.length; batchStart += batchSize) {
|
|
5065
|
+
const batch = bodies.slice(batchStart, batchStart + batchSize);
|
|
5066
|
+
const initialResult = await this.amcRequest(batch, { returnExceptions: true });
|
|
5067
|
+
if (initialResult.isErr())
|
|
5068
|
+
throw initialResult.error;
|
|
5069
|
+
const batchResults = [];
|
|
5070
|
+
let failedIndices = [];
|
|
5071
|
+
for (const [i, respOrErr] of initialResult.value.entries()) {
|
|
5072
|
+
if (respOrErr instanceof WikidotError) {
|
|
5073
|
+
batchResults.push(null);
|
|
5074
|
+
failedIndices.push(i);
|
|
5075
|
+
} else {
|
|
5076
|
+
batchResults.push(respOrErr);
|
|
5077
|
+
}
|
|
5064
5078
|
}
|
|
5065
|
-
|
|
5066
|
-
|
|
5067
|
-
|
|
5068
|
-
|
|
5069
|
-
|
|
5070
|
-
|
|
5079
|
+
for (let attempt = 0;attempt < maxRetries && failedIndices.length > 0; attempt++) {
|
|
5080
|
+
const retryBodies = failedIndices.map((i) => batch[i]);
|
|
5081
|
+
logger.warn(`amcRequestWithRetry: ${failedIndices.length}/${batch.length} requests failed, retrying (attempt ${attempt + 1}/${maxRetries})`);
|
|
5082
|
+
const retryResult = await this.amcRequest(retryBodies, { returnExceptions: true });
|
|
5083
|
+
if (retryResult.isErr())
|
|
5084
|
+
break;
|
|
5085
|
+
const stillFailedIndices = [];
|
|
5071
5086
|
for (let j = 0;j < failedIndices.length; j++) {
|
|
5072
5087
|
const retryResp = retryResult.value[j];
|
|
5073
5088
|
if (retryResp && !(retryResp instanceof WikidotError)) {
|
|
5074
|
-
|
|
5089
|
+
batchResults[failedIndices[j]] = retryResp;
|
|
5075
5090
|
} else {
|
|
5076
|
-
|
|
5091
|
+
stillFailedIndices.push(failedIndices[j]);
|
|
5077
5092
|
}
|
|
5078
5093
|
}
|
|
5094
|
+
failedIndices = stillFailedIndices;
|
|
5079
5095
|
}
|
|
5096
|
+
allResults.push(...batchResults);
|
|
5080
5097
|
}
|
|
5081
|
-
|
|
5098
|
+
const failedCount = allResults.filter((r) => r === null).length;
|
|
5099
|
+
if (failedCount > 0) {
|
|
5100
|
+
logger.warn(`amcRequestWithRetry: ${allResults.length - failedCount}/${allResults.length} succeeded (${failedCount} failed)`);
|
|
5101
|
+
}
|
|
5102
|
+
return allResults;
|
|
5082
5103
|
})(), (error) => {
|
|
5083
5104
|
if (error instanceof WikidotError)
|
|
5084
5105
|
return error;
|
|
@@ -5125,7 +5146,7 @@ class Site {
|
|
|
5125
5146
|
let title = null;
|
|
5126
5147
|
for (const script of scripts) {
|
|
5127
5148
|
const content = $(script).html();
|
|
5128
|
-
if (!content
|
|
5149
|
+
if (!content?.includes("WIKIREQUEST")) {
|
|
5129
5150
|
continue;
|
|
5130
5151
|
}
|
|
5131
5152
|
const siteIdMatch = content.match(/WIKIREQUEST\.info\.siteId\s*=\s*(\d+)/);
|
|
@@ -5304,5 +5325,5 @@ init_user2();
|
|
|
5304
5325
|
// src/util/index.ts
|
|
5305
5326
|
init_parser();
|
|
5306
5327
|
|
|
5307
|
-
//# debugId=
|
|
5308
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2NvbW1vbi9lcnJvcnMvYmFzZS50cyIsICJzcmMvY29tbW9uL2Vycm9ycy9hbWMudHMiLCAic3JjL2NvbW1vbi9lcnJvcnMvc2Vzc2lvbi50cyIsICJzcmMvY29tbW9uL2Vycm9ycy90YXJnZXQudHMiLCAic3JjL2NvbW1vbi9lcnJvcnMvaW5kZXgudHMiLCAic3JjL2NvbW1vbi9sb2dnZXIudHMiLCAic3JjL2NvbW1vbi90eXBlcy9yZXN1bHQudHMiLCAic3JjL2NvbW1vbi90eXBlcy9pbmRleC50cyIsICJzcmMvY29ubmVjdG9yL2FtYy1jb25maWcudHMiLCAic3JjL3V0aWwvaHR0cC50cyIsICJzcmMvbW9kdWxlL3VzZXIvYW5vbnltb3VzLXVzZXIudHMiLCAic3JjL21vZHVsZS91c2VyL2RlbGV0ZWQtdXNlci50cyIsICJzcmMvbW9kdWxlL3VzZXIvZ3Vlc3QtdXNlci50cyIsICJzcmMvdXRpbC90YWJsZS9jaGFyLXRhYmxlLnRzIiwgInNyYy91dGlsL3N0cmluZy11dGlsLnRzIiwgInNyYy9tb2R1bGUvdXNlci91c2VyLWNvbGxlY3Rpb24udHMiLCAic3JjL21vZHVsZS91c2VyL3VzZXIudHMiLCAic3JjL21vZHVsZS91c2VyL3dpa2lkb3QtdXNlci50cyIsICJzcmMvbW9kdWxlL3VzZXIvaW5kZXgudHMiLCAic3JjL3V0aWwvcGFyc2VyL3VzZXIudHMiLCAic3JjL3V0aWwvcGFyc2VyL2luZGV4LnRzIiwgInNyYy9jb21tb24vZGVjb3JhdG9ycy50cyIsICJzcmMvbW9kdWxlL2ZvcnVtL2ZvcnVtLXBvc3QtcmV2aXNpb24udHMiLCAic3JjL21vZHVsZS9mb3J1bS9mb3J1bS1wb3N0LnRzIiwgInNyYy9tb2R1bGUvZm9ydW0vZm9ydW0tdGhyZWFkLnRzIiwgInNyYy9tb2R1bGUvZm9ydW0vZm9ydW0tY2F0ZWdvcnkudHMiLCAic3JjL21vZHVsZS9mb3J1bS9pbmRleC50cyIsICJzcmMvaW5kZXgudHMiLCAic3JjL2Nvbm5lY3Rvci9hbWMtY2xpZW50LnRzIiwgInNyYy9jb25uZWN0b3IvYW1jLWhlYWRlci50cyIsICJzcmMvY29ubmVjdG9yL2FtYy10eXBlcy50cyIsICJzcmMvY29ubmVjdG9yL2luZGV4LnRzIiwgInNyYy9jb25uZWN0b3IvYXV0aC50cyIsICJzcmMvbW9kdWxlL3ByaXZhdGUtbWVzc2FnZS9wcml2YXRlLW1lc3NhZ2UudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3BtLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9hY2Nlc3NvcnMvZm9ydW0tYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9zaXRlL2FjY2Vzc29ycy9tZW1iZXItYWNjZXNzb3IudHMiLCAic3JjL3V0aWwvcXVpY2stbW9kdWxlLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9zaXRlLWFwcGxpY2F0aW9uLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9zaXRlLW1lbWJlci50cyIsICJzcmMvbW9kdWxlL3NpdGUvYWNjZXNzb3JzL3BhZ2UtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2UudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2UtZmlsZS50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS1tZXRhLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLXJldmlzaW9uLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLXNvdXJjZS50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS12b3RlLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9zZWFyY2gtcXVlcnkudHMiLCAic3JjL21vZHVsZS9wYWdlL3NpdGUtY2hhbmdlLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9hY2Nlc3NvcnMvcGFnZXMtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9zaXRlL3NpdGUudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3NpdGUtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3VzZXItYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9jbGllbnQvY2xpZW50LnRzIiwgInNyYy9tb2R1bGUvaW5kZXgudHMiLCAic3JjL3V0aWwvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciB0aGUgV2lraWRvdCBsaWJyYXJ5XG4gKiBBbGwgY3VzdG9tIGVycm9ycyBpbmhlcml0IGZyb20gdGhpcyBjbGFzc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV2lraWRvdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKiogRXJyb3IgbmFtZSAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbmV3LnRhcmdldC5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogVW5leHBlY3RlZCBlcnJvclxuICogUmVwcmVzZW50cyBpbnRlcm5hbCBpbmNvbnNpc3RlbmNpZXMgb3IgYnVnc1xuICovXG5leHBvcnQgY2xhc3MgVW5leHBlY3RlZEVycm9yIGV4dGVuZHMgV2lraWRvdEVycm9yIHt9XG4iLAogICAgImltcG9ydCB7IFdpa2lkb3RFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogQmFzZSBlcnJvciBmb3IgQWpheCBNb2R1bGUgQ29ubmVjdG9yIHJlbGF0ZWQgaXNzdWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBBTUNFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIEhUVFAgc3RhdHVzIGNvZGUgZXJyb3JcbiAqIFRocm93biB3aGVuIGFuIEFNQyByZXF1ZXN0IGZhaWxzIHdpdGggYW4gSFRUUCBlcnJvclxuICovXG5leHBvcnQgY2xhc3MgQU1DSHR0cEVycm9yIGV4dGVuZHMgQU1DRXJyb3Ige1xuICAvKiogSFRUUCBzdGF0dXMgY29kZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzQ29kZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHN0YXR1c0NvZGUgLSBIVFRQIHN0YXR1cyBjb2RlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1c0NvZGU6IG51bWJlcikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaWtpZG90IHN0YXR1cyBjb2RlIGVycm9yXG4gKiBUaHJvd24gd2hlbiBBTUMgcmVzcG9uc2Ugc3RhdHVzIGlzIG5vdCBva1xuICovXG5leHBvcnQgY2xhc3MgV2lraWRvdFN0YXR1c0Vycm9yIGV4dGVuZHMgQU1DRXJyb3Ige1xuICAvKiogV2lraWRvdCBzdGF0dXMgY29kZSBzdHJpbmcgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0NvZGU6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSBzdGF0dXNDb2RlIC0gU3RhdHVzIGNvZGUgKGUuZy4sICdub3Rfb2snLCAndHJ5X2FnYWluJylcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzQ29kZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc3BvbnNlIGRhdGEgZXJyb3JcbiAqIFRocm93biB3aGVuIHJlc3BvbnNlIHBhcnNpbmcgZmFpbHNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc3BvbnNlRGF0YUVycm9yIGV4dGVuZHMgQU1DRXJyb3Ige31cbiIsCiAgICAiaW1wb3J0IHsgV2lraWRvdEVycm9yIH0gZnJvbSAnLi9iYXNlJztcblxuLyoqXG4gKiBCYXNlIGVycm9yIGZvciBzZXNzaW9uIHJlbGF0ZWQgaXNzdWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXNzaW9uRXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBTZXNzaW9uIGNyZWF0aW9uIGZhaWx1cmUgZXJyb3JcbiAqIFRocm93biB3aGVuIGEgbG9naW4gYXR0ZW1wdCBmYWlsc1xuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkNyZWF0ZUVycm9yIGV4dGVuZHMgU2Vzc2lvbkVycm9yIHt9XG5cbi8qKlxuICogTG9naW4gcmVxdWlyZWQgZXJyb3JcbiAqIFRocm93biB3aGVuIGFuIGF1dGhlbnRpY2F0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZCB3aXRob3V0IGxvZ2luXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dpblJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBTZXNzaW9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ0xvZ2luIGlzIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBXaWtpZG90RXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuXG4vKipcbiAqIFJlc291cmNlIG5vdCBmb3VuZCBlcnJvclxuICogVGhyb3duIHdoZW4gdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBkb2VzIG5vdCBleGlzdFxuICovXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBSZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBlcnJvclxuICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBjcmVhdGUgYSByZXNvdXJjZSB0aGF0IGFscmVhZHkgZXhpc3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRFeGlzdHNFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIFRhcmdldCBzdGF0ZSBlcnJvclxuICogVGhyb3duIHdoZW4gYSByZXNvdXJjZSBpcyBpbiBhbiBpbm9wZXJhYmxlIHN0YXRlIChlLmcuLCBsb2NrZWQpXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIEFjY2VzcyBkZW5pZWQgZXJyb3JcbiAqIFRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBkZW5pZWQgZHVlIHRvIGluc3VmZmljaWVudCBwZXJtaXNzaW9uc1xuICovXG5leHBvcnQgY2xhc3MgRm9yYmlkZGVuRXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBIVE1MIGVsZW1lbnQgbm90IGZvdW5kIGVycm9yXG4gKiBUaHJvd24gd2hlbiBhIHJlcXVpcmVkIGVsZW1lbnQgaXMgbm90IGZvdW5kIGR1cmluZyBwYXJzaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBOb0VsZW1lbnRFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuIiwKICAgICIvLyBCYXNlIGVycm9yc1xuXG4vLyBBTUMgZXJyb3JzXG5leHBvcnQgeyBBTUNFcnJvciwgQU1DSHR0cEVycm9yLCBSZXNwb25zZURhdGFFcnJvciwgV2lraWRvdFN0YXR1c0Vycm9yIH0gZnJvbSAnLi9hbWMnO1xuZXhwb3J0IHsgVW5leHBlY3RlZEVycm9yLCBXaWtpZG90RXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuLy8gU2Vzc2lvbiBlcnJvcnNcbmV4cG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciwgU2Vzc2lvbkNyZWF0ZUVycm9yLCBTZXNzaW9uRXJyb3IgfSBmcm9tICcuL3Nlc3Npb24nO1xuXG4vLyBUYXJnZXQgZXJyb3JzXG5leHBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTm9FbGVtZW50RXJyb3IsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxuICBUYXJnZXRFcnJvcixcbiAgVGFyZ2V0RXhpc3RzRXJyb3IsXG59IGZyb20gJy4vdGFyZ2V0JztcbiIsCiAgICAiLyoqXG4gKiBNb2R1bGUgcHJvdmlkaW5nIGxvZ2dpbmcgZnVuY3Rpb25hbGl0eVxuICpcbiAqIFRoaXMgbW9kdWxlIGNvbmZpZ3VyZXMgYW5kIHByb3ZpZGVzIGxvZ2dlcnMgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5LlxuICogQnkgZGVmYXVsdCwgaXQgZG9lcyBub3Qgb3V0cHV0IGFueXRoaW5nLCBhbGxvd2luZyBhcHBsaWNhdGlvbi1zaWRlIGxvZyBjb250cm9sLlxuICovXG5cbi8qKlxuICogTG9nIGxldmVsXG4gKi9cbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcic7XG5cbi8qKlxuICogTG9nIGxldmVsIHByaW9yaXR5IChoaWdoZXIgbnVtYmVyID0gbW9yZSBpbXBvcnRhbnQpXG4gKi9cbmNvbnN0IExPR19MRVZFTF9QUklPUklUWTogUmVjb3JkPExvZ0xldmVsLCBudW1iZXI+ID0ge1xuICBkZWJ1ZzogMCxcbiAgaW5mbzogMSxcbiAgd2FybjogMixcbiAgZXJyb3I6IDMsXG59O1xuXG4vKipcbiAqIExvZ2dlciBoYW5kbGVyXG4gKi9cbmV4cG9ydCB0eXBlIExvZ0hhbmRsZXIgPSAoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgbmFtZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIC4uLmFyZ3M6IHVua25vd25bXVxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIE51bGxIYW5kbGVyOiBPdXRwdXRzIG5vdGhpbmcgKGRlZmF1bHQpXG4gKi9cbmV4cG9ydCBjb25zdCBudWxsSGFuZGxlcjogTG9nSGFuZGxlciA9ICgpID0+IHtcbiAgLy8gRG8gbm90aGluZ1xufTtcblxuLyoqXG4gKiBDb25zb2xlSGFuZGxlcjogT3V0cHV0cyB0byBjb25zb2xlXG4gKi9cbmV4cG9ydCBjb25zdCBjb25zb2xlSGFuZGxlcjogTG9nSGFuZGxlciA9IChcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICBuYW1lOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgLi4uYXJnczogdW5rbm93bltdXG4pID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICBjb25zdCBmb3JtYXR0ZWRNZXNzYWdlID0gYCR7dGltZXN0YW1wfSBbJHtuYW1lfS8ke2xldmVsLnRvVXBwZXJDYXNlKCl9XSAke21lc3NhZ2V9YDtcblxuICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgY2FzZSAnZGVidWcnOlxuICAgICAgY29uc29sZS5kZWJ1Zyhmb3JtYXR0ZWRNZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2luZm8nOlxuICAgICAgY29uc29sZS5pbmZvKGZvcm1hdHRlZE1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnd2Fybic6XG4gICAgICBjb25zb2xlLndhcm4oZm9ybWF0dGVkTWVzc2FnZSwgLi4uYXJncyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlcnJvcic6XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZE1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgYnJlYWs7XG4gIH1cbn07XG5cbi8qKlxuICogTG9nZ2VyIGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBoYW5kbGVyOiBMb2dIYW5kbGVyO1xuICBwcml2YXRlIGxldmVsOiBMb2dMZXZlbDtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IExvZ0hhbmRsZXIgPSBudWxsSGFuZGxlciwgbGV2ZWw6IExvZ0xldmVsID0gJ3dhcm4nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgaGFuZGxlclxuICAgKi9cbiAgc2V0SGFuZGxlcihoYW5kbGVyOiBMb2dIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbG9nIGxldmVsXG4gICAqL1xuICBzZXRMZXZlbChsZXZlbDogTG9nTGV2ZWwpOiB2b2lkIHtcbiAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBsZXZlbCBzaG91bGQgYmUgbG9nZ2VkXG4gICAqL1xuICBwcml2YXRlIHNob3VsZExvZyhsZXZlbDogTG9nTGV2ZWwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gTE9HX0xFVkVMX1BSSU9SSVRZW2xldmVsXSA+PSBMT0dfTEVWRUxfUFJJT1JJVFlbdGhpcy5sZXZlbF07XG4gIH1cblxuICAvKipcbiAgICogT3V0cHV0IGxvZ1xuICAgKi9cbiAgcHJpdmF0ZSBsb2cobGV2ZWw6IExvZ0xldmVsLCBtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3VsZExvZyhsZXZlbCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlcihsZXZlbCwgdGhpcy5uYW1lLCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdkZWJ1ZycsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICB9XG5cbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdpbmZvJywgbWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ3dhcm4nLCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ2Vycm9yJywgbWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgbG9nZ2VyXG4gKiBAcGFyYW0gbmFtZSAtIExvZ2dlciBuYW1lIChkZWZhdWx0OiBcIndpa2lkb3RcIilcbiAqIEByZXR1cm5zIExvZ2dlciBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9nZ2VyKG5hbWUgPSAnd2lraWRvdCcpOiBMb2dnZXIge1xuICByZXR1cm4gbmV3IExvZ2dlcihuYW1lKTtcbn1cblxuLyoqXG4gKiBTZXR1cCBjb25zb2xlIG91dHB1dCBoYW5kbGVyXG4gKiBAcGFyYW0gbG9nZ2VyIC0gTG9nZ2VyIHRvIGNvbmZpZ3VyZVxuICogQHBhcmFtIGxldmVsIC0gTG9nIGxldmVsIChkZWZhdWx0OiBcIndhcm5cIilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwQ29uc29sZUhhbmRsZXIobG9nZ2VyOiBMb2dnZXIsIGxldmVsOiBMb2dMZXZlbCA9ICd3YXJuJyk6IHZvaWQge1xuICBsb2dnZXIuc2V0SGFuZGxlcihjb25zb2xlSGFuZGxlcik7XG4gIGxvZ2dlci5zZXRMZXZlbChsZXZlbCk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBsb2dnZXIgdXNlZCB0aHJvdWdob3V0IHRoZSBwYWNrYWdlXG4gKi9cbmV4cG9ydCBjb25zdCBsb2dnZXI6IExvZ2dlciA9IGdldExvZ2dlcigpO1xuIiwKICAgICJpbXBvcnQgeyBlcnIsIGVyckFzeW5jLCBvaywgb2tBc3luYywgdHlwZSBSZXN1bHQsIFJlc3VsdEFzeW5jIH0gZnJvbSAnbmV2ZXJ0aHJvdyc7XG5pbXBvcnQgdHlwZSB7IFdpa2lkb3RFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKiBTeW5jaHJvbm91cyBSZXN1bHQgdHlwZSBhbGlhcyAqL1xuZXhwb3J0IHR5cGUgV2lraWRvdFJlc3VsdDxUPiA9IFJlc3VsdDxULCBXaWtpZG90RXJyb3I+O1xuXG4vKiogQXN5bmNocm9ub3VzIFJlc3VsdCB0eXBlIGFsaWFzICovXG5leHBvcnQgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmM8VD4gPSBSZXN1bHRBc3luYzxULCBXaWtpZG90RXJyb3I+O1xuXG4vKiogQ3JlYXRlIHN1Y2Nlc3MgUmVzdWx0ICovXG5leHBvcnQgY29uc3Qgd2RPayA9IDxUPih2YWx1ZTogVCk6IFdpa2lkb3RSZXN1bHQ8VD4gPT4gb2sodmFsdWUpO1xuXG4vKiogQ3JlYXRlIGVycm9yIFJlc3VsdCAqL1xuZXhwb3J0IGNvbnN0IHdkRXJyID0gPEUgZXh0ZW5kcyBXaWtpZG90RXJyb3I+KGVycm9yOiBFKTogV2lraWRvdFJlc3VsdDxuZXZlcj4gPT4gZXJyKGVycm9yKTtcblxuLyoqIENyZWF0ZSBzdWNjZXNzIFJlc3VsdEFzeW5jICovXG5leHBvcnQgY29uc3Qgd2RPa0FzeW5jID0gPFQ+KHZhbHVlOiBUKTogV2lraWRvdFJlc3VsdEFzeW5jPFQ+ID0+IG9rQXN5bmModmFsdWUpO1xuXG4vKiogQ3JlYXRlIGVycm9yIFJlc3VsdEFzeW5jICovXG5leHBvcnQgY29uc3Qgd2RFcnJBc3luYyA9IDxFIGV4dGVuZHMgV2lraWRvdEVycm9yPihlcnJvcjogRSk6IFdpa2lkb3RSZXN1bHRBc3luYzxuZXZlcj4gPT5cbiAgZXJyQXN5bmMoZXJyb3IpO1xuXG4vKiogQ29udmVydCBmcm9tIFByb21pc2UgKi9cbmV4cG9ydCBjb25zdCBmcm9tUHJvbWlzZSA9IDxUPihcbiAgcHJvbWlzZTogUHJvbWlzZTxUPixcbiAgZXJyb3JNYXBwZXI6IChlcnJvcjogdW5rbm93bikgPT4gV2lraWRvdEVycm9yXG4pOiBXaWtpZG90UmVzdWx0QXN5bmM8VD4gPT4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UocHJvbWlzZSwgZXJyb3JNYXBwZXIpO1xuXG4vKiogQ29tYmluZSBtdWx0aXBsZSBSZXN1bHRBc3luYyAqL1xuZXhwb3J0IGNvbnN0IGNvbWJpbmVSZXN1bHRzID0gPFQ+KHJlc3VsdHM6IFdpa2lkb3RSZXN1bHRBc3luYzxUPltdKTogV2lraWRvdFJlc3VsdEFzeW5jPFRbXT4gPT5cbiAgUmVzdWx0QXN5bmMuY29tYmluZShyZXN1bHRzKTtcbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnLi9yZXN1bHQnO1xuIiwKICAgICIvKipcbiAqIEFqYXggTW9kdWxlIENvbm5lY3RvciBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQU1DQ29uZmlnIHtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCAobWlsbGlzZWNvbmRzKSAqL1xuICB0aW1lb3V0OiBudW1iZXI7XG5cbiAgLyoqIE1heGltdW0gcmV0cnkgY291bnQgKi9cbiAgcmV0cnlMaW1pdDogbnVtYmVyO1xuXG4gIC8qKiBCYXNlIHJldHJ5IGludGVydmFsIChtaWxsaXNlY29uZHMpICovXG4gIHJldHJ5SW50ZXJ2YWw6IG51bWJlcjtcblxuICAvKiogTWF4aW11bSBiYWNrb2ZmIChtaWxsaXNlY29uZHMpICovXG4gIG1heEJhY2tvZmY6IG51bWJlcjtcblxuICAvKiogQmFja29mZiBmYWN0b3IgKi9cbiAgYmFja29mZkZhY3RvcjogbnVtYmVyO1xuXG4gIC8qKiBNYXhpbXVtIGNvbmN1cnJlbnQgcmVxdWVzdHMgKi9cbiAgc2VtYXBob3JlTGltaXQ6IG51bWJlcjtcbn1cblxuLyoqIERlZmF1bHQgQU1DIGNvbmZpZ3VyYXRpb24gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FNQ19DT05GSUc6IEFNQ0NvbmZpZyA9IHtcbiAgdGltZW91dDogMjAwMDAsXG4gIHJldHJ5TGltaXQ6IDUsXG4gIHJldHJ5SW50ZXJ2YWw6IDEwMDAsXG4gIG1heEJhY2tvZmY6IDYwMDAwLFxuICBiYWNrb2ZmRmFjdG9yOiAyLjAsXG4gIHNlbWFwaG9yZUxpbWl0OiAxMCxcbn07XG5cbi8qKlxuICogRml4ZWQgdG9rZW4gdmFsdWUgcmVxdWlyZWQgYnkgV2lraWRvdFxuICogVGhpcyBpcyBhIGZpeGVkIHZhbHVlIG9idGFpbmVkIGZyb20gV2lraWRvdCdzIGZyb250ZW5kLFxuICogdXNlZCBhcyBhbiBpZGVudGlmaWVyIHJhdGhlciB0aGFuIGEgc2VjdXJpdHkgdG9rZW5cbiAqL1xuZXhwb3J0IGNvbnN0IFdJS0lET1RfVE9LRU43ID0gJzEyMzQ1Nic7XG5cbi8qKlxuICogRmFsbGJhY2sgSFRUUCBzdGF0dXMgY29kZSBmb3IgSFRUUCBlcnJvcnNcbiAqIFVzZWQgd2hlbiBzdGF0dXMgY29kZSBjYW5ub3QgYmUgcmV0cmlldmVkIGZyb20gcmVzcG9uc2VcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSFRUUF9TVEFUVVNfQ09ERSA9IDk5OTtcbiIsCiAgICAiLyoqXG4gKiBIVFRQIHV0aWxpdGllcyB3aXRoIHJldHJ5IG1lY2hhbmlzbVxuICovXG5pbXBvcnQgdHlwZSB7IEFNQ0NvbmZpZyB9IGZyb20gJy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcbmltcG9ydCB7IERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcblxuLyoqXG4gKiBDYWxjdWxhdGUgYmFja29mZiB0aW1lIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiBhbmQgaml0dGVyXG4gKiBAcGFyYW0gcmV0cnlDb3VudCAtIEN1cnJlbnQgcmV0cnkgY291bnQgKDEtYmFzZWQpXG4gKiBAcGFyYW0gYmFzZUludGVydmFsIC0gQmFzZSBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSBiYWNrb2ZmRmFjdG9yIC0gRXhwb25lbnRpYWwgYmFja29mZiBmYWN0b3JcbiAqIEBwYXJhbSBtYXhCYWNrb2ZmIC0gTWF4aW11bSBiYWNrb2ZmIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyBCYWNrb2ZmIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVCYWNrb2ZmKFxuICByZXRyeUNvdW50OiBudW1iZXIsXG4gIGJhc2VJbnRlcnZhbDogbnVtYmVyLFxuICBiYWNrb2ZmRmFjdG9yOiBudW1iZXIsXG4gIG1heEJhY2tvZmY6IG51bWJlclxuKTogbnVtYmVyIHtcbiAgY29uc3QgYmFja29mZiA9IGJhc2VJbnRlcnZhbCAqIGJhY2tvZmZGYWN0b3IgKiogKHJldHJ5Q291bnQgLSAxKTtcbiAgY29uc3Qgaml0dGVyID0gTWF0aC5yYW5kb20oKSAqIGJhY2tvZmYgKiAwLjE7XG4gIHJldHVybiBNYXRoLm1pbihiYWNrb2ZmICsgaml0dGVyLCBtYXhCYWNrb2ZmKTtcbn1cblxuLyoqXG4gKiBTbGVlcCBmb3Igc3BlY2lmaWVkIG1pbGxpc2Vjb25kc1xuICovXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGZldGNoV2l0aFJldHJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hXaXRoUmV0cnlPcHRpb25zIGV4dGVuZHMgT21pdDxSZXF1ZXN0SW5pdCwgJ3NpZ25hbCc+IHtcbiAgLyoqIFdoZXRoZXIgdG8gY2hlY2sgcmVzcG9uc2Uub2sgKGRlZmF1bHQ6IHRydWUpICovXG4gIGNoZWNrT2s/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIEhUVFAgc3RhdHVzIGNvZGUgaXMgcmV0cnlhYmxlICg1eHggc2VydmVyIGVycm9ycylcbiAqL1xuZnVuY3Rpb24gaXNSZXRyeWFibGVTdGF0dXMoc3RhdHVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHN0YXR1cyA+PSA1MDAgJiYgc3RhdHVzIDwgNjAwO1xufVxuXG4vKipcbiAqIEZldGNoIHdpdGggYXV0b21hdGljIHJldHJ5IG9uIHRpbWVvdXQvbmV0d29yayBlcnJvcnMgYW5kIDV4eCBlcnJvcnNcbiAqIEBwYXJhbSB1cmwgLSBVUkwgdG8gZmV0Y2hcbiAqIEBwYXJhbSBjb25maWcgLSBBTUMgY29uZmlndXJhdGlvbiAodXNlcyB0aW1lb3V0LCByZXRyeUxpbWl0LCByZXRyeUludGVydmFsLCBtYXhCYWNrb2ZmLCBiYWNrb2ZmRmFjdG9yKVxuICogQHBhcmFtIG9wdGlvbnMgLSBGZXRjaCBvcHRpb25zIChSZXF1ZXN0SW5pdCB3aXRob3V0IHNpZ25hbClcbiAqIEByZXR1cm5zIFJlc3BvbnNlXG4gKiBAdGhyb3dzIEVycm9yIG9uIGFsbCByZXRyaWVzIGV4aGF1c3RlZCBvciBub24tcmV0cnlhYmxlIGVycm9ycyAoNHh4KVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hXaXRoUmV0cnkoXG4gIHVybDogc3RyaW5nLFxuICBjb25maWc6IEFNQ0NvbmZpZyA9IERFRkFVTFRfQU1DX0NPTkZJRyxcbiAgb3B0aW9uczogRmV0Y2hXaXRoUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgeyBjaGVja09rID0gdHJ1ZSwgLi4uZmV0Y2hPcHRpb25zIH0gPSBvcHRpb25zO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgY29uZmlnLnJldHJ5TGltaXQ7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dChjb25maWcudGltZW91dCksXG4gICAgICB9KTtcblxuICAgICAgLy8gRG9uJ3QgcmV0cnkgNHh4IGVycm9ycyAtIHRoZXkgYXJlIGNsaWVudCBlcnJvcnMgdGhhdCB3b24ndCBjaGFuZ2Ugb24gcmV0cnlcbiAgICAgIGlmIChjaGVja09rICYmICFyZXNwb25zZS5vaykge1xuICAgICAgICBpZiAoIWlzUmV0cnlhYmxlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNXh4IGVycm9ycyBhcmUgcmV0cnlhYmxlLCBjb250aW51ZSB0byByZXRyeSBsb2dpYyBiZWxvd1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIERvbid0IHJldHJ5IGlmIGl0J3MgYSBub24tcmV0cnlhYmxlIEhUVFAgZXJyb3IgKDR4eClcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnSFRUUCA0JykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoYXR0ZW1wdCA+PSBjb25maWcucmV0cnlMaW1pdCAtIDEpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrb2ZmID0gY2FsY3VsYXRlQmFja29mZihcbiAgICAgICAgYXR0ZW1wdCArIDEsXG4gICAgICAgIGNvbmZpZy5yZXRyeUludGVydmFsLFxuICAgICAgICBjb25maWcuYmFja29mZkZhY3RvcixcbiAgICAgICAgY29uZmlnLm1heEJhY2tvZmZcbiAgICAgICk7XG4gICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZScpO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENsaWVudFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyLCBVc2VyVHlwZSB9IGZyb20gJy4vYWJzdHJhY3QtdXNlcic7XG5cbi8qKlxuICogQW5vbnltb3VzIHVzZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFub255bW91c1VzZXIgaW1wbGVtZW50cyBBYnN0cmFjdFVzZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnRSZWY7XG5cbiAgLyoqIFVzZXIgSUQgKDAgZm9yIGFub255bW91cykgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXIgPSAwO1xuXG4gIC8qKiBVc2VybmFtZSAoXCJBbm9ueW1vdXNcIiBmb3IgYW5vbnltb3VzIHVzZXJzKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gJ0Fub255bW91cyc7XG5cbiAgLyoqIFVOSVggZm9ybWF0IHVzZXJuYW1lICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nID0gJ2Fub255bW91cyc7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG51bGwgZm9yIGFub255bW91cykgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF2YXRhclVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIElQIGFkZHJlc3MgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwOiBzdHJpbmc7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ2Fub255bW91cyc7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnRSZWYsIGlwOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlwID0gaXA7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXIgaW1wbGVtZW50YXRpb25cbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0Fub255bW91c1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzV2lraWRvdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEFub255bW91c1VzZXIobmFtZT0ke3RoaXMubmFtZX0sIHVuaXhOYW1lPSR7dGhpcy51bml4TmFtZX0sIGlwPSR7dGhpcy5pcH0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENsaWVudFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyLCBVc2VyVHlwZSB9IGZyb20gJy4vYWJzdHJhY3QtdXNlcic7XG5cbi8qKlxuICogRGVsZXRlZCB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWxldGVkVXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogRGVsZXRlZCB1c2VyIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBVc2VybmFtZSAoXCJhY2NvdW50IGRlbGV0ZWRcIiBmb3IgZGVsZXRlZCB1c2VycykgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyA9ICdhY2NvdW50IGRlbGV0ZWQnO1xuXG4gIC8qKiBVTklYIGZvcm1hdCB1c2VybmFtZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdW5peE5hbWU6IHN0cmluZyA9ICdhY2NvdW50X2RlbGV0ZWQnO1xuXG4gIC8qKiBBdmF0YXIgVVJMIChudWxsIGZvciBkZWxldGVkKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAobnVsbCBmb3IgZGVsZXRlZCkgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogVXNlciB0eXBlICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyVHlwZTogVXNlclR5cGUgPSAnZGVsZXRlZCc7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnRSZWYsIGlkOiBudW1iZXIpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlkID0gaWQ7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXIgaW1wbGVtZW50YXRpb25cbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlzQW5vbnltb3VzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzV2lraWRvdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYERlbGV0ZWRVc2VyKGlkPSR7dGhpcy5pZH0sIG5hbWU9JHt0aGlzLm5hbWV9LCB1bml4TmFtZT0ke3RoaXMudW5peE5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDbGllbnRSZWYgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciwgVXNlclR5cGUgfSBmcm9tICcuL2Fic3RyYWN0LXVzZXInO1xuXG4vKipcbiAqIEd1ZXN0IHVzZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEd1ZXN0VXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogVXNlciBJRCAoMCBmb3IgZ3Vlc3QpICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyID0gMDtcblxuICAvKiogR3Vlc3QgbmFtZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBVTklYIGZvcm1hdCB1c2VybmFtZSAobnVsbCBmb3IgZ3Vlc3QpICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG1heSBiZSBHcmF2YXRhcikgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF2YXRhclVybDogc3RyaW5nIHwgbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAobnVsbCBmb3IgZ3Vlc3QpICovXG4gIHB1YmxpYyByZWFkb25seSBpcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ2d1ZXN0JztcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudFJlZiwgbmFtZTogc3RyaW5nLCBhdmF0YXJVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmF2YXRhclVybCA9IGF2YXRhclVybDtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlciBpbXBsZW1lbnRhdGlvblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzRGVsZXRlZFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzQW5vbnltb3VzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgR3Vlc3RVc2VyKG5hbWU9JHt0aGlzLm5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiLyoqXG4gKiBNYXBwaW5nIHRhYmxlIGZvciBjb252ZXJ0aW5nIHNwZWNpYWwgc3ltYm9scyBhbmQgbm9uLUVuZ2xpc2ggYWxwaGFiZXRzIHRvIEVuZ2xpc2ggYWxwaGFiZXRzXG4gKlxuICogUHJvdmlkZXMgbWFwcGluZyBmb3IgY29udmVydGluZyBub24tQVNDSUkgY2hhcmFjdGVycyB0byBjb3JyZXNwb25kaW5nIEFTQ0lJIGNoYXJhY3RlcnMuXG4gKiBNYWlubHkgdXNlZCBmb3IgVVJMIGdlbmVyYXRpb24gYW5kIHBhZ2UgbmFtZSBjb252ZXJzaW9uIHRvIHVuaXggZm9ybWF0LlxuICovXG5cbmV4cG9ydCBjb25zdCBzcGVjaWFsQ2hhck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ1xcdTAwQzAnOiAnYScsXG4gICdcXHUwMEMxJzogJ2EnLFxuICAnXFx1MDBDMic6ICdhJyxcbiAgJ1xcdTAwQzMnOiAnYScsXG4gICdcXHUwMEM0JzogJ2FlJyxcbiAgJ1xcdTAwQzUnOiAnYScsXG4gICdcXHUwMEM2JzogJ2FlJyxcbiAgJ1xcdTAwQzcnOiAnYycsXG4gICdcXHUwMEM4JzogJ2UnLFxuICAnXFx1MDBDOSc6ICdlJyxcbiAgJ1xcdTAwQ0EnOiAnZScsXG4gICdcXHUwMENCJzogJ2UnLFxuICAnXFx1MDBDQyc6ICdpJyxcbiAgJ1xcdTAwQ0QnOiAnaScsXG4gICdcXHUwMENFJzogJ2knLFxuICAnXFx1MDBDRic6ICdpJyxcbiAgJ1xcdTAwRDAnOiAnZCcsXG4gICdcXHUwMEQxJzogJ24nLFxuICAnXFx1MDBEMic6ICdvJyxcbiAgJ1xcdTAwRDMnOiAnbycsXG4gICdcXHUwMEQ0JzogJ28nLFxuICAnXFx1MDBENSc6ICdvJyxcbiAgJ1xcdTAwRDYnOiAnb2UnLFxuICAnXFx1MDBEOCc6ICdvJyxcbiAgJ1xcdTAwRDknOiAndScsXG4gICdcXHUwMERBJzogJ3UnLFxuICAnXFx1MDBEQic6ICd1JyxcbiAgJ1xcdTAwREMnOiAndWUnLFxuICAnXFx1MDBERCc6ICd5JyxcbiAgJ1xcdTAwREUnOiAndCcsXG4gICdcXHUwMERGJzogJ3NzJyxcbiAgJ1xcdTAwRTAnOiAnYScsXG4gICdcXHUwMEUxJzogJ2EnLFxuICAnXFx1MDBFMic6ICdhJyxcbiAgJ1xcdTAwRTMnOiAnYScsXG4gICdcXHUwMEU0JzogJ2FlJyxcbiAgJ1xcdTAwRTUnOiAnYScsXG4gICdcXHUwMEU2JzogJ2FlJyxcbiAgJ1xcdTAwRTcnOiAnYycsXG4gICdcXHUwMEU4JzogJ2UnLFxuICAnXFx1MDBFOSc6ICdlJyxcbiAgJ1xcdTAwRUEnOiAnZScsXG4gICdcXHUwMEVCJzogJ2UnLFxuICAnXFx1MDBFQyc6ICdpJyxcbiAgJ1xcdTAwRUQnOiAnaScsXG4gICdcXHUwMEVFJzogJ2knLFxuICAnXFx1MDBFRic6ICdpJyxcbiAgJ1xcdTAwRjAnOiAnZCcsXG4gICdcXHUwMEYxJzogJ24nLFxuICAnXFx1MDBGMic6ICdvJyxcbiAgJ1xcdTAwRjMnOiAnbycsXG4gICdcXHUwMEY0JzogJ28nLFxuICAnXFx1MDBGNSc6ICdvJyxcbiAgJ1xcdTAwRjYnOiAnb2UnLFxuICAnXFx1MDBGOCc6ICdvJyxcbiAgJ1xcdTAwRjknOiAndScsXG4gICdcXHUwMEZBJzogJ3UnLFxuICAnXFx1MDBGQic6ICd1JyxcbiAgJ1xcdTAwRkMnOiAndWUnLFxuICAnXFx1MDBGRCc6ICd5JyxcbiAgJ1xcdTAwRkUnOiAndCcsXG4gICdcXHUwMEZGJzogJ3knLFxuICAnXFx1MDEwMCc6ICdhJyxcbiAgJ1xcdTAxMDEnOiAnYScsXG4gICdcXHUwMTAyJzogJ2EnLFxuICAnXFx1MDEwMyc6ICdhJyxcbiAgJ1xcdTAxMDQnOiAnYScsXG4gICdcXHUwMTA1JzogJ2EnLFxuICAnXFx1MDEwNic6ICdjJyxcbiAgJ1xcdTAxMDcnOiAnYycsXG4gICdcXHUwMTA4JzogJ2MnLFxuICAnXFx1MDEwOSc6ICdjJyxcbiAgJ1xcdTAxMEEnOiAnYycsXG4gICdcXHUwMTBCJzogJ2MnLFxuICAnXFx1MDEwQyc6ICdjJyxcbiAgJ1xcdTAxMEQnOiAnYycsXG4gICdcXHUwMTBFJzogJ2QnLFxuICAnXFx1MDEwRic6ICdkJyxcbiAgJ1xcdTAxMTAnOiAnZCcsXG4gICdcXHUwMTExJzogJ2QnLFxuICAnXFx1MDExMic6ICdlJyxcbiAgJ1xcdTAxMTMnOiAnZScsXG4gICdcXHUwMTE0JzogJ2UnLFxuICAnXFx1MDExNSc6ICdlJyxcbiAgJ1xcdTAxMTYnOiAnZScsXG4gICdcXHUwMTE3JzogJ2UnLFxuICAnXFx1MDExOCc6ICdlJyxcbiAgJ1xcdTAxMTknOiAnZScsXG4gICdcXHUwMTFBJzogJ2UnLFxuICAnXFx1MDExQic6ICdlJyxcbiAgJ1xcdTAxMUMnOiAnZycsXG4gICdcXHUwMTFEJzogJ2cnLFxuICAnXFx1MDExRSc6ICdnJyxcbiAgJ1xcdTAxMUYnOiAnZycsXG4gICdcXHUwMTIwJzogJ2cnLFxuICAnXFx1MDEyMSc6ICdnJyxcbiAgJ1xcdTAxMjInOiAnZycsXG4gICdcXHUwMTIzJzogJ2cnLFxuICAnXFx1MDEyNCc6ICdoJyxcbiAgJ1xcdTAxMjUnOiAnaCcsXG4gICdcXHUwMTI2JzogJ2gnLFxuICAnXFx1MDEyNyc6ICdoJyxcbiAgJ1xcdTAxMjgnOiAnaScsXG4gICdcXHUwMTI5JzogJ2knLFxuICAnXFx1MDEyQSc6ICdpJyxcbiAgJ1xcdTAxMkInOiAnaScsXG4gICdcXHUwMTJDJzogJ2knLFxuICAnXFx1MDEyRCc6ICdpJyxcbiAgJ1xcdTAxMkUnOiAnaScsXG4gICdcXHUwMTJGJzogJ2knLFxuICAnXFx1MDEzMCc6ICdpJyxcbiAgJ1xcdTAxMzEnOiAnaScsXG4gICdcXHUwMTMyJzogJ2lqJyxcbiAgJ1xcdTAxMzMnOiAnaWonLFxuICAnXFx1MDEzNCc6ICdqJyxcbiAgJ1xcdTAxMzUnOiAnaicsXG4gICdcXHUwMTM2JzogJ2snLFxuICAnXFx1MDEzNyc6ICdrJyxcbiAgJ1xcdTAxMzgnOiAnaycsXG4gICdcXHUwMTM5JzogJ2wnLFxuICAnXFx1MDEzQSc6ICdsJyxcbiAgJ1xcdTAxM0InOiAnbCcsXG4gICdcXHUwMTNDJzogJ2wnLFxuICAnXFx1MDEzRCc6ICdsJyxcbiAgJ1xcdTAxM0UnOiAnbCcsXG4gICdcXHUwMTNGJzogJ2wnLFxuICAnXFx1MDE0MCc6ICdsJyxcbiAgJ1xcdTAxNDEnOiAnbCcsXG4gICdcXHUwMTQyJzogJ2wnLFxuICAnXFx1MDE0Myc6ICduJyxcbiAgJ1xcdTAxNDQnOiAnbicsXG4gICdcXHUwMTQ1JzogJ24nLFxuICAnXFx1MDE0Nic6ICduJyxcbiAgJ1xcdTAxNDcnOiAnbicsXG4gICdcXHUwMTQ4JzogJ24nLFxuICAnXFx1MDE0OSc6ICduJyxcbiAgJ1xcdTAxNEEnOiAnbicsXG4gICdcXHUwMTRCJzogJ24nLFxuICAnXFx1MDE0Qyc6ICdvJyxcbiAgJ1xcdTAxNEQnOiAnbycsXG4gICdcXHUwMTRFJzogJ28nLFxuICAnXFx1MDE0Ric6ICdvJyxcbiAgJ1xcdTAxNTAnOiAnbycsXG4gICdcXHUwMTUxJzogJ28nLFxuICAnXFx1MDE1Mic6ICdvZScsXG4gICdcXHUwMTUzJzogJ29lJyxcbiAgJ1xcdTAxNTQnOiAncicsXG4gICdcXHUwMTU1JzogJ3InLFxuICAnXFx1MDE1Nic6ICdyJyxcbiAgJ1xcdTAxNTcnOiAncicsXG4gICdcXHUwMTU4JzogJ3InLFxuICAnXFx1MDE1OSc6ICdyJyxcbiAgJ1xcdTAxNUEnOiAncycsXG4gICdcXHUwMTVCJzogJ3MnLFxuICAnXFx1MDE1Qyc6ICdzJyxcbiAgJ1xcdTAxNUQnOiAncycsXG4gICdcXHUwMTVFJzogJ3MnLFxuICAnXFx1MDE1Ric6ICdzJyxcbiAgJ1xcdTAxNjAnOiAncycsXG4gICdcXHUwMTYxJzogJ3MnLFxuICAnXFx1MDE2Mic6ICd0JyxcbiAgJ1xcdTAxNjMnOiAndCcsXG4gICdcXHUwMTY0JzogJ3QnLFxuICAnXFx1MDE2NSc6ICd0JyxcbiAgJ1xcdTAxNjYnOiAndCcsXG4gICdcXHUwMTY3JzogJ3QnLFxuICAnXFx1MDE2OCc6ICd1JyxcbiAgJ1xcdTAxNjknOiAndScsXG4gICdcXHUwMTZBJzogJ3UnLFxuICAnXFx1MDE2Qic6ICd1JyxcbiAgJ1xcdTAxNkMnOiAndScsXG4gICdcXHUwMTZEJzogJ3UnLFxuICAnXFx1MDE2RSc6ICd1JyxcbiAgJ1xcdTAxNkYnOiAndScsXG4gICdcXHUwMTcwJzogJ3UnLFxuICAnXFx1MDE3MSc6ICd1JyxcbiAgJ1xcdTAxNzInOiAndScsXG4gICdcXHUwMTczJzogJ3UnLFxuICAnXFx1MDE3NCc6ICd3JyxcbiAgJ1xcdTAxNzUnOiAndycsXG4gICdcXHUwMTc2JzogJ3knLFxuICAnXFx1MDE3Nyc6ICd5JyxcbiAgJ1xcdTAxNzgnOiAneScsXG4gICdcXHUwMTc5JzogJ3onLFxuICAnXFx1MDE3QSc6ICd6JyxcbiAgJ1xcdTAxN0InOiAneicsXG4gICdcXHUwMTdDJzogJ3onLFxuICAnXFx1MDE3RCc6ICd6JyxcbiAgJ1xcdTAxN0UnOiAneicsXG4gICdcXHUwMTdGJzogJ3NzJyxcbiAgJ1xcdTAxOTEnOiAnZicsXG4gICdcXHUwMTkyJzogJ2YnLFxuICAnXFx1MDIxOCc6ICdzJyxcbiAgJ1xcdTAyMTknOiAncycsXG4gICdcXHUwMjFBJzogJ3QnLFxuICAnXFx1MDIxQic6ICd0JyxcbiAgJ1xcdTAzODYnOiAnYScsXG4gICdcXHUwMzg4JzogJ2UnLFxuICAnXFx1MDM4OSc6ICdpJyxcbiAgJ1xcdTAzOEEnOiAnaScsXG4gICdcXHUwMzhDJzogJ28nLFxuICAnXFx1MDM4RSc6ICd5JyxcbiAgJ1xcdTAzOEYnOiAnbycsXG4gICdcXHUwMzkwJzogJ2knLFxuICAnXFx1MDM5MSc6ICdhJyxcbiAgJ1xcdTAzOTInOiAndicsXG4gICdcXHUwMzkzJzogJ2cnLFxuICAnXFx1MDM5NCc6ICdkJyxcbiAgJ1xcdTAzOTUnOiAnZScsXG4gICdcXHUwMzk2JzogJ3onLFxuICAnXFx1MDM5Nyc6ICdpJyxcbiAgJ1xcdTAzOTgnOiAndGgnLFxuICAnXFx1MDM5OSc6ICdpJyxcbiAgJ1xcdTAzOUEnOiAnaycsXG4gICdcXHUwMzlCJzogJ2wnLFxuICAnXFx1MDM5Qyc6ICdtJyxcbiAgJ1xcdTAzOUQnOiAnbicsXG4gICdcXHUwMzlFJzogJ3gnLFxuICAnXFx1MDM5Ric6ICdvJyxcbiAgJ1xcdTAzQTAnOiAncCcsXG4gICdcXHUwM0ExJzogJ3InLFxuICAnXFx1MDNBMyc6ICdzJyxcbiAgJ1xcdTAzQTQnOiAndCcsXG4gICdcXHUwM0E1JzogJ3knLFxuICAnXFx1MDNBNic6ICdmJyxcbiAgJ1xcdTAzQTcnOiAnY2gnLFxuICAnXFx1MDNBOCc6ICdwcycsXG4gICdcXHUwM0E5JzogJ28nLFxuICAnXFx1MDNBQSc6ICdpJyxcbiAgJ1xcdTAzQUInOiAneScsXG4gICdcXHUwM0FDJzogJ2EnLFxuICAnXFx1MDNBRCc6ICdlJyxcbiAgJ1xcdTAzQUUnOiAnaScsXG4gICdcXHUwM0FGJzogJ2knLFxuICAnXFx1MDNCMCc6ICd5JyxcbiAgJ1xcdTAzQjEnOiAnYScsXG4gICdcXHUwM0IyJzogJ3YnLFxuICAnXFx1MDNCMyc6ICdnJyxcbiAgJ1xcdTAzQjQnOiAnZCcsXG4gICdcXHUwM0I1JzogJ2UnLFxuICAnXFx1MDNCNic6ICd6JyxcbiAgJ1xcdTAzQjcnOiAnaScsXG4gICdcXHUwM0I4JzogJ3RoJyxcbiAgJ1xcdTAzQjknOiAnaScsXG4gICdcXHUwM0JBJzogJ2snLFxuICAnXFx1MDNCQic6ICdsJyxcbiAgJ1xcdTAzQkMnOiAnbScsXG4gICdcXHUwM0JEJzogJ24nLFxuICAnXFx1MDNCRSc6ICd4JyxcbiAgJ1xcdTAzQkYnOiAnbycsXG4gICdcXHUwM0MwJzogJ3AnLFxuICAnXFx1MDNDMSc6ICdyJyxcbiAgJ1xcdTAzQzInOiAncycsXG4gICdcXHUwM0MzJzogJ3MnLFxuICAnXFx1MDNDNCc6ICd0JyxcbiAgJ1xcdTAzQzUnOiAneScsXG4gICdcXHUwM0M2JzogJ2YnLFxuICAnXFx1MDNDNyc6ICdjaCcsXG4gICdcXHUwM0M4JzogJ3BzJyxcbiAgJ1xcdTAzQzknOiAnbycsXG4gICdcXHUwM0NBJzogJ2knLFxuICAnXFx1MDNDQic6ICd5JyxcbiAgJ1xcdTAzQ0MnOiAnbycsXG4gICdcXHUwM0NEJzogJ3knLFxuICAnXFx1MDNDRSc6ICdvJyxcbiAgJ1xcdTAzRDEnOiAndGgnLFxuICAnXFx1MDQwMSc6ICdlJyxcbiAgJ1xcdTA0MDInOiAnZCcsXG4gICdcXHUwNDAzJzogJ2cnLFxuICAnXFx1MDQwNCc6ICdlJyxcbiAgJ1xcdTA0MDUnOiAneicsXG4gICdcXHUwNDA2JzogJ2knLFxuICAnXFx1MDQwNyc6ICdpJyxcbiAgJ1xcdTA0MDgnOiAnaicsXG4gICdcXHUwNDA5JzogJ2wnLFxuICAnXFx1MDQwQSc6ICduJyxcbiAgJ1xcdTA0MEInOiAnYycsXG4gICdcXHUwNDBDJzogJ2snLFxuICAnXFx1MDQwRSc6ICd1JyxcbiAgJ1xcdTA0MEYnOiAnZCcsXG4gICdcXHUwNDEwJzogJ2EnLFxuICAnXFx1MDQxMSc6ICdiJyxcbiAgJ1xcdTA0MTInOiAndicsXG4gICdcXHUwNDEzJzogJ2cnLFxuICAnXFx1MDQxNCc6ICdkJyxcbiAgJ1xcdTA0MTUnOiAnZScsXG4gICdcXHUwNDE2JzogJ3onLFxuICAnXFx1MDQxNyc6ICd6JyxcbiAgJ1xcdTA0MTgnOiAnaScsXG4gICdcXHUwNDE5JzogJ2onLFxuICAnXFx1MDQxQSc6ICdrJyxcbiAgJ1xcdTA0MUInOiAnbCcsXG4gICdcXHUwNDFDJzogJ20nLFxuICAnXFx1MDQxRCc6ICduJyxcbiAgJ1xcdTA0MUUnOiAnbycsXG4gICdcXHUwNDFGJzogJ3AnLFxuICAnXFx1MDQyMCc6ICdyJyxcbiAgJ1xcdTA0MjEnOiAncycsXG4gICdcXHUwNDIyJzogJ3QnLFxuICAnXFx1MDQyMyc6ICd1JyxcbiAgJ1xcdTA0MjQnOiAnZicsXG4gICdcXHUwNDI1JzogJ2gnLFxuICAnXFx1MDQyNic6ICdjJyxcbiAgJ1xcdTA0MjcnOiAnYycsXG4gICdcXHUwNDI4JzogJ3MnLFxuICAnXFx1MDQyOSc6ICdzJyxcbiAgJ1xcdTA0MkInOiAneScsXG4gICdcXHUwNDJEJzogJ2UnLFxuICAnXFx1MDQyRSc6ICd1JyxcbiAgJ1xcdTA0MkYnOiAnYScsXG4gICdcXHUwNDMwJzogJ2EnLFxuICAnXFx1MDQzMSc6ICdiJyxcbiAgJ1xcdTA0MzInOiAndicsXG4gICdcXHUwNDMzJzogJ2cnLFxuICAnXFx1MDQzNCc6ICdkJyxcbiAgJ1xcdTA0MzUnOiAnZScsXG4gICdcXHUwNDM2JzogJ3onLFxuICAnXFx1MDQzNyc6ICd6JyxcbiAgJ1xcdTA0MzgnOiAnaScsXG4gICdcXHUwNDM5JzogJ2onLFxuICAnXFx1MDQzQSc6ICdrJyxcbiAgJ1xcdTA0M0InOiAnbCcsXG4gICdcXHUwNDNDJzogJ20nLFxuICAnXFx1MDQzRCc6ICduJyxcbiAgJ1xcdTA0M0UnOiAnbycsXG4gICdcXHUwNDNGJzogJ3AnLFxuICAnXFx1MDQ0MCc6ICdyJyxcbiAgJ1xcdTA0NDEnOiAncycsXG4gICdcXHUwNDQyJzogJ3QnLFxuICAnXFx1MDQ0Myc6ICd1JyxcbiAgJ1xcdTA0NDQnOiAnZicsXG4gICdcXHUwNDQ1JzogJ2gnLFxuICAnXFx1MDQ0Nic6ICdjJyxcbiAgJ1xcdTA0NDcnOiAnYycsXG4gICdcXHUwNDQ4JzogJ3MnLFxuICAnXFx1MDQ0OSc6ICdzJyxcbiAgJ1xcdTA0NEInOiAneScsXG4gICdcXHUwNDREJzogJ2UnLFxuICAnXFx1MDQ0RSc6ICd1JyxcbiAgJ1xcdTA0NEYnOiAnYScsXG4gICdcXHUwNDUxJzogJ2UnLFxuICAnXFx1MDQ1Mic6ICdkJyxcbiAgJ1xcdTA0NTMnOiAnZycsXG4gICdcXHUwNDU0JzogJ2UnLFxuICAnXFx1MDQ1NSc6ICd6JyxcbiAgJ1xcdTA0NTYnOiAnaScsXG4gICdcXHUwNDU3JzogJ2knLFxuICAnXFx1MDQ1OCc6ICdqJyxcbiAgJ1xcdTA0NTknOiAnbCcsXG4gICdcXHUwNDVBJzogJ24nLFxuICAnXFx1MDQ1Qic6ICdjJyxcbiAgJ1xcdTA0NUMnOiAnaycsXG4gICdcXHUwNDVFJzogJ3UnLFxuICAnXFx1MDQ1Ric6ICdkJyxcbiAgJ1xcdTA0NjInOiAnZScsXG4gICdcXHUwNDYzJzogJ2UnLFxuICAnXFx1MDQ2QSc6ICdhJyxcbiAgJ1xcdTA0NkInOiAnYScsXG4gICdcXHUwNDcyJzogJ2YnLFxuICAnXFx1MDQ3Myc6ICdmJyxcbiAgJ1xcdTA0NzQnOiAneScsXG4gICdcXHUwNDc1JzogJ3knLFxuICAnXFx1MDQ5MCc6ICdnJyxcbiAgJ1xcdTA0OTEnOiAnZycsXG4gICdcXHUwNDkyJzogJ2cnLFxuICAnXFx1MDQ5Myc6ICdnJyxcbiAgJ1xcdTA0OTQnOiAnZycsXG4gICdcXHUwNDk1JzogJ2cnLFxuICAnXFx1MDQ5Nic6ICd6JyxcbiAgJ1xcdTA0OTcnOiAneicsXG4gICdcXHUwNDlBJzogJ2snLFxuICAnXFx1MDQ5Qic6ICdrJyxcbiAgJ1xcdTA0OUMnOiAnaycsXG4gICdcXHUwNDlEJzogJ2snLFxuICAnXFx1MDQ5RSc6ICdrJyxcbiAgJ1xcdTA0OUYnOiAnaycsXG4gICdcXHUwNEEwJzogJ2snLFxuICAnXFx1MDRBMSc6ICdrJyxcbiAgJ1xcdTA0QTInOiAnbicsXG4gICdcXHUwNEEzJzogJ24nLFxuICAnXFx1MDRBNCc6ICduJyxcbiAgJ1xcdTA0QTUnOiAnbicsXG4gICdcXHUwNEE2JzogJ3AnLFxuICAnXFx1MDRBNyc6ICdwJyxcbiAgJ1xcdTA0QTgnOiAnbycsXG4gICdcXHUwNEE5JzogJ28nLFxuICAnXFx1MDRBQSc6ICdzJyxcbiAgJ1xcdTA0QUInOiAncycsXG4gICdcXHUwNEFDJzogJ3QnLFxuICAnXFx1MDRBRCc6ICd0JyxcbiAgJ1xcdTA0QUUnOiAndScsXG4gICdcXHUwNEFGJzogJ3UnLFxuICAnXFx1MDRCMCc6ICd1JyxcbiAgJ1xcdTA0QjEnOiAndScsXG4gICdcXHUwNEIyJzogJ2gnLFxuICAnXFx1MDRCMyc6ICdoJyxcbiAgJ1xcdTA0QjQnOiAnYycsXG4gICdcXHUwNEI1JzogJ2MnLFxuICAnXFx1MDRCNic6ICdjJyxcbiAgJ1xcdTA0QjcnOiAnYycsXG4gICdcXHUwNEI4JzogJ2MnLFxuICAnXFx1MDRCOSc6ICdjJyxcbiAgJ1xcdTA0QkEnOiAnaCcsXG4gICdcXHUwNEJCJzogJ2gnLFxuICAnXFx1MDRCQyc6ICdjJyxcbiAgJ1xcdTA0QkQnOiAnYycsXG4gICdcXHUwNEJFJzogJ2MnLFxuICAnXFx1MDRCRic6ICdjJyxcbiAgJ1xcdTA0QzEnOiAneicsXG4gICdcXHUwNEMyJzogJ3onLFxuICAnXFx1MDRDMyc6ICdrJyxcbiAgJ1xcdTA0QzQnOiAnaycsXG4gICdcXHUwNEM1JzogJ2wnLFxuICAnXFx1MDRDNic6ICdsJyxcbiAgJ1xcdTA0QzcnOiAnbicsXG4gICdcXHUwNEM4JzogJ24nLFxuICAnXFx1MDRDOSc6ICduJyxcbiAgJ1xcdTA0Q0EnOiAnbicsXG4gICdcXHUwNENCJzogJ2MnLFxuICAnXFx1MDRDQyc6ICdjJyxcbiAgJ1xcdTA0RDAnOiAnYScsXG4gICdcXHUwNEQxJzogJ2EnLFxuICAnXFx1MDREMic6ICdhJyxcbiAgJ1xcdTA0RDMnOiAnYScsXG4gICdcXHUwNEQ0JzogJ2FlJyxcbiAgJ1xcdTA0RDUnOiAnYWUnLFxuICAnXFx1MDRENic6ICdlJyxcbiAgJ1xcdTA0RDcnOiAnZScsXG4gICdcXHUwNEQ4JzogJ2EnLFxuICAnXFx1MDREOSc6ICdhJyxcbiAgJ1xcdTA0REEnOiAnYScsXG4gICdcXHUwNERCJzogJ2EnLFxuICAnXFx1MDREQyc6ICd6JyxcbiAgJ1xcdTA0REQnOiAneicsXG4gICdcXHUwNERFJzogJ3onLFxuICAnXFx1MDRERic6ICd6JyxcbiAgJ1xcdTA0RTAnOiAneicsXG4gICdcXHUwNEUxJzogJ3onLFxuICAnXFx1MDRFMic6ICdpJyxcbiAgJ1xcdTA0RTMnOiAnaScsXG4gICdcXHUwNEU0JzogJ2knLFxuICAnXFx1MDRFNSc6ICdpJyxcbiAgJ1xcdTA0RTYnOiAnbycsXG4gICdcXHUwNEU3JzogJ28nLFxuICAnXFx1MDRFOCc6ICdvJyxcbiAgJ1xcdTA0RTknOiAnbycsXG4gICdcXHUwNEVBJzogJ28nLFxuICAnXFx1MDRFQic6ICdvJyxcbiAgJ1xcdTA0RUUnOiAndScsXG4gICdcXHUwNEVGJzogJ3UnLFxuICAnXFx1MDRGMCc6ICd1JyxcbiAgJ1xcdTA0RjEnOiAndScsXG4gICdcXHUwNEYyJzogJ3UnLFxuICAnXFx1MDRGMyc6ICd1JyxcbiAgJ1xcdTA0RjQnOiAnYycsXG4gICdcXHUwNEY1JzogJ2MnLFxuICAnXFx1MDRGOCc6ICd5JyxcbiAgJ1xcdTA0RjknOiAneScsXG4gICdcXHUwNTBBJzogJ24nLFxuICAnXFx1MDUwQic6ICduJyxcbiAgJ1xcdTA1MEUnOiAndCcsXG4gICdcXHUwNTBGJzogJ3QnLFxuICAnXFx1MDUxQSc6ICdxJyxcbiAgJ1xcdTA1MUInOiAncScsXG4gICdcXHUwNTFDJzogJ3cnLFxuICAnXFx1MDUxRCc6ICd3Jyxcbn07XG4iLAogICAgIi8qKlxuICogU3RyaW5nIHV0aWxpdGllc1xuICovXG5cbmltcG9ydCB7IHNwZWNpYWxDaGFyTWFwIH0gZnJvbSAnLi90YWJsZS9jaGFyLXRhYmxlJztcblxuLyoqXG4gKiBDb252ZXJ0IHN0cmluZyB0byBVbml4IGZvcm1hdFxuICpcbiAqIFBlcmZvcm1zIGNvbnZlcnNpb24gZm9sbG93aW5nIGxlZ2FjeSB3aWtpZG90IGltcGxlbWVudGF0aW9uLlxuICogLSBDb252ZXJ0cyBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gQVNDSUkgY2hhcmFjdGVyc1xuICogLSBDb252ZXJ0cyB0byBsb3dlcmNhc2VcbiAqIC0gQ29udmVydHMgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgdG8gaHlwaGVuc1xuICogLSBSZWR1Y2VzIGNvbnNlY3V0aXZlIGh5cGhlbnMvY29sb25zIHRvIHNpbmdsZVxuICogLSBSZW1vdmVzIGxlYWRpbmcvdHJhaWxpbmcgaHlwaGVucy9jb2xvbnNcbiAqXG4gKiBAcGFyYW0gdGFyZ2V0U3RyIC0gU3RyaW5nIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIENvbnZlcnRlZCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVW5peCh0YXJnZXRTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIENvbnZlcnQgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gIGxldCByZXN1bHQgPSAnJztcbiAgZm9yIChjb25zdCBjaGFyIG9mIHRhcmdldFN0cikge1xuICAgIGNvbnN0IG1hcHBlZCA9IHNwZWNpYWxDaGFyTWFwW2NoYXJdO1xuICAgIHJlc3VsdCArPSBtYXBwZWQgIT09IHVuZGVmaW5lZCA/IG1hcHBlZCA6IGNoYXI7XG4gIH1cblxuICAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxuICByZXN1bHQgPSByZXN1bHQudG9Mb3dlckNhc2UoKTtcblxuICAvLyBSZW1vdmUgbm9uLUFTQ0lJIGNoYXJhY3RlcnNcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1teYS16MC05XFwtOl9dL2csICctJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9eXy8sICc6XycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvKD88ITopXy9nLCAnLScpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXi0qLywgJycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvLSokLywgJycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvLXsyLH0vZywgJy0nKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLzp7Mix9L2csICc6Jyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC86LS9nLCAnOicpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvLTovZywgJzonKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL18tL2csICdfJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8tXy9nLCAnXycpO1xuXG4gIC8vIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBjb2xvbnNcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL146LywgJycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvOiQvLCAnJyk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpbmdVdGlsIGNsYXNzIChQeXRob24gY29tcGF0aWJsZSlcbiAqL1xuZXhwb3J0IGNvbnN0IFN0cmluZ1V0aWwgPSB7XG4gIHRvVW5peCxcbn07XG4iLAogICAgImltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4vdXNlcic7XG5cbi8qKlxuICogVXNlciBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFVzZXIgfCBudWxsPiB7XG4gIGNvbnN0cnVjdG9yKHVzZXJzPzogKFVzZXIgfCBudWxsKVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAodXNlcnMpIHtcbiAgICAgIHRoaXMucHVzaCguLi51c2Vycyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgdXNlcm5hbWVcbiAgICogQHBhcmFtIG5hbWUgLSBVc2VybmFtZVxuICAgKiBAcmV0dXJucyBVc2VyIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZmluZEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBVc2VyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgZm9yIChjb25zdCB1c2VyIG9mIHRoaXMpIHtcbiAgICAgIGlmICh1c2VyICYmIHVzZXIubmFtZS50b0xvd2VyQ2FzZSgpID09PSBsb3dlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSB1c2VyIElEXG4gICAqIEBwYXJhbSBpZCAtIFVzZXIgSURcbiAgICogQHJldHVybnMgVXNlciBvciB1bmRlZmluZWRcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBVc2VyIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IHVzZXIgb2YgdGhpcykge1xuICAgICAgaWYgKHVzZXIgJiYgdXNlci5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIG9ubHkgbm9uLW51bGwgdXNlcnNcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygbm9uLW51bGwgdXNlcnNcbiAgICovXG4gIGZpbHRlck5vbk51bGwoKTogVXNlcltdIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXIoKHVzZXIpOiB1c2VyIGlzIFVzZXIgPT4gdXNlciAhPT0gbnVsbCk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCBwTGltaXQgZnJvbSAncC1saW1pdCc7XG5pbXBvcnQgeyBOb0VsZW1lbnRFcnJvciwgTm90Rm91bmRFeGNlcHRpb24sIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4uLy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcbmltcG9ydCB7IGZldGNoV2l0aFJldHJ5IH0gZnJvbSAnLi4vLi4vdXRpbC9odHRwJztcbmltcG9ydCB7IHRvVW5peCB9IGZyb20gJy4uLy4uL3V0aWwvc3RyaW5nLXV0aWwnO1xuaW1wb3J0IHR5cGUgeyBDbGllbnRSZWYgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciwgVXNlclR5cGUgfSBmcm9tICcuL2Fic3RyYWN0LXVzZXInO1xuaW1wb3J0IHsgVXNlckNvbGxlY3Rpb24gfSBmcm9tICcuL3VzZXItY29sbGVjdGlvbic7XG5cbi8qKlxuICogVXNlciBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckRhdGEge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgYXZhdGFyVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgdW5peE5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVndWxhciB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyIGltcGxlbWVudHMgQWJzdHJhY3RVc2VyIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50UmVmO1xuXG4gIC8qKiBVc2VyIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBVc2VybmFtZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBEaXNwbGF5IG5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpc3BsYXlOYW1lOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKiBBdmF0YXIgVVJMICovXG4gIHB1YmxpYyByZWFkb25seSBhdmF0YXJVcmw6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqIFVOSVggZm9ybWF0IHVzZXJuYW1lICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nO1xuXG4gIC8qKiBJUCBhZGRyZXNzIChudWxsIGZvciByZWd1bGFyIHVzZXJzKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBVc2VyIHR5cGUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXJUeXBlOiBVc2VyVHlwZSA9ICd1c2VyJztcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudFJlZiwgZGF0YTogVXNlckRhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRhdGEuZGlzcGxheU5hbWUgPz8gbnVsbDtcbiAgICB0aGlzLmF2YXRhclVybCA9IGRhdGEuYXZhdGFyVXJsID8/IGBodHRwczovL3d3dy53aWtpZG90LmNvbS9hdmF0YXIucGhwP3VzZXJpZD0ke2RhdGEuaWR9YDtcbiAgICB0aGlzLnVuaXhOYW1lID0gZGF0YS51bml4TmFtZSA/PyB0b1VuaXgoZGF0YS5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdXNlciBmcm9tIHVzZXJuYW1lXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnRcbiAgICogQHBhcmFtIG5hbWUgLSBVc2VybmFtZVxuICAgKiBAcmV0dXJucyBVc2VyIChudWxsIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIHN0YXRpYyBmcm9tTmFtZShjbGllbnQ6IENsaWVudFJlZiwgbmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFVzZXIgfCBudWxsPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdW5peE5hbWUgPSB0b1VuaXgobmFtZSk7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy53aWtpZG90LmNvbS91c2VyOmluZm8vJHt1bml4TmFtZX1gO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkodXJsLCBERUZBVUxUX0FNQ19DT05GSUcsIHtcbiAgICAgICAgICBjaGVja09rOiBmYWxzZSwgLy8gSGFuZGxlIEhUVFAgZXJyb3JzIG1hbnVhbGx5XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGZldGNoIHVzZXIgaW5mbzogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgIC8vIENoZWNrIGV4aXN0ZW5jZVxuICAgICAgICBpZiAoJCgnZGl2LmVycm9yLWJsb2NrJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGlkXG4gICAgICAgIGNvbnN0IHVzZXJJZEVsZW0gPSAkKCdhLmJ0bi5idG4tZGVmYXVsdC5idG4teHMnKTtcbiAgICAgICAgaWYgKHVzZXJJZEVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdVc2VyIElEIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaHJlZiA9IHVzZXJJZEVsZW0uYXR0cignaHJlZicpO1xuICAgICAgICBpZiAoIWhyZWYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1VzZXIgSUQgaHJlZiBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VySWQgPSBOdW1iZXIucGFyc2VJbnQoaHJlZi5zcGxpdCgnLycpLnBvcCgpID8/ICcwJywgMTApO1xuXG4gICAgICAgIC8vIEdldCBuYW1lXG4gICAgICAgIGNvbnN0IG5hbWVFbGVtID0gJCgnaDEucHJvZmlsZS10aXRsZScpO1xuICAgICAgICBpZiAobmFtZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdVc2VyIG5hbWUgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VyTmFtZSA9IG5hbWVFbGVtLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyKGNsaWVudCwge1xuICAgICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgICAgbmFtZTogdXNlck5hbWUsXG4gICAgICAgICAgdW5peE5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHVzZXI6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VycyBmcm9tIG11bHRpcGxlIHVzZXJuYW1lc1xuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50XG4gICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIHVzZXJuYW1lc1xuICAgKiBAcmV0dXJucyBVc2VyIGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBmcm9tTmFtZXMoY2xpZW50OiBDbGllbnRSZWYsIG5hbWVzOiBzdHJpbmdbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxVc2VyQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIExpbWl0IGNvbmN1cnJlbnQgY29ubmVjdGlvbnNcbiAgICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQoREVGQVVMVF9BTUNfQ09ORklHLnNlbWFwaG9yZUxpbWl0KTtcblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgbmFtZXMubWFwKChuYW1lKSA9PlxuICAgICAgICAgICAgbGltaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBVc2VyLmZyb21OYW1lKGNsaWVudCwgbmFtZSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmVzdWx0LnZhbHVlIDogbnVsbDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJDb2xsZWN0aW9uKHJlc3VsdHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB1c2VyczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlciBpbXBsZW1lbnRhdGlvblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNEZWxldGVkVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNBbm9ueW1vdXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0d1ZXN0VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgVXNlcihpZD0ke3RoaXMuaWR9LCBuYW1lPSR7dGhpcy5uYW1lfSwgdW5peE5hbWU9JHt0aGlzLnVuaXhOYW1lfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcblxuLyoqXG4gKiBXaWtpZG90IHN5c3RlbSB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBXaWtpZG90VXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogVXNlciBJRCAoMCBmb3IgV2lraWRvdCBzeXN0ZW0pICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyID0gMDtcblxuICAvKiogVXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyA9ICdXaWtpZG90JztcblxuICAvKiogVU5JWCBmb3JtYXQgdXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmcgPSAnd2lraWRvdCc7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG51bGwgZm9yIHN5c3RlbSB1c2VyKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAobnVsbCBmb3Igc3lzdGVtIHVzZXIpICovXG4gIHB1YmxpYyByZWFkb25seSBpcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ3dpa2lkb3QnO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50UmVmKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXIgaW1wbGVtZW50YXRpb25cbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0Fub255bW91c1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzR3Vlc3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc1dpa2lkb3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdpa2lkb3RVc2VyKG5hbWU9JHt0aGlzLm5hbWV9LCB1bml4TmFtZT0ke3RoaXMudW5peE5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcbmV4cG9ydCB7IEFub255bW91c1VzZXIgfSBmcm9tICcuL2Fub255bW91cy11c2VyJztcbmV4cG9ydCB7IERlbGV0ZWRVc2VyIH0gZnJvbSAnLi9kZWxldGVkLXVzZXInO1xuZXhwb3J0IHsgR3Vlc3RVc2VyIH0gZnJvbSAnLi9ndWVzdC11c2VyJztcbmV4cG9ydCB7IFVzZXIsIHR5cGUgVXNlckRhdGEgfSBmcm9tICcuL3VzZXInO1xuZXhwb3J0IHsgVXNlckNvbGxlY3Rpb24gfSBmcm9tICcuL3VzZXItY29sbGVjdGlvbic7XG5leHBvcnQgeyBXaWtpZG90VXNlciB9IGZyb20gJy4vd2lraWRvdC11c2VyJztcbiIsCiAgICAiaW1wb3J0IHR5cGUgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlIH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9jb21tb24vbG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vLi4vbW9kdWxlL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vLi4vbW9kdWxlL3VzZXInO1xuaW1wb3J0IHsgQW5vbnltb3VzVXNlciwgRGVsZXRlZFVzZXIsIEd1ZXN0VXNlciwgVXNlciwgV2lraWRvdFVzZXIgfSBmcm9tICcuLi8uLi9tb2R1bGUvdXNlcic7XG5cbi8qKlxuICogUGFyc2UgcHJpbnR1c2VyIGVsZW1lbnQgYW5kIHJldHVybiB1c2VyIG9iamVjdFxuICpcbiAqIEBwYXJhbSBjbGllbnQgLSBXaWtpZG90IGNsaWVudFxuICogQHBhcmFtIGVsZW0gLSBFbGVtZW50IHRvIHBhcnNlIChlbGVtZW50IHdpdGggcHJpbnR1c2VyIGNsYXNzKVxuICogQHJldHVybnMgUGFyc2VkIHVzZXIgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVzZXIoY2xpZW50OiBDbGllbnRSZWYsIGVsZW06IGNoZWVyaW8uQ2hlZXJpbzxBbnlOb2RlPik6IEFic3RyYWN0VXNlciB7XG4gIGNvbnN0IGNsYXNzQXR0ciA9IGVsZW0uYXR0cignY2xhc3MnKSA/PyAnJztcbiAgY29uc3QgY2xhc3NlcyA9IGNsYXNzQXR0ci5zcGxpdCgvXFxzKy8pO1xuXG4gIC8vIENoZWNrIGZvciBkZWxldGVkIHVzZXJcbiAgaWYgKGNsYXNzZXMuaW5jbHVkZXMoJ2RlbGV0ZWQnKSkge1xuICAgIGNvbnN0IGRhdGFJZCA9IGVsZW0uYXR0cignZGF0YS1pZCcpO1xuICAgIGNvbnN0IHVzZXJJZCA9IGRhdGFJZCA/IE51bWJlci5wYXJzZUludChkYXRhSWQsIDEwKSA6IDA7XG4gICAgcmV0dXJuIG5ldyBEZWxldGVkVXNlcihjbGllbnQsIHVzZXJJZCk7XG4gIH1cblxuICAvLyBJZiB0ZXh0IGlzIFwiKHVzZXIgZGVsZXRlZClcIlxuICBjb25zdCB0ZXh0ID0gZWxlbS50ZXh0KCkudHJpbSgpO1xuICBpZiAodGV4dCA9PT0gJyh1c2VyIGRlbGV0ZWQpJykge1xuICAgIHJldHVybiBuZXcgRGVsZXRlZFVzZXIoY2xpZW50LCAwKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBhbm9ueW1vdXMgdXNlclxuICBpZiAoY2xhc3Nlcy5pbmNsdWRlcygnYW5vbnltb3VzJykpIHtcbiAgICBjb25zdCBpcEVsZW0gPSBlbGVtLmZpbmQoJ3NwYW4uaXAnKTtcbiAgICBpZiAoaXBFbGVtLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlwID0gaXBFbGVtLnRleHQoKS5yZXBsYWNlKC9bKCldL2csICcnKS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3IEFub255bW91c1VzZXIoY2xpZW50LCBpcCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQW5vbnltb3VzVXNlcihjbGllbnQsICcnKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBndWVzdCB1c2VyIChoYXMgR3JhdmF0YXIgYXZhdGFyKVxuICBjb25zdCBpbWdFbGVtID0gZWxlbS5maW5kKCdpbWcnKTtcbiAgaWYgKGltZ0VsZW0ubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHNyYyA9IGltZ0VsZW0uYXR0cignc3JjJykgPz8gJyc7XG4gICAgaWYgKHNyYy5pbmNsdWRlcygnZ3JhdmF0YXIuY29tJykpIHtcbiAgICAgIGNvbnN0IGd1ZXN0TmFtZSA9IHRleHQuc3BsaXQoJyAnKVswXSA/PyAnR3Vlc3QnO1xuICAgICAgcmV0dXJuIG5ldyBHdWVzdFVzZXIoY2xpZW50LCBndWVzdE5hbWUsIHNyYyk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIFdpa2lkb3Qgc3lzdGVtIHVzZXJcbiAgaWYgKHRleHQgPT09ICdXaWtpZG90Jykge1xuICAgIHJldHVybiBuZXcgV2lraWRvdFVzZXIoY2xpZW50KTtcbiAgfVxuXG4gIC8vIFJlZ3VsYXIgdXNlclxuICBjb25zdCBsaW5rcyA9IGVsZW0uZmluZCgnYScpO1xuICBpZiAobGlua3MubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gVHJlYXQgYXMgRGVsZXRlZFVzZXIgaWYgbm8gbGlua1xuICAgIHJldHVybiBuZXcgRGVsZXRlZFVzZXIoY2xpZW50LCAwKTtcbiAgfVxuXG4gIC8vIExhc3QgbGluayBpcyB0aGUgdXNlciBsaW5rXG4gIGNvbnN0IHVzZXJMaW5rID0gbGlua3MubGFzdCgpO1xuICBjb25zdCB1c2VyTmFtZSA9IHVzZXJMaW5rLnRleHQoKS50cmltKCk7XG4gIGNvbnN0IGhyZWYgPSB1c2VyTGluay5hdHRyKCdocmVmJykgPz8gJyc7XG4gIGNvbnN0IG9uY2xpY2sgPSB1c2VyTGluay5hdHRyKCdvbmNsaWNrJykgPz8gJyc7XG5cbiAgLy8gRXh0cmFjdCB1bml4X25hbWUgZnJvbSBocmVmXG4gIGNvbnN0IHVuaXhOYW1lID0gaHJlZi5yZXBsYWNlKC9eLipcXC91c2VyOmluZm9cXC8vLCAnJykucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBFeHRyYWN0IHVzZXJfaWQgZnJvbSBvbmNsaWNrXG4gIC8vIFBhdHRlcm46IFwiV0lLSURPVC5wYWdlLmxpc3RlbmVycy51c2VySW5mbygxMjM0NTYpOyByZXR1cm4gZmFsc2U7XCJcbiAgY29uc3QgdXNlcklkTWF0Y2ggPSBvbmNsaWNrLm1hdGNoKC91c2VySW5mb1xcKChcXGQrKVxcKS8pO1xuICBjb25zdCB1c2VySWQgPSB1c2VySWRNYXRjaD8uWzFdID8gTnVtYmVyLnBhcnNlSW50KHVzZXJJZE1hdGNoWzFdLCAxMCkgOiAwO1xuXG4gIC8vIEdlbmVyYXRlIGF2YXRhciBVUkxcbiAgY29uc3QgYXZhdGFyVXJsID0gdXNlcklkID4gMCA/IGBodHRwOi8vd3d3Lndpa2lkb3QuY29tL2F2YXRhci5waHA/dXNlcmlkPSR7dXNlcklkfWAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIG5ldyBVc2VyKGNsaWVudCwge1xuICAgIGlkOiB1c2VySWQsXG4gICAgbmFtZTogdXNlck5hbWUsXG4gICAgdW5peE5hbWUsXG4gICAgYXZhdGFyVXJsLFxuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSBkYXRlIGZyb20gb2RhdGUgZWxlbWVudFxuICpcbiAqIEBwYXJhbSBlbGVtIC0gRWxlbWVudCB0byBwYXJzZSAob2RhdGUgZWxlbWVudClcbiAqIEByZXR1cm5zIFBhcnNlZCBEYXRlLCBvciBudWxsIG9uIHBhcnNlIGZhaWx1cmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT2RhdGUoZWxlbTogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KTogRGF0ZSB8IG51bGwge1xuICBjb25zdCBjbGFzc0F0dHIgPSBlbGVtLmF0dHIoJ2NsYXNzJykgPz8gJyc7XG5cbiAgLy8gRXh0cmFjdCBVbml4IHRpbWVzdGFtcCBmcm9tIGNsYXNzXG4gIC8vIFBhdHRlcm46IFwib2RhdGUgdGltZV8xMjM0NTY3ODkwIGZvcm1hdF8uLi5cIiBmb3JtYXRcbiAgY29uc3QgdGltZU1hdGNoID0gY2xhc3NBdHRyLm1hdGNoKC90aW1lXyhcXGQrKS8pO1xuICBpZiAodGltZU1hdGNoPy5bMV0pIHtcbiAgICBjb25zdCB1bml4VGltZSA9IE51bWJlci5wYXJzZUludCh0aW1lTWF0Y2hbMV0sIDEwKTtcbiAgICByZXR1cm4gbmV3IERhdGUodW5peFRpbWUgKiAxMDAwKTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiBwYXJzZSBmcm9tIHRleHRcbiAgY29uc3QgdGV4dCA9IGVsZW0udGV4dCgpLnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSh0ZXh0KTtcbiAgaWYgKCFOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShwYXJzZWQpO1xuICB9XG5cbiAgLy8gUmV0dXJuIG51bGwgYW5kIGxvZyB3YXJuaW5nIGlmIHBhcnNpbmcgZmFpbHNcbiAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBvZGF0ZSBlbGVtZW50OiBjbGFzcz1cIiR7Y2xhc3NBdHRyfVwiLCB0ZXh0PVwiJHt0ZXh0fVwiYCk7XG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICJleHBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuL3VzZXInO1xuIiwKICAgICIvKipcbiAqIERlY29yYXRvciB1dGlsaXRpZXNcbiAqL1xuXG5pbXBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsIHdkRXJyQXN5bmMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUeXBlIGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIGNsaWVudCByZWZlcmVuY2VcbiAqL1xuaW50ZXJmYWNlIEhhc0NsaWVudCB7XG4gIGNsaWVudD86IHsgcmVxdWlyZUxvZ2luKCk6IHsgaXNFcnIoKTogYm9vbGVhbjsgZXJyb3I/OiBFcnJvciB9IH07XG4gIHNpdGU/OiB7IGNsaWVudDogeyByZXF1aXJlTG9naW4oKTogeyBpc0VycigpOiBib29sZWFuOyBlcnJvcj86IEVycm9yIH0gfSB9O1xuICB0aHJlYWQ/OiB7IHNpdGU6IHsgY2xpZW50OiB7IHJlcXVpcmVMb2dpbigpOiB7IGlzRXJyKCk6IGJvb2xlYW47IGVycm9yPzogRXJyb3IgfSB9IH0gfTtcbn1cblxuLyoqXG4gKiBHZXQgY2xpZW50IHJlZmVyZW5jZSBmcm9tIGFuIG9iamVjdFxuICovXG5mdW5jdGlvbiBnZXRDbGllbnRSZWYoXG4gIG9iajogSGFzQ2xpZW50XG4pOiB7IHJlcXVpcmVMb2dpbigpOiB7IGlzRXJyKCk6IGJvb2xlYW47IGVycm9yPzogRXJyb3IgfSB9IHwgbnVsbCB7XG4gIGlmIChvYmouY2xpZW50KSByZXR1cm4gb2JqLmNsaWVudDtcbiAgaWYgKG9iai5zaXRlPy5jbGllbnQpIHJldHVybiBvYmouc2l0ZS5jbGllbnQ7XG4gIGlmIChvYmoudGhyZWFkPy5zaXRlPy5jbGllbnQpIHJldHVybiBvYmoudGhyZWFkLnNpdGUuY2xpZW50O1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBMb2dpbiByZXF1aXJlZCBtZXRob2QgZGVjb3JhdG9yXG4gKlxuICogTWV0aG9kcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIHdpbGwgY2hlY2sgbG9naW4gc3RhdHVzIGJlZm9yZSBleGVjdXRpb24uXG4gKiBSZXR1cm5zIExvZ2luUmVxdWlyZWRFcnJvciBpZiBub3QgbG9nZ2VkIGluLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBQYWdlIHtcbiAqICAgQFJlcXVpcmVMb2dpblxuICogICBkZXN0cm95KCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gKiAgICAgcmV0dXJuIGZyb21Qcm9taXNlKGFzeW5jICgpID0+IHsgLi4uIH0sIChlKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKC4uLikpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZXF1aXJlTG9naW48XG4gIFRoaXMgZXh0ZW5kcyBIYXNDbGllbnQsXG4gIEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sXG4gIFJldHVybiBleHRlbmRzIFdpa2lkb3RSZXN1bHRBc3luYzx1bmtub3duPixcbj4oXG4gIHRhcmdldDogKHRoaXM6IFRoaXMsIC4uLmFyZ3M6IEFyZ3MpID0+IFJldHVybixcbiAgX2NvbnRleHQ6IENsYXNzTWV0aG9kRGVjb3JhdG9yQ29udGV4dDxUaGlzLCAodGhpczogVGhpcywgLi4uYXJnczogQXJncykgPT4gUmV0dXJuPlxuKTogKHRoaXM6IFRoaXMsIC4uLmFyZ3M6IEFyZ3MpID0+IFJldHVybiB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhpczogVGhpcywgLi4uYXJnczogQXJncyk6IFJldHVybiB7XG4gICAgY29uc3QgY2xpZW50UmVmID0gZ2V0Q2xpZW50UmVmKHRoaXMpO1xuICAgIGlmICghY2xpZW50UmVmKSB7XG4gICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdDbGllbnQgcmVmZXJlbmNlIG5vdCBmb3VuZCcpKSBhcyB1bmtub3duIGFzIFJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudFJlZi5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkJylcbiAgICAgICkgYXMgdW5rbm93biBhcyBSZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICB9O1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoZWVyaW8sIENoZWVyaW9BUEkgfSBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IEZvcnVtUG9zdFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICogRm9ydW0gcG9zdCByZXZpc2lvbiBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1Qb3N0UmV2aXNpb25EYXRhIHtcbiAgcG9zdDogRm9ydW1Qb3N0UmVmO1xuICBpZDogbnVtYmVyO1xuICByZXZObzogbnVtYmVyO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIEZvcnVtIHBvc3QgcmV2aXNpb24gKHZlcnNpb24gaW4gZWRpdCBoaXN0b3J5KVxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0UmV2aXNpb24ge1xuICAvKiogUG9zdCB0aGlzIHJldmlzaW9uIGJlbG9uZ3MgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBvc3Q6IEZvcnVtUG9zdFJlZjtcblxuICAvKiogUmV2aXNpb24gSUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIG51bWJlciAoMCA9IGluaXRpYWwgdmVyc2lvbikgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldk5vOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIGNyZWF0b3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyO1xuXG4gIC8qKiBSZXZpc2lvbiBjcmVhdGlvbiBkYXRlICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG5cbiAgLyoqIEhUTUwgY29udGVudCAoaW50ZXJuYWwgY2FjaGUpICovXG4gIHByaXZhdGUgX2h0bWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IEZvcnVtUG9zdFJldmlzaW9uRGF0YSkge1xuICAgIHRoaXMucG9zdCA9IGRhdGEucG9zdDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnJldk5vID0gZGF0YS5yZXZObztcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBIVE1MIGNvbnRlbnQgaGFzIGJlZW4gYWNxdWlyZWRcbiAgICovXG4gIGlzSHRtbEFjcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9odG1sICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVE1MIGNvbnRlbnQgKGNhY2hlZClcbiAgICovXG4gIGdldCBodG1sKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9odG1sO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBIVE1MIGNvbnRlbnRcbiAgICovXG4gIHNldCBodG1sKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5faHRtbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBIVE1MIGNvbnRlbnRcbiAgICogQHJldHVybnMgSFRNTCBzdHJpbmdcbiAgICovXG4gIGdldEh0bWwoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9odG1sICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2h0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBvc3QudGhyZWFkLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bVBvc3RSZXZpc2lvbk1vZHVsZScsXG4gICAgICAgICAgICByZXZpc2lvbklkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIEZvcnVtUG9zdFJldmlzaW9uTW9kdWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gU3RyaW5nKHJlc3BvbnNlLmNvbnRlbnQgPz8gJycpO1xuICAgICAgICB0aGlzLl9odG1sID0gY29udGVudDtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIEhUTUw6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtUG9zdFJldmlzaW9uKGlkPSR7dGhpcy5pZH0sIHJldk5vPSR7dGhpcy5yZXZOb30pYDtcbiAgfVxufVxuXG4vKipcbiAqIEZvcnVtIHBvc3QgcmV2aXNpb24gY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1Qb3N0UmV2aXNpb24+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBvc3Q6IEZvcnVtUG9zdFJlZjtcblxuICBjb25zdHJ1Y3Rvcihwb3N0OiBGb3J1bVBvc3RSZWYsIHJldmlzaW9ucz86IEZvcnVtUG9zdFJldmlzaW9uW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucG9zdCA9IHBvc3Q7XG4gICAgaWYgKHJldmlzaW9ucykge1xuICAgICAgdGhpcy5wdXNoKC4uLnJldmlzaW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICogQHBhcmFtIGlkIC0gUmV2aXNpb24gSURcbiAgICogQHJldHVybnMgUmV2aXNpb24gKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1Qb3N0UmV2aXNpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHJldmlzaW9uKSA9PiByZXZpc2lvbi5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgcmV2aXNpb24gbnVtYmVyXG4gICAqIEBwYXJhbSByZXZObyAtIFJldmlzaW9uIG51bWJlclxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeVJldk5vKHJldk5vOiBudW1iZXIpOiBGb3J1bVBvc3RSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocmV2aXNpb24pID0+IHJldmlzaW9uLnJldk5vID09PSByZXZObyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEhUTUwgZm9yIGFsbCByZXZpc2lvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgSFRNTCBzdHJpbmdzXG4gICAqL1xuICBnZXRIdG1scygpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGhpcy5tYXAoYXN5bmMgKHJldmlzaW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXZpc2lvbi5nZXRIdG1sKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgSFRNTHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHJldmlzaW9ucyBmcm9tIEhUTUwgKGludGVybmFsIG1ldGhvZClcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9wYXJzZShwb3N0OiBGb3J1bVBvc3RSZWYsICQ6IENoZWVyaW9BUEkpOiBGb3J1bVBvc3RSZXZpc2lvbltdIHtcbiAgICBjb25zdCByZXZpc2lvbnM6IEZvcnVtUG9zdFJldmlzaW9uW10gPSBbXTtcblxuICAgICQoJ3RhYmxlLnRhYmxlIHRyJykuZWFjaCgoX2ksIHJvd0VsZW0pID0+IHtcbiAgICAgIGNvbnN0ICRyb3cgPSAkKHJvd0VsZW0pO1xuXG4gICAgICAvLyBTa2lwIGhlYWRlciByb3dcbiAgICAgIGlmICgkcm93Lmhhc0NsYXNzKCdoZWFkJykpIHJldHVybjtcblxuICAgICAgLy8gR2V0IHVzZXIgZWxlbWVudFxuICAgICAgY29uc3QgJHVzZXJFbGVtID0gJHJvdy5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgaWYgKCR1c2VyRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgLy8gR2V0IG9kYXRlIGVsZW1lbnRcbiAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkcm93LmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgIGlmICgkb2RhdGVFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgcmV2aXNpb24gSUQgZnJvbSBvbmNsaWNrIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgJHJldmlzaW9uTGluayA9ICRyb3cuZmluZCgnYVtvbmNsaWNrKj1cInNob3dSZXZpc2lvblwiXScpO1xuICAgICAgaWYgKCRyZXZpc2lvbkxpbmsubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9uY2xpY2sgPSAkcmV2aXNpb25MaW5rLmF0dHIoJ29uY2xpY2snKSA/PyAnJztcbiAgICAgIGNvbnN0IHJldmlzaW9uSWRNYXRjaCA9IG9uY2xpY2subWF0Y2goL3Nob3dSZXZpc2lvblxccypcXChcXHMqZXZlbnRcXHMqLFxccyooXFxkKylcXHMqXFwpLyk7XG4gICAgICBpZiAoIXJldmlzaW9uSWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHJldmlzaW9uSWQgPSBOdW1iZXIucGFyc2VJbnQocmV2aXNpb25JZE1hdGNoWzFdLCAxMCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldmlzaW9uSWQpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9IHBhcnNlVXNlcihwb3N0LnRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHBhcnNlT2RhdGUoJG9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgICByZXZpc2lvbnMucHVzaChcbiAgICAgICAgbmV3IEZvcnVtUG9zdFJldmlzaW9uKHtcbiAgICAgICAgICBwb3N0LFxuICAgICAgICAgIGlkOiByZXZpc2lvbklkLFxuICAgICAgICAgIHJldk5vOiAwLCAvLyBXaWxsIGJlIHNldCBhZnRlciBwYXJzaW5nIGFsbCByZXZpc2lvbnNcbiAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIEFQSSByZXR1cm5zIG5ld2VzdCBmaXJzdCwgcmV2ZXJzZSB0byBnZXQgb2xkZXN0IGZpcnN0IGFuZCBzZXQgcmV2Tm9cbiAgICByZXZpc2lvbnMucmV2ZXJzZSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV2aXNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBVc2UgT2JqZWN0LmRlZmluZVByb3BlcnR5IHRvIHNldCByZWFkb25seSBwcm9wZXJ0eVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldmlzaW9uc1tpXSwgJ3Jldk5vJywge1xuICAgICAgICB2YWx1ZTogaSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV2aXNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmV2aXNpb25zIGZvciBhIHBvc3RcbiAgICogQHBhcmFtIHBvc3QgLSBGb3J1bSBwb3N0IHJlZmVyZW5jZVxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiBjb2xsZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbChwb3N0OiBGb3J1bVBvc3RSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9zdC50aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vc3ViL0ZvcnVtUG9zdFJldmlzaW9uc01vZHVsZScsXG4gICAgICAgICAgICBwb3N0SWQ6IHBvc3QuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gRm9ydW1Qb3N0UmV2aXNpb25zTW9kdWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgIGNvbnN0IHJldmlzaW9ucyA9IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbi5fcGFyc2UocG9zdCwgJCk7XG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uKHBvc3QsIHJldmlzaW9ucyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSByZXZpc2lvbnM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbnMgZm9yIG11bHRpcGxlIHBvc3RzXG4gICAqIEBwYXJhbSBwb3N0cyAtIEFycmF5IG9mIGZvcnVtIHBvc3QgcmVmZXJlbmNlc1xuICAgKiBAcGFyYW0gd2l0aEh0bWwgLSBXaGV0aGVyIHRvIGFsc28gZmV0Y2ggSFRNTCBjb250ZW50IGZvciBlYWNoIHJldmlzaW9uXG4gICAqIEByZXR1cm5zIE1hcCBvZiBwb3N0IElEIHRvIHJldmlzaW9uIGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsRm9yUG9zdHMoXG4gICAgcG9zdHM6IEZvcnVtUG9zdFJlZltdLFxuICAgIHdpdGhIdG1sID0gZmFsc2VcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPE1hcDxudW1iZXIsIEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbj4+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAocG9zdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBNYXA8bnVtYmVyLCBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPG51bWJlciwgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uPigpO1xuICAgICAgICBjb25zdCBzaXRlID0gcG9zdHNbMF0hLnRocmVhZC5zaXRlO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogR2V0IHJldmlzaW9uIGxpc3RzIGZvciBhbGwgcG9zdHNcbiAgICAgICAgY29uc3QgcmV2aXNpb25zUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHBvc3RzLm1hcCgocG9zdCkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9zdWIvRm9ydW1Qb3N0UmV2aXNpb25zTW9kdWxlJyxcbiAgICAgICAgICAgIHBvc3RJZDogcG9zdC5pZCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmV2aXNpb25zUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXZpc2lvbnNSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDI6IFBhcnNlIHJldmlzaW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcG9zdCA9IHBvc3RzW2ldITtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJldmlzaW9uc1Jlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBjb25zdCByZXZpc2lvbnMgPSBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24uX3BhcnNlKHBvc3QsICQpO1xuICAgICAgICAgIHJlc3VsdC5zZXQocG9zdC5pZCwgbmV3IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbihwb3N0LCByZXZpc2lvbnMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgMzogR2V0IEhUTUwgY29udGVudCBpZiByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKHdpdGhIdG1sKSB7XG4gICAgICAgICAgY29uc3QgYWxsUmV2aXNpb25zOiB7IHJldmlzaW9uOiBGb3J1bVBvc3RSZXZpc2lvbjsgcG9zdElkOiBudW1iZXIgfVtdID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBbcG9zdElkLCBjb2xsZWN0aW9uXSBvZiByZXN1bHQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmV2aXNpb24gb2YgY29sbGVjdGlvbikge1xuICAgICAgICAgICAgICBhbGxSZXZpc2lvbnMucHVzaCh7IHJldmlzaW9uLCBwb3N0SWQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFsbFJldmlzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBodG1sUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgICAgICBhbGxSZXZpc2lvbnMubWFwKCh7IHJldmlzaW9uIH0pID0+ICh7XG4gICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bVBvc3RSZXZpc2lvbk1vZHVsZScsXG4gICAgICAgICAgICAgICAgcmV2aXNpb25JZDogcmV2aXNpb24uaWQsXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGh0bWxSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgICB0aHJvdyBodG1sUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFJldmlzaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCB7IHJldmlzaW9uIH0gPSBhbGxSZXZpc2lvbnNbaV0hO1xuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGh0bWxSZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJldmlzaW9uLmh0bWwgPSBTdHJpbmcocmVzcG9uc2UuY29udGVudCA/PyAnJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcmV2aXNpb25zIGZvciBwb3N0czogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDaGVlcmlvLCBDaGVlcmlvQVBJIH0gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlLCBFbGVtZW50IH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IsIE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IEZvcnVtVGhyZWFkUmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB7IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbiB9IGZyb20gJy4vZm9ydW0tcG9zdC1yZXZpc2lvbic7XG5cbi8qKlxuICogRm9ydW0gcG9zdCBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1Qb3N0RGF0YSB7XG4gIHRocmVhZDogRm9ydW1UaHJlYWRSZWY7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHRleHQ6IHN0cmluZztcbiAgZWxlbWVudDogRWxlbWVudDtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXI7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgZWRpdGVkQnk/OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBlZGl0ZWRBdD86IERhdGUgfCBudWxsO1xuICBwYXJlbnRJZD86IG51bWJlciB8IG51bGw7XG59XG5cbi8qKlxuICogRm9ydW0gcG9zdFxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0IHtcbiAgcHVibGljIHJlYWRvbmx5IHRocmVhZDogRm9ydW1UaHJlYWRSZWY7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGVsZW1lbnQ6IEVsZW1lbnQ7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcbiAgcHVibGljIHJlYWRvbmx5IGVkaXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgZWRpdGVkQXQ6IERhdGUgfCBudWxsO1xuICBwcml2YXRlIF9wYXJlbnRJZDogbnVtYmVyIHwgbnVsbDtcbiAgcHJpdmF0ZSBfc291cmNlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcmV2aXNpb25zOiBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBGb3J1bVBvc3REYXRhKSB7XG4gICAgdGhpcy50aHJlYWQgPSBkYXRhLnRocmVhZDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLnRleHQgPSBkYXRhLnRleHQ7XG4gICAgdGhpcy5lbGVtZW50ID0gZGF0YS5lbGVtZW50O1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLmVkaXRlZEJ5ID0gZGF0YS5lZGl0ZWRCeSA/PyBudWxsO1xuICAgIHRoaXMuZWRpdGVkQXQgPSBkYXRhLmVkaXRlZEF0ID8/IG51bGw7XG4gICAgdGhpcy5fcGFyZW50SWQgPSBkYXRhLnBhcmVudElkID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGFyZW50IHBvc3QgSURcbiAgICovXG4gIGdldCBwYXJlbnRJZCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50SWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlIChjYWNoZWQpXG4gICAqL1xuICBnZXQgc291cmNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNvdXJjZSBjb2RlXG4gICAqL1xuICBzZXQgc291cmNlKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fc291cmNlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlIChXaWtpZG90IHN5bnRheClcbiAgICovXG4gIGdldFNvdXJjZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuc291cmNlICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoUHJvbWlzZS5yZXNvbHZlKHRoaXMuc291cmNlKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1Qb3N0Q29sbGVjdGlvbi5hY3F1aXJlUG9zdFNvdXJjZXModGhpcy50aHJlYWQsIFt0aGlzXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1NvdXJjZSB0ZXh0YXJlYSBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHBvc3Qgc291cmNlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0IHBvc3RcbiAgICogQHBhcmFtIHNvdXJjZSAtIE5ldyBzb3VyY2UgKFdpa2lkb3Qgc3ludGF4KVxuICAgKiBAcGFyYW0gdGl0bGUgLSBOZXcgdGl0bGUgKGtlZXBzIGN1cnJlbnQgdGl0bGUgaWYgb21pdHRlZClcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgZWRpdChzb3VyY2U6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEdldCBjdXJyZW50IHJldmlzaW9uIElEXG4gICAgICAgIGNvbnN0IGZvcm1SZXN1bHQgPSBhd2FpdCB0aGlzLnRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9zdWIvRm9ydW1FZGl0UG9zdEZvcm1Nb2R1bGUnLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHRoaXMudGhyZWFkLmlkLFxuICAgICAgICAgICAgcG9zdElkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmb3JtUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmb3JtUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybVJlc3BvbnNlID0gZm9ybVJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmb3JtUmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IGZvcm0gcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoU3RyaW5nKGZvcm1SZXNwb25zZS5ib2R5ID8/ICcnKSk7XG4gICAgICAgIGNvbnN0IHJldmlzaW9uSW5wdXQgPSAkKFwiaW5wdXRbbmFtZT0nY3VycmVudFJldmlzaW9uSWQnXVwiKTtcbiAgICAgICAgaWYgKHJldmlzaW9uSW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdDdXJyZW50IHJldmlzaW9uIElEIGlucHV0IG5vdCBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmV2aXNpb25WYWx1ZSA9IHJldmlzaW9uSW5wdXQudmFsKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZXZpc2lvbklkID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhyZXZpc2lvblZhbHVlID8/ICcnKSwgMTApO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGN1cnJlbnRSZXZpc2lvbklkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignSW52YWxpZCByZXZpc2lvbiBJRCB2YWx1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSBlZGl0XG4gICAgICAgIGNvbnN0IGVkaXRSZXN1bHQgPSBhd2FpdCB0aGlzLnRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ0ZvcnVtQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZUVkaXRQb3N0JyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwb3N0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBjdXJyZW50UmV2aXNpb25JZCxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSA/PyB0aGlzLnRpdGxlLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChlZGl0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBlZGl0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGxvY2FsIHN0YXRlXG4gICAgICAgIGlmICh0aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGVkaXQgcG9zdDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcG9zdCBoYXMgYmVlbiBlZGl0ZWQgKGhhcyByZXZpc2lvbnMpXG4gICAqL1xuICBnZXQgaGFzUmV2aXNpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRlZEJ5ICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwb3N0IHJldmlzaW9ucyAoZWRpdCBoaXN0b3J5KVxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRSZXZpc2lvbnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl9yZXZpc2lvbnMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fcmV2aXNpb25zKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uLmFjcXVpcmVBbGxGb3JQb3N0cyhbdGhpc10pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmV2aXNpb25zID0gcmVzdWx0LnZhbHVlLmdldCh0aGlzLmlkKSA/PyBuZXcgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uKHRoaXMsIFtdKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JldmlzaW9ucztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcmV2aXNpb25zOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBGb3J1bVBvc3QoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG5cbi8qKlxuICogRm9ydW0gcG9zdCBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVBvc3RDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1Qb3N0PiB7XG4gIHB1YmxpYyByZWFkb25seSB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmO1xuXG4gIGNvbnN0cnVjdG9yKHRocmVhZDogRm9ydW1UaHJlYWRSZWYsIHBvc3RzPzogRm9ydW1Qb3N0W10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGhyZWFkID0gdGhyZWFkO1xuICAgIGlmIChwb3N0cykge1xuICAgICAgdGhpcy5wdXNoKC4uLnBvc3RzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKiBAcGFyYW0gaWQgLSBQb3N0IElEXG4gICAqIEByZXR1cm5zIFBvc3QgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1Qb3N0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChwb3N0KSA9PiBwb3N0LmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgcG9zdHMgZnJvbSBIVE1MIChpbnRlcm5hbCBtZXRob2QpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfcGFyc2UodGhyZWFkOiBGb3J1bVRocmVhZFJlZiwgJDogQ2hlZXJpb0FQSSk6IEZvcnVtUG9zdFtdIHtcbiAgICBjb25zdCBwb3N0czogRm9ydW1Qb3N0W10gPSBbXTtcblxuICAgICQoJ2Rpdi5wb3N0W2lkXj1cInBvc3QtXCJdJykuZWFjaCgoX2ksIHBvc3RFbGVtKSA9PiB7XG4gICAgICBjb25zdCAkcG9zdCA9ICQocG9zdEVsZW0pO1xuICAgICAgY29uc3QgcG9zdElkQXR0ciA9ICRwb3N0LmF0dHIoJ2lkJyk7XG4gICAgICBpZiAoIXBvc3RJZEF0dHIpIHJldHVybjtcblxuICAgICAgY29uc3QgcG9zdElkID0gTnVtYmVyLnBhcnNlSW50KHBvc3RJZEF0dHIucmVwbGFjZSgncG9zdC0nLCAnJyksIDEwKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4ocG9zdElkKSkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgcGFyZW50IHBvc3QgSURcbiAgICAgIGxldCBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCAkcGFyZW50Q29udGFpbmVyID0gJHBvc3QucGFyZW50KCk7XG4gICAgICBpZiAoJHBhcmVudENvbnRhaW5lci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0ICRncmFuZHBhcmVudCA9ICRwYXJlbnRDb250YWluZXIucGFyZW50KCk7XG4gICAgICAgIGlmICgkZ3JhbmRwYXJlbnQubGVuZ3RoID4gMCAmJiAkZ3JhbmRwYXJlbnRbMF0/Lm5hbWUgIT09ICdib2R5Jykge1xuICAgICAgICAgIGNvbnN0IGdyYW5kcGFyZW50Q2xhc3NlcyA9ICRncmFuZHBhcmVudC5hdHRyKCdjbGFzcycpID8/ICcnO1xuICAgICAgICAgIGlmIChncmFuZHBhcmVudENsYXNzZXMuaW5jbHVkZXMoJ3Bvc3QtY29udGFpbmVyJykpIHtcbiAgICAgICAgICAgIGNvbnN0ICRwYXJlbnRQb3N0ID0gJGdyYW5kcGFyZW50LmZpbmQoJz4gZGl2LnBvc3QnKTtcbiAgICAgICAgICAgIGlmICgkcGFyZW50UG9zdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBvc3RJZEF0dHIgPSAkcGFyZW50UG9zdC5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgICBpZiAocGFyZW50UG9zdElkQXR0cikge1xuICAgICAgICAgICAgICAgIHBhcmVudElkID0gTnVtYmVyLnBhcnNlSW50KHBhcmVudFBvc3RJZEF0dHIucmVwbGFjZSgncG9zdC0nLCAnJyksIDEwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGl0bGUgYW5kIGNvbnRlbnRcbiAgICAgIC8vIFVzZSBjaGlsZCBjb21iaW5hdG9yICg+KSB0byBhdm9pZCBtYXRjaGluZyBuZXN0ZWQgcHNldWRvLXBvc3RzIGluIGNvbnRlbnRcbiAgICAgIGNvbnN0ICR3cmFwcGVyID0gJHBvc3QuZmluZCgnPiBkaXYubG9uZycpO1xuICAgICAgaWYgKCR3cmFwcGVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCAkaGVhZCA9ICR3cmFwcGVyLmZpbmQoJz4gZGl2LmhlYWQnKTtcbiAgICAgIGlmICgkaGVhZC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgJHRpdGxlID0gJGhlYWQuZmluZCgnPiBkaXYudGl0bGUnKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gJHRpdGxlLnRleHQoKS50cmltKCk7XG5cbiAgICAgIGNvbnN0ICRjb250ZW50ID0gJHdyYXBwZXIuZmluZCgnPiBkaXYuY29udGVudCcpO1xuICAgICAgY29uc3QgdGV4dCA9ICRjb250ZW50Lmh0bWwoKSA/PyAnJztcblxuICAgICAgLy8gQXV0aG9yIGFuZCB0aW1lc3RhbXBcbiAgICAgIGNvbnN0ICRpbmZvID0gJGhlYWQuZmluZCgnPiBkaXYuaW5mbycpO1xuICAgICAgaWYgKCRpbmZvLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCAkdXNlckVsZW0gPSAkaW5mby5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgaWYgKCR1c2VyRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgY3JlYXRlZEJ5ID0gcGFyc2VVc2VyKHRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcblxuICAgICAgY29uc3QgJG9kYXRlRWxlbSA9ICRpbmZvLmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgIGlmICgkb2RhdGVFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBjcmVhdGVkQXQgPSBwYXJzZU9kYXRlKCRvZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKTtcblxuICAgICAgLy8gRWRpdCBpbmZvIChpZiBleGlzdHMpXG4gICAgICBsZXQgZWRpdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IGVkaXRlZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCAkY2hhbmdlcyA9ICR3cmFwcGVyLmZpbmQoJ2Rpdi5jaGFuZ2VzJyk7XG4gICAgICBpZiAoJGNoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCAkZWRpdFVzZXJFbGVtID0gJGNoYW5nZXMuZmluZCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgY29uc3QgJGVkaXRPZGF0ZUVsZW0gPSAkY2hhbmdlcy5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICAgIGlmICgkZWRpdFVzZXJFbGVtLmxlbmd0aCA+IDAgJiYgJGVkaXRPZGF0ZUVsZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVkaXRlZEJ5ID0gcGFyc2VVc2VyKHRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICRlZGl0VXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPik7XG4gICAgICAgICAgZWRpdGVkQXQgPSBwYXJzZU9kYXRlKCRlZGl0T2RhdGVFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBvc3RzLnB1c2goXG4gICAgICAgIG5ldyBGb3J1bVBvc3Qoe1xuICAgICAgICAgIHRocmVhZCxcbiAgICAgICAgICBpZDogcG9zdElkLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgZWxlbWVudDogcG9zdEVsZW0gYXMgRWxlbWVudCxcbiAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgIGVkaXRlZEJ5LFxuICAgICAgICAgIGVkaXRlZEF0LFxuICAgICAgICAgIHBhcmVudElkLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwb3N0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBvc3RzIGluIGEgdGhyZWFkXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbEluVGhyZWFkKHRocmVhZDogRm9ydW1UaHJlYWRSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0Q29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc3RzOiBGb3J1bVBvc3RbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gYXdhaXQgdGhyZWFkLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZFBvc3RzTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VObzogJzEnLFxuICAgICAgICAgICAgdDogU3RyaW5nKHRocmVhZC5pZCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RCb2R5ID0gU3RyaW5nKGZpcnN0UmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICRmaXJzdCA9IGNoZWVyaW8ubG9hZChmaXJzdEJvZHkpO1xuXG4gICAgICAgIHBvc3RzLnB1c2goLi4uRm9ydW1Qb3N0Q29sbGVjdGlvbi5fcGFyc2UodGhyZWFkLCAkZmlyc3QpKTtcblxuICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgIGNvbnN0ICRwYWdlciA9ICRmaXJzdCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgIGlmICgkcGFnZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgJHBhZ2VyVGFyZ2V0cyA9ICRwYWdlci5maW5kKCdzcGFuLnRhcmdldCcpO1xuICAgICAgICBpZiAoJHBhZ2VyVGFyZ2V0cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGxhc3QgcGFnZSBudW1iZXIgZnJvbSBzZWNvbmQgdG8gbGFzdCBwYWdlIGxpbmtcbiAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJHBhZ2VyVGFyZ2V0c1xuICAgICAgICAgIC5lcSgkcGFnZXJUYXJnZXRzLmxlbmd0aCAtIDIpXG4gICAgICAgICAgLnRleHQoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlVGV4dCwgMTApO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGxhc3RQYWdlKSB8fCBsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHJlbWFpbmluZyBwYWdlc1xuICAgICAgICBjb25zdCBib2RpZXM6IHsgbW9kdWxlTmFtZTogc3RyaW5nOyBwYWdlTm86IHN0cmluZzsgdDogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgYm9kaWVzLnB1c2goe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZFBvc3RzTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VObzogU3RyaW5nKHBhZ2UpLFxuICAgICAgICAgICAgdDogU3RyaW5nKHRocmVhZC5pZCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IHRocmVhZC5zaXRlLmFtY1JlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuICAgICAgICAgIHBvc3RzLnB1c2goLi4uRm9ydW1Qb3N0Q29sbGVjdGlvbi5fcGFyc2UodGhyZWFkLCAkKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEZvcnVtUG9zdENvbGxlY3Rpb24odGhyZWFkLCBwb3N0cyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwb3N0czogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwb3N0cyBmcm9tIG11bHRpcGxlIHRocmVhZHNcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsSW5UaHJlYWRzKFxuICAgIHRocmVhZHM6IEZvcnVtVGhyZWFkUmVmW11cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPE1hcDxudW1iZXIsIEZvcnVtUG9zdENvbGxlY3Rpb24+PiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRocmVhZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBNYXA8bnVtYmVyLCBGb3J1bVBvc3RDb2xsZWN0aW9uPigpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxudW1iZXIsIEZvcnVtUG9zdENvbGxlY3Rpb24+KCk7XG4gICAgICAgIGNvbnN0IHNpdGUgPSB0aHJlYWRzWzBdIS5zaXRlO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogR2V0IGZpcnN0IHBhZ2Ugb2YgYWxsIHRocmVhZHNcbiAgICAgICAgY29uc3QgZmlyc3RQYWdlUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0V2l0aFJldHJ5KFxuICAgICAgICAgIHRocmVhZHMubWFwKCh0aHJlYWQpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3VGhyZWFkUG9zdHNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZU5vOiAnMScsXG4gICAgICAgICAgICB0OiBTdHJpbmcodGhyZWFkLmlkKSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZmlyc3RQYWdlUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFBhZ2VSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDI6IFBhcnNlIGZpcnN0IHBhZ2VzIGFuZCBkZXRlcm1pbmUgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVxdWVzdHM6IHsgdGhyZWFkOiBGb3J1bVRocmVhZFJlZjsgcGFnZTogbnVtYmVyIH1bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHRocmVhZCA9IHRocmVhZHNbaV0hO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZmlyc3RQYWdlUmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGlmICghcmVzcG9uc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgICAgY29uc3QgcG9zdHMgPSBGb3J1bVBvc3RDb2xsZWN0aW9uLl9wYXJzZSh0aHJlYWQsICQpO1xuICAgICAgICAgIHJlc3VsdC5zZXQodGhyZWFkLmlkLCBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKSk7XG5cbiAgICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgICAgY29uc3QgJHBhZ2VyID0gJCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgICAgaWYgKCRwYWdlci5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgJHBhZ2VyVGFyZ2V0cyA9ICRwYWdlci5maW5kKCdzcGFuLnRhcmdldCcpO1xuICAgICAgICAgIGlmICgkcGFnZXJUYXJnZXRzLmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJHBhZ2VyVGFyZ2V0c1xuICAgICAgICAgICAgLmVxKCRwYWdlclRhcmdldHMubGVuZ3RoIC0gMilcbiAgICAgICAgICAgIC50ZXh0KClcbiAgICAgICAgICAgIC50cmltKCk7XG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCk7XG4gICAgICAgICAgaWYgKE51bWJlci5pc05hTihsYXN0UGFnZSkgfHwgbGFzdFBhZ2UgPD0gMSkgY29udGludWU7XG5cbiAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgICBhZGRpdGlvbmFsUmVxdWVzdHMucHVzaCh7IHRocmVhZCwgcGFnZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDM6IEZldGNoIGFkZGl0aW9uYWwgcGFnZXNcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdFdpdGhSZXRyeShcbiAgICAgICAgICAgIGFkZGl0aW9uYWxSZXF1ZXN0cy5tYXAoKHsgdGhyZWFkLCBwYWdlIH0pID0+ICh7XG4gICAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVZpZXdUaHJlYWRQb3N0c01vZHVsZScsXG4gICAgICAgICAgICAgIHBhZ2VObzogU3RyaW5nKHBhZ2UpLFxuICAgICAgICAgICAgICB0OiBTdHJpbmcodGhyZWFkLmlkKSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkaXRpb25hbFJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRocmVhZCB9ID0gYWRkaXRpb25hbFJlcXVlc3RzW2ldITtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYWRkaXRpb25hbFJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICAgIGNvbnN0IHBvc3RzID0gRm9ydW1Qb3N0Q29sbGVjdGlvbi5fcGFyc2UodGhyZWFkLCAkKTtcblxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZXN1bHQuZ2V0KHRocmVhZC5pZCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcucHVzaCguLi5wb3N0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBvc3RzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwb3N0IHNvdXJjZXMgaW4gYnVsa1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQb3N0U291cmNlcyhcbiAgICB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmLFxuICAgIHBvc3RzOiBGb3J1bVBvc3RbXVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0Q29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFBvc3RzID0gcG9zdHMuZmlsdGVyKChwb3N0KSA9PiBwb3N0LnNvdXJjZSA9PT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBvc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRocmVhZC5zaXRlLmFtY1JlcXVlc3QoXG4gICAgICAgICAgdGFyZ2V0UG9zdHMubWFwKChwb3N0KSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bUVkaXRQb3N0Rm9ybU1vZHVsZScsXG4gICAgICAgICAgICB0aHJlYWRJZDogdGhyZWFkLmlkLFxuICAgICAgICAgICAgcG9zdElkOiBwb3N0LmlkLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0UG9zdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwb3N0ID0gdGFyZ2V0UG9zdHNbaV07XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgaWYgKCFwb3N0IHx8ICFyZXNwb25zZSkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJykpO1xuICAgICAgICAgIGNvbnN0IHNvdXJjZUVsZW0gPSAkKFwidGV4dGFyZWFbbmFtZT0nc291cmNlJ11cIik7XG4gICAgICAgICAgaWYgKHNvdXJjZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYFNvdXJjZSB0ZXh0YXJlYSBub3QgZm91bmQgZm9yIHBvc3Q6ICR7cG9zdC5pZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zdC5zb3VyY2UgPSBzb3VyY2VFbGVtLnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBvc3Qgc291cmNlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZXMgZm9yIGFsbCBwb3N0cyBpbiB0aGUgY29sbGVjdGlvblxuICAgKiBAcmV0dXJucyBSZXN1bHQgY29udGFpbmluZyB0aGUgY29sbGVjdGlvbiAoZm9yIG1ldGhvZCBjaGFpbmluZylcbiAgICovXG4gIGdldFBvc3RTb3VyY2VzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVBvc3RDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIEZvcnVtUG9zdENvbGxlY3Rpb24uYWNxdWlyZVBvc3RTb3VyY2VzKHRoaXMudGhyZWFkLCBBcnJheS5mcm9tKHRoaXMpKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoZWVyaW8gfSBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IEZvcnVtQ2F0ZWdvcnkgfSBmcm9tICcuL2ZvcnVtLWNhdGVnb3J5JztcbmltcG9ydCB7IEZvcnVtUG9zdENvbGxlY3Rpb24gfSBmcm9tICcuL2ZvcnVtLXBvc3QnO1xuXG4vKipcbiAqIEZvcnVtIHRocmVhZCBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1UaHJlYWREYXRhIHtcbiAgc2l0ZTogU2l0ZTtcbiAgaWQ6IG51bWJlcjtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHBvc3RDb3VudDogbnVtYmVyO1xuICBjYXRlZ29yeT86IEZvcnVtQ2F0ZWdvcnkgfCBudWxsO1xufVxuXG4vKipcbiAqIEZvcnVtIHRocmVhZFxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1UaHJlYWQge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcbiAgcHVibGljIHBvc3RDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgY2F0ZWdvcnk6IEZvcnVtQ2F0ZWdvcnkgfCBudWxsO1xuICBwcml2YXRlIF9wb3N0czogRm9ydW1Qb3N0Q29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IEZvcnVtVGhyZWFkRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gICAgdGhpcy5wb3N0Q291bnQgPSBkYXRhLnBvc3RDb3VudDtcbiAgICB0aGlzLmNhdGVnb3J5ID0gZGF0YS5jYXRlZ29yeSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWQgVVJMXG4gICAqL1xuICBnZXRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zaXRlLmdldEJhc2VVcmwoKX0vZm9ydW0vdC0ke3RoaXMuaWR9L2A7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBvc3QgbGlzdFxuICAgKi9cbiAgZ2V0UG9zdHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtUG9zdENvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fcG9zdHMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fcG9zdHMpLCAoZSkgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihTdHJpbmcoZSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBGb3J1bVBvc3RDb2xsZWN0aW9uLmFjcXVpcmVBbGxJblRocmVhZHMoW3RoaXNdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bvc3RzID0gcmVzdWx0LnZhbHVlLmdldCh0aGlzLmlkKSA/PyBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aGlzLCBbXSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3N0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcG9zdHM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbHkgdG8gdGhyZWFkXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHJlcGx5KFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIHRpdGxlID0gJycsXG4gICAgcGFyZW50UG9zdElkOiBudW1iZXIgfCBudWxsID0gbnVsbFxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhyZWFkSWQ6IFN0cmluZyh0aGlzLmlkKSxcbiAgICAgICAgICAgIHBhcmVudElkOiBwYXJlbnRQb3N0SWQgIT09IG51bGwgPyBTdHJpbmcocGFyZW50UG9zdElkKSA6ICcnLFxuICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICBhY3Rpb246ICdGb3J1bUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVQb3N0JyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wb3N0cyA9IG51bGw7XG4gICAgICAgIHRoaXMucG9zdENvdW50ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHJlcGx5OiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtVGhyZWFkKGlkPSR7dGhpcy5pZH0sIHRpdGxlPSR7dGhpcy50aXRsZX0pYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhyZWFkIGJ5IElEXG4gICAqL1xuICBzdGF0aWMgZ2V0RnJvbUlkKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgdGhyZWFkSWQ6IG51bWJlcixcbiAgICBjYXRlZ29yeTogRm9ydW1DYXRlZ29yeSB8IG51bGwgPSBudWxsXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyhzaXRlLCBbdGhyZWFkSWRdLCBjYXRlZ29yeSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aHJlYWQgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghdGhyZWFkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBUaHJlYWQgbm90IGZvdW5kOiAke3RocmVhZElkfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aHJlYWQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHRocmVhZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3J1bSB0aHJlYWQgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1UaHJlYWRDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1UaHJlYWQ+IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSwgdGhyZWFkcz86IEZvcnVtVGhyZWFkW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKHRocmVhZHMpIHtcbiAgICAgIHRoaXMucHVzaCguLi50aHJlYWRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IEZvcnVtVGhyZWFkIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKCh0aHJlYWQpID0+IHRocmVhZC5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdGhyZWFkcyBpbiBjYXRlZ29yeVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGxJbkNhdGVnb3J5KGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5KTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRocmVhZHM6IEZvcnVtVGhyZWFkW10gPSBbXTtcblxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IGNhdGVnb3J5LnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcDogMSxcbiAgICAgICAgICAgIGM6IGNhdGVnb3J5LmlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld0NhdGVnb3J5TW9kdWxlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoZmlyc3RSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IGZpcnN0UmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIWZpcnN0UmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEJvZHkgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0Qm9keSk7XG5cbiAgICAgICAgJGZpcnN0KCd0YWJsZS50YWJsZSB0ci5oZWFkfnRyJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJGZpcnN0KGVsZW0pO1xuICAgICAgICAgIGNvbnN0IHRpdGxlRWxlbSA9ICRyb3cuZmluZCgnZGl2LnRpdGxlIGEnKTtcbiAgICAgICAgICBjb25zdCBocmVmID0gdGl0bGVFbGVtLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgICAgICBjb25zdCB0aHJlYWRJZE1hdGNoID0gaHJlZi5tYXRjaCgvdC0oXFxkKykvKTtcbiAgICAgICAgICBpZiAoIXRocmVhZElkTWF0Y2g/LlsxXSkgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgdGhyZWFkSWQgPSBOdW1iZXIucGFyc2VJbnQodGhyZWFkSWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIGNvbnN0IHRpdGxlID0gdGl0bGVFbGVtLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSAkcm93LmZpbmQoJ2Rpdi5kZXNjcmlwdGlvbicpLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgcG9zdENvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQucG9zdHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcblxuICAgICAgICAgIC8vIFBhcnNlIHVzZXIgYW5kIHRpbWVzdGFtcFxuICAgICAgICAgIGNvbnN0ICR1c2VyRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkcm93LmZpbmQoJ3RkLnN0YXJ0ZWQgc3Bhbi5vZGF0ZScpO1xuXG4gICAgICAgICAgY29uc3QgY3JlYXRlZEJ5ID1cbiAgICAgICAgICAgICR1c2VyRWxlbS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gcGFyc2VVc2VyKGNhdGVnb3J5LnNpdGUuY2xpZW50LCAkdXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPilcbiAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9XG4gICAgICAgICAgICAkb2RhdGVFbGVtLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyAocGFyc2VPZGF0ZSgkb2RhdGVFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pID8/IG5ldyBEYXRlKCkpXG4gICAgICAgICAgICAgIDogbmV3IERhdGUoKTtcblxuICAgICAgICAgIHRocmVhZHMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3J1bVRocmVhZCh7XG4gICAgICAgICAgICAgIHNpdGU6IGNhdGVnb3J5LnNpdGUsXG4gICAgICAgICAgICAgIGlkOiB0aHJlYWRJZCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgcG9zdENvdW50LFxuICAgICAgICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCBwYWdlciA9ICRmaXJzdCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgIGlmIChwYWdlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtVGhyZWFkQ29sbGVjdGlvbihjYXRlZ29yeS5zaXRlLCB0aHJlYWRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhZ2VyTGlua3MgPSBwYWdlci5maW5kKCdhJyk7XG4gICAgICAgIGlmIChwYWdlckxpbmtzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtVGhyZWFkQ29sbGVjdGlvbihjYXRlZ29yeS5zaXRlLCB0aHJlYWRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQYWdlTGluayA9IHBhZ2VyTGlua3NbcGFnZXJMaW5rcy5sZW5ndGggLSAyXTtcbiAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gbGFzdFBhZ2VMaW5rID8gJGZpcnN0KGxhc3RQYWdlTGluaykudGV4dCgpLnRyaW0oKSA6ICcxJztcbiAgICAgICAgY29uc3QgbGFzdFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCkgfHwgMTtcblxuICAgICAgICBpZiAobGFzdFBhZ2UgPD0gMSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmV0Y2ggcmVtYWluaW5nIHBhZ2VzXG4gICAgICAgIGNvbnN0IGJvZGllczogeyBwOiBudW1iZXI7IGM6IG51bWJlcjsgbW9kdWxlTmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgYm9kaWVzLnB1c2goe1xuICAgICAgICAgICAgcDogcGFnZSxcbiAgICAgICAgICAgIGM6IGNhdGVnb3J5LmlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld0NhdGVnb3J5TW9kdWxlJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgY2F0ZWdvcnkuc2l0ZS5hbWNSZXF1ZXN0V2l0aFJldHJ5KGJvZGllcyk7XG4gICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgYWRkaXRpb25hbFJlc3VsdHMuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgaWYgKCFyZXNwb25zZSkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZT8uYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcblxuICAgICAgICAgICQoJ3RhYmxlLnRhYmxlIHRyLmhlYWR+dHInKS5lYWNoKChfaSwgZWxlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJHJvdyA9ICQoZWxlbSk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZUVsZW0gPSAkcm93LmZpbmQoJ2Rpdi50aXRsZSBhJyk7XG4gICAgICAgICAgICBjb25zdCBocmVmID0gdGl0bGVFbGVtLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IHRocmVhZElkTWF0Y2ggPSBocmVmLm1hdGNoKC90LShcXGQrKS8pO1xuICAgICAgICAgICAgaWYgKCF0aHJlYWRJZE1hdGNoPy5bMV0pIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgdGhyZWFkSWQgPSBOdW1iZXIucGFyc2VJbnQodGhyZWFkSWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB0aXRsZUVsZW0udGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJHJvdy5maW5kKCdkaXYuZGVzY3JpcHRpb24nKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgcG9zdENvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQucG9zdHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcblxuICAgICAgICAgICAgLy8gUGFyc2UgdXNlciBhbmQgdGltZXN0YW1wXG4gICAgICAgICAgICBjb25zdCAkdXNlckVsZW0gPSAkcm93LmZpbmQoJ3RkLnN0YXJ0ZWQgc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkcm93LmZpbmQoJ3RkLnN0YXJ0ZWQgc3Bhbi5vZGF0ZScpO1xuXG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQnkgPVxuICAgICAgICAgICAgICAkdXNlckVsZW0ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gcGFyc2VVc2VyKGNhdGVnb3J5LnNpdGUuY2xpZW50LCAkdXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPilcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQXQgPVxuICAgICAgICAgICAgICAkb2RhdGVFbGVtLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IChwYXJzZU9kYXRlKCRvZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKSlcbiAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgICAgIHRocmVhZHMucHVzaChcbiAgICAgICAgICAgICAgbmV3IEZvcnVtVGhyZWFkKHtcbiAgICAgICAgICAgICAgICBzaXRlOiBjYXRlZ29yeS5zaXRlLFxuICAgICAgICAgICAgICAgIGlkOiB0aHJlYWRJZCxcbiAgICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIHBvc3RDb3VudCxcbiAgICAgICAgICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEZvcnVtVGhyZWFkQ29sbGVjdGlvbihjYXRlZ29yeS5zaXRlLCB0aHJlYWRzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHRocmVhZHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSB0aHJlYWQgYnkgdGhyZWFkIElEXG4gICAqIEBwYXJhbSBzaXRlIC0gU2l0ZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gdGhyZWFkSWQgLSBUaHJlYWQgSURcbiAgICovXG4gIHN0YXRpYyBmcm9tSWQoc2l0ZTogU2l0ZSwgdGhyZWFkSWQ6IG51bWJlcik6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyhzaXRlLCBbdGhyZWFkSWRdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRocmVhZCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCF0aHJlYWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYFRocmVhZCBub3QgZm91bmQ6ICR7dGhyZWFkSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocmVhZDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdGhyZWFkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhyZWFkcyBieSB0aHJlYWQgSURzXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUZyb21UaHJlYWRJZHMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICB0aHJlYWRJZHM6IG51bWJlcltdLFxuICAgIGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5IHwgbnVsbCA9IG51bGxcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0aHJlYWRJZHMubWFwKCh0aHJlYWRJZCkgPT4gKHtcbiAgICAgICAgICAgIHQ6IHRocmVhZElkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZE1vZHVsZScsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhyZWFkczogRm9ydW1UaHJlYWRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhyZWFkSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgY29uc3QgdGhyZWFkSWQgPSB0aHJlYWRJZHNbaV07XG4gICAgICAgICAgaWYgKCFyZXNwb25zZSB8fCAhdGhyZWFkSWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgICAgLy8gUGFyc2UgdGhyZWFkIGluZm8gZnJvbSBwYWdlXG4gICAgICAgICAgY29uc3QgYmNFbGVtID0gJCgnZGl2LmZvcnVtLWJyZWFkY3J1bWJzJyk7XG4gICAgICAgICAgaWYgKGJjRWxlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignQnJlYWRjcnVtYnMgbm90IGZvdW5kJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGJjUGFydHMgPSBiY0VsZW0udGV4dCgpLnNwbGl0KCfCuycpO1xuICAgICAgICAgIGNvbnN0IHRpdGxlID0gYmNQYXJ0cy5sZW5ndGggPiAwID8gKGJjUGFydHNbYmNQYXJ0cy5sZW5ndGggLSAxXT8udHJpbSgpID8/ICcnKSA6ICcnO1xuXG4gICAgICAgICAgY29uc3QgZGVzY0Jsb2NrRWxlbSA9ICQoJ2Rpdi5kZXNjcmlwdGlvbi1ibG9jaycpO1xuICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZGVzY0Jsb2NrRWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgY29uc3QgcG9zdENvdW50TWF0Y2ggPSAkKCdkaXYuc3RhdGlzdGljcycpLnRleHQoKS5tYXRjaCgvKFxcZCspLyk7XG4gICAgICAgICAgY29uc3QgcG9zdENvdW50ID0gcG9zdENvdW50TWF0Y2g/LlsxXSA/IE51bWJlci5wYXJzZUludChwb3N0Q291bnRNYXRjaFsxXSwgMTApIDogMDtcblxuICAgICAgICAgIHRocmVhZHMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3J1bVRocmVhZCh7XG4gICAgICAgICAgICAgIHNpdGUsXG4gICAgICAgICAgICAgIGlkOiB0aHJlYWRJZCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBjcmVhdGVkQnk6IG51bGwsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgcG9zdENvdW50LFxuICAgICAgICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKHNpdGUsIHRocmVhZHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgdGhyZWFkczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciwgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHsgRm9ydW1UaHJlYWQsIEZvcnVtVGhyZWFkQ29sbGVjdGlvbiB9IGZyb20gJy4vZm9ydW0tdGhyZWFkJztcblxuLyoqXG4gKiBGb3J1bSBjYXRlZ29yeSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1DYXRlZ29yeURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB0aHJlYWRzQ291bnQ6IG51bWJlcjtcbiAgcG9zdHNDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZvcnVtIGNhdGVnb3J5XG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUNhdGVnb3J5IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0aHJlYWRzQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IHBvc3RzQ291bnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfdGhyZWFkczogRm9ydW1UaHJlYWRDb2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogRm9ydW1DYXRlZ29yeURhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG4gICAgdGhpcy50aHJlYWRzQ291bnQgPSBkYXRhLnRocmVhZHNDb3VudDtcbiAgICB0aGlzLnBvc3RzQ291bnQgPSBkYXRhLnBvc3RzQ291bnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRocmVhZCBsaXN0XG4gICAqL1xuICBnZXRUaHJlYWRzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZENvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fdGhyZWFkcyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFByb21pc2UucmVzb2x2ZSh0aGlzLl90aHJlYWRzKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVBbGxJbkNhdGVnb3J5KHRoaXMpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGhyZWFkcyA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RocmVhZHM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHRocmVhZHM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVsb2FkIHRocmVhZCBsaXN0XG4gICAqL1xuICByZWxvYWRUaHJlYWRzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZENvbGxlY3Rpb24+IHtcbiAgICB0aGlzLl90aHJlYWRzID0gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5nZXRUaHJlYWRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRocmVhZFxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBjcmVhdGVUaHJlYWQoXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIHNvdXJjZTogc3RyaW5nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgYWN0aW9uOiAnRm9ydW1BY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICduZXdUaHJlYWQnLFxuICAgICAgICAgICAgY2F0ZWdvcnlfaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlIHx8IHR5cGVvZiByZXNwb25zZS50aHJlYWRJZCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1RocmVhZCBJRCBub3QgZm91bmQgaW4gcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRocmVhZElkID0gcmVzcG9uc2UudGhyZWFkSWQgYXMgbnVtYmVyO1xuICAgICAgICBjb25zdCB0aHJlYWRSZXN1bHQgPSBhd2FpdCBGb3J1bVRocmVhZC5nZXRGcm9tSWQodGhpcy5zaXRlLCB0aHJlYWRJZCwgdGhpcyk7XG4gICAgICAgIGlmICh0aHJlYWRSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHRocmVhZFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyZWFkUmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSB0aHJlYWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtQ2F0ZWdvcnkoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG5cbi8qKlxuICogRm9ydW0gY2F0ZWdvcnkgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxGb3J1bUNhdGVnb3J5PiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUsIGNhdGVnb3JpZXM/OiBGb3J1bUNhdGVnb3J5W10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKGNhdGVnb3JpZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5jYXRlZ29yaWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IEZvcnVtQ2F0ZWdvcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgY2F0ZWdvcmllcyBmb3IgYSBzaXRlXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbChzaXRlOiBTaXRlKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtQ2F0ZWdvcnlDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1TdGFydE1vZHVsZScsXG4gICAgICAgICAgICBoaWRkZW46ICd0cnVlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgY29uc3QgY2F0ZWdvcmllczogRm9ydW1DYXRlZ29yeVtdID0gW107XG5cbiAgICAgICAgJCgndGFibGUgdHIuaGVhZH50cicpLmVhY2goKF9pLCByb3cpID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJChyb3cpO1xuICAgICAgICAgIGNvbnN0IG5hbWVFbGVtID0gJHJvdy5maW5kKCd0ZC5uYW1lJyk7XG4gICAgICAgICAgY29uc3QgbmFtZUxpbmtFbGVtID0gbmFtZUVsZW0uZmluZCgnYScpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSBuYW1lTGlua0VsZW0uYXR0cignaHJlZicpID8/ICcnO1xuXG4gICAgICAgICAgY29uc3QgY2F0ZWdvcnlJZE1hdGNoID0gaHJlZi5tYXRjaCgvYy0oXFxkKykvKTtcbiAgICAgICAgICBpZiAoIWNhdGVnb3J5SWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkID0gTnVtYmVyLnBhcnNlSW50KGNhdGVnb3J5SWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIGNvbnN0IHRpdGxlID0gbmFtZUxpbmtFbGVtLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBuYW1lRWxlbS5maW5kKCdkaXYuZGVzY3JpcHRpb24nKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHRocmVhZHNDb3VudCA9IE51bWJlci5wYXJzZUludCgkcm93LmZpbmQoJ3RkLnRocmVhZHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcbiAgICAgICAgICBjb25zdCBwb3N0c0NvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQucG9zdHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcblxuICAgICAgICAgIGNhdGVnb3JpZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3J1bUNhdGVnb3J5KHtcbiAgICAgICAgICAgICAgc2l0ZSxcbiAgICAgICAgICAgICAgaWQ6IGNhdGVnb3J5SWQsXG4gICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgdGhyZWFkc0NvdW50LFxuICAgICAgICAgICAgICBwb3N0c0NvdW50LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IEZvcnVtQ2F0ZWdvcnlDb2xsZWN0aW9uKHNpdGUsIGNhdGVnb3JpZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgY2F0ZWdvcmllczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0IHsgRm9ydW1DYXRlZ29yeSwgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24sIHR5cGUgRm9ydW1DYXRlZ29yeURhdGEgfSBmcm9tICcuL2ZvcnVtLWNhdGVnb3J5JztcbmV4cG9ydCB7IEZvcnVtUG9zdCwgRm9ydW1Qb3N0Q29sbGVjdGlvbiwgdHlwZSBGb3J1bVBvc3REYXRhIH0gZnJvbSAnLi9mb3J1bS1wb3N0JztcbmV4cG9ydCB7XG4gIEZvcnVtUG9zdFJldmlzaW9uLFxuICBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24sXG4gIHR5cGUgRm9ydW1Qb3N0UmV2aXNpb25EYXRhLFxufSBmcm9tICcuL2ZvcnVtLXBvc3QtcmV2aXNpb24nO1xuZXhwb3J0IHsgRm9ydW1UaHJlYWQsIEZvcnVtVGhyZWFkQ29sbGVjdGlvbiwgdHlwZSBGb3J1bVRocmVhZERhdGEgfSBmcm9tICcuL2ZvcnVtLXRocmVhZCc7XG4iLAogICAgIi8vIENvbW1vblxuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vZXJyb3JzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL2xvZ2dlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbW1vbi90eXBlcyc7XG5cbi8vIENvbm5lY3RvclxuZXhwb3J0ICogZnJvbSAnLi9jb25uZWN0b3InO1xuXG4vLyBNb2R1bGVcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlJztcblxuLy8gVXRpbFxuZXhwb3J0ICogZnJvbSAnLi91dGlsJztcbiIsCiAgICAiaW1wb3J0IGt5LCB7IHR5cGUgS3lJbnN0YW5jZSB9IGZyb20gJ2t5JztcbmltcG9ydCBwTGltaXQsIHsgdHlwZSBMaW1pdEZ1bmN0aW9uIH0gZnJvbSAncC1saW1pdCc7XG5pbXBvcnQge1xuICBBTUNIdHRwRXJyb3IsXG4gIEZvcmJpZGRlbkVycm9yLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgUmVzcG9uc2VEYXRhRXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdEVycm9yLFxuICBXaWtpZG90U3RhdHVzRXJyb3IsXG59IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLCB3ZEVyckFzeW5jLCB3ZE9rQXN5bmMgfSBmcm9tICcuLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuLi91dGlsL2h0dHAnO1xuaW1wb3J0IHtcbiAgdHlwZSBBTUNDb25maWcsXG4gIERFRkFVTFRfQU1DX0NPTkZJRyxcbiAgREVGQVVMVF9IVFRQX1NUQVRVU19DT0RFLFxuICBXSUtJRE9UX1RPS0VONyxcbn0gZnJvbSAnLi9hbWMtY29uZmlnJztcbmltcG9ydCB7IEFNQ0hlYWRlciB9IGZyb20gJy4vYW1jLWhlYWRlcic7XG5pbXBvcnQgeyB0eXBlIEFNQ1JlcXVlc3RCb2R5LCB0eXBlIEFNQ1Jlc3BvbnNlLCBhbWNSZXNwb25zZVNjaGVtYSB9IGZyb20gJy4vYW1jLXR5cGVzJztcblxuLyoqXG4gKiBNYXNrIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiAoZm9yIGxvZ2dpbmcpXG4gKiBAcGFyYW0gYm9keSAtIFJlcXVlc3QgYm9keSB0byBtYXNrXG4gKiBAcmV0dXJucyBNYXNrZWQgYm9keVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza1NlbnNpdGl2ZURhdGEoYm9keTogQU1DUmVxdWVzdEJvZHkpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IG1hc2tlZCA9IHsgLi4uYm9keSB9O1xuICBjb25zdCBzZW5zaXRpdmVLZXlzID0gWydwYXNzd29yZCcsICdsb2dpbicsICdXSUtJRE9UX1NFU1NJT05fSUQnLCAnd2lraWRvdF90b2tlbjcnXTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygc2Vuc2l0aXZlS2V5cykge1xuICAgIGlmIChrZXkgaW4gbWFza2VkKSB7XG4gICAgICBtYXNrZWRba2V5XSA9ICcqKipNQVNLRUQqKionO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWFza2VkO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBleHBvbmVudGlhbCBiYWNrb2ZmIGludGVydmFsICh3aXRoIGppdHRlcilcbiAqIEBwYXJhbSByZXRyeUNvdW50IC0gQ3VycmVudCByZXRyeSBjb3VudCAoc3RhcnRzIGZyb20gMSlcbiAqIEBwYXJhbSBiYXNlSW50ZXJ2YWwgLSBCYXNlIGludGVydmFsIChtaWxsaXNlY29uZHMpXG4gKiBAcGFyYW0gYmFja29mZkZhY3RvciAtIEJhY2tvZmYgZmFjdG9yXG4gKiBAcGFyYW0gbWF4QmFja29mZiAtIE1heGltdW0gYmFja29mZiBpbnRlcnZhbCAobWlsbGlzZWNvbmRzKVxuICogQHJldHVybnMgQ2FsY3VsYXRlZCBiYWNrb2ZmIGludGVydmFsIChtaWxsaXNlY29uZHMpXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZUJhY2tvZmYoXG4gIHJldHJ5Q291bnQ6IG51bWJlcixcbiAgYmFzZUludGVydmFsOiBudW1iZXIsXG4gIGJhY2tvZmZGYWN0b3I6IG51bWJlcixcbiAgbWF4QmFja29mZjogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBiYWNrb2ZmID0gYmFzZUludGVydmFsICogYmFja29mZkZhY3RvciAqKiAocmV0cnlDb3VudCAtIDEpO1xuICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpICogYmFja29mZiAqIDAuMTtcbiAgcmV0dXJuIE1hdGgubWluKGJhY2tvZmYgKyBqaXR0ZXIsIG1heEJhY2tvZmYpO1xufVxuXG4vKipcbiAqIFNsZWVwIGZvciBzcGVjaWZpZWQgZHVyYXRpb25cbiAqIEBwYXJhbSBtcyAtIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICovXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG4vKipcbiAqIEFNQyByZXF1ZXN0IG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBTUNSZXF1ZXN0T3B0aW9ucyB7XG4gIC8qKiBTaXRlIG5hbWUgKGRlZmF1bHQ6IHd3dykgKi9cbiAgc2l0ZU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBTU0wgc3VwcG9ydCAoYXV0by1kZXRlY3RlZCBpZiBvbWl0dGVkKSAqL1xuICBzc2xTdXBwb3J0ZWQ/OiBib29sZWFuO1xuICAvKiogSW5jbHVkZSBlcnJvcnMgaW4gcmVzdWx0cyBpbnN0ZWFkIG9mIHRocm93aW5nIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgcmV0dXJuRXhjZXB0aW9ucz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWpheCBNb2R1bGUgQ29ubmVjdG9yIGNsaWVudFxuICogTWFuYWdlcyByZXF1ZXN0cyB0byBXaWtpZG90IEFNQyBlbmRwb2ludFxuICovXG5leHBvcnQgY2xhc3MgQU1DQ2xpZW50IHtcbiAgLyoqIGt5IGluc3RhbmNlICovXG4gIHByaXZhdGUgcmVhZG9ubHkga3k6IEt5SW5zdGFuY2U7XG5cbiAgLyoqIENvbmN1cnJlbnQgcmVxdWVzdCBsaW1pdGVyICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGltaXQ6IExpbWl0RnVuY3Rpb247XG5cbiAgLyoqIEhlYWRlciBtYW5hZ2VyICovXG4gIHB1YmxpYyByZWFkb25seSBoZWFkZXI6IEFNQ0hlYWRlcjtcblxuICAvKiogQ29uZmlndXJhdGlvbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnOiBBTUNDb25maWc7XG5cbiAgLyoqIEJhc2UgZG9tYWluICovXG4gIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZztcblxuICAvKiogU1NMIHN1cHBvcnQgc3RhdHVzIGNhY2hlICovXG4gIHByaXZhdGUgc3NsQ2FjaGU6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQU1DIGNvbmZpZ3VyYXRpb24gKHVzZXMgZGVmYXVsdHMgaWYgb21pdHRlZClcbiAgICogQHBhcmFtIGRvbWFpbiAtIEJhc2UgZG9tYWluIChkZWZhdWx0OiB3aWtpZG90LmNvbSlcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGFydGlhbDxBTUNDb25maWc+ID0ge30sIGRvbWFpbiA9ICd3aWtpZG90LmNvbScpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9BTUNfQ09ORklHLCAuLi5jb25maWcgfTtcbiAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjtcbiAgICB0aGlzLmhlYWRlciA9IG5ldyBBTUNIZWFkZXIoKTtcbiAgICB0aGlzLmxpbWl0ID0gcExpbWl0KHRoaXMuY29uZmlnLnNlbWFwaG9yZUxpbWl0KTtcblxuICAgIHRoaXMua3kgPSBreS5jcmVhdGUoe1xuICAgICAgdGltZW91dDogdGhpcy5jb25maWcudGltZW91dCxcbiAgICAgIHJldHJ5OiAwLCAvLyBNYW51YWwgcmV0cnkgY29udHJvbFxuICAgIH0pO1xuXG4gICAgLy8gd3d3IGFsd2F5cyBzdXBwb3J0cyBTU0xcbiAgICB0aGlzLnNzbENhY2hlLnNldCgnd3d3JywgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgc2l0ZSBleGlzdGVuY2UgYW5kIFNTTCBzdXBwb3J0IHN0YXR1c1xuICAgKiBAcGFyYW0gc2l0ZU5hbWUgLSBTaXRlIG5hbWVcbiAgICogQHJldHVybnMgU1NMIHN1cHBvcnQgc3RhdHVzICh0cnVlOiBIVFRQUywgZmFsc2U6IEhUVFApXG4gICAqL1xuICBjaGVja1NpdGVTU0woc2l0ZU5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxib29sZWFuPiB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCB2YWx1ZSBpZiBleGlzdHNcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnNzbENhY2hlLmdldChzaXRlTmFtZSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKGNhY2hlZCk7XG4gICAgfVxuXG4gICAgLy8gd3d3IGFsd2F5cyBzdXBwb3J0cyBTU0xcbiAgICBpZiAoc2l0ZU5hbWUgPT09ICd3d3cnKSB7XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkoYGh0dHA6Ly8ke3NpdGVOYW1lfS4ke3RoaXMuZG9tYWlufWAsIHRoaXMuY29uZmlnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICByZWRpcmVjdDogJ21hbnVhbCcsXG4gICAgICAgICAgY2hlY2tPazogZmFsc2UsIC8vIERvbid0IHJldHJ5IG9uIEhUVFAgZXJyb3JzICgzMDEgaXMgZXhwZWN0ZWQpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDQwNCBtZWFucyBzaXRlIGRvZXMgbm90IGV4aXN0XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBpcyBub3QgZm91bmQ6ICR7c2l0ZU5hbWV9LiR7dGhpcy5kb21haW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTU0wgc3VwcG9ydGVkIGlmIDMwMSByZWRpcmVjdCB0byBodHRwc1xuICAgICAgICBjb25zdCBpc1NTTCA9XG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID09PSAzMDEgJiYgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0xvY2F0aW9uJyk/LnN0YXJ0c1dpdGgoJ2h0dHBzJykgPT09IHRydWU7XG5cbiAgICAgICAgLy8gU2F2ZSB0byBjYWNoZVxuICAgICAgICB0aGlzLnNzbENhY2hlLnNldChzaXRlTmFtZSwgaXNTU0wpO1xuICAgICAgICByZXR1cm4gaXNTU0w7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNoZWNrIFNTTCBmb3IgJHtzaXRlTmFtZX06ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgQU1DIHJlcXVlc3RcbiAgICogQHBhcmFtIGJvZGllcyAtIFJlcXVlc3QgYm9keSBhcnJheVxuICAgKiBAcGFyYW0gc2l0ZU5hbWUgLSBTaXRlIG5hbWUgKGRlZmF1bHQ6IHd3dylcbiAgICogQHBhcmFtIHNzbFN1cHBvcnRlZCAtIFNTTCBzdXBwb3J0IChhdXRvLWRldGVjdGVkIGlmIG9taXR0ZWQpXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlIGFycmF5XG4gICAqL1xuICByZXF1ZXN0KFxuICAgIGJvZGllczogQU1DUmVxdWVzdEJvZHlbXSxcbiAgICBzaXRlTmFtZSA9ICd3d3cnLFxuICAgIHNzbFN1cHBvcnRlZD86IGJvb2xlYW5cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aE9wdGlvbnMoYm9kaWVzLCB7XG4gICAgICBzaXRlTmFtZSxcbiAgICAgIHNzbFN1cHBvcnRlZCxcbiAgICAgIHJldHVybkV4Y2VwdGlvbnM6IGZhbHNlLFxuICAgIH0pIGFzIFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZVtdPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIEFNQyByZXF1ZXN0ICh3aXRoIG9wdGlvbnMpXG4gICAqIEBwYXJhbSBib2RpZXMgLSBSZXF1ZXN0IGJvZHkgYXJyYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBSZXF1ZXN0IG9wdGlvbnNcbiAgICogQHJldHVybnMgUmVzcG9uc2UgYXJyYXkgKGluY2x1ZGVzIGVycm9ycyBpZiByZXR1cm5FeGNlcHRpb25zIGlzIHRydWUpXG4gICAqL1xuICByZXF1ZXN0V2l0aE9wdGlvbnMoXG4gICAgYm9kaWVzOiBBTUNSZXF1ZXN0Qm9keVtdLFxuICAgIG9wdGlvbnM6IEFNQ1JlcXVlc3RPcHRpb25zID0ge31cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPChBTUNSZXNwb25zZSB8IFdpa2lkb3RFcnJvcilbXT4ge1xuICAgIGNvbnN0IHsgc2l0ZU5hbWUgPSAnd3d3Jywgc3NsU3VwcG9ydGVkLCByZXR1cm5FeGNlcHRpb25zID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBHZXQgU1NMIHN1cHBvcnQgc3RhdHVzXG4gICAgICAgIGxldCBzc2wgPSBzc2xTdXBwb3J0ZWQ7XG4gICAgICAgIGlmIChzc2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHNzbFJlc3VsdCA9IGF3YWl0IHRoaXMuY2hlY2tTaXRlU1NMKHNpdGVOYW1lKTtcbiAgICAgICAgICBpZiAoc3NsUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHNzbFJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3NsID0gc3NsUmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBzc2wgPyAnaHR0cHMnIDogJ2h0dHAnO1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtwcm90b2NvbH06Ly8ke3NpdGVOYW1lfS4ke3RoaXMuZG9tYWlufS9hamF4LW1vZHVsZS1jb25uZWN0b3IucGhwYDtcblxuICAgICAgICAvLyBFeGVjdXRlIHJlcXVlc3RzIGluIHBhcmFsbGVsXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBib2RpZXMubWFwKChib2R5KSA9PiB0aGlzLmxpbWl0KCgpID0+IHRoaXMuc2luZ2xlUmVxdWVzdChib2R5LCB1cmwpKSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmV0dXJuRXhjZXB0aW9ucykge1xuICAgICAgICAgIC8vIFJldHVybiBhbGwgcmVzdWx0cyBpbmNsdWRpbmcgZXJyb3JzXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKChyKSA9PiB7XG4gICAgICAgICAgICBpZiAoci5pc09rKCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHIudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gci5lcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRocm93IGZpcnN0IGVycm9yIGlmIGFueVxuICAgICAgICBjb25zdCBmaXJzdEVycm9yID0gcmVzdWx0cy5maW5kKChyKSA9PiByLmlzRXJyKCkpO1xuICAgICAgICBpZiAoZmlyc3RFcnJvcj8uaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0RXJyb3IuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHIpID0+IHtcbiAgICAgICAgICBpZiAoci5pc09rKCkpIHtcbiAgICAgICAgICAgIHJldHVybiByLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdVbmV4cGVjdGVkIGVycm9yIGluIHJlc3VsdCBwcm9jZXNzaW5nJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEFNQyByZXF1ZXN0IGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGV4ZWN1dGUgYSBzaW5nbGUgcmVxdWVzdFxuICAgKiBAcGFyYW0gYm9keSAtIFJlcXVlc3QgYm9keVxuICAgKiBAcGFyYW0gdXJsIC0gUmVxdWVzdCBVUkxcbiAgICogQHJldHVybnMgUmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2luZ2xlUmVxdWVzdChcbiAgICBib2R5OiBBTUNSZXF1ZXN0Qm9keSxcbiAgICB1cmw6IHN0cmluZ1xuICApOiBQcm9taXNlPFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZT4+IHtcbiAgICBsZXQgcmV0cnlDb3VudCA9IDA7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQWRkIHdpa2lkb3RfdG9rZW43XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0geyAuLi5ib2R5LCB3aWtpZG90X3Rva2VuNzogV0lLSURPVF9UT0tFTjcgfTtcblxuICAgICAgICAvLyBDcmVhdGUgVVJMLWVuY29kZWQgYm9keVxuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVxdWVzdEJvZHkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5reS5wb3N0KHVybCwge1xuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVyLmdldEhlYWRlcnMoKSxcbiAgICAgICAgICBib2R5OiBmb3JtRGF0YS50b1N0cmluZygpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQYXJzZSBhcyBKU09OXG4gICAgICAgIGxldCByZXNwb25zZURhdGE6IHVua25vd247XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXNwb25zZURhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlVGV4dCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIFJldHJ5IG9uIEpTT04gcGFyc2UgZXJyb3IgKGUuZy4sIGVtcHR5IHJlc3BvbnNlKVxuICAgICAgICAgIHJldHJ5Q291bnQrKztcbiAgICAgICAgICBpZiAocmV0cnlDb3VudCA+PSB0aGlzLmNvbmZpZy5yZXRyeUxpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgICAgbmV3IFJlc3BvbnNlRGF0YUVycm9yKGBBTUMgcmVzcG9uZGVkIHdpdGggbm9uLUpTT04gZGF0YTogJHtyZXNwb25zZVRleHR9YClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGJhY2tvZmYgPSBjYWxjdWxhdGVCYWNrb2ZmKFxuICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnJldHJ5SW50ZXJ2YWwsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5iYWNrb2ZmRmFjdG9yLFxuICAgICAgICAgICAgdGhpcy5jb25maWcubWF4QmFja29mZlxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoYmFja29mZik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSB3aXRoIHpvZFxuICAgICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IGFtY1Jlc3BvbnNlU2NoZW1hLnNhZmVQYXJzZShyZXNwb25zZURhdGEpO1xuICAgICAgICBpZiAoIXBhcnNlUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgIG5ldyBSZXNwb25zZURhdGFFcnJvcihgSW52YWxpZCBBTUMgcmVzcG9uc2UgZm9ybWF0OiAke3BhcnNlUmVzdWx0LmVycm9yLm1lc3NhZ2V9YClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYW1jUmVzcG9uc2UgPSBwYXJzZVJlc3VsdC5kYXRhO1xuXG4gICAgICAgIC8vIFJldHJ5IGlmIHRyeV9hZ2FpblxuICAgICAgICBpZiAoYW1jUmVzcG9uc2Uuc3RhdHVzID09PSAndHJ5X2FnYWluJykge1xuICAgICAgICAgIHJldHJ5Q291bnQrKztcbiAgICAgICAgICBpZiAocmV0cnlDb3VudCA+PSB0aGlzLmNvbmZpZy5yZXRyeUxpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgV2lraWRvdFN0YXR1c0Vycm9yKCdBTUMgcmVzcG9uZGVkIHdpdGggdHJ5X2FnYWluJywgJ3RyeV9hZ2FpbicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoXG4gICAgICAgICAgICByZXRyeUNvdW50LFxuICAgICAgICAgICAgdGhpcy5jb25maWcucmV0cnlJbnRlcnZhbCxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmJhY2tvZmZGYWN0b3IsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5tYXhCYWNrb2ZmXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvcmJpZGRlbkVycm9yIGlmIG5vX3Blcm1pc3Npb25cbiAgICAgICAgaWYgKGFtY1Jlc3BvbnNlLnN0YXR1cyA9PT0gJ25vX3Blcm1pc3Npb24nKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0U3RyID0gYm9keS5tb2R1bGVOYW1lXG4gICAgICAgICAgICA/IGBtb2R1bGVOYW1lOiAke2JvZHkubW9kdWxlTmFtZX1gXG4gICAgICAgICAgICA6IGJvZHkuYWN0aW9uXG4gICAgICAgICAgICAgID8gYGFjdGlvbjogJHtib2R5LmFjdGlvbn0vJHtib2R5LmV2ZW50ID8/ICcnfWBcbiAgICAgICAgICAgICAgOiAndW5rbm93bic7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgRm9yYmlkZGVuRXJyb3IoXG4gICAgICAgICAgICAgIGBZb3VyIGFjY291bnQgaGFzIG5vIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGlzIGFjdGlvbjogJHt0YXJnZXRTdHJ9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFcnJvciBpZiBzdGF0dXMgaXMgbm90IG9rXG4gICAgICAgIGlmIChhbWNSZXNwb25zZS5zdGF0dXMgIT09ICdvaycpIHtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgIG5ldyBXaWtpZG90U3RhdHVzRXJyb3IoXG4gICAgICAgICAgICAgIGBBTUMgcmVzcG9uZGVkIHdpdGggZXJyb3Igc3RhdHVzOiBcIiR7YW1jUmVzcG9uc2Uuc3RhdHVzfVwiYCxcbiAgICAgICAgICAgICAgYW1jUmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3ZE9rQXN5bmMoYW1jUmVzcG9uc2UpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gUmV0cnkgb24gYWxsIGVycm9ycyAoSFRUUCBlcnJvcnMsIG5ldHdvcmsgZXJyb3JzLCB0aW1lb3V0cywgZXRjLilcbiAgICAgICAgLy8gV2lraWRvdCBzZXJ2ZXIgaGFzIGEgcmVsYXRpdmVseSBoaWdoIGVycm9yIHJhdGUsIHNvIHJldHJ5IGlzIGVzc2VudGlhbFxuICAgICAgICByZXRyeUNvdW50Kys7XG4gICAgICAgIGlmIChyZXRyeUNvdW50ID49IHRoaXMuY29uZmlnLnJldHJ5TGltaXQpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID1cbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgICAgICAgICA/ICgoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyIH0gfSkucmVzcG9uc2U/LnN0YXR1cyA/P1xuICAgICAgICAgICAgICAgIERFRkFVTFRfSFRUUF9TVEFUVVNfQ09ERSlcbiAgICAgICAgICAgICAgOiBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREU7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IEFNQ0h0dHBFcnJvcihgQU1DIHJlcXVlc3QgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCwgc3RhdHVzQ29kZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoXG4gICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICB0aGlzLmNvbmZpZy5yZXRyeUludGVydmFsLFxuICAgICAgICAgIHRoaXMuY29uZmlnLmJhY2tvZmZGYWN0b3IsXG4gICAgICAgICAgdGhpcy5jb25maWcubWF4QmFja29mZlxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiLyoqXG4gKiBDbGFzcyBmb3IgbWFuYWdpbmcgQU1DIHJlcXVlc3QgaGVhZGVyc1xuICovXG5leHBvcnQgY2xhc3MgQU1DSGVhZGVyIHtcbiAgcHJpdmF0ZSBjb29raWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBwcml2YXRlIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gIHByaXZhdGUgdXNlckFnZW50OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVmZXJlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEhlYWRlciBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogeyBjb250ZW50VHlwZT86IHN0cmluZzsgdXNlckFnZW50Pzogc3RyaW5nOyByZWZlcmVyPzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLmNvbnRlbnRUeXBlID0gb3B0aW9ucz8uY29udGVudFR5cGUgPz8gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCc7XG4gICAgdGhpcy51c2VyQWdlbnQgPSBvcHRpb25zPy51c2VyQWdlbnQgPz8gJ1dpa2lkb3RUUyc7XG4gICAgdGhpcy5yZWZlcmVyID0gb3B0aW9ucz8ucmVmZXJlciA/PyAnaHR0cHM6Ly93d3cud2lraWRvdC5jb20vJztcbiAgICB0aGlzLmNvb2tpZXMgPSBuZXcgTWFwKFtbJ3dpa2lkb3RfdG9rZW43JywgJzEyMzQ1NiddXSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgY29va2llXG4gICAqIEBwYXJhbSBuYW1lIC0gQ29va2llIG5hbWVcbiAgICogQHBhcmFtIHZhbHVlIC0gQ29va2llIHZhbHVlXG4gICAqL1xuICBzZXRDb29raWUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb29raWVzLnNldChuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgY29va2llXG4gICAqIEBwYXJhbSBuYW1lIC0gQ29va2llIG5hbWVcbiAgICovXG4gIGRlbGV0ZUNvb2tpZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvb2tpZXMuZGVsZXRlKG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGNvb2tpZVxuICAgKiBAcGFyYW0gbmFtZSAtIENvb2tpZSBuYW1lXG4gICAqIEByZXR1cm5zIENvb2tpZSB2YWx1ZSwgdW5kZWZpbmVkIGlmIG5vdCBleGlzdHNcbiAgICovXG4gIGdldENvb2tpZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvb2tpZXMuZ2V0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVFRQIGhlYWRlcnMgb2JqZWN0XG4gICAqIEByZXR1cm5zIEhlYWRlcnMgZGljdGlvbmFyeVxuICAgKi9cbiAgZ2V0SGVhZGVycygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBjb29raWVTdHJpbmcgPSBBcnJheS5mcm9tKHRoaXMuY29va2llcy5lbnRyaWVzKCkpXG4gICAgICAubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBgJHtuYW1lfT0ke3ZhbHVlfWApXG4gICAgICAuam9pbignOyAnKTtcblxuICAgIHJldHVybiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogdGhpcy5jb250ZW50VHlwZSxcbiAgICAgICdVc2VyLUFnZW50JzogdGhpcy51c2VyQWdlbnQsXG4gICAgICBSZWZlcmVyOiB0aGlzLnJlZmVyZXIsXG4gICAgICBDb29raWU6IGNvb2tpZVN0cmluZyxcbiAgICB9O1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG4vKipcbiAqIEFNQyByZXF1ZXN0IGJvZHkgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgdHlwZSBBTUNSZXF1ZXN0Qm9keVZhbHVlID1cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZFxuICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHwgQU1DUmVxdWVzdEJvZHlWYWx1ZVtdO1xuXG4vKipcbiAqIEFNQyByZXF1ZXN0IGJvZHkgdHlwZSBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQU1DUmVxdWVzdEJvZHkge1xuICBtb2R1bGVOYW1lPzogc3RyaW5nO1xuICBhY3Rpb24/OiBzdHJpbmc7XG4gIGV2ZW50Pzogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiBBTUNSZXF1ZXN0Qm9keVZhbHVlO1xufVxuXG4vKipcbiAqIEFNQyByZXNwb25zZSBiYXNlIHNjaGVtYVxuICovXG5jb25zdCBiYXNlU2NoZW1hOiB6LlpvZE9iamVjdDx7XG4gIHN0YXR1czogei5ab2RTdHJpbmc7XG4gIGJvZHk6IHouWm9kT3B0aW9uYWw8ei5ab2RTdHJpbmc+O1xuICBtZXNzYWdlOiB6LlpvZE9wdGlvbmFsPHouWm9kU3RyaW5nPjtcbn0+ID0gei5vYmplY3Qoe1xuICBzdGF0dXM6IHouc3RyaW5nKCksXG4gIGJvZHk6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbWVzc2FnZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogQU1DIHJlc3BvbnNlIHNjaGVtYVxuICovXG5leHBvcnQgY29uc3QgYW1jUmVzcG9uc2VTY2hlbWE6IHouWm9kVHlwZTx6LmluZmVyPHR5cGVvZiBiYXNlU2NoZW1hPiAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9XG4gIGJhc2VTY2hlbWEucGFzc3Rocm91Z2goKTtcblxuLyoqXG4gKiBBTUMgcmVzcG9uc2UgdHlwZVxuICovXG5leHBvcnQgdHlwZSBBTUNSZXNwb25zZSA9IHouaW5mZXI8dHlwZW9mIGFtY1Jlc3BvbnNlU2NoZW1hPjtcblxuLyoqXG4gKiBTdWNjZXNzZnVsIEFNQyByZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ1N1Y2Nlc3NSZXNwb25zZSB7XG4gIHN0YXR1czogJ29rJztcbiAgYm9keTogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgQU1DIHJlc3BvbnNlIGlzIHN1Y2Nlc3NmdWxcbiAqIEBwYXJhbSByZXNwb25zZSAtIEFNQyByZXNwb25zZVxuICogQHJldHVybnMgdHJ1ZSBpZiByZXNwb25zZSBpcyBzdWNjZXNzZnVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N1Y2Nlc3NSZXNwb25zZShyZXNwb25zZTogQU1DUmVzcG9uc2UpOiByZXNwb25zZSBpcyBBTUNTdWNjZXNzUmVzcG9uc2Uge1xuICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzID09PSAnb2snO1xufVxuIiwKICAgICJleHBvcnQgeyBBTUNDbGllbnQsIHR5cGUgQU1DUmVxdWVzdE9wdGlvbnMsIG1hc2tTZW5zaXRpdmVEYXRhIH0gZnJvbSAnLi9hbWMtY2xpZW50JztcbmV4cG9ydCB7IHR5cGUgQU1DQ29uZmlnLCBERUZBVUxUX0FNQ19DT05GSUcgfSBmcm9tICcuL2FtYy1jb25maWcnO1xuZXhwb3J0IHsgQU1DSGVhZGVyIH0gZnJvbSAnLi9hbWMtaGVhZGVyJztcbmV4cG9ydCB7XG4gIHR5cGUgQU1DUmVxdWVzdEJvZHksXG4gIHR5cGUgQU1DUmVzcG9uc2UsXG4gIHR5cGUgQU1DU3VjY2Vzc1Jlc3BvbnNlLFxuICBhbWNSZXNwb25zZVNjaGVtYSxcbiAgaXNTdWNjZXNzUmVzcG9uc2UsXG59IGZyb20gJy4vYW1jLXR5cGVzJztcbmV4cG9ydCB7IGxvZ2luLCBsb2dvdXQgfSBmcm9tICcuL2F1dGgnO1xuIiwKICAgICJpbXBvcnQgeyBTZXNzaW9uQ3JlYXRlRXJyb3IgfSBmcm9tICcuLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYywgd2RPa0FzeW5jIH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQXV0aENsaWVudENvbnRleHQgfSBmcm9tICcuLi9tb2R1bGUvdHlwZXMnO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuLi91dGlsL2h0dHAnO1xuaW1wb3J0IHsgREVGQVVMVF9BTUNfQ09ORklHIH0gZnJvbSAnLi9hbWMtY29uZmlnJztcblxuY29uc3QgTE9HSU5fVVJMID0gJ2h0dHBzOi8vd3d3Lndpa2lkb3QuY29tL2RlZmF1bHQtLWZsb3cvbG9naW5fX0xvZ2luUG9wdXBTY3JlZW4nO1xuXG4vKiogTG9naW4gcmV0cnkgbGltaXQgKHJlZHVjZWQgdG8gcHJldmVudCBhY2NvdW50IGxvY2tvdXQpICovXG5jb25zdCBMT0dJTl9SRVRSWV9MSU1JVCA9IDM7XG5cbi8qKlxuICogTG9naW4gdG8gV2lraWRvdCB3aXRoIHVzZXJuYW1lIGFuZCBwYXNzd29yZFxuICogQHBhcmFtIGNsaWVudCAtIENsaWVudCBjb250ZXh0IChvYmplY3Qgd2l0aCBBTUNDbGllbnQpXG4gKiBAcGFyYW0gdXNlcm5hbWUgLSBVc2VybmFtZVxuICogQHBhcmFtIHBhc3N3b3JkIC0gUGFzc3dvcmRcbiAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2VzcywgU2Vzc2lvbkNyZWF0ZUVycm9yIG9uIGZhaWx1cmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ2luKFxuICBjbGllbnQ6IEF1dGhDbGllbnRDb250ZXh0LFxuICB1c2VybmFtZTogc3RyaW5nLFxuICBwYXNzd29yZDogc3RyaW5nXG4pOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgIGxvZ2luOiB1c2VybmFtZSxcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgICBhY3Rpb246ICdMb2dpbjJBY3Rpb24nLFxuICAgICAgICBldmVudDogJ2xvZ2luJyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBVc2UgcmVkdWNlZCByZXRyeSBsaW1pdCBmb3IgbG9naW4gdG8gcHJldmVudCBhY2NvdW50IGxvY2tvdXRcbiAgICAgIGNvbnN0IGxvZ2luQ29uZmlnID0ge1xuICAgICAgICAuLi5ERUZBVUxUX0FNQ19DT05GSUcsXG4gICAgICAgIHJldHJ5TGltaXQ6IExPR0lOX1JFVFJZX0xJTUlULFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkoTE9HSU5fVVJMLCBsb2dpbkNvbmZpZywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogY2xpZW50LmFtY0NsaWVudC5oZWFkZXIuZ2V0SGVhZGVycygpLFxuICAgICAgICBib2R5OiBmb3JtRGF0YS50b1N0cmluZygpLFxuICAgICAgICBjaGVja09rOiBmYWxzZSwgLy8gSGFuZGxlIEhUVFAgZXJyb3JzIG1hbnVhbGx5IGZvciBiZXR0ZXIgZXJyb3IgbWVzc2FnZXNcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDaGVjayBzdGF0dXMgY29kZVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKFxuICAgICAgICAgIGBMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gSFRUUCBzdGF0dXMgY29kZTogJHtyZXNwb25zZS5zdGF0dXN9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib2R5IGZvciBlcnJvciBtZXNzYWdlXG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgaWYgKGJvZHkuaW5jbHVkZXMoJ1RoZSBsb2dpbiBhbmQgcGFzc3dvcmQgZG8gbm90IG1hdGNoJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25DcmVhdGVFcnJvcignTG9naW4gYXR0ZW1wdCBmYWlsZWQgZHVlIHRvIGludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgY29va2llc1xuICAgICAgY29uc3QgY29va2llcyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdTZXQtQ29va2llJyk7XG4gICAgICBpZiAoIWNvb2tpZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25DcmVhdGVFcnJvcignTG9naW4gYXR0ZW1wdCBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgY29va2llcycpO1xuICAgICAgfVxuXG4gICAgICAvLyBFeHRyYWN0IFdJS0lET1RfU0VTU0lPTl9JRCBmcm9tIGNvb2tpZXNcbiAgICAgIGNvbnN0IHNlc3Npb25JZE1hdGNoID0gY29va2llcy5tYXRjaCgvV0lLSURPVF9TRVNTSU9OX0lEPShbXjtdKykvKTtcbiAgICAgIGlmICghc2Vzc2lvbklkTWF0Y2g/LlsxXSkge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKFxuICAgICAgICAgICdMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gbWlzc2luZyBXSUtJRE9UX1NFU1NJT05fSUQgY29va2llJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgc2Vzc2lvbiBjb29raWVcbiAgICAgIGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLnNldENvb2tpZSgnV0lLSURPVF9TRVNTSU9OX0lEJywgc2Vzc2lvbklkTWF0Y2hbMV0pO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZXNzaW9uQ3JlYXRlRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ3JlYXRlRXJyb3IoYExvZ2luIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBMb2dvdXQgZnJvbSBXaWtpZG90XG4gKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50IGNvbnRleHQgKG9iamVjdCB3aXRoIEFNQ0NsaWVudClcbiAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nb3V0KGNsaWVudDogQXV0aENsaWVudENvbnRleHQpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAvLyBUcnkgdG8gbG9nb3V0IHZpYSBBTUMsIHRoZW4gYWx3YXlzIHJlbW92ZSBzZXNzaW9uIGNvb2tpZVxuICByZXR1cm4gY2xpZW50LmFtY0NsaWVudFxuICAgIC5yZXF1ZXN0KFtcbiAgICAgIHtcbiAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgYWN0aW9uOiAnTG9naW4yQWN0aW9uJyxcbiAgICAgICAgZXZlbnQ6ICdsb2dvdXQnLFxuICAgICAgfSxcbiAgICBdKVxuICAgIC5tYXAoKCkgPT4ge1xuICAgICAgLy8gTG9nb3V0IHN1Y2NlZWRlZCwgcmVtb3ZlIHNlc3Npb24gY29va2llXG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5kZWxldGVDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KVxuICAgIC5vckVsc2UoKCkgPT4ge1xuICAgICAgLy8gRXZlbiBpZiBsb2dvdXQgcmVxdWVzdCBmYWlscywgd2Ugc3RpbGwgd2FudCB0byBjbGVhciB0aGUgc2Vzc2lvbiBsb2NhbGx5XG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5kZWxldGVDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcpO1xuICAgICAgcmV0dXJuIHdkT2tBc3luYyh1bmRlZmluZWQpO1xuICAgIH0pO1xufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm9FbGVtZW50RXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uL3VzZXIvdXNlcic7XG5cbi8qKlxuICogUHJpdmF0ZSBtZXNzYWdlIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlTWVzc2FnZURhdGEge1xuICBjbGllbnQ6IENsaWVudDtcbiAgaWQ6IG51bWJlcjtcbiAgc2VuZGVyOiBBYnN0cmFjdFVzZXI7XG4gIHJlY2lwaWVudDogQWJzdHJhY3RVc2VyO1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIFByaXZhdGUgbWVzc2FnZVxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VuZGVyOiBBYnN0cmFjdFVzZXI7XG4gIHB1YmxpYyByZWFkb25seSByZWNpcGllbnQ6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQcml2YXRlTWVzc2FnZURhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGRhdGEuY2xpZW50O1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMuc2VuZGVyID0gZGF0YS5zZW5kZXI7XG4gICAgdGhpcy5yZWNpcGllbnQgPSBkYXRhLnJlY2lwaWVudDtcbiAgICB0aGlzLnN1YmplY3QgPSBkYXRhLnN1YmplY3Q7XG4gICAgdGhpcy5ib2R5ID0gZGF0YS5ib2R5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lc3NhZ2UgYnkgbWVzc2FnZSBJRFxuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBNZXNzYWdlIElEXG4gICAqIEByZXR1cm5zIFByaXZhdGUgbWVzc2FnZVxuICAgKi9cbiAgc3RhdGljIGZyb21JZChjbGllbnQ6IENsaWVudCwgbWVzc2FnZUlkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyhjbGllbnQsIFttZXNzYWdlSWRdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgTWVzc2FnZSBub3QgZm91bmQ6ICR7bWVzc2FnZUlkfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IG1lc3NhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgcHJpdmF0ZSBtZXNzYWdlXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIFJlY2lwaWVudFxuICAgKiBAcGFyYW0gc3ViamVjdCAtIFN1YmplY3RcbiAgICogQHBhcmFtIGJvZHkgLSBCb2R5XG4gICAqL1xuICBzdGF0aWMgc2VuZChcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICByZWNpcGllbnQ6IFVzZXIsXG4gICAgc3ViamVjdDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZ1xuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gc2VuZCBtZXNzYWdlJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2U6IGJvZHksXG4gICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgdG9fdXNlcl9pZDogcmVjaXBpZW50LmlkLFxuICAgICAgICAgICAgYWN0aW9uOiAnRGFzaGJvYXJkTWVzc2FnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NlbmQnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2VuZCBtZXNzYWdlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFByaXZhdGVNZXNzYWdlKGlkPSR7dGhpcy5pZH0sIHNlbmRlcj0ke3RoaXMuc2VuZGVyfSwgcmVjaXBpZW50PSR7dGhpcy5yZWNpcGllbnR9LCBzdWJqZWN0PSR7dGhpcy5zdWJqZWN0fSlgO1xuICB9XG59XG5cbi8qKlxuICogUHJpdmF0ZSBtZXNzYWdlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFByaXZhdGVNZXNzYWdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgbWVzc2FnZXM/OiBQcml2YXRlTWVzc2FnZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICBpZiAobWVzc2FnZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5tZXNzYWdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQcml2YXRlTWVzc2FnZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgobWVzc2FnZSkgPT4gbWVzc2FnZS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZXNzYWdlcyBmcm9tIGxpc3Qgb2YgbWVzc2FnZSBJRHNcbiAgICovXG4gIHN0YXRpYyBmcm9tSWRzKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIG1lc3NhZ2VJZHM6IG51bWJlcltdXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBtZXNzYWdlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvZGllcyA9IG1lc3NhZ2VJZHMubWFwKChtZXNzYWdlSWQpID0+ICh7XG4gICAgICAgICAgaXRlbTogbWVzc2FnZUlkLFxuICAgICAgICAgIG1vZHVsZU5hbWU6ICdkYXNoYm9hcmQvbWVzc2FnZXMvRE1WaWV3TWVzc2FnZU1vZHVsZScsXG4gICAgICAgIH0pKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuYW1jQ2xpZW50LnJlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZXM6IFByaXZhdGVNZXNzYWdlW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2VJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBtZXNzYWdlSWRzW2ldO1xuICAgICAgICAgIGlmICghcmVzcG9uc2UgfHwgbWVzc2FnZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgICAgLy8gR2V0IHVzZXIgaW5mb3JtYXRpb25cbiAgICAgICAgICBjb25zdCBwcmludHVzZXJFbGVtcyA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuaGVhZGVyIHNwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgaWYgKHByaW50dXNlckVsZW1zLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcihgRmFpbGVkIHRvIGdldCBtZXNzYWdlOiAke21lc3NhZ2VJZH1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzZW5kZXJFbGVtID0gJChwcmludHVzZXJFbGVtc1swXSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50RWxlbSA9ICQocHJpbnR1c2VyRWxlbXNbMV0pO1xuXG4gICAgICAgICAgY29uc3Qgc2VuZGVyID0gcGFyc2VVc2VyKGNsaWVudCwgc2VuZGVyRWxlbSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50ID0gcGFyc2VVc2VyKGNsaWVudCwgcmVjaXBpZW50RWxlbSk7XG5cbiAgICAgICAgICAvLyBTdWJqZWN0XG4gICAgICAgICAgY29uc3Qgc3ViamVjdEVsZW0gPSAkKCdkaXYucG1lc3NhZ2UgZGl2LmhlYWRlciBzcGFuLnN1YmplY3QnKTtcbiAgICAgICAgICBjb25zdCBzdWJqZWN0ID0gc3ViamVjdEVsZW0udGV4dCgpLnRyaW0oKTtcblxuICAgICAgICAgIC8vIEJvZHlcbiAgICAgICAgICBjb25zdCBib2R5RWxlbSA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuYm9keScpO1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBib2R5RWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAgICAgY29uc3Qgb2RhdGVFbGVtID0gJCgnZGl2LmhlYWRlciBzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgICAgICAgIG9kYXRlRWxlbS5sZW5ndGggPiAwID8gKHBhcnNlT2RhdGUob2RhdGVFbGVtKSA/PyBuZXcgRGF0ZSgwKSkgOiBuZXcgRGF0ZSgwKTtcblxuICAgICAgICAgIG1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICBuZXcgUHJpdmF0ZU1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgIHNlbmRlcixcbiAgICAgICAgICAgICAgcmVjaXBpZW50LFxuICAgICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbihjbGllbnQsIG1lc3NhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVzc2FnZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBnZXQgbWVzc2FnZXMgZnJvbSBtb2R1bGVcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgYWNxdWlyZUZyb21Nb2R1bGUoXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgbW9kdWxlTmFtZTogc3RyaW5nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBtZXNzYWdlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEdldCBwYWdlclxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChbeyBtb2R1bGVOYW1lIH1dKTtcbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RIdG1sID0gU3RyaW5nKGZpcnN0UmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICRmaXJzdCA9IGNoZWVyaW8ubG9hZChmaXJzdEh0bWwpO1xuXG4gICAgICAgIC8vIEdldCBwYWdlIGNvdW50XG4gICAgICAgIGNvbnN0IHBhZ2VyVGFyZ2V0cyA9ICRmaXJzdCgnZGl2LnBhZ2VyIHNwYW4udGFyZ2V0Jyk7XG4gICAgICAgIGxldCBtYXhQYWdlID0gMTtcbiAgICAgICAgaWYgKHBhZ2VyVGFyZ2V0cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJGZpcnN0KHBhZ2VyVGFyZ2V0c1twYWdlclRhcmdldHMubGVuZ3RoIC0gMl0pXG4gICAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgIG1heFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCkgfHwgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBtZXNzYWdlIElEcyBmcm9tIGFsbCBwYWdlc1xuICAgICAgICBjb25zdCBtZXNzYWdlSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIGlmIChtYXhQYWdlID4gMSkge1xuICAgICAgICAgIGNvbnN0IGJvZGllcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAxOyBwYWdlIDw9IG1heFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgICAgYm9kaWVzLnB1c2goeyBwYWdlLCBtb2R1bGVOYW1lIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMpO1xuICAgICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgICAgICAkKCd0ci5tZXNzYWdlJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YUhyZWYgPSAkKGVsZW0pLmF0dHIoJ2RhdGEtaHJlZicpID8/ICcnO1xuICAgICAgICAgICAgICBjb25zdCBpZE1hdGNoID0gZGF0YUhyZWYubWF0Y2goL1xcLyhcXGQrKSQvKTtcbiAgICAgICAgICAgICAgaWYgKGlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZHMucHVzaChOdW1iZXIucGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRmaXJzdCgndHIubWVzc2FnZScpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhSHJlZiA9ICRmaXJzdChlbGVtKS5hdHRyKCdkYXRhLWhyZWYnKSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBkYXRhSHJlZi5tYXRjaCgvXFwvKFxcZCspJC8pO1xuICAgICAgICAgICAgaWYgKGlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgICBtZXNzYWdlSWRzLnB1c2goTnVtYmVyLnBhcnNlSW50KGlkTWF0Y2hbMV0sIDEwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgbWVzc2FnZXNcbiAgICAgICAgY29uc3QgbWVzc2FnZXNSZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyhjbGllbnQsIG1lc3NhZ2VJZHMpO1xuICAgICAgICBpZiAobWVzc2FnZXNSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IG1lc3NhZ2VzUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fFxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yIHx8XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvclxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIG1lc3NhZ2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEluYm94XG4gKi9cbmV4cG9ydCBjbGFzcyBQcml2YXRlTWVzc2FnZUluYm94IGV4dGVuZHMgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEdldCBhbGwgbWVzc2FnZXMgaW4gaW5ib3hcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKGNsaWVudDogQ2xpZW50KTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlSW5ib3g+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uYWNxdWlyZUZyb21Nb2R1bGUoXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgICdkYXNoYm9hcmQvbWVzc2FnZXMvRE1JbmJveE1vZHVsZSdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluYm94ID0gbmV3IFByaXZhdGVNZXNzYWdlSW5ib3goY2xpZW50KTtcbiAgICAgICAgaW5ib3gucHVzaCguLi5yZXN1bHQudmFsdWUpO1xuICAgICAgICByZXR1cm4gaW5ib3g7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBpbmJveDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZW50IGJveFxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94IGV4dGVuZHMgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEdldCBhbGwgbWVzc2FnZXMgaW4gc2VudCBib3hcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKGNsaWVudDogQ2xpZW50KTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlU2VudEJveD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5hY3F1aXJlRnJvbU1vZHVsZShcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgJ2Rhc2hib2FyZC9tZXNzYWdlcy9ETVNlbnRNb2R1bGUnXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZW50Qm94ID0gbmV3IFByaXZhdGVNZXNzYWdlU2VudEJveChjbGllbnQpO1xuICAgICAgICBzZW50Qm94LnB1c2goLi4ucmVzdWx0LnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHNlbnRCb3g7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBzZW50IGJveDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHtcbiAgUHJpdmF0ZU1lc3NhZ2UsXG4gIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbixcbiAgUHJpdmF0ZU1lc3NhZ2VJbmJveCxcbiAgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94LFxufSBmcm9tICcuLi8uLi9wcml2YXRlLW1lc3NhZ2UnO1xuaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSAnLi4vLi4vdXNlci91c2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiBQcml2YXRlIG1lc3NhZ2Ugb3BlcmF0aW9ucyBhY2Nlc3NvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBHZXQgaW5ib3hcbiAqIGNvbnN0IGluYm94UmVzdWx0ID0gYXdhaXQgY2xpZW50LnByaXZhdGVNZXNzYWdlLmluYm94KCk7XG4gKiBpZiAoIWluYm94UmVzdWx0LmlzT2soKSkge1xuICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgaW5ib3gnKTtcbiAqIH1cbiAqIGNvbnN0IGluYm94ID0gaW5ib3hSZXN1bHQudmFsdWU7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVzc2FnZSBieSBtZXNzYWdlIElEXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIE1lc3NhZ2UgSURcbiAgICogQHJldHVybnMgTWVzc2FnZSBvYmplY3Qgd3JhcHBlZCBpbiBSZXN1bHQgdHlwZVxuICAgKi9cbiAgZ2V0KGlkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2UuZnJvbUlkKHRoaXMuY2xpZW50LCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lc3NhZ2VzIGZyb20gbXVsdGlwbGUgbWVzc2FnZSBJRHNcbiAgICogQHBhcmFtIGlkcyAtIEFycmF5IG9mIG1lc3NhZ2UgSURzXG4gICAqIEByZXR1cm5zIE1lc3NhZ2UgY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0TWVzc2FnZXMoaWRzOiBudW1iZXJbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uLmZyb21JZHModGhpcy5jbGllbnQsIGlkcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGluYm94IG1lc3NhZ2UgbGlzdFxuICAgKiBAcmV0dXJucyBJbmJveFxuICAgKi9cbiAgaW5ib3goKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlSW5ib3g+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VJbmJveC5hY3F1aXJlKHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VudCBib3ggbWVzc2FnZSBsaXN0XG4gICAqIEByZXR1cm5zIFNlbnQgYm94XG4gICAqL1xuICBzZW50Qm94KCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZVNlbnRCb3g+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VTZW50Qm94LmFjcXVpcmUodGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBwcml2YXRlIG1lc3NhZ2VcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIFJlY2lwaWVudFxuICAgKiBAcGFyYW0gc3ViamVjdCAtIFN1YmplY3RcbiAgICogQHBhcmFtIGJvZHkgLSBCb2R5XG4gICAqL1xuICBzZW5kKHJlY2lwaWVudDogVXNlciwgc3ViamVjdDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZS5zZW5kKHRoaXMuY2xpZW50LCByZWNpcGllbnQsIHN1YmplY3QsIGJvZHkpO1xuICB9XG59XG5cbmV4cG9ydCB7IFByaXZhdGVNZXNzYWdlLCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24sIFByaXZhdGVNZXNzYWdlSW5ib3gsIFByaXZhdGVNZXNzYWdlU2VudEJveCB9O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQge1xuICBGb3J1bUNhdGVnb3J5LFxuICBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbixcbiAgRm9ydW1Qb3N0LFxuICBGb3J1bVRocmVhZCxcbiAgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLFxufSBmcm9tICcuLi8uLi9mb3J1bSc7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcblxuLyoqXG4gKiBGb3J1bSBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZvcnVtIGNhdGVnb3J5IGxpc3RcbiAgICogQHJldHVybnMgQ2F0ZWdvcnkgbGlzdFxuICAgKi9cbiAgZ2V0Q2F0ZWdvcmllcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24uYWNxdWlyZUFsbCh0aGlzLnNpdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWRcbiAgICogQHBhcmFtIHRocmVhZElkIC0gVGhyZWFkIElEXG4gICAqIEByZXR1cm5zIFRocmVhZFxuICAgKi9cbiAgZ2V0VGhyZWFkKHRocmVhZElkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWQ+IHtcbiAgICByZXR1cm4gRm9ydW1UaHJlYWQuZ2V0RnJvbUlkKHRoaXMuc2l0ZSwgdGhyZWFkSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtdWx0aXBsZSB0aHJlYWRzXG4gICAqIEBwYXJhbSB0aHJlYWRJZHMgLSBBcnJheSBvZiB0aHJlYWQgSURzXG4gICAqIEByZXR1cm5zIFRocmVhZCBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRUaHJlYWRzKHRocmVhZElkczogbnVtYmVyW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyh0aGlzLnNpdGUsIHRocmVhZElkcyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRm9ydW1DYXRlZ29yeSwgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24sIEZvcnVtUG9zdCwgRm9ydW1UaHJlYWQsIEZvcnVtVGhyZWFkQ29sbGVjdGlvbiB9O1xuIiwKICAgICJpbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIFRhcmdldEVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgdHlwZSBRTUNVc2VyLCBRdWlja01vZHVsZSB9IGZyb20gJy4uLy4uLy4uL3V0aWwvcXVpY2stbW9kdWxlJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvdXNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB7IFNpdGVBcHBsaWNhdGlvbiB9IGZyb20gJy4uL3NpdGUtYXBwbGljYXRpb24nO1xuaW1wb3J0IHsgU2l0ZU1lbWJlciB9IGZyb20gJy4uL3NpdGUtbWVtYmVyJztcblxuLyoqXG4gKiBTaXRlIG1lbWJlciBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1iZXJBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUpIHtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgbWVtYmVyc1xuICAgKiBAcmV0dXJucyBNZW1iZXIgbGlzdFxuICAgKi9cbiAgZ2V0QWxsKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtb2RlcmF0b3IgbGlzdFxuICAgKiBAcmV0dXJucyBNb2RlcmF0b3IgbGlzdFxuICAgKi9cbiAgZ2V0TW9kZXJhdG9ycygpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZU1lbWJlcltdPiB7XG4gICAgcmV0dXJuIFNpdGVNZW1iZXIuZ2V0TWVtYmVycyh0aGlzLnNpdGUsICdtb2RlcmF0b3JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFkbWluIGxpc3RcbiAgICogQHJldHVybnMgQWRtaW4gbGlzdFxuICAgKi9cbiAgZ2V0QWRtaW5zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJ2FkbWlucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwZW5kaW5nIG1lbWJlcnNoaXAgYXBwbGljYXRpb25zXG4gICAqIEByZXR1cm5zIEFwcGxpY2F0aW9uIGxpc3RcbiAgICovXG4gIGdldEFwcGxpY2F0aW9ucygpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUFwcGxpY2F0aW9uW10+IHtcbiAgICByZXR1cm4gU2l0ZUFwcGxpY2F0aW9uLmFjcXVpcmVBbGwodGhpcy5zaXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggbWVtYmVyc1xuICAgKiBAcGFyYW0gcXVlcnkgLSBTZWFyY2ggcXVlcnkgKHBhcnQgb2YgdXNlcm5hbWUpXG4gICAqIEByZXR1cm5zIE1hdGNoZWQgdXNlciBsaXN0IChRTUNVc2VyIGZvcm1hdClcbiAgICovXG4gIGxvb2t1cChxdWVyeTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFFNQ1VzZXJbXT4ge1xuICAgIHJldHVybiBRdWlja01vZHVsZS5tZW1iZXJMb29rdXAodGhpcy5zaXRlLmlkLCBxdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogSW52aXRlIHVzZXIgdG8gc2l0ZVxuICAgKiBAcGFyYW0gdXNlciAtIFVzZXIgdG8gaW52aXRlXG4gICAqIEBwYXJhbSB0ZXh0IC0gSW52aXRhdGlvbiBtZXNzYWdlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGludml0ZSh1c2VyOiBVc2VyLCB0ZXh0OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdNYW5hZ2VTaXRlTWVtYmVyc2hpcEFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ2ludml0ZU1lbWJlcicsXG4gICAgICAgICAgICB1c2VyX2lkOiB1c2VyLmlkLFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzdWx0LmVycm9yO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RTdGF0dXNFcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X2ludml0ZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5IGludml0ZWQgdG8gJHt0aGlzLnNpdGUudW5peE5hbWV9OiAke3VzZXIubmFtZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ2FscmVhZHlfbWVtYmVyJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFVzZXIgaXMgYWxyZWFkeSBhIG1lbWJlciBvZiAke3RoaXMuc2l0ZS51bml4TmFtZX06ICR7dXNlci5uYW1lfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGFyZ2V0RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBpbnZpdGUgdXNlcjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2l0ZUFwcGxpY2F0aW9uLCBTaXRlTWVtYmVyIH07XG4iLAogICAgIi8qKlxuICogUXVpY2tNb2R1bGUgLSBXaWtpZG90IGxpZ2h0d2VpZ2h0IEFQSVxuICpcbiAqIFNlYXJjaCBmdW5jdGlvbmFsaXR5IHVzaW5nIHF1aWNrbW9kdWxlLnBocCBlbmRwb2ludFxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24sIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcbmltcG9ydCB7IGZldGNoV2l0aFJldHJ5IH0gZnJvbSAnLi9odHRwJztcblxuLyoqXG4gKiBRdWlja01vZHVsZSBtb2R1bGUgbmFtZVxuICovXG5leHBvcnQgdHlwZSBRdWlja01vZHVsZU5hbWUgPSAnTWVtYmVyTG9va3VwUU1vZHVsZScgfCAnVXNlckxvb2t1cFFNb2R1bGUnIHwgJ1BhZ2VMb29rdXBRTW9kdWxlJztcblxuLyoqXG4gKiBRdWlja01vZHVsZSB1c2VyIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUU1DVXNlciB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZSBwYWdlIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUU1DUGFnZSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHVuaXhOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUXVpY2tNb2R1bGUgcmVzcG9uc2Ugc2NoZW1hXG4gKi9cbmNvbnN0IHF1aWNrTW9kdWxlVXNlclJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICB1c2Vyczogei51bmlvbihbXG4gICAgei5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgdXNlcl9pZDogei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pLFxuICAgICAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgICAgfSlcbiAgICApLFxuICAgIHoubGl0ZXJhbChmYWxzZSksXG4gIF0pLFxufSk7XG5cbmNvbnN0IHF1aWNrTW9kdWxlUGFnZVJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBwYWdlczogei51bmlvbihbXG4gICAgei5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgdGl0bGU6IHouc3RyaW5nKCksXG4gICAgICAgIHVuaXhfbmFtZTogei5zdHJpbmcoKSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICB6LmxpdGVyYWwoZmFsc2UpLFxuICBdKSxcbn0pO1xuXG4vKipcbiAqIFNlbmQgcmVxdWVzdCB0byBRdWlja01vZHVsZSBlbmRwb2ludFxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UXVpY2tNb2R1bGUoXG4gIG1vZHVsZU5hbWU6IFF1aWNrTW9kdWxlTmFtZSxcbiAgc2l0ZUlkOiBudW1iZXIsXG4gIHF1ZXJ5OiBzdHJpbmdcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cud2lraWRvdC5jb20vcXVpY2ttb2R1bGUucGhwP21vZHVsZT0ke21vZHVsZU5hbWV9JnM9JHtzaXRlSWR9JnE9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWA7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeSh1cmwsIERFRkFVTFRfQU1DX0NPTkZJRywge1xuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgaGVhZGVyczoge1xuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfSxcbiAgICBjaGVja09rOiBmYWxzZSwgLy8gSGFuZGxlIEhUVFAgZXJyb3JzIG1hbnVhbGx5XG4gIH0pO1xuXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDUwMCkge1xuICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBub3QgZm91bmQ6IHNpdGVJZD0ke3NpdGVJZH1gKTtcbiAgfVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBRdWlja01vZHVsZSByZXF1ZXN0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG4vKipcbiAqIFNlYXJjaCBzaXRlIG1lbWJlcnNcbiAqIEBwYXJhbSBzaXRlSWQgLSBTaXRlIElEXG4gKiBAcGFyYW0gcXVlcnkgLSBTZWFyY2ggcXVlcnkgKHBhcnRpYWwgdXNlcm5hbWUpXG4gKiBAcmV0dXJucyBMaXN0IG9mIG1hdGNoaW5nIHVzZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1iZXJMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnTWVtYmVyTG9va3VwUU1vZHVsZScsIHNpdGVJZCwgcXVlcnkpO1xuICAgICAgY29uc3QgcGFyc2VkID0gcXVpY2tNb2R1bGVVc2VyUmVzcG9uc2VTY2hlbWEucGFyc2UoZGF0YSk7XG5cbiAgICAgIGlmIChwYXJzZWQudXNlcnMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZC51c2Vycy5tYXAoKHVzZXIpID0+ICh7XG4gICAgICAgIGlkOiB0eXBlb2YgdXNlci51c2VyX2lkID09PSAnc3RyaW5nJyA/IE51bWJlci5wYXJzZUludCh1c2VyLnVzZXJfaWQsIDEwKSA6IHVzZXIudXNlcl9pZCxcbiAgICAgICAgbmFtZTogdXNlci5uYW1lLFxuICAgICAgfSkpO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYE1lbWJlciBsb29rdXAgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFNlYXJjaCB1c2VycyBhY3Jvc3MgYWxsIFdpa2lkb3RcbiAqIEBwYXJhbSBzaXRlSWQgLSBTaXRlIElEIChhbnkgc2l0ZSBJRCB3b3JrcylcbiAqIEBwYXJhbSBxdWVyeSAtIFNlYXJjaCBxdWVyeSAocGFydGlhbCB1c2VybmFtZSlcbiAqIEByZXR1cm5zIExpc3Qgb2YgbWF0Y2hpbmcgdXNlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnVXNlckxvb2t1cFFNb2R1bGUnLCBzaXRlSWQsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHF1aWNrTW9kdWxlVXNlclJlc3BvbnNlU2NoZW1hLnBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAocGFyc2VkLnVzZXJzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQudXNlcnMubWFwKCh1c2VyKSA9PiAoe1xuICAgICAgICBpZDogdHlwZW9mIHVzZXIudXNlcl9pZCA9PT0gJ3N0cmluZycgPyBOdW1iZXIucGFyc2VJbnQodXNlci51c2VyX2lkLCAxMCkgOiB1c2VyLnVzZXJfaWQsXG4gICAgICAgIG5hbWU6IHVzZXIubmFtZSxcbiAgICAgIH0pKTtcbiAgICB9KSgpLFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBVc2VyIGxvb2t1cCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogU2VhcmNoIHBhZ2VzIHdpdGhpbiBzaXRlXG4gKiBAcGFyYW0gc2l0ZUlkIC0gU2l0ZSBJRFxuICogQHBhcmFtIHF1ZXJ5IC0gU2VhcmNoIHF1ZXJ5IChwYXJ0aWFsIHBhZ2UgbmFtZSlcbiAqIEByZXR1cm5zIExpc3Qgb2YgbWF0Y2hpbmcgcGFnZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZ2VMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DUGFnZVtdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnUGFnZUxvb2t1cFFNb2R1bGUnLCBzaXRlSWQsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHF1aWNrTW9kdWxlUGFnZVJlc3BvbnNlU2NoZW1hLnBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAocGFyc2VkLnBhZ2VzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQucGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICB0aXRsZTogcGFnZS50aXRsZSxcbiAgICAgICAgdW5peE5hbWU6IHBhZ2UudW5peF9uYW1lLFxuICAgICAgfSkpO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgbG9va3VwIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZSBBUEkgKG1haW50YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICogQGRlcHJlY2F0ZWQgVXNlIGluZGl2aWR1YWwgZnVuY3Rpb25zIChtZW1iZXJMb29rdXAsIHVzZXJMb29rdXAsIHBhZ2VMb29rdXApIGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IFF1aWNrTW9kdWxlOiB7XG4gIG1lbWJlckxvb2t1cDogdHlwZW9mIG1lbWJlckxvb2t1cDtcbiAgdXNlckxvb2t1cDogdHlwZW9mIHVzZXJMb29rdXA7XG4gIHBhZ2VMb29rdXA6IHR5cGVvZiBwYWdlTG9va3VwO1xufSA9IHtcbiAgbWVtYmVyTG9va3VwOiBtZW1iZXJMb29rdXAsXG4gIHVzZXJMb29rdXA6IHVzZXJMb29rdXAsXG4gIHBhZ2VMb29rdXA6IHBhZ2VMb29rdXAsXG59O1xuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdFN0YXR1c0Vycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi9zaXRlJztcblxuLyoqXG4gKiBTaXRlIG1lbWJlcnNoaXAgYXBwbGljYXRpb24gZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVBcHBsaWNhdGlvbkRhdGEge1xuICBzaXRlOiBTaXRlO1xuICB1c2VyOiBBYnN0cmFjdFVzZXI7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTaXRlIG1lbWJlcnNoaXAgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVBcHBsaWNhdGlvbiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBwdWJsaWMgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFNpdGVBcHBsaWNhdGlvbkRhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy51c2VyID0gZGF0YS51c2VyO1xuICAgIHRoaXMudGV4dCA9IGRhdGEudGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBlbmRpbmcgbWVtYmVyc2hpcCBhcHBsaWNhdGlvbnNcbiAgICogQHBhcmFtIHNpdGUgLSBUYXJnZXQgc2l0ZVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGwoc2l0ZTogU2l0ZSk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlQXBwbGljYXRpb25bXT4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBnZXQgYXBwbGljYXRpb25zJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7IG1vZHVsZU5hbWU6ICdtYW5hZ2VzaXRlL01hbmFnZVNpdGVNZW1iZXJzQXBwbGljYXRpb25zTW9kdWxlJyB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuXG4gICAgICAgIC8vIFBlcm1pc3Npb24gY2hlY2tcbiAgICAgICAgaWYgKGh0bWwuaW5jbHVkZXMoJ1dJS0lET1QucGFnZS5saXN0ZW5lcnMubG9naW5DbGljayhldmVudCknKSkge1xuICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignWW91IGFyZSBub3QgYWxsb3dlZCB0byBhY2Nlc3MgdGhpcyBwYWdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICBjb25zdCBhcHBsaWNhdGlvbnM6IFNpdGVBcHBsaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgY29uc3QgdXNlckVsZW1lbnRzID0gJCgnaDMgc3Bhbi5wcmludHVzZXInKS50b0FycmF5KCk7XG4gICAgICAgIGNvbnN0IHRleHRXcmFwcGVyRWxlbWVudHMgPSAkKCd0YWJsZScpLnRvQXJyYXkoKTtcblxuICAgICAgICBpZiAodXNlckVsZW1lbnRzLmxlbmd0aCAhPT0gdGV4dFdyYXBwZXJFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKFxuICAgICAgICAgICAgJ0xlbmd0aCBvZiB1c2VyX2VsZW1lbnRzIGFuZCB0ZXh0X3dyYXBwZXJfZWxlbWVudHMgYXJlIGRpZmZlcmVudCdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VyRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB1c2VyRWxlbWVudCA9IHVzZXJFbGVtZW50c1tpXTtcbiAgICAgICAgICBjb25zdCB0ZXh0V3JhcHBlckVsZW1lbnQgPSB0ZXh0V3JhcHBlckVsZW1lbnRzW2ldO1xuXG4gICAgICAgICAgaWYgKCF1c2VyRWxlbWVudCB8fCAhdGV4dFdyYXBwZXJFbGVtZW50KSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICQodXNlckVsZW1lbnQpKTtcbiAgICAgICAgICBjb25zdCB0ZXh0RWxlbWVudCA9ICQodGV4dFdyYXBwZXJFbGVtZW50KS5maW5kKCd0ZCcpLmVxKDEpO1xuICAgICAgICAgIGNvbnN0IHRleHQgPSB0ZXh0RWxlbWVudC50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgYXBwbGljYXRpb25zLnB1c2gobmV3IFNpdGVBcHBsaWNhdGlvbih7IHNpdGUsIHVzZXIsIHRleHQgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9ucztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgYXBwbGljYXRpb25zOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gcHJvY2VzcyBhcHBsaWNhdGlvblxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBwcml2YXRlIHByb2Nlc3MoYWN0aW9uOiAnYWNjZXB0JyB8ICdkZWNsaW5lJyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ01hbmFnZVNpdGVNZW1iZXJzaGlwQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnYWNjZXB0QXBwbGljYXRpb24nLFxuICAgICAgICAgICAgdXNlcl9pZDogdGhpcy51c2VyLmlkLFxuICAgICAgICAgICAgdGV4dDogYHlvdXIgYXBwbGljYXRpb24gaGFzIGJlZW4gJHthY3Rpb259ZWRgLFxuICAgICAgICAgICAgdHlwZTogYWN0aW9uLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdFN0YXR1c0Vycm9yICYmIGVycm9yLnN0YXR1c0NvZGUgPT09ICdub19hcHBsaWNhdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgQXBwbGljYXRpb24gbm90IGZvdW5kOiAke3RoaXMudXNlci5uYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgYXBwbGljYXRpb246ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdCBtZW1iZXJzaGlwIGFwcGxpY2F0aW9uXG4gICAqL1xuICBhY2NlcHQoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKCdhY2NlcHQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsaW5lIG1lbWJlcnNoaXAgYXBwbGljYXRpb25cbiAgICovXG4gIGRlY2xpbmUoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKCdkZWNsaW5lJyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZUFwcGxpY2F0aW9uKHVzZXI9JHt0aGlzLnVzZXIubmFtZX0sIHNpdGU9JHt0aGlzLnNpdGUudW5peE5hbWV9LCB0ZXh0PSR7dGhpcy50ZXh0fSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIFRhcmdldEVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4vc2l0ZSc7XG5cbi8qKlxuICogU2l0ZSBtZW1iZXIgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVNZW1iZXJEYXRhIHtcbiAgc2l0ZTogU2l0ZTtcbiAgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBqb2luZWRBdDogRGF0ZSB8IG51bGw7XG59XG5cbi8qKlxuICogU2l0ZSBtZW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVNZW1iZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IGpvaW5lZEF0OiBEYXRlIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTaXRlTWVtYmVyRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgdGhpcy5qb2luZWRBdCA9IGRhdGEuam9pbmVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgbWVtYmVyIGluZm9ybWF0aW9uIGZyb20gSFRNTFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2Uoc2l0ZTogU2l0ZSwgaHRtbDogc3RyaW5nKTogU2l0ZU1lbWJlcltdIHtcbiAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgIGNvbnN0IG1lbWJlcnM6IFNpdGVNZW1iZXJbXSA9IFtdO1xuXG4gICAgJCgndGFibGUgdHInKS5lYWNoKChfaSwgcm93KSA9PiB7XG4gICAgICBjb25zdCB0ZHMgPSAkKHJvdykuZmluZCgndGQnKTtcbiAgICAgIGNvbnN0IHVzZXJFbGVtID0gJCh0ZHNbMF0pLmZpbmQoJy5wcmludHVzZXInKTtcblxuICAgICAgaWYgKHVzZXJFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsIHVzZXJFbGVtKTtcblxuICAgICAgLy8gU2Vjb25kIHRkIGNvbnRhaW5zIGpvaW4gZGF0ZSBpZiBleGlzdHNcbiAgICAgIGxldCBqb2luZWRBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKHRkcy5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCBvZGF0ZUVsZW0gPSAkKHRkc1sxXSkuZmluZCgnLm9kYXRlJyk7XG4gICAgICAgIGlmIChvZGF0ZUVsZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGpvaW5lZEF0ID0gcGFyc2VPZGF0ZShvZGF0ZUVsZW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1lbWJlcnMucHVzaChuZXcgU2l0ZU1lbWJlcih7IHNpdGUsIHVzZXIsIGpvaW5lZEF0IH0pKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtZW1iZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIG1lbWJlciBsaXN0XG4gICAqIEBwYXJhbSBzaXRlIC0gVGFyZ2V0IHNpdGVcbiAgICogQHBhcmFtIGdyb3VwIC0gR3JvdXAgKFwiYWRtaW5zXCIsIFwibW9kZXJhdG9yc1wiLCBvciBlbXB0eSBzdHJpbmcgZm9yIGFsbCBtZW1iZXJzKVxuICAgKi9cbiAgc3RhdGljIGdldE1lbWJlcnMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBncm91cDogJ2FkbWlucycgfCAnbW9kZXJhdG9ycycgfCAnJyA9ICcnXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzOiBTaXRlTWVtYmVyW10gPSBbXTtcblxuICAgICAgICAvLyBHZXQgZmlyc3QgcGFnZVxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ21lbWJlcnNoaXAvTWVtYmVyc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmaXJzdFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gZmlyc3RSZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghZmlyc3RSZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEh0bWwgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgbWVtYmVycy5wdXNoKC4uLlNpdGVNZW1iZXIucGFyc2Uoc2l0ZSwgZmlyc3RIdG1sKSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnZXJcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0SHRtbCk7XG4gICAgICAgIGNvbnN0IHBhZ2VyTGlua3MgPSAkZmlyc3QoJ2Rpdi5wYWdlciBhJyk7XG4gICAgICAgIGlmIChwYWdlckxpbmtzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQYWdlVGV4dCA9ICRmaXJzdChwYWdlckxpbmtzW3BhZ2VyTGlua3MubGVuZ3RoIC0gMl0pXG4gICAgICAgICAgLnRleHQoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlVGV4dCwgMTApIHx8IDE7XG4gICAgICAgIGlmIChsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbWJlcnM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcmVtYWluaW5nIHBhZ2VzXG4gICAgICAgIGNvbnN0IGJvZGllcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgYm9kaWVzLnB1c2goe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ21lbWJlcnNoaXAvTWVtYmVyc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdHMgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBtZW1iZXJzLnB1c2goLi4uU2l0ZU1lbWJlci5wYXJzZShzaXRlLCBodG1sKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVtYmVyczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gY2hhbmdlIGdyb3VwXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHByaXZhdGUgY2hhbmdlR3JvdXAoXG4gICAgZXZlbnQ6ICd0b01vZGVyYXRvcnMnIHwgJ3JlbW92ZU1vZGVyYXRvcicgfCAndG9BZG1pbnMnIHwgJ3JlbW92ZUFkbWluJ1xuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdNYW5hZ2VTaXRlTWVtYmVyc2hpcEFjdGlvbicsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHVzZXJfaWQ6IHRoaXMudXNlci5pZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90U3RhdHVzRXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSAnbm90X2FscmVhZHknKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihgVXNlciBpcyBub3QgbW9kZXJhdG9yL2FkbWluOiAke3RoaXMudXNlci5uYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X2FkbWluJyB8fCBlcnJvci5zdGF0dXNDb2RlID09PSAnYWxyZWFkeV9tb2RlcmF0b3InKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5ICR7ZXJyb3Iuc3RhdHVzQ29kZS5yZXBsYWNlKCdhbHJlYWR5XycsICcnKX06ICR7dGhpcy51c2VyLm5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUYXJnZXRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNoYW5nZSBtZW1iZXIgZ3JvdXA6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb21vdGUgdG8gbW9kZXJhdG9yXG4gICAqL1xuICB0b01vZGVyYXRvcigpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUdyb3VwKCd0b01vZGVyYXRvcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgbW9kZXJhdG9yIHByaXZpbGVnZXNcbiAgICovXG4gIHJlbW92ZU1vZGVyYXRvcigpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUdyb3VwKCdyZW1vdmVNb2RlcmF0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9tb3RlIHRvIGFkbWluXG4gICAqL1xuICB0b0FkbWluKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3RvQWRtaW5zJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFkbWluIHByaXZpbGVnZXNcbiAgICovXG4gIHJlbW92ZUFkbWluKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3JlbW92ZUFkbWluJyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZU1lbWJlcih1c2VyPSR7dGhpcy51c2VyLm5hbWV9LCBzaXRlPSR7dGhpcy5zaXRlLnVuaXhOYW1lfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgeyBQYWdlLCBQYWdlQ29sbGVjdGlvbiwgU2VhcmNoUGFnZXNRdWVyeSB9IGZyb20gJy4uLy4uL3BhZ2UnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5cbi8qKlxuICogU2luZ2xlIHBhZ2Ugb3BlcmF0aW9ucyBhY2Nlc3NvclxuICovXG5leHBvcnQgY2xhc3MgUGFnZUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgYnkgVU5JWCBuYW1lXG4gICAqIEBwYXJhbSB1bml4TmFtZSAtIFBhZ2UgVU5JWCBuYW1lIChlLmcuLCAnc2NwLTE3MycpXG4gICAqIEByZXR1cm5zIFBhZ2UgKG51bGwgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZ2V0KHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBTZWFyY2hQYWdlc1F1ZXJ5KHsgZnVsbG5hbWU6IHVuaXhOYW1lIH0pO1xuICAgICAgICBjb25zdCB1c2VyUGFyc2VyID0gcGFyc2VVc2VyLmJpbmQobnVsbCwgdGhpcy5zaXRlLmNsaWVudCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uc2VhcmNoUGFnZXModGhpcy5zaXRlLCB1c2VyUGFyc2VyLCBxdWVyeSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWUubGVuZ3RoID4gMCA/IChyZXN1bHQudmFsdWVbMF0gPz8gbnVsbCkgOiBudWxsO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwYWdlXG4gICAqIEBwYXJhbSBmdWxsbmFtZSAtIFBhZ2UgZnVsbG5hbWUgKGUuZy4sICdzY3AtMTczJylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDcmVhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGNyZWF0ZShcbiAgICBmdWxsbmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgICAgc291cmNlPzogc3RyaW5nO1xuICAgICAgY29tbWVudD86IHN0cmluZztcbiAgICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmNyZWF0ZU9yRWRpdCh0aGlzLnNpdGUsIGZ1bGxuYW1lLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIHNvdXJjZTogb3B0aW9ucy5zb3VyY2UsXG4gICAgICBjb21tZW50OiBvcHRpb25zLmNvbW1lbnQsXG4gICAgICBmb3JjZUVkaXQ6IG9wdGlvbnMuZm9yY2VFZGl0LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IFBhZ2UgfTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDaGVlcmlvIH0gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlIH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgcExpbWl0IGZyb20gJ3AtbGltaXQnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTG9naW5SZXF1aXJlZEVycm9yLFxuICBOb0VsZW1lbnRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFRhcmdldEV4aXN0c0Vycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG59IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQU1DUmVxdWVzdEJvZHkgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuLi8uLi91dGlsL2h0dHAnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHsgUGFnZUZpbGVDb2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLWZpbGUnO1xuaW1wb3J0IHsgUGFnZU1ldGFDb2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLW1ldGEnO1xuaW1wb3J0IHsgUGFnZVJldmlzaW9uLCBQYWdlUmV2aXNpb25Db2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLXJldmlzaW9uJztcbmltcG9ydCB7IFBhZ2VTb3VyY2UgfSBmcm9tICcuL3BhZ2Utc291cmNlJztcbmltcG9ydCB7IFBhZ2VWb3RlLCBQYWdlVm90ZUNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2Utdm90ZSc7XG5pbXBvcnQgeyBERUZBVUxUX01PRFVMRV9CT0RZLCBERUZBVUxUX1BFUl9QQUdFLCBTZWFyY2hQYWdlc1F1ZXJ5IH0gZnJvbSAnLi9zZWFyY2gtcXVlcnknO1xuXG4vKipcbiAqIFNjaGVtYSBmb3IgTGlzdFBhZ2VzTW9kdWxlIHBhcnNlIHJlc3VsdFxuICogVXNlcyBab2QgZm9yIHR5cGUtc2FmZSB2YWxpZGF0aW9uIG9mIHBhcnNlIHJlc3VsdHNcbiAqL1xuY29uc3QgcGFnZVBhcmFtc1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgZnVsbG5hbWU6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIG5hbWU6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIGNhdGVnb3J5OiB6LnByZXByb2Nlc3MoKHYpID0+IHYgPz8gJycsIHouc3RyaW5nKCkpLFxuICB0aXRsZTogei5wcmVwcm9jZXNzKCh2KSA9PiB2ID8/ICcnLCB6LnN0cmluZygpKSxcbiAgY2hpbGRyZW5fY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIGNvbW1lbnRzX2NvdW50OiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICBzaXplOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmc6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHZvdGVzX2NvdW50OiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmdfcGVyY2VudDogei5jb2VyY2UubnVtYmVyKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICByZXZpc2lvbnNfY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHBhcmVudF9mdWxsbmFtZTogei5zdHJpbmcoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIHRhZ3M6IHouYXJyYXkoei5zdHJpbmcoKSkuZGVmYXVsdChbXSksXG4gIGNyZWF0ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNyZWF0ZWRfYXQ6IHouZGF0ZSgpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdXBkYXRlZF9ieTogei5jdXN0b208QWJzdHJhY3RVc2VyPigpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdXBkYXRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICBjb21tZW50ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNvbW1lbnRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxufSk7XG5cbi8qKlxuICogUGFnZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBmdWxsbmFtZTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGNoaWxkcmVuQ291bnQ6IG51bWJlcjtcbiAgY29tbWVudHNDb3VudDogbnVtYmVyO1xuICBzaXplOiBudW1iZXI7XG4gIHJhdGluZzogbnVtYmVyO1xuICB2b3Rlc0NvdW50OiBudW1iZXI7XG4gIHJhdGluZ1BlcmNlbnQ6IG51bWJlciB8IG51bGw7XG4gIHJldmlzaW9uc0NvdW50OiBudW1iZXI7XG4gIHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0YWdzOiBzdHJpbmdbXTtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHVwZGF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICBjb21tZW50ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgY29tbWVudGVkQXQ6IERhdGUgfCBudWxsO1xufVxuXG4vKipcbiAqIFdpa2lkb3QgcGFnZVxuICovXG5leHBvcnQgY2xhc3MgUGFnZSB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgZnVsbG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5OiBzdHJpbmc7XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgY2hpbGRyZW5Db3VudDogbnVtYmVyO1xuICBwdWJsaWMgY29tbWVudHNDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgc2l6ZTogbnVtYmVyO1xuICBwdWJsaWMgcmF0aW5nOiBudW1iZXI7XG4gIHB1YmxpYyB2b3Rlc0NvdW50OiBudW1iZXI7XG4gIHB1YmxpYyByYXRpbmdQZXJjZW50OiBudW1iZXIgfCBudWxsO1xuICBwdWJsaWMgcmV2aXNpb25zQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgdGFnczogc3RyaW5nW107XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyB1cGRhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyB1cGRhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyBjb21tZW50ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIGNvbW1lbnRlZEF0OiBEYXRlIHwgbnVsbDtcblxuICBwcml2YXRlIF9pZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3NvdXJjZTogUGFnZVNvdXJjZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9yZXZpc2lvbnM6IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfdm90ZXM6IFBhZ2VWb3RlQ29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuICBfZmlsZXM6IFBhZ2VGaWxlQ29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VEYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMuZnVsbG5hbWUgPSBkYXRhLmZ1bGxuYW1lO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLmNhdGVnb3J5ID0gZGF0YS5jYXRlZ29yeTtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLmNoaWxkcmVuQ291bnQgPSBkYXRhLmNoaWxkcmVuQ291bnQ7XG4gICAgdGhpcy5jb21tZW50c0NvdW50ID0gZGF0YS5jb21tZW50c0NvdW50O1xuICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICB0aGlzLnJhdGluZyA9IGRhdGEucmF0aW5nO1xuICAgIHRoaXMudm90ZXNDb3VudCA9IGRhdGEudm90ZXNDb3VudDtcbiAgICB0aGlzLnJhdGluZ1BlcmNlbnQgPSBkYXRhLnJhdGluZ1BlcmNlbnQ7XG4gICAgdGhpcy5yZXZpc2lvbnNDb3VudCA9IGRhdGEucmV2aXNpb25zQ291bnQ7XG4gICAgdGhpcy5wYXJlbnRGdWxsbmFtZSA9IGRhdGEucGFyZW50RnVsbG5hbWU7XG4gICAgdGhpcy50YWdzID0gZGF0YS50YWdzO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLnVwZGF0ZWRCeSA9IGRhdGEudXBkYXRlZEJ5O1xuICAgIHRoaXMudXBkYXRlZEF0ID0gZGF0YS51cGRhdGVkQXQ7XG4gICAgdGhpcy5jb21tZW50ZWRCeSA9IGRhdGEuY29tbWVudGVkQnk7XG4gICAgdGhpcy5jb21tZW50ZWRBdCA9IGRhdGEuY29tbWVudGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgVVJMXG4gICAqL1xuICBnZXRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zaXRlLmdldEJhc2VVcmwoKX0vJHt0aGlzLmZ1bGxuYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBwYWdlIElEIGhhcyBiZWVuIGFjcXVpcmVkXG4gICAqL1xuICBpc0lkQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lkICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYWdlIElEXG4gICAqL1xuICBnZXQgaWQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYWdlIElEXG4gICAqL1xuICBzZXQgaWQodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2UgY29kZVxuICAgKi9cbiAgZ2V0IHNvdXJjZSgpOiBQYWdlU291cmNlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc291cmNlIGNvZGVcbiAgICovXG4gIHNldCBzb3VyY2UodmFsdWU6IFBhZ2VTb3VyY2UgfCBudWxsKSB7XG4gICAgdGhpcy5fc291cmNlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJldmlzaW9uIGhpc3RvcnlcbiAgICovXG4gIGdldCByZXZpc2lvbnMoKTogUGFnZVJldmlzaW9uQ29sbGVjdGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZXZpc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHJldmlzaW9uIGhpc3RvcnlcbiAgICovXG4gIHNldCByZXZpc2lvbnModmFsdWU6IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsKSB7XG4gICAgdGhpcy5fcmV2aXNpb25zID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZvdGUgaW5mb3JtYXRpb25cbiAgICovXG4gIGdldCB2b3RlcygpOiBQYWdlVm90ZUNvbGxlY3Rpb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdm90ZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZvdGUgaW5mb3JtYXRpb25cbiAgICovXG4gIHNldCB2b3Rlcyh2YWx1ZTogUGFnZVZvdGVDb2xsZWN0aW9uIHwgbnVsbCkge1xuICAgIHRoaXMuX3ZvdGVzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxhdGVzdCByZXZpc2lvblxuICAgKi9cbiAgZ2V0IGxhdGVzdFJldmlzaW9uKCk6IFBhZ2VSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLl9yZXZpc2lvbnMgfHwgdGhpcy5fcmV2aXNpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5fcmV2aXNpb25zLnJlZHVjZSgobWF4LCByZXYpID0+IChyZXYucmV2Tm8gPiBtYXgucmV2Tm8gPyByZXYgOiBtYXgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgcGFnZSBJRCBpcyBhdmFpbGFibGUgKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIG5hbWUgKGZvciBlcnJvciBtZXNzYWdlKVxuICAgKiBAdGhyb3dzIElmIElEIGFjcXVpc2l0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUlkKG9wZXJhdGlvbjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIElEIGZvciAke29wZXJhdGlvbn06ICR7cmVzdWx0LmVycm9yLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgSUQgYWNxdWlzaXRpb24gZmFpbGVkIGZvciAke29wZXJhdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBwYWdlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGRlc3Ryb3koKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdkZWxldGlvbicpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdkZWxldGVQYWdlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2VJZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBwYWdlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGFnc1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBjb21taXRUYWdzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnc2F2aW5nIHRhZ3MnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhZ3M6IHRoaXMudGFncy5qb2luKCcgJyksXG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVUYWdzJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZUlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2F2ZSB0YWdzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYXJlbnQgcGFnZVxuICAgKiBAcGFyYW0gcGFyZW50RnVsbG5hbWUgLSBQYXJlbnQgcGFnZSBmdWxsbmFtZSAobnVsbCB0byByZW1vdmUpXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHNldFBhcmVudChwYXJlbnRGdWxsbmFtZTogc3RyaW5nIHwgbnVsbCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnc2V0dGluZyBwYXJlbnQnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2V0UGFyZW50UGFnZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBTdHJpbmcocGFnZUlkKSxcbiAgICAgICAgICAgIHBhcmVudE5hbWU6IHBhcmVudEZ1bGxuYW1lID8/ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJlbnRGdWxsbmFtZSA9IHBhcmVudEZ1bGxuYW1lO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNldCBwYXJlbnQ6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVm90ZSBvbiBwYWdlXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZvdGUgdmFsdWVcbiAgICogQHJldHVybnMgTmV3IHJhdGluZ1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICB2b3RlKHZhbHVlOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgndm90aW5nJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdSYXRlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAncmF0ZVBhZ2UnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZUlkLFxuICAgICAgICAgICAgcG9pbnRzOiB2YWx1ZSxcbiAgICAgICAgICAgIGZvcmNlOiAneWVzJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSB2b3RlIHJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdSYXRpbmcgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKHJlc3BvbnNlLnBvaW50cyA/PyB0aGlzLnJhdGluZyksIDEwKTtcbiAgICAgICAgdGhpcy5yYXRpbmcgPSBuZXdSYXRpbmc7XG4gICAgICAgIHJldHVybiBuZXdSYXRpbmc7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gdm90ZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgdm90ZVxuICAgKiBAcmV0dXJucyBOZXcgcmF0aW5nXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNhbmNlbFZvdGUoKTogV2lraWRvdFJlc3VsdEFzeW5jPG51bWJlcj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2NhbmNlbGluZyB2b3RlJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdSYXRlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnY2FuY2VsVm90ZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gY2FuY2VsIHZvdGUgcmVxdWVzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1JhdGluZyA9IE51bWJlci5wYXJzZUludChTdHJpbmcocmVzcG9uc2UucG9pbnRzID8/IHRoaXMucmF0aW5nKSwgMTApO1xuICAgICAgICB0aGlzLnJhdGluZyA9IG5ld1JhdGluZztcbiAgICAgICAgcmV0dXJuIG5ld1JhdGluZztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjYW5jZWwgdm90ZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0IHRoZSBwYWdlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRWRpdCBvcHRpb25zXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGVkaXQob3B0aW9uczoge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHNvdXJjZT86IHN0cmluZztcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gIH0pOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2VkaXRpbmcnKTtcblxuICAgICAgICAvLyBHZXQgY3VycmVudCBzb3VyY2UgKGlmIG5vdCBzcGVjaWZpZWQpXG4gICAgICAgIGxldCBjdXJyZW50U291cmNlID0gb3B0aW9ucy5zb3VyY2U7XG4gICAgICAgIGlmIChjdXJyZW50U291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1NvdXJjZSA9IHRoaXMuX3NvdXJjZTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdTb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSBleGlzdGluZ1NvdXJjZS53aWtpVGV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWNxdWlyZSBzb3VyY2VcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlU291cmNlcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgICBpZiAoc291cmNlUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgc291cmNlUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWZ0ZXIgYWNxdWlyZVBhZ2VTb3VyY2VzLCB0aGlzLl9zb3VyY2UgaXMgc2V0XG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gdGhpcy5fc291cmNlPy53aWtpVGV4dCA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5jcmVhdGVPckVkaXQodGhpcy5zaXRlLCB0aGlzLmZ1bGxuYW1lLCB7XG4gICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlID8/IHRoaXMudGl0bGUsXG4gICAgICAgICAgc291cmNlOiBjdXJyZW50U291cmNlLFxuICAgICAgICAgIGNvbW1lbnQ6IG9wdGlvbnMuY29tbWVudCA/PyAnJyxcbiAgICAgICAgICBmb3JjZUVkaXQ6IG9wdGlvbnMuZm9yY2VFZGl0ID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZWRpdCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5hbWUgdGhlIHBhZ2VcbiAgICogQHBhcmFtIG5ld0Z1bGxuYW1lIC0gTmV3IGZ1bGxuYW1lXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHJlbmFtZShuZXdGdWxsbmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdyZW5hbWluZycpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdyZW5hbWVQYWdlJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlSWQsXG4gICAgICAgICAgICBuZXdfbmFtZTogbmV3RnVsbG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgcHJvcGVydGllcyAodXNpbmcgT2JqZWN0LmFzc2lnbiBzaW5jZSByZWFkb25seSlcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7XG4gICAgICAgICAgZnVsbG5hbWU6IG5ld0Z1bGxuYW1lLFxuICAgICAgICAgIGNhdGVnb3J5OiBuZXdGdWxsbmFtZS5pbmNsdWRlcygnOicpID8gbmV3RnVsbG5hbWUuc3BsaXQoJzonKVswXSA6ICdfZGVmYXVsdCcsXG4gICAgICAgICAgbmFtZTogbmV3RnVsbG5hbWUuaW5jbHVkZXMoJzonKSA/IG5ld0Z1bGxuYW1lLnNwbGl0KCc6JylbMV0gOiBuZXdGdWxsbmFtZSxcbiAgICAgICAgfSk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gcmVuYW1lIHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIHBhZ2VcbiAgICovXG4gIGdldEZpbGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlRmlsZUNvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fZmlsZXMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fZmlsZXMpLCAoZSkgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihTdHJpbmcoZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3IFBhZ2VDb2xsZWN0aW9uKHRoaXMuc2l0ZSwgW3RoaXNdKS5nZXRQYWdlRmlsZXMoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIF9maWxlcyBzaG91bGQgYmUgc2V0IGJ5IGdldFBhZ2VGaWxlcygpXG4gICAgICAgIGlmICh0aGlzLl9maWxlcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX2ZpbGVzID0gbmV3IFBhZ2VGaWxlQ29sbGVjdGlvbih0aGlzLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBmaWxlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRpc2N1c3Npb24gdGhyZWFkIGZvciB0aGUgcGFnZVxuICAgKi9cbiAgZ2V0RGlzY3Vzc2lvbigpOiBXaWtpZG90UmVzdWx0QXN5bmM8aW1wb3J0KCcuLi9mb3J1bScpLkZvcnVtVGhyZWFkIHwgbnVsbD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2dldHRpbmcgZGlzY3Vzc2lvbicpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1Db21tZW50c0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAvLyBFeHRyYWN0IHRocmVhZCBJRFxuICAgICAgICBjb25zdCBtYXRjaCA9IGh0bWwubWF0Y2goXG4gICAgICAgICAgL1dJS0lET1RcXC5tb2R1bGVzXFwuRm9ydW1WaWV3VGhyZWFkTW9kdWxlXFwudmFyc1xcLnRocmVhZElkXFxzKj1cXHMqKFxcZCspL1xuICAgICAgICApO1xuICAgICAgICBpZiAoIW1hdGNoPy5bMV0pIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRocmVhZElkID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG5cbiAgICAgICAgLy8gR2V0IEZvcnVtVGhyZWFkXG4gICAgICAgIGNvbnN0IHsgRm9ydW1UaHJlYWQgfSA9IGF3YWl0IGltcG9ydCgnLi4vZm9ydW0nKTtcbiAgICAgICAgY29uc3QgdGhyZWFkUmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWQuZ2V0RnJvbUlkKHRoaXMuc2l0ZSwgdGhyZWFkSWQpO1xuICAgICAgICBpZiAodGhyZWFkUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyB0aHJlYWRSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocmVhZFJlc3VsdC52YWx1ZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgZGlzY3Vzc2lvbjogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2YgbWV0YSB0YWdzIGZvciB0aGUgcGFnZVxuICAgKiBAcmV0dXJucyBNZXRhIHRhZyBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRNZXRhcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZU1ldGFDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJZCgnZ2V0dGluZyBtZXRhcycpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlTWV0YUNvbGxlY3Rpb24uYWNxdWlyZSh0aGlzKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IG1ldGFzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIG1ldGEgdGFnXG4gICAqIEBwYXJhbSBuYW1lIC0gTWV0YSB0YWcgbmFtZVxuICAgKiBAcGFyYW0gY29udGVudCAtIE1ldGEgdGFnIHZhbHVlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHNldE1ldGEobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSWQoJ3NldHRpbmcgbWV0YScpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlTWV0YUNvbGxlY3Rpb24uc2V0TWV0YSh0aGlzLCBuYW1lLCBjb250ZW50KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2V0IG1ldGE6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgbWV0YSB0YWdcbiAgICogQHBhcmFtIG5hbWUgLSBNZXRhIHRhZyBuYW1lXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGRlbGV0ZU1ldGEobmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUlkKCdkZWxldGluZyBtZXRhJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VNZXRhQ29sbGVjdGlvbi5kZWxldGVNZXRhKHRoaXMsIG5hbWUpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBkZWxldGUgbWV0YTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBzb3VyY2UgKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcmV0dXJucyBQYWdlIHNvdXJjZVxuICAgKi9cbiAgZ2V0U291cmNlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlU291cmNlPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc291cmNlUmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VTb3VyY2VzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAoc291cmNlUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHNvdXJjZVJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignQ2Fubm90IGZpbmQgcGFnZSBzb3VyY2UnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBzb3VyY2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBoaXN0b3J5IChhdXRvLWFjcXVpcmUgaWYgbm90IHlldCBhY3F1aXJlZClcbiAgICogQHJldHVybnMgUmV2aXNpb24gY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0UmV2aXNpb25zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlUmV2aXNpb25Db2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3JldmlzaW9ucyA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmV2UmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VSZXZpc2lvbnModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgIGlmIChyZXZSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgcmV2UmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcmV2aXNpb25zID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdDYW5ub3QgZmluZCBwYWdlIHJldmlzaW9ucycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXZpc2lvbnM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZvdGUgaW5mb3JtYXRpb24gKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcmV0dXJucyBWb3RlIGNvbGxlY3Rpb25cbiAgICovXG4gIGdldFZvdGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlVm90ZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fdm90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUlkcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHZvdGVzUmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VWb3Rlcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHZvdGVzUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHZvdGVzUmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdm90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oJ0Nhbm5vdCBmaW5kIHBhZ2Ugdm90ZXMnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdm90ZXM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHZvdGVzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlKGZ1bGxuYW1lPSR7dGhpcy5mdWxsbmFtZX0sIHRpdGxlPSR7dGhpcy50aXRsZX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxQYWdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUsIHBhZ2VzPzogUGFnZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICAgIGlmIChwYWdlcykge1xuICAgICAgdGhpcy5wdXNoKC4uLnBhZ2VzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBmdWxsbmFtZVxuICAgKiBAcGFyYW0gZnVsbG5hbWUgLSBQYWdlIGZ1bGxuYW1lXG4gICAqIEByZXR1cm5zIFBhZ2UgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlGdWxsbmFtZShmdWxsbmFtZTogc3RyaW5nKTogUGFnZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocGFnZSkgPT4gcGFnZS5mdWxsbmFtZSA9PT0gZnVsbG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgcGFnZSBJRHMgaW4gYnVsa1xuICAgKi9cbiAgZ2V0UGFnZUlkcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VJZHModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIHBhZ2Ugc291cmNlcyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlU291cmNlcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VTb3VyY2VzKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBwYWdlIHJldmlzaW9ucyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlUmV2aXNpb25zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVJldmlzaW9ucyh0aGlzLnNpdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgcGFnZSB2b3RlcyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlVm90ZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlVm90ZXModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIHBhZ2UgZmlsZXMgaW4gYnVsa1xuICAgKi9cbiAgZ2V0UGFnZUZpbGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUZpbGVzKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFjcXVpcmUgcGFnZSBmaWxlcyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VGaWxlcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZmlsZXMvUGFnZUZpbGVzTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IFBhZ2VGaWxlQ29sbGVjdGlvbi5fcGFyc2VGcm9tSHRtbChwYWdlLCAkKTtcbiAgICAgICAgICBwYWdlLl9maWxlcyA9IG5ldyBQYWdlRmlsZUNvbGxlY3Rpb24ocGFnZSwgZmlsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIGZpbGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhY3F1aXJlIHBhZ2UgSURzIGluIGJ1bGtcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZUlkcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlLmlzSWRBY3F1aXJlZCgpKTtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMaW1pdCBjb25jdXJyZW50IGNvbm5lY3Rpb25zICh1c2luZyBzYW1lIHNlbWFwaG9yZUxpbWl0IGFzIEFNQ0NsaWVudClcbiAgICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQoc2l0ZS5jbGllbnQuYW1jQ2xpZW50LmNvbmZpZy5zZW1hcGhvcmVMaW1pdCk7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHNpdGUuY2xpZW50LmFtY0NsaWVudC5jb25maWc7XG5cbiAgICAgICAgLy8gQWNjZXNzIHdpdGggbm9yZW5kZXIsIG5vcmVkaXJlY3QgKHdpdGggcmV0cnkpXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcCgocGFnZSkgPT5cbiAgICAgICAgICAgIGxpbWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdXJsID0gYCR7cGFnZS5nZXRVcmwoKX0vbm9yZW5kZXIvdHJ1ZS9ub3JlZGlyZWN0L3RydWVgO1xuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoV2l0aFJldHJ5KHVybCwgY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogc2l0ZS5jbGllbnQuYW1jQ2xpZW50LmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBwYWdlLCByZXNwb25zZSB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCB7IHBhZ2UsIHJlc3BvbnNlIH0gb2YgcmVzcG9uc2VzKSB7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLnBhZ2VJZFxccyo9XFxzKihcXGQrKTsvKTtcbiAgICAgICAgICBpZiAoIW1hdGNoPy5bMV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgQ2Fubm90IGZpbmQgcGFnZSBpZDogJHtwYWdlLmZ1bGxuYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYWdlLmlkID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBhZ2UgSURzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwYWdlIHNvdXJjZXMgaW4gYnVsa1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQYWdlU291cmNlcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2Uuc291cmNlID09PSBudWxsICYmIHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAndmlld3NvdXJjZS9WaWV3U291cmNlTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpLnJlcGxhY2UoLyZuYnNwOy9nLCAnICcpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG4gICAgICAgICAgY29uc3Qgc291cmNlRWxlbWVudCA9ICQoJ2Rpdi5wYWdlLXNvdXJjZScpO1xuICAgICAgICAgIGlmIChzb3VyY2VFbGVtZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBDYW5ub3QgZmluZCBzb3VyY2UgZWxlbWVudCBmb3IgcGFnZTogJHtwYWdlLmZ1bGxuYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB3aWtpVGV4dCA9IHNvdXJjZUVsZW1lbnQudGV4dCgpLnRyaW0oKS5yZXBsYWNlKC9eXFx0LywgJycpO1xuICAgICAgICAgIHBhZ2Uuc291cmNlID0gbmV3IFBhZ2VTb3VyY2UoeyBwYWdlLCB3aWtpVGV4dCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBzb3VyY2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwYWdlIHJldmlzaW9ucyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VSZXZpc2lvbnMoc2l0ZTogU2l0ZSwgcGFnZXM6IFBhZ2VbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFBhZ2VzID0gcGFnZXMuZmlsdGVyKChwYWdlKSA9PiBwYWdlLnJldmlzaW9ucyA9PT0gbnVsbCAmJiBwYWdlLmlkICE9PSBudWxsKTtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3RXaXRoUmV0cnkoXG4gICAgICAgICAgdGFyZ2V0UGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2hpc3RvcnkvUGFnZVJldmlzaW9uTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlLmlkLFxuICAgICAgICAgICAgb3B0aW9uczogeyBhbGw6IHRydWUgfSxcbiAgICAgICAgICAgIHBlcnBhZ2U6IDEwMDAwMDAwMCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSByZXZpc2lvbnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBjb25zdCByZXZpc2lvbnM6IFBhZ2VSZXZpc2lvbltdID0gW107XG5cbiAgICAgICAgICAkKCd0YWJsZS5wYWdlLWhpc3RvcnkgdHJbaWRePVwicmV2aXNpb24tcm93LVwiXScpLmVhY2goKF9qLCByZXZFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkcmV2ID0gJChyZXZFbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHJldklkQXR0ciA9ICRyZXYuYXR0cignaWQnKTtcbiAgICAgICAgICAgIGlmICghcmV2SWRBdHRyKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHJldklkID0gTnVtYmVyLnBhcnNlSW50KHJldklkQXR0ci5yZXBsYWNlKCdyZXZpc2lvbi1yb3ctJywgJycpLCAxMCk7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldklkKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCAkdGRzID0gJHJldi5maW5kKCd0ZCcpO1xuICAgICAgICAgICAgaWYgKCR0ZHMubGVuZ3RoIDwgNykgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCByZXZOb1RleHQgPSAkdGRzLmVxKDApLnRleHQoKS50cmltKCkucmVwbGFjZSgvXFwuJC8sICcnKTtcbiAgICAgICAgICAgIGNvbnN0IHJldk5vID0gTnVtYmVyLnBhcnNlSW50KHJldk5vVGV4dCwgMTApO1xuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihyZXZObykpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgJGNyZWF0ZWRCeUVsZW0gPSAkdGRzLmVxKDQpLmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgICBpZiAoJGNyZWF0ZWRCeUVsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQnkgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICRjcmVhdGVkQnlFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuXG4gICAgICAgICAgICBjb25zdCAkY3JlYXRlZEF0RWxlbSA9ICR0ZHMuZXEoNSkuZmluZCgnc3Bhbi5vZGF0ZScpO1xuICAgICAgICAgICAgaWYgKCRjcmVhdGVkQXRFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID0gcGFyc2VPZGF0ZSgkY3JlYXRlZEF0RWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gJHRkcy5lcSg2KS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgICByZXZpc2lvbnMucHVzaChcbiAgICAgICAgICAgICAgbmV3IFBhZ2VSZXZpc2lvbih7XG4gICAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgICBpZDogcmV2SWQsXG4gICAgICAgICAgICAgICAgcmV2Tm8sXG4gICAgICAgICAgICAgICAgY3JlYXRlZEJ5LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBjb21tZW50LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHBhZ2UucmV2aXNpb25zID0gbmV3IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24ocGFnZSwgcmV2aXNpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSByZXZpc2lvbnM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFjcXVpcmUgcGFnZSB2b3RlcyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VWb3RlcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2Uudm90ZXMgPT09IG51bGwgJiYgcGFnZS5pZCAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0V2l0aFJldHJ5KFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdwYWdlcmF0ZS9XaG9SYXRlZFBhZ2VNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlLmlkLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlIHZvdGVzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0UGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwYWdlID0gdGFyZ2V0UGFnZXNbaV07XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgaWYgKCFwYWdlIHx8ICFyZXNwb25zZSkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgICBjb25zdCAkdXNlckVsZW1zID0gJCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICBjb25zdCAkdmFsdWVFbGVtcyA9ICQoXCJzcGFuW3N0eWxlXj0nY29sb3InXVwiKTtcblxuICAgICAgICAgIGlmICgkdXNlckVsZW1zLmxlbmd0aCAhPT0gJHZhbHVlRWxlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdVc2VyIGFuZCB2YWx1ZSBjb3VudCBtaXNtYXRjaCBpbiB2b3RlcycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZvdGVzOiBQYWdlVm90ZVtdID0gW107XG4gICAgICAgICAgJHVzZXJFbGVtcy5lYWNoKChqLCB1c2VyRWxlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJHVzZXIgPSAkKHVzZXJFbGVtKTtcbiAgICAgICAgICAgIGNvbnN0ICR2YWx1ZSA9ICR2YWx1ZUVsZW1zLmVxKGopO1xuXG4gICAgICAgICAgICBjb25zdCB1c2VyID0gcGFyc2VVc2VyKHNpdGUuY2xpZW50LCAkdXNlciBhcyBDaGVlcmlvPEFueU5vZGU+KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlVGV4dCA9ICR2YWx1ZS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgICBsZXQgdmFsdWU6IG51bWJlcjtcbiAgICAgICAgICAgIGlmICh2YWx1ZVRleHQgPT09ICcrJykge1xuICAgICAgICAgICAgICB2YWx1ZSA9IDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlVGV4dCA9PT0gJy0nKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlci5wYXJzZUludCh2YWx1ZVRleHQsIDEwKSB8fCAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2b3Rlcy5wdXNoKG5ldyBQYWdlVm90ZSh7IHBhZ2UsIHVzZXIsIHZhbHVlIH0pKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHBhZ2Uudm90ZXMgPSBuZXcgUGFnZVZvdGVDb2xsZWN0aW9uKHBhZ2UsIHZvdGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSB2b3RlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBMaXN0UGFnZXNNb2R1bGUgcmVzcG9uc2VcbiAgICovXG4gIHN0YXRpYyBwYXJzZShcbiAgICBzaXRlOiBTaXRlLFxuICAgIGh0bWxCb2R5OiBjaGVlcmlvLkNoZWVyaW9BUEksXG4gICAgX3BhcnNlVXNlcjogKGVsZW1lbnQ6IGNoZWVyaW8uQ2hlZXJpbzxBbnlOb2RlPikgPT4gQWJzdHJhY3RVc2VyXG4gICk6IFBhZ2VDb2xsZWN0aW9uIHtcbiAgICBjb25zdCBwYWdlczogUGFnZVtdID0gW107XG5cbiAgICBodG1sQm9keSgnZGl2LnBhZ2UnKS5lYWNoKChfaSwgcGFnZUVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0ICRwYWdlID0gaHRtbEJvZHkocGFnZUVsZW1lbnQpO1xuICAgICAgY29uc3QgcGFnZVBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIDUtc3RhciByYXRpbmdcbiAgICAgIGNvbnN0IGlzNVN0YXJSYXRpbmcgPSAkcGFnZS5maW5kKCdzcGFuLnJhdGluZyBzcGFuLnBhZ2UtcmF0ZS1saXN0LXBhZ2VzLXN0YXJ0JykubGVuZ3RoID4gMDtcblxuICAgICAgLy8gR2V0IGVhY2ggdmFsdWVcbiAgICAgICRwYWdlLmZpbmQoJ3NwYW4uc2V0JykuZWFjaCgoX2osIHNldEVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgJHNldCA9IGh0bWxCb2R5KHNldEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBrZXlFbGVtZW50ID0gJHNldC5maW5kKCdzcGFuLm5hbWUnKTtcbiAgICAgICAgaWYgKGtleUVsZW1lbnQubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgbGV0IGtleSA9IGtleUVsZW1lbnQudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsdWVFbGVtZW50ID0gJHNldC5maW5kKCdzcGFuLnZhbHVlJyk7XG5cbiAgICAgICAgbGV0IHZhbHVlOiB1bmtub3duID0gbnVsbDtcblxuICAgICAgICBpZiAodmFsdWVFbGVtZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChbJ2NyZWF0ZWRfYXQnLCAndXBkYXRlZF9hdCcsICdjb21tZW50ZWRfYXQnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3Qgb2RhdGVFbGVtZW50ID0gdmFsdWVFbGVtZW50LmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgICAgICBpZiAob2RhdGVFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IG9kYXRlRWxlbWVudC5hdHRyKCdjbGFzcycpPy5tYXRjaCgvdGltZV8oXFxkKykvKT8uWzFdO1xuICAgICAgICAgICAgdmFsdWUgPSB0aW1lc3RhbXAgPyBuZXcgRGF0ZShOdW1iZXIucGFyc2VJbnQodGltZXN0YW1wLCAxMCkgKiAxMDAwKSA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIFsnY3JlYXRlZF9ieV9saW5rZWQnLCAndXBkYXRlZF9ieV9saW5rZWQnLCAnY29tbWVudGVkX2J5X2xpbmtlZCddLmluY2x1ZGVzKGtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcHJpbnR1c2VyRWxlbWVudCA9IHZhbHVlRWxlbWVudC5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGlmIChwcmludHVzZXJFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gX3BhcnNlVXNlcihwcmludHVzZXJFbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoWyd0YWdzJywgJ190YWdzJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVFbGVtZW50LnRleHQoKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgfSBlbHNlIGlmIChbJ3JhdGluZ192b3RlcycsICdjb21tZW50cycsICdzaXplJywgJ3JldmlzaW9ucyddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IE51bWJlci5wYXJzZUludCh2YWx1ZUVsZW1lbnQudGV4dCgpLnRyaW0oKSwgMTApIHx8IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmF0aW5nJykge1xuICAgICAgICAgIGNvbnN0IHJhdGluZ1RleHQgPSB2YWx1ZUVsZW1lbnQudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICB2YWx1ZSA9IGlzNVN0YXJSYXRpbmdcbiAgICAgICAgICAgID8gTnVtYmVyLnBhcnNlRmxvYXQocmF0aW5nVGV4dCkgfHwgMFxuICAgICAgICAgICAgOiBOdW1iZXIucGFyc2VJbnQocmF0aW5nVGV4dCwgMTApIHx8IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmF0aW5nX3BlcmNlbnQnKSB7XG4gICAgICAgICAgaWYgKGlzNVN0YXJSYXRpbmcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gKE51bWJlci5wYXJzZUZsb2F0KHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpKSB8fCAwKSAvIDEwMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2V5IGNvbnZlcnNpb25cbiAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnX2xpbmtlZCcpKSB7XG4gICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoJ19saW5rZWQnLCAnJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoWydjb21tZW50cycsICdjaGlsZHJlbicsICdyZXZpc2lvbnMnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAga2V5ID0gYCR7a2V5fV9jb3VudGA7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmF0aW5nX3ZvdGVzJykge1xuICAgICAgICAgIGtleSA9ICd2b3Rlc19jb3VudCc7XG4gICAgICAgIH1cblxuICAgICAgICBwYWdlUGFyYW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBNZXJnZSB0YWdzXG4gICAgICBjb25zdCB0YWdzID0gQXJyYXkuaXNBcnJheShwYWdlUGFyYW1zLnRhZ3MpID8gcGFnZVBhcmFtcy50YWdzIDogW107XG4gICAgICBjb25zdCBoaWRkZW5UYWdzID0gQXJyYXkuaXNBcnJheShwYWdlUGFyYW1zLl90YWdzKSA/IHBhZ2VQYXJhbXMuX3RhZ3MgOiBbXTtcbiAgICAgIHBhZ2VQYXJhbXMudGFncyA9IFsuLi50YWdzLCAuLi5oaWRkZW5UYWdzXTtcblxuICAgICAgLy8gVmFsaWRhdGUgd2l0aCBab2Qgc2NoZW1hIGFuZCBhcHBseSBkZWZhdWx0c1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFnZVBhcmFtc1NjaGVtYS5wYXJzZShwYWdlUGFyYW1zKTtcblxuICAgICAgLy8gQ3JlYXRlIFBhZ2Ugb2JqZWN0XG4gICAgICBwYWdlcy5wdXNoKFxuICAgICAgICBuZXcgUGFnZSh7XG4gICAgICAgICAgc2l0ZSxcbiAgICAgICAgICBmdWxsbmFtZTogcGFyc2VkLmZ1bGxuYW1lLFxuICAgICAgICAgIG5hbWU6IHBhcnNlZC5uYW1lLFxuICAgICAgICAgIGNhdGVnb3J5OiBwYXJzZWQuY2F0ZWdvcnksXG4gICAgICAgICAgdGl0bGU6IHBhcnNlZC50aXRsZSxcbiAgICAgICAgICBjaGlsZHJlbkNvdW50OiBwYXJzZWQuY2hpbGRyZW5fY291bnQsXG4gICAgICAgICAgY29tbWVudHNDb3VudDogcGFyc2VkLmNvbW1lbnRzX2NvdW50LFxuICAgICAgICAgIHNpemU6IHBhcnNlZC5zaXplLFxuICAgICAgICAgIHJhdGluZzogcGFyc2VkLnJhdGluZyxcbiAgICAgICAgICB2b3Rlc0NvdW50OiBwYXJzZWQudm90ZXNfY291bnQsXG4gICAgICAgICAgcmF0aW5nUGVyY2VudDogcGFyc2VkLnJhdGluZ19wZXJjZW50LFxuICAgICAgICAgIHJldmlzaW9uc0NvdW50OiBwYXJzZWQucmV2aXNpb25zX2NvdW50LFxuICAgICAgICAgIHBhcmVudEZ1bGxuYW1lOiBwYXJzZWQucGFyZW50X2Z1bGxuYW1lLFxuICAgICAgICAgIHRhZ3M6IHBhcnNlZC50YWdzLFxuICAgICAgICAgIGNyZWF0ZWRCeTogcGFyc2VkLmNyZWF0ZWRfYnksXG4gICAgICAgICAgY3JlYXRlZEF0OiBwYXJzZWQuY3JlYXRlZF9hdCA/PyBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVwZGF0ZWRCeTogcGFyc2VkLnVwZGF0ZWRfYnksXG4gICAgICAgICAgdXBkYXRlZEF0OiBwYXJzZWQudXBkYXRlZF9hdCA/PyBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGNvbW1lbnRlZEJ5OiBwYXJzZWQuY29tbWVudGVkX2J5LFxuICAgICAgICAgIGNvbW1lbnRlZEF0OiBwYXJzZWQuY29tbWVudGVkX2F0LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBwYWdlc1xuICAgKi9cbiAgc3RhdGljIHNlYXJjaFBhZ2VzKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgcGFyc2VVc2VyOiAoZWxlbWVudDogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KSA9PiBBYnN0cmFjdFVzZXIsXG4gICAgcXVlcnk6IFNlYXJjaFBhZ2VzUXVlcnkgfCBudWxsID0gbnVsbFxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxID0gcXVlcnkgPz8gbmV3IFNlYXJjaFBhZ2VzUXVlcnkoKTtcbiAgICAgICAgY29uc3QgcXVlcnlEaWN0ID0gcS5hc0RpY3QoKTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSBtb2R1bGUgYm9keVxuICAgICAgICBjb25zdCBtb2R1bGVCb2R5ID0gYFtbZGl2IGNsYXNzPVwicGFnZVwiXV1cXG4ke0RFRkFVTFRfTU9EVUxFX0JPRFkubWFwKFxuICAgICAgICAgIChrZXkpID0+XG4gICAgICAgICAgICBgW1tzcGFuIGNsYXNzPVwic2V0ICR7a2V5fVwiXV1bW3NwYW4gY2xhc3M9XCJuYW1lXCJdXSAke2tleX0gW1svc3Bhbl1dW1tzcGFuIGNsYXNzPVwidmFsdWVcIl1dICUlJHtrZXl9JSUgW1svc3Bhbl1dW1svc3Bhbl1dYFxuICAgICAgICApLmpvaW4oJycpfVxcbltbL2Rpdl1dYDtcblxuICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAuLi5xdWVyeURpY3QsXG4gICAgICAgICAgbW9kdWxlTmFtZTogJ2xpc3QvTGlzdFBhZ2VzTW9kdWxlJyxcbiAgICAgICAgICBtb2R1bGVfYm9keTogbW9kdWxlQm9keSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW3JlcXVlc3RCb2R5XSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbm90X29rJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignRmFpbGVkIHRvIGdldCBwYWdlcywgdGFyZ2V0IHNpdGUgbWF5IGJlIHByaXZhdGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhmaXJzdFJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgIGxldCB0b3RhbCA9IDE7XG4gICAgICAgIGNvbnN0IGh0bWxCb2RpZXM6IGNoZWVyaW8uQ2hlZXJpb0FQSVtdID0gWyRmaXJzdF07XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCBwYWdlckVsZW1lbnQgPSAkZmlyc3QoJ2Rpdi5wYWdlcicpO1xuICAgICAgICBpZiAocGFnZXJFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBsYXN0UGFnZXJFbGVtZW50cyA9ICRmaXJzdCgnZGl2LnBhZ2VyIHNwYW4udGFyZ2V0Jyk7XG4gICAgICAgICAgaWYgKGxhc3RQYWdlckVsZW1lbnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBzZWNvbmRMYXN0UGFnZXIgPSAkZmlyc3QobGFzdFBhZ2VyRWxlbWVudHNbbGFzdFBhZ2VyRWxlbWVudHMubGVuZ3RoIC0gMl0pO1xuICAgICAgICAgICAgY29uc3QgbGFzdFBhZ2VyTGluayA9IHNlY29uZExhc3RQYWdlci5maW5kKCdhJyk7XG4gICAgICAgICAgICBpZiAobGFzdFBhZ2VyTGluay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRvdGFsID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlckxpbmsudGV4dCgpLnRyaW0oKSwgMTApIHx8IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGFkZGl0aW9uYWwgcGFnZXNcbiAgICAgICAgaWYgKHRvdGFsID4gMSkge1xuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxCb2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10gPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRvdGFsOyBpKyspIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxCb2RpZXMucHVzaCh7XG4gICAgICAgICAgICAgIC4uLnF1ZXJ5RGljdCxcbiAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2xpc3QvTGlzdFBhZ2VzTW9kdWxlJyxcbiAgICAgICAgICAgICAgbW9kdWxlX2JvZHk6IG1vZHVsZUJvZHksXG4gICAgICAgICAgICAgIG9mZnNldDogaSAqIChxLnBlclBhZ2UgPz8gREVGQVVMVF9QRVJfUEFHRSksXG4gICAgICAgICAgICB9IGFzIEFNQ1JlcXVlc3RCb2R5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChhZGRpdGlvbmFsQm9kaWVzKTtcbiAgICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdHMuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgYWRkaXRpb25hbFJlc3VsdHMuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBhZGRpdGlvbmFsUmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcmVzcEJvZHkgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgICAgaHRtbEJvZGllcy5wdXNoKGNoZWVyaW8ubG9hZChyZXNwQm9keSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlXG4gICAgICAgIGNvbnN0IHBhZ2VzOiBQYWdlW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCAkaHRtbCBvZiBodG1sQm9kaWVzKSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkID0gUGFnZUNvbGxlY3Rpb24ucGFyc2Uoc2l0ZSwgJGh0bWwsIHBhcnNlVXNlcik7XG4gICAgICAgICAgcGFnZXMucHVzaCguLi5wYXJzZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZWFyY2ggcGFnZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvciBlZGl0IGEgcGFnZVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZU9yRWRpdChcbiAgICBzaXRlOiBTaXRlLFxuICAgIGZ1bGxuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczoge1xuICAgICAgcGFnZUlkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgICAgc291cmNlPzogc3RyaW5nO1xuICAgICAgY29tbWVudD86IHN0cmluZztcbiAgICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gICAgICByYWlzZU9uRXhpc3RzPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IHNpdGUuY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gY3JlYXRlL2VkaXQgcGFnZScpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBwYWdlSWQgPSBudWxsLFxuICAgICAgICAgIHRpdGxlID0gJycsXG4gICAgICAgICAgc291cmNlID0gJycsXG4gICAgICAgICAgY29tbWVudCA9ICcnLFxuICAgICAgICAgIGZvcmNlRWRpdCA9IGZhbHNlLFxuICAgICAgICAgIHJhaXNlT25FeGlzdHMgPSBmYWxzZSxcbiAgICAgICAgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgLy8gQWNxdWlyZSBwYWdlIGxvY2tcbiAgICAgICAgY29uc3QgbG9ja1JlcXVlc3RCb2R5OiBBTUNSZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICBtb2RlOiAncGFnZScsXG4gICAgICAgICAgd2lraV9wYWdlOiBmdWxsbmFtZSxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnZWRpdC9QYWdlRWRpdE1vZHVsZScsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChmb3JjZUVkaXQpIHtcbiAgICAgICAgICBsb2NrUmVxdWVzdEJvZHkuZm9yY2VfbG9jayA9ICd5ZXMnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9ja1Jlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbbG9ja1JlcXVlc3RCb2R5XSk7XG4gICAgICAgIGlmIChsb2NrUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBsb2NrUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9ja1Jlc3BvbnNlID0gbG9ja1Jlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKGxvY2tSZXNwb25zZT8ubG9ja2VkIHx8IGxvY2tSZXNwb25zZT8ub3RoZXJfbG9ja3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBQYWdlICR7ZnVsbG5hbWV9IGlzIGxvY2tlZCBvciBvdGhlciBsb2NrcyBleGlzdGApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNFeGlzdCA9ICdwYWdlX3JldmlzaW9uX2lkJyBpbiAobG9ja1Jlc3BvbnNlID8/IHt9KTtcblxuICAgICAgICBpZiAocmFpc2VPbkV4aXN0cyAmJiBpc0V4aXN0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhcmdldEV4aXN0c0Vycm9yKGBQYWdlICR7ZnVsbG5hbWV9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNFeGlzdCAmJiBwYWdlSWQgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdwYWdlX2lkIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gZWRpdGluZyBleGlzdGluZyBwYWdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrSWQgPSBTdHJpbmcobG9ja1Jlc3BvbnNlPy5sb2NrX2lkID8/ICcnKTtcbiAgICAgICAgY29uc3QgbG9ja1NlY3JldCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LmxvY2tfc2VjcmV0ID8/ICcnKTtcbiAgICAgICAgY29uc3QgcGFnZVJldmlzaW9uSWQgPSBTdHJpbmcobG9ja1Jlc3BvbnNlPy5wYWdlX3JldmlzaW9uX2lkID8/ICcnKTtcblxuICAgICAgICAvLyBTYXZlIHBhZ2VcbiAgICAgICAgY29uc3QgZWRpdFJlcXVlc3RCb2R5OiBBTUNSZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgZXZlbnQ6ICdzYXZlUGFnZScsXG4gICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICBtb2RlOiAncGFnZScsXG4gICAgICAgICAgbG9ja19pZDogbG9ja0lkLFxuICAgICAgICAgIGxvY2tfc2VjcmV0OiBsb2NrU2VjcmV0LFxuICAgICAgICAgIHJldmlzaW9uX2lkOiBwYWdlUmV2aXNpb25JZCxcbiAgICAgICAgICB3aWtpX3BhZ2U6IGZ1bGxuYW1lLFxuICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2VJZCA/PyAnJyxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgY29tbWVudHM6IGNvbW1lbnQsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZWRpdFJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbZWRpdFJlcXVlc3RCb2R5XSk7XG4gICAgICAgIGlmIChlZGl0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBlZGl0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFRhcmdldEV4aXN0c0Vycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlL2VkaXQgcGFnZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2VhcmNoUGFnZXNRdWVyeSB9O1xuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcblxuLyoqXG4gKiBQYWdlIGZpbGUgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VGaWxlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIG1pbWVUeXBlOiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYWdlIGF0dGFjaG1lbnQgZmlsZVxuICovXG5leHBvcnQgY2xhc3MgUGFnZUZpbGUge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG1pbWVUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBzaXplOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZUZpbGVEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLnVybCA9IGRhdGEudXJsO1xuICAgIHRoaXMubWltZVR5cGUgPSBkYXRhLm1pbWVUeXBlO1xuICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlRmlsZShpZD0ke3RoaXMuaWR9LCBuYW1lPSR7dGhpcy5uYW1lfSwgc2l6ZT0ke3RoaXMuc2l6ZX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgZmlsZSBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlRmlsZUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxQYWdlRmlsZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcblxuICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlLCBmaWxlcz86IFBhZ2VGaWxlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgaWYgKGZpbGVzKSB7XG4gICAgICB0aGlzLnB1c2goLi4uZmlsZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogUGFnZUZpbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGZpbGUpID0+IGZpbGUuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IG5hbWVcbiAgICovXG4gIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nKTogUGFnZUZpbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGZpbGUpID0+IGZpbGUubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBzaXplIHN0cmluZyB0byBieXRlcyAocHVibGljIGZvciBiYXRjaCBvcGVyYXRpb25zKVxuICAgKi9cbiAgc3RhdGljIHBhcnNlU2l6ZShzaXplVGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0ZXh0ID0gc2l6ZVRleHQudHJpbSgpO1xuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdCeXRlcycpKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihOdW1iZXIucGFyc2VGbG9hdCh0ZXh0LnJlcGxhY2UoJ0J5dGVzJywgJycpLnRyaW0oKSkpO1xuICAgIH1cbiAgICBpZiAodGV4dC5pbmNsdWRlcygna0InKSkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTnVtYmVyLnBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKCdrQicsICcnKS50cmltKCkpICogMTAwMCk7XG4gICAgfVxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdNQicpKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihOdW1iZXIucGFyc2VGbG9hdCh0ZXh0LnJlcGxhY2UoJ01CJywgJycpLnRyaW0oKSkgKiAxMDAwMDAwKTtcbiAgICB9XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ0dCJykpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKE51bWJlci5wYXJzZUZsb2F0KHRleHQucmVwbGFjZSgnR0InLCAnJykudHJpbSgpKSAqIDEwMDAwMDAwMDApO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBmaWxlIGluZm9ybWF0aW9uIGZyb20gSFRNTCByZXNwb25zZVxuICAgKiBJbnRlcm5hbCBoZWxwZXIgZm9yIGFjcXVpcmUoKSBhbmQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VGaWxlcygpXG4gICAqL1xuICBzdGF0aWMgX3BhcnNlRnJvbUh0bWwocGFnZTogUGFnZSwgJDogY2hlZXJpby5DaGVlcmlvQVBJKTogUGFnZUZpbGVbXSB7XG4gICAgY29uc3QgZmlsZXNUYWJsZSA9ICQoJ3RhYmxlLnBhZ2UtZmlsZXMnKTtcbiAgICBpZiAoZmlsZXNUYWJsZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlczogUGFnZUZpbGVbXSA9IFtdO1xuXG4gICAgZmlsZXNUYWJsZS5maW5kKFwidGJvZHkgdHJbaWRePSdmaWxlLXJvdy0nXVwiKS5lYWNoKChfaSwgcm93KSA9PiB7XG4gICAgICBjb25zdCByb3dJZCA9ICQocm93KS5hdHRyKCdpZCcpO1xuICAgICAgaWYgKCFyb3dJZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmaWxlSWQgPSBOdW1iZXIucGFyc2VJbnQocm93SWQucmVwbGFjZSgnZmlsZS1yb3ctJywgJycpLCAxMCk7XG4gICAgICBjb25zdCB0ZHMgPSAkKHJvdykuZmluZCgndGQnKTtcbiAgICAgIGlmICh0ZHMubGVuZ3RoIDwgMykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBsaW5rRWxlbSA9ICQodGRzWzBdKS5maW5kKCdhJyk7XG4gICAgICBpZiAobGlua0VsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG5hbWUgPSBsaW5rRWxlbS50ZXh0KCkudHJpbSgpO1xuICAgICAgY29uc3QgaHJlZiA9IGxpbmtFbGVtLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgIGNvbnN0IHVybCA9IGAke3BhZ2Uuc2l0ZS5nZXRCYXNlVXJsKCl9JHtocmVmfWA7XG5cbiAgICAgIGNvbnN0IG1pbWVFbGVtID0gJCh0ZHNbMV0pLmZpbmQoJ3NwYW4nKTtcbiAgICAgIGNvbnN0IG1pbWVUeXBlID0gbWltZUVsZW0uYXR0cigndGl0bGUnKSA/PyAnJztcblxuICAgICAgY29uc3Qgc2l6ZVRleHQgPSAkKHRkc1syXSkudGV4dCgpLnRyaW0oKTtcbiAgICAgIGNvbnN0IHNpemUgPSBQYWdlRmlsZUNvbGxlY3Rpb24ucGFyc2VTaXplKHNpemVUZXh0KTtcblxuICAgICAgZmlsZXMucHVzaChcbiAgICAgICAgbmV3IFBhZ2VGaWxlKHtcbiAgICAgICAgICBwYWdlLFxuICAgICAgICAgIGlkOiBmaWxlSWQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgbWltZVR5cGUsXG4gICAgICAgICAgc2l6ZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gcGFnZVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUocGFnZTogUGFnZSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlRmlsZUNvbGxlY3Rpb24+IHtcbiAgICBpZiAocGFnZS5pZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1BhZ2UgSUQgbm90IGFjcXVpcmVkJykpLFxuICAgICAgICAoKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKCdQYWdlIElEIG11c3QgYmUgYWNxdWlyZWQgYmVmb3JlIGdldHRpbmcgZmlsZXMnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSWQgPSBwYWdlLmlkO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmaWxlcy9QYWdlRmlsZXNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZV9pZDogcGFnZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gUGFnZUZpbGVDb2xsZWN0aW9uLl9wYXJzZUZyb21IdG1sKHBhZ2UsICQpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUZpbGVDb2xsZWN0aW9uKHBhZ2UsIGZpbGVzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIGZpbGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciwgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgUGFnZVJlZiB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBQYWdlIG1ldGEgdGFnIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlTWV0YURhdGEge1xuICBwYWdlOiBQYWdlUmVmO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYWdlIG1ldGEgdGFnXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlTWV0YSB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlUmVmO1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgY29udGVudDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VNZXRhRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgdGhpcy5jb250ZW50ID0gZGF0YS5jb250ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtZXRhIHRhZyB2YWx1ZVxuICAgKiBAcGFyYW0gY29udGVudCAtIE5ldyB2YWx1ZVxuICAgKi9cbiAgdXBkYXRlKGNvbnRlbnQ6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFBhZ2VNZXRhQ29sbGVjdGlvbi5zZXRNZXRhKHRoaXMucGFnZSwgdGhpcy5uYW1lLCBjb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgbWV0YSB0YWdcbiAgICovXG4gIGRlbGV0ZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBQYWdlTWV0YUNvbGxlY3Rpb24uZGVsZXRlTWV0YSh0aGlzLnBhZ2UsIHRoaXMubmFtZSk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZU1ldGEobmFtZT0ke3RoaXMubmFtZX0sIGNvbnRlbnQ9JHt0aGlzLmNvbnRlbnR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQYWdlIG1ldGEgdGFnIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VNZXRhQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VNZXRhPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlUmVmO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2VSZWYsIG1ldGFzPzogUGFnZU1ldGFbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAobWV0YXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5tZXRhcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgbmFtZVxuICAgKiBAcGFyYW0gbmFtZSAtIE1ldGEgdGFnIG5hbWVcbiAgICogQHJldHVybnMgTWV0YSB0YWcgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlOYW1lKG5hbWU6IHN0cmluZyk6IFBhZ2VNZXRhIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChtZXRhKSA9PiBtZXRhLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYWdlIG1ldGEgdGFnc1xuICAgKiBAcGFyYW0gcGFnZSAtIFBhZ2UgcmVmZXJlbmNlXG4gICAqIEByZXR1cm5zIE1ldGEgdGFnIGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKHBhZ2U6IFBhZ2VSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZU1ldGFDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L0VkaXRNZXRhTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZS5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0IG1ldGFzOiBQYWdlTWV0YVtdID0gW107XG5cbiAgICAgICAgLy8gUGFyc2UgSFRNTC1lbmNvZGVkIG1ldGEgdGFncyB3aXRoIHJlZ2V4XG4gICAgICAgIC8vIEZvcm1hdDogJmx0O21ldGEgbmFtZT1cInh4eFwiIGNvbnRlbnQ9XCJ5eXlcIi8mZ3Q7XG4gICAgICAgIGNvbnN0IG1ldGFSZWdleCA9IC8mbHQ7bWV0YSBuYW1lPVwiKFteXCJdKylcIiBjb250ZW50PVwiKFteXCJdKilcIlxcLz8mZ3Q7L2c7XG4gICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgaHRtbC5tYXRjaEFsbChtZXRhUmVnZXgpKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IG1hdGNoWzFdO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBtYXRjaFsyXTtcbiAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgbWV0YXMucHVzaChcbiAgICAgICAgICAgICAgbmV3IFBhZ2VNZXRhKHtcbiAgICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgY29udGVudDogY29udGVudCA/PyAnJyxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlTWV0YUNvbGxlY3Rpb24ocGFnZSwgbWV0YXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBtZXRhczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1ldGEgdGFnXG4gICAqIEBwYXJhbSBwYWdlIC0gUGFnZSByZWZlcmVuY2VcbiAgICogQHBhcmFtIG5hbWUgLSBNZXRhIHRhZyBuYW1lXG4gICAqIEBwYXJhbSBjb250ZW50IC0gTWV0YSB0YWcgdmFsdWVcbiAgICovXG4gIHN0YXRpYyBzZXRNZXRhKHBhZ2U6IFBhZ2VSZWYsIG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IHBhZ2Uuc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBzZXQgbWV0YSB0YWcnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdzYXZlTWV0YVRhZycsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZWRpdC9FZGl0TWV0YU1vZHVsZScsXG4gICAgICAgICAgICBwYWdlSWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgICBtZXRhTmFtZTogbmFtZSxcbiAgICAgICAgICAgIG1ldGFDb250ZW50OiBjb250ZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZXQgbWV0YSB0YWc6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBtZXRhIHRhZ1xuICAgKiBAcGFyYW0gcGFnZSAtIFBhZ2UgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSBuYW1lIC0gTWV0YSB0YWcgbmFtZVxuICAgKi9cbiAgc3RhdGljIGRlbGV0ZU1ldGEocGFnZTogUGFnZVJlZiwgbmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IHBhZ2Uuc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBkZWxldGUgbWV0YSB0YWcnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdkZWxldGVNZXRhVGFnJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L0VkaXRNZXRhTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZS5pZCxcbiAgICAgICAgICAgIG1ldGFOYW1lOiBuYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBkZWxldGUgbWV0YSB0YWc6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgUGFnZSB9IGZyb20gJy4vcGFnZSc7XG5pbXBvcnQgdHlwZSB7IFBhZ2VTb3VyY2UgfSBmcm9tICcuL3BhZ2Utc291cmNlJztcblxuLyoqXG4gKiBQYWdlIHJldmlzaW9uIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlUmV2aXNpb25EYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgaWQ6IG51bWJlcjtcbiAgcmV2Tm86IG51bWJlcjtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXI7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgY29tbWVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhZ2UgcmV2aXNpb24gKHZlcnNpb24gaW4gZWRpdCBoaXN0b3J5KVxuICovXG5leHBvcnQgY2xhc3MgUGFnZVJldmlzaW9uIHtcbiAgLyoqIFBhZ2UgdGhpcyByZXZpc2lvbiBiZWxvbmdzIHRvICovXG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIC8qKiBSZXZpc2lvbiBJRCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcblxuICAvKiogUmV2aXNpb24gbnVtYmVyICovXG4gIHB1YmxpYyByZWFkb25seSByZXZObzogbnVtYmVyO1xuXG4gIC8qKiBSZXZpc2lvbiBjcmVhdG9yICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcblxuICAvKiogUmV2aXNpb24gY3JlYXRpb24gZGF0ZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0OiBEYXRlO1xuXG4gIC8qKiBFZGl0IGNvbW1lbnQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbW1lbnQ6IHN0cmluZztcblxuICAvKiogU291cmNlIGNvZGUgKGludGVybmFsIGNhY2hlKSAqL1xuICBwcml2YXRlIF9zb3VyY2U6IFBhZ2VTb3VyY2UgfCBudWxsID0gbnVsbDtcblxuICAvKiogSFRNTCBkaXNwbGF5IChpbnRlcm5hbCBjYWNoZSkgKi9cbiAgcHJpdmF0ZSBfaHRtbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZVJldmlzaW9uRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnJldk5vID0gZGF0YS5yZXZObztcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gICAgdGhpcy5jb21tZW50ID0gZGF0YS5jb21tZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc291cmNlIGNvZGUgaGFzIGJlZW4gYWNxdWlyZWRcbiAgICovXG4gIGlzU291cmNlQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIEhUTUwgZGlzcGxheSBoYXMgYmVlbiBhY3F1aXJlZFxuICAgKi9cbiAgaXNIdG1sQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2h0bWwgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlIChjYWNoZWQpXG4gICAqL1xuICBnZXQgc291cmNlKCk6IFBhZ2VTb3VyY2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzb3VyY2UgY29kZVxuICAgKi9cbiAgc2V0IHNvdXJjZSh2YWx1ZTogUGFnZVNvdXJjZSB8IG51bGwpIHtcbiAgICB0aGlzLl9zb3VyY2UgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgSFRNTCBkaXNwbGF5IChjYWNoZWQpXG4gICAqL1xuICBnZXQgaHRtbCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgSFRNTCBkaXNwbGF5XG4gICAqL1xuICBzZXQgaHRtbCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX2h0bWwgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmV2aXNpb24gc291cmNlIChSRVYtMDAxKVxuICAgKiBAcmV0dXJucyBTb3VyY2Ugc3RyaW5nXG4gICAqL1xuICBnZXRTb3VyY2UoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFJldHVybiBjYWNoZSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2Uud2lraVRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlU291cmNlTW9kdWxlJyxcbiAgICAgICAgICAgIHJldmlzaW9uX2lkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIFBhZ2VTb3VyY2VNb2R1bGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgLy8gU291cmNlIGNvZGUgaXMgaW5zaWRlIDxkaXYgY2xhc3M9XCJwYWdlLXNvdXJjZVwiPlxuICAgICAgICBjb25zdCBzb3VyY2VFbGVtID0gJCgnZGl2LnBhZ2Utc291cmNlJyk7XG4gICAgICAgIGlmIChzb3VyY2VFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignU291cmNlIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VUZXh0ID0gc291cmNlRWxlbS50ZXh0KCk7XG4gICAgICAgIHJldHVybiBzb3VyY2VUZXh0O1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCByZXZpc2lvbiBzb3VyY2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBIVE1MIChSRVYtMDAyKVxuICAgKiBAcmV0dXJucyBIVE1MIHN0cmluZ1xuICAgKi9cbiAgZ2V0SHRtbCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmV0dXJuIGNhY2hlIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAodGhpcy5faHRtbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9odG1sO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2hpc3RvcnkvUGFnZVZlcnNpb25Nb2R1bGUnLFxuICAgICAgICAgICAgcmV2aXNpb25faWQ6IHRoaXMuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gUGFnZVZlcnNpb25Nb2R1bGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgLy8gSFRNTCBjb250ZW50IGlzIGluc2lkZSA8ZGl2IGlkPVwicGFnZS1jb250ZW50XCI+XG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtID0gJCgnI3BhZ2UtY29udGVudCcpO1xuICAgICAgICBpZiAoY29udGVudEVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gUmV0dXJuIGVudGlyZSBib2R5IGlmIHBhZ2UtY29udGVudCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgdGhpcy5faHRtbCA9IGh0bWw7XG4gICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50SHRtbCA9IGNvbnRlbnRFbGVtLmh0bWwoKSA/PyAnJztcbiAgICAgICAgdGhpcy5faHRtbCA9IGNvbnRlbnRIdG1sO1xuICAgICAgICByZXR1cm4gY29udGVudEh0bWw7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIEhUTUw6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VSZXZpc2lvbihpZD0ke3RoaXMuaWR9LCByZXZObz0ke3RoaXMucmV2Tm99KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQYWdlIHJldmlzaW9uIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxQYWdlUmV2aXNpb24+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2UgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UgfCBudWxsLCByZXZpc2lvbnM/OiBQYWdlUmV2aXNpb25bXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAocmV2aXNpb25zKSB7XG4gICAgICB0aGlzLnB1c2goLi4ucmV2aXNpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKiBAcGFyYW0gaWQgLSBSZXZpc2lvbiBJRFxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQYWdlUmV2aXNpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHJldmlzaW9uKSA9PiByZXZpc2lvbi5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2VzIGZvciBhbGwgcmV2aXNpb25zXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHNvdXJjZSBzdHJpbmdzXG4gICAqL1xuICBnZXRTb3VyY2VzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxzdHJpbmdbXT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICB0aGlzLm1hcChhc3luYyAocmV2aXNpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJldmlzaW9uLmdldFNvdXJjZSgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHNvdXJjZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVE1MIGZvciBhbGwgcmV2aXNpb25zXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIEhUTUwgc3RyaW5nc1xuICAgKi9cbiAgZ2V0SHRtbHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRoaXMubWFwKGFzeW5jIChyZXZpc2lvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmV2aXNpb24uZ2V0SHRtbCgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IEhUTUxzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIFBhZ2Ugc291cmNlIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlU291cmNlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIHdpa2lUZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFnZSBzb3VyY2UgY29kZSAoV2lraWRvdCBzeW50YXgpXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlU291cmNlIHtcbiAgLyoqIFBhZ2UgdGhpcyBzb3VyY2UgYmVsb25ncyB0byAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcblxuICAvKiogU291cmNlIGNvZGUgKFdpa2lkb3Qgc3ludGF4KSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd2lraVRleHQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlU291cmNlRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLndpa2lUZXh0ID0gZGF0YS53aWtpVGV4dDtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlU291cmNlKHBhZ2U9JHt0aGlzLnBhZ2UuZnVsbG5hbWV9LCBsZW5ndGg9JHt0aGlzLndpa2lUZXh0Lmxlbmd0aH0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcblxuLyoqXG4gKiBQYWdlIHZvdGUgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VWb3RlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgdmFsdWU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYWdlIHZvdGUgKHJhdGluZylcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VWb3RlIHtcbiAgLyoqIFBhZ2UgdGhpcyB2b3RlIGJlbG9uZ3MgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG5cbiAgLyoqIFVzZXIgd2hvIHZvdGVkICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyOiBBYnN0cmFjdFVzZXI7XG5cbiAgLyoqIFZvdGUgdmFsdWUgKCsxLy0xIG9yIG51bWVyaWMpICovXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VWb3RlRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgdGhpcy52YWx1ZSA9IGRhdGEudmFsdWU7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZVZvdGUodXNlcj0ke3RoaXMudXNlci5uYW1lfSwgdmFsdWU9JHt0aGlzLnZhbHVlfSlgO1xuICB9XG59XG5cbi8qKlxuICogUGFnZSB2b3RlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VWb3RlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VWb3RlPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UsIHZvdGVzPzogUGFnZVZvdGVbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAodm90ZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi52b3Rlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgdXNlclxuICAgKiBAcGFyYW0gdXNlciAtIFVzZXIgdG8gc2VhcmNoIGZvclxuICAgKiBAcmV0dXJucyBWb3RlICh1bmRlZmluZWQgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZmluZEJ5VXNlcih1c2VyOiBBYnN0cmFjdFVzZXIpOiBQYWdlVm90ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgodm90ZSkgPT4gdm90ZS51c2VyLmlkID09PSB1c2VyLmlkKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuXG4vKipcbiAqIFBhZ2Ugc2VhcmNoIHF1ZXJ5IHBhcmFtZXRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zIHtcbiAgLyoqIFBhZ2UgdHlwZSAoZS5nLiwgJ25vcm1hbCcsICdhZG1pbicpICovXG4gIHBhZ2V0eXBlPzogc3RyaW5nO1xuICAvKiogQ2F0ZWdvcnkgbmFtZSAqL1xuICBjYXRlZ29yeT86IHN0cmluZztcbiAgLyoqIFRhZ3MgdG8gc2VhcmNoIChBTkQgY29uZGl0aW9uKSAqL1xuICB0YWdzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKiBQYXJlbnQgcGFnZSBuYW1lICovXG4gIHBhcmVudD86IHN0cmluZztcbiAgLyoqIExpbmtlZCBwYWdlIG5hbWUgKi9cbiAgbGlua1RvPzogc3RyaW5nO1xuICAvKiogQ3JlYXRlZCBkYXRlIGNvbmRpdGlvbiAqL1xuICBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIC8qKiBVcGRhdGVkIGRhdGUgY29uZGl0aW9uICovXG4gIHVwZGF0ZWRBdD86IHN0cmluZztcbiAgLyoqIENyZWF0b3IgKi9cbiAgY3JlYXRlZEJ5PzogQWJzdHJhY3RVc2VyIHwgc3RyaW5nO1xuICAvKiogUmF0aW5nIGNvbmRpdGlvbiAqL1xuICByYXRpbmc/OiBzdHJpbmc7XG4gIC8qKiBWb3RlIGNvdW50IGNvbmRpdGlvbiAqL1xuICB2b3Rlcz86IHN0cmluZztcbiAgLyoqIFBhZ2UgbmFtZSBjb25kaXRpb24gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIEZ1bGxuYW1lIChleGFjdCBtYXRjaCkgKi9cbiAgZnVsbG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBSYW5nZSBzcGVjaWZpY2F0aW9uICovXG4gIHJhbmdlPzogc3RyaW5nO1xuICAvKiogU29ydCBvcmRlciAoZS5nLiwgJ2NyZWF0ZWRfYXQgZGVzYycpICovXG4gIG9yZGVyPzogc3RyaW5nO1xuICAvKiogU3RhcnQgb2Zmc2V0ICovXG4gIG9mZnNldD86IG51bWJlcjtcbiAgLyoqIFJlc3VsdCBsaW1pdCAqL1xuICBsaW1pdD86IG51bWJlcjtcbiAgLyoqIEl0ZW1zIHBlciBwYWdlICovXG4gIHBlclBhZ2U/OiBudW1iZXI7XG4gIC8qKiBTZXBhcmF0ZSBkaXNwbGF5ICovXG4gIHNlcGFyYXRlPzogc3RyaW5nO1xuICAvKiogV3JhcHBlciBkaXNwbGF5ICovXG4gIHdyYXBwZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVmYXVsdCBpdGVtcyBwZXIgcGFnZVxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9QRVJfUEFHRSA9IDI1MDtcblxuLyoqXG4gKiBEZWZhdWx0IG1vZHVsZSBib2R5IGZpZWxkc1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NT0RVTEVfQk9EWSA9IFtcbiAgJ2Z1bGxuYW1lJyxcbiAgJ2NhdGVnb3J5JyxcbiAgJ25hbWUnLFxuICAndGl0bGUnLFxuICAnY3JlYXRlZF9hdCcsXG4gICdjcmVhdGVkX2J5X2xpbmtlZCcsXG4gICd1cGRhdGVkX2F0JyxcbiAgJ3VwZGF0ZWRfYnlfbGlua2VkJyxcbiAgJ2NvbW1lbnRlZF9hdCcsXG4gICdjb21tZW50ZWRfYnlfbGlua2VkJyxcbiAgJ3BhcmVudF9mdWxsbmFtZScsXG4gICdjb21tZW50cycsXG4gICdzaXplJyxcbiAgJ2NoaWxkcmVuJyxcbiAgJ3JhdGluZ192b3RlcycsXG4gICdyYXRpbmcnLFxuICAncmF0aW5nX3BlcmNlbnQnLFxuICAncmV2aXNpb25zJyxcbiAgJ3RhZ3MnLFxuICAnX3RhZ3MnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBQYWdlIHNlYXJjaCBxdWVyeVxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoUGFnZXNRdWVyeSB7XG4gIC8qKiBQYWdlIHR5cGUgKi9cbiAgcGFnZXR5cGU6IHN0cmluZztcbiAgLyoqIENhdGVnb3J5ICovXG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIC8qKiBUYWdzICovXG4gIHRhZ3M6IHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbDtcbiAgLyoqIFBhcmVudCBwYWdlICovXG4gIHBhcmVudDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIExpbmsgdGFyZ2V0ICovXG4gIGxpbmtUbzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIENyZWF0ZWQgZGF0ZSBjb25kaXRpb24gKi9cbiAgY3JlYXRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICAvKiogVXBkYXRlZCBkYXRlIGNvbmRpdGlvbiAqL1xuICB1cGRhdGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBDcmVhdG9yICovXG4gIGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFJhdGluZyBjb25kaXRpb24gKi9cbiAgcmF0aW5nOiBzdHJpbmcgfCBudWxsO1xuICAvKiogVm90ZSBjb3VudCBjb25kaXRpb24gKi9cbiAgdm90ZXM6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBQYWdlIG5hbWUgY29uZGl0aW9uICovXG4gIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBGdWxsbmFtZSBjb25kaXRpb24gKi9cbiAgZnVsbG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBSYW5nZSAqL1xuICByYW5nZTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFNvcnQgb3JkZXIgKi9cbiAgb3JkZXI6IHN0cmluZztcbiAgLyoqIE9mZnNldCAqL1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgLyoqIFJlc3VsdCBsaW1pdCAqL1xuICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIEl0ZW1zIHBlciBwYWdlICovXG4gIHBlclBhZ2U6IG51bWJlcjtcbiAgLyoqIFNlcGFyYXRlIGRpc3BsYXkgKi9cbiAgc2VwYXJhdGU6IHN0cmluZztcbiAgLyoqIFdyYXBwZXIgZGlzcGxheSAqL1xuICB3cmFwcGVyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocGFyYW1zOiBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zID0ge30pIHtcbiAgICB0aGlzLnBhZ2V0eXBlID0gcGFyYW1zLnBhZ2V0eXBlID8/ICcqJztcbiAgICB0aGlzLmNhdGVnb3J5ID0gcGFyYW1zLmNhdGVnb3J5ID8/ICcqJztcbiAgICB0aGlzLnRhZ3MgPSBwYXJhbXMudGFncyA/PyBudWxsO1xuICAgIHRoaXMucGFyZW50ID0gcGFyYW1zLnBhcmVudCA/PyBudWxsO1xuICAgIHRoaXMubGlua1RvID0gcGFyYW1zLmxpbmtUbyA/PyBudWxsO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gcGFyYW1zLmNyZWF0ZWRBdCA/PyBudWxsO1xuICAgIHRoaXMudXBkYXRlZEF0ID0gcGFyYW1zLnVwZGF0ZWRBdCA/PyBudWxsO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gcGFyYW1zLmNyZWF0ZWRCeSA/PyBudWxsO1xuICAgIHRoaXMucmF0aW5nID0gcGFyYW1zLnJhdGluZyA/PyBudWxsO1xuICAgIHRoaXMudm90ZXMgPSBwYXJhbXMudm90ZXMgPz8gbnVsbDtcbiAgICB0aGlzLm5hbWUgPSBwYXJhbXMubmFtZSA/PyBudWxsO1xuICAgIHRoaXMuZnVsbG5hbWUgPSBwYXJhbXMuZnVsbG5hbWUgPz8gbnVsbDtcbiAgICB0aGlzLnJhbmdlID0gcGFyYW1zLnJhbmdlID8/IG51bGw7XG4gICAgdGhpcy5vcmRlciA9IHBhcmFtcy5vcmRlciA/PyAnY3JlYXRlZF9hdCBkZXNjJztcbiAgICB0aGlzLm9mZnNldCA9IHBhcmFtcy5vZmZzZXQgPz8gMDtcbiAgICB0aGlzLmxpbWl0ID0gcGFyYW1zLmxpbWl0ID8/IG51bGw7XG4gICAgdGhpcy5wZXJQYWdlID0gcGFyYW1zLnBlclBhZ2UgPz8gREVGQVVMVF9QRVJfUEFHRTtcbiAgICB0aGlzLnNlcGFyYXRlID0gcGFyYW1zLnNlcGFyYXRlID8/ICdubyc7XG4gICAgdGhpcy53cmFwcGVyID0gcGFyYW1zLndyYXBwZXIgPz8gJ25vJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRvIGRpY3Rpb25hcnkgZm9ybWF0XG4gICAqL1xuICBhc0RpY3QoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIC8vIHBhZ2V0eXBlIGFuZCBjYXRlZ29yeSBtdXN0IGFsd2F5cyBiZSBpbmNsdWRlZFxuICAgIC8vIFdpa2lkb3QgZGVmYXVsdHM6IHBhZ2V0eXBlPVwibm9ybWFsXCIsIGNhdGVnb3J5PVwiLlwiIChjdXJyZW50IGNhdGVnb3J5KVxuICAgIC8vIFRvIGdldCBhbGwgcGFnZXMsIHdlIG5lZWQgdG8gZXhwbGljaXRseSBzZW5kIFwiKlwiXG4gICAgcmVzdWx0LnBhZ2V0eXBlID0gdGhpcy5wYWdldHlwZTtcbiAgICByZXN1bHQuY2F0ZWdvcnkgPSB0aGlzLmNhdGVnb3J5O1xuICAgIGlmICh0aGlzLnRhZ3MgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdC50YWdzID0gQXJyYXkuaXNBcnJheSh0aGlzLnRhZ3MpID8gdGhpcy50YWdzLmpvaW4oJyAnKSA6IHRoaXMudGFncztcbiAgICB9XG4gICAgaWYgKHRoaXMucGFyZW50ICE9PSBudWxsKSByZXN1bHQucGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgaWYgKHRoaXMubGlua1RvICE9PSBudWxsKSByZXN1bHQubGlua190byA9IHRoaXMubGlua1RvO1xuICAgIGlmICh0aGlzLmNyZWF0ZWRBdCAhPT0gbnVsbCkgcmVzdWx0LmNyZWF0ZWRfYXQgPSB0aGlzLmNyZWF0ZWRBdDtcbiAgICBpZiAodGhpcy51cGRhdGVkQXQgIT09IG51bGwpIHJlc3VsdC51cGRhdGVkX2F0ID0gdGhpcy51cGRhdGVkQXQ7XG4gICAgaWYgKHRoaXMuY3JlYXRlZEJ5ICE9PSBudWxsKSB7XG4gICAgICByZXN1bHQuY3JlYXRlZF9ieSA9IHR5cGVvZiB0aGlzLmNyZWF0ZWRCeSA9PT0gJ3N0cmluZycgPyB0aGlzLmNyZWF0ZWRCeSA6IHRoaXMuY3JlYXRlZEJ5Lm5hbWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnJhdGluZyAhPT0gbnVsbCkgcmVzdWx0LnJhdGluZyA9IHRoaXMucmF0aW5nO1xuICAgIGlmICh0aGlzLnZvdGVzICE9PSBudWxsKSByZXN1bHQudm90ZXMgPSB0aGlzLnZvdGVzO1xuICAgIGlmICh0aGlzLm5hbWUgIT09IG51bGwpIHJlc3VsdC5uYW1lID0gdGhpcy5uYW1lO1xuICAgIGlmICh0aGlzLmZ1bGxuYW1lICE9PSBudWxsKSByZXN1bHQuZnVsbG5hbWUgPSB0aGlzLmZ1bGxuYW1lO1xuICAgIGlmICh0aGlzLnJhbmdlICE9PSBudWxsKSByZXN1bHQucmFuZ2UgPSB0aGlzLnJhbmdlO1xuXG4gICAgcmVzdWx0Lm9yZGVyID0gdGhpcy5vcmRlcjtcbiAgICByZXN1bHQub2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgaWYgKHRoaXMubGltaXQgIT09IG51bGwpIHJlc3VsdC5saW1pdCA9IHRoaXMubGltaXQ7XG4gICAgcmVzdWx0LnBlclBhZ2UgPSB0aGlzLnBlclBhZ2U7XG4gICAgcmVzdWx0LnNlcGFyYXRlID0gdGhpcy5zZXBhcmF0ZTtcbiAgICByZXN1bHQud3JhcHBlciA9IHRoaXMud3JhcHBlcjtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICogU2l0ZSBjaGFuZ2UgaGlzdG9yeSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZUNoYW5nZURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBwYWdlRnVsbG5hbWU6IHN0cmluZztcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XG4gIHJldmlzaW9uTm86IG51bWJlcjtcbiAgY2hhbmdlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjaGFuZ2VkQXQ6IERhdGUgfCBudWxsO1xuICBmbGFnczogc3RyaW5nW107XG4gIGNvbW1lbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTaXRlIGNoYW5nZSBoaXN0b3J5XG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlQ2hhbmdlIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlRnVsbG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcmV2aXNpb25ObzogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlZEF0OiBEYXRlIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGZsYWdzOiBzdHJpbmdbXTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbW1lbnQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTaXRlQ2hhbmdlRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnBhZ2VGdWxsbmFtZSA9IGRhdGEucGFnZUZ1bGxuYW1lO1xuICAgIHRoaXMucGFnZVRpdGxlID0gZGF0YS5wYWdlVGl0bGU7XG4gICAgdGhpcy5yZXZpc2lvbk5vID0gZGF0YS5yZXZpc2lvbk5vO1xuICAgIHRoaXMuY2hhbmdlZEJ5ID0gZGF0YS5jaGFuZ2VkQnk7XG4gICAgdGhpcy5jaGFuZ2VkQXQgPSBkYXRhLmNoYW5nZWRBdDtcbiAgICB0aGlzLmZsYWdzID0gZGF0YS5mbGFncztcbiAgICB0aGlzLmNvbW1lbnQgPSBkYXRhLmNvbW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgVVJMXG4gICAqL1xuICBnZXRQYWdlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc2l0ZS5nZXRCYXNlVXJsKCl9LyR7dGhpcy5wYWdlRnVsbG5hbWV9YDtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTaXRlQ2hhbmdlKHBhZ2U9JHt0aGlzLnBhZ2VGdWxsbmFtZX0sIHJldj0ke3RoaXMucmV2aXNpb25Ob30sIGJ5PSR7dGhpcy5jaGFuZ2VkQnl9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBTaXRlIGNoYW5nZSBoaXN0b3J5IGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVDaGFuZ2VDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8U2l0ZUNoYW5nZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlLCBjaGFuZ2VzPzogU2l0ZUNoYW5nZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICB0aGlzLnB1c2goLi4uY2hhbmdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWNlbnQgY2hhbmdlIGhpc3RvcnlcbiAgICogQHBhcmFtIHNpdGUgLSBTaXRlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uc1xuICAgKiBAcmV0dXJucyBDaGFuZ2UgaGlzdG9yeSBjb2xsZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZShcbiAgICBzaXRlOiBTaXRlLFxuICAgIG9wdGlvbnM/OiB7IHBlclBhZ2U/OiBudW1iZXI7IHBhZ2U/OiBudW1iZXI7IGxpbWl0PzogbnVtYmVyIH1cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVDaGFuZ2VDb2xsZWN0aW9uPiB7XG4gICAgY29uc3QgcGVyUGFnZSA9IG9wdGlvbnM/LnBlclBhZ2UgPz8gMjA7XG4gICAgY29uc3QgcGFnZSA9IG9wdGlvbnM/LnBhZ2UgPz8gMTtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnM/LmxpbWl0O1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnY2hhbmdlcy9TaXRlQ2hhbmdlc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGVycGFnZTogcGVyUGFnZSxcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICBjb25zdCBjaGFuZ2VzOiBTaXRlQ2hhbmdlW10gPSBbXTtcblxuICAgICAgICAvLyBQYXJzZSB0YWJsZSByb3dzXG4gICAgICAgICQoJ3RhYmxlLndpa2ktY29udGVudC10YWJsZSB0cicpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgJHJvdyA9ICQoZWxlbSk7XG4gICAgICAgICAgY29uc3QgJGNlbGxzID0gJHJvdy5maW5kKCd0ZCcpO1xuICAgICAgICAgIGlmICgkY2VsbHMubGVuZ3RoIDwgNCkgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gUGFnZSBsaW5rXG4gICAgICAgICAgY29uc3QgcGFnZUxpbmsgPSAkKCRjZWxsc1swXSkuZmluZCgnYScpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSBwYWdlTGluay5hdHRyKCdocmVmJykgPz8gJyc7XG4gICAgICAgICAgY29uc3QgcGFnZUZ1bGxuYW1lID0gaHJlZi5yZXBsYWNlKC9eXFwvLywgJycpLnNwbGl0KCcvJylbMF0gPz8gJyc7XG4gICAgICAgICAgY29uc3QgcGFnZVRpdGxlID0gcGFnZUxpbmsudGV4dCgpLnRyaW0oKTtcblxuICAgICAgICAgIC8vIFJldmlzaW9uIG51bWJlclxuICAgICAgICAgIGNvbnN0IHJldlRleHQgPSAkKCRjZWxsc1sxXSkudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCByZXZNYXRjaCA9IHJldlRleHQubWF0Y2goLyhcXGQrKS8pO1xuICAgICAgICAgIGNvbnN0IHJldmlzaW9uTm8gPSByZXZNYXRjaD8uWzFdID8gTnVtYmVyLnBhcnNlSW50KHJldk1hdGNoWzFdLCAxMCkgOiAwO1xuXG4gICAgICAgICAgLy8gRmxhZ3NcbiAgICAgICAgICBjb25zdCBmbGFnc0NlbGwgPSAkKCRjZWxsc1syXSk7XG4gICAgICAgICAgY29uc3QgZmxhZ3M6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgZmxhZ3NDZWxsLmZpbmQoJ3NwYW4nKS5lYWNoKChfaiwgZmxhZ0VsZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZsYWdDbGFzcyA9ICQoZmxhZ0VsZW0pLmF0dHIoJ2NsYXNzJykgPz8gJyc7XG4gICAgICAgICAgICBpZiAoZmxhZ0NsYXNzLmluY2x1ZGVzKCdzcGFudGlwJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSAkKGZsYWdFbGVtKS5hdHRyKCd0aXRsZScpID8/ICcnO1xuICAgICAgICAgICAgICBpZiAodGl0bGUpIGZsYWdzLnB1c2godGl0bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gVXNlciBhbmQgdGltZXN0YW1wXG4gICAgICAgICAgY29uc3QgaW5mb0NlbGwgPSAkKCRjZWxsc1szXSk7XG4gICAgICAgICAgY29uc3QgdXNlckVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0IGNoYW5nZWRCeSA9IHVzZXJFbGVtLmxlbmd0aCA+IDAgPyBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsIHVzZXJFbGVtKSA6IG51bGw7XG5cbiAgICAgICAgICBjb25zdCBvZGF0ZUVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgY29uc3QgY2hhbmdlZEF0ID0gb2RhdGVFbGVtLmxlbmd0aCA+IDAgPyBwYXJzZU9kYXRlKG9kYXRlRWxlbSkgOiBudWxsO1xuXG4gICAgICAgICAgLy8gQ29tbWVudFxuICAgICAgICAgIGNvbnN0IGNvbW1lbnRFbGVtID0gaW5mb0NlbGwuZmluZCgnc3Bhbi5jb21tZW50cycpO1xuICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50RWxlbVxuICAgICAgICAgICAgLnRleHQoKVxuICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15bXCJcIl18W1wiXCJdJC9nLCAnJyk7XG5cbiAgICAgICAgICBjaGFuZ2VzLnB1c2goXG4gICAgICAgICAgICBuZXcgU2l0ZUNoYW5nZSh7XG4gICAgICAgICAgICAgIHNpdGUsXG4gICAgICAgICAgICAgIHBhZ2VGdWxsbmFtZSxcbiAgICAgICAgICAgICAgcGFnZVRpdGxlLFxuICAgICAgICAgICAgICByZXZpc2lvbk5vLFxuICAgICAgICAgICAgICBjaGFuZ2VkQnksXG4gICAgICAgICAgICAgIGNoYW5nZWRBdCxcbiAgICAgICAgICAgICAgZmxhZ3MsXG4gICAgICAgICAgICAgIGNvbW1lbnQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIExpbWl0IHJlc3VsdHMgaWYgbGltaXQgaXMgc3BlY2lmaWVkXG4gICAgICAgIGNvbnN0IGxpbWl0ZWRDaGFuZ2VzID0gbGltaXQgIT09IHVuZGVmaW5lZCA/IGNoYW5nZXMuc2xpY2UoMCwgbGltaXQpIDogY2hhbmdlcztcbiAgICAgICAgcmV0dXJuIG5ldyBTaXRlQ2hhbmdlQ29sbGVjdGlvbihzaXRlLCBsaW1pdGVkQ2hhbmdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBzaXRlIGNoYW5nZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlVXNlciB9IGZyb20gJy4uLy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB7XG4gIFBhZ2UsXG4gIFBhZ2VDb2xsZWN0aW9uLFxuICBTZWFyY2hQYWdlc1F1ZXJ5LFxuICB0eXBlIFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMsXG4gIFNpdGVDaGFuZ2VDb2xsZWN0aW9uLFxufSBmcm9tICcuLi8uLi9wYWdlJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuXG4vKipcbiAqIFBhZ2UgbGlzdCBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlc0FjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHBhZ2VzIG1hdGNoaW5nIGNvbmRpdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtIFNlYXJjaCBjb25kaXRpb25zXG4gICAqIEByZXR1cm5zIFBhZ2UgY29sbGVjdGlvblxuICAgKi9cbiAgc2VhcmNoKHBhcmFtcz86IFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBTZWFyY2hQYWdlc1F1ZXJ5KHBhcmFtcyk7XG4gICAgICAgIGNvbnN0IHVzZXJQYXJzZXIgPSBwYXJzZVVzZXIuYmluZChudWxsLCB0aGlzLnNpdGUuY2xpZW50KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5zZWFyY2hQYWdlcyh0aGlzLnNpdGUsIHVzZXJQYXJzZXIsIHF1ZXJ5KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZWFyY2ggcGFnZXM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwYWdlc1xuICAgKiBAcmV0dXJucyBQYWdlIGNvbGxlY3Rpb25cbiAgICovXG4gIGFsbCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2goe30pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWNlbnQgY2hhbmdlc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnNcbiAgICogQHBhcmFtIG9wdGlvbnMucGVyUGFnZSAtIEl0ZW1zIHBlciBwYWdlIChkZWZhdWx0OiAyMClcbiAgICogQHBhcmFtIG9wdGlvbnMucGFnZSAtIFBhZ2UgbnVtYmVyIChkZWZhdWx0OiAxKVxuICAgKiBAcmV0dXJucyBDaGFuZ2UgaGlzdG9yeSBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRSZWNlbnRDaGFuZ2VzKG9wdGlvbnM/OiB7XG4gICAgcGVyUGFnZT86IG51bWJlcjtcbiAgICBwYWdlPzogbnVtYmVyO1xuICB9KTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVDaGFuZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFNpdGVDaGFuZ2VDb2xsZWN0aW9uLmFjcXVpcmUodGhpcy5zaXRlLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBQYWdlLFxuICBQYWdlQ29sbGVjdGlvbixcbiAgU2VhcmNoUGFnZXNRdWVyeSxcbiAgdHlwZSBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zLFxuICBTaXRlQ2hhbmdlQ29sbGVjdGlvbixcbn07XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQge1xuICBOb0VsZW1lbnRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdEVycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL2NvbW1vbi9sb2dnZXInO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQU1DUmVxdWVzdEJvZHksIEFNQ1Jlc3BvbnNlIH0gZnJvbSAnLi4vLi4vY29ubmVjdG9yJztcbmltcG9ydCB7IGZldGNoV2l0aFJldHJ5IH0gZnJvbSAnLi4vLi4vdXRpbC9odHRwJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50L2NsaWVudCc7XG5pbXBvcnQgeyBGb3J1bUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvZm9ydW0tYWNjZXNzb3InO1xuaW1wb3J0IHsgTWVtYmVyQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9tZW1iZXItYWNjZXNzb3InO1xuaW1wb3J0IHsgUGFnZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcGFnZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBQYWdlc0FjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcGFnZXMtYWNjZXNzb3InO1xuXG4vKipcbiAqIFNpdGUgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVEYXRhIHtcbiAgaWQ6IG51bWJlcjtcbiAgdGl0bGU6IHN0cmluZztcbiAgdW5peE5hbWU6IHN0cmluZztcbiAgZG9tYWluOiBzdHJpbmc7XG4gIHNzbFN1cHBvcnRlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTaXRlIGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50O1xuXG4gIC8qKiBTaXRlIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBTaXRlIHRpdGxlICovXG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuXG4gIC8qKiBVTklYIG5hbWUgKGUuZy4sIHNjcC1qcCkgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmc7XG5cbiAgLyoqIERvbWFpbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluOiBzdHJpbmc7XG5cbiAgLyoqIFNTTCBzdXBwb3J0IGZsYWcgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNzbFN1cHBvcnRlZDogYm9vbGVhbjtcblxuICAvKiogUGFnZSBhY2Nlc3NvciAqL1xuICBwcml2YXRlIF9wYWdlOiBQYWdlQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICAvKiogUGFnZXMgYWNjZXNzb3IgKi9cbiAgcHJpdmF0ZSBfcGFnZXM6IFBhZ2VzQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICAvKiogRm9ydW0gYWNjZXNzb3IgKi9cbiAgcHJpdmF0ZSBfZm9ydW06IEZvcnVtQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICAvKiogTWVtYmVyIGFjY2Vzc29yICovXG4gIHByaXZhdGUgX21lbWJlcjogTWVtYmVyQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgZGF0YTogU2l0ZURhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLnVuaXhOYW1lID0gZGF0YS51bml4TmFtZTtcbiAgICB0aGlzLmRvbWFpbiA9IGRhdGEuZG9tYWluO1xuICAgIHRoaXMuc3NsU3VwcG9ydGVkID0gZGF0YS5zc2xTdXBwb3J0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgYWNjZXNzb3JcbiAgICovXG4gIGdldCBwYWdlKCk6IFBhZ2VBY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9wYWdlKSB7XG4gICAgICB0aGlzLl9wYWdlID0gbmV3IFBhZ2VBY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2VzIGFjY2Vzc29yXG4gICAqL1xuICBnZXQgcGFnZXMoKTogUGFnZXNBY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9wYWdlcykge1xuICAgICAgdGhpcy5fcGFnZXMgPSBuZXcgUGFnZXNBY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmb3J1bSBhY2Nlc3NvclxuICAgKi9cbiAgZ2V0IGZvcnVtKCk6IEZvcnVtQWNjZXNzb3Ige1xuICAgIGlmICghdGhpcy5fZm9ydW0pIHtcbiAgICAgIHRoaXMuX2ZvcnVtID0gbmV3IEZvcnVtQWNjZXNzb3IodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mb3J1bTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVtYmVyIGFjY2Vzc29yXG4gICAqL1xuICBnZXQgbWVtYmVyKCk6IE1lbWJlckFjY2Vzc29yIHtcbiAgICBpZiAoIXRoaXMuX21lbWJlcikge1xuICAgICAgdGhpcy5fbWVtYmVyID0gbmV3IE1lbWJlckFjY2Vzc29yKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbWVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBiYXNlIFVSTCBvZiB0aGUgc2l0ZVxuICAgKi9cbiAgZ2V0QmFzZVVybCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5zc2xTdXBwb3J0ZWQgPyAnaHR0cHMnIDogJ2h0dHAnO1xuICAgIHJldHVybiBgJHtwcm90b2NvbH06Ly8ke3RoaXMuZG9tYWlufWA7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBBTUMgcmVxdWVzdCB0byB0aGlzIHNpdGVcbiAgICogQHBhcmFtIGJvZGllcyAtIFJlcXVlc3QgYm9keSBhcnJheVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlcXVlc3Qgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBBTUMgcmVzcG9uc2UgYXJyYXlcbiAgICovXG4gIGFtY1JlcXVlc3QoYm9kaWVzOiBBTUNSZXF1ZXN0Qm9keVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlW10+O1xuICBhbWNSZXF1ZXN0KFxuICAgIGJvZGllczogQU1DUmVxdWVzdEJvZHlbXSxcbiAgICBvcHRpb25zOiB7IHJldHVybkV4Y2VwdGlvbnM6IHRydWUgfVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8KEFNQ1Jlc3BvbnNlIHwgV2lraWRvdEVycm9yKVtdPjtcbiAgYW1jUmVxdWVzdChcbiAgICBib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10sXG4gICAgb3B0aW9ucz86IHsgcmV0dXJuRXhjZXB0aW9ucz86IGJvb2xlYW4gfVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2VbXT4gfCBXaWtpZG90UmVzdWx0QXN5bmM8KEFNQ1Jlc3BvbnNlIHwgV2lraWRvdEVycm9yKVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0V2l0aE9wdGlvbnMoYm9kaWVzLCB7XG4gICAgICBzaXRlTmFtZTogdGhpcy51bml4TmFtZSxcbiAgICAgIHNzbFN1cHBvcnRlZDogdGhpcy5zc2xTdXBwb3J0ZWQsXG4gICAgICByZXR1cm5FeGNlcHRpb25zOiBvcHRpb25zPy5yZXR1cm5FeGNlcHRpb25zID8/IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgQU1DIHJlcXVlc3Qgd2l0aCBwYXJ0aWFsIGZhaWx1cmUgdG9sZXJhbmNlLlxuICAgKiBGYWlsZWQgcmVxdWVzdHMgYXJlIHJldHJpZWQgb25jZS4gU3RpbGwtZmFpbGVkIHJlcXVlc3RzIHJldHVybiBudWxsLlxuICAgKiBAcGFyYW0gYm9kaWVzIC0gUmVxdWVzdCBib2R5IGFycmF5XG4gICAqIEByZXR1cm5zIEFNQyByZXNwb25zZSBhcnJheSAobnVsbCBmb3IgcGVybWFuZW50bHkgZmFpbGVkIHJlcXVlc3RzKVxuICAgKi9cbiAgYW1jUmVxdWVzdFdpdGhSZXRyeShib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10pOiBXaWtpZG90UmVzdWx0QXN5bmM8KEFNQ1Jlc3BvbnNlIHwgbnVsbClbXT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSZXN1bHQgPSBhd2FpdCB0aGlzLmFtY1JlcXVlc3QoYm9kaWVzLCB7IHJldHVybkV4Y2VwdGlvbnM6IHRydWUgfSk7XG4gICAgICAgIGlmIChpbml0aWFsUmVzdWx0LmlzRXJyKCkpIHRocm93IGluaXRpYWxSZXN1bHQuZXJyb3I7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0czogKEFNQ1Jlc3BvbnNlIHwgbnVsbClbXSA9IFtdO1xuICAgICAgICBjb25zdCBmYWlsZWRJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2ksIHJlc3BPckVycl0gb2YgaW5pdGlhbFJlc3VsdC52YWx1ZS5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBpZiAocmVzcE9yRXJyIGluc3RhbmNlb2YgV2lraWRvdEVycm9yKSB7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2gobnVsbCk7XG4gICAgICAgICAgICBmYWlsZWRJbmRpY2VzLnB1c2goaSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXNwT3JFcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmYWlsZWRJbmRpY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCByZXRyeUJvZGllcyA9IGZhaWxlZEluZGljZXMubWFwKChpKSA9PiBib2RpZXNbaV0hKTtcbiAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgIGBhbWNSZXF1ZXN0V2l0aFJldHJ5OiAke2ZhaWxlZEluZGljZXMubGVuZ3RofS8ke2JvZGllcy5sZW5ndGh9IHJlcXVlc3RzIGZhaWxlZCwgcmV0cnlpbmdgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCByZXRyeVJlc3VsdCA9IGF3YWl0IHRoaXMuYW1jUmVxdWVzdChyZXRyeUJvZGllcywgeyByZXR1cm5FeGNlcHRpb25zOiB0cnVlIH0pO1xuICAgICAgICAgIGlmIChyZXRyeVJlc3VsdC5pc09rKCkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZmFpbGVkSW5kaWNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICBjb25zdCByZXRyeVJlc3AgPSByZXRyeVJlc3VsdC52YWx1ZVtqXTtcbiAgICAgICAgICAgICAgaWYgKHJldHJ5UmVzcCAmJiAhKHJldHJ5UmVzcCBpbnN0YW5jZW9mIFdpa2lkb3RFcnJvcikpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW2ZhaWxlZEluZGljZXNbal0hXSA9IHJldHJ5UmVzcDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgIGBhbWNSZXF1ZXN0V2l0aFJldHJ5OiByZXRyeSBmYWlsZWQsIHNraXBwaW5nOiAke3JldHJ5UmVzcCBpbnN0YW5jZW9mIFdpa2lkb3RFcnJvciA/IHJldHJ5UmVzcC5tZXNzYWdlIDogJ3Vua25vd24nfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgQU1DIHJlcXVlc3Qgd2l0aCByZXRyeSBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBzaW5nbGUgQU1DIHJlcXVlc3RcbiAgICogQHBhcmFtIGJvZHkgLSBSZXF1ZXN0IGJvZHlcbiAgICogQHJldHVybnMgQU1DIHJlc3BvbnNlXG4gICAqL1xuICBhbWNSZXF1ZXN0U2luZ2xlKGJvZHk6IEFNQ1JlcXVlc3RCb2R5KTogV2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hbWNSZXF1ZXN0KFtib2R5XSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0FNQyByZXF1ZXN0IHJldHVybmVkIGVtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVbmV4cGVjdGVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEFNQyByZXF1ZXN0IGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNpdGUgZnJvbSBVTklYIG5hbWVcbiAgICogQHBhcmFtIGNsaWVudCAtIENsaWVudFxuICAgKiBAcGFyYW0gdW5peE5hbWUgLSBTaXRlIFVOSVggbmFtZSAoZS5nLiwgJ3NjcC1qcCcpXG4gICAqIEByZXR1cm5zIFNpdGVcbiAgICovXG4gIHN0YXRpYyBmcm9tVW5peE5hbWUoY2xpZW50OiBDbGllbnQsIHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEZldGNoIHNpdGUgcGFnZSAoSFRUUCByZXF1ZXN0LCBmb2xsb3dpbmcgcmVkaXJlY3RzLCB3aXRoIHJldHJ5KVxuICAgICAgICBjb25zdCB1cmwgPSBgaHR0cDovLyR7dW5peE5hbWV9Lndpa2lkb3QuY29tYDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeSh1cmwsIGNsaWVudC5hbWNDbGllbnQuY29uZmlnLCB7XG4gICAgICAgICAgaGVhZGVyczogY2xpZW50LmFtY0NsaWVudC5oZWFkZXIuZ2V0SGVhZGVycygpLFxuICAgICAgICAgIGNoZWNrT2s6IGZhbHNlLCAvLyBIYW5kbGUgSFRUUCBlcnJvcnMgbWFudWFsbHkgZm9yIGJldHRlciBlcnJvciBtZXNzYWdlc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oYFNpdGUgbm90IGZvdW5kOiAke3VuaXhOYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggc2l0ZTogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgIC8vIFBhcnNlIFdJS0lSRVFVRVNULmluZm9cbiAgICAgICAgY29uc3Qgc2NyaXB0cyA9ICQoJ3NjcmlwdCcpLnRvQXJyYXkoKTtcbiAgICAgICAgbGV0IHNpdGVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBzaXRlVW5peE5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgZG9tYWluOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IHRpdGxlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBmb3IgKGNvbnN0IHNjcmlwdCBvZiBzY3JpcHRzKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9ICQoc2NyaXB0KS5odG1sKCk7XG4gICAgICAgICAgaWYgKCFjb250ZW50IHx8ICFjb250ZW50LmluY2x1ZGVzKCdXSUtJUkVRVUVTVCcpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaXRlSWRcbiAgICAgICAgICBjb25zdCBzaXRlSWRNYXRjaCA9IGNvbnRlbnQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLnNpdGVJZFxccyo9XFxzKihcXGQrKS8pO1xuICAgICAgICAgIGlmIChzaXRlSWRNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBzaXRlSWQgPSBOdW1iZXIucGFyc2VJbnQoc2l0ZUlkTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaXRlVW5peE5hbWVcbiAgICAgICAgICBjb25zdCBzaXRlVW5peE5hbWVNYXRjaCA9IGNvbnRlbnQubWF0Y2goXG4gICAgICAgICAgICAvV0lLSVJFUVVFU1RcXC5pbmZvXFwuc2l0ZVVuaXhOYW1lXFxzKj1cXHMqW1wiJ10oW15cIiddKylbXCInXS9cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzaXRlVW5peE5hbWVNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBzaXRlVW5peE5hbWUgPSBzaXRlVW5peE5hbWVNYXRjaFsxXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBkb21haW5cbiAgICAgICAgICBjb25zdCBkb21haW5NYXRjaCA9IGNvbnRlbnQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLmRvbWFpblxccyo9XFxzKltcIiddKFteXCInXSspW1wiJ10vKTtcbiAgICAgICAgICBpZiAoZG9tYWluTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgZG9tYWluID0gZG9tYWluTWF0Y2hbMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGl0bGUgZnJvbSA8dGl0bGU+IHRhZ1xuICAgICAgICB0aXRsZSA9ICQoJ3RpdGxlJykudGV4dCgpLnRyaW0oKSB8fCBudWxsO1xuICAgICAgICAvLyBSZW1vdmUgXCIgLSBXaWtpZG90XCIgc3VmZml4IGlmIHByZXNlbnRcbiAgICAgICAgaWYgKHRpdGxlPy5lbmRzV2l0aCgnIC0gV2lraWRvdCcpKSB7XG4gICAgICAgICAgdGl0bGUgPSB0aXRsZS5zbGljZSgwLCAtMTApLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaXRlSWQgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1NpdGUgSUQgbm90IGZvdW5kIGluIFdJS0lSRVFVRVNUJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpdGVVbml4TmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHNpdGVVbml4TmFtZSA9IHVuaXhOYW1lOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb21haW4gPT09IG51bGwpIHtcbiAgICAgICAgICBkb21haW4gPSBgJHt1bml4TmFtZX0ud2lraWRvdC5jb21gOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aXRsZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRpdGxlID0gdW5peE5hbWU7IC8vIEZhbGxiYWNrXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBTU0wgc3VwcG9ydCAoYmFzZWQgb24gd2hldGhlciB0aGUgcmVkaXJlY3QgVVJMIHN0YXJ0cyB3aXRoIGh0dHBzKVxuICAgICAgICBjb25zdCBzc2xTdXBwb3J0ZWQgPSByZXNwb25zZS51cmwuc3RhcnRzV2l0aCgnaHR0cHMnKTtcblxuICAgICAgICByZXR1cm4gbmV3IFNpdGUoY2xpZW50LCB7XG4gICAgICAgICAgaWQ6IHNpdGVJZCxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICB1bml4TmFtZTogc2l0ZVVuaXhOYW1lLFxuICAgICAgICAgIGRvbWFpbixcbiAgICAgICAgICBzc2xTdXBwb3J0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHNpdGU6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFNpdGUoaWQ9JHt0aGlzLmlkfSwgdW5peE5hbWU9JHt0aGlzLnVuaXhOYW1lfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IFNpdGUgfSBmcm9tICcuLi8uLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiBTaXRlIG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIGJ5IFVOSVggbmFtZVxuICAgKlxuICAgKiBAcGFyYW0gdW5peE5hbWUgLSBTaXRlIFVOSVggbmFtZSAoZS5nLiwgJ3NjcC1qcCcpXG4gICAqIEByZXR1cm5zIFNpdGUgb2JqZWN0IHdyYXBwZWQgaW4gUmVzdWx0IHR5cGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzaXRlUmVzdWx0ID0gYXdhaXQgY2xpZW50LnNpdGUuZ2V0KCdzY3AtanAnKTtcbiAgICogaWYgKCFzaXRlUmVzdWx0LmlzT2soKSkge1xuICAgKiAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBzaXRlJyk7XG4gICAqIH1cbiAgICogY29uc3Qgc2l0ZSA9IHNpdGVSZXN1bHQudmFsdWU7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0KHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZT4ge1xuICAgIHJldHVybiBTaXRlLmZyb21Vbml4TmFtZSh0aGlzLmNsaWVudCwgdW5peE5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCB7IFNpdGUgfTtcbiIsCiAgICAiaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLCB3ZEVyckFzeW5jLCB3ZE9rQXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgVXNlciwgdHlwZSBVc2VyQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuXG4vKipcbiAqIFVzZXIgcmV0cmlldmFsIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRVc2VyT3B0aW9ucyB7XG4gIC8qKiBUaHJvdyBlcnJvciBpZiB1c2VyIG5vdCBmb3VuZCAoZGVmYXVsdDogZmFsc2UpICovXG4gIHJhaXNlV2hlbk5vdEZvdW5kPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBVc2VyIG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VyIGJ5IHVzZXJuYW1lXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVXNlcm5hbWVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBSZXRyaWV2YWwgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBVc2VyIHdyYXBwZWQgaW4gUmVzdWx0IHR5cGUgKG51bGwgaWYgbm90IGZvdW5kLCBlcnJvciBpZiByYWlzZVdoZW5Ob3RGb3VuZCBpcyB0cnVlKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVzZXJSZXN1bHQgPSBhd2FpdCBjbGllbnQudXNlci5nZXQoJ3VzZXJuYW1lJyk7XG4gICAqIGlmICghdXNlclJlc3VsdC5pc09rKCkpIHtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgdXNlcicpO1xuICAgKiB9XG4gICAqIGNvbnN0IHVzZXIgPSB1c2VyUmVzdWx0LnZhbHVlO1xuICAgKiBgYGBcbiAgICovXG4gIGdldChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEdldFVzZXJPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlciB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJhaXNlV2hlbk5vdEZvdW5kID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gVXNlci5mcm9tTmFtZSh0aGlzLmNsaWVudCwgbmFtZSkuYW5kVGhlbigodXNlcikgPT4ge1xuICAgICAgaWYgKHVzZXIgPT09IG51bGwgJiYgcmFpc2VXaGVuTm90Rm91bmQpIHtcbiAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBVc2VyIG5vdCBmb3VuZDogJHtuYW1lfWApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3ZE9rQXN5bmModXNlcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVzZXJzIGZyb20gbXVsdGlwbGUgdXNlcm5hbWVzXG4gICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIHVzZXJuYW1lc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJldHJpZXZhbCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFVzZXIgY29sbGVjdGlvbiAobnVsbCBmb3Igbm9uLWV4aXN0ZW50IHVzZXJzLCBlcnJvciBpZiByYWlzZVdoZW5Ob3RGb3VuZCBpcyB0cnVlKVxuICAgKi9cbiAgZ2V0TWFueShuYW1lczogc3RyaW5nW10sIG9wdGlvbnM6IEdldFVzZXJPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlckNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCB7IHJhaXNlV2hlbk5vdEZvdW5kID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gVXNlci5mcm9tTmFtZXModGhpcy5jbGllbnQsIG5hbWVzKS5hbmRUaGVuKChjb2xsZWN0aW9uKSA9PiB7XG4gICAgICBpZiAocmFpc2VXaGVuTm90Rm91bmQpIHtcbiAgICAgICAgY29uc3Qgbm90Rm91bmROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgICAgICBpZiAoY29sbGVjdGlvbltpXSA9PT0gbnVsbCAmJiBuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5vdEZvdW5kTmFtZXMucHVzaChuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vdEZvdW5kTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVXNlcnMgbm90IGZvdW5kOiAke25vdEZvdW5kTmFtZXMuam9pbignLCAnKX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB3ZE9rQXN5bmMoY29sbGVjdGlvbik7XG4gICAgfSk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQge1xuICBmcm9tUHJvbWlzZSxcbiAgdHlwZSBXaWtpZG90UmVzdWx0LFxuICB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyxcbiAgd2RFcnIsXG4gIHdkT2ssXG4gIHdkT2tBc3luYyxcbn0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IEFNQ0NsaWVudCwgdHlwZSBBTUNDb25maWcsIGxvZ2luLCBsb2dvdXQgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uL3VzZXIvdXNlcic7XG5pbXBvcnQgeyBQcml2YXRlTWVzc2FnZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcG0tYWNjZXNzb3InO1xuaW1wb3J0IHsgU2l0ZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvc2l0ZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBVc2VyQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy91c2VyLWFjY2Vzc29yJztcblxuLyoqXG4gKiBDbGllbnQgY3JlYXRpb24gb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudE9wdGlvbnMge1xuICAvKiogV2lraWRvdCB1c2VybmFtZSAqL1xuICB1c2VybmFtZT86IHN0cmluZztcblxuICAvKiogV2lraWRvdCBwYXNzd29yZCAqL1xuICBwYXNzd29yZD86IHN0cmluZztcblxuICAvKiogQmFzZSBkb21haW4gKGRlZmF1bHQ6IHdpa2lkb3QuY29tKSAqL1xuICBkb21haW4/OiBzdHJpbmc7XG5cbiAgLyoqIEFNQyBjb25maWd1cmF0aW9uIG92ZXJyaWRlICovXG4gIGFtY0NvbmZpZz86IFBhcnRpYWw8QU1DQ29uZmlnPjtcbn1cblxuLyoqXG4gKiBXaWtpZG90IGNsaWVudFxuICogTWFpbiBlbnRyeSBwb2ludCBvZiB0aGUgbGlicmFyeVxuICovXG5leHBvcnQgY2xhc3MgQ2xpZW50IHtcbiAgLyoqIEFNQyBjbGllbnQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFtY0NsaWVudDogQU1DQ2xpZW50O1xuXG4gIC8qKiBCYXNlIGRvbWFpbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluOiBzdHJpbmc7XG5cbiAgLyoqIFVzZXIgb3BlcmF0aW9ucyBhY2Nlc3NvciAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcjogVXNlckFjY2Vzc29yO1xuXG4gIC8qKiBTaXRlIG9wZXJhdGlvbnMgYWNjZXNzb3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGVBY2Nlc3NvcjtcblxuICAvKiogUHJpdmF0ZSBtZXNzYWdlIG9wZXJhdGlvbnMgYWNjZXNzb3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaXZhdGVNZXNzYWdlOiBQcml2YXRlTWVzc2FnZUFjY2Vzc29yO1xuXG4gIC8qKiBVc2VybmFtZSBvZiB0aGUgbG9nZ2VkLWluIHVzZXIgKi9cbiAgcHJpdmF0ZSBfdXNlcm5hbWU6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqIExvZ2dlZC1pbiB1c2VyICovXG4gIHByaXZhdGUgX21lOiBVc2VyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgY29uc3RydWN0b3JcbiAgICogVXNlIHRoZSBjcmVhdGUgbWV0aG9kIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihhbWNDbGllbnQ6IEFNQ0NsaWVudCwgZG9tYWluOiBzdHJpbmcsIHVzZXJuYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbCkge1xuICAgIHRoaXMuYW1jQ2xpZW50ID0gYW1jQ2xpZW50O1xuICAgIHRoaXMuZG9tYWluID0gZG9tYWluO1xuICAgIHRoaXMuX3VzZXJuYW1lID0gdXNlcm5hbWU7XG5cbiAgICAvLyBJbml0aWFsaXplIGFjY2Vzc29yc1xuICAgIHRoaXMudXNlciA9IG5ldyBVc2VyQWNjZXNzb3IodGhpcyk7XG4gICAgdGhpcy5zaXRlID0gbmV3IFNpdGVBY2Nlc3Nvcih0aGlzKTtcbiAgICB0aGlzLnByaXZhdGVNZXNzYWdlID0gbmV3IFByaXZhdGVNZXNzYWdlQWNjZXNzb3IodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VybmFtZSBvZiB0aGUgbG9nZ2VkLWluIHVzZXJcbiAgICovXG4gIGdldCB1c2VybmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb2dnZWQtaW4gdXNlclxuICAgKiBSZXR1cm5zIG51bGwgaWYgbm90IGxvZ2dlZCBpblxuICAgKi9cbiAgZ2V0IG1lKCk6IFVzZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY2xpZW50XG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ2xpZW50IG9wdGlvbnNcbiAgICogQHJldHVybnMgQ2xpZW50IGluc3RhbmNlIHdyYXBwZWQgaW4gUmVzdWx0IHR5cGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBDbGllbnQgfSBmcm9tICdAdWt3aGF0bi93aWtpZG90JztcbiAgICpcbiAgICogLy8gQ3JlYXRlIGEgY2xpZW50XG4gICAqIGNvbnN0IGNsaWVudFJlc3VsdCA9IGF3YWl0IENsaWVudC5jcmVhdGUoe1xuICAgKiAgIHVzZXJuYW1lOiAneW91cl91c2VybmFtZScsXG4gICAqICAgcGFzc3dvcmQ6ICd5b3VyX3Bhc3N3b3JkJyxcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIFJlc3VsdCB0eXBlIHJlcXVpcmVzIGlzT2soKSBjaGVjayBiZWZvcmUgYWNjZXNzaW5nIC52YWx1ZVxuICAgKiBpZiAoIWNsaWVudFJlc3VsdC5pc09rKCkpIHtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgY2xpZW50Jyk7XG4gICAqIH1cbiAgICogY29uc3QgY2xpZW50ID0gY2xpZW50UmVzdWx0LnZhbHVlO1xuICAgKlxuICAgKiAvLyBOb3cgeW91IGNhbiBhY2Nlc3MgY2xpZW50LnNpdGUsIGV0Yy5cbiAgICogY29uc3Qgc2l0ZVJlc3VsdCA9IGF3YWl0IGNsaWVudC5zaXRlLmdldCgnc2NwLWpwJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBDbGllbnRPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8Q2xpZW50PiB7XG4gICAgY29uc3QgeyB1c2VybmFtZSwgcGFzc3dvcmQsIGRvbWFpbiA9ICd3aWtpZG90LmNvbScsIGFtY0NvbmZpZyA9IHt9IH0gPSBvcHRpb25zO1xuXG4gICAgLy8gQ3JlYXRlIEFNQyBjbGllbnRcbiAgICBjb25zdCBhbWNDbGllbnQgPSBuZXcgQU1DQ2xpZW50KGFtY0NvbmZpZywgZG9tYWluKTtcblxuICAgIC8vIExvZ2luIGlmIGNyZWRlbnRpYWxzIGFyZSBwcm92aWRlZFxuICAgIGlmICh1c2VybmFtZSAmJiBwYXNzd29yZCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoYW1jQ2xpZW50LCBkb21haW4sIHVzZXJuYW1lKTtcbiAgICAgICAgICBjb25zdCBsb2dpblJlc3VsdCA9IGF3YWl0IGxvZ2luKGNsaWVudCwgdXNlcm5hbWUsIHBhc3N3b3JkKTtcbiAgICAgICAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgbG9naW5SZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gR2V0IGxvZ2dlZC1pbiB1c2VyIGluZm9ybWF0aW9uXG4gICAgICAgICAgY29uc3QgdXNlclJlc3VsdCA9IGF3YWl0IFVzZXIuZnJvbU5hbWUoY2xpZW50LCB1c2VybmFtZSk7XG4gICAgICAgICAgaWYgKHVzZXJSZXN1bHQuaXNPaygpICYmIHVzZXJSZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgIGNsaWVudC5fbWUgPSB1c2VyUmVzdWx0LnZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgICAgIH0pKCksXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdW5hdXRoZW50aWNhdGVkIGNsaWVudFxuICAgIHJldHVybiB3ZE9rQXN5bmMobmV3IENsaWVudChhbWNDbGllbnQsIGRvbWFpbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiB1bmF1dGhlbnRpY2F0ZWQgY2xpZW50XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ2xpZW50IG9wdGlvbnMgKGV4Y2x1ZGluZyBjcmVkZW50aWFscylcbiAgICogQHJldHVybnMgQ2xpZW50IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlQW5vbnltb3VzKG9wdGlvbnM6IE9taXQ8Q2xpZW50T3B0aW9ucywgJ3VzZXJuYW1lJyB8ICdwYXNzd29yZCc+ID0ge30pOiBDbGllbnQge1xuICAgIGNvbnN0IHsgZG9tYWluID0gJ3dpa2lkb3QuY29tJywgYW1jQ29uZmlnID0ge30gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYW1jQ2xpZW50ID0gbmV3IEFNQ0NsaWVudChhbWNDb25maWcsIGRvbWFpbik7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoYW1jQ2xpZW50LCBkb21haW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGxvZ2luIHN0YXR1c1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIGxvZ2dlZCBpblxuICAgKi9cbiAgaXNMb2dnZWRJbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcm5hbWUgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWlyZSBsb2dpblxuICAgKiBSZXR1cm5zIExvZ2luUmVxdWlyZWRFcnJvciBpZiBub3QgbG9nZ2VkIGluXG4gICAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2Vzc1xuICAgKi9cbiAgcmVxdWlyZUxvZ2luKCk6IFdpa2lkb3RSZXN1bHQ8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHJldHVybiB3ZEVycihuZXcgTG9naW5SZXF1aXJlZEVycm9yKCkpO1xuICAgIH1cbiAgICByZXR1cm4gd2RPayh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBjbGllbnRcbiAgICogQXR0ZW1wdHMgdG8gbG9nb3V0IGlmIGEgc2Vzc2lvbiBleGlzdHNcbiAgICovXG4gIGNsb3NlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNMb2dnZWRJbigpKSB7XG4gICAgICByZXR1cm4gbG9nb3V0KHRoaXMpLm1hcCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3VzZXJuYW1lID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd2RPa0FzeW5jKHVuZGVmaW5lZCk7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9jbGllbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9mb3J1bSc7XG5leHBvcnQgKiBmcm9tICcuL3BhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9wcml2YXRlLW1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zaXRlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91c2VyJztcbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9wYXJzZXInO1xu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VTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FB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TyxXQUFXLFFBQVEsUUFBUTtBQUFBLFFBQ3JELE1BQU0sY0FBYyxNQUFNLE1BQU0sUUFBUSxVQUFVLFFBQVE7QUFBQSxRQUMxRCxJQUFJLFlBQVksTUFBTSxHQUFHO0FBQUEsVUFDdkIsTUFBTSxZQUFZO0FBQUEsUUFDcEI7QUFBQSxRQUdBLE1BQU0sYUFBYSxNQUFNLEtBQUssU0FBUyxRQUFRLFFBQVE7QUFBQSxRQUN2RCxJQUFJLFdBQVcsS0FBSyxLQUFLLFdBQVcsT0FBTztBQUFBLFVBQ3pDLE9BQU8sTUFBTSxXQUFXO0FBQUEsUUFDMUI7QUFBQSxRQUVBLE9BQU87QUFBQSxTQUNOLEdBQ0gsQ0FBQyxVQUFVO0FBQUEsUUFDVCxJQUFJLGlCQUFpQixvQkFBb0I7QUFBQSxVQUN2QyxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0EsT0FBTyxJQUFJLG1CQUFtQiw0QkFBNEIsT0FBTyxLQUFLLEdBQUc7QUFBQSxPQUU3RTtBQUFBLElBQ0Y7QUFBQSxJQUdBLE9BQU8sVUFBVSxJQUFJLE9BQU8sV0FBVyxNQUFNLENBQUM7QUFBQTtBQUFBLFNBUXpDLGVBQWUsQ0FBQyxVQUF3RCxDQUFDLEdBQVc7QUFBQSxJQUN6RixRQUFRLFNBQVMsZUFBZSxZQUFZLENBQUMsTUFBTTtBQUFBLElBQ25ELE1BQU0sWUFBWSxJQUFJLFVBQVUsV0FBVyxNQUFNO0FBQUEsSUFDakQsT0FBTyxJQUFJLE9BQU8sV0FBVyxNQUFNO0FBQUE7QUFBQSxFQU9yQyxVQUFVLEdBQVk7QUFBQSxJQUNwQixPQUFPLEtBQUssY0FBYztBQUFBO0FBQUEsRUFRNUIsWUFBWSxHQUF3QjtBQUFBLElBQ2xDLElBQUksQ0FBQyxLQUFLLFdBQVcsR0FBRztBQUFBLE1BQ3RCLE9BQU8sTUFBTSxJQUFJLGtCQUFvQjtBQUFBLElBQ3ZDO0FBQUEsSUFDQSxPQUFPLEtBQUssU0FBUztBQUFBO0FBQUEsRUFPdkIsS0FBSyxHQUE2QjtBQUFBLElBQ2hDLElBQUksS0FBSyxXQUFXLEdBQUc7QUFBQSxNQUNyQixPQUFPLE9BQU8sSUFBSSxFQUFFLElBQUksTUFBTTtBQUFBLFFBQzVCLEtBQUssWUFBWTtBQUFBLFFBQ2pCO0FBQUEsT0FDRDtBQUFBLElBQ0g7QUFBQSxJQUNBLE9BQU8sVUFBVSxTQUFTO0FBQUE7QUFFOUI7O0FDbE1BO0FBS0E7O0FDTkE7IiwKICAiZGVidWdJZCI6ICJGREVDRTNFMEZEOTY0NDIwNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
5328
|
+
//# debugId=6EC73883EC0F6B0E64756E2164756E21
|
|
5329
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2NvbW1vbi9lcnJvcnMvYmFzZS50cyIsICJzcmMvY29tbW9uL2Vycm9ycy9hbWMudHMiLCAic3JjL2NvbW1vbi9lcnJvcnMvc2Vzc2lvbi50cyIsICJzcmMvY29tbW9uL2Vycm9ycy90YXJnZXQudHMiLCAic3JjL2NvbW1vbi9lcnJvcnMvaW5kZXgudHMiLCAic3JjL2NvbW1vbi9sb2dnZXIudHMiLCAic3JjL2NvbW1vbi90eXBlcy9yZXN1bHQudHMiLCAic3JjL2NvbW1vbi90eXBlcy9pbmRleC50cyIsICJzcmMvY29ubmVjdG9yL2FtYy1jb25maWcudHMiLCAic3JjL3V0aWwvaHR0cC50cyIsICJzcmMvbW9kdWxlL3VzZXIvYW5vbnltb3VzLXVzZXIudHMiLCAic3JjL21vZHVsZS91c2VyL2RlbGV0ZWQtdXNlci50cyIsICJzcmMvbW9kdWxlL3VzZXIvZ3Vlc3QtdXNlci50cyIsICJzcmMvdXRpbC90YWJsZS9jaGFyLXRhYmxlLnRzIiwgInNyYy91dGlsL3N0cmluZy11dGlsLnRzIiwgInNyYy9tb2R1bGUvdXNlci91c2VyLWNvbGxlY3Rpb24udHMiLCAic3JjL21vZHVsZS91c2VyL3VzZXIudHMiLCAic3JjL21vZHVsZS91c2VyL3dpa2lkb3QtdXNlci50cyIsICJzcmMvbW9kdWxlL3VzZXIvaW5kZXgudHMiLCAic3JjL3V0aWwvcGFyc2VyL3VzZXIudHMiLCAic3JjL3V0aWwvcGFyc2VyL2luZGV4LnRzIiwgInNyYy9jb21tb24vZGVjb3JhdG9ycy50cyIsICJzcmMvbW9kdWxlL2ZvcnVtL2ZvcnVtLXBvc3QtcmV2aXNpb24udHMiLCAic3JjL21vZHVsZS9mb3J1bS9mb3J1bS1wb3N0LnRzIiwgInNyYy9tb2R1bGUvZm9ydW0vZm9ydW0tdGhyZWFkLnRzIiwgInNyYy9tb2R1bGUvZm9ydW0vZm9ydW0tY2F0ZWdvcnkudHMiLCAic3JjL21vZHVsZS9mb3J1bS9pbmRleC50cyIsICJzcmMvaW5kZXgudHMiLCAic3JjL2Nvbm5lY3Rvci9hbWMtY2xpZW50LnRzIiwgInNyYy9jb25uZWN0b3IvYW1jLWhlYWRlci50cyIsICJzcmMvY29ubmVjdG9yL2FtYy10eXBlcy50cyIsICJzcmMvY29ubmVjdG9yL2luZGV4LnRzIiwgInNyYy9jb25uZWN0b3IvYXV0aC50cyIsICJzcmMvbW9kdWxlL3ByaXZhdGUtbWVzc2FnZS9wcml2YXRlLW1lc3NhZ2UudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3BtLWFjY2Vzc29yLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9hY2Nlc3NvcnMvZm9ydW0tYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9zaXRlL2FjY2Vzc29ycy9tZW1iZXItYWNjZXNzb3IudHMiLCAic3JjL3V0aWwvcXVpY2stbW9kdWxlLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9zaXRlLWFwcGxpY2F0aW9uLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9zaXRlLW1lbWJlci50cyIsICJzcmMvbW9kdWxlL3NpdGUvYWNjZXNzb3JzL3BhZ2UtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2UudHMiLCAic3JjL21vZHVsZS9wYWdlL3BhZ2UtZmlsZS50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS1tZXRhLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLXJldmlzaW9uLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9wYWdlLXNvdXJjZS50cyIsICJzcmMvbW9kdWxlL3BhZ2UvcGFnZS12b3RlLnRzIiwgInNyYy9tb2R1bGUvcGFnZS9zZWFyY2gtcXVlcnkudHMiLCAic3JjL21vZHVsZS9wYWdlL3NpdGUtY2hhbmdlLnRzIiwgInNyYy9tb2R1bGUvc2l0ZS9hY2Nlc3NvcnMvcGFnZXMtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9zaXRlL3NpdGUudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3NpdGUtYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9jbGllbnQvYWNjZXNzb3JzL3VzZXItYWNjZXNzb3IudHMiLCAic3JjL21vZHVsZS9jbGllbnQvY2xpZW50LnRzIiwgInNyYy9tb2R1bGUvaW5kZXgudHMiLCAic3JjL3V0aWwvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGZvciB0aGUgV2lraWRvdCBsaWJyYXJ5XG4gKiBBbGwgY3VzdG9tIGVycm9ycyBpbmhlcml0IGZyb20gdGhpcyBjbGFzc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV2lraWRvdEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKiogRXJyb3IgbmFtZSAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgbmV3LnRhcmdldC5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogVW5leHBlY3RlZCBlcnJvclxuICogUmVwcmVzZW50cyBpbnRlcm5hbCBpbmNvbnNpc3RlbmNpZXMgb3IgYnVnc1xuICovXG5leHBvcnQgY2xhc3MgVW5leHBlY3RlZEVycm9yIGV4dGVuZHMgV2lraWRvdEVycm9yIHt9XG4iLAogICAgImltcG9ydCB7IFdpa2lkb3RFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogQmFzZSBlcnJvciBmb3IgQWpheCBNb2R1bGUgQ29ubmVjdG9yIHJlbGF0ZWQgaXNzdWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBBTUNFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIEhUVFAgc3RhdHVzIGNvZGUgZXJyb3JcbiAqIFRocm93biB3aGVuIGFuIEFNQyByZXF1ZXN0IGZhaWxzIHdpdGggYW4gSFRUUCBlcnJvclxuICovXG5leHBvcnQgY2xhc3MgQU1DSHR0cEVycm9yIGV4dGVuZHMgQU1DRXJyb3Ige1xuICAvKiogSFRUUCBzdGF0dXMgY29kZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhdHVzQ29kZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIEVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHN0YXR1c0NvZGUgLSBIVFRQIHN0YXR1cyBjb2RlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1c0NvZGU6IG51bWJlcikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBXaWtpZG90IHN0YXR1cyBjb2RlIGVycm9yXG4gKiBUaHJvd24gd2hlbiBBTUMgcmVzcG9uc2Ugc3RhdHVzIGlzIG5vdCBva1xuICovXG5leHBvcnQgY2xhc3MgV2lraWRvdFN0YXR1c0Vycm9yIGV4dGVuZHMgQU1DRXJyb3Ige1xuICAvKiogV2lraWRvdCBzdGF0dXMgY29kZSBzdHJpbmcgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0NvZGU6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXG4gICAqIEBwYXJhbSBzdGF0dXNDb2RlIC0gU3RhdHVzIGNvZGUgKGUuZy4sICdub3Rfb2snLCAndHJ5X2FnYWluJylcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzQ29kZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc3BvbnNlIGRhdGEgZXJyb3JcbiAqIFRocm93biB3aGVuIHJlc3BvbnNlIHBhcnNpbmcgZmFpbHNcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc3BvbnNlRGF0YUVycm9yIGV4dGVuZHMgQU1DRXJyb3Ige31cbiIsCiAgICAiaW1wb3J0IHsgV2lraWRvdEVycm9yIH0gZnJvbSAnLi9iYXNlJztcblxuLyoqXG4gKiBCYXNlIGVycm9yIGZvciBzZXNzaW9uIHJlbGF0ZWQgaXNzdWVzXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXNzaW9uRXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBTZXNzaW9uIGNyZWF0aW9uIGZhaWx1cmUgZXJyb3JcbiAqIFRocm93biB3aGVuIGEgbG9naW4gYXR0ZW1wdCBmYWlsc1xuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbkNyZWF0ZUVycm9yIGV4dGVuZHMgU2Vzc2lvbkVycm9yIHt9XG5cbi8qKlxuICogTG9naW4gcmVxdWlyZWQgZXJyb3JcbiAqIFRocm93biB3aGVuIGFuIGF1dGhlbnRpY2F0ZWQgb3BlcmF0aW9uIGlzIGF0dGVtcHRlZCB3aXRob3V0IGxvZ2luXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dpblJlcXVpcmVkRXJyb3IgZXh0ZW5kcyBTZXNzaW9uRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ0xvZ2luIGlzIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbicpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgeyBXaWtpZG90RXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuXG4vKipcbiAqIFJlc291cmNlIG5vdCBmb3VuZCBlcnJvclxuICogVGhyb3duIHdoZW4gdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBkb2VzIG5vdCBleGlzdFxuICovXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBSZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBlcnJvclxuICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBjcmVhdGUgYSByZXNvdXJjZSB0aGF0IGFscmVhZHkgZXhpc3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRFeGlzdHNFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIFRhcmdldCBzdGF0ZSBlcnJvclxuICogVGhyb3duIHdoZW4gYSByZXNvdXJjZSBpcyBpbiBhbiBpbm9wZXJhYmxlIHN0YXRlIChlLmcuLCBsb2NrZWQpXG4gKi9cbmV4cG9ydCBjbGFzcyBUYXJnZXRFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuXG4vKipcbiAqIEFjY2VzcyBkZW5pZWQgZXJyb3JcbiAqIFRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBkZW5pZWQgZHVlIHRvIGluc3VmZmljaWVudCBwZXJtaXNzaW9uc1xuICovXG5leHBvcnQgY2xhc3MgRm9yYmlkZGVuRXJyb3IgZXh0ZW5kcyBXaWtpZG90RXJyb3Ige31cblxuLyoqXG4gKiBIVE1MIGVsZW1lbnQgbm90IGZvdW5kIGVycm9yXG4gKiBUaHJvd24gd2hlbiBhIHJlcXVpcmVkIGVsZW1lbnQgaXMgbm90IGZvdW5kIGR1cmluZyBwYXJzaW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBOb0VsZW1lbnRFcnJvciBleHRlbmRzIFdpa2lkb3RFcnJvciB7fVxuIiwKICAgICIvLyBCYXNlIGVycm9yc1xuXG4vLyBBTUMgZXJyb3JzXG5leHBvcnQgeyBBTUNFcnJvciwgQU1DSHR0cEVycm9yLCBSZXNwb25zZURhdGFFcnJvciwgV2lraWRvdFN0YXR1c0Vycm9yIH0gZnJvbSAnLi9hbWMnO1xuZXhwb3J0IHsgVW5leHBlY3RlZEVycm9yLCBXaWtpZG90RXJyb3IgfSBmcm9tICcuL2Jhc2UnO1xuLy8gU2Vzc2lvbiBlcnJvcnNcbmV4cG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciwgU2Vzc2lvbkNyZWF0ZUVycm9yLCBTZXNzaW9uRXJyb3IgfSBmcm9tICcuL3Nlc3Npb24nO1xuXG4vLyBUYXJnZXQgZXJyb3JzXG5leHBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTm9FbGVtZW50RXJyb3IsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxuICBUYXJnZXRFcnJvcixcbiAgVGFyZ2V0RXhpc3RzRXJyb3IsXG59IGZyb20gJy4vdGFyZ2V0JztcbiIsCiAgICAiLyoqXG4gKiBNb2R1bGUgcHJvdmlkaW5nIGxvZ2dpbmcgZnVuY3Rpb25hbGl0eVxuICpcbiAqIFRoaXMgbW9kdWxlIGNvbmZpZ3VyZXMgYW5kIHByb3ZpZGVzIGxvZ2dlcnMgdXNlZCB0aHJvdWdob3V0IHRoZSBsaWJyYXJ5LlxuICogQnkgZGVmYXVsdCwgaXQgZG9lcyBub3Qgb3V0cHV0IGFueXRoaW5nLCBhbGxvd2luZyBhcHBsaWNhdGlvbi1zaWRlIGxvZyBjb250cm9sLlxuICovXG5cbi8qKlxuICogTG9nIGxldmVsXG4gKi9cbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvcic7XG5cbi8qKlxuICogTG9nIGxldmVsIHByaW9yaXR5IChoaWdoZXIgbnVtYmVyID0gbW9yZSBpbXBvcnRhbnQpXG4gKi9cbmNvbnN0IExPR19MRVZFTF9QUklPUklUWTogUmVjb3JkPExvZ0xldmVsLCBudW1iZXI+ID0ge1xuICBkZWJ1ZzogMCxcbiAgaW5mbzogMSxcbiAgd2FybjogMixcbiAgZXJyb3I6IDMsXG59O1xuXG4vKipcbiAqIExvZ2dlciBoYW5kbGVyXG4gKi9cbmV4cG9ydCB0eXBlIExvZ0hhbmRsZXIgPSAoXG4gIGxldmVsOiBMb2dMZXZlbCxcbiAgbmFtZTogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIC4uLmFyZ3M6IHVua25vd25bXVxuKSA9PiB2b2lkO1xuXG4vKipcbiAqIE51bGxIYW5kbGVyOiBPdXRwdXRzIG5vdGhpbmcgKGRlZmF1bHQpXG4gKi9cbmV4cG9ydCBjb25zdCBudWxsSGFuZGxlcjogTG9nSGFuZGxlciA9ICgpID0+IHtcbiAgLy8gRG8gbm90aGluZ1xufTtcblxuLyoqXG4gKiBDb25zb2xlSGFuZGxlcjogT3V0cHV0cyB0byBjb25zb2xlXG4gKi9cbmV4cG9ydCBjb25zdCBjb25zb2xlSGFuZGxlcjogTG9nSGFuZGxlciA9IChcbiAgbGV2ZWw6IExvZ0xldmVsLFxuICBuYW1lOiBzdHJpbmcsXG4gIG1lc3NhZ2U6IHN0cmluZyxcbiAgLi4uYXJnczogdW5rbm93bltdXG4pID0+IHtcbiAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICBjb25zdCBmb3JtYXR0ZWRNZXNzYWdlID0gYCR7dGltZXN0YW1wfSBbJHtuYW1lfS8ke2xldmVsLnRvVXBwZXJDYXNlKCl9XSAke21lc3NhZ2V9YDtcblxuICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgY2FzZSAnZGVidWcnOlxuICAgICAgY29uc29sZS5kZWJ1Zyhmb3JtYXR0ZWRNZXNzYWdlLCAuLi5hcmdzKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2luZm8nOlxuICAgICAgY29uc29sZS5pbmZvKGZvcm1hdHRlZE1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnd2Fybic6XG4gICAgICBjb25zb2xlLndhcm4oZm9ybWF0dGVkTWVzc2FnZSwgLi4uYXJncyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlcnJvcic6XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdHRlZE1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgICAgYnJlYWs7XG4gIH1cbn07XG5cbi8qKlxuICogTG9nZ2VyIGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBoYW5kbGVyOiBMb2dIYW5kbGVyO1xuICBwcml2YXRlIGxldmVsOiBMb2dMZXZlbDtcblxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IExvZ0hhbmRsZXIgPSBudWxsSGFuZGxlciwgbGV2ZWw6IExvZ0xldmVsID0gJ3dhcm4nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgaGFuZGxlclxuICAgKi9cbiAgc2V0SGFuZGxlcihoYW5kbGVyOiBMb2dIYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbG9nIGxldmVsXG4gICAqL1xuICBzZXRMZXZlbChsZXZlbDogTG9nTGV2ZWwpOiB2b2lkIHtcbiAgICB0aGlzLmxldmVsID0gbGV2ZWw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBsZXZlbCBzaG91bGQgYmUgbG9nZ2VkXG4gICAqL1xuICBwcml2YXRlIHNob3VsZExvZyhsZXZlbDogTG9nTGV2ZWwpOiBib29sZWFuIHtcbiAgICByZXR1cm4gTE9HX0xFVkVMX1BSSU9SSVRZW2xldmVsXSA+PSBMT0dfTEVWRUxfUFJJT1JJVFlbdGhpcy5sZXZlbF07XG4gIH1cblxuICAvKipcbiAgICogT3V0cHV0IGxvZ1xuICAgKi9cbiAgcHJpdmF0ZSBsb2cobGV2ZWw6IExvZ0xldmVsLCBtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3VsZExvZyhsZXZlbCkpIHtcbiAgICAgIHRoaXMuaGFuZGxlcihsZXZlbCwgdGhpcy5uYW1lLCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdkZWJ1ZycsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICB9XG5cbiAgaW5mbyhtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMubG9nKCdpbmZvJywgbWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cblxuICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ3dhcm4nLCBtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5sb2coJ2Vycm9yJywgbWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgbG9nZ2VyXG4gKiBAcGFyYW0gbmFtZSAtIExvZ2dlciBuYW1lIChkZWZhdWx0OiBcIndpa2lkb3RcIilcbiAqIEByZXR1cm5zIExvZ2dlciBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9nZ2VyKG5hbWUgPSAnd2lraWRvdCcpOiBMb2dnZXIge1xuICByZXR1cm4gbmV3IExvZ2dlcihuYW1lKTtcbn1cblxuLyoqXG4gKiBTZXR1cCBjb25zb2xlIG91dHB1dCBoYW5kbGVyXG4gKiBAcGFyYW0gbG9nZ2VyIC0gTG9nZ2VyIHRvIGNvbmZpZ3VyZVxuICogQHBhcmFtIGxldmVsIC0gTG9nIGxldmVsIChkZWZhdWx0OiBcIndhcm5cIilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwQ29uc29sZUhhbmRsZXIobG9nZ2VyOiBMb2dnZXIsIGxldmVsOiBMb2dMZXZlbCA9ICd3YXJuJyk6IHZvaWQge1xuICBsb2dnZXIuc2V0SGFuZGxlcihjb25zb2xlSGFuZGxlcik7XG4gIGxvZ2dlci5zZXRMZXZlbChsZXZlbCk7XG59XG5cbi8qKlxuICogRGVmYXVsdCBsb2dnZXIgdXNlZCB0aHJvdWdob3V0IHRoZSBwYWNrYWdlXG4gKi9cbmV4cG9ydCBjb25zdCBsb2dnZXI6IExvZ2dlciA9IGdldExvZ2dlcigpO1xuIiwKICAgICJpbXBvcnQgeyBlcnIsIGVyckFzeW5jLCBvaywgb2tBc3luYywgdHlwZSBSZXN1bHQsIFJlc3VsdEFzeW5jIH0gZnJvbSAnbmV2ZXJ0aHJvdyc7XG5pbXBvcnQgdHlwZSB7IFdpa2lkb3RFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8qKiBTeW5jaHJvbm91cyBSZXN1bHQgdHlwZSBhbGlhcyAqL1xuZXhwb3J0IHR5cGUgV2lraWRvdFJlc3VsdDxUPiA9IFJlc3VsdDxULCBXaWtpZG90RXJyb3I+O1xuXG4vKiogQXN5bmNocm9ub3VzIFJlc3VsdCB0eXBlIGFsaWFzICovXG5leHBvcnQgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmM8VD4gPSBSZXN1bHRBc3luYzxULCBXaWtpZG90RXJyb3I+O1xuXG4vKiogQ3JlYXRlIHN1Y2Nlc3MgUmVzdWx0ICovXG5leHBvcnQgY29uc3Qgd2RPayA9IDxUPih2YWx1ZTogVCk6IFdpa2lkb3RSZXN1bHQ8VD4gPT4gb2sodmFsdWUpO1xuXG4vKiogQ3JlYXRlIGVycm9yIFJlc3VsdCAqL1xuZXhwb3J0IGNvbnN0IHdkRXJyID0gPEUgZXh0ZW5kcyBXaWtpZG90RXJyb3I+KGVycm9yOiBFKTogV2lraWRvdFJlc3VsdDxuZXZlcj4gPT4gZXJyKGVycm9yKTtcblxuLyoqIENyZWF0ZSBzdWNjZXNzIFJlc3VsdEFzeW5jICovXG5leHBvcnQgY29uc3Qgd2RPa0FzeW5jID0gPFQ+KHZhbHVlOiBUKTogV2lraWRvdFJlc3VsdEFzeW5jPFQ+ID0+IG9rQXN5bmModmFsdWUpO1xuXG4vKiogQ3JlYXRlIGVycm9yIFJlc3VsdEFzeW5jICovXG5leHBvcnQgY29uc3Qgd2RFcnJBc3luYyA9IDxFIGV4dGVuZHMgV2lraWRvdEVycm9yPihlcnJvcjogRSk6IFdpa2lkb3RSZXN1bHRBc3luYzxuZXZlcj4gPT5cbiAgZXJyQXN5bmMoZXJyb3IpO1xuXG4vKiogQ29udmVydCBmcm9tIFByb21pc2UgKi9cbmV4cG9ydCBjb25zdCBmcm9tUHJvbWlzZSA9IDxUPihcbiAgcHJvbWlzZTogUHJvbWlzZTxUPixcbiAgZXJyb3JNYXBwZXI6IChlcnJvcjogdW5rbm93bikgPT4gV2lraWRvdEVycm9yXG4pOiBXaWtpZG90UmVzdWx0QXN5bmM8VD4gPT4gUmVzdWx0QXN5bmMuZnJvbVByb21pc2UocHJvbWlzZSwgZXJyb3JNYXBwZXIpO1xuXG4vKiogQ29tYmluZSBtdWx0aXBsZSBSZXN1bHRBc3luYyAqL1xuZXhwb3J0IGNvbnN0IGNvbWJpbmVSZXN1bHRzID0gPFQ+KHJlc3VsdHM6IFdpa2lkb3RSZXN1bHRBc3luYzxUPltdKTogV2lraWRvdFJlc3VsdEFzeW5jPFRbXT4gPT5cbiAgUmVzdWx0QXN5bmMuY29tYmluZShyZXN1bHRzKTtcbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9jb21tb24nO1xuZXhwb3J0ICogZnJvbSAnLi9yZXN1bHQnO1xuIiwKICAgICIvKipcbiAqIEFqYXggTW9kdWxlIENvbm5lY3RvciBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQU1DQ29uZmlnIHtcbiAgLyoqIFJlcXVlc3QgdGltZW91dCAobWlsbGlzZWNvbmRzKSAqL1xuICB0aW1lb3V0OiBudW1iZXI7XG5cbiAgLyoqIE1heGltdW0gcmV0cnkgY291bnQgKi9cbiAgcmV0cnlMaW1pdDogbnVtYmVyO1xuXG4gIC8qKiBCYXNlIHJldHJ5IGludGVydmFsIChtaWxsaXNlY29uZHMpICovXG4gIHJldHJ5SW50ZXJ2YWw6IG51bWJlcjtcblxuICAvKiogTWF4aW11bSBiYWNrb2ZmIChtaWxsaXNlY29uZHMpICovXG4gIG1heEJhY2tvZmY6IG51bWJlcjtcblxuICAvKiogQmFja29mZiBmYWN0b3IgKi9cbiAgYmFja29mZkZhY3RvcjogbnVtYmVyO1xuXG4gIC8qKiBNYXhpbXVtIGNvbmN1cnJlbnQgcmVxdWVzdHMgKi9cbiAgc2VtYXBob3JlTGltaXQ6IG51bWJlcjtcblxuICAvKiogQmF0Y2ggc2l6ZSBmb3IgYW1jUmVxdWVzdFdpdGhSZXRyeSAqL1xuICByZXRyeUJhdGNoU2l6ZTogbnVtYmVyO1xuXG4gIC8qKiBNYXhpbXVtIHJldHJ5IGF0dGVtcHRzIGZvciBhbWNSZXF1ZXN0V2l0aFJldHJ5ICovXG4gIHJldHJ5TWF4UmV0cmllczogbnVtYmVyO1xufVxuXG4vKiogRGVmYXVsdCBBTUMgY29uZmlndXJhdGlvbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfQU1DX0NPTkZJRzogQU1DQ29uZmlnID0ge1xuICB0aW1lb3V0OiAyMDAwMCxcbiAgcmV0cnlMaW1pdDogNSxcbiAgcmV0cnlJbnRlcnZhbDogMTAwMCxcbiAgbWF4QmFja29mZjogNjAwMDAsXG4gIGJhY2tvZmZGYWN0b3I6IDIuMCxcbiAgc2VtYXBob3JlTGltaXQ6IDEwLFxuICByZXRyeUJhdGNoU2l6ZTogNTAsXG4gIHJldHJ5TWF4UmV0cmllczogMyxcbn07XG5cbi8qKlxuICogRml4ZWQgdG9rZW4gdmFsdWUgcmVxdWlyZWQgYnkgV2lraWRvdFxuICogVGhpcyBpcyBhIGZpeGVkIHZhbHVlIG9idGFpbmVkIGZyb20gV2lraWRvdCdzIGZyb250ZW5kLFxuICogdXNlZCBhcyBhbiBpZGVudGlmaWVyIHJhdGhlciB0aGFuIGEgc2VjdXJpdHkgdG9rZW5cbiAqL1xuZXhwb3J0IGNvbnN0IFdJS0lET1RfVE9LRU43ID0gJzEyMzQ1Nic7XG5cbi8qKlxuICogRmFsbGJhY2sgSFRUUCBzdGF0dXMgY29kZSBmb3IgSFRUUCBlcnJvcnNcbiAqIFVzZWQgd2hlbiBzdGF0dXMgY29kZSBjYW5ub3QgYmUgcmV0cmlldmVkIGZyb20gcmVzcG9uc2VcbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSFRUUF9TVEFUVVNfQ09ERSA9IDk5OTtcbiIsCiAgICAiLyoqXG4gKiBIVFRQIHV0aWxpdGllcyB3aXRoIHJldHJ5IG1lY2hhbmlzbVxuICovXG5pbXBvcnQgdHlwZSB7IEFNQ0NvbmZpZyB9IGZyb20gJy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcbmltcG9ydCB7IERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcblxuLyoqXG4gKiBDYWxjdWxhdGUgYmFja29mZiB0aW1lIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiBhbmQgaml0dGVyXG4gKiBAcGFyYW0gcmV0cnlDb3VudCAtIEN1cnJlbnQgcmV0cnkgY291bnQgKDEtYmFzZWQpXG4gKiBAcGFyYW0gYmFzZUludGVydmFsIC0gQmFzZSBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHNcbiAqIEBwYXJhbSBiYWNrb2ZmRmFjdG9yIC0gRXhwb25lbnRpYWwgYmFja29mZiBmYWN0b3JcbiAqIEBwYXJhbSBtYXhCYWNrb2ZmIC0gTWF4aW11bSBiYWNrb2ZmIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyBCYWNrb2ZmIHRpbWUgaW4gbWlsbGlzZWNvbmRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVCYWNrb2ZmKFxuICByZXRyeUNvdW50OiBudW1iZXIsXG4gIGJhc2VJbnRlcnZhbDogbnVtYmVyLFxuICBiYWNrb2ZmRmFjdG9yOiBudW1iZXIsXG4gIG1heEJhY2tvZmY6IG51bWJlclxuKTogbnVtYmVyIHtcbiAgY29uc3QgYmFja29mZiA9IGJhc2VJbnRlcnZhbCAqIGJhY2tvZmZGYWN0b3IgKiogKHJldHJ5Q291bnQgLSAxKTtcbiAgY29uc3Qgaml0dGVyID0gTWF0aC5yYW5kb20oKSAqIGJhY2tvZmYgKiAwLjE7XG4gIHJldHVybiBNYXRoLm1pbihiYWNrb2ZmICsgaml0dGVyLCBtYXhCYWNrb2ZmKTtcbn1cblxuLyoqXG4gKiBTbGVlcCBmb3Igc3BlY2lmaWVkIG1pbGxpc2Vjb25kc1xuICovXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGZldGNoV2l0aFJldHJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hXaXRoUmV0cnlPcHRpb25zIGV4dGVuZHMgT21pdDxSZXF1ZXN0SW5pdCwgJ3NpZ25hbCc+IHtcbiAgLyoqIFdoZXRoZXIgdG8gY2hlY2sgcmVzcG9uc2Uub2sgKGRlZmF1bHQ6IHRydWUpICovXG4gIGNoZWNrT2s/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIEhUVFAgc3RhdHVzIGNvZGUgaXMgcmV0cnlhYmxlICg1eHggc2VydmVyIGVycm9ycylcbiAqL1xuZnVuY3Rpb24gaXNSZXRyeWFibGVTdGF0dXMoc3RhdHVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHN0YXR1cyA+PSA1MDAgJiYgc3RhdHVzIDwgNjAwO1xufVxuXG4vKipcbiAqIEZldGNoIHdpdGggYXV0b21hdGljIHJldHJ5IG9uIHRpbWVvdXQvbmV0d29yayBlcnJvcnMgYW5kIDV4eCBlcnJvcnNcbiAqIEBwYXJhbSB1cmwgLSBVUkwgdG8gZmV0Y2hcbiAqIEBwYXJhbSBjb25maWcgLSBBTUMgY29uZmlndXJhdGlvbiAodXNlcyB0aW1lb3V0LCByZXRyeUxpbWl0LCByZXRyeUludGVydmFsLCBtYXhCYWNrb2ZmLCBiYWNrb2ZmRmFjdG9yKVxuICogQHBhcmFtIG9wdGlvbnMgLSBGZXRjaCBvcHRpb25zIChSZXF1ZXN0SW5pdCB3aXRob3V0IHNpZ25hbClcbiAqIEByZXR1cm5zIFJlc3BvbnNlXG4gKiBAdGhyb3dzIEVycm9yIG9uIGFsbCByZXRyaWVzIGV4aGF1c3RlZCBvciBub24tcmV0cnlhYmxlIGVycm9ycyAoNHh4KVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmV0Y2hXaXRoUmV0cnkoXG4gIHVybDogc3RyaW5nLFxuICBjb25maWc6IEFNQ0NvbmZpZyA9IERFRkFVTFRfQU1DX0NPTkZJRyxcbiAgb3B0aW9uczogRmV0Y2hXaXRoUmV0cnlPcHRpb25zID0ge31cbik6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgeyBjaGVja09rID0gdHJ1ZSwgLi4uZmV0Y2hPcHRpb25zIH0gPSBvcHRpb25zO1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgY29uZmlnLnJldHJ5TGltaXQ7IGF0dGVtcHQrKykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAuLi5mZXRjaE9wdGlvbnMsXG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dChjb25maWcudGltZW91dCksXG4gICAgICB9KTtcblxuICAgICAgLy8gRG9uJ3QgcmV0cnkgNHh4IGVycm9ycyAtIHRoZXkgYXJlIGNsaWVudCBlcnJvcnMgdGhhdCB3b24ndCBjaGFuZ2Ugb24gcmV0cnlcbiAgICAgIGlmIChjaGVja09rICYmICFyZXNwb25zZS5vaykge1xuICAgICAgICBpZiAoIWlzUmV0cnlhYmxlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNXh4IGVycm9ycyBhcmUgcmV0cnlhYmxlLCBjb250aW51ZSB0byByZXRyeSBsb2dpYyBiZWxvd1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9OiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIERvbid0IHJldHJ5IGlmIGl0J3MgYSBub24tcmV0cnlhYmxlIEhUVFAgZXJyb3IgKDR4eClcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2Uuc3RhcnRzV2l0aCgnSFRUUCA0JykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBpZiAoYXR0ZW1wdCA+PSBjb25maWcucmV0cnlMaW1pdCAtIDEpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrb2ZmID0gY2FsY3VsYXRlQmFja29mZihcbiAgICAgICAgYXR0ZW1wdCArIDEsXG4gICAgICAgIGNvbmZpZy5yZXRyeUludGVydmFsLFxuICAgICAgICBjb25maWcuYmFja29mZkZhY3RvcixcbiAgICAgICAgY29uZmlnLm1heEJhY2tvZmZcbiAgICAgICk7XG4gICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZScpO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENsaWVudFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyLCBVc2VyVHlwZSB9IGZyb20gJy4vYWJzdHJhY3QtdXNlcic7XG5cbi8qKlxuICogQW5vbnltb3VzIHVzZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFub255bW91c1VzZXIgaW1wbGVtZW50cyBBYnN0cmFjdFVzZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnRSZWY7XG5cbiAgLyoqIFVzZXIgSUQgKDAgZm9yIGFub255bW91cykgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXIgPSAwO1xuXG4gIC8qKiBVc2VybmFtZSAoXCJBbm9ueW1vdXNcIiBmb3IgYW5vbnltb3VzIHVzZXJzKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gJ0Fub255bW91cyc7XG5cbiAgLyoqIFVOSVggZm9ybWF0IHVzZXJuYW1lICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nID0gJ2Fub255bW91cyc7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG51bGwgZm9yIGFub255bW91cykgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF2YXRhclVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIElQIGFkZHJlc3MgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwOiBzdHJpbmc7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ2Fub255bW91cyc7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnRSZWYsIGlwOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlwID0gaXA7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXIgaW1wbGVtZW50YXRpb25cbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0Fub255bW91c1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzV2lraWRvdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEFub255bW91c1VzZXIobmFtZT0ke3RoaXMubmFtZX0sIHVuaXhOYW1lPSR7dGhpcy51bml4TmFtZX0sIGlwPSR7dGhpcy5pcH0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENsaWVudFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyLCBVc2VyVHlwZSB9IGZyb20gJy4vYWJzdHJhY3QtdXNlcic7XG5cbi8qKlxuICogRGVsZXRlZCB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWxldGVkVXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogRGVsZXRlZCB1c2VyIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBVc2VybmFtZSAoXCJhY2NvdW50IGRlbGV0ZWRcIiBmb3IgZGVsZXRlZCB1c2VycykgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyA9ICdhY2NvdW50IGRlbGV0ZWQnO1xuXG4gIC8qKiBVTklYIGZvcm1hdCB1c2VybmFtZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdW5peE5hbWU6IHN0cmluZyA9ICdhY2NvdW50X2RlbGV0ZWQnO1xuXG4gIC8qKiBBdmF0YXIgVVJMIChudWxsIGZvciBkZWxldGVkKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAobnVsbCBmb3IgZGVsZXRlZCkgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlwOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogVXNlciB0eXBlICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyVHlwZTogVXNlclR5cGUgPSAnZGVsZXRlZCc7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnRSZWYsIGlkOiBudW1iZXIpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlkID0gaWQ7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXIgaW1wbGVtZW50YXRpb25cbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlzQW5vbnltb3VzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzV2lraWRvdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYERlbGV0ZWRVc2VyKGlkPSR7dGhpcy5pZH0sIG5hbWU9JHt0aGlzLm5hbWV9LCB1bml4TmFtZT0ke3RoaXMudW5peE5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDbGllbnRSZWYgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciwgVXNlclR5cGUgfSBmcm9tICcuL2Fic3RyYWN0LXVzZXInO1xuXG4vKipcbiAqIEd1ZXN0IHVzZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEd1ZXN0VXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogVXNlciBJRCAoMCBmb3IgZ3Vlc3QpICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyID0gMDtcblxuICAvKiogR3Vlc3QgbmFtZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBVTklYIGZvcm1hdCB1c2VybmFtZSAobnVsbCBmb3IgZ3Vlc3QpICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG1heSBiZSBHcmF2YXRhcikgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF2YXRhclVybDogc3RyaW5nIHwgbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAobnVsbCBmb3IgZ3Vlc3QpICovXG4gIHB1YmxpYyByZWFkb25seSBpcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ2d1ZXN0JztcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudFJlZiwgbmFtZTogc3RyaW5nLCBhdmF0YXJVcmw6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmF2YXRhclVybCA9IGF2YXRhclVybDtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlciBpbXBsZW1lbnRhdGlvblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzRGVsZXRlZFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzQW5vbnltb3VzVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNHdWVzdFVzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgR3Vlc3RVc2VyKG5hbWU9JHt0aGlzLm5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiLyoqXG4gKiBNYXBwaW5nIHRhYmxlIGZvciBjb252ZXJ0aW5nIHNwZWNpYWwgc3ltYm9scyBhbmQgbm9uLUVuZ2xpc2ggYWxwaGFiZXRzIHRvIEVuZ2xpc2ggYWxwaGFiZXRzXG4gKlxuICogUHJvdmlkZXMgbWFwcGluZyBmb3IgY29udmVydGluZyBub24tQVNDSUkgY2hhcmFjdGVycyB0byBjb3JyZXNwb25kaW5nIEFTQ0lJIGNoYXJhY3RlcnMuXG4gKiBNYWlubHkgdXNlZCBmb3IgVVJMIGdlbmVyYXRpb24gYW5kIHBhZ2UgbmFtZSBjb252ZXJzaW9uIHRvIHVuaXggZm9ybWF0LlxuICovXG5cbmV4cG9ydCBjb25zdCBzcGVjaWFsQ2hhck1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ1xcdTAwQzAnOiAnYScsXG4gICdcXHUwMEMxJzogJ2EnLFxuICAnXFx1MDBDMic6ICdhJyxcbiAgJ1xcdTAwQzMnOiAnYScsXG4gICdcXHUwMEM0JzogJ2FlJyxcbiAgJ1xcdTAwQzUnOiAnYScsXG4gICdcXHUwMEM2JzogJ2FlJyxcbiAgJ1xcdTAwQzcnOiAnYycsXG4gICdcXHUwMEM4JzogJ2UnLFxuICAnXFx1MDBDOSc6ICdlJyxcbiAgJ1xcdTAwQ0EnOiAnZScsXG4gICdcXHUwMENCJzogJ2UnLFxuICAnXFx1MDBDQyc6ICdpJyxcbiAgJ1xcdTAwQ0QnOiAnaScsXG4gICdcXHUwMENFJzogJ2knLFxuICAnXFx1MDBDRic6ICdpJyxcbiAgJ1xcdTAwRDAnOiAnZCcsXG4gICdcXHUwMEQxJzogJ24nLFxuICAnXFx1MDBEMic6ICdvJyxcbiAgJ1xcdTAwRDMnOiAnbycsXG4gICdcXHUwMEQ0JzogJ28nLFxuICAnXFx1MDBENSc6ICdvJyxcbiAgJ1xcdTAwRDYnOiAnb2UnLFxuICAnXFx1MDBEOCc6ICdvJyxcbiAgJ1xcdTAwRDknOiAndScsXG4gICdcXHUwMERBJzogJ3UnLFxuICAnXFx1MDBEQic6ICd1JyxcbiAgJ1xcdTAwREMnOiAndWUnLFxuICAnXFx1MDBERCc6ICd5JyxcbiAgJ1xcdTAwREUnOiAndCcsXG4gICdcXHUwMERGJzogJ3NzJyxcbiAgJ1xcdTAwRTAnOiAnYScsXG4gICdcXHUwMEUxJzogJ2EnLFxuICAnXFx1MDBFMic6ICdhJyxcbiAgJ1xcdTAwRTMnOiAnYScsXG4gICdcXHUwMEU0JzogJ2FlJyxcbiAgJ1xcdTAwRTUnOiAnYScsXG4gICdcXHUwMEU2JzogJ2FlJyxcbiAgJ1xcdTAwRTcnOiAnYycsXG4gICdcXHUwMEU4JzogJ2UnLFxuICAnXFx1MDBFOSc6ICdlJyxcbiAgJ1xcdTAwRUEnOiAnZScsXG4gICdcXHUwMEVCJzogJ2UnLFxuICAnXFx1MDBFQyc6ICdpJyxcbiAgJ1xcdTAwRUQnOiAnaScsXG4gICdcXHUwMEVFJzogJ2knLFxuICAnXFx1MDBFRic6ICdpJyxcbiAgJ1xcdTAwRjAnOiAnZCcsXG4gICdcXHUwMEYxJzogJ24nLFxuICAnXFx1MDBGMic6ICdvJyxcbiAgJ1xcdTAwRjMnOiAnbycsXG4gICdcXHUwMEY0JzogJ28nLFxuICAnXFx1MDBGNSc6ICdvJyxcbiAgJ1xcdTAwRjYnOiAnb2UnLFxuICAnXFx1MDBGOCc6ICdvJyxcbiAgJ1xcdTAwRjknOiAndScsXG4gICdcXHUwMEZBJzogJ3UnLFxuICAnXFx1MDBGQic6ICd1JyxcbiAgJ1xcdTAwRkMnOiAndWUnLFxuICAnXFx1MDBGRCc6ICd5JyxcbiAgJ1xcdTAwRkUnOiAndCcsXG4gICdcXHUwMEZGJzogJ3knLFxuICAnXFx1MDEwMCc6ICdhJyxcbiAgJ1xcdTAxMDEnOiAnYScsXG4gICdcXHUwMTAyJzogJ2EnLFxuICAnXFx1MDEwMyc6ICdhJyxcbiAgJ1xcdTAxMDQnOiAnYScsXG4gICdcXHUwMTA1JzogJ2EnLFxuICAnXFx1MDEwNic6ICdjJyxcbiAgJ1xcdTAxMDcnOiAnYycsXG4gICdcXHUwMTA4JzogJ2MnLFxuICAnXFx1MDEwOSc6ICdjJyxcbiAgJ1xcdTAxMEEnOiAnYycsXG4gICdcXHUwMTBCJzogJ2MnLFxuICAnXFx1MDEwQyc6ICdjJyxcbiAgJ1xcdTAxMEQnOiAnYycsXG4gICdcXHUwMTBFJzogJ2QnLFxuICAnXFx1MDEwRic6ICdkJyxcbiAgJ1xcdTAxMTAnOiAnZCcsXG4gICdcXHUwMTExJzogJ2QnLFxuICAnXFx1MDExMic6ICdlJyxcbiAgJ1xcdTAxMTMnOiAnZScsXG4gICdcXHUwMTE0JzogJ2UnLFxuICAnXFx1MDExNSc6ICdlJyxcbiAgJ1xcdTAxMTYnOiAnZScsXG4gICdcXHUwMTE3JzogJ2UnLFxuICAnXFx1MDExOCc6ICdlJyxcbiAgJ1xcdTAxMTknOiAnZScsXG4gICdcXHUwMTFBJzogJ2UnLFxuICAnXFx1MDExQic6ICdlJyxcbiAgJ1xcdTAxMUMnOiAnZycsXG4gICdcXHUwMTFEJzogJ2cnLFxuICAnXFx1MDExRSc6ICdnJyxcbiAgJ1xcdTAxMUYnOiAnZycsXG4gICdcXHUwMTIwJzogJ2cnLFxuICAnXFx1MDEyMSc6ICdnJyxcbiAgJ1xcdTAxMjInOiAnZycsXG4gICdcXHUwMTIzJzogJ2cnLFxuICAnXFx1MDEyNCc6ICdoJyxcbiAgJ1xcdTAxMjUnOiAnaCcsXG4gICdcXHUwMTI2JzogJ2gnLFxuICAnXFx1MDEyNyc6ICdoJyxcbiAgJ1xcdTAxMjgnOiAnaScsXG4gICdcXHUwMTI5JzogJ2knLFxuICAnXFx1MDEyQSc6ICdpJyxcbiAgJ1xcdTAxMkInOiAnaScsXG4gICdcXHUwMTJDJzogJ2knLFxuICAnXFx1MDEyRCc6ICdpJyxcbiAgJ1xcdTAxMkUnOiAnaScsXG4gICdcXHUwMTJGJzogJ2knLFxuICAnXFx1MDEzMCc6ICdpJyxcbiAgJ1xcdTAxMzEnOiAnaScsXG4gICdcXHUwMTMyJzogJ2lqJyxcbiAgJ1xcdTAxMzMnOiAnaWonLFxuICAnXFx1MDEzNCc6ICdqJyxcbiAgJ1xcdTAxMzUnOiAnaicsXG4gICdcXHUwMTM2JzogJ2snLFxuICAnXFx1MDEzNyc6ICdrJyxcbiAgJ1xcdTAxMzgnOiAnaycsXG4gICdcXHUwMTM5JzogJ2wnLFxuICAnXFx1MDEzQSc6ICdsJyxcbiAgJ1xcdTAxM0InOiAnbCcsXG4gICdcXHUwMTNDJzogJ2wnLFxuICAnXFx1MDEzRCc6ICdsJyxcbiAgJ1xcdTAxM0UnOiAnbCcsXG4gICdcXHUwMTNGJzogJ2wnLFxuICAnXFx1MDE0MCc6ICdsJyxcbiAgJ1xcdTAxNDEnOiAnbCcsXG4gICdcXHUwMTQyJzogJ2wnLFxuICAnXFx1MDE0Myc6ICduJyxcbiAgJ1xcdTAxNDQnOiAnbicsXG4gICdcXHUwMTQ1JzogJ24nLFxuICAnXFx1MDE0Nic6ICduJyxcbiAgJ1xcdTAxNDcnOiAnbicsXG4gICdcXHUwMTQ4JzogJ24nLFxuICAnXFx1MDE0OSc6ICduJyxcbiAgJ1xcdTAxNEEnOiAnbicsXG4gICdcXHUwMTRCJzogJ24nLFxuICAnXFx1MDE0Qyc6ICdvJyxcbiAgJ1xcdTAxNEQnOiAnbycsXG4gICdcXHUwMTRFJzogJ28nLFxuICAnXFx1MDE0Ric6ICdvJyxcbiAgJ1xcdTAxNTAnOiAnbycsXG4gICdcXHUwMTUxJzogJ28nLFxuICAnXFx1MDE1Mic6ICdvZScsXG4gICdcXHUwMTUzJzogJ29lJyxcbiAgJ1xcdTAxNTQnOiAncicsXG4gICdcXHUwMTU1JzogJ3InLFxuICAnXFx1MDE1Nic6ICdyJyxcbiAgJ1xcdTAxNTcnOiAncicsXG4gICdcXHUwMTU4JzogJ3InLFxuICAnXFx1MDE1OSc6ICdyJyxcbiAgJ1xcdTAxNUEnOiAncycsXG4gICdcXHUwMTVCJzogJ3MnLFxuICAnXFx1MDE1Qyc6ICdzJyxcbiAgJ1xcdTAxNUQnOiAncycsXG4gICdcXHUwMTVFJzogJ3MnLFxuICAnXFx1MDE1Ric6ICdzJyxcbiAgJ1xcdTAxNjAnOiAncycsXG4gICdcXHUwMTYxJzogJ3MnLFxuICAnXFx1MDE2Mic6ICd0JyxcbiAgJ1xcdTAxNjMnOiAndCcsXG4gICdcXHUwMTY0JzogJ3QnLFxuICAnXFx1MDE2NSc6ICd0JyxcbiAgJ1xcdTAxNjYnOiAndCcsXG4gICdcXHUwMTY3JzogJ3QnLFxuICAnXFx1MDE2OCc6ICd1JyxcbiAgJ1xcdTAxNjknOiAndScsXG4gICdcXHUwMTZBJzogJ3UnLFxuICAnXFx1MDE2Qic6ICd1JyxcbiAgJ1xcdTAxNkMnOiAndScsXG4gICdcXHUwMTZEJzogJ3UnLFxuICAnXFx1MDE2RSc6ICd1JyxcbiAgJ1xcdTAxNkYnOiAndScsXG4gICdcXHUwMTcwJzogJ3UnLFxuICAnXFx1MDE3MSc6ICd1JyxcbiAgJ1xcdTAxNzInOiAndScsXG4gICdcXHUwMTczJzogJ3UnLFxuICAnXFx1MDE3NCc6ICd3JyxcbiAgJ1xcdTAxNzUnOiAndycsXG4gICdcXHUwMTc2JzogJ3knLFxuICAnXFx1MDE3Nyc6ICd5JyxcbiAgJ1xcdTAxNzgnOiAneScsXG4gICdcXHUwMTc5JzogJ3onLFxuICAnXFx1MDE3QSc6ICd6JyxcbiAgJ1xcdTAxN0InOiAneicsXG4gICdcXHUwMTdDJzogJ3onLFxuICAnXFx1MDE3RCc6ICd6JyxcbiAgJ1xcdTAxN0UnOiAneicsXG4gICdcXHUwMTdGJzogJ3NzJyxcbiAgJ1xcdTAxOTEnOiAnZicsXG4gICdcXHUwMTkyJzogJ2YnLFxuICAnXFx1MDIxOCc6ICdzJyxcbiAgJ1xcdTAyMTknOiAncycsXG4gICdcXHUwMjFBJzogJ3QnLFxuICAnXFx1MDIxQic6ICd0JyxcbiAgJ1xcdTAzODYnOiAnYScsXG4gICdcXHUwMzg4JzogJ2UnLFxuICAnXFx1MDM4OSc6ICdpJyxcbiAgJ1xcdTAzOEEnOiAnaScsXG4gICdcXHUwMzhDJzogJ28nLFxuICAnXFx1MDM4RSc6ICd5JyxcbiAgJ1xcdTAzOEYnOiAnbycsXG4gICdcXHUwMzkwJzogJ2knLFxuICAnXFx1MDM5MSc6ICdhJyxcbiAgJ1xcdTAzOTInOiAndicsXG4gICdcXHUwMzkzJzogJ2cnLFxuICAnXFx1MDM5NCc6ICdkJyxcbiAgJ1xcdTAzOTUnOiAnZScsXG4gICdcXHUwMzk2JzogJ3onLFxuICAnXFx1MDM5Nyc6ICdpJyxcbiAgJ1xcdTAzOTgnOiAndGgnLFxuICAnXFx1MDM5OSc6ICdpJyxcbiAgJ1xcdTAzOUEnOiAnaycsXG4gICdcXHUwMzlCJzogJ2wnLFxuICAnXFx1MDM5Qyc6ICdtJyxcbiAgJ1xcdTAzOUQnOiAnbicsXG4gICdcXHUwMzlFJzogJ3gnLFxuICAnXFx1MDM5Ric6ICdvJyxcbiAgJ1xcdTAzQTAnOiAncCcsXG4gICdcXHUwM0ExJzogJ3InLFxuICAnXFx1MDNBMyc6ICdzJyxcbiAgJ1xcdTAzQTQnOiAndCcsXG4gICdcXHUwM0E1JzogJ3knLFxuICAnXFx1MDNBNic6ICdmJyxcbiAgJ1xcdTAzQTcnOiAnY2gnLFxuICAnXFx1MDNBOCc6ICdwcycsXG4gICdcXHUwM0E5JzogJ28nLFxuICAnXFx1MDNBQSc6ICdpJyxcbiAgJ1xcdTAzQUInOiAneScsXG4gICdcXHUwM0FDJzogJ2EnLFxuICAnXFx1MDNBRCc6ICdlJyxcbiAgJ1xcdTAzQUUnOiAnaScsXG4gICdcXHUwM0FGJzogJ2knLFxuICAnXFx1MDNCMCc6ICd5JyxcbiAgJ1xcdTAzQjEnOiAnYScsXG4gICdcXHUwM0IyJzogJ3YnLFxuICAnXFx1MDNCMyc6ICdnJyxcbiAgJ1xcdTAzQjQnOiAnZCcsXG4gICdcXHUwM0I1JzogJ2UnLFxuICAnXFx1MDNCNic6ICd6JyxcbiAgJ1xcdTAzQjcnOiAnaScsXG4gICdcXHUwM0I4JzogJ3RoJyxcbiAgJ1xcdTAzQjknOiAnaScsXG4gICdcXHUwM0JBJzogJ2snLFxuICAnXFx1MDNCQic6ICdsJyxcbiAgJ1xcdTAzQkMnOiAnbScsXG4gICdcXHUwM0JEJzogJ24nLFxuICAnXFx1MDNCRSc6ICd4JyxcbiAgJ1xcdTAzQkYnOiAnbycsXG4gICdcXHUwM0MwJzogJ3AnLFxuICAnXFx1MDNDMSc6ICdyJyxcbiAgJ1xcdTAzQzInOiAncycsXG4gICdcXHUwM0MzJzogJ3MnLFxuICAnXFx1MDNDNCc6ICd0JyxcbiAgJ1xcdTAzQzUnOiAneScsXG4gICdcXHUwM0M2JzogJ2YnLFxuICAnXFx1MDNDNyc6ICdjaCcsXG4gICdcXHUwM0M4JzogJ3BzJyxcbiAgJ1xcdTAzQzknOiAnbycsXG4gICdcXHUwM0NBJzogJ2knLFxuICAnXFx1MDNDQic6ICd5JyxcbiAgJ1xcdTAzQ0MnOiAnbycsXG4gICdcXHUwM0NEJzogJ3knLFxuICAnXFx1MDNDRSc6ICdvJyxcbiAgJ1xcdTAzRDEnOiAndGgnLFxuICAnXFx1MDQwMSc6ICdlJyxcbiAgJ1xcdTA0MDInOiAnZCcsXG4gICdcXHUwNDAzJzogJ2cnLFxuICAnXFx1MDQwNCc6ICdlJyxcbiAgJ1xcdTA0MDUnOiAneicsXG4gICdcXHUwNDA2JzogJ2knLFxuICAnXFx1MDQwNyc6ICdpJyxcbiAgJ1xcdTA0MDgnOiAnaicsXG4gICdcXHUwNDA5JzogJ2wnLFxuICAnXFx1MDQwQSc6ICduJyxcbiAgJ1xcdTA0MEInOiAnYycsXG4gICdcXHUwNDBDJzogJ2snLFxuICAnXFx1MDQwRSc6ICd1JyxcbiAgJ1xcdTA0MEYnOiAnZCcsXG4gICdcXHUwNDEwJzogJ2EnLFxuICAnXFx1MDQxMSc6ICdiJyxcbiAgJ1xcdTA0MTInOiAndicsXG4gICdcXHUwNDEzJzogJ2cnLFxuICAnXFx1MDQxNCc6ICdkJyxcbiAgJ1xcdTA0MTUnOiAnZScsXG4gICdcXHUwNDE2JzogJ3onLFxuICAnXFx1MDQxNyc6ICd6JyxcbiAgJ1xcdTA0MTgnOiAnaScsXG4gICdcXHUwNDE5JzogJ2onLFxuICAnXFx1MDQxQSc6ICdrJyxcbiAgJ1xcdTA0MUInOiAnbCcsXG4gICdcXHUwNDFDJzogJ20nLFxuICAnXFx1MDQxRCc6ICduJyxcbiAgJ1xcdTA0MUUnOiAnbycsXG4gICdcXHUwNDFGJzogJ3AnLFxuICAnXFx1MDQyMCc6ICdyJyxcbiAgJ1xcdTA0MjEnOiAncycsXG4gICdcXHUwNDIyJzogJ3QnLFxuICAnXFx1MDQyMyc6ICd1JyxcbiAgJ1xcdTA0MjQnOiAnZicsXG4gICdcXHUwNDI1JzogJ2gnLFxuICAnXFx1MDQyNic6ICdjJyxcbiAgJ1xcdTA0MjcnOiAnYycsXG4gICdcXHUwNDI4JzogJ3MnLFxuICAnXFx1MDQyOSc6ICdzJyxcbiAgJ1xcdTA0MkInOiAneScsXG4gICdcXHUwNDJEJzogJ2UnLFxuICAnXFx1MDQyRSc6ICd1JyxcbiAgJ1xcdTA0MkYnOiAnYScsXG4gICdcXHUwNDMwJzogJ2EnLFxuICAnXFx1MDQzMSc6ICdiJyxcbiAgJ1xcdTA0MzInOiAndicsXG4gICdcXHUwNDMzJzogJ2cnLFxuICAnXFx1MDQzNCc6ICdkJyxcbiAgJ1xcdTA0MzUnOiAnZScsXG4gICdcXHUwNDM2JzogJ3onLFxuICAnXFx1MDQzNyc6ICd6JyxcbiAgJ1xcdTA0MzgnOiAnaScsXG4gICdcXHUwNDM5JzogJ2onLFxuICAnXFx1MDQzQSc6ICdrJyxcbiAgJ1xcdTA0M0InOiAnbCcsXG4gICdcXHUwNDNDJzogJ20nLFxuICAnXFx1MDQzRCc6ICduJyxcbiAgJ1xcdTA0M0UnOiAnbycsXG4gICdcXHUwNDNGJzogJ3AnLFxuICAnXFx1MDQ0MCc6ICdyJyxcbiAgJ1xcdTA0NDEnOiAncycsXG4gICdcXHUwNDQyJzogJ3QnLFxuICAnXFx1MDQ0Myc6ICd1JyxcbiAgJ1xcdTA0NDQnOiAnZicsXG4gICdcXHUwNDQ1JzogJ2gnLFxuICAnXFx1MDQ0Nic6ICdjJyxcbiAgJ1xcdTA0NDcnOiAnYycsXG4gICdcXHUwNDQ4JzogJ3MnLFxuICAnXFx1MDQ0OSc6ICdzJyxcbiAgJ1xcdTA0NEInOiAneScsXG4gICdcXHUwNDREJzogJ2UnLFxuICAnXFx1MDQ0RSc6ICd1JyxcbiAgJ1xcdTA0NEYnOiAnYScsXG4gICdcXHUwNDUxJzogJ2UnLFxuICAnXFx1MDQ1Mic6ICdkJyxcbiAgJ1xcdTA0NTMnOiAnZycsXG4gICdcXHUwNDU0JzogJ2UnLFxuICAnXFx1MDQ1NSc6ICd6JyxcbiAgJ1xcdTA0NTYnOiAnaScsXG4gICdcXHUwNDU3JzogJ2knLFxuICAnXFx1MDQ1OCc6ICdqJyxcbiAgJ1xcdTA0NTknOiAnbCcsXG4gICdcXHUwNDVBJzogJ24nLFxuICAnXFx1MDQ1Qic6ICdjJyxcbiAgJ1xcdTA0NUMnOiAnaycsXG4gICdcXHUwNDVFJzogJ3UnLFxuICAnXFx1MDQ1Ric6ICdkJyxcbiAgJ1xcdTA0NjInOiAnZScsXG4gICdcXHUwNDYzJzogJ2UnLFxuICAnXFx1MDQ2QSc6ICdhJyxcbiAgJ1xcdTA0NkInOiAnYScsXG4gICdcXHUwNDcyJzogJ2YnLFxuICAnXFx1MDQ3Myc6ICdmJyxcbiAgJ1xcdTA0NzQnOiAneScsXG4gICdcXHUwNDc1JzogJ3knLFxuICAnXFx1MDQ5MCc6ICdnJyxcbiAgJ1xcdTA0OTEnOiAnZycsXG4gICdcXHUwNDkyJzogJ2cnLFxuICAnXFx1MDQ5Myc6ICdnJyxcbiAgJ1xcdTA0OTQnOiAnZycsXG4gICdcXHUwNDk1JzogJ2cnLFxuICAnXFx1MDQ5Nic6ICd6JyxcbiAgJ1xcdTA0OTcnOiAneicsXG4gICdcXHUwNDlBJzogJ2snLFxuICAnXFx1MDQ5Qic6ICdrJyxcbiAgJ1xcdTA0OUMnOiAnaycsXG4gICdcXHUwNDlEJzogJ2snLFxuICAnXFx1MDQ5RSc6ICdrJyxcbiAgJ1xcdTA0OUYnOiAnaycsXG4gICdcXHUwNEEwJzogJ2snLFxuICAnXFx1MDRBMSc6ICdrJyxcbiAgJ1xcdTA0QTInOiAnbicsXG4gICdcXHUwNEEzJzogJ24nLFxuICAnXFx1MDRBNCc6ICduJyxcbiAgJ1xcdTA0QTUnOiAnbicsXG4gICdcXHUwNEE2JzogJ3AnLFxuICAnXFx1MDRBNyc6ICdwJyxcbiAgJ1xcdTA0QTgnOiAnbycsXG4gICdcXHUwNEE5JzogJ28nLFxuICAnXFx1MDRBQSc6ICdzJyxcbiAgJ1xcdTA0QUInOiAncycsXG4gICdcXHUwNEFDJzogJ3QnLFxuICAnXFx1MDRBRCc6ICd0JyxcbiAgJ1xcdTA0QUUnOiAndScsXG4gICdcXHUwNEFGJzogJ3UnLFxuICAnXFx1MDRCMCc6ICd1JyxcbiAgJ1xcdTA0QjEnOiAndScsXG4gICdcXHUwNEIyJzogJ2gnLFxuICAnXFx1MDRCMyc6ICdoJyxcbiAgJ1xcdTA0QjQnOiAnYycsXG4gICdcXHUwNEI1JzogJ2MnLFxuICAnXFx1MDRCNic6ICdjJyxcbiAgJ1xcdTA0QjcnOiAnYycsXG4gICdcXHUwNEI4JzogJ2MnLFxuICAnXFx1MDRCOSc6ICdjJyxcbiAgJ1xcdTA0QkEnOiAnaCcsXG4gICdcXHUwNEJCJzogJ2gnLFxuICAnXFx1MDRCQyc6ICdjJyxcbiAgJ1xcdTA0QkQnOiAnYycsXG4gICdcXHUwNEJFJzogJ2MnLFxuICAnXFx1MDRCRic6ICdjJyxcbiAgJ1xcdTA0QzEnOiAneicsXG4gICdcXHUwNEMyJzogJ3onLFxuICAnXFx1MDRDMyc6ICdrJyxcbiAgJ1xcdTA0QzQnOiAnaycsXG4gICdcXHUwNEM1JzogJ2wnLFxuICAnXFx1MDRDNic6ICdsJyxcbiAgJ1xcdTA0QzcnOiAnbicsXG4gICdcXHUwNEM4JzogJ24nLFxuICAnXFx1MDRDOSc6ICduJyxcbiAgJ1xcdTA0Q0EnOiAnbicsXG4gICdcXHUwNENCJzogJ2MnLFxuICAnXFx1MDRDQyc6ICdjJyxcbiAgJ1xcdTA0RDAnOiAnYScsXG4gICdcXHUwNEQxJzogJ2EnLFxuICAnXFx1MDREMic6ICdhJyxcbiAgJ1xcdTA0RDMnOiAnYScsXG4gICdcXHUwNEQ0JzogJ2FlJyxcbiAgJ1xcdTA0RDUnOiAnYWUnLFxuICAnXFx1MDRENic6ICdlJyxcbiAgJ1xcdTA0RDcnOiAnZScsXG4gICdcXHUwNEQ4JzogJ2EnLFxuICAnXFx1MDREOSc6ICdhJyxcbiAgJ1xcdTA0REEnOiAnYScsXG4gICdcXHUwNERCJzogJ2EnLFxuICAnXFx1MDREQyc6ICd6JyxcbiAgJ1xcdTA0REQnOiAneicsXG4gICdcXHUwNERFJzogJ3onLFxuICAnXFx1MDRERic6ICd6JyxcbiAgJ1xcdTA0RTAnOiAneicsXG4gICdcXHUwNEUxJzogJ3onLFxuICAnXFx1MDRFMic6ICdpJyxcbiAgJ1xcdTA0RTMnOiAnaScsXG4gICdcXHUwNEU0JzogJ2knLFxuICAnXFx1MDRFNSc6ICdpJyxcbiAgJ1xcdTA0RTYnOiAnbycsXG4gICdcXHUwNEU3JzogJ28nLFxuICAnXFx1MDRFOCc6ICdvJyxcbiAgJ1xcdTA0RTknOiAnbycsXG4gICdcXHUwNEVBJzogJ28nLFxuICAnXFx1MDRFQic6ICdvJyxcbiAgJ1xcdTA0RUUnOiAndScsXG4gICdcXHUwNEVGJzogJ3UnLFxuICAnXFx1MDRGMCc6ICd1JyxcbiAgJ1xcdTA0RjEnOiAndScsXG4gICdcXHUwNEYyJzogJ3UnLFxuICAnXFx1MDRGMyc6ICd1JyxcbiAgJ1xcdTA0RjQnOiAnYycsXG4gICdcXHUwNEY1JzogJ2MnLFxuICAnXFx1MDRGOCc6ICd5JyxcbiAgJ1xcdTA0RjknOiAneScsXG4gICdcXHUwNTBBJzogJ24nLFxuICAnXFx1MDUwQic6ICduJyxcbiAgJ1xcdTA1MEUnOiAndCcsXG4gICdcXHUwNTBGJzogJ3QnLFxuICAnXFx1MDUxQSc6ICdxJyxcbiAgJ1xcdTA1MUInOiAncScsXG4gICdcXHUwNTFDJzogJ3cnLFxuICAnXFx1MDUxRCc6ICd3Jyxcbn07XG4iLAogICAgIi8qKlxuICogU3RyaW5nIHV0aWxpdGllc1xuICovXG5cbmltcG9ydCB7IHNwZWNpYWxDaGFyTWFwIH0gZnJvbSAnLi90YWJsZS9jaGFyLXRhYmxlJztcblxuLyoqXG4gKiBDb252ZXJ0IHN0cmluZyB0byBVbml4IGZvcm1hdFxuICpcbiAqIFBlcmZvcm1zIGNvbnZlcnNpb24gZm9sbG93aW5nIGxlZ2FjeSB3aWtpZG90IGltcGxlbWVudGF0aW9uLlxuICogLSBDb252ZXJ0cyBzcGVjaWFsIGNoYXJhY3RlcnMgdG8gQVNDSUkgY2hhcmFjdGVyc1xuICogLSBDb252ZXJ0cyB0byBsb3dlcmNhc2VcbiAqIC0gQ29udmVydHMgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgdG8gaHlwaGVuc1xuICogLSBSZWR1Y2VzIGNvbnNlY3V0aXZlIGh5cGhlbnMvY29sb25zIHRvIHNpbmdsZVxuICogLSBSZW1vdmVzIGxlYWRpbmcvdHJhaWxpbmcgaHlwaGVucy9jb2xvbnNcbiAqXG4gKiBAcGFyYW0gdGFyZ2V0U3RyIC0gU3RyaW5nIHRvIGNvbnZlcnRcbiAqIEByZXR1cm5zIENvbnZlcnRlZCBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvVW5peCh0YXJnZXRTdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIENvbnZlcnQgc3BlY2lhbCBjaGFyYWN0ZXJzXG4gIGxldCByZXN1bHQgPSAnJztcbiAgZm9yIChjb25zdCBjaGFyIG9mIHRhcmdldFN0cikge1xuICAgIGNvbnN0IG1hcHBlZCA9IHNwZWNpYWxDaGFyTWFwW2NoYXJdO1xuICAgIHJlc3VsdCArPSBtYXBwZWQgIT09IHVuZGVmaW5lZCA/IG1hcHBlZCA6IGNoYXI7XG4gIH1cblxuICAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxuICByZXN1bHQgPSByZXN1bHQudG9Mb3dlckNhc2UoKTtcblxuICAvLyBSZW1vdmUgbm9uLUFTQ0lJIGNoYXJhY3RlcnNcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL1teYS16MC05XFwtOl9dL2csICctJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9eXy8sICc6XycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvKD88ITopXy9nLCAnLScpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXi0qLywgJycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvLSokLywgJycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvLXsyLH0vZywgJy0nKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoLzp7Mix9L2csICc6Jyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC86LS9nLCAnOicpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvLTovZywgJzonKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL18tL2csICdfJyk7XG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC8tXy9nLCAnXycpO1xuXG4gIC8vIFJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBjb2xvbnNcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL146LywgJycpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvOiQvLCAnJyk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdHJpbmdVdGlsIGNsYXNzIChQeXRob24gY29tcGF0aWJsZSlcbiAqL1xuZXhwb3J0IGNvbnN0IFN0cmluZ1V0aWwgPSB7XG4gIHRvVW5peCxcbn07XG4iLAogICAgImltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4vdXNlcic7XG5cbi8qKlxuICogVXNlciBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFVzZXIgfCBudWxsPiB7XG4gIGNvbnN0cnVjdG9yKHVzZXJzPzogKFVzZXIgfCBudWxsKVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAodXNlcnMpIHtcbiAgICAgIHRoaXMucHVzaCguLi51c2Vycyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgdXNlcm5hbWVcbiAgICogQHBhcmFtIG5hbWUgLSBVc2VybmFtZVxuICAgKiBAcmV0dXJucyBVc2VyIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZmluZEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBVc2VyIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb3dlck5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgZm9yIChjb25zdCB1c2VyIG9mIHRoaXMpIHtcbiAgICAgIGlmICh1c2VyICYmIHVzZXIubmFtZS50b0xvd2VyQ2FzZSgpID09PSBsb3dlck5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSB1c2VyIElEXG4gICAqIEBwYXJhbSBpZCAtIFVzZXIgSURcbiAgICogQHJldHVybnMgVXNlciBvciB1bmRlZmluZWRcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBVc2VyIHwgdW5kZWZpbmVkIHtcbiAgICBmb3IgKGNvbnN0IHVzZXIgb2YgdGhpcykge1xuICAgICAgaWYgKHVzZXIgJiYgdXNlci5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuIHVzZXI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIG9ubHkgbm9uLW51bGwgdXNlcnNcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygbm9uLW51bGwgdXNlcnNcbiAgICovXG4gIGZpbHRlck5vbk51bGwoKTogVXNlcltdIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXIoKHVzZXIpOiB1c2VyIGlzIFVzZXIgPT4gdXNlciAhPT0gbnVsbCk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCBwTGltaXQgZnJvbSAncC1saW1pdCc7XG5pbXBvcnQgeyBOb0VsZW1lbnRFcnJvciwgTm90Rm91bmRFeGNlcHRpb24sIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4uLy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcbmltcG9ydCB7IGZldGNoV2l0aFJldHJ5IH0gZnJvbSAnLi4vLi4vdXRpbC9odHRwJztcbmltcG9ydCB7IHRvVW5peCB9IGZyb20gJy4uLy4uL3V0aWwvc3RyaW5nLXV0aWwnO1xuaW1wb3J0IHR5cGUgeyBDbGllbnRSZWYgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciwgVXNlclR5cGUgfSBmcm9tICcuL2Fic3RyYWN0LXVzZXInO1xuaW1wb3J0IHsgVXNlckNvbGxlY3Rpb24gfSBmcm9tICcuL3VzZXItY29sbGVjdGlvbic7XG5cbi8qKlxuICogVXNlciBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckRhdGEge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgYXZhdGFyVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgdW5peE5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVndWxhciB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyIGltcGxlbWVudHMgQWJzdHJhY3RVc2VyIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50UmVmO1xuXG4gIC8qKiBVc2VyIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBVc2VybmFtZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBEaXNwbGF5IG5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRpc3BsYXlOYW1lOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKiBBdmF0YXIgVVJMICovXG4gIHB1YmxpYyByZWFkb25seSBhdmF0YXJVcmw6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqIFVOSVggZm9ybWF0IHVzZXJuYW1lICovXG4gIHB1YmxpYyByZWFkb25seSB1bml4TmFtZTogc3RyaW5nO1xuXG4gIC8qKiBJUCBhZGRyZXNzIChudWxsIGZvciByZWd1bGFyIHVzZXJzKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBVc2VyIHR5cGUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXJUeXBlOiBVc2VyVHlwZSA9ICd1c2VyJztcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudFJlZiwgZGF0YTogVXNlckRhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRhdGEuZGlzcGxheU5hbWUgPz8gbnVsbDtcbiAgICB0aGlzLmF2YXRhclVybCA9IGRhdGEuYXZhdGFyVXJsID8/IGBodHRwczovL3d3dy53aWtpZG90LmNvbS9hdmF0YXIucGhwP3VzZXJpZD0ke2RhdGEuaWR9YDtcbiAgICB0aGlzLnVuaXhOYW1lID0gZGF0YS51bml4TmFtZSA/PyB0b1VuaXgoZGF0YS5uYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdXNlciBmcm9tIHVzZXJuYW1lXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnRcbiAgICogQHBhcmFtIG5hbWUgLSBVc2VybmFtZVxuICAgKiBAcmV0dXJucyBVc2VyIChudWxsIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIHN0YXRpYyBmcm9tTmFtZShjbGllbnQ6IENsaWVudFJlZiwgbmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFVzZXIgfCBudWxsPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdW5peE5hbWUgPSB0b1VuaXgobmFtZSk7XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy53aWtpZG90LmNvbS91c2VyOmluZm8vJHt1bml4TmFtZX1gO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkodXJsLCBERUZBVUxUX0FNQ19DT05GSUcsIHtcbiAgICAgICAgICBjaGVja09rOiBmYWxzZSwgLy8gSGFuZGxlIEhUVFAgZXJyb3JzIG1hbnVhbGx5XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGZldGNoIHVzZXIgaW5mbzogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgIC8vIENoZWNrIGV4aXN0ZW5jZVxuICAgICAgICBpZiAoJCgnZGl2LmVycm9yLWJsb2NrJykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGlkXG4gICAgICAgIGNvbnN0IHVzZXJJZEVsZW0gPSAkKCdhLmJ0bi5idG4tZGVmYXVsdC5idG4teHMnKTtcbiAgICAgICAgaWYgKHVzZXJJZEVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdVc2VyIElEIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaHJlZiA9IHVzZXJJZEVsZW0uYXR0cignaHJlZicpO1xuICAgICAgICBpZiAoIWhyZWYpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1VzZXIgSUQgaHJlZiBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VySWQgPSBOdW1iZXIucGFyc2VJbnQoaHJlZi5zcGxpdCgnLycpLnBvcCgpID8/ICcwJywgMTApO1xuXG4gICAgICAgIC8vIEdldCBuYW1lXG4gICAgICAgIGNvbnN0IG5hbWVFbGVtID0gJCgnaDEucHJvZmlsZS10aXRsZScpO1xuICAgICAgICBpZiAobmFtZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdVc2VyIG5hbWUgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1c2VyTmFtZSA9IG5hbWVFbGVtLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBVc2VyKGNsaWVudCwge1xuICAgICAgICAgIGlkOiB1c2VySWQsXG4gICAgICAgICAgbmFtZTogdXNlck5hbWUsXG4gICAgICAgICAgdW5peE5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHVzZXI6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VycyBmcm9tIG11bHRpcGxlIHVzZXJuYW1lc1xuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50XG4gICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIHVzZXJuYW1lc1xuICAgKiBAcmV0dXJucyBVc2VyIGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBmcm9tTmFtZXMoY2xpZW50OiBDbGllbnRSZWYsIG5hbWVzOiBzdHJpbmdbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxVc2VyQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIExpbWl0IGNvbmN1cnJlbnQgY29ubmVjdGlvbnNcbiAgICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQoREVGQVVMVF9BTUNfQ09ORklHLnNlbWFwaG9yZUxpbWl0KTtcblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgbmFtZXMubWFwKChuYW1lKSA9PlxuICAgICAgICAgICAgbGltaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBVc2VyLmZyb21OYW1lKGNsaWVudCwgbmFtZSk7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmVzdWx0LnZhbHVlIDogbnVsbDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbmV3IFVzZXJDb2xsZWN0aW9uKHJlc3VsdHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB1c2VyczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8vIEFic3RyYWN0VXNlciBpbXBsZW1lbnRhdGlvblxuICBpc1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaXNEZWxldGVkVXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNBbm9ueW1vdXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0d1ZXN0VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaXNXaWtpZG90VXNlcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgVXNlcihpZD0ke3RoaXMuaWR9LCBuYW1lPSR7dGhpcy5uYW1lfSwgdW5peE5hbWU9JHt0aGlzLnVuaXhOYW1lfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcblxuLyoqXG4gKiBXaWtpZG90IHN5c3RlbSB1c2VyXG4gKi9cbmV4cG9ydCBjbGFzcyBXaWtpZG90VXNlciBpbXBsZW1lbnRzIEFic3RyYWN0VXNlciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudFJlZjtcblxuICAvKiogVXNlciBJRCAoMCBmb3IgV2lraWRvdCBzeXN0ZW0pICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyID0gMDtcblxuICAvKiogVXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyA9ICdXaWtpZG90JztcblxuICAvKiogVU5JWCBmb3JtYXQgdXNlcm5hbWUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmcgPSAnd2lraWRvdCc7XG5cbiAgLyoqIEF2YXRhciBVUkwgKG51bGwgZm9yIHN5c3RlbSB1c2VyKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXZhdGFyVXJsOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogSVAgYWRkcmVzcyAobnVsbCBmb3Igc3lzdGVtIHVzZXIpICovXG4gIHB1YmxpYyByZWFkb25seSBpcDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFVzZXIgdHlwZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlclR5cGU6IFVzZXJUeXBlID0gJ3dpa2lkb3QnO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50UmVmKSB7XG4gICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gIH1cblxuICAvLyBBYnN0cmFjdFVzZXIgaW1wbGVtZW50YXRpb25cbiAgaXNVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0RlbGV0ZWRVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc0Fub255bW91c1VzZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlzR3Vlc3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpc1dpa2lkb3RVc2VyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFdpa2lkb3RVc2VyKG5hbWU9JHt0aGlzLm5hbWV9LCB1bml4TmFtZT0ke3RoaXMudW5peE5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIsIFVzZXJUeXBlIH0gZnJvbSAnLi9hYnN0cmFjdC11c2VyJztcbmV4cG9ydCB7IEFub255bW91c1VzZXIgfSBmcm9tICcuL2Fub255bW91cy11c2VyJztcbmV4cG9ydCB7IERlbGV0ZWRVc2VyIH0gZnJvbSAnLi9kZWxldGVkLXVzZXInO1xuZXhwb3J0IHsgR3Vlc3RVc2VyIH0gZnJvbSAnLi9ndWVzdC11c2VyJztcbmV4cG9ydCB7IFVzZXIsIHR5cGUgVXNlckRhdGEgfSBmcm9tICcuL3VzZXInO1xuZXhwb3J0IHsgVXNlckNvbGxlY3Rpb24gfSBmcm9tICcuL3VzZXItY29sbGVjdGlvbic7XG5leHBvcnQgeyBXaWtpZG90VXNlciB9IGZyb20gJy4vd2lraWRvdC11c2VyJztcbiIsCiAgICAiaW1wb3J0IHR5cGUgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlIH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi9jb21tb24vbG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50UmVmIH0gZnJvbSAnLi4vLi4vbW9kdWxlL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vLi4vbW9kdWxlL3VzZXInO1xuaW1wb3J0IHsgQW5vbnltb3VzVXNlciwgRGVsZXRlZFVzZXIsIEd1ZXN0VXNlciwgVXNlciwgV2lraWRvdFVzZXIgfSBmcm9tICcuLi8uLi9tb2R1bGUvdXNlcic7XG5cbi8qKlxuICogUGFyc2UgcHJpbnR1c2VyIGVsZW1lbnQgYW5kIHJldHVybiB1c2VyIG9iamVjdFxuICpcbiAqIEBwYXJhbSBjbGllbnQgLSBXaWtpZG90IGNsaWVudFxuICogQHBhcmFtIGVsZW0gLSBFbGVtZW50IHRvIHBhcnNlIChlbGVtZW50IHdpdGggcHJpbnR1c2VyIGNsYXNzKVxuICogQHJldHVybnMgUGFyc2VkIHVzZXIgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVzZXIoY2xpZW50OiBDbGllbnRSZWYsIGVsZW06IGNoZWVyaW8uQ2hlZXJpbzxBbnlOb2RlPik6IEFic3RyYWN0VXNlciB7XG4gIGNvbnN0IGNsYXNzQXR0ciA9IGVsZW0uYXR0cignY2xhc3MnKSA/PyAnJztcbiAgY29uc3QgY2xhc3NlcyA9IGNsYXNzQXR0ci5zcGxpdCgvXFxzKy8pO1xuXG4gIC8vIENoZWNrIGZvciBkZWxldGVkIHVzZXJcbiAgaWYgKGNsYXNzZXMuaW5jbHVkZXMoJ2RlbGV0ZWQnKSkge1xuICAgIGNvbnN0IGRhdGFJZCA9IGVsZW0uYXR0cignZGF0YS1pZCcpO1xuICAgIGNvbnN0IHVzZXJJZCA9IGRhdGFJZCA/IE51bWJlci5wYXJzZUludChkYXRhSWQsIDEwKSA6IDA7XG4gICAgcmV0dXJuIG5ldyBEZWxldGVkVXNlcihjbGllbnQsIHVzZXJJZCk7XG4gIH1cblxuICAvLyBJZiB0ZXh0IGlzIFwiKHVzZXIgZGVsZXRlZClcIlxuICBjb25zdCB0ZXh0ID0gZWxlbS50ZXh0KCkudHJpbSgpO1xuICBpZiAodGV4dCA9PT0gJyh1c2VyIGRlbGV0ZWQpJykge1xuICAgIHJldHVybiBuZXcgRGVsZXRlZFVzZXIoY2xpZW50LCAwKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBhbm9ueW1vdXMgdXNlclxuICBpZiAoY2xhc3Nlcy5pbmNsdWRlcygnYW5vbnltb3VzJykpIHtcbiAgICBjb25zdCBpcEVsZW0gPSBlbGVtLmZpbmQoJ3NwYW4uaXAnKTtcbiAgICBpZiAoaXBFbGVtLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlwID0gaXBFbGVtLnRleHQoKS5yZXBsYWNlKC9bKCldL2csICcnKS50cmltKCk7XG4gICAgICByZXR1cm4gbmV3IEFub255bW91c1VzZXIoY2xpZW50LCBpcCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQW5vbnltb3VzVXNlcihjbGllbnQsICcnKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBndWVzdCB1c2VyIChoYXMgR3JhdmF0YXIgYXZhdGFyKVxuICBjb25zdCBpbWdFbGVtID0gZWxlbS5maW5kKCdpbWcnKTtcbiAgaWYgKGltZ0VsZW0ubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IHNyYyA9IGltZ0VsZW0uYXR0cignc3JjJykgPz8gJyc7XG4gICAgaWYgKHNyYy5pbmNsdWRlcygnZ3JhdmF0YXIuY29tJykpIHtcbiAgICAgIGNvbnN0IGd1ZXN0TmFtZSA9IHRleHQuc3BsaXQoJyAnKVswXSA/PyAnR3Vlc3QnO1xuICAgICAgcmV0dXJuIG5ldyBHdWVzdFVzZXIoY2xpZW50LCBndWVzdE5hbWUsIHNyYyk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIFdpa2lkb3Qgc3lzdGVtIHVzZXJcbiAgaWYgKHRleHQgPT09ICdXaWtpZG90Jykge1xuICAgIHJldHVybiBuZXcgV2lraWRvdFVzZXIoY2xpZW50KTtcbiAgfVxuXG4gIC8vIFJlZ3VsYXIgdXNlclxuICBjb25zdCBsaW5rcyA9IGVsZW0uZmluZCgnYScpO1xuICBpZiAobGlua3MubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gVHJlYXQgYXMgRGVsZXRlZFVzZXIgaWYgbm8gbGlua1xuICAgIHJldHVybiBuZXcgRGVsZXRlZFVzZXIoY2xpZW50LCAwKTtcbiAgfVxuXG4gIC8vIExhc3QgbGluayBpcyB0aGUgdXNlciBsaW5rXG4gIGNvbnN0IHVzZXJMaW5rID0gbGlua3MubGFzdCgpO1xuICBjb25zdCB1c2VyTmFtZSA9IHVzZXJMaW5rLnRleHQoKS50cmltKCk7XG4gIGNvbnN0IGhyZWYgPSB1c2VyTGluay5hdHRyKCdocmVmJykgPz8gJyc7XG4gIGNvbnN0IG9uY2xpY2sgPSB1c2VyTGluay5hdHRyKCdvbmNsaWNrJykgPz8gJyc7XG5cbiAgLy8gRXh0cmFjdCB1bml4X25hbWUgZnJvbSBocmVmXG4gIGNvbnN0IHVuaXhOYW1lID0gaHJlZi5yZXBsYWNlKC9eLipcXC91c2VyOmluZm9cXC8vLCAnJykucmVwbGFjZSgvXFwvJC8sICcnKTtcblxuICAvLyBFeHRyYWN0IHVzZXJfaWQgZnJvbSBvbmNsaWNrXG4gIC8vIFBhdHRlcm46IFwiV0lLSURPVC5wYWdlLmxpc3RlbmVycy51c2VySW5mbygxMjM0NTYpOyByZXR1cm4gZmFsc2U7XCJcbiAgY29uc3QgdXNlcklkTWF0Y2ggPSBvbmNsaWNrLm1hdGNoKC91c2VySW5mb1xcKChcXGQrKVxcKS8pO1xuICBjb25zdCB1c2VySWQgPSB1c2VySWRNYXRjaD8uWzFdID8gTnVtYmVyLnBhcnNlSW50KHVzZXJJZE1hdGNoWzFdLCAxMCkgOiAwO1xuXG4gIC8vIEdlbmVyYXRlIGF2YXRhciBVUkxcbiAgY29uc3QgYXZhdGFyVXJsID0gdXNlcklkID4gMCA/IGBodHRwOi8vd3d3Lndpa2lkb3QuY29tL2F2YXRhci5waHA/dXNlcmlkPSR7dXNlcklkfWAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIG5ldyBVc2VyKGNsaWVudCwge1xuICAgIGlkOiB1c2VySWQsXG4gICAgbmFtZTogdXNlck5hbWUsXG4gICAgdW5peE5hbWUsXG4gICAgYXZhdGFyVXJsLFxuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZSBkYXRlIGZyb20gb2RhdGUgZWxlbWVudFxuICpcbiAqIEBwYXJhbSBlbGVtIC0gRWxlbWVudCB0byBwYXJzZSAob2RhdGUgZWxlbWVudClcbiAqIEByZXR1cm5zIFBhcnNlZCBEYXRlLCBvciBudWxsIG9uIHBhcnNlIGZhaWx1cmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlT2RhdGUoZWxlbTogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KTogRGF0ZSB8IG51bGwge1xuICBjb25zdCBjbGFzc0F0dHIgPSBlbGVtLmF0dHIoJ2NsYXNzJykgPz8gJyc7XG5cbiAgLy8gRXh0cmFjdCBVbml4IHRpbWVzdGFtcCBmcm9tIGNsYXNzXG4gIC8vIFBhdHRlcm46IFwib2RhdGUgdGltZV8xMjM0NTY3ODkwIGZvcm1hdF8uLi5cIiBmb3JtYXRcbiAgY29uc3QgdGltZU1hdGNoID0gY2xhc3NBdHRyLm1hdGNoKC90aW1lXyhcXGQrKS8pO1xuICBpZiAodGltZU1hdGNoPy5bMV0pIHtcbiAgICBjb25zdCB1bml4VGltZSA9IE51bWJlci5wYXJzZUludCh0aW1lTWF0Y2hbMV0sIDEwKTtcbiAgICByZXR1cm4gbmV3IERhdGUodW5peFRpbWUgKiAxMDAwKTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrOiBwYXJzZSBmcm9tIHRleHRcbiAgY29uc3QgdGV4dCA9IGVsZW0udGV4dCgpLnRyaW0oKTtcbiAgY29uc3QgcGFyc2VkID0gRGF0ZS5wYXJzZSh0ZXh0KTtcbiAgaWYgKCFOdW1iZXIuaXNOYU4ocGFyc2VkKSkge1xuICAgIHJldHVybiBuZXcgRGF0ZShwYXJzZWQpO1xuICB9XG5cbiAgLy8gUmV0dXJuIG51bGwgYW5kIGxvZyB3YXJuaW5nIGlmIHBhcnNpbmcgZmFpbHNcbiAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBvZGF0ZSBlbGVtZW50OiBjbGFzcz1cIiR7Y2xhc3NBdHRyfVwiLCB0ZXh0PVwiJHt0ZXh0fVwiYCk7XG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICJleHBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuL3VzZXInO1xuIiwKICAgICIvKipcbiAqIERlY29yYXRvciB1dGlsaXRpZXNcbiAqL1xuXG5pbXBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsIHdkRXJyQXN5bmMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUeXBlIGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIGNsaWVudCByZWZlcmVuY2VcbiAqL1xuaW50ZXJmYWNlIEhhc0NsaWVudCB7XG4gIGNsaWVudD86IHsgcmVxdWlyZUxvZ2luKCk6IHsgaXNFcnIoKTogYm9vbGVhbjsgZXJyb3I/OiBFcnJvciB9IH07XG4gIHNpdGU/OiB7IGNsaWVudDogeyByZXF1aXJlTG9naW4oKTogeyBpc0VycigpOiBib29sZWFuOyBlcnJvcj86IEVycm9yIH0gfSB9O1xuICB0aHJlYWQ/OiB7IHNpdGU6IHsgY2xpZW50OiB7IHJlcXVpcmVMb2dpbigpOiB7IGlzRXJyKCk6IGJvb2xlYW47IGVycm9yPzogRXJyb3IgfSB9IH0gfTtcbn1cblxuLyoqXG4gKiBHZXQgY2xpZW50IHJlZmVyZW5jZSBmcm9tIGFuIG9iamVjdFxuICovXG5mdW5jdGlvbiBnZXRDbGllbnRSZWYoXG4gIG9iajogSGFzQ2xpZW50XG4pOiB7IHJlcXVpcmVMb2dpbigpOiB7IGlzRXJyKCk6IGJvb2xlYW47IGVycm9yPzogRXJyb3IgfSB9IHwgbnVsbCB7XG4gIGlmIChvYmouY2xpZW50KSByZXR1cm4gb2JqLmNsaWVudDtcbiAgaWYgKG9iai5zaXRlPy5jbGllbnQpIHJldHVybiBvYmouc2l0ZS5jbGllbnQ7XG4gIGlmIChvYmoudGhyZWFkPy5zaXRlPy5jbGllbnQpIHJldHVybiBvYmoudGhyZWFkLnNpdGUuY2xpZW50O1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBMb2dpbiByZXF1aXJlZCBtZXRob2QgZGVjb3JhdG9yXG4gKlxuICogTWV0aG9kcyBkZWNvcmF0ZWQgd2l0aCB0aGlzIHdpbGwgY2hlY2sgbG9naW4gc3RhdHVzIGJlZm9yZSBleGVjdXRpb24uXG4gKiBSZXR1cm5zIExvZ2luUmVxdWlyZWRFcnJvciBpZiBub3QgbG9nZ2VkIGluLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjbGFzcyBQYWdlIHtcbiAqICAgQFJlcXVpcmVMb2dpblxuICogICBkZXN0cm95KCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gKiAgICAgcmV0dXJuIGZyb21Qcm9taXNlKGFzeW5jICgpID0+IHsgLi4uIH0sIChlKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKC4uLikpO1xuICogICB9XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZXF1aXJlTG9naW48XG4gIFRoaXMgZXh0ZW5kcyBIYXNDbGllbnQsXG4gIEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sXG4gIFJldHVybiBleHRlbmRzIFdpa2lkb3RSZXN1bHRBc3luYzx1bmtub3duPixcbj4oXG4gIHRhcmdldDogKHRoaXM6IFRoaXMsIC4uLmFyZ3M6IEFyZ3MpID0+IFJldHVybixcbiAgX2NvbnRleHQ6IENsYXNzTWV0aG9kRGVjb3JhdG9yQ29udGV4dDxUaGlzLCAodGhpczogVGhpcywgLi4uYXJnczogQXJncykgPT4gUmV0dXJuPlxuKTogKHRoaXM6IFRoaXMsIC4uLmFyZ3M6IEFyZ3MpID0+IFJldHVybiB7XG4gIHJldHVybiBmdW5jdGlvbiAodGhpczogVGhpcywgLi4uYXJnczogQXJncyk6IFJldHVybiB7XG4gICAgY29uc3QgY2xpZW50UmVmID0gZ2V0Q2xpZW50UmVmKHRoaXMpO1xuICAgIGlmICghY2xpZW50UmVmKSB7XG4gICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdDbGllbnQgcmVmZXJlbmNlIG5vdCBmb3VuZCcpKSBhcyB1bmtub3duIGFzIFJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudFJlZi5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkJylcbiAgICAgICkgYXMgdW5rbm93biBhcyBSZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICB9O1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoZWVyaW8sIENoZWVyaW9BUEkgfSBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IEZvcnVtUG9zdFJlZiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICogRm9ydW0gcG9zdCByZXZpc2lvbiBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1Qb3N0UmV2aXNpb25EYXRhIHtcbiAgcG9zdDogRm9ydW1Qb3N0UmVmO1xuICBpZDogbnVtYmVyO1xuICByZXZObzogbnVtYmVyO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIEZvcnVtIHBvc3QgcmV2aXNpb24gKHZlcnNpb24gaW4gZWRpdCBoaXN0b3J5KVxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0UmV2aXNpb24ge1xuICAvKiogUG9zdCB0aGlzIHJldmlzaW9uIGJlbG9uZ3MgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBvc3Q6IEZvcnVtUG9zdFJlZjtcblxuICAvKiogUmV2aXNpb24gSUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIG51bWJlciAoMCA9IGluaXRpYWwgdmVyc2lvbikgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldk5vOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIGNyZWF0b3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyO1xuXG4gIC8qKiBSZXZpc2lvbiBjcmVhdGlvbiBkYXRlICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG5cbiAgLyoqIEhUTUwgY29udGVudCAoaW50ZXJuYWwgY2FjaGUpICovXG4gIHByaXZhdGUgX2h0bWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IEZvcnVtUG9zdFJldmlzaW9uRGF0YSkge1xuICAgIHRoaXMucG9zdCA9IGRhdGEucG9zdDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnJldk5vID0gZGF0YS5yZXZObztcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBIVE1MIGNvbnRlbnQgaGFzIGJlZW4gYWNxdWlyZWRcbiAgICovXG4gIGlzSHRtbEFjcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9odG1sICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVE1MIGNvbnRlbnQgKGNhY2hlZClcbiAgICovXG4gIGdldCBodG1sKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9odG1sO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBIVE1MIGNvbnRlbnRcbiAgICovXG4gIHNldCBodG1sKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5faHRtbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBIVE1MIGNvbnRlbnRcbiAgICogQHJldHVybnMgSFRNTCBzdHJpbmdcbiAgICovXG4gIGdldEh0bWwoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9odG1sICE9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2h0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBvc3QudGhyZWFkLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bVBvc3RSZXZpc2lvbk1vZHVsZScsXG4gICAgICAgICAgICByZXZpc2lvbklkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIEZvcnVtUG9zdFJldmlzaW9uTW9kdWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50ID0gU3RyaW5nKHJlc3BvbnNlLmNvbnRlbnQgPz8gJycpO1xuICAgICAgICB0aGlzLl9odG1sID0gY29udGVudDtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIEhUTUw6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtUG9zdFJldmlzaW9uKGlkPSR7dGhpcy5pZH0sIHJldk5vPSR7dGhpcy5yZXZOb30pYDtcbiAgfVxufVxuXG4vKipcbiAqIEZvcnVtIHBvc3QgcmV2aXNpb24gY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1Qb3N0UmV2aXNpb24+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBvc3Q6IEZvcnVtUG9zdFJlZjtcblxuICBjb25zdHJ1Y3Rvcihwb3N0OiBGb3J1bVBvc3RSZWYsIHJldmlzaW9ucz86IEZvcnVtUG9zdFJldmlzaW9uW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucG9zdCA9IHBvc3Q7XG4gICAgaWYgKHJldmlzaW9ucykge1xuICAgICAgdGhpcy5wdXNoKC4uLnJldmlzaW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICogQHBhcmFtIGlkIC0gUmV2aXNpb24gSURcbiAgICogQHJldHVybnMgUmV2aXNpb24gKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1Qb3N0UmV2aXNpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHJldmlzaW9uKSA9PiByZXZpc2lvbi5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgcmV2aXNpb24gbnVtYmVyXG4gICAqIEBwYXJhbSByZXZObyAtIFJldmlzaW9uIG51bWJlclxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeVJldk5vKHJldk5vOiBudW1iZXIpOiBGb3J1bVBvc3RSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocmV2aXNpb24pID0+IHJldmlzaW9uLnJldk5vID09PSByZXZObyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEhUTUwgZm9yIGFsbCByZXZpc2lvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgSFRNTCBzdHJpbmdzXG4gICAqL1xuICBnZXRIdG1scygpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGhpcy5tYXAoYXN5bmMgKHJldmlzaW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXZpc2lvbi5nZXRIdG1sKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgSFRNTHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHJldmlzaW9ucyBmcm9tIEhUTUwgKGludGVybmFsIG1ldGhvZClcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9wYXJzZShwb3N0OiBGb3J1bVBvc3RSZWYsICQ6IENoZWVyaW9BUEkpOiBGb3J1bVBvc3RSZXZpc2lvbltdIHtcbiAgICBjb25zdCByZXZpc2lvbnM6IEZvcnVtUG9zdFJldmlzaW9uW10gPSBbXTtcblxuICAgICQoJ3RhYmxlLnRhYmxlIHRyJykuZWFjaCgoX2ksIHJvd0VsZW0pID0+IHtcbiAgICAgIGNvbnN0ICRyb3cgPSAkKHJvd0VsZW0pO1xuXG4gICAgICAvLyBTa2lwIGhlYWRlciByb3dcbiAgICAgIGlmICgkcm93Lmhhc0NsYXNzKCdoZWFkJykpIHJldHVybjtcblxuICAgICAgLy8gR2V0IHVzZXIgZWxlbWVudFxuICAgICAgY29uc3QgJHVzZXJFbGVtID0gJHJvdy5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgaWYgKCR1c2VyRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgLy8gR2V0IG9kYXRlIGVsZW1lbnRcbiAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkcm93LmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgIGlmICgkb2RhdGVFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgcmV2aXNpb24gSUQgZnJvbSBvbmNsaWNrIGF0dHJpYnV0ZVxuICAgICAgY29uc3QgJHJldmlzaW9uTGluayA9ICRyb3cuZmluZCgnYVtvbmNsaWNrKj1cInNob3dSZXZpc2lvblwiXScpO1xuICAgICAgaWYgKCRyZXZpc2lvbkxpbmsubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG9uY2xpY2sgPSAkcmV2aXNpb25MaW5rLmF0dHIoJ29uY2xpY2snKSA/PyAnJztcbiAgICAgIGNvbnN0IHJldmlzaW9uSWRNYXRjaCA9IG9uY2xpY2subWF0Y2goL3Nob3dSZXZpc2lvblxccypcXChcXHMqZXZlbnRcXHMqLFxccyooXFxkKylcXHMqXFwpLyk7XG4gICAgICBpZiAoIXJldmlzaW9uSWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHJldmlzaW9uSWQgPSBOdW1iZXIucGFyc2VJbnQocmV2aXNpb25JZE1hdGNoWzFdLCAxMCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldmlzaW9uSWQpKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9IHBhcnNlVXNlcihwb3N0LnRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcbiAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHBhcnNlT2RhdGUoJG9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgICByZXZpc2lvbnMucHVzaChcbiAgICAgICAgbmV3IEZvcnVtUG9zdFJldmlzaW9uKHtcbiAgICAgICAgICBwb3N0LFxuICAgICAgICAgIGlkOiByZXZpc2lvbklkLFxuICAgICAgICAgIHJldk5vOiAwLCAvLyBXaWxsIGJlIHNldCBhZnRlciBwYXJzaW5nIGFsbCByZXZpc2lvbnNcbiAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vIEFQSSByZXR1cm5zIG5ld2VzdCBmaXJzdCwgcmV2ZXJzZSB0byBnZXQgb2xkZXN0IGZpcnN0IGFuZCBzZXQgcmV2Tm9cbiAgICByZXZpc2lvbnMucmV2ZXJzZSgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmV2aXNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBVc2UgT2JqZWN0LmRlZmluZVByb3BlcnR5IHRvIHNldCByZWFkb25seSBwcm9wZXJ0eVxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHJldmlzaW9uc1tpXSwgJ3Jldk5vJywge1xuICAgICAgICB2YWx1ZTogaSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV2aXNpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcmV2aXNpb25zIGZvciBhIHBvc3RcbiAgICogQHBhcmFtIHBvc3QgLSBGb3J1bSBwb3N0IHJlZmVyZW5jZVxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiBjb2xsZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbChwb3N0OiBGb3J1bVBvc3RSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9zdC50aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vc3ViL0ZvcnVtUG9zdFJldmlzaW9uc01vZHVsZScsXG4gICAgICAgICAgICBwb3N0SWQ6IHBvc3QuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gRm9ydW1Qb3N0UmV2aXNpb25zTW9kdWxlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgIGNvbnN0IHJldmlzaW9ucyA9IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbi5fcGFyc2UocG9zdCwgJCk7XG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uKHBvc3QsIHJldmlzaW9ucyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSByZXZpc2lvbnM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbnMgZm9yIG11bHRpcGxlIHBvc3RzXG4gICAqIEBwYXJhbSBwb3N0cyAtIEFycmF5IG9mIGZvcnVtIHBvc3QgcmVmZXJlbmNlc1xuICAgKiBAcGFyYW0gd2l0aEh0bWwgLSBXaGV0aGVyIHRvIGFsc28gZmV0Y2ggSFRNTCBjb250ZW50IGZvciBlYWNoIHJldmlzaW9uXG4gICAqIEByZXR1cm5zIE1hcCBvZiBwb3N0IElEIHRvIHJldmlzaW9uIGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsRm9yUG9zdHMoXG4gICAgcG9zdHM6IEZvcnVtUG9zdFJlZltdLFxuICAgIHdpdGhIdG1sID0gZmFsc2VcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPE1hcDxudW1iZXIsIEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbj4+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAocG9zdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBNYXA8bnVtYmVyLCBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPG51bWJlciwgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uPigpO1xuICAgICAgICBjb25zdCBzaXRlID0gcG9zdHNbMF0hLnRocmVhZC5zaXRlO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogR2V0IHJldmlzaW9uIGxpc3RzIGZvciBhbGwgcG9zdHNcbiAgICAgICAgY29uc3QgcmV2aXNpb25zUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHBvc3RzLm1hcCgocG9zdCkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9zdWIvRm9ydW1Qb3N0UmV2aXNpb25zTW9kdWxlJyxcbiAgICAgICAgICAgIHBvc3RJZDogcG9zdC5pZCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmV2aXNpb25zUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXZpc2lvbnNSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDI6IFBhcnNlIHJldmlzaW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcG9zdCA9IHBvc3RzW2ldITtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJldmlzaW9uc1Jlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBjb25zdCByZXZpc2lvbnMgPSBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24uX3BhcnNlKHBvc3QsICQpO1xuICAgICAgICAgIHJlc3VsdC5zZXQocG9zdC5pZCwgbmV3IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbihwb3N0LCByZXZpc2lvbnMpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgMzogR2V0IEhUTUwgY29udGVudCBpZiByZXF1ZXN0ZWRcbiAgICAgICAgaWYgKHdpdGhIdG1sKSB7XG4gICAgICAgICAgY29uc3QgYWxsUmV2aXNpb25zOiB7IHJldmlzaW9uOiBGb3J1bVBvc3RSZXZpc2lvbjsgcG9zdElkOiBudW1iZXIgfVtdID0gW107XG4gICAgICAgICAgZm9yIChjb25zdCBbcG9zdElkLCBjb2xsZWN0aW9uXSBvZiByZXN1bHQpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmV2aXNpb24gb2YgY29sbGVjdGlvbikge1xuICAgICAgICAgICAgICBhbGxSZXZpc2lvbnMucHVzaCh7IHJldmlzaW9uLCBwb3N0SWQgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFsbFJldmlzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBodG1sUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgICAgICBhbGxSZXZpc2lvbnMubWFwKCh7IHJldmlzaW9uIH0pID0+ICh7XG4gICAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bVBvc3RSZXZpc2lvbk1vZHVsZScsXG4gICAgICAgICAgICAgICAgcmV2aXNpb25JZDogcmV2aXNpb24uaWQsXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGh0bWxSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgICB0aHJvdyBodG1sUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbFJldmlzaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICBjb25zdCB7IHJldmlzaW9uIH0gPSBhbGxSZXZpc2lvbnNbaV0hO1xuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGh0bWxSZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHJldmlzaW9uLmh0bWwgPSBTdHJpbmcocmVzcG9uc2UuY29udGVudCA/PyAnJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcmV2aXNpb25zIGZvciBwb3N0czogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDaGVlcmlvLCBDaGVlcmlvQVBJIH0gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlLCBFbGVtZW50IH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBMb2dpblJlcXVpcmVkRXJyb3IsIE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IEZvcnVtVGhyZWFkUmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB7IEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbiB9IGZyb20gJy4vZm9ydW0tcG9zdC1yZXZpc2lvbic7XG5cbi8qKlxuICogRm9ydW0gcG9zdCBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1Qb3N0RGF0YSB7XG4gIHRocmVhZDogRm9ydW1UaHJlYWRSZWY7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHRleHQ6IHN0cmluZztcbiAgZWxlbWVudDogRWxlbWVudDtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXI7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgZWRpdGVkQnk/OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBlZGl0ZWRBdD86IERhdGUgfCBudWxsO1xuICBwYXJlbnRJZD86IG51bWJlciB8IG51bGw7XG59XG5cbi8qKlxuICogRm9ydW0gcG9zdFxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1Qb3N0IHtcbiAgcHVibGljIHJlYWRvbmx5IHRocmVhZDogRm9ydW1UaHJlYWRSZWY7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGVsZW1lbnQ6IEVsZW1lbnQ7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcbiAgcHVibGljIHJlYWRvbmx5IGVkaXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgZWRpdGVkQXQ6IERhdGUgfCBudWxsO1xuICBwcml2YXRlIF9wYXJlbnRJZDogbnVtYmVyIHwgbnVsbDtcbiAgcHJpdmF0ZSBfc291cmNlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfcmV2aXNpb25zOiBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBGb3J1bVBvc3REYXRhKSB7XG4gICAgdGhpcy50aHJlYWQgPSBkYXRhLnRocmVhZDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLnRleHQgPSBkYXRhLnRleHQ7XG4gICAgdGhpcy5lbGVtZW50ID0gZGF0YS5lbGVtZW50O1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLmVkaXRlZEJ5ID0gZGF0YS5lZGl0ZWRCeSA/PyBudWxsO1xuICAgIHRoaXMuZWRpdGVkQXQgPSBkYXRhLmVkaXRlZEF0ID8/IG51bGw7XG4gICAgdGhpcy5fcGFyZW50SWQgPSBkYXRhLnBhcmVudElkID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGFyZW50IHBvc3QgSURcbiAgICovXG4gIGdldCBwYXJlbnRJZCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50SWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlIChjYWNoZWQpXG4gICAqL1xuICBnZXQgc291cmNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNvdXJjZSBjb2RlXG4gICAqL1xuICBzZXQgc291cmNlKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5fc291cmNlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlIChXaWtpZG90IHN5bnRheClcbiAgICovXG4gIGdldFNvdXJjZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuc291cmNlICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoUHJvbWlzZS5yZXNvbHZlKHRoaXMuc291cmNlKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1Qb3N0Q29sbGVjdGlvbi5hY3F1aXJlUG9zdFNvdXJjZXModGhpcy50aHJlYWQsIFt0aGlzXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5zb3VyY2UgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1NvdXJjZSB0ZXh0YXJlYSBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHBvc3Qgc291cmNlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0IHBvc3RcbiAgICogQHBhcmFtIHNvdXJjZSAtIE5ldyBzb3VyY2UgKFdpa2lkb3Qgc3ludGF4KVxuICAgKiBAcGFyYW0gdGl0bGUgLSBOZXcgdGl0bGUgKGtlZXBzIGN1cnJlbnQgdGl0bGUgaWYgb21pdHRlZClcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgZWRpdChzb3VyY2U6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEdldCBjdXJyZW50IHJldmlzaW9uIElEXG4gICAgICAgIGNvbnN0IGZvcm1SZXN1bHQgPSBhd2FpdCB0aGlzLnRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9zdWIvRm9ydW1FZGl0UG9zdEZvcm1Nb2R1bGUnLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHRoaXMudGhyZWFkLmlkLFxuICAgICAgICAgICAgcG9zdElkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmb3JtUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmb3JtUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9ybVJlc3BvbnNlID0gZm9ybVJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmb3JtUmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IGZvcm0gcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoU3RyaW5nKGZvcm1SZXNwb25zZS5ib2R5ID8/ICcnKSk7XG4gICAgICAgIGNvbnN0IHJldmlzaW9uSW5wdXQgPSAkKFwiaW5wdXRbbmFtZT0nY3VycmVudFJldmlzaW9uSWQnXVwiKTtcbiAgICAgICAgaWYgKHJldmlzaW9uSW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdDdXJyZW50IHJldmlzaW9uIElEIGlucHV0IG5vdCBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmV2aXNpb25WYWx1ZSA9IHJldmlzaW9uSW5wdXQudmFsKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRSZXZpc2lvbklkID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhyZXZpc2lvblZhbHVlID8/ICcnKSwgMTApO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGN1cnJlbnRSZXZpc2lvbklkKSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignSW52YWxpZCByZXZpc2lvbiBJRCB2YWx1ZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSBlZGl0XG4gICAgICAgIGNvbnN0IGVkaXRSZXN1bHQgPSBhd2FpdCB0aGlzLnRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ0ZvcnVtQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZUVkaXRQb3N0JyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwb3N0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBjdXJyZW50UmV2aXNpb25JZCxcbiAgICAgICAgICAgIHRpdGxlOiB0aXRsZSA/PyB0aGlzLnRpdGxlLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChlZGl0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBlZGl0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIGxvY2FsIHN0YXRlXG4gICAgICAgIGlmICh0aXRsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc291cmNlID0gc291cmNlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGVkaXQgcG9zdDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcG9zdCBoYXMgYmVlbiBlZGl0ZWQgKGhhcyByZXZpc2lvbnMpXG4gICAqL1xuICBnZXQgaGFzUmV2aXNpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRlZEJ5ICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwb3N0IHJldmlzaW9ucyAoZWRpdCBoaXN0b3J5KVxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRSZXZpc2lvbnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl9yZXZpc2lvbnMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fcmV2aXNpb25zKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uLmFjcXVpcmVBbGxGb3JQb3N0cyhbdGhpc10pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmV2aXNpb25zID0gcmVzdWx0LnZhbHVlLmdldCh0aGlzLmlkKSA/PyBuZXcgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uKHRoaXMsIFtdKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JldmlzaW9ucztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcmV2aXNpb25zOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBGb3J1bVBvc3QoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG5cbi8qKlxuICogRm9ydW0gcG9zdCBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVBvc3RDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1Qb3N0PiB7XG4gIHB1YmxpYyByZWFkb25seSB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmO1xuXG4gIGNvbnN0cnVjdG9yKHRocmVhZDogRm9ydW1UaHJlYWRSZWYsIHBvc3RzPzogRm9ydW1Qb3N0W10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGhyZWFkID0gdGhyZWFkO1xuICAgIGlmIChwb3N0cykge1xuICAgICAgdGhpcy5wdXNoKC4uLnBvc3RzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKiBAcGFyYW0gaWQgLSBQb3N0IElEXG4gICAqIEByZXR1cm5zIFBvc3QgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1Qb3N0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChwb3N0KSA9PiBwb3N0LmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgcG9zdHMgZnJvbSBIVE1MIChpbnRlcm5hbCBtZXRob2QpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfcGFyc2UodGhyZWFkOiBGb3J1bVRocmVhZFJlZiwgJDogQ2hlZXJpb0FQSSk6IEZvcnVtUG9zdFtdIHtcbiAgICBjb25zdCBwb3N0czogRm9ydW1Qb3N0W10gPSBbXTtcblxuICAgICQoJ2Rpdi5wb3N0W2lkXj1cInBvc3QtXCJdJykuZWFjaCgoX2ksIHBvc3RFbGVtKSA9PiB7XG4gICAgICBjb25zdCAkcG9zdCA9ICQocG9zdEVsZW0pO1xuICAgICAgY29uc3QgcG9zdElkQXR0ciA9ICRwb3N0LmF0dHIoJ2lkJyk7XG4gICAgICBpZiAoIXBvc3RJZEF0dHIpIHJldHVybjtcblxuICAgICAgY29uc3QgcG9zdElkID0gTnVtYmVyLnBhcnNlSW50KHBvc3RJZEF0dHIucmVwbGFjZSgncG9zdC0nLCAnJyksIDEwKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4ocG9zdElkKSkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgcGFyZW50IHBvc3QgSURcbiAgICAgIGxldCBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCAkcGFyZW50Q29udGFpbmVyID0gJHBvc3QucGFyZW50KCk7XG4gICAgICBpZiAoJHBhcmVudENvbnRhaW5lci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0ICRncmFuZHBhcmVudCA9ICRwYXJlbnRDb250YWluZXIucGFyZW50KCk7XG4gICAgICAgIGlmICgkZ3JhbmRwYXJlbnQubGVuZ3RoID4gMCAmJiAkZ3JhbmRwYXJlbnRbMF0/Lm5hbWUgIT09ICdib2R5Jykge1xuICAgICAgICAgIGNvbnN0IGdyYW5kcGFyZW50Q2xhc3NlcyA9ICRncmFuZHBhcmVudC5hdHRyKCdjbGFzcycpID8/ICcnO1xuICAgICAgICAgIGlmIChncmFuZHBhcmVudENsYXNzZXMuaW5jbHVkZXMoJ3Bvc3QtY29udGFpbmVyJykpIHtcbiAgICAgICAgICAgIGNvbnN0ICRwYXJlbnRQb3N0ID0gJGdyYW5kcGFyZW50LmZpbmQoJz4gZGl2LnBvc3QnKTtcbiAgICAgICAgICAgIGlmICgkcGFyZW50UG9zdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBvc3RJZEF0dHIgPSAkcGFyZW50UG9zdC5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgICBpZiAocGFyZW50UG9zdElkQXR0cikge1xuICAgICAgICAgICAgICAgIHBhcmVudElkID0gTnVtYmVyLnBhcnNlSW50KHBhcmVudFBvc3RJZEF0dHIucmVwbGFjZSgncG9zdC0nLCAnJyksIDEwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGl0bGUgYW5kIGNvbnRlbnRcbiAgICAgIC8vIFVzZSBjaGlsZCBjb21iaW5hdG9yICg+KSB0byBhdm9pZCBtYXRjaGluZyBuZXN0ZWQgcHNldWRvLXBvc3RzIGluIGNvbnRlbnRcbiAgICAgIGNvbnN0ICR3cmFwcGVyID0gJHBvc3QuZmluZCgnPiBkaXYubG9uZycpO1xuICAgICAgaWYgKCR3cmFwcGVyLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCAkaGVhZCA9ICR3cmFwcGVyLmZpbmQoJz4gZGl2LmhlYWQnKTtcbiAgICAgIGlmICgkaGVhZC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgJHRpdGxlID0gJGhlYWQuZmluZCgnPiBkaXYudGl0bGUnKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gJHRpdGxlLnRleHQoKS50cmltKCk7XG5cbiAgICAgIGNvbnN0ICRjb250ZW50ID0gJHdyYXBwZXIuZmluZCgnPiBkaXYuY29udGVudCcpO1xuICAgICAgY29uc3QgdGV4dCA9ICRjb250ZW50Lmh0bWwoKSA/PyAnJztcblxuICAgICAgLy8gQXV0aG9yIGFuZCB0aW1lc3RhbXBcbiAgICAgIGNvbnN0ICRpbmZvID0gJGhlYWQuZmluZCgnPiBkaXYuaW5mbycpO1xuICAgICAgaWYgKCRpbmZvLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCAkdXNlckVsZW0gPSAkaW5mby5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgaWYgKCR1c2VyRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgY3JlYXRlZEJ5ID0gcGFyc2VVc2VyKHRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcblxuICAgICAgY29uc3QgJG9kYXRlRWxlbSA9ICRpbmZvLmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgIGlmICgkb2RhdGVFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBjcmVhdGVkQXQgPSBwYXJzZU9kYXRlKCRvZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKTtcblxuICAgICAgLy8gRWRpdCBpbmZvIChpZiBleGlzdHMpXG4gICAgICBsZXQgZWRpdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGwgPSBudWxsO1xuICAgICAgbGV0IGVkaXRlZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCAkY2hhbmdlcyA9ICR3cmFwcGVyLmZpbmQoJ2Rpdi5jaGFuZ2VzJyk7XG4gICAgICBpZiAoJGNoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCAkZWRpdFVzZXJFbGVtID0gJGNoYW5nZXMuZmluZCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgY29uc3QgJGVkaXRPZGF0ZUVsZW0gPSAkY2hhbmdlcy5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICAgIGlmICgkZWRpdFVzZXJFbGVtLmxlbmd0aCA+IDAgJiYgJGVkaXRPZGF0ZUVsZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGVkaXRlZEJ5ID0gcGFyc2VVc2VyKHRocmVhZC5zaXRlLmNsaWVudCBhcyBDbGllbnQsICRlZGl0VXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPik7XG4gICAgICAgICAgZWRpdGVkQXQgPSBwYXJzZU9kYXRlKCRlZGl0T2RhdGVFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHBvc3RzLnB1c2goXG4gICAgICAgIG5ldyBGb3J1bVBvc3Qoe1xuICAgICAgICAgIHRocmVhZCxcbiAgICAgICAgICBpZDogcG9zdElkLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgZWxlbWVudDogcG9zdEVsZW0gYXMgRWxlbWVudCxcbiAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgIGVkaXRlZEJ5LFxuICAgICAgICAgIGVkaXRlZEF0LFxuICAgICAgICAgIHBhcmVudElkLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwb3N0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBvc3RzIGluIGEgdGhyZWFkXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbEluVGhyZWFkKHRocmVhZDogRm9ydW1UaHJlYWRSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0Q29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvc3RzOiBGb3J1bVBvc3RbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gYXdhaXQgdGhyZWFkLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZFBvc3RzTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VObzogJzEnLFxuICAgICAgICAgICAgdDogU3RyaW5nKHRocmVhZC5pZCksXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RCb2R5ID0gU3RyaW5nKGZpcnN0UmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICRmaXJzdCA9IGNoZWVyaW8ubG9hZChmaXJzdEJvZHkpO1xuXG4gICAgICAgIHBvc3RzLnB1c2goLi4uRm9ydW1Qb3N0Q29sbGVjdGlvbi5fcGFyc2UodGhyZWFkLCAkZmlyc3QpKTtcblxuICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgIGNvbnN0ICRwYWdlciA9ICRmaXJzdCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgIGlmICgkcGFnZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgJHBhZ2VyVGFyZ2V0cyA9ICRwYWdlci5maW5kKCdzcGFuLnRhcmdldCcpO1xuICAgICAgICBpZiAoJHBhZ2VyVGFyZ2V0cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGxhc3QgcGFnZSBudW1iZXIgZnJvbSBzZWNvbmQgdG8gbGFzdCBwYWdlIGxpbmtcbiAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJHBhZ2VyVGFyZ2V0c1xuICAgICAgICAgIC5lcSgkcGFnZXJUYXJnZXRzLmxlbmd0aCAtIDIpXG4gICAgICAgICAgLnRleHQoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlVGV4dCwgMTApO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGxhc3RQYWdlKSB8fCBsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHJlbWFpbmluZyBwYWdlc1xuICAgICAgICBjb25zdCBib2RpZXM6IHsgbW9kdWxlTmFtZTogc3RyaW5nOyBwYWdlTm86IHN0cmluZzsgdDogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgYm9kaWVzLnB1c2goe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZFBvc3RzTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VObzogU3RyaW5nKHBhZ2UpLFxuICAgICAgICAgICAgdDogU3RyaW5nKHRocmVhZC5pZCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IHRocmVhZC5zaXRlLmFtY1JlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuICAgICAgICAgIHBvc3RzLnB1c2goLi4uRm9ydW1Qb3N0Q29sbGVjdGlvbi5fcGFyc2UodGhyZWFkLCAkKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEZvcnVtUG9zdENvbGxlY3Rpb24odGhyZWFkLCBwb3N0cyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwb3N0czogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwb3N0cyBmcm9tIG11bHRpcGxlIHRocmVhZHNcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsSW5UaHJlYWRzKFxuICAgIHRocmVhZHM6IEZvcnVtVGhyZWFkUmVmW11cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPE1hcDxudW1iZXIsIEZvcnVtUG9zdENvbGxlY3Rpb24+PiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRocmVhZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBNYXA8bnVtYmVyLCBGb3J1bVBvc3RDb2xsZWN0aW9uPigpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IE1hcDxudW1iZXIsIEZvcnVtUG9zdENvbGxlY3Rpb24+KCk7XG4gICAgICAgIGNvbnN0IHNpdGUgPSB0aHJlYWRzWzBdIS5zaXRlO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogR2V0IGZpcnN0IHBhZ2Ugb2YgYWxsIHRocmVhZHNcbiAgICAgICAgY29uc3QgZmlyc3RQYWdlUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0V2l0aFJldHJ5KFxuICAgICAgICAgIHRocmVhZHMubWFwKCh0aHJlYWQpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3VGhyZWFkUG9zdHNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZU5vOiAnMScsXG4gICAgICAgICAgICB0OiBTdHJpbmcodGhyZWFkLmlkKSxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZmlyc3RQYWdlUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFBhZ2VSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDI6IFBhcnNlIGZpcnN0IHBhZ2VzIGFuZCBkZXRlcm1pbmUgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVxdWVzdHM6IHsgdGhyZWFkOiBGb3J1bVRocmVhZFJlZjsgcGFnZTogbnVtYmVyIH1bXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhyZWFkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHRocmVhZCA9IHRocmVhZHNbaV0hO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZmlyc3RQYWdlUmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGlmICghcmVzcG9uc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgICAgY29uc3QgcG9zdHMgPSBGb3J1bVBvc3RDb2xsZWN0aW9uLl9wYXJzZSh0aHJlYWQsICQpO1xuICAgICAgICAgIHJlc3VsdC5zZXQodGhyZWFkLmlkLCBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKSk7XG5cbiAgICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgICAgY29uc3QgJHBhZ2VyID0gJCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgICAgaWYgKCRwYWdlci5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgJHBhZ2VyVGFyZ2V0cyA9ICRwYWdlci5maW5kKCdzcGFuLnRhcmdldCcpO1xuICAgICAgICAgIGlmICgkcGFnZXJUYXJnZXRzLmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJHBhZ2VyVGFyZ2V0c1xuICAgICAgICAgICAgLmVxKCRwYWdlclRhcmdldHMubGVuZ3RoIC0gMilcbiAgICAgICAgICAgIC50ZXh0KClcbiAgICAgICAgICAgIC50cmltKCk7XG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCk7XG4gICAgICAgICAgaWYgKE51bWJlci5pc05hTihsYXN0UGFnZSkgfHwgbGFzdFBhZ2UgPD0gMSkgY29udGludWU7XG5cbiAgICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgICBhZGRpdGlvbmFsUmVxdWVzdHMucHVzaCh7IHRocmVhZCwgcGFnZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDM6IEZldGNoIGFkZGl0aW9uYWwgcGFnZXNcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdFdpdGhSZXRyeShcbiAgICAgICAgICAgIGFkZGl0aW9uYWxSZXF1ZXN0cy5tYXAoKHsgdGhyZWFkLCBwYWdlIH0pID0+ICh7XG4gICAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVZpZXdUaHJlYWRQb3N0c01vZHVsZScsXG4gICAgICAgICAgICAgIHBhZ2VObzogU3RyaW5nKHBhZ2UpLFxuICAgICAgICAgICAgICB0OiBTdHJpbmcodGhyZWFkLmlkKSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkaXRpb25hbFJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRocmVhZCB9ID0gYWRkaXRpb25hbFJlcXVlc3RzW2ldITtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYWRkaXRpb25hbFJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICAgIGNvbnN0IHBvc3RzID0gRm9ydW1Qb3N0Q29sbGVjdGlvbi5fcGFyc2UodGhyZWFkLCAkKTtcblxuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSByZXN1bHQuZ2V0KHRocmVhZC5pZCk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgZXhpc3RpbmcucHVzaCguLi5wb3N0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBvc3RzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwb3N0IHNvdXJjZXMgaW4gYnVsa1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQb3N0U291cmNlcyhcbiAgICB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmLFxuICAgIHBvc3RzOiBGb3J1bVBvc3RbXVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0Q29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFBvc3RzID0gcG9zdHMuZmlsdGVyKChwb3N0KSA9PiBwb3N0LnNvdXJjZSA9PT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBvc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRocmVhZC5zaXRlLmFtY1JlcXVlc3QoXG4gICAgICAgICAgdGFyZ2V0UG9zdHMubWFwKChwb3N0KSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bUVkaXRQb3N0Rm9ybU1vZHVsZScsXG4gICAgICAgICAgICB0aHJlYWRJZDogdGhyZWFkLmlkLFxuICAgICAgICAgICAgcG9zdElkOiBwb3N0LmlkLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0UG9zdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwb3N0ID0gdGFyZ2V0UG9zdHNbaV07XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgaWYgKCFwb3N0IHx8ICFyZXNwb25zZSkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJykpO1xuICAgICAgICAgIGNvbnN0IHNvdXJjZUVsZW0gPSAkKFwidGV4dGFyZWFbbmFtZT0nc291cmNlJ11cIik7XG4gICAgICAgICAgaWYgKHNvdXJjZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYFNvdXJjZSB0ZXh0YXJlYSBub3QgZm91bmQgZm9yIHBvc3Q6ICR7cG9zdC5pZH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zdC5zb3VyY2UgPSBzb3VyY2VFbGVtLnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBvc3Qgc291cmNlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZXMgZm9yIGFsbCBwb3N0cyBpbiB0aGUgY29sbGVjdGlvblxuICAgKiBAcmV0dXJucyBSZXN1bHQgY29udGFpbmluZyB0aGUgY29sbGVjdGlvbiAoZm9yIG1ldGhvZCBjaGFpbmluZylcbiAgICovXG4gIGdldFBvc3RTb3VyY2VzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVBvc3RDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIEZvcnVtUG9zdENvbGxlY3Rpb24uYWNxdWlyZVBvc3RTb3VyY2VzKHRoaXMudGhyZWFkLCBBcnJheS5mcm9tKHRoaXMpKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoZWVyaW8gfSBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IEZvcnVtQ2F0ZWdvcnkgfSBmcm9tICcuL2ZvcnVtLWNhdGVnb3J5JztcbmltcG9ydCB7IEZvcnVtUG9zdENvbGxlY3Rpb24gfSBmcm9tICcuL2ZvcnVtLXBvc3QnO1xuXG4vKipcbiAqIEZvcnVtIHRocmVhZCBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1UaHJlYWREYXRhIHtcbiAgc2l0ZTogU2l0ZTtcbiAgaWQ6IG51bWJlcjtcbiAgdGl0bGU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHBvc3RDb3VudDogbnVtYmVyO1xuICBjYXRlZ29yeT86IEZvcnVtQ2F0ZWdvcnkgfCBudWxsO1xufVxuXG4vKipcbiAqIEZvcnVtIHRocmVhZFxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1UaHJlYWQge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcbiAgcHVibGljIHBvc3RDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgY2F0ZWdvcnk6IEZvcnVtQ2F0ZWdvcnkgfCBudWxsO1xuICBwcml2YXRlIF9wb3N0czogRm9ydW1Qb3N0Q29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IEZvcnVtVGhyZWFkRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gICAgdGhpcy5wb3N0Q291bnQgPSBkYXRhLnBvc3RDb3VudDtcbiAgICB0aGlzLmNhdGVnb3J5ID0gZGF0YS5jYXRlZ29yeSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWQgVVJMXG4gICAqL1xuICBnZXRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zaXRlLmdldEJhc2VVcmwoKX0vZm9ydW0vdC0ke3RoaXMuaWR9L2A7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBvc3QgbGlzdFxuICAgKi9cbiAgZ2V0UG9zdHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtUG9zdENvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fcG9zdHMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fcG9zdHMpLCAoZSkgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihTdHJpbmcoZSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBGb3J1bVBvc3RDb2xsZWN0aW9uLmFjcXVpcmVBbGxJblRocmVhZHMoW3RoaXNdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bvc3RzID0gcmVzdWx0LnZhbHVlLmdldCh0aGlzLmlkKSA/PyBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aGlzLCBbXSk7XG4gICAgICAgIHJldHVybiB0aGlzLl9wb3N0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcG9zdHM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbHkgdG8gdGhyZWFkXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHJlcGx5KFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIHRpdGxlID0gJycsXG4gICAgcGFyZW50UG9zdElkOiBudW1iZXIgfCBudWxsID0gbnVsbFxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGhyZWFkSWQ6IFN0cmluZyh0aGlzLmlkKSxcbiAgICAgICAgICAgIHBhcmVudElkOiBwYXJlbnRQb3N0SWQgIT09IG51bGwgPyBTdHJpbmcocGFyZW50UG9zdElkKSA6ICcnLFxuICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICBhY3Rpb246ICdGb3J1bUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVQb3N0JyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wb3N0cyA9IG51bGw7XG4gICAgICAgIHRoaXMucG9zdENvdW50ICs9IDE7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHJlcGx5OiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtVGhyZWFkKGlkPSR7dGhpcy5pZH0sIHRpdGxlPSR7dGhpcy50aXRsZX0pYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhyZWFkIGJ5IElEXG4gICAqL1xuICBzdGF0aWMgZ2V0RnJvbUlkKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgdGhyZWFkSWQ6IG51bWJlcixcbiAgICBjYXRlZ29yeTogRm9ydW1DYXRlZ29yeSB8IG51bGwgPSBudWxsXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyhzaXRlLCBbdGhyZWFkSWRdLCBjYXRlZ29yeSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aHJlYWQgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghdGhyZWFkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBUaHJlYWQgbm90IGZvdW5kOiAke3RocmVhZElkfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aHJlYWQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHRocmVhZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3J1bSB0aHJlYWQgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1UaHJlYWRDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1UaHJlYWQ+IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSwgdGhyZWFkcz86IEZvcnVtVGhyZWFkW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKHRocmVhZHMpIHtcbiAgICAgIHRoaXMucHVzaCguLi50aHJlYWRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IEZvcnVtVGhyZWFkIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKCh0aHJlYWQpID0+IHRocmVhZC5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdGhyZWFkcyBpbiBjYXRlZ29yeVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGxJbkNhdGVnb3J5KGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5KTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRocmVhZHM6IEZvcnVtVGhyZWFkW10gPSBbXTtcblxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IGNhdGVnb3J5LnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgcDogMSxcbiAgICAgICAgICAgIGM6IGNhdGVnb3J5LmlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld0NhdGVnb3J5TW9kdWxlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoZmlyc3RSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IGZpcnN0UmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIWZpcnN0UmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEJvZHkgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0Qm9keSk7XG5cbiAgICAgICAgJGZpcnN0KCd0YWJsZS50YWJsZSB0ci5oZWFkfnRyJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJGZpcnN0KGVsZW0pO1xuICAgICAgICAgIGNvbnN0IHRpdGxlRWxlbSA9ICRyb3cuZmluZCgnZGl2LnRpdGxlIGEnKTtcbiAgICAgICAgICBjb25zdCBocmVmID0gdGl0bGVFbGVtLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgICAgICBjb25zdCB0aHJlYWRJZE1hdGNoID0gaHJlZi5tYXRjaCgvdC0oXFxkKykvKTtcbiAgICAgICAgICBpZiAoIXRocmVhZElkTWF0Y2g/LlsxXSkgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgdGhyZWFkSWQgPSBOdW1iZXIucGFyc2VJbnQodGhyZWFkSWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIGNvbnN0IHRpdGxlID0gdGl0bGVFbGVtLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSAkcm93LmZpbmQoJ2Rpdi5kZXNjcmlwdGlvbicpLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgcG9zdENvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQucG9zdHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcblxuICAgICAgICAgIC8vIFBhcnNlIHVzZXIgYW5kIHRpbWVzdGFtcFxuICAgICAgICAgIGNvbnN0ICR1c2VyRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkcm93LmZpbmQoJ3RkLnN0YXJ0ZWQgc3Bhbi5vZGF0ZScpO1xuXG4gICAgICAgICAgY29uc3QgY3JlYXRlZEJ5ID1cbiAgICAgICAgICAgICR1c2VyRWxlbS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgID8gcGFyc2VVc2VyKGNhdGVnb3J5LnNpdGUuY2xpZW50LCAkdXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPilcbiAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9XG4gICAgICAgICAgICAkb2RhdGVFbGVtLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyAocGFyc2VPZGF0ZSgkb2RhdGVFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pID8/IG5ldyBEYXRlKCkpXG4gICAgICAgICAgICAgIDogbmV3IERhdGUoKTtcblxuICAgICAgICAgIHRocmVhZHMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3J1bVRocmVhZCh7XG4gICAgICAgICAgICAgIHNpdGU6IGNhdGVnb3J5LnNpdGUsXG4gICAgICAgICAgICAgIGlkOiB0aHJlYWRJZCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgcG9zdENvdW50LFxuICAgICAgICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCBwYWdlciA9ICRmaXJzdCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgIGlmIChwYWdlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtVGhyZWFkQ29sbGVjdGlvbihjYXRlZ29yeS5zaXRlLCB0aHJlYWRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhZ2VyTGlua3MgPSBwYWdlci5maW5kKCdhJyk7XG4gICAgICAgIGlmIChwYWdlckxpbmtzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtVGhyZWFkQ29sbGVjdGlvbihjYXRlZ29yeS5zaXRlLCB0aHJlYWRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQYWdlTGluayA9IHBhZ2VyTGlua3NbcGFnZXJMaW5rcy5sZW5ndGggLSAyXTtcbiAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gbGFzdFBhZ2VMaW5rID8gJGZpcnN0KGxhc3RQYWdlTGluaykudGV4dCgpLnRyaW0oKSA6ICcxJztcbiAgICAgICAgY29uc3QgbGFzdFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCkgfHwgMTtcblxuICAgICAgICBpZiAobGFzdFBhZ2UgPD0gMSkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmV0Y2ggcmVtYWluaW5nIHBhZ2VzXG4gICAgICAgIGNvbnN0IGJvZGllczogeyBwOiBudW1iZXI7IGM6IG51bWJlcjsgbW9kdWxlTmFtZTogc3RyaW5nIH1bXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgYm9kaWVzLnB1c2goe1xuICAgICAgICAgICAgcDogcGFnZSxcbiAgICAgICAgICAgIGM6IGNhdGVnb3J5LmlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld0NhdGVnb3J5TW9kdWxlJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgY2F0ZWdvcnkuc2l0ZS5hbWNSZXF1ZXN0V2l0aFJldHJ5KGJvZGllcyk7XG4gICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgYWRkaXRpb25hbFJlc3VsdHMuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgaWYgKCFyZXNwb25zZSkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZT8uYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcblxuICAgICAgICAgICQoJ3RhYmxlLnRhYmxlIHRyLmhlYWR+dHInKS5lYWNoKChfaSwgZWxlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJHJvdyA9ICQoZWxlbSk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZUVsZW0gPSAkcm93LmZpbmQoJ2Rpdi50aXRsZSBhJyk7XG4gICAgICAgICAgICBjb25zdCBocmVmID0gdGl0bGVFbGVtLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IHRocmVhZElkTWF0Y2ggPSBocmVmLm1hdGNoKC90LShcXGQrKS8pO1xuICAgICAgICAgICAgaWYgKCF0aHJlYWRJZE1hdGNoPy5bMV0pIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgdGhyZWFkSWQgPSBOdW1iZXIucGFyc2VJbnQodGhyZWFkSWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB0aXRsZUVsZW0udGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gJHJvdy5maW5kKCdkaXYuZGVzY3JpcHRpb24nKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgcG9zdENvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQucG9zdHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcblxuICAgICAgICAgICAgLy8gUGFyc2UgdXNlciBhbmQgdGltZXN0YW1wXG4gICAgICAgICAgICBjb25zdCAkdXNlckVsZW0gPSAkcm93LmZpbmQoJ3RkLnN0YXJ0ZWQgc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICAgIGNvbnN0ICRvZGF0ZUVsZW0gPSAkcm93LmZpbmQoJ3RkLnN0YXJ0ZWQgc3Bhbi5vZGF0ZScpO1xuXG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQnkgPVxuICAgICAgICAgICAgICAkdXNlckVsZW0ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gcGFyc2VVc2VyKGNhdGVnb3J5LnNpdGUuY2xpZW50LCAkdXNlckVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPilcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQXQgPVxuICAgICAgICAgICAgICAkb2RhdGVFbGVtLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IChwYXJzZU9kYXRlKCRvZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKSlcbiAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgICAgIHRocmVhZHMucHVzaChcbiAgICAgICAgICAgICAgbmV3IEZvcnVtVGhyZWFkKHtcbiAgICAgICAgICAgICAgICBzaXRlOiBjYXRlZ29yeS5zaXRlLFxuICAgICAgICAgICAgICAgIGlkOiB0aHJlYWRJZCxcbiAgICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIHBvc3RDb3VudCxcbiAgICAgICAgICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEZvcnVtVGhyZWFkQ29sbGVjdGlvbihjYXRlZ29yeS5zaXRlLCB0aHJlYWRzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHRocmVhZHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSB0aHJlYWQgYnkgdGhyZWFkIElEXG4gICAqIEBwYXJhbSBzaXRlIC0gU2l0ZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gdGhyZWFkSWQgLSBUaHJlYWQgSURcbiAgICovXG4gIHN0YXRpYyBmcm9tSWQoc2l0ZTogU2l0ZSwgdGhyZWFkSWQ6IG51bWJlcik6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyhzaXRlLCBbdGhyZWFkSWRdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRocmVhZCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCF0aHJlYWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYFRocmVhZCBub3QgZm91bmQ6ICR7dGhyZWFkSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocmVhZDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdGhyZWFkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhyZWFkcyBieSB0aHJlYWQgSURzXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUZyb21UaHJlYWRJZHMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICB0aHJlYWRJZHM6IG51bWJlcltdLFxuICAgIGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5IHwgbnVsbCA9IG51bGxcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0aHJlYWRJZHMubWFwKCh0aHJlYWRJZCkgPT4gKHtcbiAgICAgICAgICAgIHQ6IHRocmVhZElkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZE1vZHVsZScsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhyZWFkczogRm9ydW1UaHJlYWRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhyZWFkSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgY29uc3QgdGhyZWFkSWQgPSB0aHJlYWRJZHNbaV07XG4gICAgICAgICAgaWYgKCFyZXNwb25zZSB8fCAhdGhyZWFkSWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgICAgLy8gUGFyc2UgdGhyZWFkIGluZm8gZnJvbSBwYWdlXG4gICAgICAgICAgY29uc3QgYmNFbGVtID0gJCgnZGl2LmZvcnVtLWJyZWFkY3J1bWJzJyk7XG4gICAgICAgICAgaWYgKGJjRWxlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignQnJlYWRjcnVtYnMgbm90IGZvdW5kJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGJjUGFydHMgPSBiY0VsZW0udGV4dCgpLnNwbGl0KCfCuycpO1xuICAgICAgICAgIGNvbnN0IHRpdGxlID0gYmNQYXJ0cy5sZW5ndGggPiAwID8gKGJjUGFydHNbYmNQYXJ0cy5sZW5ndGggLSAxXT8udHJpbSgpID8/ICcnKSA6ICcnO1xuXG4gICAgICAgICAgY29uc3QgZGVzY0Jsb2NrRWxlbSA9ICQoJ2Rpdi5kZXNjcmlwdGlvbi1ibG9jaycpO1xuICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZGVzY0Jsb2NrRWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgY29uc3QgcG9zdENvdW50TWF0Y2ggPSAkKCdkaXYuc3RhdGlzdGljcycpLnRleHQoKS5tYXRjaCgvKFxcZCspLyk7XG4gICAgICAgICAgY29uc3QgcG9zdENvdW50ID0gcG9zdENvdW50TWF0Y2g/LlsxXSA/IE51bWJlci5wYXJzZUludChwb3N0Q291bnRNYXRjaFsxXSwgMTApIDogMDtcblxuICAgICAgICAgIHRocmVhZHMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3J1bVRocmVhZCh7XG4gICAgICAgICAgICAgIHNpdGUsXG4gICAgICAgICAgICAgIGlkOiB0aHJlYWRJZCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICBjcmVhdGVkQnk6IG51bGwsXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgcG9zdENvdW50LFxuICAgICAgICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKHNpdGUsIHRocmVhZHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgdGhyZWFkczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciwgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHsgRm9ydW1UaHJlYWQsIEZvcnVtVGhyZWFkQ29sbGVjdGlvbiB9IGZyb20gJy4vZm9ydW0tdGhyZWFkJztcblxuLyoqXG4gKiBGb3J1bSBjYXRlZ29yeSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ydW1DYXRlZ29yeURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB0aHJlYWRzQ291bnQ6IG51bWJlcjtcbiAgcG9zdHNDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZvcnVtIGNhdGVnb3J5XG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUNhdGVnb3J5IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgdGl0bGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB0aHJlYWRzQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IHBvc3RzQ291bnQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBfdGhyZWFkczogRm9ydW1UaHJlYWRDb2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogRm9ydW1DYXRlZ29yeURhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy50aXRsZSA9IGRhdGEudGl0bGU7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRhdGEuZGVzY3JpcHRpb247XG4gICAgdGhpcy50aHJlYWRzQ291bnQgPSBkYXRhLnRocmVhZHNDb3VudDtcbiAgICB0aGlzLnBvc3RzQ291bnQgPSBkYXRhLnBvc3RzQ291bnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRocmVhZCBsaXN0XG4gICAqL1xuICBnZXRUaHJlYWRzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZENvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fdGhyZWFkcyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFByb21pc2UucmVzb2x2ZSh0aGlzLl90aHJlYWRzKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVBbGxJbkNhdGVnb3J5KHRoaXMpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGhyZWFkcyA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RocmVhZHM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHRocmVhZHM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVsb2FkIHRocmVhZCBsaXN0XG4gICAqL1xuICByZWxvYWRUaHJlYWRzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZENvbGxlY3Rpb24+IHtcbiAgICB0aGlzLl90aHJlYWRzID0gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5nZXRUaHJlYWRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRocmVhZFxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBjcmVhdGVUaHJlYWQoXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIHNvdXJjZTogc3RyaW5nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgYWN0aW9uOiAnRm9ydW1BY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICduZXdUaHJlYWQnLFxuICAgICAgICAgICAgY2F0ZWdvcnlfaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlIHx8IHR5cGVvZiByZXNwb25zZS50aHJlYWRJZCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1RocmVhZCBJRCBub3QgZm91bmQgaW4gcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRocmVhZElkID0gcmVzcG9uc2UudGhyZWFkSWQgYXMgbnVtYmVyO1xuICAgICAgICBjb25zdCB0aHJlYWRSZXN1bHQgPSBhd2FpdCBGb3J1bVRocmVhZC5nZXRGcm9tSWQodGhpcy5zaXRlLCB0aHJlYWRJZCwgdGhpcyk7XG4gICAgICAgIGlmICh0aHJlYWRSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHRocmVhZFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyZWFkUmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSB0aHJlYWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYEZvcnVtQ2F0ZWdvcnkoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG5cbi8qKlxuICogRm9ydW0gY2F0ZWdvcnkgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxGb3J1bUNhdGVnb3J5PiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUsIGNhdGVnb3JpZXM/OiBGb3J1bUNhdGVnb3J5W10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKGNhdGVnb3JpZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5jYXRlZ29yaWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IEZvcnVtQ2F0ZWdvcnkgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgY2F0ZWdvcmllcyBmb3IgYSBzaXRlXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbChzaXRlOiBTaXRlKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtQ2F0ZWdvcnlDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1TdGFydE1vZHVsZScsXG4gICAgICAgICAgICBoaWRkZW46ICd0cnVlJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgY29uc3QgY2F0ZWdvcmllczogRm9ydW1DYXRlZ29yeVtdID0gW107XG5cbiAgICAgICAgJCgndGFibGUgdHIuaGVhZH50cicpLmVhY2goKF9pLCByb3cpID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJChyb3cpO1xuICAgICAgICAgIGNvbnN0IG5hbWVFbGVtID0gJHJvdy5maW5kKCd0ZC5uYW1lJyk7XG4gICAgICAgICAgY29uc3QgbmFtZUxpbmtFbGVtID0gbmFtZUVsZW0uZmluZCgnYScpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSBuYW1lTGlua0VsZW0uYXR0cignaHJlZicpID8/ICcnO1xuXG4gICAgICAgICAgY29uc3QgY2F0ZWdvcnlJZE1hdGNoID0gaHJlZi5tYXRjaCgvYy0oXFxkKykvKTtcbiAgICAgICAgICBpZiAoIWNhdGVnb3J5SWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkID0gTnVtYmVyLnBhcnNlSW50KGNhdGVnb3J5SWRNYXRjaFsxXSwgMTApO1xuICAgICAgICAgIGNvbnN0IHRpdGxlID0gbmFtZUxpbmtFbGVtLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBuYW1lRWxlbS5maW5kKCdkaXYuZGVzY3JpcHRpb24nKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHRocmVhZHNDb3VudCA9IE51bWJlci5wYXJzZUludCgkcm93LmZpbmQoJ3RkLnRocmVhZHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcbiAgICAgICAgICBjb25zdCBwb3N0c0NvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQucG9zdHMnKS50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcblxuICAgICAgICAgIGNhdGVnb3JpZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBGb3J1bUNhdGVnb3J5KHtcbiAgICAgICAgICAgICAgc2l0ZSxcbiAgICAgICAgICAgICAgaWQ6IGNhdGVnb3J5SWQsXG4gICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgdGhyZWFkc0NvdW50LFxuICAgICAgICAgICAgICBwb3N0c0NvdW50LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IEZvcnVtQ2F0ZWdvcnlDb2xsZWN0aW9uKHNpdGUsIGNhdGVnb3JpZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgY2F0ZWdvcmllczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0IHsgRm9ydW1DYXRlZ29yeSwgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24sIHR5cGUgRm9ydW1DYXRlZ29yeURhdGEgfSBmcm9tICcuL2ZvcnVtLWNhdGVnb3J5JztcbmV4cG9ydCB7IEZvcnVtUG9zdCwgRm9ydW1Qb3N0Q29sbGVjdGlvbiwgdHlwZSBGb3J1bVBvc3REYXRhIH0gZnJvbSAnLi9mb3J1bS1wb3N0JztcbmV4cG9ydCB7XG4gIEZvcnVtUG9zdFJldmlzaW9uLFxuICBGb3J1bVBvc3RSZXZpc2lvbkNvbGxlY3Rpb24sXG4gIHR5cGUgRm9ydW1Qb3N0UmV2aXNpb25EYXRhLFxufSBmcm9tICcuL2ZvcnVtLXBvc3QtcmV2aXNpb24nO1xuZXhwb3J0IHsgRm9ydW1UaHJlYWQsIEZvcnVtVGhyZWFkQ29sbGVjdGlvbiwgdHlwZSBGb3J1bVRocmVhZERhdGEgfSBmcm9tICcuL2ZvcnVtLXRocmVhZCc7XG4iLAogICAgIi8vIENvbW1vblxuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vZXJyb3JzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL2xvZ2dlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbW1vbi90eXBlcyc7XG5cbi8vIENvbm5lY3RvclxuZXhwb3J0ICogZnJvbSAnLi9jb25uZWN0b3InO1xuXG4vLyBNb2R1bGVcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlJztcblxuLy8gVXRpbFxuZXhwb3J0ICogZnJvbSAnLi91dGlsJztcbiIsCiAgICAiaW1wb3J0IGt5LCB7IHR5cGUgS3lJbnN0YW5jZSB9IGZyb20gJ2t5JztcbmltcG9ydCBwTGltaXQsIHsgdHlwZSBMaW1pdEZ1bmN0aW9uIH0gZnJvbSAncC1saW1pdCc7XG5pbXBvcnQge1xuICBBTUNIdHRwRXJyb3IsXG4gIEZvcmJpZGRlbkVycm9yLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgUmVzcG9uc2VEYXRhRXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdEVycm9yLFxuICBXaWtpZG90U3RhdHVzRXJyb3IsXG59IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLCB3ZEVyckFzeW5jLCB3ZE9rQXN5bmMgfSBmcm9tICcuLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuLi91dGlsL2h0dHAnO1xuaW1wb3J0IHtcbiAgdHlwZSBBTUNDb25maWcsXG4gIERFRkFVTFRfQU1DX0NPTkZJRyxcbiAgREVGQVVMVF9IVFRQX1NUQVRVU19DT0RFLFxuICBXSUtJRE9UX1RPS0VONyxcbn0gZnJvbSAnLi9hbWMtY29uZmlnJztcbmltcG9ydCB7IEFNQ0hlYWRlciB9IGZyb20gJy4vYW1jLWhlYWRlcic7XG5pbXBvcnQgeyB0eXBlIEFNQ1JlcXVlc3RCb2R5LCB0eXBlIEFNQ1Jlc3BvbnNlLCBhbWNSZXNwb25zZVNjaGVtYSB9IGZyb20gJy4vYW1jLXR5cGVzJztcblxuLyoqXG4gKiBNYXNrIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiAoZm9yIGxvZ2dpbmcpXG4gKiBAcGFyYW0gYm9keSAtIFJlcXVlc3QgYm9keSB0byBtYXNrXG4gKiBAcmV0dXJucyBNYXNrZWQgYm9keVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza1NlbnNpdGl2ZURhdGEoYm9keTogQU1DUmVxdWVzdEJvZHkpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGNvbnN0IG1hc2tlZCA9IHsgLi4uYm9keSB9O1xuICBjb25zdCBzZW5zaXRpdmVLZXlzID0gWydwYXNzd29yZCcsICdsb2dpbicsICdXSUtJRE9UX1NFU1NJT05fSUQnLCAnd2lraWRvdF90b2tlbjcnXTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygc2Vuc2l0aXZlS2V5cykge1xuICAgIGlmIChrZXkgaW4gbWFza2VkKSB7XG4gICAgICBtYXNrZWRba2V5XSA9ICcqKipNQVNLRUQqKionO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWFza2VkO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBleHBvbmVudGlhbCBiYWNrb2ZmIGludGVydmFsICh3aXRoIGppdHRlcilcbiAqIEBwYXJhbSByZXRyeUNvdW50IC0gQ3VycmVudCByZXRyeSBjb3VudCAoc3RhcnRzIGZyb20gMSlcbiAqIEBwYXJhbSBiYXNlSW50ZXJ2YWwgLSBCYXNlIGludGVydmFsIChtaWxsaXNlY29uZHMpXG4gKiBAcGFyYW0gYmFja29mZkZhY3RvciAtIEJhY2tvZmYgZmFjdG9yXG4gKiBAcGFyYW0gbWF4QmFja29mZiAtIE1heGltdW0gYmFja29mZiBpbnRlcnZhbCAobWlsbGlzZWNvbmRzKVxuICogQHJldHVybnMgQ2FsY3VsYXRlZCBiYWNrb2ZmIGludGVydmFsIChtaWxsaXNlY29uZHMpXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZUJhY2tvZmYoXG4gIHJldHJ5Q291bnQ6IG51bWJlcixcbiAgYmFzZUludGVydmFsOiBudW1iZXIsXG4gIGJhY2tvZmZGYWN0b3I6IG51bWJlcixcbiAgbWF4QmFja29mZjogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBiYWNrb2ZmID0gYmFzZUludGVydmFsICogYmFja29mZkZhY3RvciAqKiAocmV0cnlDb3VudCAtIDEpO1xuICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpICogYmFja29mZiAqIDAuMTtcbiAgcmV0dXJuIE1hdGgubWluKGJhY2tvZmYgKyBqaXR0ZXIsIG1heEJhY2tvZmYpO1xufVxuXG4vKipcbiAqIFNsZWVwIGZvciBzcGVjaWZpZWQgZHVyYXRpb25cbiAqIEBwYXJhbSBtcyAtIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICovXG5mdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG4vKipcbiAqIEFNQyByZXF1ZXN0IG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBTUNSZXF1ZXN0T3B0aW9ucyB7XG4gIC8qKiBTaXRlIG5hbWUgKGRlZmF1bHQ6IHd3dykgKi9cbiAgc2l0ZU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBTU0wgc3VwcG9ydCAoYXV0by1kZXRlY3RlZCBpZiBvbWl0dGVkKSAqL1xuICBzc2xTdXBwb3J0ZWQ/OiBib29sZWFuO1xuICAvKiogSW5jbHVkZSBlcnJvcnMgaW4gcmVzdWx0cyBpbnN0ZWFkIG9mIHRocm93aW5nIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgcmV0dXJuRXhjZXB0aW9ucz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWpheCBNb2R1bGUgQ29ubmVjdG9yIGNsaWVudFxuICogTWFuYWdlcyByZXF1ZXN0cyB0byBXaWtpZG90IEFNQyBlbmRwb2ludFxuICovXG5leHBvcnQgY2xhc3MgQU1DQ2xpZW50IHtcbiAgLyoqIGt5IGluc3RhbmNlICovXG4gIHByaXZhdGUgcmVhZG9ubHkga3k6IEt5SW5zdGFuY2U7XG5cbiAgLyoqIENvbmN1cnJlbnQgcmVxdWVzdCBsaW1pdGVyICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGltaXQ6IExpbWl0RnVuY3Rpb247XG5cbiAgLyoqIEhlYWRlciBtYW5hZ2VyICovXG4gIHB1YmxpYyByZWFkb25seSBoZWFkZXI6IEFNQ0hlYWRlcjtcblxuICAvKiogQ29uZmlndXJhdGlvbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlnOiBBTUNDb25maWc7XG5cbiAgLyoqIEJhc2UgZG9tYWluICovXG4gIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZztcblxuICAvKiogU1NMIHN1cHBvcnQgc3RhdHVzIGNhY2hlICovXG4gIHByaXZhdGUgc3NsQ2FjaGU6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQU1DIGNvbmZpZ3VyYXRpb24gKHVzZXMgZGVmYXVsdHMgaWYgb21pdHRlZClcbiAgICogQHBhcmFtIGRvbWFpbiAtIEJhc2UgZG9tYWluIChkZWZhdWx0OiB3aWtpZG90LmNvbSlcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGFydGlhbDxBTUNDb25maWc+ID0ge30sIGRvbWFpbiA9ICd3aWtpZG90LmNvbScpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4uREVGQVVMVF9BTUNfQ09ORklHLCAuLi5jb25maWcgfTtcbiAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjtcbiAgICB0aGlzLmhlYWRlciA9IG5ldyBBTUNIZWFkZXIoKTtcbiAgICB0aGlzLmxpbWl0ID0gcExpbWl0KHRoaXMuY29uZmlnLnNlbWFwaG9yZUxpbWl0KTtcblxuICAgIHRoaXMua3kgPSBreS5jcmVhdGUoe1xuICAgICAgdGltZW91dDogdGhpcy5jb25maWcudGltZW91dCxcbiAgICAgIHJldHJ5OiAwLCAvLyBNYW51YWwgcmV0cnkgY29udHJvbFxuICAgIH0pO1xuXG4gICAgLy8gd3d3IGFsd2F5cyBzdXBwb3J0cyBTU0xcbiAgICB0aGlzLnNzbENhY2hlLnNldCgnd3d3JywgdHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgc2l0ZSBleGlzdGVuY2UgYW5kIFNTTCBzdXBwb3J0IHN0YXR1c1xuICAgKiBAcGFyYW0gc2l0ZU5hbWUgLSBTaXRlIG5hbWVcbiAgICogQHJldHVybnMgU1NMIHN1cHBvcnQgc3RhdHVzICh0cnVlOiBIVFRQUywgZmFsc2U6IEhUVFApXG4gICAqL1xuICBjaGVja1NpdGVTU0woc2l0ZU5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxib29sZWFuPiB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCB2YWx1ZSBpZiBleGlzdHNcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnNzbENhY2hlLmdldChzaXRlTmFtZSk7XG4gICAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKGNhY2hlZCk7XG4gICAgfVxuXG4gICAgLy8gd3d3IGFsd2F5cyBzdXBwb3J0cyBTU0xcbiAgICBpZiAoc2l0ZU5hbWUgPT09ICd3d3cnKSB7XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKHRydWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkoYGh0dHA6Ly8ke3NpdGVOYW1lfS4ke3RoaXMuZG9tYWlufWAsIHRoaXMuY29uZmlnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgICByZWRpcmVjdDogJ21hbnVhbCcsXG4gICAgICAgICAgY2hlY2tPazogZmFsc2UsIC8vIERvbid0IHJldHJ5IG9uIEhUVFAgZXJyb3JzICgzMDEgaXMgZXhwZWN0ZWQpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIDQwNCBtZWFucyBzaXRlIGRvZXMgbm90IGV4aXN0XG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBpcyBub3QgZm91bmQ6ICR7c2l0ZU5hbWV9LiR7dGhpcy5kb21haW59YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTU0wgc3VwcG9ydGVkIGlmIDMwMSByZWRpcmVjdCB0byBodHRwc1xuICAgICAgICBjb25zdCBpc1NTTCA9XG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID09PSAzMDEgJiYgcmVzcG9uc2UuaGVhZGVycy5nZXQoJ0xvY2F0aW9uJyk/LnN0YXJ0c1dpdGgoJ2h0dHBzJykgPT09IHRydWU7XG5cbiAgICAgICAgLy8gU2F2ZSB0byBjYWNoZVxuICAgICAgICB0aGlzLnNzbENhY2hlLnNldChzaXRlTmFtZSwgaXNTU0wpO1xuICAgICAgICByZXR1cm4gaXNTU0w7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNoZWNrIFNTTCBmb3IgJHtzaXRlTmFtZX06ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgQU1DIHJlcXVlc3RcbiAgICogQHBhcmFtIGJvZGllcyAtIFJlcXVlc3QgYm9keSBhcnJheVxuICAgKiBAcGFyYW0gc2l0ZU5hbWUgLSBTaXRlIG5hbWUgKGRlZmF1bHQ6IHd3dylcbiAgICogQHBhcmFtIHNzbFN1cHBvcnRlZCAtIFNTTCBzdXBwb3J0IChhdXRvLWRldGVjdGVkIGlmIG9taXR0ZWQpXG4gICAqIEByZXR1cm5zIFJlc3BvbnNlIGFycmF5XG4gICAqL1xuICByZXF1ZXN0KFxuICAgIGJvZGllczogQU1DUmVxdWVzdEJvZHlbXSxcbiAgICBzaXRlTmFtZSA9ICd3d3cnLFxuICAgIHNzbFN1cHBvcnRlZD86IGJvb2xlYW5cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aE9wdGlvbnMoYm9kaWVzLCB7XG4gICAgICBzaXRlTmFtZSxcbiAgICAgIHNzbFN1cHBvcnRlZCxcbiAgICAgIHJldHVybkV4Y2VwdGlvbnM6IGZhbHNlLFxuICAgIH0pIGFzIFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZVtdPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIEFNQyByZXF1ZXN0ICh3aXRoIG9wdGlvbnMpXG4gICAqIEBwYXJhbSBib2RpZXMgLSBSZXF1ZXN0IGJvZHkgYXJyYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBSZXF1ZXN0IG9wdGlvbnNcbiAgICogQHJldHVybnMgUmVzcG9uc2UgYXJyYXkgKGluY2x1ZGVzIGVycm9ycyBpZiByZXR1cm5FeGNlcHRpb25zIGlzIHRydWUpXG4gICAqL1xuICByZXF1ZXN0V2l0aE9wdGlvbnMoXG4gICAgYm9kaWVzOiBBTUNSZXF1ZXN0Qm9keVtdLFxuICAgIG9wdGlvbnM6IEFNQ1JlcXVlc3RPcHRpb25zID0ge31cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPChBTUNSZXNwb25zZSB8IFdpa2lkb3RFcnJvcilbXT4ge1xuICAgIGNvbnN0IHsgc2l0ZU5hbWUgPSAnd3d3Jywgc3NsU3VwcG9ydGVkLCByZXR1cm5FeGNlcHRpb25zID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBHZXQgU1NMIHN1cHBvcnQgc3RhdHVzXG4gICAgICAgIGxldCBzc2wgPSBzc2xTdXBwb3J0ZWQ7XG4gICAgICAgIGlmIChzc2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHNzbFJlc3VsdCA9IGF3YWl0IHRoaXMuY2hlY2tTaXRlU1NMKHNpdGVOYW1lKTtcbiAgICAgICAgICBpZiAoc3NsUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHNzbFJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3NsID0gc3NsUmVzdWx0LnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvdG9jb2wgPSBzc2wgPyAnaHR0cHMnIDogJ2h0dHAnO1xuICAgICAgICBjb25zdCB1cmwgPSBgJHtwcm90b2NvbH06Ly8ke3NpdGVOYW1lfS4ke3RoaXMuZG9tYWlufS9hamF4LW1vZHVsZS1jb25uZWN0b3IucGhwYDtcblxuICAgICAgICAvLyBFeGVjdXRlIHJlcXVlc3RzIGluIHBhcmFsbGVsXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICBib2RpZXMubWFwKChib2R5KSA9PiB0aGlzLmxpbWl0KCgpID0+IHRoaXMuc2luZ2xlUmVxdWVzdChib2R5LCB1cmwpKSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmV0dXJuRXhjZXB0aW9ucykge1xuICAgICAgICAgIC8vIFJldHVybiBhbGwgcmVzdWx0cyBpbmNsdWRpbmcgZXJyb3JzXG4gICAgICAgICAgcmV0dXJuIHJlc3VsdHMubWFwKChyKSA9PiB7XG4gICAgICAgICAgICBpZiAoci5pc09rKCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHIudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gci5lcnJvcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRocm93IGZpcnN0IGVycm9yIGlmIGFueVxuICAgICAgICBjb25zdCBmaXJzdEVycm9yID0gcmVzdWx0cy5maW5kKChyKSA9PiByLmlzRXJyKCkpO1xuICAgICAgICBpZiAoZmlyc3RFcnJvcj8uaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0RXJyb3IuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHIpID0+IHtcbiAgICAgICAgICBpZiAoci5pc09rKCkpIHtcbiAgICAgICAgICAgIHJldHVybiByLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdVbmV4cGVjdGVkIGVycm9yIGluIHJlc3VsdCBwcm9jZXNzaW5nJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEFNQyByZXF1ZXN0IGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGV4ZWN1dGUgYSBzaW5nbGUgcmVxdWVzdFxuICAgKiBAcGFyYW0gYm9keSAtIFJlcXVlc3QgYm9keVxuICAgKiBAcGFyYW0gdXJsIC0gUmVxdWVzdCBVUkxcbiAgICogQHJldHVybnMgUmVzcG9uc2VcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgc2luZ2xlUmVxdWVzdChcbiAgICBib2R5OiBBTUNSZXF1ZXN0Qm9keSxcbiAgICB1cmw6IHN0cmluZ1xuICApOiBQcm9taXNlPFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZT4+IHtcbiAgICBsZXQgcmV0cnlDb3VudCA9IDA7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQWRkIHdpa2lkb3RfdG9rZW43XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0geyAuLi5ib2R5LCB3aWtpZG90X3Rva2VuNzogV0lLSURPVF9UT0tFTjcgfTtcblxuICAgICAgICAvLyBDcmVhdGUgVVJMLWVuY29kZWQgYm9keVxuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVxdWVzdEJvZHkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5reS5wb3N0KHVybCwge1xuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVyLmdldEhlYWRlcnMoKSxcbiAgICAgICAgICBib2R5OiBmb3JtRGF0YS50b1N0cmluZygpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQYXJzZSBhcyBKU09OXG4gICAgICAgIGxldCByZXNwb25zZURhdGE6IHVua25vd247XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXNwb25zZURhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlVGV4dCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIFJldHJ5IG9uIEpTT04gcGFyc2UgZXJyb3IgKGUuZy4sIGVtcHR5IHJlc3BvbnNlKVxuICAgICAgICAgIHJldHJ5Q291bnQrKztcbiAgICAgICAgICBpZiAocmV0cnlDb3VudCA+PSB0aGlzLmNvbmZpZy5yZXRyeUxpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgICAgbmV3IFJlc3BvbnNlRGF0YUVycm9yKGBBTUMgcmVzcG9uZGVkIHdpdGggbm9uLUpTT04gZGF0YTogJHtyZXNwb25zZVRleHR9YClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGJhY2tvZmYgPSBjYWxjdWxhdGVCYWNrb2ZmKFxuICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLnJldHJ5SW50ZXJ2YWwsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5iYWNrb2ZmRmFjdG9yLFxuICAgICAgICAgICAgdGhpcy5jb25maWcubWF4QmFja29mZlxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoYmFja29mZik7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSB3aXRoIHpvZFxuICAgICAgICBjb25zdCBwYXJzZVJlc3VsdCA9IGFtY1Jlc3BvbnNlU2NoZW1hLnNhZmVQYXJzZShyZXNwb25zZURhdGEpO1xuICAgICAgICBpZiAoIXBhcnNlUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgIG5ldyBSZXNwb25zZURhdGFFcnJvcihgSW52YWxpZCBBTUMgcmVzcG9uc2UgZm9ybWF0OiAke3BhcnNlUmVzdWx0LmVycm9yLm1lc3NhZ2V9YClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYW1jUmVzcG9uc2UgPSBwYXJzZVJlc3VsdC5kYXRhO1xuXG4gICAgICAgIC8vIFJldHJ5IGlmIHRyeV9hZ2FpblxuICAgICAgICBpZiAoYW1jUmVzcG9uc2Uuc3RhdHVzID09PSAndHJ5X2FnYWluJykge1xuICAgICAgICAgIHJldHJ5Q291bnQrKztcbiAgICAgICAgICBpZiAocmV0cnlDb3VudCA+PSB0aGlzLmNvbmZpZy5yZXRyeUxpbWl0KSB7XG4gICAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgV2lraWRvdFN0YXR1c0Vycm9yKCdBTUMgcmVzcG9uZGVkIHdpdGggdHJ5X2FnYWluJywgJ3RyeV9hZ2FpbicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoXG4gICAgICAgICAgICByZXRyeUNvdW50LFxuICAgICAgICAgICAgdGhpcy5jb25maWcucmV0cnlJbnRlcnZhbCxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmJhY2tvZmZGYWN0b3IsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5tYXhCYWNrb2ZmXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvcmJpZGRlbkVycm9yIGlmIG5vX3Blcm1pc3Npb25cbiAgICAgICAgaWYgKGFtY1Jlc3BvbnNlLnN0YXR1cyA9PT0gJ25vX3Blcm1pc3Npb24nKSB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0U3RyID0gYm9keS5tb2R1bGVOYW1lXG4gICAgICAgICAgICA/IGBtb2R1bGVOYW1lOiAke2JvZHkubW9kdWxlTmFtZX1gXG4gICAgICAgICAgICA6IGJvZHkuYWN0aW9uXG4gICAgICAgICAgICAgID8gYGFjdGlvbjogJHtib2R5LmFjdGlvbn0vJHtib2R5LmV2ZW50ID8/ICcnfWBcbiAgICAgICAgICAgICAgOiAndW5rbm93bic7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMoXG4gICAgICAgICAgICBuZXcgRm9yYmlkZGVuRXJyb3IoXG4gICAgICAgICAgICAgIGBZb3VyIGFjY291bnQgaGFzIG5vIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGlzIGFjdGlvbjogJHt0YXJnZXRTdHJ9YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFcnJvciBpZiBzdGF0dXMgaXMgbm90IG9rXG4gICAgICAgIGlmIChhbWNSZXNwb25zZS5zdGF0dXMgIT09ICdvaycpIHtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgIG5ldyBXaWtpZG90U3RhdHVzRXJyb3IoXG4gICAgICAgICAgICAgIGBBTUMgcmVzcG9uZGVkIHdpdGggZXJyb3Igc3RhdHVzOiBcIiR7YW1jUmVzcG9uc2Uuc3RhdHVzfVwiYCxcbiAgICAgICAgICAgICAgYW1jUmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3ZE9rQXN5bmMoYW1jUmVzcG9uc2UpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gUmV0cnkgb24gYWxsIGVycm9ycyAoSFRUUCBlcnJvcnMsIG5ldHdvcmsgZXJyb3JzLCB0aW1lb3V0cywgZXRjLilcbiAgICAgICAgLy8gV2lraWRvdCBzZXJ2ZXIgaGFzIGEgcmVsYXRpdmVseSBoaWdoIGVycm9yIHJhdGUsIHNvIHJldHJ5IGlzIGVzc2VudGlhbFxuICAgICAgICByZXRyeUNvdW50Kys7XG4gICAgICAgIGlmIChyZXRyeUNvdW50ID49IHRoaXMuY29uZmlnLnJldHJ5TGltaXQpIHtcbiAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID1cbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgJ3Jlc3BvbnNlJyBpbiBlcnJvclxuICAgICAgICAgICAgICA/ICgoZXJyb3IgYXMgeyByZXNwb25zZT86IHsgc3RhdHVzPzogbnVtYmVyIH0gfSkucmVzcG9uc2U/LnN0YXR1cyA/P1xuICAgICAgICAgICAgICAgIERFRkFVTFRfSFRUUF9TVEFUVVNfQ09ERSlcbiAgICAgICAgICAgICAgOiBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREU7XG4gICAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IEFNQ0h0dHBFcnJvcihgQU1DIHJlcXVlc3QgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCwgc3RhdHVzQ29kZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoXG4gICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICB0aGlzLmNvbmZpZy5yZXRyeUludGVydmFsLFxuICAgICAgICAgIHRoaXMuY29uZmlnLmJhY2tvZmZGYWN0b3IsXG4gICAgICAgICAgdGhpcy5jb25maWcubWF4QmFja29mZlxuICAgICAgICApO1xuICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsCiAgICAiLyoqXG4gKiBDbGFzcyBmb3IgbWFuYWdpbmcgQU1DIHJlcXVlc3QgaGVhZGVyc1xuICovXG5leHBvcnQgY2xhc3MgQU1DSGVhZGVyIHtcbiAgcHJpdmF0ZSBjb29raWVzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBwcml2YXRlIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gIHByaXZhdGUgdXNlckFnZW50OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVmZXJlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEhlYWRlciBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zPzogeyBjb250ZW50VHlwZT86IHN0cmluZzsgdXNlckFnZW50Pzogc3RyaW5nOyByZWZlcmVyPzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLmNvbnRlbnRUeXBlID0gb3B0aW9ucz8uY29udGVudFR5cGUgPz8gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCc7XG4gICAgdGhpcy51c2VyQWdlbnQgPSBvcHRpb25zPy51c2VyQWdlbnQgPz8gJ1dpa2lkb3RUUyc7XG4gICAgdGhpcy5yZWZlcmVyID0gb3B0aW9ucz8ucmVmZXJlciA/PyAnaHR0cHM6Ly93d3cud2lraWRvdC5jb20vJztcbiAgICB0aGlzLmNvb2tpZXMgPSBuZXcgTWFwKFtbJ3dpa2lkb3RfdG9rZW43JywgJzEyMzQ1NiddXSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgY29va2llXG4gICAqIEBwYXJhbSBuYW1lIC0gQ29va2llIG5hbWVcbiAgICogQHBhcmFtIHZhbHVlIC0gQ29va2llIHZhbHVlXG4gICAqL1xuICBzZXRDb29raWUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5jb29raWVzLnNldChuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgY29va2llXG4gICAqIEBwYXJhbSBuYW1lIC0gQ29va2llIG5hbWVcbiAgICovXG4gIGRlbGV0ZUNvb2tpZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvb2tpZXMuZGVsZXRlKG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGNvb2tpZVxuICAgKiBAcGFyYW0gbmFtZSAtIENvb2tpZSBuYW1lXG4gICAqIEByZXR1cm5zIENvb2tpZSB2YWx1ZSwgdW5kZWZpbmVkIGlmIG5vdCBleGlzdHNcbiAgICovXG4gIGdldENvb2tpZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNvb2tpZXMuZ2V0KG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVFRQIGhlYWRlcnMgb2JqZWN0XG4gICAqIEByZXR1cm5zIEhlYWRlcnMgZGljdGlvbmFyeVxuICAgKi9cbiAgZ2V0SGVhZGVycygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBjb29raWVTdHJpbmcgPSBBcnJheS5mcm9tKHRoaXMuY29va2llcy5lbnRyaWVzKCkpXG4gICAgICAubWFwKChbbmFtZSwgdmFsdWVdKSA9PiBgJHtuYW1lfT0ke3ZhbHVlfWApXG4gICAgICAuam9pbignOyAnKTtcblxuICAgIHJldHVybiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogdGhpcy5jb250ZW50VHlwZSxcbiAgICAgICdVc2VyLUFnZW50JzogdGhpcy51c2VyQWdlbnQsXG4gICAgICBSZWZlcmVyOiB0aGlzLnJlZmVyZXIsXG4gICAgICBDb29raWU6IGNvb2tpZVN0cmluZyxcbiAgICB9O1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG4vKipcbiAqIEFNQyByZXF1ZXN0IGJvZHkgdmFsdWUgdHlwZVxuICovXG5leHBvcnQgdHlwZSBBTUNSZXF1ZXN0Qm9keVZhbHVlID1cbiAgfCBzdHJpbmdcbiAgfCBudW1iZXJcbiAgfCBib29sZWFuXG4gIHwgbnVsbFxuICB8IHVuZGVmaW5lZFxuICB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gIHwgQU1DUmVxdWVzdEJvZHlWYWx1ZVtdO1xuXG4vKipcbiAqIEFNQyByZXF1ZXN0IGJvZHkgdHlwZSBkZWZpbml0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQU1DUmVxdWVzdEJvZHkge1xuICBtb2R1bGVOYW1lPzogc3RyaW5nO1xuICBhY3Rpb24/OiBzdHJpbmc7XG4gIGV2ZW50Pzogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiBBTUNSZXF1ZXN0Qm9keVZhbHVlO1xufVxuXG4vKipcbiAqIEFNQyByZXNwb25zZSBiYXNlIHNjaGVtYVxuICovXG5jb25zdCBiYXNlU2NoZW1hOiB6LlpvZE9iamVjdDx7XG4gIHN0YXR1czogei5ab2RTdHJpbmc7XG4gIGJvZHk6IHouWm9kT3B0aW9uYWw8ei5ab2RTdHJpbmc+O1xuICBtZXNzYWdlOiB6LlpvZE9wdGlvbmFsPHouWm9kU3RyaW5nPjtcbn0+ID0gei5vYmplY3Qoe1xuICBzdGF0dXM6IHouc3RyaW5nKCksXG4gIGJvZHk6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgbWVzc2FnZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxufSk7XG5cbi8qKlxuICogQU1DIHJlc3BvbnNlIHNjaGVtYVxuICovXG5leHBvcnQgY29uc3QgYW1jUmVzcG9uc2VTY2hlbWE6IHouWm9kVHlwZTx6LmluZmVyPHR5cGVvZiBiYXNlU2NoZW1hPiAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9XG4gIGJhc2VTY2hlbWEucGFzc3Rocm91Z2goKTtcblxuLyoqXG4gKiBBTUMgcmVzcG9uc2UgdHlwZVxuICovXG5leHBvcnQgdHlwZSBBTUNSZXNwb25zZSA9IHouaW5mZXI8dHlwZW9mIGFtY1Jlc3BvbnNlU2NoZW1hPjtcblxuLyoqXG4gKiBTdWNjZXNzZnVsIEFNQyByZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ1N1Y2Nlc3NSZXNwb25zZSB7XG4gIHN0YXR1czogJ29rJztcbiAgYm9keTogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgQU1DIHJlc3BvbnNlIGlzIHN1Y2Nlc3NmdWxcbiAqIEBwYXJhbSByZXNwb25zZSAtIEFNQyByZXNwb25zZVxuICogQHJldHVybnMgdHJ1ZSBpZiByZXNwb25zZSBpcyBzdWNjZXNzZnVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N1Y2Nlc3NSZXNwb25zZShyZXNwb25zZTogQU1DUmVzcG9uc2UpOiByZXNwb25zZSBpcyBBTUNTdWNjZXNzUmVzcG9uc2Uge1xuICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzID09PSAnb2snO1xufVxuIiwKICAgICJleHBvcnQgeyBBTUNDbGllbnQsIHR5cGUgQU1DUmVxdWVzdE9wdGlvbnMsIG1hc2tTZW5zaXRpdmVEYXRhIH0gZnJvbSAnLi9hbWMtY2xpZW50JztcbmV4cG9ydCB7IHR5cGUgQU1DQ29uZmlnLCBERUZBVUxUX0FNQ19DT05GSUcgfSBmcm9tICcuL2FtYy1jb25maWcnO1xuZXhwb3J0IHsgQU1DSGVhZGVyIH0gZnJvbSAnLi9hbWMtaGVhZGVyJztcbmV4cG9ydCB7XG4gIHR5cGUgQU1DUmVxdWVzdEJvZHksXG4gIHR5cGUgQU1DUmVzcG9uc2UsXG4gIHR5cGUgQU1DU3VjY2Vzc1Jlc3BvbnNlLFxuICBhbWNSZXNwb25zZVNjaGVtYSxcbiAgaXNTdWNjZXNzUmVzcG9uc2UsXG59IGZyb20gJy4vYW1jLXR5cGVzJztcbmV4cG9ydCB7IGxvZ2luLCBsb2dvdXQgfSBmcm9tICcuL2F1dGgnO1xuIiwKICAgICJpbXBvcnQgeyBTZXNzaW9uQ3JlYXRlRXJyb3IgfSBmcm9tICcuLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYywgd2RPa0FzeW5jIH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQXV0aENsaWVudENvbnRleHQgfSBmcm9tICcuLi9tb2R1bGUvdHlwZXMnO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuLi91dGlsL2h0dHAnO1xuaW1wb3J0IHsgREVGQVVMVF9BTUNfQ09ORklHIH0gZnJvbSAnLi9hbWMtY29uZmlnJztcblxuY29uc3QgTE9HSU5fVVJMID0gJ2h0dHBzOi8vd3d3Lndpa2lkb3QuY29tL2RlZmF1bHQtLWZsb3cvbG9naW5fX0xvZ2luUG9wdXBTY3JlZW4nO1xuXG4vKiogTG9naW4gcmV0cnkgbGltaXQgKHJlZHVjZWQgdG8gcHJldmVudCBhY2NvdW50IGxvY2tvdXQpICovXG5jb25zdCBMT0dJTl9SRVRSWV9MSU1JVCA9IDM7XG5cbi8qKlxuICogTG9naW4gdG8gV2lraWRvdCB3aXRoIHVzZXJuYW1lIGFuZCBwYXNzd29yZFxuICogQHBhcmFtIGNsaWVudCAtIENsaWVudCBjb250ZXh0IChvYmplY3Qgd2l0aCBBTUNDbGllbnQpXG4gKiBAcGFyYW0gdXNlcm5hbWUgLSBVc2VybmFtZVxuICogQHBhcmFtIHBhc3N3b3JkIC0gUGFzc3dvcmRcbiAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2VzcywgU2Vzc2lvbkNyZWF0ZUVycm9yIG9uIGZhaWx1cmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ2luKFxuICBjbGllbnQ6IEF1dGhDbGllbnRDb250ZXh0LFxuICB1c2VybmFtZTogc3RyaW5nLFxuICBwYXNzd29yZDogc3RyaW5nXG4pOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgIGxvZ2luOiB1c2VybmFtZSxcbiAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgICBhY3Rpb246ICdMb2dpbjJBY3Rpb24nLFxuICAgICAgICBldmVudDogJ2xvZ2luJyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBVc2UgcmVkdWNlZCByZXRyeSBsaW1pdCBmb3IgbG9naW4gdG8gcHJldmVudCBhY2NvdW50IGxvY2tvdXRcbiAgICAgIGNvbnN0IGxvZ2luQ29uZmlnID0ge1xuICAgICAgICAuLi5ERUZBVUxUX0FNQ19DT05GSUcsXG4gICAgICAgIHJldHJ5TGltaXQ6IExPR0lOX1JFVFJZX0xJTUlULFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkoTE9HSU5fVVJMLCBsb2dpbkNvbmZpZywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogY2xpZW50LmFtY0NsaWVudC5oZWFkZXIuZ2V0SGVhZGVycygpLFxuICAgICAgICBib2R5OiBmb3JtRGF0YS50b1N0cmluZygpLFxuICAgICAgICBjaGVja09rOiBmYWxzZSwgLy8gSGFuZGxlIEhUVFAgZXJyb3JzIG1hbnVhbGx5IGZvciBiZXR0ZXIgZXJyb3IgbWVzc2FnZXNcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDaGVjayBzdGF0dXMgY29kZVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKFxuICAgICAgICAgIGBMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gSFRUUCBzdGF0dXMgY29kZTogJHtyZXNwb25zZS5zdGF0dXN9YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib2R5IGZvciBlcnJvciBtZXNzYWdlXG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgaWYgKGJvZHkuaW5jbHVkZXMoJ1RoZSBsb2dpbiBhbmQgcGFzc3dvcmQgZG8gbm90IG1hdGNoJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25DcmVhdGVFcnJvcignTG9naW4gYXR0ZW1wdCBmYWlsZWQgZHVlIHRvIGludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgY29va2llc1xuICAgICAgY29uc3QgY29va2llcyA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdTZXQtQ29va2llJyk7XG4gICAgICBpZiAoIWNvb2tpZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25DcmVhdGVFcnJvcignTG9naW4gYXR0ZW1wdCBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgY29va2llcycpO1xuICAgICAgfVxuXG4gICAgICAvLyBFeHRyYWN0IFdJS0lET1RfU0VTU0lPTl9JRCBmcm9tIGNvb2tpZXNcbiAgICAgIGNvbnN0IHNlc3Npb25JZE1hdGNoID0gY29va2llcy5tYXRjaCgvV0lLSURPVF9TRVNTSU9OX0lEPShbXjtdKykvKTtcbiAgICAgIGlmICghc2Vzc2lvbklkTWF0Y2g/LlsxXSkge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKFxuICAgICAgICAgICdMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gbWlzc2luZyBXSUtJRE9UX1NFU1NJT05fSUQgY29va2llJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgc2Vzc2lvbiBjb29raWVcbiAgICAgIGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLnNldENvb2tpZSgnV0lLSURPVF9TRVNTSU9OX0lEJywgc2Vzc2lvbklkTWF0Y2hbMV0pO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBTZXNzaW9uQ3JlYXRlRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ3JlYXRlRXJyb3IoYExvZ2luIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBMb2dvdXQgZnJvbSBXaWtpZG90XG4gKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50IGNvbnRleHQgKG9iamVjdCB3aXRoIEFNQ0NsaWVudClcbiAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nb3V0KGNsaWVudDogQXV0aENsaWVudENvbnRleHQpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAvLyBUcnkgdG8gbG9nb3V0IHZpYSBBTUMsIHRoZW4gYWx3YXlzIHJlbW92ZSBzZXNzaW9uIGNvb2tpZVxuICByZXR1cm4gY2xpZW50LmFtY0NsaWVudFxuICAgIC5yZXF1ZXN0KFtcbiAgICAgIHtcbiAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgYWN0aW9uOiAnTG9naW4yQWN0aW9uJyxcbiAgICAgICAgZXZlbnQ6ICdsb2dvdXQnLFxuICAgICAgfSxcbiAgICBdKVxuICAgIC5tYXAoKCkgPT4ge1xuICAgICAgLy8gTG9nb3V0IHN1Y2NlZWRlZCwgcmVtb3ZlIHNlc3Npb24gY29va2llXG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5kZWxldGVDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9KVxuICAgIC5vckVsc2UoKCkgPT4ge1xuICAgICAgLy8gRXZlbiBpZiBsb2dvdXQgcmVxdWVzdCBmYWlscywgd2Ugc3RpbGwgd2FudCB0byBjbGVhciB0aGUgc2Vzc2lvbiBsb2NhbGx5XG4gICAgICBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5kZWxldGVDb29raWUoJ1dJS0lET1RfU0VTU0lPTl9JRCcpO1xuICAgICAgcmV0dXJuIHdkT2tBc3luYyh1bmRlZmluZWQpO1xuICAgIH0pO1xufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm9FbGVtZW50RXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uL3VzZXIvdXNlcic7XG5cbi8qKlxuICogUHJpdmF0ZSBtZXNzYWdlIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlTWVzc2FnZURhdGEge1xuICBjbGllbnQ6IENsaWVudDtcbiAgaWQ6IG51bWJlcjtcbiAgc2VuZGVyOiBBYnN0cmFjdFVzZXI7XG4gIHJlY2lwaWVudDogQWJzdHJhY3RVc2VyO1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGJvZHk6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIFByaXZhdGUgbWVzc2FnZVxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VuZGVyOiBBYnN0cmFjdFVzZXI7XG4gIHB1YmxpYyByZWFkb25seSByZWNpcGllbnQ6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQcml2YXRlTWVzc2FnZURhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGRhdGEuY2xpZW50O1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMuc2VuZGVyID0gZGF0YS5zZW5kZXI7XG4gICAgdGhpcy5yZWNpcGllbnQgPSBkYXRhLnJlY2lwaWVudDtcbiAgICB0aGlzLnN1YmplY3QgPSBkYXRhLnN1YmplY3Q7XG4gICAgdGhpcy5ib2R5ID0gZGF0YS5ib2R5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lc3NhZ2UgYnkgbWVzc2FnZSBJRFxuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSBtZXNzYWdlSWQgLSBNZXNzYWdlIElEXG4gICAqIEByZXR1cm5zIFByaXZhdGUgbWVzc2FnZVxuICAgKi9cbiAgc3RhdGljIGZyb21JZChjbGllbnQ6IENsaWVudCwgbWVzc2FnZUlkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyhjbGllbnQsIFttZXNzYWdlSWRdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgTWVzc2FnZSBub3QgZm91bmQ6ICR7bWVzc2FnZUlkfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IG1lc3NhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgcHJpdmF0ZSBtZXNzYWdlXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIFJlY2lwaWVudFxuICAgKiBAcGFyYW0gc3ViamVjdCAtIFN1YmplY3RcbiAgICogQHBhcmFtIGJvZHkgLSBCb2R5XG4gICAqL1xuICBzdGF0aWMgc2VuZChcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICByZWNpcGllbnQ6IFVzZXIsXG4gICAgc3ViamVjdDogc3RyaW5nLFxuICAgIGJvZHk6IHN0cmluZ1xuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gc2VuZCBtZXNzYWdlJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzb3VyY2U6IGJvZHksXG4gICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgdG9fdXNlcl9pZDogcmVjaXBpZW50LmlkLFxuICAgICAgICAgICAgYWN0aW9uOiAnRGFzaGJvYXJkTWVzc2FnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NlbmQnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2VuZCBtZXNzYWdlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFByaXZhdGVNZXNzYWdlKGlkPSR7dGhpcy5pZH0sIHNlbmRlcj0ke3RoaXMuc2VuZGVyfSwgcmVjaXBpZW50PSR7dGhpcy5yZWNpcGllbnR9LCBzdWJqZWN0PSR7dGhpcy5zdWJqZWN0fSlgO1xuICB9XG59XG5cbi8qKlxuICogUHJpdmF0ZSBtZXNzYWdlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFByaXZhdGVNZXNzYWdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgbWVzc2FnZXM/OiBQcml2YXRlTWVzc2FnZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICBpZiAobWVzc2FnZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5tZXNzYWdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQcml2YXRlTWVzc2FnZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgobWVzc2FnZSkgPT4gbWVzc2FnZS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZXNzYWdlcyBmcm9tIGxpc3Qgb2YgbWVzc2FnZSBJRHNcbiAgICovXG4gIHN0YXRpYyBmcm9tSWRzKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIG1lc3NhZ2VJZHM6IG51bWJlcltdXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBtZXNzYWdlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvZGllcyA9IG1lc3NhZ2VJZHMubWFwKChtZXNzYWdlSWQpID0+ICh7XG4gICAgICAgICAgaXRlbTogbWVzc2FnZUlkLFxuICAgICAgICAgIG1vZHVsZU5hbWU6ICdkYXNoYm9hcmQvbWVzc2FnZXMvRE1WaWV3TWVzc2FnZU1vZHVsZScsXG4gICAgICAgIH0pKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuYW1jQ2xpZW50LnJlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZXM6IFByaXZhdGVNZXNzYWdlW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lc3NhZ2VJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlSWQgPSBtZXNzYWdlSWRzW2ldO1xuICAgICAgICAgIGlmICghcmVzcG9uc2UgfHwgbWVzc2FnZUlkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuXG4gICAgICAgICAgLy8gR2V0IHVzZXIgaW5mb3JtYXRpb25cbiAgICAgICAgICBjb25zdCBwcmludHVzZXJFbGVtcyA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuaGVhZGVyIHNwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgaWYgKHByaW50dXNlckVsZW1zLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcihgRmFpbGVkIHRvIGdldCBtZXNzYWdlOiAke21lc3NhZ2VJZH1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzZW5kZXJFbGVtID0gJChwcmludHVzZXJFbGVtc1swXSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50RWxlbSA9ICQocHJpbnR1c2VyRWxlbXNbMV0pO1xuXG4gICAgICAgICAgY29uc3Qgc2VuZGVyID0gcGFyc2VVc2VyKGNsaWVudCwgc2VuZGVyRWxlbSk7XG4gICAgICAgICAgY29uc3QgcmVjaXBpZW50ID0gcGFyc2VVc2VyKGNsaWVudCwgcmVjaXBpZW50RWxlbSk7XG5cbiAgICAgICAgICAvLyBTdWJqZWN0XG4gICAgICAgICAgY29uc3Qgc3ViamVjdEVsZW0gPSAkKCdkaXYucG1lc3NhZ2UgZGl2LmhlYWRlciBzcGFuLnN1YmplY3QnKTtcbiAgICAgICAgICBjb25zdCBzdWJqZWN0ID0gc3ViamVjdEVsZW0udGV4dCgpLnRyaW0oKTtcblxuICAgICAgICAgIC8vIEJvZHlcbiAgICAgICAgICBjb25zdCBib2R5RWxlbSA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuYm9keScpO1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBib2R5RWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gVGltZXN0YW1wXG4gICAgICAgICAgY29uc3Qgb2RhdGVFbGVtID0gJCgnZGl2LmhlYWRlciBzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgICAgICAgIG9kYXRlRWxlbS5sZW5ndGggPiAwID8gKHBhcnNlT2RhdGUob2RhdGVFbGVtKSA/PyBuZXcgRGF0ZSgwKSkgOiBuZXcgRGF0ZSgwKTtcblxuICAgICAgICAgIG1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICBuZXcgUHJpdmF0ZU1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgIHNlbmRlcixcbiAgICAgICAgICAgICAgcmVjaXBpZW50LFxuICAgICAgICAgICAgICBzdWJqZWN0LFxuICAgICAgICAgICAgICBib2R5LFxuICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbihjbGllbnQsIG1lc3NhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVzc2FnZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBnZXQgbWVzc2FnZXMgZnJvbSBtb2R1bGVcbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgYWNxdWlyZUZyb21Nb2R1bGUoXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgbW9kdWxlTmFtZTogc3RyaW5nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBtZXNzYWdlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEdldCBwYWdlclxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChbeyBtb2R1bGVOYW1lIH1dKTtcbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RIdG1sID0gU3RyaW5nKGZpcnN0UmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICRmaXJzdCA9IGNoZWVyaW8ubG9hZChmaXJzdEh0bWwpO1xuXG4gICAgICAgIC8vIEdldCBwYWdlIGNvdW50XG4gICAgICAgIGNvbnN0IHBhZ2VyVGFyZ2V0cyA9ICRmaXJzdCgnZGl2LnBhZ2VyIHNwYW4udGFyZ2V0Jyk7XG4gICAgICAgIGxldCBtYXhQYWdlID0gMTtcbiAgICAgICAgaWYgKHBhZ2VyVGFyZ2V0cy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJGZpcnN0KHBhZ2VyVGFyZ2V0c1twYWdlclRhcmdldHMubGVuZ3RoIC0gMl0pXG4gICAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgICAudHJpbSgpO1xuICAgICAgICAgIG1heFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCkgfHwgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBtZXNzYWdlIElEcyBmcm9tIGFsbCBwYWdlc1xuICAgICAgICBjb25zdCBtZXNzYWdlSWRzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIGlmIChtYXhQYWdlID4gMSkge1xuICAgICAgICAgIGNvbnN0IGJvZGllcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAxOyBwYWdlIDw9IG1heFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgICAgYm9kaWVzLnB1c2goeyBwYWdlLCBtb2R1bGVOYW1lIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMpO1xuICAgICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgICAgICAkKCd0ci5tZXNzYWdlJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YUhyZWYgPSAkKGVsZW0pLmF0dHIoJ2RhdGEtaHJlZicpID8/ICcnO1xuICAgICAgICAgICAgICBjb25zdCBpZE1hdGNoID0gZGF0YUhyZWYubWF0Y2goL1xcLyhcXGQrKSQvKTtcbiAgICAgICAgICAgICAgaWYgKGlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VJZHMucHVzaChOdW1iZXIucGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICRmaXJzdCgndHIubWVzc2FnZScpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhSHJlZiA9ICRmaXJzdChlbGVtKS5hdHRyKCdkYXRhLWhyZWYnKSA/PyAnJztcbiAgICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBkYXRhSHJlZi5tYXRjaCgvXFwvKFxcZCspJC8pO1xuICAgICAgICAgICAgaWYgKGlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgICBtZXNzYWdlSWRzLnB1c2goTnVtYmVyLnBhcnNlSW50KGlkTWF0Y2hbMV0sIDEwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgbWVzc2FnZXNcbiAgICAgICAgY29uc3QgbWVzc2FnZXNSZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyhjbGllbnQsIG1lc3NhZ2VJZHMpO1xuICAgICAgICBpZiAobWVzc2FnZXNSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IG1lc3NhZ2VzUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fFxuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yIHx8XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvclxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIG1lc3NhZ2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEluYm94XG4gKi9cbmV4cG9ydCBjbGFzcyBQcml2YXRlTWVzc2FnZUluYm94IGV4dGVuZHMgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEdldCBhbGwgbWVzc2FnZXMgaW4gaW5ib3hcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKGNsaWVudDogQ2xpZW50KTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlSW5ib3g+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uYWNxdWlyZUZyb21Nb2R1bGUoXG4gICAgICAgICAgY2xpZW50LFxuICAgICAgICAgICdkYXNoYm9hcmQvbWVzc2FnZXMvRE1JbmJveE1vZHVsZSdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluYm94ID0gbmV3IFByaXZhdGVNZXNzYWdlSW5ib3goY2xpZW50KTtcbiAgICAgICAgaW5ib3gucHVzaCguLi5yZXN1bHQudmFsdWUpO1xuICAgICAgICByZXR1cm4gaW5ib3g7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBpbmJveDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZW50IGJveFxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94IGV4dGVuZHMgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEdldCBhbGwgbWVzc2FnZXMgaW4gc2VudCBib3hcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKGNsaWVudDogQ2xpZW50KTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlU2VudEJveD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5hY3F1aXJlRnJvbU1vZHVsZShcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgJ2Rhc2hib2FyZC9tZXNzYWdlcy9ETVNlbnRNb2R1bGUnXG4gICAgICAgICk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZW50Qm94ID0gbmV3IFByaXZhdGVNZXNzYWdlU2VudEJveChjbGllbnQpO1xuICAgICAgICBzZW50Qm94LnB1c2goLi4ucmVzdWx0LnZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHNlbnRCb3g7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBzZW50IGJveDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHtcbiAgUHJpdmF0ZU1lc3NhZ2UsXG4gIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbixcbiAgUHJpdmF0ZU1lc3NhZ2VJbmJveCxcbiAgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94LFxufSBmcm9tICcuLi8uLi9wcml2YXRlLW1lc3NhZ2UnO1xuaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSAnLi4vLi4vdXNlci91c2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiBQcml2YXRlIG1lc3NhZ2Ugb3BlcmF0aW9ucyBhY2Nlc3NvclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBHZXQgaW5ib3hcbiAqIGNvbnN0IGluYm94UmVzdWx0ID0gYXdhaXQgY2xpZW50LnByaXZhdGVNZXNzYWdlLmluYm94KCk7XG4gKiBpZiAoIWluYm94UmVzdWx0LmlzT2soKSkge1xuICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgaW5ib3gnKTtcbiAqIH1cbiAqIGNvbnN0IGluYm94ID0gaW5ib3hSZXN1bHQudmFsdWU7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVzc2FnZSBieSBtZXNzYWdlIElEXG4gICAqXG4gICAqIEBwYXJhbSBpZCAtIE1lc3NhZ2UgSURcbiAgICogQHJldHVybnMgTWVzc2FnZSBvYmplY3Qgd3JhcHBlZCBpbiBSZXN1bHQgdHlwZVxuICAgKi9cbiAgZ2V0KGlkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2UuZnJvbUlkKHRoaXMuY2xpZW50LCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lc3NhZ2VzIGZyb20gbXVsdGlwbGUgbWVzc2FnZSBJRHNcbiAgICogQHBhcmFtIGlkcyAtIEFycmF5IG9mIG1lc3NhZ2UgSURzXG4gICAqIEByZXR1cm5zIE1lc3NhZ2UgY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0TWVzc2FnZXMoaWRzOiBudW1iZXJbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uLmZyb21JZHModGhpcy5jbGllbnQsIGlkcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGluYm94IG1lc3NhZ2UgbGlzdFxuICAgKiBAcmV0dXJucyBJbmJveFxuICAgKi9cbiAgaW5ib3goKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlSW5ib3g+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VJbmJveC5hY3F1aXJlKHRoaXMuY2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2VudCBib3ggbWVzc2FnZSBsaXN0XG4gICAqIEByZXR1cm5zIFNlbnQgYm94XG4gICAqL1xuICBzZW50Qm94KCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZVNlbnRCb3g+IHtcbiAgICByZXR1cm4gUHJpdmF0ZU1lc3NhZ2VTZW50Qm94LmFjcXVpcmUodGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBwcml2YXRlIG1lc3NhZ2VcbiAgICogQHBhcmFtIHJlY2lwaWVudCAtIFJlY2lwaWVudFxuICAgKiBAcGFyYW0gc3ViamVjdCAtIFN1YmplY3RcbiAgICogQHBhcmFtIGJvZHkgLSBCb2R5XG4gICAqL1xuICBzZW5kKHJlY2lwaWVudDogVXNlciwgc3ViamVjdDogc3RyaW5nLCBib2R5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZS5zZW5kKHRoaXMuY2xpZW50LCByZWNpcGllbnQsIHN1YmplY3QsIGJvZHkpO1xuICB9XG59XG5cbmV4cG9ydCB7IFByaXZhdGVNZXNzYWdlLCBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24sIFByaXZhdGVNZXNzYWdlSW5ib3gsIFByaXZhdGVNZXNzYWdlU2VudEJveCB9O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQge1xuICBGb3J1bUNhdGVnb3J5LFxuICBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbixcbiAgRm9ydW1Qb3N0LFxuICBGb3J1bVRocmVhZCxcbiAgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLFxufSBmcm9tICcuLi8uLi9mb3J1bSc7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcblxuLyoqXG4gKiBGb3J1bSBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZvcnVtIGNhdGVnb3J5IGxpc3RcbiAgICogQHJldHVybnMgQ2F0ZWdvcnkgbGlzdFxuICAgKi9cbiAgZ2V0Q2F0ZWdvcmllcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24uYWNxdWlyZUFsbCh0aGlzLnNpdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWRcbiAgICogQHBhcmFtIHRocmVhZElkIC0gVGhyZWFkIElEXG4gICAqIEByZXR1cm5zIFRocmVhZFxuICAgKi9cbiAgZ2V0VGhyZWFkKHRocmVhZElkOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWQ+IHtcbiAgICByZXR1cm4gRm9ydW1UaHJlYWQuZ2V0RnJvbUlkKHRoaXMuc2l0ZSwgdGhyZWFkSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtdWx0aXBsZSB0aHJlYWRzXG4gICAqIEBwYXJhbSB0aHJlYWRJZHMgLSBBcnJheSBvZiB0aHJlYWQgSURzXG4gICAqIEByZXR1cm5zIFRocmVhZCBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRUaHJlYWRzKHRocmVhZElkczogbnVtYmVyW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIEZvcnVtVGhyZWFkQ29sbGVjdGlvbi5hY3F1aXJlRnJvbVRocmVhZElkcyh0aGlzLnNpdGUsIHRocmVhZElkcyk7XG4gIH1cbn1cblxuZXhwb3J0IHsgRm9ydW1DYXRlZ29yeSwgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24sIEZvcnVtUG9zdCwgRm9ydW1UaHJlYWQsIEZvcnVtVGhyZWFkQ29sbGVjdGlvbiB9O1xuIiwKICAgICJpbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIFRhcmdldEVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgdHlwZSBRTUNVc2VyLCBRdWlja01vZHVsZSB9IGZyb20gJy4uLy4uLy4uL3V0aWwvcXVpY2stbW9kdWxlJztcbmltcG9ydCB0eXBlIHsgVXNlciB9IGZyb20gJy4uLy4uL3VzZXIvdXNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB7IFNpdGVBcHBsaWNhdGlvbiB9IGZyb20gJy4uL3NpdGUtYXBwbGljYXRpb24nO1xuaW1wb3J0IHsgU2l0ZU1lbWJlciB9IGZyb20gJy4uL3NpdGUtbWVtYmVyJztcblxuLyoqXG4gKiBTaXRlIG1lbWJlciBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1iZXJBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUpIHtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgbWVtYmVyc1xuICAgKiBAcmV0dXJucyBNZW1iZXIgbGlzdFxuICAgKi9cbiAgZ2V0QWxsKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtb2RlcmF0b3IgbGlzdFxuICAgKiBAcmV0dXJucyBNb2RlcmF0b3IgbGlzdFxuICAgKi9cbiAgZ2V0TW9kZXJhdG9ycygpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZU1lbWJlcltdPiB7XG4gICAgcmV0dXJuIFNpdGVNZW1iZXIuZ2V0TWVtYmVycyh0aGlzLnNpdGUsICdtb2RlcmF0b3JzJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFkbWluIGxpc3RcbiAgICogQHJldHVybnMgQWRtaW4gbGlzdFxuICAgKi9cbiAgZ2V0QWRtaW5zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJ2FkbWlucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwZW5kaW5nIG1lbWJlcnNoaXAgYXBwbGljYXRpb25zXG4gICAqIEByZXR1cm5zIEFwcGxpY2F0aW9uIGxpc3RcbiAgICovXG4gIGdldEFwcGxpY2F0aW9ucygpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUFwcGxpY2F0aW9uW10+IHtcbiAgICByZXR1cm4gU2l0ZUFwcGxpY2F0aW9uLmFjcXVpcmVBbGwodGhpcy5zaXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggbWVtYmVyc1xuICAgKiBAcGFyYW0gcXVlcnkgLSBTZWFyY2ggcXVlcnkgKHBhcnQgb2YgdXNlcm5hbWUpXG4gICAqIEByZXR1cm5zIE1hdGNoZWQgdXNlciBsaXN0IChRTUNVc2VyIGZvcm1hdClcbiAgICovXG4gIGxvb2t1cChxdWVyeTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFFNQ1VzZXJbXT4ge1xuICAgIHJldHVybiBRdWlja01vZHVsZS5tZW1iZXJMb29rdXAodGhpcy5zaXRlLmlkLCBxdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogSW52aXRlIHVzZXIgdG8gc2l0ZVxuICAgKiBAcGFyYW0gdXNlciAtIFVzZXIgdG8gaW52aXRlXG4gICAqIEBwYXJhbSB0ZXh0IC0gSW52aXRhdGlvbiBtZXNzYWdlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGludml0ZSh1c2VyOiBVc2VyLCB0ZXh0OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdNYW5hZ2VTaXRlTWVtYmVyc2hpcEFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ2ludml0ZU1lbWJlcicsXG4gICAgICAgICAgICB1c2VyX2lkOiB1c2VyLmlkLFxuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzdWx0LmVycm9yO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RTdGF0dXNFcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X2ludml0ZWQnKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5IGludml0ZWQgdG8gJHt0aGlzLnNpdGUudW5peE5hbWV9OiAke3VzZXIubmFtZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ2FscmVhZHlfbWVtYmVyJykge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXJyb3IoXG4gICAgICAgICAgICAgICAgYFVzZXIgaXMgYWxyZWFkeSBhIG1lbWJlciBvZiAke3RoaXMuc2l0ZS51bml4TmFtZX06ICR7dXNlci5uYW1lfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGFyZ2V0RXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBpbnZpdGUgdXNlcjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2l0ZUFwcGxpY2F0aW9uLCBTaXRlTWVtYmVyIH07XG4iLAogICAgIi8qKlxuICogUXVpY2tNb2R1bGUgLSBXaWtpZG90IGxpZ2h0d2VpZ2h0IEFQSVxuICpcbiAqIFNlYXJjaCBmdW5jdGlvbmFsaXR5IHVzaW5nIHF1aWNrbW9kdWxlLnBocCBlbmRwb2ludFxuICovXG5cbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24sIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4uL2Nvbm5lY3Rvci9hbWMtY29uZmlnJztcbmltcG9ydCB7IGZldGNoV2l0aFJldHJ5IH0gZnJvbSAnLi9odHRwJztcblxuLyoqXG4gKiBRdWlja01vZHVsZSBtb2R1bGUgbmFtZVxuICovXG5leHBvcnQgdHlwZSBRdWlja01vZHVsZU5hbWUgPSAnTWVtYmVyTG9va3VwUU1vZHVsZScgfCAnVXNlckxvb2t1cFFNb2R1bGUnIHwgJ1BhZ2VMb29rdXBRTW9kdWxlJztcblxuLyoqXG4gKiBRdWlja01vZHVsZSB1c2VyIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUU1DVXNlciB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZSBwYWdlIGluZm9ybWF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUU1DUGFnZSB7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIHVuaXhOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUXVpY2tNb2R1bGUgcmVzcG9uc2Ugc2NoZW1hXG4gKi9cbmNvbnN0IHF1aWNrTW9kdWxlVXNlclJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICB1c2Vyczogei51bmlvbihbXG4gICAgei5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgdXNlcl9pZDogei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pLFxuICAgICAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgICAgfSlcbiAgICApLFxuICAgIHoubGl0ZXJhbChmYWxzZSksXG4gIF0pLFxufSk7XG5cbmNvbnN0IHF1aWNrTW9kdWxlUGFnZVJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBwYWdlczogei51bmlvbihbXG4gICAgei5hcnJheShcbiAgICAgIHoub2JqZWN0KHtcbiAgICAgICAgdGl0bGU6IHouc3RyaW5nKCksXG4gICAgICAgIHVuaXhfbmFtZTogei5zdHJpbmcoKSxcbiAgICAgIH0pXG4gICAgKSxcbiAgICB6LmxpdGVyYWwoZmFsc2UpLFxuICBdKSxcbn0pO1xuXG4vKipcbiAqIFNlbmQgcmVxdWVzdCB0byBRdWlja01vZHVsZSBlbmRwb2ludFxuICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0UXVpY2tNb2R1bGUoXG4gIG1vZHVsZU5hbWU6IFF1aWNrTW9kdWxlTmFtZSxcbiAgc2l0ZUlkOiBudW1iZXIsXG4gIHF1ZXJ5OiBzdHJpbmdcbik6IFByb21pc2U8dW5rbm93bj4ge1xuICBjb25zdCB1cmwgPSBgaHR0cHM6Ly93d3cud2lraWRvdC5jb20vcXVpY2ttb2R1bGUucGhwP21vZHVsZT0ke21vZHVsZU5hbWV9JnM9JHtzaXRlSWR9JnE9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfWA7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeSh1cmwsIERFRkFVTFRfQU1DX0NPTkZJRywge1xuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgaGVhZGVyczoge1xuICAgICAgQWNjZXB0OiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgfSxcbiAgICBjaGVja09rOiBmYWxzZSwgLy8gSGFuZGxlIEhUVFAgZXJyb3JzIG1hbnVhbGx5XG4gIH0pO1xuXG4gIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDUwMCkge1xuICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBub3QgZm91bmQ6IHNpdGVJZD0ke3NpdGVJZH1gKTtcbiAgfVxuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBRdWlja01vZHVsZSByZXF1ZXN0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG4vKipcbiAqIFNlYXJjaCBzaXRlIG1lbWJlcnNcbiAqIEBwYXJhbSBzaXRlSWQgLSBTaXRlIElEXG4gKiBAcGFyYW0gcXVlcnkgLSBTZWFyY2ggcXVlcnkgKHBhcnRpYWwgdXNlcm5hbWUpXG4gKiBAcmV0dXJucyBMaXN0IG9mIG1hdGNoaW5nIHVzZXJzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1iZXJMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnTWVtYmVyTG9va3VwUU1vZHVsZScsIHNpdGVJZCwgcXVlcnkpO1xuICAgICAgY29uc3QgcGFyc2VkID0gcXVpY2tNb2R1bGVVc2VyUmVzcG9uc2VTY2hlbWEucGFyc2UoZGF0YSk7XG5cbiAgICAgIGlmIChwYXJzZWQudXNlcnMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZC51c2Vycy5tYXAoKHVzZXIpID0+ICh7XG4gICAgICAgIGlkOiB0eXBlb2YgdXNlci51c2VyX2lkID09PSAnc3RyaW5nJyA/IE51bWJlci5wYXJzZUludCh1c2VyLnVzZXJfaWQsIDEwKSA6IHVzZXIudXNlcl9pZCxcbiAgICAgICAgbmFtZTogdXNlci5uYW1lLFxuICAgICAgfSkpO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYE1lbWJlciBsb29rdXAgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFNlYXJjaCB1c2VycyBhY3Jvc3MgYWxsIFdpa2lkb3RcbiAqIEBwYXJhbSBzaXRlSWQgLSBTaXRlIElEIChhbnkgc2l0ZSBJRCB3b3JrcylcbiAqIEBwYXJhbSBxdWVyeSAtIFNlYXJjaCBxdWVyeSAocGFydGlhbCB1c2VybmFtZSlcbiAqIEByZXR1cm5zIExpc3Qgb2YgbWF0Y2hpbmcgdXNlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZXJMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnVXNlckxvb2t1cFFNb2R1bGUnLCBzaXRlSWQsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHF1aWNrTW9kdWxlVXNlclJlc3BvbnNlU2NoZW1hLnBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAocGFyc2VkLnVzZXJzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQudXNlcnMubWFwKCh1c2VyKSA9PiAoe1xuICAgICAgICBpZDogdHlwZW9mIHVzZXIudXNlcl9pZCA9PT0gJ3N0cmluZycgPyBOdW1iZXIucGFyc2VJbnQodXNlci51c2VyX2lkLCAxMCkgOiB1c2VyLnVzZXJfaWQsXG4gICAgICAgIG5hbWU6IHVzZXIubmFtZSxcbiAgICAgIH0pKTtcbiAgICB9KSgpLFxuICAgIChlcnJvcikgPT4ge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBVc2VyIGxvb2t1cCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogU2VhcmNoIHBhZ2VzIHdpdGhpbiBzaXRlXG4gKiBAcGFyYW0gc2l0ZUlkIC0gU2l0ZSBJRFxuICogQHBhcmFtIHF1ZXJ5IC0gU2VhcmNoIHF1ZXJ5IChwYXJ0aWFsIHBhZ2UgbmFtZSlcbiAqIEByZXR1cm5zIExpc3Qgb2YgbWF0Y2hpbmcgcGFnZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZ2VMb29rdXAoc2l0ZUlkOiBudW1iZXIsIHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DUGFnZVtdPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcXVlc3RRdWlja01vZHVsZSgnUGFnZUxvb2t1cFFNb2R1bGUnLCBzaXRlSWQsIHF1ZXJ5KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHF1aWNrTW9kdWxlUGFnZVJlc3BvbnNlU2NoZW1hLnBhcnNlKGRhdGEpO1xuXG4gICAgICBpZiAocGFyc2VkLnBhZ2VzID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWQucGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICB0aXRsZTogcGFnZS50aXRsZSxcbiAgICAgICAgdW5peE5hbWU6IHBhZ2UudW5peF9uYW1lLFxuICAgICAgfSkpO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgbG9va3VwIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZSBBUEkgKG1haW50YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICogQGRlcHJlY2F0ZWQgVXNlIGluZGl2aWR1YWwgZnVuY3Rpb25zIChtZW1iZXJMb29rdXAsIHVzZXJMb29rdXAsIHBhZ2VMb29rdXApIGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IFF1aWNrTW9kdWxlOiB7XG4gIG1lbWJlckxvb2t1cDogdHlwZW9mIG1lbWJlckxvb2t1cDtcbiAgdXNlckxvb2t1cDogdHlwZW9mIHVzZXJMb29rdXA7XG4gIHBhZ2VMb29rdXA6IHR5cGVvZiBwYWdlTG9va3VwO1xufSA9IHtcbiAgbWVtYmVyTG9va3VwOiBtZW1iZXJMb29rdXAsXG4gIHVzZXJMb29rdXA6IHVzZXJMb29rdXAsXG4gIHBhZ2VMb29rdXA6IHBhZ2VMb29rdXAsXG59O1xuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHtcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdFN0YXR1c0Vycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi9zaXRlJztcblxuLyoqXG4gKiBTaXRlIG1lbWJlcnNoaXAgYXBwbGljYXRpb24gZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVBcHBsaWNhdGlvbkRhdGEge1xuICBzaXRlOiBTaXRlO1xuICB1c2VyOiBBYnN0cmFjdFVzZXI7XG4gIHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTaXRlIG1lbWJlcnNoaXAgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVBcHBsaWNhdGlvbiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBwdWJsaWMgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFNpdGVBcHBsaWNhdGlvbkRhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy51c2VyID0gZGF0YS51c2VyO1xuICAgIHRoaXMudGV4dCA9IGRhdGEudGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBlbmRpbmcgbWVtYmVyc2hpcCBhcHBsaWNhdGlvbnNcbiAgICogQHBhcmFtIHNpdGUgLSBUYXJnZXQgc2l0ZVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGwoc2l0ZTogU2l0ZSk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlQXBwbGljYXRpb25bXT4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBnZXQgYXBwbGljYXRpb25zJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7IG1vZHVsZU5hbWU6ICdtYW5hZ2VzaXRlL01hbmFnZVNpdGVNZW1iZXJzQXBwbGljYXRpb25zTW9kdWxlJyB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuXG4gICAgICAgIC8vIFBlcm1pc3Npb24gY2hlY2tcbiAgICAgICAgaWYgKGh0bWwuaW5jbHVkZXMoJ1dJS0lET1QucGFnZS5saXN0ZW5lcnMubG9naW5DbGljayhldmVudCknKSkge1xuICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignWW91IGFyZSBub3QgYWxsb3dlZCB0byBhY2Nlc3MgdGhpcyBwYWdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICBjb25zdCBhcHBsaWNhdGlvbnM6IFNpdGVBcHBsaWNhdGlvbltdID0gW107XG5cbiAgICAgICAgY29uc3QgdXNlckVsZW1lbnRzID0gJCgnaDMgc3Bhbi5wcmludHVzZXInKS50b0FycmF5KCk7XG4gICAgICAgIGNvbnN0IHRleHRXcmFwcGVyRWxlbWVudHMgPSAkKCd0YWJsZScpLnRvQXJyYXkoKTtcblxuICAgICAgICBpZiAodXNlckVsZW1lbnRzLmxlbmd0aCAhPT0gdGV4dFdyYXBwZXJFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKFxuICAgICAgICAgICAgJ0xlbmd0aCBvZiB1c2VyX2VsZW1lbnRzIGFuZCB0ZXh0X3dyYXBwZXJfZWxlbWVudHMgYXJlIGRpZmZlcmVudCdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1c2VyRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB1c2VyRWxlbWVudCA9IHVzZXJFbGVtZW50c1tpXTtcbiAgICAgICAgICBjb25zdCB0ZXh0V3JhcHBlckVsZW1lbnQgPSB0ZXh0V3JhcHBlckVsZW1lbnRzW2ldO1xuXG4gICAgICAgICAgaWYgKCF1c2VyRWxlbWVudCB8fCAhdGV4dFdyYXBwZXJFbGVtZW50KSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICQodXNlckVsZW1lbnQpKTtcbiAgICAgICAgICBjb25zdCB0ZXh0RWxlbWVudCA9ICQodGV4dFdyYXBwZXJFbGVtZW50KS5maW5kKCd0ZCcpLmVxKDEpO1xuICAgICAgICAgIGNvbnN0IHRleHQgPSB0ZXh0RWxlbWVudC50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgYXBwbGljYXRpb25zLnB1c2gobmV3IFNpdGVBcHBsaWNhdGlvbih7IHNpdGUsIHVzZXIsIHRleHQgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9ucztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgYXBwbGljYXRpb25zOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gcHJvY2VzcyBhcHBsaWNhdGlvblxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBwcml2YXRlIHByb2Nlc3MoYWN0aW9uOiAnYWNjZXB0JyB8ICdkZWNsaW5lJyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ01hbmFnZVNpdGVNZW1iZXJzaGlwQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnYWNjZXB0QXBwbGljYXRpb24nLFxuICAgICAgICAgICAgdXNlcl9pZDogdGhpcy51c2VyLmlkLFxuICAgICAgICAgICAgdGV4dDogYHlvdXIgYXBwbGljYXRpb24gaGFzIGJlZW4gJHthY3Rpb259ZWRgLFxuICAgICAgICAgICAgdHlwZTogYWN0aW9uLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdFN0YXR1c0Vycm9yICYmIGVycm9yLnN0YXR1c0NvZGUgPT09ICdub19hcHBsaWNhdGlvbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgQXBwbGljYXRpb24gbm90IGZvdW5kOiAke3RoaXMudXNlci5uYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgYXBwbGljYXRpb246ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdCBtZW1iZXJzaGlwIGFwcGxpY2F0aW9uXG4gICAqL1xuICBhY2NlcHQoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKCdhY2NlcHQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNsaW5lIG1lbWJlcnNoaXAgYXBwbGljYXRpb25cbiAgICovXG4gIGRlY2xpbmUoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9jZXNzKCdkZWNsaW5lJyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZUFwcGxpY2F0aW9uKHVzZXI9JHt0aGlzLnVzZXIubmFtZX0sIHNpdGU9JHt0aGlzLnNpdGUudW5peE5hbWV9LCB0ZXh0PSR7dGhpcy50ZXh0fSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIFRhcmdldEVycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4vc2l0ZSc7XG5cbi8qKlxuICogU2l0ZSBtZW1iZXIgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVNZW1iZXJEYXRhIHtcbiAgc2l0ZTogU2l0ZTtcbiAgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBqb2luZWRBdDogRGF0ZSB8IG51bGw7XG59XG5cbi8qKlxuICogU2l0ZSBtZW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVNZW1iZXIge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IGpvaW5lZEF0OiBEYXRlIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTaXRlTWVtYmVyRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgdGhpcy5qb2luZWRBdCA9IGRhdGEuam9pbmVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgbWVtYmVyIGluZm9ybWF0aW9uIGZyb20gSFRNTFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2Uoc2l0ZTogU2l0ZSwgaHRtbDogc3RyaW5nKTogU2l0ZU1lbWJlcltdIHtcbiAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgIGNvbnN0IG1lbWJlcnM6IFNpdGVNZW1iZXJbXSA9IFtdO1xuXG4gICAgJCgndGFibGUgdHInKS5lYWNoKChfaSwgcm93KSA9PiB7XG4gICAgICBjb25zdCB0ZHMgPSAkKHJvdykuZmluZCgndGQnKTtcbiAgICAgIGNvbnN0IHVzZXJFbGVtID0gJCh0ZHNbMF0pLmZpbmQoJy5wcmludHVzZXInKTtcblxuICAgICAgaWYgKHVzZXJFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsIHVzZXJFbGVtKTtcblxuICAgICAgLy8gU2Vjb25kIHRkIGNvbnRhaW5zIGpvaW4gZGF0ZSBpZiBleGlzdHNcbiAgICAgIGxldCBqb2luZWRBdDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgICAgaWYgKHRkcy5sZW5ndGggPj0gMikge1xuICAgICAgICBjb25zdCBvZGF0ZUVsZW0gPSAkKHRkc1sxXSkuZmluZCgnLm9kYXRlJyk7XG4gICAgICAgIGlmIChvZGF0ZUVsZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGpvaW5lZEF0ID0gcGFyc2VPZGF0ZShvZGF0ZUVsZW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG1lbWJlcnMucHVzaChuZXcgU2l0ZU1lbWJlcih7IHNpdGUsIHVzZXIsIGpvaW5lZEF0IH0pKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtZW1iZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIG1lbWJlciBsaXN0XG4gICAqIEBwYXJhbSBzaXRlIC0gVGFyZ2V0IHNpdGVcbiAgICogQHBhcmFtIGdyb3VwIC0gR3JvdXAgKFwiYWRtaW5zXCIsIFwibW9kZXJhdG9yc1wiLCBvciBlbXB0eSBzdHJpbmcgZm9yIGFsbCBtZW1iZXJzKVxuICAgKi9cbiAgc3RhdGljIGdldE1lbWJlcnMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBncm91cDogJ2FkbWlucycgfCAnbW9kZXJhdG9ycycgfCAnJyA9ICcnXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZW1iZXJzOiBTaXRlTWVtYmVyW10gPSBbXTtcblxuICAgICAgICAvLyBHZXQgZmlyc3QgcGFnZVxuICAgICAgICBjb25zdCBmaXJzdFJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ21lbWJlcnNoaXAvTWVtYmVyc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZTogMSxcbiAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmaXJzdFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gZmlyc3RSZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghZmlyc3RSZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEh0bWwgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgbWVtYmVycy5wdXNoKC4uLlNpdGVNZW1iZXIucGFyc2Uoc2l0ZSwgZmlyc3RIdG1sKSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnZXJcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0SHRtbCk7XG4gICAgICAgIGNvbnN0IHBhZ2VyTGlua3MgPSAkZmlyc3QoJ2Rpdi5wYWdlciBhJyk7XG4gICAgICAgIGlmIChwYWdlckxpbmtzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RQYWdlVGV4dCA9ICRmaXJzdChwYWdlckxpbmtzW3BhZ2VyTGlua3MubGVuZ3RoIC0gMl0pXG4gICAgICAgICAgLnRleHQoKVxuICAgICAgICAgIC50cmltKCk7XG4gICAgICAgIGNvbnN0IGxhc3RQYWdlID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlVGV4dCwgMTApIHx8IDE7XG4gICAgICAgIGlmIChsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbWJlcnM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcmVtYWluaW5nIHBhZ2VzXG4gICAgICAgIGNvbnN0IGJvZGllcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBwYWdlID0gMjsgcGFnZSA8PSBsYXN0UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgYm9kaWVzLnB1c2goe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ21lbWJlcnNoaXAvTWVtYmVyc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdHMgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBtZW1iZXJzLnB1c2goLi4uU2l0ZU1lbWJlci5wYXJzZShzaXRlLCBodG1sKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVtYmVyczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gY2hhbmdlIGdyb3VwXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHByaXZhdGUgY2hhbmdlR3JvdXAoXG4gICAgZXZlbnQ6ICd0b01vZGVyYXRvcnMnIHwgJ3JlbW92ZU1vZGVyYXRvcicgfCAndG9BZG1pbnMnIHwgJ3JlbW92ZUFkbWluJ1xuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdNYW5hZ2VTaXRlTWVtYmVyc2hpcEFjdGlvbicsXG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIHVzZXJfaWQ6IHRoaXMudXNlci5pZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90U3RhdHVzRXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSAnbm90X2FscmVhZHknKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihgVXNlciBpcyBub3QgbW9kZXJhdG9yL2FkbWluOiAke3RoaXMudXNlci5uYW1lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X2FkbWluJyB8fCBlcnJvci5zdGF0dXNDb2RlID09PSAnYWxyZWFkeV9tb2RlcmF0b3InKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5ICR7ZXJyb3Iuc3RhdHVzQ29kZS5yZXBsYWNlKCdhbHJlYWR5XycsICcnKX06ICR7dGhpcy51c2VyLm5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUYXJnZXRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNoYW5nZSBtZW1iZXIgZ3JvdXA6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb21vdGUgdG8gbW9kZXJhdG9yXG4gICAqL1xuICB0b01vZGVyYXRvcigpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUdyb3VwKCd0b01vZGVyYXRvcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgbW9kZXJhdG9yIHByaXZpbGVnZXNcbiAgICovXG4gIHJlbW92ZU1vZGVyYXRvcigpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZUdyb3VwKCdyZW1vdmVNb2RlcmF0b3InKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9tb3RlIHRvIGFkbWluXG4gICAqL1xuICB0b0FkbWluKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3RvQWRtaW5zJyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFkbWluIHByaXZpbGVnZXNcbiAgICovXG4gIHJlbW92ZUFkbWluKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3JlbW92ZUFkbWluJyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgU2l0ZU1lbWJlcih1c2VyPSR7dGhpcy51c2VyLm5hbWV9LCBzaXRlPSR7dGhpcy5zaXRlLnVuaXhOYW1lfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgeyBQYWdlLCBQYWdlQ29sbGVjdGlvbiwgU2VhcmNoUGFnZXNRdWVyeSB9IGZyb20gJy4uLy4uL3BhZ2UnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5cbi8qKlxuICogU2luZ2xlIHBhZ2Ugb3BlcmF0aW9ucyBhY2Nlc3NvclxuICovXG5leHBvcnQgY2xhc3MgUGFnZUFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgYnkgVU5JWCBuYW1lXG4gICAqIEBwYXJhbSB1bml4TmFtZSAtIFBhZ2UgVU5JWCBuYW1lIChlLmcuLCAnc2NwLTE3MycpXG4gICAqIEByZXR1cm5zIFBhZ2UgKG51bGwgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZ2V0KHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZSB8IG51bGw+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBTZWFyY2hQYWdlc1F1ZXJ5KHsgZnVsbG5hbWU6IHVuaXhOYW1lIH0pO1xuICAgICAgICBjb25zdCB1c2VyUGFyc2VyID0gcGFyc2VVc2VyLmJpbmQobnVsbCwgdGhpcy5zaXRlLmNsaWVudCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uc2VhcmNoUGFnZXModGhpcy5zaXRlLCB1c2VyUGFyc2VyLCBxdWVyeSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWUubGVuZ3RoID4gMCA/IChyZXN1bHQudmFsdWVbMF0gPz8gbnVsbCkgOiBudWxsO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBwYWdlXG4gICAqIEBwYXJhbSBmdWxsbmFtZSAtIFBhZ2UgZnVsbG5hbWUgKGUuZy4sICdzY3AtMTczJylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDcmVhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGNyZWF0ZShcbiAgICBmdWxsbmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHtcbiAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgICAgc291cmNlPzogc3RyaW5nO1xuICAgICAgY29tbWVudD86IHN0cmluZztcbiAgICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gICAgfSA9IHt9XG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmNyZWF0ZU9yRWRpdCh0aGlzLnNpdGUsIGZ1bGxuYW1lLCB7XG4gICAgICB0aXRsZTogb3B0aW9ucy50aXRsZSxcbiAgICAgIHNvdXJjZTogb3B0aW9ucy5zb3VyY2UsXG4gICAgICBjb21tZW50OiBvcHRpb25zLmNvbW1lbnQsXG4gICAgICBmb3JjZUVkaXQ6IG9wdGlvbnMuZm9yY2VFZGl0LFxuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IFBhZ2UgfTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDaGVlcmlvIH0gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHR5cGUgeyBBbnlOb2RlIH0gZnJvbSAnZG9taGFuZGxlcic7XG5pbXBvcnQgcExpbWl0IGZyb20gJ3AtbGltaXQnO1xuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTG9naW5SZXF1aXJlZEVycm9yLFxuICBOb0VsZW1lbnRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFRhcmdldEV4aXN0c0Vycm9yLFxuICBVbmV4cGVjdGVkRXJyb3IsXG59IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQU1DUmVxdWVzdEJvZHkgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuLi8uLi91dGlsL2h0dHAnO1xuaW1wb3J0IHsgcGFyc2VPZGF0ZSwgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHsgUGFnZUZpbGVDb2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLWZpbGUnO1xuaW1wb3J0IHsgUGFnZU1ldGFDb2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLW1ldGEnO1xuaW1wb3J0IHsgUGFnZVJldmlzaW9uLCBQYWdlUmV2aXNpb25Db2xsZWN0aW9uIH0gZnJvbSAnLi9wYWdlLXJldmlzaW9uJztcbmltcG9ydCB7IFBhZ2VTb3VyY2UgfSBmcm9tICcuL3BhZ2Utc291cmNlJztcbmltcG9ydCB7IFBhZ2VWb3RlLCBQYWdlVm90ZUNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2Utdm90ZSc7XG5pbXBvcnQgeyBERUZBVUxUX01PRFVMRV9CT0RZLCBERUZBVUxUX1BFUl9QQUdFLCBTZWFyY2hQYWdlc1F1ZXJ5IH0gZnJvbSAnLi9zZWFyY2gtcXVlcnknO1xuXG4vKipcbiAqIFNjaGVtYSBmb3IgTGlzdFBhZ2VzTW9kdWxlIHBhcnNlIHJlc3VsdFxuICogVXNlcyBab2QgZm9yIHR5cGUtc2FmZSB2YWxpZGF0aW9uIG9mIHBhcnNlIHJlc3VsdHNcbiAqL1xuY29uc3QgcGFnZVBhcmFtc1NjaGVtYSA9IHoub2JqZWN0KHtcbiAgZnVsbG5hbWU6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIG5hbWU6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIGNhdGVnb3J5OiB6LnByZXByb2Nlc3MoKHYpID0+IHYgPz8gJycsIHouc3RyaW5nKCkpLFxuICB0aXRsZTogei5wcmVwcm9jZXNzKCh2KSA9PiB2ID8/ICcnLCB6LnN0cmluZygpKSxcbiAgY2hpbGRyZW5fY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIGNvbW1lbnRzX2NvdW50OiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICBzaXplOiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmc6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHZvdGVzX2NvdW50OiB6LmNvZXJjZS5udW1iZXIoKS5kZWZhdWx0KDApLFxuICByYXRpbmdfcGVyY2VudDogei5jb2VyY2UubnVtYmVyKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICByZXZpc2lvbnNfY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHBhcmVudF9mdWxsbmFtZTogei5zdHJpbmcoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIHRhZ3M6IHouYXJyYXkoei5zdHJpbmcoKSkuZGVmYXVsdChbXSksXG4gIGNyZWF0ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNyZWF0ZWRfYXQ6IHouZGF0ZSgpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdXBkYXRlZF9ieTogei5jdXN0b208QWJzdHJhY3RVc2VyPigpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdXBkYXRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICBjb21tZW50ZWRfYnk6IHouY3VzdG9tPEFic3RyYWN0VXNlcj4oKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNvbW1lbnRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxufSk7XG5cbi8qKlxuICogUGFnZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBmdWxsbmFtZTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGNoaWxkcmVuQ291bnQ6IG51bWJlcjtcbiAgY29tbWVudHNDb3VudDogbnVtYmVyO1xuICBzaXplOiBudW1iZXI7XG4gIHJhdGluZzogbnVtYmVyO1xuICB2b3Rlc0NvdW50OiBudW1iZXI7XG4gIHJhdGluZ1BlcmNlbnQ6IG51bWJlciB8IG51bGw7XG4gIHJldmlzaW9uc0NvdW50OiBudW1iZXI7XG4gIHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsO1xuICB0YWdzOiBzdHJpbmdbXTtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjcmVhdGVkQXQ6IERhdGU7XG4gIHVwZGF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgdXBkYXRlZEF0OiBEYXRlO1xuICBjb21tZW50ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgY29tbWVudGVkQXQ6IERhdGUgfCBudWxsO1xufVxuXG4vKipcbiAqIFdpa2lkb3QgcGFnZVxuICovXG5leHBvcnQgY2xhc3MgUGFnZSB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgZnVsbG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5OiBzdHJpbmc7XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgY2hpbGRyZW5Db3VudDogbnVtYmVyO1xuICBwdWJsaWMgY29tbWVudHNDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgc2l6ZTogbnVtYmVyO1xuICBwdWJsaWMgcmF0aW5nOiBudW1iZXI7XG4gIHB1YmxpYyB2b3Rlc0NvdW50OiBudW1iZXI7XG4gIHB1YmxpYyByYXRpbmdQZXJjZW50OiBudW1iZXIgfCBudWxsO1xuICBwdWJsaWMgcmV2aXNpb25zQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwdWJsaWMgdGFnczogc3RyaW5nW107XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyB1cGRhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyB1cGRhdGVkQXQ6IERhdGU7XG4gIHB1YmxpYyBjb21tZW50ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIGNvbW1lbnRlZEF0OiBEYXRlIHwgbnVsbDtcblxuICBwcml2YXRlIF9pZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3NvdXJjZTogUGFnZVNvdXJjZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9yZXZpc2lvbnM6IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfdm90ZXM6IFBhZ2VWb3RlQ29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuICBfZmlsZXM6IFBhZ2VGaWxlQ29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VEYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMuZnVsbG5hbWUgPSBkYXRhLmZ1bGxuYW1lO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLmNhdGVnb3J5ID0gZGF0YS5jYXRlZ29yeTtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLmNoaWxkcmVuQ291bnQgPSBkYXRhLmNoaWxkcmVuQ291bnQ7XG4gICAgdGhpcy5jb21tZW50c0NvdW50ID0gZGF0YS5jb21tZW50c0NvdW50O1xuICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgICB0aGlzLnJhdGluZyA9IGRhdGEucmF0aW5nO1xuICAgIHRoaXMudm90ZXNDb3VudCA9IGRhdGEudm90ZXNDb3VudDtcbiAgICB0aGlzLnJhdGluZ1BlcmNlbnQgPSBkYXRhLnJhdGluZ1BlcmNlbnQ7XG4gICAgdGhpcy5yZXZpc2lvbnNDb3VudCA9IGRhdGEucmV2aXNpb25zQ291bnQ7XG4gICAgdGhpcy5wYXJlbnRGdWxsbmFtZSA9IGRhdGEucGFyZW50RnVsbG5hbWU7XG4gICAgdGhpcy50YWdzID0gZGF0YS50YWdzO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLnVwZGF0ZWRCeSA9IGRhdGEudXBkYXRlZEJ5O1xuICAgIHRoaXMudXBkYXRlZEF0ID0gZGF0YS51cGRhdGVkQXQ7XG4gICAgdGhpcy5jb21tZW50ZWRCeSA9IGRhdGEuY29tbWVudGVkQnk7XG4gICAgdGhpcy5jb21tZW50ZWRBdCA9IGRhdGEuY29tbWVudGVkQXQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgVVJMXG4gICAqL1xuICBnZXRVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zaXRlLmdldEJhc2VVcmwoKX0vJHt0aGlzLmZ1bGxuYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBwYWdlIElEIGhhcyBiZWVuIGFjcXVpcmVkXG4gICAqL1xuICBpc0lkQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lkICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYWdlIElEXG4gICAqL1xuICBnZXQgaWQoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYWdlIElEXG4gICAqL1xuICBzZXQgaWQodmFsdWU6IG51bWJlciB8IG51bGwpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2UgY29kZVxuICAgKi9cbiAgZ2V0IHNvdXJjZSgpOiBQYWdlU291cmNlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgc291cmNlIGNvZGVcbiAgICovXG4gIHNldCBzb3VyY2UodmFsdWU6IFBhZ2VTb3VyY2UgfCBudWxsKSB7XG4gICAgdGhpcy5fc291cmNlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJldmlzaW9uIGhpc3RvcnlcbiAgICovXG4gIGdldCByZXZpc2lvbnMoKTogUGFnZVJldmlzaW9uQ29sbGVjdGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9yZXZpc2lvbnM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHJldmlzaW9uIGhpc3RvcnlcbiAgICovXG4gIHNldCByZXZpc2lvbnModmFsdWU6IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfCBudWxsKSB7XG4gICAgdGhpcy5fcmV2aXNpb25zID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZvdGUgaW5mb3JtYXRpb25cbiAgICovXG4gIGdldCB2b3RlcygpOiBQYWdlVm90ZUNvbGxlY3Rpb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdm90ZXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZvdGUgaW5mb3JtYXRpb25cbiAgICovXG4gIHNldCB2b3Rlcyh2YWx1ZTogUGFnZVZvdGVDb2xsZWN0aW9uIHwgbnVsbCkge1xuICAgIHRoaXMuX3ZvdGVzID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxhdGVzdCByZXZpc2lvblxuICAgKi9cbiAgZ2V0IGxhdGVzdFJldmlzaW9uKCk6IFBhZ2VSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLl9yZXZpc2lvbnMgfHwgdGhpcy5fcmV2aXNpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5fcmV2aXNpb25zLnJlZHVjZSgobWF4LCByZXYpID0+IChyZXYucmV2Tm8gPiBtYXgucmV2Tm8gPyByZXYgOiBtYXgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgcGFnZSBJRCBpcyBhdmFpbGFibGUgKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIG5hbWUgKGZvciBlcnJvciBtZXNzYWdlKVxuICAgKiBAdGhyb3dzIElmIElEIGFjcXVpc2l0aW9uIGZhaWxzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUlkKG9wZXJhdGlvbjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAodGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIElEIGZvciAke29wZXJhdGlvbn06ICR7cmVzdWx0LmVycm9yLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5faWQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgSUQgYWNxdWlzaXRpb24gZmFpbGVkIGZvciAke29wZXJhdGlvbn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBwYWdlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGRlc3Ryb3koKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdkZWxldGlvbicpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdkZWxldGVQYWdlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2VJZCxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBwYWdlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGFnc1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBjb21taXRUYWdzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnc2F2aW5nIHRhZ3MnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRhZ3M6IHRoaXMudGFncy5qb2luKCcgJyksXG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVUYWdzJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZUlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2F2ZSB0YWdzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwYXJlbnQgcGFnZVxuICAgKiBAcGFyYW0gcGFyZW50RnVsbG5hbWUgLSBQYXJlbnQgcGFnZSBmdWxsbmFtZSAobnVsbCB0byByZW1vdmUpXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHNldFBhcmVudChwYXJlbnRGdWxsbmFtZTogc3RyaW5nIHwgbnVsbCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnc2V0dGluZyBwYXJlbnQnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2V0UGFyZW50UGFnZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBTdHJpbmcocGFnZUlkKSxcbiAgICAgICAgICAgIHBhcmVudE5hbWU6IHBhcmVudEZ1bGxuYW1lID8/ICcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wYXJlbnRGdWxsbmFtZSA9IHBhcmVudEZ1bGxuYW1lO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNldCBwYXJlbnQ6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVm90ZSBvbiBwYWdlXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZvdGUgdmFsdWVcbiAgICogQHJldHVybnMgTmV3IHJhdGluZ1xuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICB2b3RlKHZhbHVlOiBudW1iZXIpOiBXaWtpZG90UmVzdWx0QXN5bmM8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgndm90aW5nJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdSYXRlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAncmF0ZVBhZ2UnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZUlkLFxuICAgICAgICAgICAgcG9pbnRzOiB2YWx1ZSxcbiAgICAgICAgICAgIGZvcmNlOiAneWVzJyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSB2b3RlIHJlcXVlc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdSYXRpbmcgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKHJlc3BvbnNlLnBvaW50cyA/PyB0aGlzLnJhdGluZyksIDEwKTtcbiAgICAgICAgdGhpcy5yYXRpbmcgPSBuZXdSYXRpbmc7XG4gICAgICAgIHJldHVybiBuZXdSYXRpbmc7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gdm90ZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgdm90ZVxuICAgKiBAcmV0dXJucyBOZXcgcmF0aW5nXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNhbmNlbFZvdGUoKTogV2lraWRvdFJlc3VsdEFzeW5jPG51bWJlcj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2NhbmNlbGluZyB2b3RlJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdSYXRlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnY2FuY2VsVm90ZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gY2FuY2VsIHZvdGUgcmVxdWVzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1JhdGluZyA9IE51bWJlci5wYXJzZUludChTdHJpbmcocmVzcG9uc2UucG9pbnRzID8/IHRoaXMucmF0aW5nKSwgMTApO1xuICAgICAgICB0aGlzLnJhdGluZyA9IG5ld1JhdGluZztcbiAgICAgICAgcmV0dXJuIG5ld1JhdGluZztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjYW5jZWwgdm90ZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFZGl0IHRoZSBwYWdlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gRWRpdCBvcHRpb25zXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGVkaXQob3B0aW9uczoge1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHNvdXJjZT86IHN0cmluZztcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gIH0pOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2VkaXRpbmcnKTtcblxuICAgICAgICAvLyBHZXQgY3VycmVudCBzb3VyY2UgKGlmIG5vdCBzcGVjaWZpZWQpXG4gICAgICAgIGxldCBjdXJyZW50U291cmNlID0gb3B0aW9ucy5zb3VyY2U7XG4gICAgICAgIGlmIChjdXJyZW50U291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZ1NvdXJjZSA9IHRoaXMuX3NvdXJjZTtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdTb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSBleGlzdGluZ1NvdXJjZS53aWtpVGV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWNxdWlyZSBzb3VyY2VcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZVJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlU291cmNlcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgICBpZiAoc291cmNlUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgc291cmNlUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQWZ0ZXIgYWNxdWlyZVBhZ2VTb3VyY2VzLCB0aGlzLl9zb3VyY2UgaXMgc2V0XG4gICAgICAgICAgICBjdXJyZW50U291cmNlID0gdGhpcy5fc291cmNlPy53aWtpVGV4dCA/PyAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5jcmVhdGVPckVkaXQodGhpcy5zaXRlLCB0aGlzLmZ1bGxuYW1lLCB7XG4gICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlID8/IHRoaXMudGl0bGUsXG4gICAgICAgICAgc291cmNlOiBjdXJyZW50U291cmNlLFxuICAgICAgICAgIGNvbW1lbnQ6IG9wdGlvbnMuY29tbWVudCA/PyAnJyxcbiAgICAgICAgICBmb3JjZUVkaXQ6IG9wdGlvbnMuZm9yY2VFZGl0ID8/IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZWRpdCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5hbWUgdGhlIHBhZ2VcbiAgICogQHBhcmFtIG5ld0Z1bGxuYW1lIC0gTmV3IGZ1bGxuYW1lXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHJlbmFtZShuZXdGdWxsbmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdyZW5hbWluZycpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdyZW5hbWVQYWdlJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlSWQsXG4gICAgICAgICAgICBuZXdfbmFtZTogbmV3RnVsbG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICAvLyBVcGRhdGUgcHJvcGVydGllcyAodXNpbmcgT2JqZWN0LmFzc2lnbiBzaW5jZSByZWFkb25seSlcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCB7XG4gICAgICAgICAgZnVsbG5hbWU6IG5ld0Z1bGxuYW1lLFxuICAgICAgICAgIGNhdGVnb3J5OiBuZXdGdWxsbmFtZS5pbmNsdWRlcygnOicpID8gbmV3RnVsbG5hbWUuc3BsaXQoJzonKVswXSA6ICdfZGVmYXVsdCcsXG4gICAgICAgICAgbmFtZTogbmV3RnVsbG5hbWUuaW5jbHVkZXMoJzonKSA/IG5ld0Z1bGxuYW1lLnNwbGl0KCc6JylbMV0gOiBuZXdGdWxsbmFtZSxcbiAgICAgICAgfSk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gcmVuYW1lIHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gdGhlIHBhZ2VcbiAgICovXG4gIGdldEZpbGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlRmlsZUNvbGxlY3Rpb24+IHtcbiAgICBpZiAodGhpcy5fZmlsZXMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fZmlsZXMpLCAoZSkgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihTdHJpbmcoZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbmV3IFBhZ2VDb2xsZWN0aW9uKHRoaXMuc2l0ZSwgW3RoaXNdKS5nZXRQYWdlRmlsZXMoKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIF9maWxlcyBzaG91bGQgYmUgc2V0IGJ5IGdldFBhZ2VGaWxlcygpXG4gICAgICAgIGlmICh0aGlzLl9maWxlcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuX2ZpbGVzID0gbmV3IFBhZ2VGaWxlQ29sbGVjdGlvbih0aGlzLCBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbGVzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBmaWxlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGRpc2N1c3Npb24gdGhyZWFkIGZvciB0aGUgcGFnZVxuICAgKi9cbiAgZ2V0RGlzY3Vzc2lvbigpOiBXaWtpZG90UmVzdWx0QXN5bmM8aW1wb3J0KCcuLi9mb3J1bScpLkZvcnVtVGhyZWFkIHwgbnVsbD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2dldHRpbmcgZGlzY3Vzc2lvbicpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1Db21tZW50c0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAvLyBFeHRyYWN0IHRocmVhZCBJRFxuICAgICAgICBjb25zdCBtYXRjaCA9IGh0bWwubWF0Y2goXG4gICAgICAgICAgL1dJS0lET1RcXC5tb2R1bGVzXFwuRm9ydW1WaWV3VGhyZWFkTW9kdWxlXFwudmFyc1xcLnRocmVhZElkXFxzKj1cXHMqKFxcZCspL1xuICAgICAgICApO1xuICAgICAgICBpZiAoIW1hdGNoPy5bMV0pIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRocmVhZElkID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG5cbiAgICAgICAgLy8gR2V0IEZvcnVtVGhyZWFkXG4gICAgICAgIGNvbnN0IHsgRm9ydW1UaHJlYWQgfSA9IGF3YWl0IGltcG9ydCgnLi4vZm9ydW0nKTtcbiAgICAgICAgY29uc3QgdGhyZWFkUmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWQuZ2V0RnJvbUlkKHRoaXMuc2l0ZSwgdGhyZWFkSWQpO1xuICAgICAgICBpZiAodGhyZWFkUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyB0aHJlYWRSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocmVhZFJlc3VsdC52YWx1ZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgZGlzY3Vzc2lvbjogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2YgbWV0YSB0YWdzIGZvciB0aGUgcGFnZVxuICAgKiBAcmV0dXJucyBNZXRhIHRhZyBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRNZXRhcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZU1ldGFDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJZCgnZ2V0dGluZyBtZXRhcycpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlTWV0YUNvbGxlY3Rpb24uYWNxdWlyZSh0aGlzKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IG1ldGFzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIG1ldGEgdGFnXG4gICAqIEBwYXJhbSBuYW1lIC0gTWV0YSB0YWcgbmFtZVxuICAgKiBAcGFyYW0gY29udGVudCAtIE1ldGEgdGFnIHZhbHVlXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHNldE1ldGEobmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSWQoJ3NldHRpbmcgbWV0YScpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlTWV0YUNvbGxlY3Rpb24uc2V0TWV0YSh0aGlzLCBuYW1lLCBjb250ZW50KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2V0IG1ldGE6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGEgbWV0YSB0YWdcbiAgICogQHBhcmFtIG5hbWUgLSBNZXRhIHRhZyBuYW1lXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGRlbGV0ZU1ldGEobmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUlkKCdkZWxldGluZyBtZXRhJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VNZXRhQ29sbGVjdGlvbi5kZWxldGVNZXRhKHRoaXMsIG5hbWUpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBkZWxldGUgbWV0YTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBzb3VyY2UgKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcmV0dXJucyBQYWdlIHNvdXJjZVxuICAgKi9cbiAgZ2V0U291cmNlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlU291cmNlPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgc291cmNlUmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VTb3VyY2VzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAoc291cmNlUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHNvdXJjZVJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignQ2Fubm90IGZpbmQgcGFnZSBzb3VyY2UnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBzb3VyY2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBoaXN0b3J5IChhdXRvLWFjcXVpcmUgaWYgbm90IHlldCBhY3F1aXJlZClcbiAgICogQHJldHVybnMgUmV2aXNpb24gY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0UmV2aXNpb25zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlUmV2aXNpb25Db2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX3JldmlzaW9ucyA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmV2UmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VSZXZpc2lvbnModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgIGlmIChyZXZSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgcmV2UmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fcmV2aXNpb25zID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdDYW5ub3QgZmluZCBwYWdlIHJldmlzaW9ucycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZXZpc2lvbnM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZvdGUgaW5mb3JtYXRpb24gKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcmV0dXJucyBWb3RlIGNvbGxlY3Rpb25cbiAgICovXG4gIGdldFZvdGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlVm90ZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fdm90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUlkcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHZvdGVzUmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VWb3Rlcyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHZvdGVzUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHZvdGVzUmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdm90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oJ0Nhbm5vdCBmaW5kIHBhZ2Ugdm90ZXMnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdm90ZXM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHZvdGVzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlKGZ1bGxuYW1lPSR7dGhpcy5mdWxsbmFtZX0sIHRpdGxlPSR7dGhpcy50aXRsZX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxQYWdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUsIHBhZ2VzPzogUGFnZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICAgIGlmIChwYWdlcykge1xuICAgICAgdGhpcy5wdXNoKC4uLnBhZ2VzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBmdWxsbmFtZVxuICAgKiBAcGFyYW0gZnVsbG5hbWUgLSBQYWdlIGZ1bGxuYW1lXG4gICAqIEByZXR1cm5zIFBhZ2UgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlGdWxsbmFtZShmdWxsbmFtZTogc3RyaW5nKTogUGFnZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocGFnZSkgPT4gcGFnZS5mdWxsbmFtZSA9PT0gZnVsbG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgcGFnZSBJRHMgaW4gYnVsa1xuICAgKi9cbiAgZ2V0UGFnZUlkcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VJZHModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIHBhZ2Ugc291cmNlcyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlU291cmNlcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VTb3VyY2VzKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBwYWdlIHJldmlzaW9ucyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlUmV2aXNpb25zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVJldmlzaW9ucyh0aGlzLnNpdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgcGFnZSB2b3RlcyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlVm90ZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlVm90ZXModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIHBhZ2UgZmlsZXMgaW4gYnVsa1xuICAgKi9cbiAgZ2V0UGFnZUZpbGVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUZpbGVzKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFjcXVpcmUgcGFnZSBmaWxlcyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VGaWxlcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZmlsZXMvUGFnZUZpbGVzTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IFBhZ2VGaWxlQ29sbGVjdGlvbi5fcGFyc2VGcm9tSHRtbChwYWdlLCAkKTtcbiAgICAgICAgICBwYWdlLl9maWxlcyA9IG5ldyBQYWdlRmlsZUNvbGxlY3Rpb24ocGFnZSwgZmlsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIGZpbGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhY3F1aXJlIHBhZ2UgSURzIGluIGJ1bGtcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZUlkcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlLmlzSWRBY3F1aXJlZCgpKTtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMaW1pdCBjb25jdXJyZW50IGNvbm5lY3Rpb25zICh1c2luZyBzYW1lIHNlbWFwaG9yZUxpbWl0IGFzIEFNQ0NsaWVudClcbiAgICAgICAgY29uc3QgbGltaXQgPSBwTGltaXQoc2l0ZS5jbGllbnQuYW1jQ2xpZW50LmNvbmZpZy5zZW1hcGhvcmVMaW1pdCk7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHNpdGUuY2xpZW50LmFtY0NsaWVudC5jb25maWc7XG5cbiAgICAgICAgLy8gQWNjZXNzIHdpdGggbm9yZW5kZXIsIG5vcmVkaXJlY3QgKHdpdGggcmV0cnkpXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcCgocGFnZSkgPT5cbiAgICAgICAgICAgIGxpbWl0KGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdXJsID0gYCR7cGFnZS5nZXRVcmwoKX0vbm9yZW5kZXIvdHJ1ZS9ub3JlZGlyZWN0L3RydWVgO1xuICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoV2l0aFJldHJ5KHVybCwgY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogc2l0ZS5jbGllbnQuYW1jQ2xpZW50LmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm4geyBwYWdlLCByZXNwb25zZSB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChjb25zdCB7IHBhZ2UsIHJlc3BvbnNlIH0gb2YgcmVzcG9uc2VzKSB7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IHRleHQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLnBhZ2VJZFxccyo9XFxzKihcXGQrKTsvKTtcbiAgICAgICAgICBpZiAoIW1hdGNoPy5bMV0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgQ2Fubm90IGZpbmQgcGFnZSBpZDogJHtwYWdlLmZ1bGxuYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYWdlLmlkID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBhZ2UgSURzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwYWdlIHNvdXJjZXMgaW4gYnVsa1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQYWdlU291cmNlcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2Uuc291cmNlID09PSBudWxsICYmIHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAndmlld3NvdXJjZS9WaWV3U291cmNlTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpLnJlcGxhY2UoLyZuYnNwOy9nLCAnICcpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG4gICAgICAgICAgY29uc3Qgc291cmNlRWxlbWVudCA9ICQoJ2Rpdi5wYWdlLXNvdXJjZScpO1xuICAgICAgICAgIGlmIChzb3VyY2VFbGVtZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBDYW5ub3QgZmluZCBzb3VyY2UgZWxlbWVudCBmb3IgcGFnZTogJHtwYWdlLmZ1bGxuYW1lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB3aWtpVGV4dCA9IHNvdXJjZUVsZW1lbnQudGV4dCgpLnRyaW0oKS5yZXBsYWNlKC9eXFx0LywgJycpO1xuICAgICAgICAgIHBhZ2Uuc291cmNlID0gbmV3IFBhZ2VTb3VyY2UoeyBwYWdlLCB3aWtpVGV4dCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBzb3VyY2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwYWdlIHJldmlzaW9ucyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VSZXZpc2lvbnMoc2l0ZTogU2l0ZSwgcGFnZXM6IFBhZ2VbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldFBhZ2VzID0gcGFnZXMuZmlsdGVyKChwYWdlKSA9PiBwYWdlLnJldmlzaW9ucyA9PT0gbnVsbCAmJiBwYWdlLmlkICE9PSBudWxsKTtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3RXaXRoUmV0cnkoXG4gICAgICAgICAgdGFyZ2V0UGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2hpc3RvcnkvUGFnZVJldmlzaW9uTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlLmlkLFxuICAgICAgICAgICAgb3B0aW9uczogeyBhbGw6IHRydWUgfSxcbiAgICAgICAgICAgIHBlcnBhZ2U6IDEwMDAwMDAwMCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSByZXZpc2lvbnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBjb25zdCByZXZpc2lvbnM6IFBhZ2VSZXZpc2lvbltdID0gW107XG5cbiAgICAgICAgICAkKCd0YWJsZS5wYWdlLWhpc3RvcnkgdHJbaWRePVwicmV2aXNpb24tcm93LVwiXScpLmVhY2goKF9qLCByZXZFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkcmV2ID0gJChyZXZFbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHJldklkQXR0ciA9ICRyZXYuYXR0cignaWQnKTtcbiAgICAgICAgICAgIGlmICghcmV2SWRBdHRyKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHJldklkID0gTnVtYmVyLnBhcnNlSW50KHJldklkQXR0ci5yZXBsYWNlKCdyZXZpc2lvbi1yb3ctJywgJycpLCAxMCk7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldklkKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCAkdGRzID0gJHJldi5maW5kKCd0ZCcpO1xuICAgICAgICAgICAgaWYgKCR0ZHMubGVuZ3RoIDwgNykgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCByZXZOb1RleHQgPSAkdGRzLmVxKDApLnRleHQoKS50cmltKCkucmVwbGFjZSgvXFwuJC8sICcnKTtcbiAgICAgICAgICAgIGNvbnN0IHJldk5vID0gTnVtYmVyLnBhcnNlSW50KHJldk5vVGV4dCwgMTApO1xuICAgICAgICAgICAgaWYgKE51bWJlci5pc05hTihyZXZObykpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgJGNyZWF0ZWRCeUVsZW0gPSAkdGRzLmVxKDQpLmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgICBpZiAoJGNyZWF0ZWRCeUVsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQnkgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICRjcmVhdGVkQnlFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuXG4gICAgICAgICAgICBjb25zdCAkY3JlYXRlZEF0RWxlbSA9ICR0ZHMuZXEoNSkuZmluZCgnc3Bhbi5vZGF0ZScpO1xuICAgICAgICAgICAgaWYgKCRjcmVhdGVkQXRFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID0gcGFyc2VPZGF0ZSgkY3JlYXRlZEF0RWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gJHRkcy5lcSg2KS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgICByZXZpc2lvbnMucHVzaChcbiAgICAgICAgICAgICAgbmV3IFBhZ2VSZXZpc2lvbih7XG4gICAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgICBpZDogcmV2SWQsXG4gICAgICAgICAgICAgICAgcmV2Tm8sXG4gICAgICAgICAgICAgICAgY3JlYXRlZEJ5LFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICAgICAgICBjb21tZW50LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHBhZ2UucmV2aXNpb25zID0gbmV3IFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24ocGFnZSwgcmV2aXNpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSByZXZpc2lvbnM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFjcXVpcmUgcGFnZSB2b3RlcyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VWb3RlcyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2Uudm90ZXMgPT09IG51bGwgJiYgcGFnZS5pZCAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0V2l0aFJldHJ5KFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdwYWdlcmF0ZS9XaG9SYXRlZFBhZ2VNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlLmlkLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlIHZvdGVzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0UGFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwYWdlID0gdGFyZ2V0UGFnZXNbaV07XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgaWYgKCFwYWdlIHx8ICFyZXNwb25zZSkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgICBjb25zdCAkdXNlckVsZW1zID0gJCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICBjb25zdCAkdmFsdWVFbGVtcyA9ICQoXCJzcGFuW3N0eWxlXj0nY29sb3InXVwiKTtcblxuICAgICAgICAgIGlmICgkdXNlckVsZW1zLmxlbmd0aCAhPT0gJHZhbHVlRWxlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdVc2VyIGFuZCB2YWx1ZSBjb3VudCBtaXNtYXRjaCBpbiB2b3RlcycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZvdGVzOiBQYWdlVm90ZVtdID0gW107XG4gICAgICAgICAgJHVzZXJFbGVtcy5lYWNoKChqLCB1c2VyRWxlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgJHVzZXIgPSAkKHVzZXJFbGVtKTtcbiAgICAgICAgICAgIGNvbnN0ICR2YWx1ZSA9ICR2YWx1ZUVsZW1zLmVxKGopO1xuXG4gICAgICAgICAgICBjb25zdCB1c2VyID0gcGFyc2VVc2VyKHNpdGUuY2xpZW50LCAkdXNlciBhcyBDaGVlcmlvPEFueU5vZGU+KTtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlVGV4dCA9ICR2YWx1ZS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgICBsZXQgdmFsdWU6IG51bWJlcjtcbiAgICAgICAgICAgIGlmICh2YWx1ZVRleHQgPT09ICcrJykge1xuICAgICAgICAgICAgICB2YWx1ZSA9IDE7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlVGV4dCA9PT0gJy0nKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gLTE7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWx1ZSA9IE51bWJlci5wYXJzZUludCh2YWx1ZVRleHQsIDEwKSB8fCAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2b3Rlcy5wdXNoKG5ldyBQYWdlVm90ZSh7IHBhZ2UsIHVzZXIsIHZhbHVlIH0pKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHBhZ2Uudm90ZXMgPSBuZXcgUGFnZVZvdGVDb2xsZWN0aW9uKHBhZ2UsIHZvdGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSB2b3RlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBMaXN0UGFnZXNNb2R1bGUgcmVzcG9uc2VcbiAgICovXG4gIHN0YXRpYyBwYXJzZShcbiAgICBzaXRlOiBTaXRlLFxuICAgIGh0bWxCb2R5OiBjaGVlcmlvLkNoZWVyaW9BUEksXG4gICAgX3BhcnNlVXNlcjogKGVsZW1lbnQ6IGNoZWVyaW8uQ2hlZXJpbzxBbnlOb2RlPikgPT4gQWJzdHJhY3RVc2VyXG4gICk6IFBhZ2VDb2xsZWN0aW9uIHtcbiAgICBjb25zdCBwYWdlczogUGFnZVtdID0gW107XG5cbiAgICBodG1sQm9keSgnZGl2LnBhZ2UnKS5lYWNoKChfaSwgcGFnZUVsZW1lbnQpID0+IHtcbiAgICAgIGNvbnN0ICRwYWdlID0gaHRtbEJvZHkocGFnZUVsZW1lbnQpO1xuICAgICAgY29uc3QgcGFnZVBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIDUtc3RhciByYXRpbmdcbiAgICAgIGNvbnN0IGlzNVN0YXJSYXRpbmcgPSAkcGFnZS5maW5kKCdzcGFuLnJhdGluZyBzcGFuLnBhZ2UtcmF0ZS1saXN0LXBhZ2VzLXN0YXJ0JykubGVuZ3RoID4gMDtcblxuICAgICAgLy8gR2V0IGVhY2ggdmFsdWVcbiAgICAgICRwYWdlLmZpbmQoJ3NwYW4uc2V0JykuZWFjaCgoX2osIHNldEVsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgJHNldCA9IGh0bWxCb2R5KHNldEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBrZXlFbGVtZW50ID0gJHNldC5maW5kKCdzcGFuLm5hbWUnKTtcbiAgICAgICAgaWYgKGtleUVsZW1lbnQubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgbGV0IGtleSA9IGtleUVsZW1lbnQudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsdWVFbGVtZW50ID0gJHNldC5maW5kKCdzcGFuLnZhbHVlJyk7XG5cbiAgICAgICAgbGV0IHZhbHVlOiB1bmtub3duID0gbnVsbDtcblxuICAgICAgICBpZiAodmFsdWVFbGVtZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChbJ2NyZWF0ZWRfYXQnLCAndXBkYXRlZF9hdCcsICdjb21tZW50ZWRfYXQnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgY29uc3Qgb2RhdGVFbGVtZW50ID0gdmFsdWVFbGVtZW50LmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgICAgICBpZiAob2RhdGVFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IG9kYXRlRWxlbWVudC5hdHRyKCdjbGFzcycpPy5tYXRjaCgvdGltZV8oXFxkKykvKT8uWzFdO1xuICAgICAgICAgICAgdmFsdWUgPSB0aW1lc3RhbXAgPyBuZXcgRGF0ZShOdW1iZXIucGFyc2VJbnQodGltZXN0YW1wLCAxMCkgKiAxMDAwKSA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIFsnY3JlYXRlZF9ieV9saW5rZWQnLCAndXBkYXRlZF9ieV9saW5rZWQnLCAnY29tbWVudGVkX2J5X2xpbmtlZCddLmluY2x1ZGVzKGtleSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgcHJpbnR1c2VyRWxlbWVudCA9IHZhbHVlRWxlbWVudC5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGlmIChwcmludHVzZXJFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhbHVlID0gX3BhcnNlVXNlcihwcmludHVzZXJFbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoWyd0YWdzJywgJ190YWdzJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVFbGVtZW50LnRleHQoKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgfSBlbHNlIGlmIChbJ3JhdGluZ192b3RlcycsICdjb21tZW50cycsICdzaXplJywgJ3JldmlzaW9ucyddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IE51bWJlci5wYXJzZUludCh2YWx1ZUVsZW1lbnQudGV4dCgpLnRyaW0oKSwgMTApIHx8IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmF0aW5nJykge1xuICAgICAgICAgIGNvbnN0IHJhdGluZ1RleHQgPSB2YWx1ZUVsZW1lbnQudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICB2YWx1ZSA9IGlzNVN0YXJSYXRpbmdcbiAgICAgICAgICAgID8gTnVtYmVyLnBhcnNlRmxvYXQocmF0aW5nVGV4dCkgfHwgMFxuICAgICAgICAgICAgOiBOdW1iZXIucGFyc2VJbnQocmF0aW5nVGV4dCwgMTApIHx8IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmF0aW5nX3BlcmNlbnQnKSB7XG4gICAgICAgICAgaWYgKGlzNVN0YXJSYXRpbmcpIHtcbiAgICAgICAgICAgIHZhbHVlID0gKE51bWJlci5wYXJzZUZsb2F0KHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpKSB8fCAwKSAvIDEwMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWx1ZSA9IHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2V5IGNvbnZlcnNpb25cbiAgICAgICAgaWYgKGtleS5pbmNsdWRlcygnX2xpbmtlZCcpKSB7XG4gICAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoJ19saW5rZWQnLCAnJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoWydjb21tZW50cycsICdjaGlsZHJlbicsICdyZXZpc2lvbnMnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAga2V5ID0gYCR7a2V5fV9jb3VudGA7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncmF0aW5nX3ZvdGVzJykge1xuICAgICAgICAgIGtleSA9ICd2b3Rlc19jb3VudCc7XG4gICAgICAgIH1cblxuICAgICAgICBwYWdlUGFyYW1zW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBNZXJnZSB0YWdzXG4gICAgICBjb25zdCB0YWdzID0gQXJyYXkuaXNBcnJheShwYWdlUGFyYW1zLnRhZ3MpID8gcGFnZVBhcmFtcy50YWdzIDogW107XG4gICAgICBjb25zdCBoaWRkZW5UYWdzID0gQXJyYXkuaXNBcnJheShwYWdlUGFyYW1zLl90YWdzKSA/IHBhZ2VQYXJhbXMuX3RhZ3MgOiBbXTtcbiAgICAgIHBhZ2VQYXJhbXMudGFncyA9IFsuLi50YWdzLCAuLi5oaWRkZW5UYWdzXTtcblxuICAgICAgLy8gVmFsaWRhdGUgd2l0aCBab2Qgc2NoZW1hIGFuZCBhcHBseSBkZWZhdWx0c1xuICAgICAgY29uc3QgcGFyc2VkID0gcGFnZVBhcmFtc1NjaGVtYS5wYXJzZShwYWdlUGFyYW1zKTtcblxuICAgICAgLy8gQ3JlYXRlIFBhZ2Ugb2JqZWN0XG4gICAgICBwYWdlcy5wdXNoKFxuICAgICAgICBuZXcgUGFnZSh7XG4gICAgICAgICAgc2l0ZSxcbiAgICAgICAgICBmdWxsbmFtZTogcGFyc2VkLmZ1bGxuYW1lLFxuICAgICAgICAgIG5hbWU6IHBhcnNlZC5uYW1lLFxuICAgICAgICAgIGNhdGVnb3J5OiBwYXJzZWQuY2F0ZWdvcnksXG4gICAgICAgICAgdGl0bGU6IHBhcnNlZC50aXRsZSxcbiAgICAgICAgICBjaGlsZHJlbkNvdW50OiBwYXJzZWQuY2hpbGRyZW5fY291bnQsXG4gICAgICAgICAgY29tbWVudHNDb3VudDogcGFyc2VkLmNvbW1lbnRzX2NvdW50LFxuICAgICAgICAgIHNpemU6IHBhcnNlZC5zaXplLFxuICAgICAgICAgIHJhdGluZzogcGFyc2VkLnJhdGluZyxcbiAgICAgICAgICB2b3Rlc0NvdW50OiBwYXJzZWQudm90ZXNfY291bnQsXG4gICAgICAgICAgcmF0aW5nUGVyY2VudDogcGFyc2VkLnJhdGluZ19wZXJjZW50LFxuICAgICAgICAgIHJldmlzaW9uc0NvdW50OiBwYXJzZWQucmV2aXNpb25zX2NvdW50LFxuICAgICAgICAgIHBhcmVudEZ1bGxuYW1lOiBwYXJzZWQucGFyZW50X2Z1bGxuYW1lLFxuICAgICAgICAgIHRhZ3M6IHBhcnNlZC50YWdzLFxuICAgICAgICAgIGNyZWF0ZWRCeTogcGFyc2VkLmNyZWF0ZWRfYnksXG4gICAgICAgICAgY3JlYXRlZEF0OiBwYXJzZWQuY3JlYXRlZF9hdCA/PyBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHVwZGF0ZWRCeTogcGFyc2VkLnVwZGF0ZWRfYnksXG4gICAgICAgICAgdXBkYXRlZEF0OiBwYXJzZWQudXBkYXRlZF9hdCA/PyBuZXcgRGF0ZSgpLFxuICAgICAgICAgIGNvbW1lbnRlZEJ5OiBwYXJzZWQuY29tbWVudGVkX2J5LFxuICAgICAgICAgIGNvbW1lbnRlZEF0OiBwYXJzZWQuY29tbWVudGVkX2F0LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBwYWdlc1xuICAgKi9cbiAgc3RhdGljIHNlYXJjaFBhZ2VzKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgcGFyc2VVc2VyOiAoZWxlbWVudDogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KSA9PiBBYnN0cmFjdFVzZXIsXG4gICAgcXVlcnk6IFNlYXJjaFBhZ2VzUXVlcnkgfCBudWxsID0gbnVsbFxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxID0gcXVlcnkgPz8gbmV3IFNlYXJjaFBhZ2VzUXVlcnkoKTtcbiAgICAgICAgY29uc3QgcXVlcnlEaWN0ID0gcS5hc0RpY3QoKTtcblxuICAgICAgICAvLyBHZW5lcmF0ZSBtb2R1bGUgYm9keVxuICAgICAgICBjb25zdCBtb2R1bGVCb2R5ID0gYFtbZGl2IGNsYXNzPVwicGFnZVwiXV1cXG4ke0RFRkFVTFRfTU9EVUxFX0JPRFkubWFwKFxuICAgICAgICAgIChrZXkpID0+XG4gICAgICAgICAgICBgW1tzcGFuIGNsYXNzPVwic2V0ICR7a2V5fVwiXV1bW3NwYW4gY2xhc3M9XCJuYW1lXCJdXSAke2tleX0gW1svc3Bhbl1dW1tzcGFuIGNsYXNzPVwidmFsdWVcIl1dICUlJHtrZXl9JSUgW1svc3Bhbl1dW1svc3Bhbl1dYFxuICAgICAgICApLmpvaW4oJycpfVxcbltbL2Rpdl1dYDtcblxuICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICAuLi5xdWVyeURpY3QsXG4gICAgICAgICAgbW9kdWxlTmFtZTogJ2xpc3QvTGlzdFBhZ2VzTW9kdWxlJyxcbiAgICAgICAgICBtb2R1bGVfYm9keTogbW9kdWxlQm9keSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW3JlcXVlc3RCb2R5XSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIGlmIChyZXN1bHQuZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnbm90X29rJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FcnJvcignRmFpbGVkIHRvIGdldCBwYWdlcywgdGFyZ2V0IHNpdGUgbWF5IGJlIHByaXZhdGUnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhmaXJzdFJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgIGxldCB0b3RhbCA9IDE7XG4gICAgICAgIGNvbnN0IGh0bWxCb2RpZXM6IGNoZWVyaW8uQ2hlZXJpb0FQSVtdID0gWyRmaXJzdF07XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFnaW5hdGlvblxuICAgICAgICBjb25zdCBwYWdlckVsZW1lbnQgPSAkZmlyc3QoJ2Rpdi5wYWdlcicpO1xuICAgICAgICBpZiAocGFnZXJFbGVtZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBsYXN0UGFnZXJFbGVtZW50cyA9ICRmaXJzdCgnZGl2LnBhZ2VyIHNwYW4udGFyZ2V0Jyk7XG4gICAgICAgICAgaWYgKGxhc3RQYWdlckVsZW1lbnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICBjb25zdCBzZWNvbmRMYXN0UGFnZXIgPSAkZmlyc3QobGFzdFBhZ2VyRWxlbWVudHNbbGFzdFBhZ2VyRWxlbWVudHMubGVuZ3RoIC0gMl0pO1xuICAgICAgICAgICAgY29uc3QgbGFzdFBhZ2VyTGluayA9IHNlY29uZExhc3RQYWdlci5maW5kKCdhJyk7XG4gICAgICAgICAgICBpZiAobGFzdFBhZ2VyTGluay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHRvdGFsID0gTnVtYmVyLnBhcnNlSW50KGxhc3RQYWdlckxpbmsudGV4dCgpLnRyaW0oKSwgMTApIHx8IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGFkZGl0aW9uYWwgcGFnZXNcbiAgICAgICAgaWYgKHRvdGFsID4gMSkge1xuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxCb2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10gPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHRvdGFsOyBpKyspIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxCb2RpZXMucHVzaCh7XG4gICAgICAgICAgICAgIC4uLnF1ZXJ5RGljdCxcbiAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2xpc3QvTGlzdFBhZ2VzTW9kdWxlJyxcbiAgICAgICAgICAgICAgbW9kdWxlX2JvZHk6IG1vZHVsZUJvZHksXG4gICAgICAgICAgICAgIG9mZnNldDogaSAqIChxLnBlclBhZ2UgPz8gREVGQVVMVF9QRVJfUEFHRSksXG4gICAgICAgICAgICB9IGFzIEFNQ1JlcXVlc3RCb2R5KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChhZGRpdGlvbmFsQm9kaWVzKTtcbiAgICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdHMuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgYWRkaXRpb25hbFJlc3VsdHMuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBhZGRpdGlvbmFsUmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgICAgY29uc3QgcmVzcEJvZHkgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgICAgaHRtbEJvZGllcy5wdXNoKGNoZWVyaW8ubG9hZChyZXNwQm9keSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlXG4gICAgICAgIGNvbnN0IHBhZ2VzOiBQYWdlW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCAkaHRtbCBvZiBodG1sQm9kaWVzKSB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkID0gUGFnZUNvbGxlY3Rpb24ucGFyc2Uoc2l0ZSwgJGh0bWwsIHBhcnNlVXNlcik7XG4gICAgICAgICAgcGFnZXMucHVzaCguLi5wYXJzZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZWFyY2ggcGFnZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBvciBlZGl0IGEgcGFnZVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZU9yRWRpdChcbiAgICBzaXRlOiBTaXRlLFxuICAgIGZ1bGxuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczoge1xuICAgICAgcGFnZUlkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHRpdGxlPzogc3RyaW5nO1xuICAgICAgc291cmNlPzogc3RyaW5nO1xuICAgICAgY29tbWVudD86IHN0cmluZztcbiAgICAgIGZvcmNlRWRpdD86IGJvb2xlYW47XG4gICAgICByYWlzZU9uRXhpc3RzPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IHNpdGUuY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gY3JlYXRlL2VkaXQgcGFnZScpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBwYWdlSWQgPSBudWxsLFxuICAgICAgICAgIHRpdGxlID0gJycsXG4gICAgICAgICAgc291cmNlID0gJycsXG4gICAgICAgICAgY29tbWVudCA9ICcnLFxuICAgICAgICAgIGZvcmNlRWRpdCA9IGZhbHNlLFxuICAgICAgICAgIHJhaXNlT25FeGlzdHMgPSBmYWxzZSxcbiAgICAgICAgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgLy8gQWNxdWlyZSBwYWdlIGxvY2tcbiAgICAgICAgY29uc3QgbG9ja1JlcXVlc3RCb2R5OiBBTUNSZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICBtb2RlOiAncGFnZScsXG4gICAgICAgICAgd2lraV9wYWdlOiBmdWxsbmFtZSxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnZWRpdC9QYWdlRWRpdE1vZHVsZScsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChmb3JjZUVkaXQpIHtcbiAgICAgICAgICBsb2NrUmVxdWVzdEJvZHkuZm9yY2VfbG9jayA9ICd5ZXMnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9ja1Jlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbbG9ja1JlcXVlc3RCb2R5XSk7XG4gICAgICAgIGlmIChsb2NrUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBsb2NrUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9ja1Jlc3BvbnNlID0gbG9ja1Jlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKGxvY2tSZXNwb25zZT8ubG9ja2VkIHx8IGxvY2tSZXNwb25zZT8ub3RoZXJfbG9ja3MpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKGBQYWdlICR7ZnVsbG5hbWV9IGlzIGxvY2tlZCBvciBvdGhlciBsb2NrcyBleGlzdGApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNFeGlzdCA9ICdwYWdlX3JldmlzaW9uX2lkJyBpbiAobG9ja1Jlc3BvbnNlID8/IHt9KTtcblxuICAgICAgICBpZiAocmFpc2VPbkV4aXN0cyAmJiBpc0V4aXN0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhcmdldEV4aXN0c0Vycm9yKGBQYWdlICR7ZnVsbG5hbWV9IGFscmVhZHkgZXhpc3RzYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNFeGlzdCAmJiBwYWdlSWQgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdwYWdlX2lkIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gZWRpdGluZyBleGlzdGluZyBwYWdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrSWQgPSBTdHJpbmcobG9ja1Jlc3BvbnNlPy5sb2NrX2lkID8/ICcnKTtcbiAgICAgICAgY29uc3QgbG9ja1NlY3JldCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LmxvY2tfc2VjcmV0ID8/ICcnKTtcbiAgICAgICAgY29uc3QgcGFnZVJldmlzaW9uSWQgPSBTdHJpbmcobG9ja1Jlc3BvbnNlPy5wYWdlX3JldmlzaW9uX2lkID8/ICcnKTtcblxuICAgICAgICAvLyBTYXZlIHBhZ2VcbiAgICAgICAgY29uc3QgZWRpdFJlcXVlc3RCb2R5OiBBTUNSZXF1ZXN0Qm9keSA9IHtcbiAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgZXZlbnQ6ICdzYXZlUGFnZScsXG4gICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICBtb2RlOiAncGFnZScsXG4gICAgICAgICAgbG9ja19pZDogbG9ja0lkLFxuICAgICAgICAgIGxvY2tfc2VjcmV0OiBsb2NrU2VjcmV0LFxuICAgICAgICAgIHJldmlzaW9uX2lkOiBwYWdlUmV2aXNpb25JZCxcbiAgICAgICAgICB3aWtpX3BhZ2U6IGZ1bGxuYW1lLFxuICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2VJZCA/PyAnJyxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgY29tbWVudHM6IGNvbW1lbnQsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZWRpdFJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbZWRpdFJlcXVlc3RCb2R5XSk7XG4gICAgICAgIGlmIChlZGl0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBlZGl0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFRhcmdldEV4aXN0c0Vycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlL2VkaXQgcGFnZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IHsgU2VhcmNoUGFnZXNRdWVyeSB9O1xuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcblxuLyoqXG4gKiBQYWdlIGZpbGUgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VGaWxlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIG1pbWVUeXBlOiBzdHJpbmc7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYWdlIGF0dGFjaG1lbnQgZmlsZVxuICovXG5leHBvcnQgY2xhc3MgUGFnZUZpbGUge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG1pbWVUeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBzaXplOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZUZpbGVEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLnVybCA9IGRhdGEudXJsO1xuICAgIHRoaXMubWltZVR5cGUgPSBkYXRhLm1pbWVUeXBlO1xuICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlRmlsZShpZD0ke3RoaXMuaWR9LCBuYW1lPSR7dGhpcy5uYW1lfSwgc2l6ZT0ke3RoaXMuc2l6ZX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgZmlsZSBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlRmlsZUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxQYWdlRmlsZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcblxuICBjb25zdHJ1Y3RvcihwYWdlOiBQYWdlLCBmaWxlcz86IFBhZ2VGaWxlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucGFnZSA9IHBhZ2U7XG4gICAgaWYgKGZpbGVzKSB7XG4gICAgICB0aGlzLnB1c2goLi4uZmlsZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogUGFnZUZpbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGZpbGUpID0+IGZpbGUuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IG5hbWVcbiAgICovXG4gIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nKTogUGFnZUZpbGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKGZpbGUpID0+IGZpbGUubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBzaXplIHN0cmluZyB0byBieXRlcyAocHVibGljIGZvciBiYXRjaCBvcGVyYXRpb25zKVxuICAgKi9cbiAgc3RhdGljIHBhcnNlU2l6ZShzaXplVGV4dDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBjb25zdCB0ZXh0ID0gc2l6ZVRleHQudHJpbSgpO1xuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdCeXRlcycpKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihOdW1iZXIucGFyc2VGbG9hdCh0ZXh0LnJlcGxhY2UoJ0J5dGVzJywgJycpLnRyaW0oKSkpO1xuICAgIH1cbiAgICBpZiAodGV4dC5pbmNsdWRlcygna0InKSkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTnVtYmVyLnBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKCdrQicsICcnKS50cmltKCkpICogMTAwMCk7XG4gICAgfVxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdNQicpKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihOdW1iZXIucGFyc2VGbG9hdCh0ZXh0LnJlcGxhY2UoJ01CJywgJycpLnRyaW0oKSkgKiAxMDAwMDAwKTtcbiAgICB9XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ0dCJykpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKE51bWJlci5wYXJzZUZsb2F0KHRleHQucmVwbGFjZSgnR0InLCAnJykudHJpbSgpKSAqIDEwMDAwMDAwMDApO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBmaWxlIGluZm9ybWF0aW9uIGZyb20gSFRNTCByZXNwb25zZVxuICAgKiBJbnRlcm5hbCBoZWxwZXIgZm9yIGFjcXVpcmUoKSBhbmQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VGaWxlcygpXG4gICAqL1xuICBzdGF0aWMgX3BhcnNlRnJvbUh0bWwocGFnZTogUGFnZSwgJDogY2hlZXJpby5DaGVlcmlvQVBJKTogUGFnZUZpbGVbXSB7XG4gICAgY29uc3QgZmlsZXNUYWJsZSA9ICQoJ3RhYmxlLnBhZ2UtZmlsZXMnKTtcbiAgICBpZiAoZmlsZXNUYWJsZS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWxlczogUGFnZUZpbGVbXSA9IFtdO1xuXG4gICAgZmlsZXNUYWJsZS5maW5kKFwidGJvZHkgdHJbaWRePSdmaWxlLXJvdy0nXVwiKS5lYWNoKChfaSwgcm93KSA9PiB7XG4gICAgICBjb25zdCByb3dJZCA9ICQocm93KS5hdHRyKCdpZCcpO1xuICAgICAgaWYgKCFyb3dJZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBmaWxlSWQgPSBOdW1iZXIucGFyc2VJbnQocm93SWQucmVwbGFjZSgnZmlsZS1yb3ctJywgJycpLCAxMCk7XG4gICAgICBjb25zdCB0ZHMgPSAkKHJvdykuZmluZCgndGQnKTtcbiAgICAgIGlmICh0ZHMubGVuZ3RoIDwgMykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBsaW5rRWxlbSA9ICQodGRzWzBdKS5maW5kKCdhJyk7XG4gICAgICBpZiAobGlua0VsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IG5hbWUgPSBsaW5rRWxlbS50ZXh0KCkudHJpbSgpO1xuICAgICAgY29uc3QgaHJlZiA9IGxpbmtFbGVtLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgIGNvbnN0IHVybCA9IGAke3BhZ2Uuc2l0ZS5nZXRCYXNlVXJsKCl9JHtocmVmfWA7XG5cbiAgICAgIGNvbnN0IG1pbWVFbGVtID0gJCh0ZHNbMV0pLmZpbmQoJ3NwYW4nKTtcbiAgICAgIGNvbnN0IG1pbWVUeXBlID0gbWltZUVsZW0uYXR0cigndGl0bGUnKSA/PyAnJztcblxuICAgICAgY29uc3Qgc2l6ZVRleHQgPSAkKHRkc1syXSkudGV4dCgpLnRyaW0oKTtcbiAgICAgIGNvbnN0IHNpemUgPSBQYWdlRmlsZUNvbGxlY3Rpb24ucGFyc2VTaXplKHNpemVUZXh0KTtcblxuICAgICAgZmlsZXMucHVzaChcbiAgICAgICAgbmV3IFBhZ2VGaWxlKHtcbiAgICAgICAgICBwYWdlLFxuICAgICAgICAgIGlkOiBmaWxlSWQsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgbWltZVR5cGUsXG4gICAgICAgICAgc2l6ZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmlsZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGxpc3Qgb2YgZmlsZXMgYXR0YWNoZWQgdG8gcGFnZVxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUocGFnZTogUGFnZSk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlRmlsZUNvbGxlY3Rpb24+IHtcbiAgICBpZiAocGFnZS5pZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1BhZ2UgSUQgbm90IGFjcXVpcmVkJykpLFxuICAgICAgICAoKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKCdQYWdlIElEIG11c3QgYmUgYWNxdWlyZWQgYmVmb3JlIGdldHRpbmcgZmlsZXMnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWdlSWQgPSBwYWdlLmlkO1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmaWxlcy9QYWdlRmlsZXNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZV9pZDogcGFnZUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gUGFnZUZpbGVDb2xsZWN0aW9uLl9wYXJzZUZyb21IdG1sKHBhZ2UsICQpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUZpbGVDb2xsZWN0aW9uKHBhZ2UsIGZpbGVzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIGZpbGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciwgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgUGFnZVJlZiB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBQYWdlIG1ldGEgdGFnIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlTWV0YURhdGEge1xuICBwYWdlOiBQYWdlUmVmO1xuICBuYW1lOiBzdHJpbmc7XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYWdlIG1ldGEgdGFnXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlTWV0YSB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlUmVmO1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgY29udGVudDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VNZXRhRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLm5hbWUgPSBkYXRhLm5hbWU7XG4gICAgdGhpcy5jb250ZW50ID0gZGF0YS5jb250ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtZXRhIHRhZyB2YWx1ZVxuICAgKiBAcGFyYW0gY29udGVudCAtIE5ldyB2YWx1ZVxuICAgKi9cbiAgdXBkYXRlKGNvbnRlbnQ6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFBhZ2VNZXRhQ29sbGVjdGlvbi5zZXRNZXRhKHRoaXMucGFnZSwgdGhpcy5uYW1lLCBjb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgbWV0YSB0YWdcbiAgICovXG4gIGRlbGV0ZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBQYWdlTWV0YUNvbGxlY3Rpb24uZGVsZXRlTWV0YSh0aGlzLnBhZ2UsIHRoaXMubmFtZSk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZU1ldGEobmFtZT0ke3RoaXMubmFtZX0sIGNvbnRlbnQ9JHt0aGlzLmNvbnRlbnR9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQYWdlIG1ldGEgdGFnIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VNZXRhQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VNZXRhPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlUmVmO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2VSZWYsIG1ldGFzPzogUGFnZU1ldGFbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAobWV0YXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5tZXRhcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgbmFtZVxuICAgKiBAcGFyYW0gbmFtZSAtIE1ldGEgdGFnIG5hbWVcbiAgICogQHJldHVybnMgTWV0YSB0YWcgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlOYW1lKG5hbWU6IHN0cmluZyk6IFBhZ2VNZXRhIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChtZXRhKSA9PiBtZXRhLm5hbWUgPT09IG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYWdlIG1ldGEgdGFnc1xuICAgKiBAcGFyYW0gcGFnZSAtIFBhZ2UgcmVmZXJlbmNlXG4gICAqIEByZXR1cm5zIE1ldGEgdGFnIGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKHBhZ2U6IFBhZ2VSZWYpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZU1ldGFDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L0VkaXRNZXRhTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZS5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0IG1ldGFzOiBQYWdlTWV0YVtdID0gW107XG5cbiAgICAgICAgLy8gUGFyc2UgSFRNTC1lbmNvZGVkIG1ldGEgdGFncyB3aXRoIHJlZ2V4XG4gICAgICAgIC8vIEZvcm1hdDogJmx0O21ldGEgbmFtZT1cInh4eFwiIGNvbnRlbnQ9XCJ5eXlcIi8mZ3Q7XG4gICAgICAgIGNvbnN0IG1ldGFSZWdleCA9IC8mbHQ7bWV0YSBuYW1lPVwiKFteXCJdKylcIiBjb250ZW50PVwiKFteXCJdKilcIlxcLz8mZ3Q7L2c7XG4gICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgaHRtbC5tYXRjaEFsbChtZXRhUmVnZXgpKSB7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IG1hdGNoWzFdO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBtYXRjaFsyXTtcbiAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgbWV0YXMucHVzaChcbiAgICAgICAgICAgICAgbmV3IFBhZ2VNZXRhKHtcbiAgICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgY29udGVudDogY29udGVudCA/PyAnJyxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlTWV0YUNvbGxlY3Rpb24ocGFnZSwgbWV0YXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBtZXRhczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1ldGEgdGFnXG4gICAqIEBwYXJhbSBwYWdlIC0gUGFnZSByZWZlcmVuY2VcbiAgICogQHBhcmFtIG5hbWUgLSBNZXRhIHRhZyBuYW1lXG4gICAqIEBwYXJhbSBjb250ZW50IC0gTWV0YSB0YWcgdmFsdWVcbiAgICovXG4gIHN0YXRpYyBzZXRNZXRhKHBhZ2U6IFBhZ2VSZWYsIG5hbWU6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IHBhZ2Uuc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBzZXQgbWV0YSB0YWcnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdzYXZlTWV0YVRhZycsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZWRpdC9FZGl0TWV0YU1vZHVsZScsXG4gICAgICAgICAgICBwYWdlSWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgICBtZXRhTmFtZTogbmFtZSxcbiAgICAgICAgICAgIG1ldGFDb250ZW50OiBjb250ZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZXQgbWV0YSB0YWc6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBtZXRhIHRhZ1xuICAgKiBAcGFyYW0gcGFnZSAtIFBhZ2UgcmVmZXJlbmNlXG4gICAqIEBwYXJhbSBuYW1lIC0gTWV0YSB0YWcgbmFtZVxuICAgKi9cbiAgc3RhdGljIGRlbGV0ZU1ldGEocGFnZTogUGFnZVJlZiwgbmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IHBhZ2Uuc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBkZWxldGUgbWV0YSB0YWcnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdkZWxldGVNZXRhVGFnJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L0VkaXRNZXRhTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZS5pZCxcbiAgICAgICAgICAgIG1ldGFOYW1lOiBuYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBkZWxldGUgbWV0YSB0YWc6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgUGFnZSB9IGZyb20gJy4vcGFnZSc7XG5pbXBvcnQgdHlwZSB7IFBhZ2VTb3VyY2UgfSBmcm9tICcuL3BhZ2Utc291cmNlJztcblxuLyoqXG4gKiBQYWdlIHJldmlzaW9uIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlUmV2aXNpb25EYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgaWQ6IG51bWJlcjtcbiAgcmV2Tm86IG51bWJlcjtcbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXI7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgY29tbWVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhZ2UgcmV2aXNpb24gKHZlcnNpb24gaW4gZWRpdCBoaXN0b3J5KVxuICovXG5leHBvcnQgY2xhc3MgUGFnZVJldmlzaW9uIHtcbiAgLyoqIFBhZ2UgdGhpcyByZXZpc2lvbiBiZWxvbmdzIHRvICovXG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIC8qKiBSZXZpc2lvbiBJRCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcblxuICAvKiogUmV2aXNpb24gbnVtYmVyICovXG4gIHB1YmxpYyByZWFkb25seSByZXZObzogbnVtYmVyO1xuXG4gIC8qKiBSZXZpc2lvbiBjcmVhdG9yICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcblxuICAvKiogUmV2aXNpb24gY3JlYXRpb24gZGF0ZSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0OiBEYXRlO1xuXG4gIC8qKiBFZGl0IGNvbW1lbnQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbW1lbnQ6IHN0cmluZztcblxuICAvKiogU291cmNlIGNvZGUgKGludGVybmFsIGNhY2hlKSAqL1xuICBwcml2YXRlIF9zb3VyY2U6IFBhZ2VTb3VyY2UgfCBudWxsID0gbnVsbDtcblxuICAvKiogSFRNTCBkaXNwbGF5IChpbnRlcm5hbCBjYWNoZSkgKi9cbiAgcHJpdmF0ZSBfaHRtbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZVJldmlzaW9uRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnJldk5vID0gZGF0YS5yZXZObztcbiAgICB0aGlzLmNyZWF0ZWRCeSA9IGRhdGEuY3JlYXRlZEJ5O1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gZGF0YS5jcmVhdGVkQXQ7XG4gICAgdGhpcy5jb21tZW50ID0gZGF0YS5jb21tZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgc291cmNlIGNvZGUgaGFzIGJlZW4gYWNxdWlyZWRcbiAgICovXG4gIGlzU291cmNlQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIEhUTUwgZGlzcGxheSBoYXMgYmVlbiBhY3F1aXJlZFxuICAgKi9cbiAgaXNIdG1sQWNxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2h0bWwgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlIChjYWNoZWQpXG4gICAqL1xuICBnZXQgc291cmNlKCk6IFBhZ2VTb3VyY2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzb3VyY2UgY29kZVxuICAgKi9cbiAgc2V0IHNvdXJjZSh2YWx1ZTogUGFnZVNvdXJjZSB8IG51bGwpIHtcbiAgICB0aGlzLl9zb3VyY2UgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgSFRNTCBkaXNwbGF5IChjYWNoZWQpXG4gICAqL1xuICBnZXQgaHRtbCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgSFRNTCBkaXNwbGF5XG4gICAqL1xuICBzZXQgaHRtbCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX2h0bWwgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmV2aXNpb24gc291cmNlIChSRVYtMDAxKVxuICAgKiBAcmV0dXJucyBTb3VyY2Ugc3RyaW5nXG4gICAqL1xuICBnZXRTb3VyY2UoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIFJldHVybiBjYWNoZSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2Uud2lraVRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlU291cmNlTW9kdWxlJyxcbiAgICAgICAgICAgIHJldmlzaW9uX2lkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIFBhZ2VTb3VyY2VNb2R1bGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgLy8gU291cmNlIGNvZGUgaXMgaW5zaWRlIDxkaXYgY2xhc3M9XCJwYWdlLXNvdXJjZVwiPlxuICAgICAgICBjb25zdCBzb3VyY2VFbGVtID0gJCgnZGl2LnBhZ2Utc291cmNlJyk7XG4gICAgICAgIGlmIChzb3VyY2VFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignU291cmNlIGVsZW1lbnQgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzb3VyY2VUZXh0ID0gc291cmNlRWxlbS50ZXh0KCk7XG4gICAgICAgIHJldHVybiBzb3VyY2VUZXh0O1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCByZXZpc2lvbiBzb3VyY2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBIVE1MIChSRVYtMDAyKVxuICAgKiBAcmV0dXJucyBIVE1MIHN0cmluZ1xuICAgKi9cbiAgZ2V0SHRtbCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmV0dXJuIGNhY2hlIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAodGhpcy5faHRtbCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLl9odG1sO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5wYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2hpc3RvcnkvUGFnZVZlcnNpb25Nb2R1bGUnLFxuICAgICAgICAgICAgcmV2aXNpb25faWQ6IHRoaXMuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gUGFnZVZlcnNpb25Nb2R1bGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgLy8gSFRNTCBjb250ZW50IGlzIGluc2lkZSA8ZGl2IGlkPVwicGFnZS1jb250ZW50XCI+XG4gICAgICAgIGNvbnN0IGNvbnRlbnRFbGVtID0gJCgnI3BhZ2UtY29udGVudCcpO1xuICAgICAgICBpZiAoY29udGVudEVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gUmV0dXJuIGVudGlyZSBib2R5IGlmIHBhZ2UtY29udGVudCBkb2Vzbid0IGV4aXN0XG4gICAgICAgICAgdGhpcy5faHRtbCA9IGh0bWw7XG4gICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb250ZW50SHRtbCA9IGNvbnRlbnRFbGVtLmh0bWwoKSA/PyAnJztcbiAgICAgICAgdGhpcy5faHRtbCA9IGNvbnRlbnRIdG1sO1xuICAgICAgICByZXR1cm4gY29udGVudEh0bWw7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIEhUTUw6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VSZXZpc2lvbihpZD0ke3RoaXMuaWR9LCByZXZObz0ke3RoaXMucmV2Tm99KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQYWdlIHJldmlzaW9uIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxQYWdlUmV2aXNpb24+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2UgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UgfCBudWxsLCByZXZpc2lvbnM/OiBQYWdlUmV2aXNpb25bXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAocmV2aXNpb25zKSB7XG4gICAgICB0aGlzLnB1c2goLi4ucmV2aXNpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKiBAcGFyYW0gaWQgLSBSZXZpc2lvbiBJRFxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQYWdlUmV2aXNpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHJldmlzaW9uKSA9PiByZXZpc2lvbi5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzb3VyY2VzIGZvciBhbGwgcmV2aXNpb25zXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIHNvdXJjZSBzdHJpbmdzXG4gICAqL1xuICBnZXRTb3VyY2VzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxzdHJpbmdbXT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICB0aGlzLm1hcChhc3luYyAocmV2aXNpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJldmlzaW9uLmdldFNvdXJjZSgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHNvdXJjZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVE1MIGZvciBhbGwgcmV2aXNpb25zXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIEhUTUwgc3RyaW5nc1xuICAgKi9cbiAgZ2V0SHRtbHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRoaXMubWFwKGFzeW5jIChyZXZpc2lvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmV2aXNpb24uZ2V0SHRtbCgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IEhUTUxzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIFBhZ2Ugc291cmNlIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlU291cmNlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIHdpa2lUZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFnZSBzb3VyY2UgY29kZSAoV2lraWRvdCBzeW50YXgpXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlU291cmNlIHtcbiAgLyoqIFBhZ2UgdGhpcyBzb3VyY2UgYmVsb25ncyB0byAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcblxuICAvKiogU291cmNlIGNvZGUgKFdpa2lkb3Qgc3ludGF4KSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd2lraVRleHQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlU291cmNlRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLndpa2lUZXh0ID0gZGF0YS53aWtpVGV4dDtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlU291cmNlKHBhZ2U9JHt0aGlzLnBhZ2UuZnVsbG5hbWV9LCBsZW5ndGg9JHt0aGlzLndpa2lUZXh0Lmxlbmd0aH0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcblxuLyoqXG4gKiBQYWdlIHZvdGUgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VWb3RlRGF0YSB7XG4gIHBhZ2U6IFBhZ2U7XG4gIHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgdmFsdWU6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYWdlIHZvdGUgKHJhdGluZylcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VWb3RlIHtcbiAgLyoqIFBhZ2UgdGhpcyB2b3RlIGJlbG9uZ3MgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG5cbiAgLyoqIFVzZXIgd2hvIHZvdGVkICovXG4gIHB1YmxpYyByZWFkb25seSB1c2VyOiBBYnN0cmFjdFVzZXI7XG5cbiAgLyoqIFZvdGUgdmFsdWUgKCsxLy0xIG9yIG51bWVyaWMpICovXG4gIHB1YmxpYyByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VWb3RlRGF0YSkge1xuICAgIHRoaXMucGFnZSA9IGRhdGEucGFnZTtcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgdGhpcy52YWx1ZSA9IGRhdGEudmFsdWU7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZVZvdGUodXNlcj0ke3RoaXMudXNlci5uYW1lfSwgdmFsdWU9JHt0aGlzLnZhbHVlfSlgO1xuICB9XG59XG5cbi8qKlxuICogUGFnZSB2b3RlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VWb3RlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VWb3RlPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UsIHZvdGVzPzogUGFnZVZvdGVbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAodm90ZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi52b3Rlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgdXNlclxuICAgKiBAcGFyYW0gdXNlciAtIFVzZXIgdG8gc2VhcmNoIGZvclxuICAgKiBAcmV0dXJucyBWb3RlICh1bmRlZmluZWQgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZmluZEJ5VXNlcih1c2VyOiBBYnN0cmFjdFVzZXIpOiBQYWdlVm90ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgodm90ZSkgPT4gdm90ZS51c2VyLmlkID09PSB1c2VyLmlkKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuXG4vKipcbiAqIFBhZ2Ugc2VhcmNoIHF1ZXJ5IHBhcmFtZXRlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zIHtcbiAgLyoqIFBhZ2UgdHlwZSAoZS5nLiwgJ25vcm1hbCcsICdhZG1pbicpICovXG4gIHBhZ2V0eXBlPzogc3RyaW5nO1xuICAvKiogQ2F0ZWdvcnkgbmFtZSAqL1xuICBjYXRlZ29yeT86IHN0cmluZztcbiAgLyoqIFRhZ3MgdG8gc2VhcmNoIChBTkQgY29uZGl0aW9uKSAqL1xuICB0YWdzPzogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKiBQYXJlbnQgcGFnZSBuYW1lICovXG4gIHBhcmVudD86IHN0cmluZztcbiAgLyoqIExpbmtlZCBwYWdlIG5hbWUgKi9cbiAgbGlua1RvPzogc3RyaW5nO1xuICAvKiogQ3JlYXRlZCBkYXRlIGNvbmRpdGlvbiAqL1xuICBjcmVhdGVkQXQ/OiBzdHJpbmc7XG4gIC8qKiBVcGRhdGVkIGRhdGUgY29uZGl0aW9uICovXG4gIHVwZGF0ZWRBdD86IHN0cmluZztcbiAgLyoqIENyZWF0b3IgKi9cbiAgY3JlYXRlZEJ5PzogQWJzdHJhY3RVc2VyIHwgc3RyaW5nO1xuICAvKiogUmF0aW5nIGNvbmRpdGlvbiAqL1xuICByYXRpbmc/OiBzdHJpbmc7XG4gIC8qKiBWb3RlIGNvdW50IGNvbmRpdGlvbiAqL1xuICB2b3Rlcz86IHN0cmluZztcbiAgLyoqIFBhZ2UgbmFtZSBjb25kaXRpb24gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIEZ1bGxuYW1lIChleGFjdCBtYXRjaCkgKi9cbiAgZnVsbG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBSYW5nZSBzcGVjaWZpY2F0aW9uICovXG4gIHJhbmdlPzogc3RyaW5nO1xuICAvKiogU29ydCBvcmRlciAoZS5nLiwgJ2NyZWF0ZWRfYXQgZGVzYycpICovXG4gIG9yZGVyPzogc3RyaW5nO1xuICAvKiogU3RhcnQgb2Zmc2V0ICovXG4gIG9mZnNldD86IG51bWJlcjtcbiAgLyoqIFJlc3VsdCBsaW1pdCAqL1xuICBsaW1pdD86IG51bWJlcjtcbiAgLyoqIEl0ZW1zIHBlciBwYWdlICovXG4gIHBlclBhZ2U/OiBudW1iZXI7XG4gIC8qKiBTZXBhcmF0ZSBkaXNwbGF5ICovXG4gIHNlcGFyYXRlPzogc3RyaW5nO1xuICAvKiogV3JhcHBlciBkaXNwbGF5ICovXG4gIHdyYXBwZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVmYXVsdCBpdGVtcyBwZXIgcGFnZVxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9QRVJfUEFHRSA9IDI1MDtcblxuLyoqXG4gKiBEZWZhdWx0IG1vZHVsZSBib2R5IGZpZWxkc1xuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NT0RVTEVfQk9EWSA9IFtcbiAgJ2Z1bGxuYW1lJyxcbiAgJ2NhdGVnb3J5JyxcbiAgJ25hbWUnLFxuICAndGl0bGUnLFxuICAnY3JlYXRlZF9hdCcsXG4gICdjcmVhdGVkX2J5X2xpbmtlZCcsXG4gICd1cGRhdGVkX2F0JyxcbiAgJ3VwZGF0ZWRfYnlfbGlua2VkJyxcbiAgJ2NvbW1lbnRlZF9hdCcsXG4gICdjb21tZW50ZWRfYnlfbGlua2VkJyxcbiAgJ3BhcmVudF9mdWxsbmFtZScsXG4gICdjb21tZW50cycsXG4gICdzaXplJyxcbiAgJ2NoaWxkcmVuJyxcbiAgJ3JhdGluZ192b3RlcycsXG4gICdyYXRpbmcnLFxuICAncmF0aW5nX3BlcmNlbnQnLFxuICAncmV2aXNpb25zJyxcbiAgJ3RhZ3MnLFxuICAnX3RhZ3MnLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBQYWdlIHNlYXJjaCBxdWVyeVxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoUGFnZXNRdWVyeSB7XG4gIC8qKiBQYWdlIHR5cGUgKi9cbiAgcGFnZXR5cGU6IHN0cmluZztcbiAgLyoqIENhdGVnb3J5ICovXG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIC8qKiBUYWdzICovXG4gIHRhZ3M6IHN0cmluZyB8IHN0cmluZ1tdIHwgbnVsbDtcbiAgLyoqIFBhcmVudCBwYWdlICovXG4gIHBhcmVudDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIExpbmsgdGFyZ2V0ICovXG4gIGxpbmtUbzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIENyZWF0ZWQgZGF0ZSBjb25kaXRpb24gKi9cbiAgY3JlYXRlZEF0OiBzdHJpbmcgfCBudWxsO1xuICAvKiogVXBkYXRlZCBkYXRlIGNvbmRpdGlvbiAqL1xuICB1cGRhdGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBDcmVhdG9yICovXG4gIGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFJhdGluZyBjb25kaXRpb24gKi9cbiAgcmF0aW5nOiBzdHJpbmcgfCBudWxsO1xuICAvKiogVm90ZSBjb3VudCBjb25kaXRpb24gKi9cbiAgdm90ZXM6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBQYWdlIG5hbWUgY29uZGl0aW9uICovXG4gIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBGdWxsbmFtZSBjb25kaXRpb24gKi9cbiAgZnVsbG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBSYW5nZSAqL1xuICByYW5nZTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFNvcnQgb3JkZXIgKi9cbiAgb3JkZXI6IHN0cmluZztcbiAgLyoqIE9mZnNldCAqL1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgLyoqIFJlc3VsdCBsaW1pdCAqL1xuICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIEl0ZW1zIHBlciBwYWdlICovXG4gIHBlclBhZ2U6IG51bWJlcjtcbiAgLyoqIFNlcGFyYXRlIGRpc3BsYXkgKi9cbiAgc2VwYXJhdGU6IHN0cmluZztcbiAgLyoqIFdyYXBwZXIgZGlzcGxheSAqL1xuICB3cmFwcGVyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocGFyYW1zOiBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zID0ge30pIHtcbiAgICB0aGlzLnBhZ2V0eXBlID0gcGFyYW1zLnBhZ2V0eXBlID8/ICcqJztcbiAgICB0aGlzLmNhdGVnb3J5ID0gcGFyYW1zLmNhdGVnb3J5ID8/ICcqJztcbiAgICB0aGlzLnRhZ3MgPSBwYXJhbXMudGFncyA/PyBudWxsO1xuICAgIHRoaXMucGFyZW50ID0gcGFyYW1zLnBhcmVudCA/PyBudWxsO1xuICAgIHRoaXMubGlua1RvID0gcGFyYW1zLmxpbmtUbyA/PyBudWxsO1xuICAgIHRoaXMuY3JlYXRlZEF0ID0gcGFyYW1zLmNyZWF0ZWRBdCA/PyBudWxsO1xuICAgIHRoaXMudXBkYXRlZEF0ID0gcGFyYW1zLnVwZGF0ZWRBdCA/PyBudWxsO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gcGFyYW1zLmNyZWF0ZWRCeSA/PyBudWxsO1xuICAgIHRoaXMucmF0aW5nID0gcGFyYW1zLnJhdGluZyA/PyBudWxsO1xuICAgIHRoaXMudm90ZXMgPSBwYXJhbXMudm90ZXMgPz8gbnVsbDtcbiAgICB0aGlzLm5hbWUgPSBwYXJhbXMubmFtZSA/PyBudWxsO1xuICAgIHRoaXMuZnVsbG5hbWUgPSBwYXJhbXMuZnVsbG5hbWUgPz8gbnVsbDtcbiAgICB0aGlzLnJhbmdlID0gcGFyYW1zLnJhbmdlID8/IG51bGw7XG4gICAgdGhpcy5vcmRlciA9IHBhcmFtcy5vcmRlciA/PyAnY3JlYXRlZF9hdCBkZXNjJztcbiAgICB0aGlzLm9mZnNldCA9IHBhcmFtcy5vZmZzZXQgPz8gMDtcbiAgICB0aGlzLmxpbWl0ID0gcGFyYW1zLmxpbWl0ID8/IG51bGw7XG4gICAgdGhpcy5wZXJQYWdlID0gcGFyYW1zLnBlclBhZ2UgPz8gREVGQVVMVF9QRVJfUEFHRTtcbiAgICB0aGlzLnNlcGFyYXRlID0gcGFyYW1zLnNlcGFyYXRlID8/ICdubyc7XG4gICAgdGhpcy53cmFwcGVyID0gcGFyYW1zLndyYXBwZXIgPz8gJ25vJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHRvIGRpY3Rpb25hcnkgZm9ybWF0XG4gICAqL1xuICBhc0RpY3QoKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIC8vIHBhZ2V0eXBlIGFuZCBjYXRlZ29yeSBtdXN0IGFsd2F5cyBiZSBpbmNsdWRlZFxuICAgIC8vIFdpa2lkb3QgZGVmYXVsdHM6IHBhZ2V0eXBlPVwibm9ybWFsXCIsIGNhdGVnb3J5PVwiLlwiIChjdXJyZW50IGNhdGVnb3J5KVxuICAgIC8vIFRvIGdldCBhbGwgcGFnZXMsIHdlIG5lZWQgdG8gZXhwbGljaXRseSBzZW5kIFwiKlwiXG4gICAgcmVzdWx0LnBhZ2V0eXBlID0gdGhpcy5wYWdldHlwZTtcbiAgICByZXN1bHQuY2F0ZWdvcnkgPSB0aGlzLmNhdGVnb3J5O1xuICAgIGlmICh0aGlzLnRhZ3MgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdC50YWdzID0gQXJyYXkuaXNBcnJheSh0aGlzLnRhZ3MpID8gdGhpcy50YWdzLmpvaW4oJyAnKSA6IHRoaXMudGFncztcbiAgICB9XG4gICAgaWYgKHRoaXMucGFyZW50ICE9PSBudWxsKSByZXN1bHQucGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgaWYgKHRoaXMubGlua1RvICE9PSBudWxsKSByZXN1bHQubGlua190byA9IHRoaXMubGlua1RvO1xuICAgIGlmICh0aGlzLmNyZWF0ZWRBdCAhPT0gbnVsbCkgcmVzdWx0LmNyZWF0ZWRfYXQgPSB0aGlzLmNyZWF0ZWRBdDtcbiAgICBpZiAodGhpcy51cGRhdGVkQXQgIT09IG51bGwpIHJlc3VsdC51cGRhdGVkX2F0ID0gdGhpcy51cGRhdGVkQXQ7XG4gICAgaWYgKHRoaXMuY3JlYXRlZEJ5ICE9PSBudWxsKSB7XG4gICAgICByZXN1bHQuY3JlYXRlZF9ieSA9IHR5cGVvZiB0aGlzLmNyZWF0ZWRCeSA9PT0gJ3N0cmluZycgPyB0aGlzLmNyZWF0ZWRCeSA6IHRoaXMuY3JlYXRlZEJ5Lm5hbWU7XG4gICAgfVxuICAgIGlmICh0aGlzLnJhdGluZyAhPT0gbnVsbCkgcmVzdWx0LnJhdGluZyA9IHRoaXMucmF0aW5nO1xuICAgIGlmICh0aGlzLnZvdGVzICE9PSBudWxsKSByZXN1bHQudm90ZXMgPSB0aGlzLnZvdGVzO1xuICAgIGlmICh0aGlzLm5hbWUgIT09IG51bGwpIHJlc3VsdC5uYW1lID0gdGhpcy5uYW1lO1xuICAgIGlmICh0aGlzLmZ1bGxuYW1lICE9PSBudWxsKSByZXN1bHQuZnVsbG5hbWUgPSB0aGlzLmZ1bGxuYW1lO1xuICAgIGlmICh0aGlzLnJhbmdlICE9PSBudWxsKSByZXN1bHQucmFuZ2UgPSB0aGlzLnJhbmdlO1xuXG4gICAgcmVzdWx0Lm9yZGVyID0gdGhpcy5vcmRlcjtcbiAgICByZXN1bHQub2Zmc2V0ID0gdGhpcy5vZmZzZXQ7XG4gICAgaWYgKHRoaXMubGltaXQgIT09IG51bGwpIHJlc3VsdC5saW1pdCA9IHRoaXMubGltaXQ7XG4gICAgcmVzdWx0LnBlclBhZ2UgPSB0aGlzLnBlclBhZ2U7XG4gICAgcmVzdWx0LnNlcGFyYXRlID0gdGhpcy5zZXBhcmF0ZTtcbiAgICByZXN1bHQud3JhcHBlciA9IHRoaXMud3JhcHBlcjtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICogU2l0ZSBjaGFuZ2UgaGlzdG9yeSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZUNoYW5nZURhdGEge1xuICBzaXRlOiBTaXRlO1xuICBwYWdlRnVsbG5hbWU6IHN0cmluZztcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XG4gIHJldmlzaW9uTm86IG51bWJlcjtcbiAgY2hhbmdlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjaGFuZ2VkQXQ6IERhdGUgfCBudWxsO1xuICBmbGFnczogc3RyaW5nW107XG4gIGNvbW1lbnQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBTaXRlIGNoYW5nZSBoaXN0b3J5XG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlQ2hhbmdlIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlRnVsbG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcmV2aXNpb25ObzogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgY2hhbmdlZEF0OiBEYXRlIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGZsYWdzOiBzdHJpbmdbXTtcbiAgcHVibGljIHJlYWRvbmx5IGNvbW1lbnQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBTaXRlQ2hhbmdlRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnBhZ2VGdWxsbmFtZSA9IGRhdGEucGFnZUZ1bGxuYW1lO1xuICAgIHRoaXMucGFnZVRpdGxlID0gZGF0YS5wYWdlVGl0bGU7XG4gICAgdGhpcy5yZXZpc2lvbk5vID0gZGF0YS5yZXZpc2lvbk5vO1xuICAgIHRoaXMuY2hhbmdlZEJ5ID0gZGF0YS5jaGFuZ2VkQnk7XG4gICAgdGhpcy5jaGFuZ2VkQXQgPSBkYXRhLmNoYW5nZWRBdDtcbiAgICB0aGlzLmZsYWdzID0gZGF0YS5mbGFncztcbiAgICB0aGlzLmNvbW1lbnQgPSBkYXRhLmNvbW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgVVJMXG4gICAqL1xuICBnZXRQYWdlVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuc2l0ZS5nZXRCYXNlVXJsKCl9LyR7dGhpcy5wYWdlRnVsbG5hbWV9YDtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTaXRlQ2hhbmdlKHBhZ2U9JHt0aGlzLnBhZ2VGdWxsbmFtZX0sIHJldj0ke3RoaXMucmV2aXNpb25Ob30sIGJ5PSR7dGhpcy5jaGFuZ2VkQnl9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBTaXRlIGNoYW5nZSBoaXN0b3J5IGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVDaGFuZ2VDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8U2l0ZUNoYW5nZT4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlLCBjaGFuZ2VzPzogU2l0ZUNoYW5nZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICAgIGlmIChjaGFuZ2VzKSB7XG4gICAgICB0aGlzLnB1c2goLi4uY2hhbmdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWNlbnQgY2hhbmdlIGhpc3RvcnlcbiAgICogQHBhcmFtIHNpdGUgLSBTaXRlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uc1xuICAgKiBAcmV0dXJucyBDaGFuZ2UgaGlzdG9yeSBjb2xsZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZShcbiAgICBzaXRlOiBTaXRlLFxuICAgIG9wdGlvbnM/OiB7IHBlclBhZ2U/OiBudW1iZXI7IHBhZ2U/OiBudW1iZXI7IGxpbWl0PzogbnVtYmVyIH1cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVDaGFuZ2VDb2xsZWN0aW9uPiB7XG4gICAgY29uc3QgcGVyUGFnZSA9IG9wdGlvbnM/LnBlclBhZ2UgPz8gMjA7XG4gICAgY29uc3QgcGFnZSA9IG9wdGlvbnM/LnBhZ2UgPz8gMTtcbiAgICBjb25zdCBsaW1pdCA9IG9wdGlvbnM/LmxpbWl0O1xuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnY2hhbmdlcy9TaXRlQ2hhbmdlc0xpc3RNb2R1bGUnLFxuICAgICAgICAgICAgcGVycGFnZTogcGVyUGFnZSxcbiAgICAgICAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICBjb25zdCBjaGFuZ2VzOiBTaXRlQ2hhbmdlW10gPSBbXTtcblxuICAgICAgICAvLyBQYXJzZSB0YWJsZSByb3dzXG4gICAgICAgICQoJ3RhYmxlLndpa2ktY29udGVudC10YWJsZSB0cicpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgJHJvdyA9ICQoZWxlbSk7XG4gICAgICAgICAgY29uc3QgJGNlbGxzID0gJHJvdy5maW5kKCd0ZCcpO1xuICAgICAgICAgIGlmICgkY2VsbHMubGVuZ3RoIDwgNCkgcmV0dXJuO1xuXG4gICAgICAgICAgLy8gUGFnZSBsaW5rXG4gICAgICAgICAgY29uc3QgcGFnZUxpbmsgPSAkKCRjZWxsc1swXSkuZmluZCgnYScpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSBwYWdlTGluay5hdHRyKCdocmVmJykgPz8gJyc7XG4gICAgICAgICAgY29uc3QgcGFnZUZ1bGxuYW1lID0gaHJlZi5yZXBsYWNlKC9eXFwvLywgJycpLnNwbGl0KCcvJylbMF0gPz8gJyc7XG4gICAgICAgICAgY29uc3QgcGFnZVRpdGxlID0gcGFnZUxpbmsudGV4dCgpLnRyaW0oKTtcblxuICAgICAgICAgIC8vIFJldmlzaW9uIG51bWJlclxuICAgICAgICAgIGNvbnN0IHJldlRleHQgPSAkKCRjZWxsc1sxXSkudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCByZXZNYXRjaCA9IHJldlRleHQubWF0Y2goLyhcXGQrKS8pO1xuICAgICAgICAgIGNvbnN0IHJldmlzaW9uTm8gPSByZXZNYXRjaD8uWzFdID8gTnVtYmVyLnBhcnNlSW50KHJldk1hdGNoWzFdLCAxMCkgOiAwO1xuXG4gICAgICAgICAgLy8gRmxhZ3NcbiAgICAgICAgICBjb25zdCBmbGFnc0NlbGwgPSAkKCRjZWxsc1syXSk7XG4gICAgICAgICAgY29uc3QgZmxhZ3M6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgZmxhZ3NDZWxsLmZpbmQoJ3NwYW4nKS5lYWNoKChfaiwgZmxhZ0VsZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZsYWdDbGFzcyA9ICQoZmxhZ0VsZW0pLmF0dHIoJ2NsYXNzJykgPz8gJyc7XG4gICAgICAgICAgICBpZiAoZmxhZ0NsYXNzLmluY2x1ZGVzKCdzcGFudGlwJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSAkKGZsYWdFbGVtKS5hdHRyKCd0aXRsZScpID8/ICcnO1xuICAgICAgICAgICAgICBpZiAodGl0bGUpIGZsYWdzLnB1c2godGl0bGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gVXNlciBhbmQgdGltZXN0YW1wXG4gICAgICAgICAgY29uc3QgaW5mb0NlbGwgPSAkKCRjZWxsc1szXSk7XG4gICAgICAgICAgY29uc3QgdXNlckVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0IGNoYW5nZWRCeSA9IHVzZXJFbGVtLmxlbmd0aCA+IDAgPyBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsIHVzZXJFbGVtKSA6IG51bGw7XG5cbiAgICAgICAgICBjb25zdCBvZGF0ZUVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgY29uc3QgY2hhbmdlZEF0ID0gb2RhdGVFbGVtLmxlbmd0aCA+IDAgPyBwYXJzZU9kYXRlKG9kYXRlRWxlbSkgOiBudWxsO1xuXG4gICAgICAgICAgLy8gQ29tbWVudFxuICAgICAgICAgIGNvbnN0IGNvbW1lbnRFbGVtID0gaW5mb0NlbGwuZmluZCgnc3Bhbi5jb21tZW50cycpO1xuICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50RWxlbVxuICAgICAgICAgICAgLnRleHQoKVxuICAgICAgICAgICAgLnRyaW0oKVxuICAgICAgICAgICAgLnJlcGxhY2UoL15bXCJcIl18W1wiXCJdJC9nLCAnJyk7XG5cbiAgICAgICAgICBjaGFuZ2VzLnB1c2goXG4gICAgICAgICAgICBuZXcgU2l0ZUNoYW5nZSh7XG4gICAgICAgICAgICAgIHNpdGUsXG4gICAgICAgICAgICAgIHBhZ2VGdWxsbmFtZSxcbiAgICAgICAgICAgICAgcGFnZVRpdGxlLFxuICAgICAgICAgICAgICByZXZpc2lvbk5vLFxuICAgICAgICAgICAgICBjaGFuZ2VkQnksXG4gICAgICAgICAgICAgIGNoYW5nZWRBdCxcbiAgICAgICAgICAgICAgZmxhZ3MsXG4gICAgICAgICAgICAgIGNvbW1lbnQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIExpbWl0IHJlc3VsdHMgaWYgbGltaXQgaXMgc3BlY2lmaWVkXG4gICAgICAgIGNvbnN0IGxpbWl0ZWRDaGFuZ2VzID0gbGltaXQgIT09IHVuZGVmaW5lZCA/IGNoYW5nZXMuc2xpY2UoMCwgbGltaXQpIDogY2hhbmdlcztcbiAgICAgICAgcmV0dXJuIG5ldyBTaXRlQ2hhbmdlQ29sbGVjdGlvbihzaXRlLCBsaW1pdGVkQ2hhbmdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBzaXRlIGNoYW5nZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlVXNlciB9IGZyb20gJy4uLy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB7XG4gIFBhZ2UsXG4gIFBhZ2VDb2xsZWN0aW9uLFxuICBTZWFyY2hQYWdlc1F1ZXJ5LFxuICB0eXBlIFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMsXG4gIFNpdGVDaGFuZ2VDb2xsZWN0aW9uLFxufSBmcm9tICcuLi8uLi9wYWdlJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuXG4vKipcbiAqIFBhZ2UgbGlzdCBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlc0FjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHBhZ2VzIG1hdGNoaW5nIGNvbmRpdGlvbnNcbiAgICogQHBhcmFtIHBhcmFtcyAtIFNlYXJjaCBjb25kaXRpb25zXG4gICAqIEByZXR1cm5zIFBhZ2UgY29sbGVjdGlvblxuICAgKi9cbiAgc2VhcmNoKHBhcmFtcz86IFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBxdWVyeSA9IG5ldyBTZWFyY2hQYWdlc1F1ZXJ5KHBhcmFtcyk7XG4gICAgICAgIGNvbnN0IHVzZXJQYXJzZXIgPSBwYXJzZVVzZXIuYmluZChudWxsLCB0aGlzLnNpdGUuY2xpZW50KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5zZWFyY2hQYWdlcyh0aGlzLnNpdGUsIHVzZXJQYXJzZXIsIHF1ZXJ5KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZWFyY2ggcGFnZXM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBwYWdlc1xuICAgKiBAcmV0dXJucyBQYWdlIGNvbGxlY3Rpb25cbiAgICovXG4gIGFsbCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5zZWFyY2goe30pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWNlbnQgY2hhbmdlc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnNcbiAgICogQHBhcmFtIG9wdGlvbnMucGVyUGFnZSAtIEl0ZW1zIHBlciBwYWdlIChkZWZhdWx0OiAyMClcbiAgICogQHBhcmFtIG9wdGlvbnMucGFnZSAtIFBhZ2UgbnVtYmVyIChkZWZhdWx0OiAxKVxuICAgKiBAcmV0dXJucyBDaGFuZ2UgaGlzdG9yeSBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRSZWNlbnRDaGFuZ2VzKG9wdGlvbnM/OiB7XG4gICAgcGVyUGFnZT86IG51bWJlcjtcbiAgICBwYWdlPzogbnVtYmVyO1xuICB9KTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVDaGFuZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFNpdGVDaGFuZ2VDb2xsZWN0aW9uLmFjcXVpcmUodGhpcy5zaXRlLCBvcHRpb25zKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBQYWdlLFxuICBQYWdlQ29sbGVjdGlvbixcbiAgU2VhcmNoUGFnZXNRdWVyeSxcbiAgdHlwZSBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zLFxuICBTaXRlQ2hhbmdlQ29sbGVjdGlvbixcbn07XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQge1xuICBOb0VsZW1lbnRFcnJvcixcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdEVycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL2NvbW1vbi9sb2dnZXInO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQU1DUmVxdWVzdEJvZHksIEFNQ1Jlc3BvbnNlIH0gZnJvbSAnLi4vLi4vY29ubmVjdG9yJztcbmltcG9ydCB7IGZldGNoV2l0aFJldHJ5IH0gZnJvbSAnLi4vLi4vdXRpbC9odHRwJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50L2NsaWVudCc7XG5pbXBvcnQgeyBGb3J1bUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvZm9ydW0tYWNjZXNzb3InO1xuaW1wb3J0IHsgTWVtYmVyQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9tZW1iZXItYWNjZXNzb3InO1xuaW1wb3J0IHsgUGFnZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcGFnZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBQYWdlc0FjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcGFnZXMtYWNjZXNzb3InO1xuXG4vKipcbiAqIFNpdGUgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpdGVEYXRhIHtcbiAgaWQ6IG51bWJlcjtcbiAgdGl0bGU6IHN0cmluZztcbiAgdW5peE5hbWU6IHN0cmluZztcbiAgZG9tYWluOiBzdHJpbmc7XG4gIHNzbFN1cHBvcnRlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTaXRlIGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50O1xuXG4gIC8qKiBTaXRlIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBTaXRlIHRpdGxlICovXG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuXG4gIC8qKiBVTklYIG5hbWUgKGUuZy4sIHNjcC1qcCkgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVuaXhOYW1lOiBzdHJpbmc7XG5cbiAgLyoqIERvbWFpbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluOiBzdHJpbmc7XG5cbiAgLyoqIFNTTCBzdXBwb3J0IGZsYWcgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNzbFN1cHBvcnRlZDogYm9vbGVhbjtcblxuICAvKiogUGFnZSBhY2Nlc3NvciAqL1xuICBwcml2YXRlIF9wYWdlOiBQYWdlQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICAvKiogUGFnZXMgYWNjZXNzb3IgKi9cbiAgcHJpdmF0ZSBfcGFnZXM6IFBhZ2VzQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICAvKiogRm9ydW0gYWNjZXNzb3IgKi9cbiAgcHJpdmF0ZSBfZm9ydW06IEZvcnVtQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICAvKiogTWVtYmVyIGFjY2Vzc29yICovXG4gIHByaXZhdGUgX21lbWJlcjogTWVtYmVyQWNjZXNzb3IgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCwgZGF0YTogU2l0ZURhdGEpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLnVuaXhOYW1lID0gZGF0YS51bml4TmFtZTtcbiAgICB0aGlzLmRvbWFpbiA9IGRhdGEuZG9tYWluO1xuICAgIHRoaXMuc3NsU3VwcG9ydGVkID0gZGF0YS5zc2xTdXBwb3J0ZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgYWNjZXNzb3JcbiAgICovXG4gIGdldCBwYWdlKCk6IFBhZ2VBY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9wYWdlKSB7XG4gICAgICB0aGlzLl9wYWdlID0gbmV3IFBhZ2VBY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2VzIGFjY2Vzc29yXG4gICAqL1xuICBnZXQgcGFnZXMoKTogUGFnZXNBY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9wYWdlcykge1xuICAgICAgdGhpcy5fcGFnZXMgPSBuZXcgUGFnZXNBY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmb3J1bSBhY2Nlc3NvclxuICAgKi9cbiAgZ2V0IGZvcnVtKCk6IEZvcnVtQWNjZXNzb3Ige1xuICAgIGlmICghdGhpcy5fZm9ydW0pIHtcbiAgICAgIHRoaXMuX2ZvcnVtID0gbmV3IEZvcnVtQWNjZXNzb3IodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9mb3J1bTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVtYmVyIGFjY2Vzc29yXG4gICAqL1xuICBnZXQgbWVtYmVyKCk6IE1lbWJlckFjY2Vzc29yIHtcbiAgICBpZiAoIXRoaXMuX21lbWJlcikge1xuICAgICAgdGhpcy5fbWVtYmVyID0gbmV3IE1lbWJlckFjY2Vzc29yKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbWVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBiYXNlIFVSTCBvZiB0aGUgc2l0ZVxuICAgKi9cbiAgZ2V0QmFzZVVybCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5zc2xTdXBwb3J0ZWQgPyAnaHR0cHMnIDogJ2h0dHAnO1xuICAgIHJldHVybiBgJHtwcm90b2NvbH06Ly8ke3RoaXMuZG9tYWlufWA7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBBTUMgcmVxdWVzdCB0byB0aGlzIHNpdGVcbiAgICogQHBhcmFtIGJvZGllcyAtIFJlcXVlc3QgYm9keSBhcnJheVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlcXVlc3Qgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBBTUMgcmVzcG9uc2UgYXJyYXlcbiAgICovXG4gIGFtY1JlcXVlc3QoYm9kaWVzOiBBTUNSZXF1ZXN0Qm9keVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlW10+O1xuICBhbWNSZXF1ZXN0KFxuICAgIGJvZGllczogQU1DUmVxdWVzdEJvZHlbXSxcbiAgICBvcHRpb25zOiB7IHJldHVybkV4Y2VwdGlvbnM6IHRydWUgfVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8KEFNQ1Jlc3BvbnNlIHwgV2lraWRvdEVycm9yKVtdPjtcbiAgYW1jUmVxdWVzdChcbiAgICBib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10sXG4gICAgb3B0aW9ucz86IHsgcmV0dXJuRXhjZXB0aW9ucz86IGJvb2xlYW4gfVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2VbXT4gfCBXaWtpZG90UmVzdWx0QXN5bmM8KEFNQ1Jlc3BvbnNlIHwgV2lraWRvdEVycm9yKVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0V2l0aE9wdGlvbnMoYm9kaWVzLCB7XG4gICAgICBzaXRlTmFtZTogdGhpcy51bml4TmFtZSxcbiAgICAgIHNzbFN1cHBvcnRlZDogdGhpcy5zc2xTdXBwb3J0ZWQsXG4gICAgICByZXR1cm5FeGNlcHRpb25zOiBvcHRpb25zPy5yZXR1cm5FeGNlcHRpb25zID8/IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgQU1DIHJlcXVlc3Qgd2l0aCBwYXJ0aWFsIGZhaWx1cmUgdG9sZXJhbmNlLlxuICAgKiBSZXF1ZXN0cyBhcmUgc3BsaXQgaW50byBiYXRjaGVzIGFuZCBmYWlsZWQgcmVxdWVzdHMgYXJlIHJldHJpZWQuXG4gICAqIEBwYXJhbSBib2RpZXMgLSBSZXF1ZXN0IGJvZHkgYXJyYXlcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBiYXRjaCBzaXplIGFuZCBtYXggcmV0cmllc1xuICAgKiBAcmV0dXJucyBBTUMgcmVzcG9uc2UgYXJyYXkgKG51bGwgZm9yIHBlcm1hbmVudGx5IGZhaWxlZCByZXF1ZXN0cylcbiAgICovXG4gIGFtY1JlcXVlc3RXaXRoUmV0cnkoXG4gICAgYm9kaWVzOiBBTUNSZXF1ZXN0Qm9keVtdLFxuICAgIG9wdGlvbnM/OiB7IGJhdGNoU2l6ZT86IG51bWJlcjsgbWF4UmV0cmllcz86IG51bWJlciB9XG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzwoQU1DUmVzcG9uc2UgfCBudWxsKVtdPiB7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gb3B0aW9ucz8uYmF0Y2hTaXplID8/IHRoaXMuY2xpZW50LmFtY0NsaWVudC5jb25maWcucmV0cnlCYXRjaFNpemU7XG4gICAgY29uc3QgbWF4UmV0cmllcyA9IG9wdGlvbnM/Lm1heFJldHJpZXMgPz8gdGhpcy5jbGllbnQuYW1jQ2xpZW50LmNvbmZpZy5yZXRyeU1heFJldHJpZXM7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoYmF0Y2hTaXplKSB8fCBiYXRjaFNpemUgPD0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBiYXRjaFNpemU6ICR7YmF0Y2hTaXplfS4gTXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFJldHJpZXMpIHx8IG1heFJldHJpZXMgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG1heFJldHJpZXM6ICR7bWF4UmV0cmllc30uIE11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFsbFJlc3VsdHM6IChBTUNSZXNwb25zZSB8IG51bGwpW10gPSBbXTtcblxuICAgICAgICBmb3IgKGxldCBiYXRjaFN0YXJ0ID0gMDsgYmF0Y2hTdGFydCA8IGJvZGllcy5sZW5ndGg7IGJhdGNoU3RhcnQgKz0gYmF0Y2hTaXplKSB7XG4gICAgICAgICAgY29uc3QgYmF0Y2ggPSBib2RpZXMuc2xpY2UoYmF0Y2hTdGFydCwgYmF0Y2hTdGFydCArIGJhdGNoU2l6ZSk7XG5cbiAgICAgICAgICBjb25zdCBpbml0aWFsUmVzdWx0ID0gYXdhaXQgdGhpcy5hbWNSZXF1ZXN0KGJhdGNoLCB7IHJldHVybkV4Y2VwdGlvbnM6IHRydWUgfSk7XG4gICAgICAgICAgaWYgKGluaXRpYWxSZXN1bHQuaXNFcnIoKSkgdGhyb3cgaW5pdGlhbFJlc3VsdC5lcnJvcjtcblxuICAgICAgICAgIGNvbnN0IGJhdGNoUmVzdWx0czogKEFNQ1Jlc3BvbnNlIHwgbnVsbClbXSA9IFtdO1xuICAgICAgICAgIGxldCBmYWlsZWRJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBbaSwgcmVzcE9yRXJyXSBvZiBpbml0aWFsUmVzdWx0LnZhbHVlLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgaWYgKHJlc3BPckVyciBpbnN0YW5jZW9mIFdpa2lkb3RFcnJvcikge1xuICAgICAgICAgICAgICBiYXRjaFJlc3VsdHMucHVzaChudWxsKTtcbiAgICAgICAgICAgICAgZmFpbGVkSW5kaWNlcy5wdXNoKGkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYmF0Y2hSZXN1bHRzLnB1c2gocmVzcE9yRXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IG1heFJldHJpZXMgJiYgZmFpbGVkSW5kaWNlcy5sZW5ndGggPiAwOyBhdHRlbXB0KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJldHJ5Qm9kaWVzID0gZmFpbGVkSW5kaWNlcy5tYXAoKGkpID0+IGJhdGNoW2ldISk7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgYGFtY1JlcXVlc3RXaXRoUmV0cnk6ICR7ZmFpbGVkSW5kaWNlcy5sZW5ndGh9LyR7YmF0Y2gubGVuZ3RofSByZXF1ZXN0cyBmYWlsZWQsIHJldHJ5aW5nIChhdHRlbXB0ICR7YXR0ZW1wdCArIDF9LyR7bWF4UmV0cmllc30pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHJldHJ5UmVzdWx0ID0gYXdhaXQgdGhpcy5hbWNSZXF1ZXN0KHJldHJ5Qm9kaWVzLCB7IHJldHVybkV4Y2VwdGlvbnM6IHRydWUgfSk7XG4gICAgICAgICAgICBpZiAocmV0cnlSZXN1bHQuaXNFcnIoKSkgYnJlYWs7XG5cbiAgICAgICAgICAgIGNvbnN0IHN0aWxsRmFpbGVkSW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZmFpbGVkSW5kaWNlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICBjb25zdCByZXRyeVJlc3AgPSByZXRyeVJlc3VsdC52YWx1ZVtqXTtcbiAgICAgICAgICAgICAgaWYgKHJldHJ5UmVzcCAmJiAhKHJldHJ5UmVzcCBpbnN0YW5jZW9mIFdpa2lkb3RFcnJvcikpIHtcbiAgICAgICAgICAgICAgICBiYXRjaFJlc3VsdHNbZmFpbGVkSW5kaWNlc1tqXSFdID0gcmV0cnlSZXNwO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0aWxsRmFpbGVkSW5kaWNlcy5wdXNoKGZhaWxlZEluZGljZXNbal0hKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmFpbGVkSW5kaWNlcyA9IHN0aWxsRmFpbGVkSW5kaWNlcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhbGxSZXN1bHRzLnB1c2goLi4uYmF0Y2hSZXN1bHRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZhaWxlZENvdW50ID0gYWxsUmVzdWx0cy5maWx0ZXIoKHIpID0+IHIgPT09IG51bGwpLmxlbmd0aDtcbiAgICAgICAgaWYgKGZhaWxlZENvdW50ID4gMCkge1xuICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgYGFtY1JlcXVlc3RXaXRoUmV0cnk6ICR7YWxsUmVzdWx0cy5sZW5ndGggLSBmYWlsZWRDb3VudH0vJHthbGxSZXN1bHRzLmxlbmd0aH0gc3VjY2VlZGVkICgke2ZhaWxlZENvdW50fSBmYWlsZWQpYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWxsUmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBBTUMgcmVxdWVzdCB3aXRoIHJldHJ5IGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHNpbmdsZSBBTUMgcmVxdWVzdFxuICAgKiBAcGFyYW0gYm9keSAtIFJlcXVlc3QgYm9keVxuICAgKiBAcmV0dXJucyBBTUMgcmVzcG9uc2VcbiAgICovXG4gIGFtY1JlcXVlc3RTaW5nbGUoYm9keTogQU1DUmVxdWVzdEJvZHkpOiBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFtY1JlcXVlc3QoW2JvZHldKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignQU1DIHJlcXVlc3QgcmV0dXJuZWQgZW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVuZXhwZWN0ZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgQU1DIHJlcXVlc3QgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2l0ZSBmcm9tIFVOSVggbmFtZVxuICAgKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50XG4gICAqIEBwYXJhbSB1bml4TmFtZSAtIFNpdGUgVU5JWCBuYW1lIChlLmcuLCAnc2NwLWpwJylcbiAgICogQHJldHVybnMgU2l0ZVxuICAgKi9cbiAgc3RhdGljIGZyb21Vbml4TmFtZShjbGllbnQ6IENsaWVudCwgdW5peE5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gRmV0Y2ggc2l0ZSBwYWdlIChIVFRQIHJlcXVlc3QsIGZvbGxvd2luZyByZWRpcmVjdHMsIHdpdGggcmV0cnkpXG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwOi8vJHt1bml4TmFtZX0ud2lraWRvdC5jb21gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoV2l0aFJldHJ5KHVybCwgY2xpZW50LmFtY0NsaWVudC5jb25maWcsIHtcbiAgICAgICAgICBoZWFkZXJzOiBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgICAgY2hlY2tPazogZmFsc2UsIC8vIEhhbmRsZSBIVFRQIGVycm9ycyBtYW51YWxseSBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgU2l0ZSBub3QgZm91bmQ6ICR7dW5peE5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBmZXRjaCBzaXRlOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgLy8gUGFyc2UgV0lLSVJFUVVFU1QuaW5mb1xuICAgICAgICBjb25zdCBzY3JpcHRzID0gJCgnc2NyaXB0JykudG9BcnJheSgpO1xuICAgICAgICBsZXQgc2l0ZUlkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IHNpdGVVbml4TmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBkb21haW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgdGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2NyaXB0IG9mIHNjcmlwdHMpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gJChzY3JpcHQpLmh0bWwoKTtcbiAgICAgICAgICBpZiAoIWNvbnRlbnQ/LmluY2x1ZGVzKCdXSUtJUkVRVUVTVCcpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaXRlSWRcbiAgICAgICAgICBjb25zdCBzaXRlSWRNYXRjaCA9IGNvbnRlbnQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLnNpdGVJZFxccyo9XFxzKihcXGQrKS8pO1xuICAgICAgICAgIGlmIChzaXRlSWRNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBzaXRlSWQgPSBOdW1iZXIucGFyc2VJbnQoc2l0ZUlkTWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzaXRlVW5peE5hbWVcbiAgICAgICAgICBjb25zdCBzaXRlVW5peE5hbWVNYXRjaCA9IGNvbnRlbnQubWF0Y2goXG4gICAgICAgICAgICAvV0lLSVJFUVVFU1RcXC5pbmZvXFwuc2l0ZVVuaXhOYW1lXFxzKj1cXHMqW1wiJ10oW15cIiddKylbXCInXS9cbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzaXRlVW5peE5hbWVNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICBzaXRlVW5peE5hbWUgPSBzaXRlVW5peE5hbWVNYXRjaFsxXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBkb21haW5cbiAgICAgICAgICBjb25zdCBkb21haW5NYXRjaCA9IGNvbnRlbnQubWF0Y2goL1dJS0lSRVFVRVNUXFwuaW5mb1xcLmRvbWFpblxccyo9XFxzKltcIiddKFteXCInXSspW1wiJ10vKTtcbiAgICAgICAgICBpZiAoZG9tYWluTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgZG9tYWluID0gZG9tYWluTWF0Y2hbMV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGl0bGUgZnJvbSA8dGl0bGU+IHRhZ1xuICAgICAgICB0aXRsZSA9ICQoJ3RpdGxlJykudGV4dCgpLnRyaW0oKSB8fCBudWxsO1xuICAgICAgICAvLyBSZW1vdmUgXCIgLSBXaWtpZG90XCIgc3VmZml4IGlmIHByZXNlbnRcbiAgICAgICAgaWYgKHRpdGxlPy5lbmRzV2l0aCgnIC0gV2lraWRvdCcpKSB7XG4gICAgICAgICAgdGl0bGUgPSB0aXRsZS5zbGljZSgwLCAtMTApLnRyaW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzaXRlSWQgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1NpdGUgSUQgbm90IGZvdW5kIGluIFdJS0lSRVFVRVNUJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpdGVVbml4TmFtZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHNpdGVVbml4TmFtZSA9IHVuaXhOYW1lOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG4gICAgICAgIGlmIChkb21haW4gPT09IG51bGwpIHtcbiAgICAgICAgICBkb21haW4gPSBgJHt1bml4TmFtZX0ud2lraWRvdC5jb21gOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aXRsZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRpdGxlID0gdW5peE5hbWU7IC8vIEZhbGxiYWNrXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBTU0wgc3VwcG9ydCAoYmFzZWQgb24gd2hldGhlciB0aGUgcmVkaXJlY3QgVVJMIHN0YXJ0cyB3aXRoIGh0dHBzKVxuICAgICAgICBjb25zdCBzc2xTdXBwb3J0ZWQgPSByZXNwb25zZS51cmwuc3RhcnRzV2l0aCgnaHR0cHMnKTtcblxuICAgICAgICByZXR1cm4gbmV3IFNpdGUoY2xpZW50LCB7XG4gICAgICAgICAgaWQ6IHNpdGVJZCxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICB1bml4TmFtZTogc2l0ZVVuaXhOYW1lLFxuICAgICAgICAgIGRvbWFpbixcbiAgICAgICAgICBzc2xTdXBwb3J0ZWQsXG4gICAgICAgIH0pO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbiB8fCBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHNpdGU6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFNpdGUoaWQ9JHt0aGlzLmlkfSwgdW5peE5hbWU9JHt0aGlzLnVuaXhOYW1lfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IFNpdGUgfSBmcm9tICcuLi8uLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiBTaXRlIG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIGJ5IFVOSVggbmFtZVxuICAgKlxuICAgKiBAcGFyYW0gdW5peE5hbWUgLSBTaXRlIFVOSVggbmFtZSAoZS5nLiwgJ3NjcC1qcCcpXG4gICAqIEByZXR1cm5zIFNpdGUgb2JqZWN0IHdyYXBwZWQgaW4gUmVzdWx0IHR5cGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzaXRlUmVzdWx0ID0gYXdhaXQgY2xpZW50LnNpdGUuZ2V0KCdzY3AtanAnKTtcbiAgICogaWYgKCFzaXRlUmVzdWx0LmlzT2soKSkge1xuICAgKiAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBzaXRlJyk7XG4gICAqIH1cbiAgICogY29uc3Qgc2l0ZSA9IHNpdGVSZXN1bHQudmFsdWU7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0KHVuaXhOYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZT4ge1xuICAgIHJldHVybiBTaXRlLmZyb21Vbml4TmFtZSh0aGlzLmNsaWVudCwgdW5peE5hbWUpO1xuICB9XG59XG5cbmV4cG9ydCB7IFNpdGUgfTtcbiIsCiAgICAiaW1wb3J0IHsgTm90Rm91bmRFeGNlcHRpb24gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLCB3ZEVyckFzeW5jLCB3ZE9rQXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgVXNlciwgdHlwZSBVc2VyQ29sbGVjdGlvbiB9IGZyb20gJy4uLy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuXG4vKipcbiAqIFVzZXIgcmV0cmlldmFsIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRVc2VyT3B0aW9ucyB7XG4gIC8qKiBUaHJvdyBlcnJvciBpZiB1c2VyIG5vdCBmb3VuZCAoZGVmYXVsdDogZmFsc2UpICovXG4gIHJhaXNlV2hlbk5vdEZvdW5kPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBVc2VyIG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VyIGJ5IHVzZXJuYW1lXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVXNlcm5hbWVcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBSZXRyaWV2YWwgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBVc2VyIHdyYXBwZWQgaW4gUmVzdWx0IHR5cGUgKG51bGwgaWYgbm90IGZvdW5kLCBlcnJvciBpZiByYWlzZVdoZW5Ob3RGb3VuZCBpcyB0cnVlKVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVzZXJSZXN1bHQgPSBhd2FpdCBjbGllbnQudXNlci5nZXQoJ3VzZXJuYW1lJyk7XG4gICAqIGlmICghdXNlclJlc3VsdC5pc09rKCkpIHtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgdXNlcicpO1xuICAgKiB9XG4gICAqIGNvbnN0IHVzZXIgPSB1c2VyUmVzdWx0LnZhbHVlO1xuICAgKiBgYGBcbiAgICovXG4gIGdldChuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEdldFVzZXJPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlciB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJhaXNlV2hlbk5vdEZvdW5kID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gVXNlci5mcm9tTmFtZSh0aGlzLmNsaWVudCwgbmFtZSkuYW5kVGhlbigodXNlcikgPT4ge1xuICAgICAgaWYgKHVzZXIgPT09IG51bGwgJiYgcmFpc2VXaGVuTm90Rm91bmQpIHtcbiAgICAgICAgcmV0dXJuIHdkRXJyQXN5bmMobmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBVc2VyIG5vdCBmb3VuZDogJHtuYW1lfWApKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3ZE9rQXN5bmModXNlcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHVzZXJzIGZyb20gbXVsdGlwbGUgdXNlcm5hbWVzXG4gICAqIEBwYXJhbSBuYW1lcyAtIEFycmF5IG9mIHVzZXJuYW1lc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJldHJpZXZhbCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFVzZXIgY29sbGVjdGlvbiAobnVsbCBmb3Igbm9uLWV4aXN0ZW50IHVzZXJzLCBlcnJvciBpZiByYWlzZVdoZW5Ob3RGb3VuZCBpcyB0cnVlKVxuICAgKi9cbiAgZ2V0TWFueShuYW1lczogc3RyaW5nW10sIG9wdGlvbnM6IEdldFVzZXJPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8VXNlckNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCB7IHJhaXNlV2hlbk5vdEZvdW5kID0gZmFsc2UgfSA9IG9wdGlvbnM7XG5cbiAgICByZXR1cm4gVXNlci5mcm9tTmFtZXModGhpcy5jbGllbnQsIG5hbWVzKS5hbmRUaGVuKChjb2xsZWN0aW9uKSA9PiB7XG4gICAgICBpZiAocmFpc2VXaGVuTm90Rm91bmQpIHtcbiAgICAgICAgY29uc3Qgbm90Rm91bmROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lc1tpXTtcbiAgICAgICAgICBpZiAoY29sbGVjdGlvbltpXSA9PT0gbnVsbCAmJiBuYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5vdEZvdW5kTmFtZXMucHVzaChuYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vdEZvdW5kTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVXNlcnMgbm90IGZvdW5kOiAke25vdEZvdW5kTmFtZXMuam9pbignLCAnKX1gKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB3ZE9rQXN5bmMoY29sbGVjdGlvbik7XG4gICAgfSk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQge1xuICBmcm9tUHJvbWlzZSxcbiAgdHlwZSBXaWtpZG90UmVzdWx0LFxuICB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyxcbiAgd2RFcnIsXG4gIHdkT2ssXG4gIHdkT2tBc3luYyxcbn0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IEFNQ0NsaWVudCwgdHlwZSBBTUNDb25maWcsIGxvZ2luLCBsb2dvdXQgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uL3VzZXIvdXNlcic7XG5pbXBvcnQgeyBQcml2YXRlTWVzc2FnZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvcG0tYWNjZXNzb3InO1xuaW1wb3J0IHsgU2l0ZUFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvc2l0ZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBVc2VyQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy91c2VyLWFjY2Vzc29yJztcblxuLyoqXG4gKiBDbGllbnQgY3JlYXRpb24gb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudE9wdGlvbnMge1xuICAvKiogV2lraWRvdCB1c2VybmFtZSAqL1xuICB1c2VybmFtZT86IHN0cmluZztcblxuICAvKiogV2lraWRvdCBwYXNzd29yZCAqL1xuICBwYXNzd29yZD86IHN0cmluZztcblxuICAvKiogQmFzZSBkb21haW4gKGRlZmF1bHQ6IHdpa2lkb3QuY29tKSAqL1xuICBkb21haW4/OiBzdHJpbmc7XG5cbiAgLyoqIEFNQyBjb25maWd1cmF0aW9uIG92ZXJyaWRlICovXG4gIGFtY0NvbmZpZz86IFBhcnRpYWw8QU1DQ29uZmlnPjtcbn1cblxuLyoqXG4gKiBXaWtpZG90IGNsaWVudFxuICogTWFpbiBlbnRyeSBwb2ludCBvZiB0aGUgbGlicmFyeVxuICovXG5leHBvcnQgY2xhc3MgQ2xpZW50IHtcbiAgLyoqIEFNQyBjbGllbnQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFtY0NsaWVudDogQU1DQ2xpZW50O1xuXG4gIC8qKiBCYXNlIGRvbWFpbiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZG9tYWluOiBzdHJpbmc7XG5cbiAgLyoqIFVzZXIgb3BlcmF0aW9ucyBhY2Nlc3NvciAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcjogVXNlckFjY2Vzc29yO1xuXG4gIC8qKiBTaXRlIG9wZXJhdGlvbnMgYWNjZXNzb3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGVBY2Nlc3NvcjtcblxuICAvKiogUHJpdmF0ZSBtZXNzYWdlIG9wZXJhdGlvbnMgYWNjZXNzb3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IHByaXZhdGVNZXNzYWdlOiBQcml2YXRlTWVzc2FnZUFjY2Vzc29yO1xuXG4gIC8qKiBVc2VybmFtZSBvZiB0aGUgbG9nZ2VkLWluIHVzZXIgKi9cbiAgcHJpdmF0ZSBfdXNlcm5hbWU6IHN0cmluZyB8IG51bGw7XG5cbiAgLyoqIExvZ2dlZC1pbiB1c2VyICovXG4gIHByaXZhdGUgX21lOiBVc2VyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgY29uc3RydWN0b3JcbiAgICogVXNlIHRoZSBjcmVhdGUgbWV0aG9kIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihhbWNDbGllbnQ6IEFNQ0NsaWVudCwgZG9tYWluOiBzdHJpbmcsIHVzZXJuYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbCkge1xuICAgIHRoaXMuYW1jQ2xpZW50ID0gYW1jQ2xpZW50O1xuICAgIHRoaXMuZG9tYWluID0gZG9tYWluO1xuICAgIHRoaXMuX3VzZXJuYW1lID0gdXNlcm5hbWU7XG5cbiAgICAvLyBJbml0aWFsaXplIGFjY2Vzc29yc1xuICAgIHRoaXMudXNlciA9IG5ldyBVc2VyQWNjZXNzb3IodGhpcyk7XG4gICAgdGhpcy5zaXRlID0gbmV3IFNpdGVBY2Nlc3Nvcih0aGlzKTtcbiAgICB0aGlzLnByaXZhdGVNZXNzYWdlID0gbmV3IFByaXZhdGVNZXNzYWdlQWNjZXNzb3IodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB1c2VybmFtZSBvZiB0aGUgbG9nZ2VkLWluIHVzZXJcbiAgICovXG4gIGdldCB1c2VybmFtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb2dnZWQtaW4gdXNlclxuICAgKiBSZXR1cm5zIG51bGwgaWYgbm90IGxvZ2dlZCBpblxuICAgKi9cbiAgZ2V0IG1lKCk6IFVzZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fbWU7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgY2xpZW50XG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ2xpZW50IG9wdGlvbnNcbiAgICogQHJldHVybnMgQ2xpZW50IGluc3RhbmNlIHdyYXBwZWQgaW4gUmVzdWx0IHR5cGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBDbGllbnQgfSBmcm9tICdAdWt3aGF0bi93aWtpZG90JztcbiAgICpcbiAgICogLy8gQ3JlYXRlIGEgY2xpZW50XG4gICAqIGNvbnN0IGNsaWVudFJlc3VsdCA9IGF3YWl0IENsaWVudC5jcmVhdGUoe1xuICAgKiAgIHVzZXJuYW1lOiAneW91cl91c2VybmFtZScsXG4gICAqICAgcGFzc3dvcmQ6ICd5b3VyX3Bhc3N3b3JkJyxcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIFJlc3VsdCB0eXBlIHJlcXVpcmVzIGlzT2soKSBjaGVjayBiZWZvcmUgYWNjZXNzaW5nIC52YWx1ZVxuICAgKiBpZiAoIWNsaWVudFJlc3VsdC5pc09rKCkpIHtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBjcmVhdGUgY2xpZW50Jyk7XG4gICAqIH1cbiAgICogY29uc3QgY2xpZW50ID0gY2xpZW50UmVzdWx0LnZhbHVlO1xuICAgKlxuICAgKiAvLyBOb3cgeW91IGNhbiBhY2Nlc3MgY2xpZW50LnNpdGUsIGV0Yy5cbiAgICogY29uc3Qgc2l0ZVJlc3VsdCA9IGF3YWl0IGNsaWVudC5zaXRlLmdldCgnc2NwLWpwJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZShvcHRpb25zOiBDbGllbnRPcHRpb25zID0ge30pOiBXaWtpZG90UmVzdWx0QXN5bmM8Q2xpZW50PiB7XG4gICAgY29uc3QgeyB1c2VybmFtZSwgcGFzc3dvcmQsIGRvbWFpbiA9ICd3aWtpZG90LmNvbScsIGFtY0NvbmZpZyA9IHt9IH0gPSBvcHRpb25zO1xuXG4gICAgLy8gQ3JlYXRlIEFNQyBjbGllbnRcbiAgICBjb25zdCBhbWNDbGllbnQgPSBuZXcgQU1DQ2xpZW50KGFtY0NvbmZpZywgZG9tYWluKTtcblxuICAgIC8vIExvZ2luIGlmIGNyZWRlbnRpYWxzIGFyZSBwcm92aWRlZFxuICAgIGlmICh1c2VybmFtZSAmJiBwYXNzd29yZCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNsaWVudCA9IG5ldyBDbGllbnQoYW1jQ2xpZW50LCBkb21haW4sIHVzZXJuYW1lKTtcbiAgICAgICAgICBjb25zdCBsb2dpblJlc3VsdCA9IGF3YWl0IGxvZ2luKGNsaWVudCwgdXNlcm5hbWUsIHBhc3N3b3JkKTtcbiAgICAgICAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgbG9naW5SZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gR2V0IGxvZ2dlZC1pbiB1c2VyIGluZm9ybWF0aW9uXG4gICAgICAgICAgY29uc3QgdXNlclJlc3VsdCA9IGF3YWl0IFVzZXIuZnJvbU5hbWUoY2xpZW50LCB1c2VybmFtZSk7XG4gICAgICAgICAgaWYgKHVzZXJSZXN1bHQuaXNPaygpICYmIHVzZXJSZXN1bHQudmFsdWUpIHtcbiAgICAgICAgICAgIGNsaWVudC5fbWUgPSB1c2VyUmVzdWx0LnZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjbGllbnQ7XG4gICAgICAgIH0pKCksXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBjbGllbnQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdW5hdXRoZW50aWNhdGVkIGNsaWVudFxuICAgIHJldHVybiB3ZE9rQXN5bmMobmV3IENsaWVudChhbWNDbGllbnQsIGRvbWFpbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiB1bmF1dGhlbnRpY2F0ZWQgY2xpZW50XG4gICAqIEBwYXJhbSBvcHRpb25zIC0gQ2xpZW50IG9wdGlvbnMgKGV4Y2x1ZGluZyBjcmVkZW50aWFscylcbiAgICogQHJldHVybnMgQ2xpZW50IGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlQW5vbnltb3VzKG9wdGlvbnM6IE9taXQ8Q2xpZW50T3B0aW9ucywgJ3VzZXJuYW1lJyB8ICdwYXNzd29yZCc+ID0ge30pOiBDbGllbnQge1xuICAgIGNvbnN0IHsgZG9tYWluID0gJ3dpa2lkb3QuY29tJywgYW1jQ29uZmlnID0ge30gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYW1jQ2xpZW50ID0gbmV3IEFNQ0NsaWVudChhbWNDb25maWcsIGRvbWFpbik7XG4gICAgcmV0dXJuIG5ldyBDbGllbnQoYW1jQ2xpZW50LCBkb21haW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGxvZ2luIHN0YXR1c1xuICAgKiBAcmV0dXJucyB0cnVlIGlmIGxvZ2dlZCBpblxuICAgKi9cbiAgaXNMb2dnZWRJbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcm5hbWUgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWlyZSBsb2dpblxuICAgKiBSZXR1cm5zIExvZ2luUmVxdWlyZWRFcnJvciBpZiBub3QgbG9nZ2VkIGluXG4gICAqIEByZXR1cm5zIHZvaWQgb24gc3VjY2Vzc1xuICAgKi9cbiAgcmVxdWlyZUxvZ2luKCk6IFdpa2lkb3RSZXN1bHQ8dm9pZD4ge1xuICAgIGlmICghdGhpcy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHJldHVybiB3ZEVycihuZXcgTG9naW5SZXF1aXJlZEVycm9yKCkpO1xuICAgIH1cbiAgICByZXR1cm4gd2RPayh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBjbGllbnRcbiAgICogQXR0ZW1wdHMgdG8gbG9nb3V0IGlmIGEgc2Vzc2lvbiBleGlzdHNcbiAgICovXG4gIGNsb3NlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNMb2dnZWRJbigpKSB7XG4gICAgICByZXR1cm4gbG9nb3V0KHRoaXMpLm1hcCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX3VzZXJuYW1lID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd2RPa0FzeW5jKHVuZGVmaW5lZCk7XG4gIH1cbn1cbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9jbGllbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9mb3J1bSc7XG5leHBvcnQgKiBmcm9tICcuL3BhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9wcml2YXRlLW1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zaXRlJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi91c2VyJztcbiIsCiAgICAiZXhwb3J0ICogZnJvbSAnLi9wYXJzZXInO1xuZXhwb3J0ICogZnJvbSAnLi9xdWljay1tb2R1bGUnO1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFJc0IsY0FrQlQ7QUFBQTtBQUFBLEVBbEJTLGVBQWYsTUFBZSxxQkFBcUIsTUFBTTtBQUFBLElBRXRCO0FBQUEsSUFLekIsV0FBVyxD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QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7QUFBQSxJQUNWLEtBQVU7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TUFBTSxDQUFDO0FBQUE7QUFBQSxTQVF6QyxlQUFlLENBQUMsVUFBd0QsQ0FBQyxHQUFXO0FBQUEsSUFDekYsUUFBUSxTQUFTLGVBQWUsWUFBWSxDQUFDLE1BQU07QUFBQSxJQUNuRCxNQUFNLFlBQVksSUFBSSxVQUFVLFdBQVcsTUFBTTtBQUFBLElBQ2pELE9BQU8sSUFBSSxPQUFPLFdBQVcsTUFBTTtBQUFBO0FBQUEsRUFPckMsVUFBVSxHQUFZO0FBQUEsSUFDcEIsT0FBTyxLQUFLLGNBQWM7QUFBQTtBQUFBLEVBUTVCLFlBQVksR0FBd0I7QUFBQSxJQUNsQyxJQUFJLENBQUMsS0FBSyxXQUFXLEdBQUc7QUFBQSxNQUN0QixPQUFPLE1BQU0sSUFBSSxrQkFBb0I7QUFBQSxJQUN2QztBQUFBLElBQ0EsT0FBTyxLQUFLLFNBQVM7QUFBQTtBQUFBLEVBT3ZCLEtBQUssR0FBNkI7QUFBQSxJQUNoQyxJQUFJLEtBQUssV0FBVyxHQUFHO0FBQUEsTUFDckIsT0FBTyxPQUFPLElBQUksRUFBRSxJQUFJLE1BQU07QUFBQSxRQUM1QixLQUFLLFlBQVk7QUFBQSxRQUNqQjtBQUFBLE9BQ0Q7QUFBQSxJQUNIO0FBQUEsSUFDQSxPQUFPLFVBQVUsU0FBUztBQUFBO0FBRTlCOztBQ2xNQTtBQUtBOztBQ05BOyIsCiAgImRlYnVnSWQiOiAiNkVDNzM4ODNFQzBGNkIwRTY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
|