@ukwhatn/wikidot 4.2.1 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +50 -21
- package/dist/index.d.cts +17 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +50 -21
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1370,32 +1370,25 @@ var init_forum_post = __esm(() => {
|
|
|
1370
1370
|
get parentId() {
|
|
1371
1371
|
return this._parentId;
|
|
1372
1372
|
}
|
|
1373
|
+
get source() {
|
|
1374
|
+
return this._source;
|
|
1375
|
+
}
|
|
1376
|
+
set source(value) {
|
|
1377
|
+
this._source = value;
|
|
1378
|
+
}
|
|
1373
1379
|
getSource() {
|
|
1374
|
-
if (this.
|
|
1375
|
-
return fromPromise(Promise.resolve(this.
|
|
1380
|
+
if (this.source !== null) {
|
|
1381
|
+
return fromPromise(Promise.resolve(this.source), (e) => new UnexpectedError(String(e)));
|
|
1376
1382
|
}
|
|
1377
1383
|
return fromPromise((async () => {
|
|
1378
|
-
const result2 = await this.thread
|
|
1379
|
-
{
|
|
1380
|
-
moduleName: "forum/sub/ForumEditPostFormModule",
|
|
1381
|
-
threadId: this.thread.id,
|
|
1382
|
-
postId: this.id
|
|
1383
|
-
}
|
|
1384
|
-
]);
|
|
1384
|
+
const result2 = await ForumPostCollection.acquirePostSources(this.thread, [this]);
|
|
1385
1385
|
if (result2.isErr()) {
|
|
1386
1386
|
throw result2.error;
|
|
1387
1387
|
}
|
|
1388
|
-
|
|
1389
|
-
if (!response) {
|
|
1390
|
-
throw new NoElementError("Empty response");
|
|
1391
|
-
}
|
|
1392
|
-
const $ = cheerio4.load(String(response.body ?? ""));
|
|
1393
|
-
const sourceElem = $("textarea[name='source']");
|
|
1394
|
-
if (sourceElem.length === 0) {
|
|
1388
|
+
if (this.source === null) {
|
|
1395
1389
|
throw new NoElementError("Source textarea not found");
|
|
1396
1390
|
}
|
|
1397
|
-
this.
|
|
1398
|
-
return this._source;
|
|
1391
|
+
return this.source;
|
|
1399
1392
|
})(), (error) => {
|
|
1400
1393
|
if (error instanceof NoElementError)
|
|
1401
1394
|
return error;
|
|
@@ -1445,7 +1438,7 @@ var init_forum_post = __esm(() => {
|
|
|
1445
1438
|
if (title !== undefined) {
|
|
1446
1439
|
this.title = title;
|
|
1447
1440
|
}
|
|
1448
|
-
this.
|
|
1441
|
+
this.source = source;
|
|
1449
1442
|
})(), (error) => {
|
|
1450
1443
|
if (error instanceof NoElementError || error instanceof LoginRequiredError) {
|
|
1451
1444
|
return error;
|
|
@@ -1692,6 +1685,42 @@ var init_forum_post = __esm(() => {
|
|
|
1692
1685
|
return new UnexpectedError(`Failed to acquire posts: ${String(error)}`);
|
|
1693
1686
|
});
|
|
1694
1687
|
}
|
|
1688
|
+
static acquirePostSources(thread, posts) {
|
|
1689
|
+
return fromPromise((async () => {
|
|
1690
|
+
const targetPosts = posts.filter((post) => post.source === null);
|
|
1691
|
+
if (targetPosts.length === 0) {
|
|
1692
|
+
return new ForumPostCollection(thread, posts);
|
|
1693
|
+
}
|
|
1694
|
+
const result2 = await thread.site.amcRequest(targetPosts.map((post) => ({
|
|
1695
|
+
moduleName: "forum/sub/ForumEditPostFormModule",
|
|
1696
|
+
threadId: thread.id,
|
|
1697
|
+
postId: post.id
|
|
1698
|
+
})));
|
|
1699
|
+
if (result2.isErr()) {
|
|
1700
|
+
throw result2.error;
|
|
1701
|
+
}
|
|
1702
|
+
for (let i = 0;i < targetPosts.length; i++) {
|
|
1703
|
+
const post = targetPosts[i];
|
|
1704
|
+
const response = result2.value[i];
|
|
1705
|
+
if (!post || !response)
|
|
1706
|
+
continue;
|
|
1707
|
+
const $ = cheerio4.load(String(response.body ?? ""));
|
|
1708
|
+
const sourceElem = $("textarea[name='source']");
|
|
1709
|
+
if (sourceElem.length === 0) {
|
|
1710
|
+
throw new NoElementError(`Source textarea not found for post: ${post.id}`);
|
|
1711
|
+
}
|
|
1712
|
+
post.source = sourceElem.text();
|
|
1713
|
+
}
|
|
1714
|
+
return new ForumPostCollection(thread, posts);
|
|
1715
|
+
})(), (error) => {
|
|
1716
|
+
if (error instanceof NoElementError)
|
|
1717
|
+
return error;
|
|
1718
|
+
return new UnexpectedError(`Failed to acquire post sources: ${String(error)}`);
|
|
1719
|
+
});
|
|
1720
|
+
}
|
|
1721
|
+
getPostSources() {
|
|
1722
|
+
return ForumPostCollection.acquirePostSources(this.thread, Array.from(this));
|
|
1723
|
+
}
|
|
1695
1724
|
};
|
|
1696
1725
|
});
|
|
1697
1726
|
|
|
@@ -5076,5 +5105,5 @@ export {
|
|
|
5076
5105
|
AMCClient
|
|
5077
5106
|
};
|
|
5078
5107
|
|
|
5079
|
-
//# debugId=
|
|
5080
|
-
//# 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/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUGFyZW50IHBvc3QgSURcbiAgICovXG4gIGdldCBwYXJlbnRJZCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50SWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlIChXaWtpZG90IHN5bnRheClcbiAgICovXG4gIGdldFNvdXJjZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuX3NvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFByb21pc2UucmVzb2x2ZSh0aGlzLl9zb3VyY2UpLCAoZSkgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihTdHJpbmcoZSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRocmVhZC5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9zdWIvRm9ydW1FZGl0UG9zdEZvcm1Nb2R1bGUnLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHRoaXMudGhyZWFkLmlkLFxuICAgICAgICAgICAgcG9zdElkOiB0aGlzLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJykpO1xuICAgICAgICBjb25zdCBzb3VyY2VFbGVtID0gJChcInRleHRhcmVhW25hbWU9J3NvdXJjZSddXCIpO1xuICAgICAgICBpZiAoc291cmNlRWxlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ1NvdXJjZSB0ZXh0YXJlYSBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zb3VyY2UgPSBzb3VyY2VFbGVtLnRleHQoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcG9zdCBzb3VyY2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXQgcG9zdFxuICAgKiBAcGFyYW0gc291cmNlIC0gTmV3IHNvdXJjZSAoV2lraWRvdCBzeW50YXgpXG4gICAqIEBwYXJhbSB0aXRsZSAtIE5ldyB0aXRsZSAoa2VlcHMgY3VycmVudCB0aXRsZSBpZiBvbWl0dGVkKVxuICAgKi9cbiAgQFJlcXVpcmVMb2dpblxuICBlZGl0KHNvdXJjZTogc3RyaW5nLCB0aXRsZT86IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgcmV2aXNpb24gSURcbiAgICAgICAgY29uc3QgZm9ybVJlc3VsdCA9IGF3YWl0IHRoaXMudGhyZWFkLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL3N1Yi9Gb3J1bUVkaXRQb3N0Rm9ybU1vZHVsZScsXG4gICAgICAgICAgICB0aHJlYWRJZDogdGhpcy50aHJlYWQuaWQsXG4gICAgICAgICAgICBwb3N0SWQ6IHRoaXMuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKGZvcm1SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZvcm1SZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb3JtUmVzcG9uc2UgPSBmb3JtUmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIWZvcm1SZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgZm9ybSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChTdHJpbmcoZm9ybVJlc3BvbnNlLmJvZHkgPz8gJycpKTtcbiAgICAgICAgY29uc3QgcmV2aXNpb25JbnB1dCA9ICQoXCJpbnB1dFtuYW1lPSdjdXJyZW50UmV2aXNpb25JZCddXCIpO1xuICAgICAgICBpZiAocmV2aXNpb25JbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0N1cnJlbnQgcmV2aXNpb24gSUQgaW5wdXQgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXZpc2lvblZhbHVlID0gcmV2aXNpb25JbnB1dC52YWwoKTtcbiAgICAgICAgY29uc3QgY3VycmVudFJldmlzaW9uSWQgPSBOdW1iZXIucGFyc2VJbnQoU3RyaW5nKHJldmlzaW9uVmFsdWUgPz8gJycpLCAxMCk7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4oY3VycmVudFJldmlzaW9uSWQpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdJbnZhbGlkIHJldmlzaW9uIElEIHZhbHVlJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTYXZlIGVkaXRcbiAgICAgICAgY29uc3QgZWRpdFJlc3VsdCA9IGF3YWl0IHRoaXMudGhyZWFkLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnRm9ydW1BY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdzYXZlRWRpdFBvc3QnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICAgIHBvc3RJZDogdGhpcy5pZCxcbiAgICAgICAgICAgIGN1cnJlbnRSZXZpc2lvbklkLFxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlID8/IHRoaXMudGl0bGUsXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKGVkaXRSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGVkaXRSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgbG9jYWwgc3RhdGVcbiAgICAgICAgaWYgKHRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc291cmNlID0gc291cmNlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGVkaXQgcG9zdDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgcG9zdCBoYXMgYmVlbiBlZGl0ZWQgKGhhcyByZXZpc2lvbnMpXG4gICAqL1xuICBnZXQgaGFzUmV2aXNpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVkaXRlZEJ5ICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwb3N0IHJldmlzaW9ucyAoZWRpdCBoaXN0b3J5KVxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRSZXZpc2lvbnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl9yZXZpc2lvbnMgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShQcm9taXNlLnJlc29sdmUodGhpcy5fcmV2aXNpb25zKSwgKGUpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoU3RyaW5nKGUpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uLmFjcXVpcmVBbGxGb3JQb3N0cyhbdGhpc10pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmV2aXNpb25zID0gcmVzdWx0LnZhbHVlLmdldCh0aGlzLmlkKSA/PyBuZXcgRm9ydW1Qb3N0UmV2aXNpb25Db2xsZWN0aW9uKHRoaXMsIFtdKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JldmlzaW9ucztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcmV2aXNpb25zOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBGb3J1bVBvc3QoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG5cbi8qKlxuICogRm9ydW0gcG9zdCBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVBvc3RDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1Qb3N0PiB7XG4gIHB1YmxpYyByZWFkb25seSB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmO1xuXG4gIGNvbnN0cnVjdG9yKHRocmVhZDogRm9ydW1UaHJlYWRSZWYsIHBvc3RzPzogRm9ydW1Qb3N0W10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGhyZWFkID0gdGhyZWFkO1xuICAgIGlmIChwb3N0cykge1xuICAgICAgdGhpcy5wdXNoKC4uLnBvc3RzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKiBAcGFyYW0gaWQgLSBQb3N0IElEXG4gICAqIEByZXR1cm5zIFBvc3QgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1Qb3N0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChwb3N0KSA9PiBwb3N0LmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgcG9zdHMgZnJvbSBIVE1MIChpbnRlcm5hbCBtZXRob2QpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfcGFyc2UodGhyZWFkOiBGb3J1bVRocmVhZFJlZiwgJDogQ2hlZXJpb0FQSSk6IEZvcnVtUG9zdFtdIHtcbiAgICBjb25zdCBwb3N0czogRm9ydW1Qb3N0W10gPSBbXTtcblxuICAgICQoJ2Rpdi5wb3N0JykuZWFjaCgoX2ksIHBvc3RFbGVtKSA9PiB7XG4gICAgICBjb25zdCAkcG9zdCA9ICQocG9zdEVsZW0pO1xuICAgICAgY29uc3QgcG9zdElkQXR0ciA9ICRwb3N0LmF0dHIoJ2lkJyk7XG4gICAgICBpZiAoIXBvc3RJZEF0dHIpIHJldHVybjtcblxuICAgICAgY29uc3QgcG9zdElkID0gTnVtYmVyLnBhcnNlSW50KHBvc3RJZEF0dHIucmVwbGFjZSgncG9zdC0nLCAnJyksIDEwKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4ocG9zdElkKSkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgcGFyZW50IHBvc3QgSURcbiAgICAgIGxldCBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCAkcGFyZW50Q29udGFpbmVyID0gJHBvc3QucGFyZW50KCk7XG4gICAgICBpZiAoJHBhcmVudENvbnRhaW5lci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0ICRncmFuZHBhcmVudCA9ICRwYXJlbnRDb250YWluZXIucGFyZW50KCk7XG4gICAgICAgIGlmICgkZ3JhbmRwYXJlbnQubGVuZ3RoID4gMCAmJiAkZ3JhbmRwYXJlbnRbMF0/Lm5hbWUgIT09ICdib2R5Jykge1xuICAgICAgICAgIGNvbnN0IGdyYW5kcGFyZW50Q2xhc3NlcyA9ICRncmFuZHBhcmVudC5hdHRyKCdjbGFzcycpID8/ICcnO1xuICAgICAgICAgIGlmIChncmFuZHBhcmVudENsYXNzZXMuaW5jbHVkZXMoJ3Bvc3QtY29udGFpbmVyJykpIHtcbiAgICAgICAgICAgIGNvbnN0ICRwYXJlbnRQb3N0ID0gJGdyYW5kcGFyZW50LmZpbmQoJz4gZGl2LnBvc3QnKTtcbiAgICAgICAgICAgIGlmICgkcGFyZW50UG9zdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBvc3RJZEF0dHIgPSAkcGFyZW50UG9zdC5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgICBpZiAocGFyZW50UG9zdElkQXR0cikge1xuICAgICAgICAgICAgICAgIHBhcmVudElkID0gTnVtYmVyLnBhcnNlSW50KHBhcmVudFBvc3RJZEF0dHIucmVwbGFjZSgncG9zdC0nLCAnJyksIDEwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGl0bGUgYW5kIGNvbnRlbnRcbiAgICAgIGNvbnN0ICR3cmFwcGVyID0gJHBvc3QuZmluZCgnZGl2LmxvbmcnKTtcbiAgICAgIGlmICgkd3JhcHBlci5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgJGhlYWQgPSAkd3JhcHBlci5maW5kKCdkaXYuaGVhZCcpO1xuICAgICAgaWYgKCRoZWFkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCAkdGl0bGUgPSAkaGVhZC5maW5kKCdkaXYudGl0bGUnKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gJHRpdGxlLnRleHQoKS50cmltKCk7XG5cbiAgICAgIGNvbnN0ICRjb250ZW50ID0gJHdyYXBwZXIuZmluZCgnZGl2LmNvbnRlbnQnKTtcbiAgICAgIGNvbnN0IHRleHQgPSAkY29udGVudC5odG1sKCkgPz8gJyc7XG5cbiAgICAgIC8vIEF1dGhvciBhbmQgdGltZXN0YW1wXG4gICAgICBjb25zdCAkaW5mbyA9ICRoZWFkLmZpbmQoJ2Rpdi5pbmZvJyk7XG4gICAgICBpZiAoJGluZm8ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0ICR1c2VyRWxlbSA9ICRpbmZvLmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICBpZiAoJHVzZXJFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBjcmVhdGVkQnkgPSBwYXJzZVVzZXIodGhyZWFkLnNpdGUuY2xpZW50IGFzIENsaWVudCwgJHVzZXJFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuXG4gICAgICBjb25zdCAkb2RhdGVFbGVtID0gJGluZm8uZmluZCgnc3Bhbi5vZGF0ZScpO1xuICAgICAgaWYgKCRvZGF0ZUVsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHBhcnNlT2RhdGUoJG9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgICAvLyBFZGl0IGluZm8gKGlmIGV4aXN0cylcbiAgICAgIGxldCBlZGl0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgZWRpdGVkQXQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0ICRjaGFuZ2VzID0gJHdyYXBwZXIuZmluZCgnZGl2LmNoYW5nZXMnKTtcbiAgICAgIGlmICgkY2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0ICRlZGl0VXNlckVsZW0gPSAkY2hhbmdlcy5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICBjb25zdCAkZWRpdE9kYXRlRWxlbSA9ICRjaGFuZ2VzLmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgICAgaWYgKCRlZGl0VXNlckVsZW0ubGVuZ3RoID4gMCAmJiAkZWRpdE9kYXRlRWxlbS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZWRpdGVkQnkgPSBwYXJzZVVzZXIodGhyZWFkLnNpdGUuY2xpZW50IGFzIENsaWVudCwgJGVkaXRVc2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcbiAgICAgICAgICBlZGl0ZWRBdCA9IHBhcnNlT2RhdGUoJGVkaXRPZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcG9zdHMucHVzaChcbiAgICAgICAgbmV3IEZvcnVtUG9zdCh7XG4gICAgICAgICAgdGhyZWFkLFxuICAgICAgICAgIGlkOiBwb3N0SWQsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICBlbGVtZW50OiBwb3N0RWxlbSBhcyBFbGVtZW50LFxuICAgICAgICAgIGNyZWF0ZWRCeSxcbiAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgZWRpdGVkQnksXG4gICAgICAgICAgZWRpdGVkQXQsXG4gICAgICAgICAgcGFyZW50SWQsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBvc3RzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcG9zdHMgaW4gYSB0aHJlYWRcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsSW5UaHJlYWQodGhyZWFkOiBGb3J1bVRocmVhZFJlZik6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVBvc3RDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9zdHM6IEZvcnVtUG9zdFtdID0gW107XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXN1bHQgPSBhd2FpdCB0aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3VGhyZWFkUG9zdHNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZU5vOiAnMScsXG4gICAgICAgICAgICB0OiBTdHJpbmcodGhyZWFkLmlkKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoZmlyc3RSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IGZpcnN0UmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIWZpcnN0UmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEJvZHkgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0Qm9keSk7XG5cbiAgICAgICAgcG9zdHMucHVzaCguLi5Gb3J1bVBvc3RDb2xsZWN0aW9uLl9wYXJzZSh0aHJlYWQsICRmaXJzdCkpO1xuXG4gICAgICAgIC8vIENoZWNrIHBhZ2luYXRpb25cbiAgICAgICAgY29uc3QgJHBhZ2VyID0gJGZpcnN0KCdkaXYucGFnZXInKTtcbiAgICAgICAgaWYgKCRwYWdlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtUG9zdENvbGxlY3Rpb24odGhyZWFkLCBwb3N0cyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCAkcGFnZXJUYXJnZXRzID0gJHBhZ2VyLmZpbmQoJ3NwYW4udGFyZ2V0Jyk7XG4gICAgICAgIGlmICgkcGFnZXJUYXJnZXRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtUG9zdENvbGxlY3Rpb24odGhyZWFkLCBwb3N0cyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgbGFzdCBwYWdlIG51bWJlciBmcm9tIHNlY29uZCB0byBsYXN0IHBhZ2UgbGlua1xuICAgICAgICBjb25zdCBsYXN0UGFnZVRleHQgPSAkcGFnZXJUYXJnZXRzXG4gICAgICAgICAgLmVxKCRwYWdlclRhcmdldHMubGVuZ3RoIC0gMilcbiAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgY29uc3QgbGFzdFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCk7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4obGFzdFBhZ2UpIHx8IGxhc3RQYWdlIDw9IDEpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtUG9zdENvbGxlY3Rpb24odGhyZWFkLCBwb3N0cyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcmVtYWluaW5nIHBhZ2VzXG4gICAgICAgIGNvbnN0IGJvZGllczogeyBtb2R1bGVOYW1lOiBzdHJpbmc7IHBhZ2VObzogc3RyaW5nOyB0OiBzdHJpbmcgfVtdID0gW107XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IGxhc3RQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICBib2RpZXMucHVzaCh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3VGhyZWFkUG9zdHNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZU5vOiBTdHJpbmcocGFnZSksXG4gICAgICAgICAgICB0OiBTdHJpbmcodGhyZWFkLmlkKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgdGhyZWFkLnNpdGUuYW1jUmVxdWVzdChib2RpZXMpO1xuICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdHMuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGFkZGl0aW9uYWxSZXN1bHRzLmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBhZGRpdGlvbmFsUmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG4gICAgICAgICAgcG9zdHMucHVzaCguLi5Gb3J1bVBvc3RDb2xsZWN0aW9uLl9wYXJzZSh0aHJlYWQsICQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBvc3RzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBvc3RzIGZyb20gbXVsdGlwbGUgdGhyZWFkc1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGxJblRocmVhZHMoXG4gICAgdGhyZWFkczogRm9ydW1UaHJlYWRSZWZbXVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8TWFwPG51bWJlciwgRm9ydW1Qb3N0Q29sbGVjdGlvbj4+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhyZWFkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IE1hcDxudW1iZXIsIEZvcnVtUG9zdENvbGxlY3Rpb24+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPG51bWJlciwgRm9ydW1Qb3N0Q29sbGVjdGlvbj4oKTtcbiAgICAgICAgY29uc3Qgc2l0ZSA9IHRocmVhZHNbMF0hLnNpdGU7XG5cbiAgICAgICAgLy8gU3RlcCAxOiBHZXQgZmlyc3QgcGFnZSBvZiBhbGwgdGhyZWFkc1xuICAgICAgICBjb25zdCBmaXJzdFBhZ2VSZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoXG4gICAgICAgICAgdGhyZWFkcy5tYXAoKHRocmVhZCkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVZpZXdUaHJlYWRQb3N0c01vZHVsZScsXG4gICAgICAgICAgICBwYWdlTm86ICcxJyxcbiAgICAgICAgICAgIHQ6IFN0cmluZyh0aHJlYWQuaWQpLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChmaXJzdFBhZ2VSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0UGFnZVJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgMjogUGFyc2UgZmlyc3QgcGFnZXMgYW5kIGRldGVybWluZSBwYWdpbmF0aW9uXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXF1ZXN0czogeyB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmOyBwYWdlOiBudW1iZXIgfVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdGhyZWFkID0gdGhyZWFkc1tpXSE7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBmaXJzdFBhZ2VSZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgaWYgKCFyZXNwb25zZSkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgICBjb25zdCBwb3N0cyA9IEZvcnVtUG9zdENvbGxlY3Rpb24uX3BhcnNlKHRocmVhZCwgJCk7XG4gICAgICAgICAgcmVzdWx0LnNldCh0aHJlYWQuaWQsIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpKTtcblxuICAgICAgICAgIC8vIENoZWNrIHBhZ2luYXRpb25cbiAgICAgICAgICBjb25zdCAkcGFnZXIgPSAkKCdkaXYucGFnZXInKTtcbiAgICAgICAgICBpZiAoJHBhZ2VyLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCAkcGFnZXJUYXJnZXRzID0gJHBhZ2VyLmZpbmQoJ3NwYW4udGFyZ2V0Jyk7XG4gICAgICAgICAgaWYgKCRwYWdlclRhcmdldHMubGVuZ3RoIDwgMikgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBsYXN0UGFnZVRleHQgPSAkcGFnZXJUYXJnZXRzXG4gICAgICAgICAgICAuZXEoJHBhZ2VyVGFyZ2V0cy5sZW5ndGggLSAyKVxuICAgICAgICAgICAgLnRleHQoKVxuICAgICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBsYXN0UGFnZSA9IE51bWJlci5wYXJzZUludChsYXN0UGFnZVRleHQsIDEwKTtcbiAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGxhc3RQYWdlKSB8fCBsYXN0UGFnZSA8PSAxKSBjb250aW51ZTtcblxuICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IGxhc3RQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxSZXF1ZXN0cy5wdXNoKHsgdGhyZWFkLCBwYWdlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgMzogRmV0Y2ggYWRkaXRpb25hbCBwYWdlc1xuICAgICAgICBpZiAoYWRkaXRpb25hbFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgICAgYWRkaXRpb25hbFJlcXVlc3RzLm1hcCgoeyB0aHJlYWQsIHBhZ2UgfSkgPT4gKHtcbiAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZFBvc3RzTW9kdWxlJyxcbiAgICAgICAgICAgICAgcGFnZU5vOiBTdHJpbmcocGFnZSksXG4gICAgICAgICAgICAgIHQ6IFN0cmluZyh0aHJlYWQuaWQpLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IGFkZGl0aW9uYWxSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsUmVxdWVzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGhyZWFkIH0gPSBhZGRpdGlvbmFsUmVxdWVzdHNbaV0hO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhZGRpdGlvbmFsUmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuICAgICAgICAgICAgY29uc3QgcG9zdHMgPSBGb3J1bVBvc3RDb2xsZWN0aW9uLl9wYXJzZSh0aHJlYWQsICQpO1xuXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZyA9IHJlc3VsdC5nZXQodGhyZWFkLmlkKTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICBleGlzdGluZy5wdXNoKC4uLnBvc3RzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcG9zdHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2hlZXJpbyB9IGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB0eXBlIHsgQW55Tm9kZSB9IGZyb20gJ2RvbWhhbmRsZXInO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlT2RhdGUsIHBhcnNlVXNlciB9IGZyb20gJy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgRm9ydW1DYXRlZ29yeSB9IGZyb20gJy4vZm9ydW0tY2F0ZWdvcnknO1xuaW1wb3J0IHsgRm9ydW1Qb3N0Q29sbGVjdGlvbiB9IGZyb20gJy4vZm9ydW0tcG9zdCc7XG5cbi8qKlxuICogRm9ydW0gdGhyZWFkIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3J1bVRocmVhZERhdGEge1xuICBzaXRlOiBTaXRlO1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgcG9zdENvdW50OiBudW1iZXI7XG4gIGNhdGVnb3J5PzogRm9ydW1DYXRlZ29yeSB8IG51bGw7XG59XG5cbi8qKlxuICogRm9ydW0gdGhyZWFkXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVRocmVhZCB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0OiBEYXRlO1xuICBwdWJsaWMgcG9zdENvdW50OiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBjYXRlZ29yeTogRm9ydW1DYXRlZ29yeSB8IG51bGw7XG4gIHByaXZhdGUgX3Bvc3RzOiBGb3J1bVBvc3RDb2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogRm9ydW1UaHJlYWREYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLnBvc3RDb3VudCA9IGRhdGEucG9zdENvdW50O1xuICAgIHRoaXMuY2F0ZWdvcnkgPSBkYXRhLmNhdGVnb3J5ID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRocmVhZCBVUkxcbiAgICovXG4gIGdldFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnNpdGUuZ2V0QmFzZVVybCgpfS9mb3J1bS90LSR7dGhpcy5pZH0vYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcG9zdCBsaXN0XG4gICAqL1xuICBnZXRQb3N0cygpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0Q29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl9wb3N0cyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFByb21pc2UucmVzb2x2ZSh0aGlzLl9wb3N0cyksIChlKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKFN0cmluZyhlKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZvcnVtUG9zdENvbGxlY3Rpb24uYWNxdWlyZUFsbEluVGhyZWFkcyhbdGhpc10pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcG9zdHMgPSByZXN1bHQudmFsdWUuZ2V0KHRoaXMuaWQpID8/IG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRoaXMsIFtdKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc3RzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBwb3N0czogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBseSB0byB0aHJlYWRcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgcmVwbHkoXG4gICAgc291cmNlOiBzdHJpbmcsXG4gICAgdGl0bGUgPSAnJyxcbiAgICBwYXJlbnRQb3N0SWQ6IG51bWJlciB8IG51bGwgPSBudWxsXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJlYWRJZDogU3RyaW5nKHRoaXMuaWQpLFxuICAgICAgICAgICAgcGFyZW50SWQ6IHBhcmVudFBvc3RJZCAhPT0gbnVsbCA/IFN0cmluZyhwYXJlbnRQb3N0SWQpIDogJycsXG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgIGFjdGlvbjogJ0ZvcnVtQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZVBvc3QnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bvc3RzID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb3N0Q291bnQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gcmVwbHk6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRm9ydW1UaHJlYWQoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWQgYnkgSURcbiAgICovXG4gIHN0YXRpYyBnZXRGcm9tSWQoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICB0aHJlYWRJZDogbnVtYmVyLFxuICAgIGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5IHwgbnVsbCA9IG51bGxcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVGcm9tVGhyZWFkSWRzKHNpdGUsIFt0aHJlYWRJZF0sIGNhdGVnb3J5KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRocmVhZCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCF0aHJlYWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYFRocmVhZCBub3QgZm91bmQ6ICR7dGhyZWFkSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocmVhZDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdGhyZWFkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEZvcnVtIHRocmVhZCBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVRocmVhZENvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxGb3J1bVRocmVhZD4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlLCB0aHJlYWRzPzogRm9ydW1UaHJlYWRbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgICBpZiAodGhyZWFkcykge1xuICAgICAgdGhpcy5wdXNoKC4uLnRocmVhZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1UaHJlYWQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHRocmVhZCkgPT4gdGhyZWFkLmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aHJlYWRzIGluIGNhdGVnb3J5XG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbEluQ2F0ZWdvcnkoY2F0ZWdvcnk6IEZvcnVtQ2F0ZWdvcnkpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGhyZWFkczogRm9ydW1UaHJlYWRbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gYXdhaXQgY2F0ZWdvcnkuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwOiAxLFxuICAgICAgICAgICAgYzogY2F0ZWdvcnkuaWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3Q2F0ZWdvcnlNb2R1bGUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmaXJzdFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gZmlyc3RSZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghZmlyc3RSZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0Qm9keSA9IFN0cmluZyhmaXJzdFJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkZmlyc3QgPSBjaGVlcmlvLmxvYWQoZmlyc3RCb2R5KTtcblxuICAgICAgICAkZmlyc3QoJ3RhYmxlLnRhYmxlIHRyLmhlYWR+dHInKS5lYWNoKChfaSwgZWxlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyb3cgPSAkZmlyc3QoZWxlbSk7XG4gICAgICAgICAgY29uc3QgdGl0bGVFbGVtID0gJHJvdy5maW5kKCdkaXYudGl0bGUgYScpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSB0aXRsZUVsZW0uYXR0cignaHJlZicpID8/ICcnO1xuICAgICAgICAgIGNvbnN0IHRocmVhZElkTWF0Y2ggPSBocmVmLm1hdGNoKC90LShcXGQrKS8pO1xuICAgICAgICAgIGlmICghdGhyZWFkSWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCB0aHJlYWRJZCA9IE51bWJlci5wYXJzZUludCh0aHJlYWRJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSB0aXRsZUVsZW0udGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9ICRyb3cuZmluZCgnZGl2LmRlc2NyaXB0aW9uJykudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBwb3N0Q291bnQgPSBOdW1iZXIucGFyc2VJbnQoJHJvdy5maW5kKCd0ZC5wb3N0cycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuXG4gICAgICAgICAgLy8gUGFyc2UgdXNlciBhbmQgdGltZXN0YW1wXG4gICAgICAgICAgY29uc3QgJHVzZXJFbGVtID0gJHJvdy5maW5kKCd0ZC5zdGFydGVkIHNwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgY29uc3QgJG9kYXRlRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLm9kYXRlJyk7XG5cbiAgICAgICAgICBjb25zdCBjcmVhdGVkQnkgPVxuICAgICAgICAgICAgJHVzZXJFbGVtLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBwYXJzZVVzZXIoY2F0ZWdvcnkuc2l0ZS5jbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KVxuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgICAgICAgICRvZGF0ZUVsZW0ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IChwYXJzZU9kYXRlKCRvZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKSlcbiAgICAgICAgICAgICAgOiBuZXcgRGF0ZSgpO1xuXG4gICAgICAgICAgdGhyZWFkcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEZvcnVtVGhyZWFkKHtcbiAgICAgICAgICAgICAgc2l0ZTogY2F0ZWdvcnkuc2l0ZSxcbiAgICAgICAgICAgICAgaWQ6IHRocmVhZElkLFxuICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIGNyZWF0ZWRCeSxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgICAgICBwb3N0Q291bnQsXG4gICAgICAgICAgICAgIGNhdGVnb3J5LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgIGNvbnN0IHBhZ2VyID0gJGZpcnN0KCdkaXYucGFnZXInKTtcbiAgICAgICAgaWYgKHBhZ2VyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFnZXJMaW5rcyA9IHBhZ2VyLmZpbmQoJ2EnKTtcbiAgICAgICAgaWYgKHBhZ2VyTGlua3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFBhZ2VMaW5rID0gcGFnZXJMaW5rc1twYWdlckxpbmtzLmxlbmd0aCAtIDJdO1xuICAgICAgICBjb25zdCBsYXN0UGFnZVRleHQgPSBsYXN0UGFnZUxpbmsgPyAkZmlyc3QobGFzdFBhZ2VMaW5rKS50ZXh0KCkudHJpbSgpIDogJzEnO1xuICAgICAgICBjb25zdCBsYXN0UGFnZSA9IE51bWJlci5wYXJzZUludChsYXN0UGFnZVRleHQsIDEwKSB8fCAxO1xuXG4gICAgICAgIGlmIChsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVRocmVhZENvbGxlY3Rpb24oY2F0ZWdvcnkuc2l0ZSwgdGhyZWFkcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGZXRjaCByZW1haW5pbmcgcGFnZXNcbiAgICAgICAgY29uc3QgYm9kaWVzOiB7IHA6IG51bWJlcjsgYzogbnVtYmVyOyBtb2R1bGVOYW1lOiBzdHJpbmcgfVtdID0gW107XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IGxhc3RQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICBib2RpZXMucHVzaCh7XG4gICAgICAgICAgICBwOiBwYWdlLFxuICAgICAgICAgICAgYzogY2F0ZWdvcnkuaWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3Q2F0ZWdvcnlNb2R1bGUnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdHMgPSBhd2FpdCBjYXRlZ29yeS5zaXRlLmFtY1JlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgICAgJCgndGFibGUudGFibGUgdHIuaGVhZH50cicpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkcm93ID0gJChlbGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlRWxlbSA9ICRyb3cuZmluZCgnZGl2LnRpdGxlIGEnKTtcbiAgICAgICAgICAgIGNvbnN0IGhyZWYgPSB0aXRsZUVsZW0uYXR0cignaHJlZicpID8/ICcnO1xuICAgICAgICAgICAgY29uc3QgdGhyZWFkSWRNYXRjaCA9IGhyZWYubWF0Y2goL3QtKFxcZCspLyk7XG4gICAgICAgICAgICBpZiAoIXRocmVhZElkTWF0Y2g/LlsxXSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCB0aHJlYWRJZCA9IE51bWJlci5wYXJzZUludCh0aHJlYWRJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9IHRpdGxlRWxlbS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSAkcm93LmZpbmQoJ2Rpdi5kZXNjcmlwdGlvbicpLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgICBjb25zdCBwb3N0Q291bnQgPSBOdW1iZXIucGFyc2VJbnQoJHJvdy5maW5kKCd0ZC5wb3N0cycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuXG4gICAgICAgICAgICAvLyBQYXJzZSB1c2VyIGFuZCB0aW1lc3RhbXBcbiAgICAgICAgICAgIGNvbnN0ICR1c2VyRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgICAgY29uc3QgJG9kYXRlRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLm9kYXRlJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9XG4gICAgICAgICAgICAgICR1c2VyRWxlbS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBwYXJzZVVzZXIoY2F0ZWdvcnkuc2l0ZS5jbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9XG4gICAgICAgICAgICAgICRvZGF0ZUVsZW0ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gKHBhcnNlT2RhdGUoJG9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpKVxuICAgICAgICAgICAgICAgIDogbmV3IERhdGUoKTtcblxuICAgICAgICAgICAgdGhyZWFkcy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgRm9ydW1UaHJlYWQoe1xuICAgICAgICAgICAgICAgIHNpdGU6IGNhdGVnb3J5LnNpdGUsXG4gICAgICAgICAgICAgICAgaWQ6IHRocmVhZElkLFxuICAgICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRCeSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgcG9zdENvdW50LFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgdGhyZWFkczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2luZ2xlIHRocmVhZCBieSB0aHJlYWQgSURcbiAgICogQHBhcmFtIHNpdGUgLSBTaXRlIGluc3RhbmNlXG4gICAqIEBwYXJhbSB0aHJlYWRJZCAtIFRocmVhZCBJRFxuICAgKi9cbiAgc3RhdGljIGZyb21JZChzaXRlOiBTaXRlLCB0aHJlYWRJZDogbnVtYmVyKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVGcm9tVGhyZWFkSWRzKHNpdGUsIFt0aHJlYWRJZF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGhyZWFkID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXRocmVhZCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgVGhyZWFkIG5vdCBmb3VuZDogJHt0aHJlYWRJZH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyZWFkO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB0aHJlYWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWRzIGJ5IHRocmVhZCBJRHNcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlRnJvbVRocmVhZElkcyhcbiAgICBzaXRlOiBTaXRlLFxuICAgIHRocmVhZElkczogbnVtYmVyW10sXG4gICAgY2F0ZWdvcnk6IEZvcnVtQ2F0ZWdvcnkgfCBudWxsID0gbnVsbFxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHRocmVhZElkcy5tYXAoKHRocmVhZElkKSA9PiAoe1xuICAgICAgICAgICAgdDogdGhyZWFkSWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3VGhyZWFkTW9kdWxlJyxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aHJlYWRzOiBGb3J1bVRocmVhZFtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHJlYWRJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBjb25zdCB0aHJlYWRJZCA9IHRocmVhZElkc1tpXTtcbiAgICAgICAgICBpZiAoIXJlc3BvbnNlIHx8ICF0aHJlYWRJZCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgICAvLyBQYXJzZSB0aHJlYWQgaW5mbyBmcm9tIHBhZ2VcbiAgICAgICAgICBjb25zdCBiY0VsZW0gPSAkKCdkaXYuZm9ydW0tYnJlYWRjcnVtYnMnKTtcbiAgICAgICAgICBpZiAoYmNFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdCcmVhZGNydW1icyBub3QgZm91bmQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYmNQYXJ0cyA9IGJjRWxlbS50ZXh0KCkuc3BsaXQoJ8K7Jyk7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSBiY1BhcnRzLmxlbmd0aCA+IDAgPyAoYmNQYXJ0c1tiY1BhcnRzLmxlbmd0aCAtIDFdPy50cmltKCkgPz8gJycpIDogJyc7XG5cbiAgICAgICAgICBjb25zdCBkZXNjQmxvY2tFbGVtID0gJCgnZGl2LmRlc2NyaXB0aW9uLWJsb2NrJyk7XG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBkZXNjQmxvY2tFbGVtLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICBjb25zdCBwb3N0Q291bnRNYXRjaCA9ICQoJ2Rpdi5zdGF0aXN0aWNzJykudGV4dCgpLm1hdGNoKC8oXFxkKykvKTtcbiAgICAgICAgICBjb25zdCBwb3N0Q291bnQgPSBwb3N0Q291bnRNYXRjaD8uWzFdID8gTnVtYmVyLnBhcnNlSW50KHBvc3RDb3VudE1hdGNoWzFdLCAxMCkgOiAwO1xuXG4gICAgICAgICAgdGhyZWFkcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEZvcnVtVGhyZWFkKHtcbiAgICAgICAgICAgICAgc2l0ZSxcbiAgICAgICAgICAgICAgaWQ6IHRocmVhZElkLFxuICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIGNyZWF0ZWRCeTogbnVsbCxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICBwb3N0Q291bnQsXG4gICAgICAgICAgICAgIGNhdGVnb3J5LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVRocmVhZENvbGxlY3Rpb24oc2l0ZSwgdGhyZWFkcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSB0aHJlYWRzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yLCBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5pbXBvcnQgeyBGb3J1bVRocmVhZCwgRm9ydW1UaHJlYWRDb2xsZWN0aW9uIH0gZnJvbSAnLi9mb3J1bS10aHJlYWQnO1xuXG4vKipcbiAqIEZvcnVtIGNhdGVnb3J5IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3J1bUNhdGVnb3J5RGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHRocmVhZHNDb3VudDogbnVtYmVyO1xuICBwb3N0c0NvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogRm9ydW0gY2F0ZWdvcnlcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcnVtQ2F0ZWdvcnkge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHRocmVhZHNDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgcG9zdHNDb3VudDogbnVtYmVyO1xuICBwcml2YXRlIF90aHJlYWRzOiBGb3J1bVRocmVhZENvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBGb3J1bUNhdGVnb3J5RGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLnRocmVhZHNDb3VudCA9IGRhdGEudGhyZWFkc0NvdW50O1xuICAgIHRoaXMucG9zdHNDb3VudCA9IGRhdGEucG9zdHNDb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhyZWFkIGxpc3RcbiAgICovXG4gIGdldFRocmVhZHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl90aHJlYWRzICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3RocmVhZHMpLCAoZSkgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihTdHJpbmcoZSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBGb3J1bVRocmVhZENvbGxlY3Rpb24uYWNxdWlyZUFsbEluQ2F0ZWdvcnkodGhpcyk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90aHJlYWRzID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcy5fdGhyZWFkcztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdGhyZWFkczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxvYWQgdGhyZWFkIGxpc3RcbiAgICovXG4gIHJlbG9hZFRocmVhZHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMuX3RocmVhZHMgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLmdldFRocmVhZHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhyZWFkXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNyZWF0ZVRocmVhZChcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgc291cmNlOiBzdHJpbmdcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBhY3Rpb246ICdGb3J1bUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ25ld1RocmVhZCcsXG4gICAgICAgICAgICBjYXRlZ29yeV9pZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UgfHwgdHlwZW9mIHJlc3BvbnNlLnRocmVhZElkICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignVGhyZWFkIElEIG5vdCBmb3VuZCBpbiByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhyZWFkSWQgPSByZXNwb25zZS50aHJlYWRJZCBhcyBudW1iZXI7XG4gICAgICAgIGNvbnN0IHRocmVhZFJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkLmdldEZyb21JZCh0aGlzLnNpdGUsIHRocmVhZElkLCB0aGlzKTtcbiAgICAgICAgaWYgKHRocmVhZFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgdGhyZWFkUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aHJlYWRSZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHRocmVhZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRm9ydW1DYXRlZ29yeShpZD0ke3RoaXMuaWR9LCB0aXRsZT0ke3RoaXMudGl0bGV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3J1bSBjYXRlZ29yeSBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbiBleHRlbmRzIEFycmF5PEZvcnVtQ2F0ZWdvcnk+IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSwgY2F0ZWdvcmllcz86IEZvcnVtQ2F0ZWdvcnlbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgICBpZiAoY2F0ZWdvcmllcykge1xuICAgICAgdGhpcy5wdXNoKC4uLmNhdGVnb3JpZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1DYXRlZ29yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBjYXRlZ29yaWVzIGZvciBhIHNpdGVcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsKHNpdGU6IFNpdGUpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVN0YXJ0TW9kdWxlJyxcbiAgICAgICAgICAgIGhpZGRlbjogJ3RydWUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcblxuICAgICAgICBjb25zdCBjYXRlZ29yaWVzOiBGb3J1bUNhdGVnb3J5W10gPSBbXTtcblxuICAgICAgICAkKCd0YWJsZSB0ci5oZWFkfnRyJykuZWFjaCgoX2ksIHJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyb3cgPSAkKHJvdyk7XG4gICAgICAgICAgY29uc3QgbmFtZUVsZW0gPSAkcm93LmZpbmQoJ3RkLm5hbWUnKTtcbiAgICAgICAgICBjb25zdCBuYW1lTGlua0VsZW0gPSBuYW1lRWxlbS5maW5kKCdhJyk7XG4gICAgICAgICAgY29uc3QgaHJlZiA9IG5hbWVMaW5rRWxlbS5hdHRyKCdocmVmJykgPz8gJyc7XG5cbiAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkTWF0Y2ggPSBocmVmLm1hdGNoKC9jLShcXGQrKS8pO1xuICAgICAgICAgIGlmICghY2F0ZWdvcnlJZE1hdGNoPy5bMV0pIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGNhdGVnb3J5SWQgPSBOdW1iZXIucGFyc2VJbnQoY2F0ZWdvcnlJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSBuYW1lTGlua0VsZW0udGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IG5hbWVFbGVtLmZpbmQoJ2Rpdi5kZXNjcmlwdGlvbicpLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgdGhyZWFkc0NvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQudGhyZWFkcycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuICAgICAgICAgIGNvbnN0IHBvc3RzQ291bnQgPSBOdW1iZXIucGFyc2VJbnQoJHJvdy5maW5kKCd0ZC5wb3N0cycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuXG4gICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEZvcnVtQ2F0ZWdvcnkoe1xuICAgICAgICAgICAgICBzaXRlLFxuICAgICAgICAgICAgICBpZDogY2F0ZWdvcnlJZCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICB0aHJlYWRzQ291bnQsXG4gICAgICAgICAgICAgIHBvc3RzQ291bnQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24oc2l0ZSwgY2F0ZWdvcmllcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBjYXRlZ29yaWVzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJleHBvcnQgeyBGb3J1bUNhdGVnb3J5LCBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbiwgdHlwZSBGb3J1bUNhdGVnb3J5RGF0YSB9IGZyb20gJy4vZm9ydW0tY2F0ZWdvcnknO1xuZXhwb3J0IHsgRm9ydW1Qb3N0LCBGb3J1bVBvc3RDb2xsZWN0aW9uLCB0eXBlIEZvcnVtUG9zdERhdGEgfSBmcm9tICcuL2ZvcnVtLXBvc3QnO1xuZXhwb3J0IHtcbiAgRm9ydW1Qb3N0UmV2aXNpb24sXG4gIEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbixcbiAgdHlwZSBGb3J1bVBvc3RSZXZpc2lvbkRhdGEsXG59IGZyb20gJy4vZm9ydW0tcG9zdC1yZXZpc2lvbic7XG5leHBvcnQgeyBGb3J1bVRocmVhZCwgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLCB0eXBlIEZvcnVtVGhyZWFkRGF0YSB9IGZyb20gJy4vZm9ydW0tdGhyZWFkJztcbiIsCiAgICAiLy8gQ29tbW9uXG5leHBvcnQgKiBmcm9tICcuL2NvbW1vbi9lcnJvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vbG9nZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL3R5cGVzJztcblxuLy8gQ29ubmVjdG9yXG5leHBvcnQgKiBmcm9tICcuL2Nvbm5lY3Rvcic7XG5cbi8vIE1vZHVsZVxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGUnO1xuXG4vLyBVdGlsXG5leHBvcnQgKiBmcm9tICcuL3V0aWwnO1xuIiwKICAgICJpbXBvcnQga3ksIHsgdHlwZSBLeUluc3RhbmNlIH0gZnJvbSAna3knO1xuaW1wb3J0IHBMaW1pdCwgeyB0eXBlIExpbWl0RnVuY3Rpb24gfSBmcm9tICdwLWxpbWl0JztcbmltcG9ydCB7XG4gIEFNQ0h0dHBFcnJvcixcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxuICBSZXNwb25zZURhdGFFcnJvcixcbiAgVW5leHBlY3RlZEVycm9yLFxuICBXaWtpZG90RXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsIHdkRXJyQXN5bmMsIHdkT2tBc3luYyB9IGZyb20gJy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBmZXRjaFdpdGhSZXRyeSB9IGZyb20gJy4uL3V0aWwvaHR0cCc7XG5pbXBvcnQge1xuICB0eXBlIEFNQ0NvbmZpZyxcbiAgREVGQVVMVF9BTUNfQ09ORklHLFxuICBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREUsXG4gIFdJS0lET1RfVE9LRU43LFxufSBmcm9tICcuL2FtYy1jb25maWcnO1xuaW1wb3J0IHsgQU1DSGVhZGVyIH0gZnJvbSAnLi9hbWMtaGVhZGVyJztcbmltcG9ydCB7IHR5cGUgQU1DUmVxdWVzdEJvZHksIHR5cGUgQU1DUmVzcG9uc2UsIGFtY1Jlc3BvbnNlU2NoZW1hIH0gZnJvbSAnLi9hbWMtdHlwZXMnO1xuXG4vKipcbiAqIE1hc2sgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIChmb3IgbG9nZ2luZylcbiAqIEBwYXJhbSBib2R5IC0gUmVxdWVzdCBib2R5IHRvIG1hc2tcbiAqIEByZXR1cm5zIE1hc2tlZCBib2R5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXNrU2Vuc2l0aXZlRGF0YShib2R5OiBBTUNSZXF1ZXN0Qm9keSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgbWFza2VkID0geyAuLi5ib2R5IH07XG4gIGNvbnN0IHNlbnNpdGl2ZUtleXMgPSBbJ3Bhc3N3b3JkJywgJ2xvZ2luJywgJ1dJS0lET1RfU0VTU0lPTl9JRCcsICd3aWtpZG90X3Rva2VuNyddO1xuICBmb3IgKGNvbnN0IGtleSBvZiBzZW5zaXRpdmVLZXlzKSB7XG4gICAgaWYgKGtleSBpbiBtYXNrZWQpIHtcbiAgICAgIG1hc2tlZFtrZXldID0gJyoqKk1BU0tFRCoqKic7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXNrZWQ7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGV4cG9uZW50aWFsIGJhY2tvZmYgaW50ZXJ2YWwgKHdpdGggaml0dGVyKVxuICogQHBhcmFtIHJldHJ5Q291bnQgLSBDdXJyZW50IHJldHJ5IGNvdW50IChzdGFydHMgZnJvbSAxKVxuICogQHBhcmFtIGJhc2VJbnRlcnZhbCAtIEJhc2UgaW50ZXJ2YWwgKG1pbGxpc2Vjb25kcylcbiAqIEBwYXJhbSBiYWNrb2ZmRmFjdG9yIC0gQmFja29mZiBmYWN0b3JcbiAqIEBwYXJhbSBtYXhCYWNrb2ZmIC0gTWF4aW11bSBiYWNrb2ZmIGludGVydmFsIChtaWxsaXNlY29uZHMpXG4gKiBAcmV0dXJucyBDYWxjdWxhdGVkIGJhY2tvZmYgaW50ZXJ2YWwgKG1pbGxpc2Vjb25kcylcbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlQmFja29mZihcbiAgcmV0cnlDb3VudDogbnVtYmVyLFxuICBiYXNlSW50ZXJ2YWw6IG51bWJlcixcbiAgYmFja29mZkZhY3RvcjogbnVtYmVyLFxuICBtYXhCYWNrb2ZmOiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IGJhY2tvZmYgPSBiYXNlSW50ZXJ2YWwgKiBiYWNrb2ZmRmFjdG9yICoqIChyZXRyeUNvdW50IC0gMSk7XG4gIGNvbnN0IGppdHRlciA9IE1hdGgucmFuZG9tKCkgKiBiYWNrb2ZmICogMC4xO1xuICByZXR1cm4gTWF0aC5taW4oYmFja29mZiArIGppdHRlciwgbWF4QmFja29mZik7XG59XG5cbi8qKlxuICogU2xlZXAgZm9yIHNwZWNpZmllZCBkdXJhdGlvblxuICogQHBhcmFtIG1zIC0gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzXG4gKi9cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbi8qKlxuICogQU1DIHJlcXVlc3Qgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ1JlcXVlc3RPcHRpb25zIHtcbiAgLyoqIFNpdGUgbmFtZSAoZGVmYXVsdDogd3d3KSAqL1xuICBzaXRlTmFtZT86IHN0cmluZztcbiAgLyoqIFNTTCBzdXBwb3J0IChhdXRvLWRldGVjdGVkIGlmIG9taXR0ZWQpICovXG4gIHNzbFN1cHBvcnRlZD86IGJvb2xlYW47XG4gIC8qKiBJbmNsdWRlIGVycm9ycyBpbiByZXN1bHRzIGluc3RlYWQgb2YgdGhyb3dpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICByZXR1cm5FeGNlcHRpb25zPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBamF4IE1vZHVsZSBDb25uZWN0b3IgY2xpZW50XG4gKiBNYW5hZ2VzIHJlcXVlc3RzIHRvIFdpa2lkb3QgQU1DIGVuZHBvaW50XG4gKi9cbmV4cG9ydCBjbGFzcyBBTUNDbGllbnQge1xuICAvKioga3kgaW5zdGFuY2UgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBreTogS3lJbnN0YW5jZTtcblxuICAvKiogQ29uY3VycmVudCByZXF1ZXN0IGxpbWl0ZXIgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsaW1pdDogTGltaXRGdW5jdGlvbjtcblxuICAvKiogSGVhZGVyIG1hbmFnZXIgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhlYWRlcjogQU1DSGVhZGVyO1xuXG4gIC8qKiBDb25maWd1cmF0aW9uICovXG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IEFNQ0NvbmZpZztcblxuICAvKiogQmFzZSBkb21haW4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nO1xuXG4gIC8qKiBTU0wgc3VwcG9ydCBzdGF0dXMgY2FjaGUgKi9cbiAgcHJpdmF0ZSBzc2xDYWNoZTogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjb25maWcgLSBBTUMgY29uZmlndXJhdGlvbiAodXNlcyBkZWZhdWx0cyBpZiBvbWl0dGVkKVxuICAgKiBAcGFyYW0gZG9tYWluIC0gQmFzZSBkb21haW4gKGRlZmF1bHQ6IHdpa2lkb3QuY29tKVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQYXJ0aWFsPEFNQ0NvbmZpZz4gPSB7fSwgZG9tYWluID0gJ3dpa2lkb3QuY29tJykge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi5ERUZBVUxUX0FNQ19DT05GSUcsIC4uLmNvbmZpZyB9O1xuICAgIHRoaXMuZG9tYWluID0gZG9tYWluO1xuICAgIHRoaXMuaGVhZGVyID0gbmV3IEFNQ0hlYWRlcigpO1xuICAgIHRoaXMubGltaXQgPSBwTGltaXQodGhpcy5jb25maWcuc2VtYXBob3JlTGltaXQpO1xuXG4gICAgdGhpcy5reSA9IGt5LmNyZWF0ZSh7XG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZy50aW1lb3V0LFxuICAgICAgcmV0cnk6IDAsIC8vIE1hbnVhbCByZXRyeSBjb250cm9sXG4gICAgfSk7XG5cbiAgICAvLyB3d3cgYWx3YXlzIHN1cHBvcnRzIFNTTFxuICAgIHRoaXMuc3NsQ2FjaGUuc2V0KCd3d3cnLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBzaXRlIGV4aXN0ZW5jZSBhbmQgU1NMIHN1cHBvcnQgc3RhdHVzXG4gICAqIEBwYXJhbSBzaXRlTmFtZSAtIFNpdGUgbmFtZVxuICAgKiBAcmV0dXJucyBTU0wgc3VwcG9ydCBzdGF0dXMgKHRydWU6IEhUVFBTLCBmYWxzZTogSFRUUClcbiAgICovXG4gIGNoZWNrU2l0ZVNTTChzaXRlTmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPGJvb2xlYW4+IHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIHZhbHVlIGlmIGV4aXN0c1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc3NsQ2FjaGUuZ2V0KHNpdGVOYW1lKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB3ZE9rQXN5bmMoY2FjaGVkKTtcbiAgICB9XG5cbiAgICAvLyB3d3cgYWx3YXlzIHN1cHBvcnRzIFNTTFxuICAgIGlmIChzaXRlTmFtZSA9PT0gJ3d3dycpIHtcbiAgICAgIHJldHVybiB3ZE9rQXN5bmModHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeShgaHR0cDovLyR7c2l0ZU5hbWV9LiR7dGhpcy5kb21haW59YCwgdGhpcy5jb25maWcsIHtcbiAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgIHJlZGlyZWN0OiAnbWFudWFsJyxcbiAgICAgICAgICBjaGVja09rOiBmYWxzZSwgLy8gRG9uJ3QgcmV0cnkgb24gSFRUUCBlcnJvcnMgKDMwMSBpcyBleHBlY3RlZClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gNDA0IG1lYW5zIHNpdGUgZG9lcyBub3QgZXhpc3RcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBTaXRlIGlzIG5vdCBmb3VuZDogJHtzaXRlTmFtZX0uJHt0aGlzLmRvbWFpbn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNTTCBzdXBwb3J0ZWQgaWYgMzAxIHJlZGlyZWN0IHRvIGh0dHBzXG4gICAgICAgIGNvbnN0IGlzU1NMID1cbiAgICAgICAgICByZXNwb25zZS5zdGF0dXMgPT09IDMwMSAmJiByZXNwb25zZS5oZWFkZXJzLmdldCgnTG9jYXRpb24nKT8uc3RhcnRzV2l0aCgnaHR0cHMnKSA9PT0gdHJ1ZTtcblxuICAgICAgICAvLyBTYXZlIHRvIGNhY2hlXG4gICAgICAgIHRoaXMuc3NsQ2FjaGUuc2V0KHNpdGVOYW1lLCBpc1NTTCk7XG4gICAgICAgIHJldHVybiBpc1NTTDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY2hlY2sgU1NMIGZvciAke3NpdGVOYW1lfTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBBTUMgcmVxdWVzdFxuICAgKiBAcGFyYW0gYm9kaWVzIC0gUmVxdWVzdCBib2R5IGFycmF5XG4gICAqIEBwYXJhbSBzaXRlTmFtZSAtIFNpdGUgbmFtZSAoZGVmYXVsdDogd3d3KVxuICAgKiBAcGFyYW0gc3NsU3VwcG9ydGVkIC0gU1NMIHN1cHBvcnQgKGF1dG8tZGV0ZWN0ZWQgaWYgb21pdHRlZClcbiAgICogQHJldHVybnMgUmVzcG9uc2UgYXJyYXlcbiAgICovXG4gIHJlcXVlc3QoXG4gICAgYm9kaWVzOiBBTUNSZXF1ZXN0Qm9keVtdLFxuICAgIHNpdGVOYW1lID0gJ3d3dycsXG4gICAgc3NsU3VwcG9ydGVkPzogYm9vbGVhblxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2VbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoT3B0aW9ucyhib2RpZXMsIHtcbiAgICAgIHNpdGVOYW1lLFxuICAgICAgc3NsU3VwcG9ydGVkLFxuICAgICAgcmV0dXJuRXhjZXB0aW9uczogZmFsc2UsXG4gICAgfSkgYXMgV2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlW10+O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgQU1DIHJlcXVlc3QgKHdpdGggb3B0aW9ucylcbiAgICogQHBhcmFtIGJvZGllcyAtIFJlcXVlc3QgYm9keSBhcnJheVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlcXVlc3Qgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBSZXNwb25zZSBhcnJheSAoaW5jbHVkZXMgZXJyb3JzIGlmIHJldHVybkV4Y2VwdGlvbnMgaXMgdHJ1ZSlcbiAgICovXG4gIHJlcXVlc3RXaXRoT3B0aW9ucyhcbiAgICBib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10sXG4gICAgb3B0aW9uczogQU1DUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8KEFNQ1Jlc3BvbnNlIHwgV2lraWRvdEVycm9yKVtdPiB7XG4gICAgY29uc3QgeyBzaXRlTmFtZSA9ICd3d3cnLCBzc2xTdXBwb3J0ZWQsIHJldHVybkV4Y2VwdGlvbnMgPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEdldCBTU0wgc3VwcG9ydCBzdGF0dXNcbiAgICAgICAgbGV0IHNzbCA9IHNzbFN1cHBvcnRlZDtcbiAgICAgICAgaWYgKHNzbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgc3NsUmVzdWx0ID0gYXdhaXQgdGhpcy5jaGVja1NpdGVTU0woc2l0ZU5hbWUpO1xuICAgICAgICAgIGlmIChzc2xSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgc3NsUmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzc2wgPSBzc2xSZXN1bHQudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNzbCA/ICdodHRwcycgOiAnaHR0cCc7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3Byb3RvY29sfTovLyR7c2l0ZU5hbWV9LiR7dGhpcy5kb21haW59L2FqYXgtbW9kdWxlLWNvbm5lY3Rvci5waHBgO1xuXG4gICAgICAgIC8vIEV4ZWN1dGUgcmVxdWVzdHMgaW4gcGFyYWxsZWxcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGJvZGllcy5tYXAoKGJvZHkpID0+IHRoaXMubGltaXQoKCkgPT4gdGhpcy5zaW5nbGVSZXF1ZXN0KGJvZHksIHVybCkpKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXR1cm5FeGNlcHRpb25zKSB7XG4gICAgICAgICAgLy8gUmV0dXJuIGFsbCByZXN1bHRzIGluY2x1ZGluZyBlcnJvcnNcbiAgICAgICAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHIpID0+IHtcbiAgICAgICAgICAgIGlmIChyLmlzT2soKSkge1xuICAgICAgICAgICAgICByZXR1cm4gci52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByLmVycm9yO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhyb3cgZmlyc3QgZXJyb3IgaWYgYW55XG4gICAgICAgIGNvbnN0IGZpcnN0RXJyb3IgPSByZXN1bHRzLmZpbmQoKHIpID0+IHIuaXNFcnIoKSk7XG4gICAgICAgIGlmIChmaXJzdEVycm9yPy5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RFcnJvci5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocikgPT4ge1xuICAgICAgICAgIGlmIChyLmlzT2soKSkge1xuICAgICAgICAgICAgcmV0dXJuIHIudmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ1VuZXhwZWN0ZWQgZXJyb3IgaW4gcmVzdWx0IHByb2Nlc3NpbmcnKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgQU1DIHJlcXVlc3QgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gZXhlY3V0ZSBhIHNpbmdsZSByZXF1ZXN0XG4gICAqIEBwYXJhbSBib2R5IC0gUmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSB1cmwgLSBSZXF1ZXN0IFVSTFxuICAgKiBAcmV0dXJucyBSZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaW5nbGVSZXF1ZXN0KFxuICAgIGJvZHk6IEFNQ1JlcXVlc3RCb2R5LFxuICAgIHVybDogc3RyaW5nXG4gICk6IFByb21pc2U8V2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlPj4ge1xuICAgIGxldCByZXRyeUNvdW50ID0gMDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBBZGQgd2lraWRvdF90b2tlbjdcbiAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7IC4uLmJvZHksIHdpa2lkb3RfdG9rZW43OiBXSUtJRE9UX1RPS0VONyB9O1xuXG4gICAgICAgIC8vIENyZWF0ZSBVUkwtZW5jb2RlZCBib2R5XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZXF1ZXN0Qm9keSkpIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmt5LnBvc3QodXJsLCB7XG4gICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXIuZ2V0SGVhZGVycygpLFxuICAgICAgICAgIGJvZHk6IGZvcm1EYXRhLnRvU3RyaW5nKCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFBhcnNlIGFzIEpTT05cbiAgICAgICAgbGV0IHJlc3BvbnNlRGF0YTogdW5rbm93bjtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3BvbnNlRGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gUmV0cnkgb24gSlNPTiBwYXJzZSBlcnJvciAoZS5nLiwgZW1wdHkgcmVzcG9uc2UpXG4gICAgICAgICAgcmV0cnlDb3VudCsrO1xuICAgICAgICAgIGlmIChyZXRyeUNvdW50ID49IHRoaXMuY29uZmlnLnJldHJ5TGltaXQpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKFxuICAgICAgICAgICAgICBuZXcgUmVzcG9uc2VEYXRhRXJyb3IoYEFNQyByZXNwb25kZWQgd2l0aCBub24tSlNPTiBkYXRhOiAke3Jlc3BvbnNlVGV4dH1gKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoXG4gICAgICAgICAgICByZXRyeUNvdW50LFxuICAgICAgICAgICAgdGhpcy5jb25maWcucmV0cnlJbnRlcnZhbCxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmJhY2tvZmZGYWN0b3IsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5tYXhCYWNrb2ZmXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIHdpdGggem9kXG4gICAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gYW1jUmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKHJlc3BvbnNlRGF0YSk7XG4gICAgICAgIGlmICghcGFyc2VSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKFxuICAgICAgICAgICAgbmV3IFJlc3BvbnNlRGF0YUVycm9yKGBJbnZhbGlkIEFNQyByZXNwb25zZSBmb3JtYXQ6ICR7cGFyc2VSZXN1bHQuZXJyb3IubWVzc2FnZX1gKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhbWNSZXNwb25zZSA9IHBhcnNlUmVzdWx0LmRhdGE7XG5cbiAgICAgICAgLy8gUmV0cnkgaWYgdHJ5X2FnYWluXG4gICAgICAgIGlmIChhbWNSZXNwb25zZS5zdGF0dXMgPT09ICd0cnlfYWdhaW4nKSB7XG4gICAgICAgICAgcmV0cnlDb3VudCsrO1xuICAgICAgICAgIGlmIChyZXRyeUNvdW50ID49IHRoaXMuY29uZmlnLnJldHJ5TGltaXQpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKG5ldyBXaWtpZG90U3RhdHVzRXJyb3IoJ0FNQyByZXNwb25kZWQgd2l0aCB0cnlfYWdhaW4nLCAndHJ5X2FnYWluJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBiYWNrb2ZmID0gY2FsY3VsYXRlQmFja29mZihcbiAgICAgICAgICAgIHJldHJ5Q291bnQsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5yZXRyeUludGVydmFsLFxuICAgICAgICAgICAgdGhpcy5jb25maWcuYmFja29mZkZhY3RvcixcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLm1heEJhY2tvZmZcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHNsZWVwKGJhY2tvZmYpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9yYmlkZGVuRXJyb3IgaWYgbm9fcGVybWlzc2lvblxuICAgICAgICBpZiAoYW1jUmVzcG9uc2Uuc3RhdHVzID09PSAnbm9fcGVybWlzc2lvbicpIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXRTdHIgPSBib2R5Lm1vZHVsZU5hbWVcbiAgICAgICAgICAgID8gYG1vZHVsZU5hbWU6ICR7Ym9keS5tb2R1bGVOYW1lfWBcbiAgICAgICAgICAgIDogYm9keS5hY3Rpb25cbiAgICAgICAgICAgICAgPyBgYWN0aW9uOiAke2JvZHkuYWN0aW9ufS8ke2JvZHkuZXZlbnQgPz8gJyd9YFxuICAgICAgICAgICAgICA6ICd1bmtub3duJztcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgIG5ldyBGb3JiaWRkZW5FcnJvcihcbiAgICAgICAgICAgICAgYFlvdXIgYWNjb3VudCBoYXMgbm8gcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoaXMgYWN0aW9uOiAke3RhcmdldFN0cn1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVycm9yIGlmIHN0YXR1cyBpcyBub3Qgb2tcbiAgICAgICAgaWYgKGFtY1Jlc3BvbnNlLnN0YXR1cyAhPT0gJ29rJykge1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKFxuICAgICAgICAgICAgbmV3IFdpa2lkb3RTdGF0dXNFcnJvcihcbiAgICAgICAgICAgICAgYEFNQyByZXNwb25kZWQgd2l0aCBlcnJvciBzdGF0dXM6IFwiJHthbWNSZXNwb25zZS5zdGF0dXN9XCJgLFxuICAgICAgICAgICAgICBhbWNSZXNwb25zZS5zdGF0dXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdkT2tBc3luYyhhbWNSZXNwb25zZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBSZXRyeSBvbiBhbGwgZXJyb3JzIChIVFRQIGVycm9ycywgbmV0d29yayBlcnJvcnMsIHRpbWVvdXRzLCBldGMuKVxuICAgICAgICAvLyBXaWtpZG90IHNlcnZlciBoYXMgYSByZWxhdGl2ZWx5IGhpZ2ggZXJyb3IgcmF0ZSwgc28gcmV0cnkgaXMgZXNzZW50aWFsXG4gICAgICAgIHJldHJ5Q291bnQrKztcbiAgICAgICAgaWYgKHJldHJ5Q291bnQgPj0gdGhpcy5jb25maWcucmV0cnlMaW1pdCkge1xuICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPVxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAncmVzcG9uc2UnIGluIGVycm9yXG4gICAgICAgICAgICAgID8gKChlcnJvciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXIgfSB9KS5yZXNwb25zZT8uc3RhdHVzID8/XG4gICAgICAgICAgICAgICAgREVGQVVMVF9IVFRQX1NUQVRVU19DT0RFKVxuICAgICAgICAgICAgICA6IERFRkFVTFRfSFRUUF9TVEFUVVNfQ09ERTtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgQU1DSHR0cEVycm9yKGBBTUMgcmVxdWVzdCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gLCBzdGF0dXNDb2RlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYWNrb2ZmID0gY2FsY3VsYXRlQmFja29mZihcbiAgICAgICAgICByZXRyeUNvdW50LFxuICAgICAgICAgIHRoaXMuY29uZmlnLnJldHJ5SW50ZXJ2YWwsXG4gICAgICAgICAgdGhpcy5jb25maWcuYmFja29mZkZhY3RvcixcbiAgICAgICAgICB0aGlzLmNvbmZpZy5tYXhCYWNrb2ZmXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHNsZWVwKGJhY2tvZmYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwKICAgICIvKipcbiAqIENsYXNzIGZvciBtYW5hZ2luZyBBTUMgcmVxdWVzdCBoZWFkZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBBTUNIZWFkZXIge1xuICBwcml2YXRlIGNvb2tpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHByaXZhdGUgY29udGVudFR5cGU6IHN0cmluZztcbiAgcHJpdmF0ZSB1c2VyQWdlbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWZlcmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gSGVhZGVyIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiB7IGNvbnRlbnRUeXBlPzogc3RyaW5nOyB1c2VyQWdlbnQ/OiBzdHJpbmc7IHJlZmVyZXI/OiBzdHJpbmcgfSkge1xuICAgIHRoaXMuY29udGVudFR5cGUgPSBvcHRpb25zPy5jb250ZW50VHlwZSA/PyAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04JztcbiAgICB0aGlzLnVzZXJBZ2VudCA9IG9wdGlvbnM/LnVzZXJBZ2VudCA/PyAnV2lraWRvdFRTJztcbiAgICB0aGlzLnJlZmVyZXIgPSBvcHRpb25zPy5yZWZlcmVyID8/ICdodHRwczovL3d3dy53aWtpZG90LmNvbS8nO1xuICAgIHRoaXMuY29va2llcyA9IG5ldyBNYXAoW1snd2lraWRvdF90b2tlbjcnLCAnMTIzNDU2J11dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBjb29raWVcbiAgICogQHBhcmFtIG5hbWUgLSBDb29raWUgbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgLSBDb29raWUgdmFsdWVcbiAgICovXG4gIHNldENvb2tpZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvb2tpZXMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBjb29raWVcbiAgICogQHBhcmFtIG5hbWUgLSBDb29raWUgbmFtZVxuICAgKi9cbiAgZGVsZXRlQ29va2llKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29va2llcy5kZWxldGUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgY29va2llXG4gICAqIEBwYXJhbSBuYW1lIC0gQ29va2llIG5hbWVcbiAgICogQHJldHVybnMgQ29va2llIHZhbHVlLCB1bmRlZmluZWQgaWYgbm90IGV4aXN0c1xuICAgKi9cbiAgZ2V0Q29va2llKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29va2llcy5nZXQobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEhUVFAgaGVhZGVycyBvYmplY3RcbiAgICogQHJldHVybnMgSGVhZGVycyBkaWN0aW9uYXJ5XG4gICAqL1xuICBnZXRIZWFkZXJzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IGNvb2tpZVN0cmluZyA9IEFycmF5LmZyb20odGhpcy5jb29raWVzLmVudHJpZXMoKSlcbiAgICAgIC5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+IGAke25hbWV9PSR7dmFsdWV9YClcbiAgICAgIC5qb2luKCc7ICcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICdDb250ZW50LVR5cGUnOiB0aGlzLmNvbnRlbnRUeXBlLFxuICAgICAgJ1VzZXItQWdlbnQnOiB0aGlzLnVzZXJBZ2VudCxcbiAgICAgIFJlZmVyZXI6IHRoaXMucmVmZXJlcixcbiAgICAgIENvb2tpZTogY29va2llU3RyaW5nLFxuICAgIH07XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbi8qKlxuICogQU1DIHJlcXVlc3QgYm9keSB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIEFNQ1JlcXVlc3RCb2R5VmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBudWxsXG4gIHwgdW5kZWZpbmVkXG4gIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgfCBBTUNSZXF1ZXN0Qm9keVZhbHVlW107XG5cbi8qKlxuICogQU1DIHJlcXVlc3QgYm9keSB0eXBlIGRlZmluaXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBTUNSZXF1ZXN0Qm9keSB7XG4gIG1vZHVsZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbj86IHN0cmluZztcbiAgZXZlbnQ/OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IEFNQ1JlcXVlc3RCb2R5VmFsdWU7XG59XG5cbi8qKlxuICogQU1DIHJlc3BvbnNlIGJhc2Ugc2NoZW1hXG4gKi9cbmNvbnN0IGJhc2VTY2hlbWE6IHouWm9kT2JqZWN0PHtcbiAgc3RhdHVzOiB6LlpvZFN0cmluZztcbiAgYm9keTogei5ab2RPcHRpb25hbDx6LlpvZFN0cmluZz47XG4gIG1lc3NhZ2U6IHouWm9kT3B0aW9uYWw8ei5ab2RTdHJpbmc+O1xufT4gPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5zdHJpbmcoKSxcbiAgYm9keTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBtZXNzYWdlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBBTUMgcmVzcG9uc2Ugc2NoZW1hXG4gKi9cbmV4cG9ydCBjb25zdCBhbWNSZXNwb25zZVNjaGVtYTogei5ab2RUeXBlPHouaW5mZXI8dHlwZW9mIGJhc2VTY2hlbWE+ICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID1cbiAgYmFzZVNjaGVtYS5wYXNzdGhyb3VnaCgpO1xuXG4vKipcbiAqIEFNQyByZXNwb25zZSB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIEFNQ1Jlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgYW1jUmVzcG9uc2VTY2hlbWE+O1xuXG4vKipcbiAqIFN1Y2Nlc3NmdWwgQU1DIHJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQU1DU3VjY2Vzc1Jlc3BvbnNlIHtcbiAgc3RhdHVzOiAnb2snO1xuICBib2R5OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBBTUMgcmVzcG9uc2UgaXMgc3VjY2Vzc2Z1bFxuICogQHBhcmFtIHJlc3BvbnNlIC0gQU1DIHJlc3BvbnNlXG4gKiBAcmV0dXJucyB0cnVlIGlmIHJlc3BvbnNlIGlzIHN1Y2Nlc3NmdWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3VjY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlOiBBTUNSZXNwb25zZSk6IHJlc3BvbnNlIGlzIEFNQ1N1Y2Nlc3NSZXNwb25zZSB7XG4gIHJldHVybiByZXNwb25zZS5zdGF0dXMgPT09ICdvayc7XG59XG4iLAogICAgImV4cG9ydCB7IEFNQ0NsaWVudCwgdHlwZSBBTUNSZXF1ZXN0T3B0aW9ucywgbWFza1NlbnNpdGl2ZURhdGEgfSBmcm9tICcuL2FtYy1jbGllbnQnO1xuZXhwb3J0IHsgdHlwZSBBTUNDb25maWcsIERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4vYW1jLWNvbmZpZyc7XG5leHBvcnQgeyBBTUNIZWFkZXIgfSBmcm9tICcuL2FtYy1oZWFkZXInO1xuZXhwb3J0IHtcbiAgdHlwZSBBTUNSZXF1ZXN0Qm9keSxcbiAgdHlwZSBBTUNSZXNwb25zZSxcbiAgdHlwZSBBTUNTdWNjZXNzUmVzcG9uc2UsXG4gIGFtY1Jlc3BvbnNlU2NoZW1hLFxuICBpc1N1Y2Nlc3NSZXNwb25zZSxcbn0gZnJvbSAnLi9hbWMtdHlwZXMnO1xuZXhwb3J0IHsgbG9naW4sIGxvZ291dCB9IGZyb20gJy4vYXV0aCc7XG4iLAogICAgImltcG9ydCB7IFNlc3Npb25DcmVhdGVFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLCB3ZE9rQXN5bmMgfSBmcm9tICcuLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBdXRoQ2xpZW50Q29udGV4dCB9IGZyb20gJy4uL21vZHVsZS90eXBlcyc7XG5pbXBvcnQgeyBmZXRjaFdpdGhSZXRyeSB9IGZyb20gJy4uL3V0aWwvaHR0cCc7XG5pbXBvcnQgeyBERUZBVUxUX0FNQ19DT05GSUcgfSBmcm9tICcuL2FtYy1jb25maWcnO1xuXG5jb25zdCBMT0dJTl9VUkwgPSAnaHR0cHM6Ly93d3cud2lraWRvdC5jb20vZGVmYXVsdC0tZmxvdy9sb2dpbl9fTG9naW5Qb3B1cFNjcmVlbic7XG5cbi8qKiBMb2dpbiByZXRyeSBsaW1pdCAocmVkdWNlZCB0byBwcmV2ZW50IGFjY291bnQgbG9ja291dCkgKi9cbmNvbnN0IExPR0lOX1JFVFJZX0xJTUlUID0gMztcblxuLyoqXG4gKiBMb2dpbiB0byBXaWtpZG90IHdpdGggdXNlcm5hbWUgYW5kIHBhc3N3b3JkXG4gKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50IGNvbnRleHQgKG9iamVjdCB3aXRoIEFNQ0NsaWVudClcbiAqIEBwYXJhbSB1c2VybmFtZSAtIFVzZXJuYW1lXG4gKiBAcGFyYW0gcGFzc3dvcmQgLSBQYXNzd29yZFxuICogQHJldHVybnMgdm9pZCBvbiBzdWNjZXNzLCBTZXNzaW9uQ3JlYXRlRXJyb3Igb24gZmFpbHVyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9naW4oXG4gIGNsaWVudDogQXV0aENsaWVudENvbnRleHQsXG4gIHVzZXJuYW1lOiBzdHJpbmcsXG4gIHBhc3N3b3JkOiBzdHJpbmdcbik6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgbG9naW46IHVzZXJuYW1lLFxuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXG4gICAgICAgIGFjdGlvbjogJ0xvZ2luMkFjdGlvbicsXG4gICAgICAgIGV2ZW50OiAnbG9naW4nLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFVzZSByZWR1Y2VkIHJldHJ5IGxpbWl0IGZvciBsb2dpbiB0byBwcmV2ZW50IGFjY291bnQgbG9ja291dFxuICAgICAgY29uc3QgbG9naW5Db25maWcgPSB7XG4gICAgICAgIC4uLkRFRkFVTFRfQU1DX0NPTkZJRyxcbiAgICAgICAgcmV0cnlMaW1pdDogTE9HSU5fUkVUUllfTElNSVQsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeShMT0dJTl9VUkwsIGxvZ2luQ29uZmlnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgIGJvZHk6IGZvcm1EYXRhLnRvU3RyaW5nKCksXG4gICAgICAgIGNoZWNrT2s6IGZhbHNlLCAvLyBIYW5kbGUgSFRUUCBlcnJvcnMgbWFudWFsbHkgZm9yIGJldHRlciBlcnJvciBtZXNzYWdlc1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENoZWNrIHN0YXR1cyBjb2RlXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXNzaW9uQ3JlYXRlRXJyb3IoXG4gICAgICAgICAgYExvZ2luIGF0dGVtcHQgZmFpbGVkIGR1ZSB0byBIVFRQIHN0YXR1cyBjb2RlOiAke3Jlc3BvbnNlLnN0YXR1c31gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGJvZHkgZm9yIGVycm9yIG1lc3NhZ2VcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICBpZiAoYm9keS5pbmNsdWRlcygnVGhlIGxvZ2luIGFuZCBwYXNzd29yZCBkbyBub3QgbWF0Y2gnKSkge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKCdMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gaW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBjb29raWVzXG4gICAgICBjb25zdCBjb29raWVzID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ1NldC1Db29raWUnKTtcbiAgICAgIGlmICghY29va2llcykge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKCdMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gbWlzc2luZyBjb29raWVzJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3QgV0lLSURPVF9TRVNTSU9OX0lEIGZyb20gY29va2llc1xuICAgICAgY29uc3Qgc2Vzc2lvbklkTWF0Y2ggPSBjb29raWVzLm1hdGNoKC9XSUtJRE9UX1NFU1NJT05fSUQ9KFteO10rKS8pO1xuICAgICAgaWYgKCFzZXNzaW9uSWRNYXRjaD8uWzFdKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXNzaW9uQ3JlYXRlRXJyb3IoXG4gICAgICAgICAgJ0xvZ2luIGF0dGVtcHQgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIFdJS0lET1RfU0VTU0lPTl9JRCBjb29raWUnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBzZXNzaW9uIGNvb2tpZVxuICAgICAgY2xpZW50LmFtY0NsaWVudC5oZWFkZXIuc2V0Q29va2llKCdXSUtJRE9UX1NFU1NJT05fSUQnLCBzZXNzaW9uSWRNYXRjaFsxXSk7XG4gICAgfSkoKSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlc3Npb25DcmVhdGVFcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFNlc3Npb25DcmVhdGVFcnJvcihgTG9naW4gZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIExvZ291dCBmcm9tIFdpa2lkb3RcbiAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnQgY29udGV4dCAob2JqZWN0IHdpdGggQU1DQ2xpZW50KVxuICogQHJldHVybnMgdm9pZCBvbiBzdWNjZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dvdXQoY2xpZW50OiBBdXRoQ2xpZW50Q29udGV4dCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gIC8vIFRyeSB0byBsb2dvdXQgdmlhIEFNQywgdGhlbiBhbHdheXMgcmVtb3ZlIHNlc3Npb24gY29va2llXG4gIHJldHVybiBjbGllbnQuYW1jQ2xpZW50XG4gICAgLnJlcXVlc3QoW1xuICAgICAge1xuICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICBhY3Rpb246ICdMb2dpbjJBY3Rpb24nLFxuICAgICAgICBldmVudDogJ2xvZ291dCcsXG4gICAgICB9LFxuICAgIF0pXG4gICAgLm1hcCgoKSA9PiB7XG4gICAgICAvLyBMb2dvdXQgc3VjY2VlZGVkLCByZW1vdmUgc2Vzc2lvbiBjb29raWVcbiAgICAgIGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLmRlbGV0ZUNvb2tpZSgnV0lLSURPVF9TRVNTSU9OX0lEJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pXG4gICAgLm9yRWxzZSgoKSA9PiB7XG4gICAgICAvLyBFdmVuIGlmIGxvZ291dCByZXF1ZXN0IGZhaWxzLCB3ZSBzdGlsbCB3YW50IHRvIGNsZWFyIHRoZSBzZXNzaW9uIGxvY2FsbHlcbiAgICAgIGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLmRlbGV0ZUNvb2tpZSgnV0lLSURPVF9TRVNTSU9OX0lEJyk7XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKHVuZGVmaW5lZCk7XG4gICAgfSk7XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTG9naW5SZXF1aXJlZEVycm9yLFxuICBOb0VsZW1lbnRFcnJvcixcbiAgVW5leHBlY3RlZEVycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSAnLi4vdXNlci91c2VyJztcblxuLyoqXG4gKiBQcml2YXRlIG1lc3NhZ2UgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVNZXNzYWdlRGF0YSB7XG4gIGNsaWVudDogQ2xpZW50O1xuICBpZDogbnVtYmVyO1xuICBzZW5kZXI6IEFic3RyYWN0VXNlcjtcbiAgcmVjaXBpZW50OiBBYnN0cmFjdFVzZXI7XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgYm9keTogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IERhdGU7XG59XG5cbi8qKlxuICogUHJpdmF0ZSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBQcml2YXRlTWVzc2FnZSB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBzZW5kZXI6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IHJlY2lwaWVudDogQWJzdHJhY3RVc2VyO1xuICBwdWJsaWMgcmVhZG9ubHkgc3ViamVjdDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgYm9keTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0OiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFByaXZhdGVNZXNzYWdlRGF0YSkge1xuICAgIHRoaXMuY2xpZW50ID0gZGF0YS5jbGllbnQ7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy5zZW5kZXIgPSBkYXRhLnNlbmRlcjtcbiAgICB0aGlzLnJlY2lwaWVudCA9IGRhdGEucmVjaXBpZW50O1xuICAgIHRoaXMuc3ViamVjdCA9IGRhdGEuc3ViamVjdDtcbiAgICB0aGlzLmJvZHkgPSBkYXRhLmJvZHk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVzc2FnZSBieSBtZXNzYWdlIElEXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIE1lc3NhZ2UgSURcbiAgICogQHJldHVybnMgUHJpdmF0ZSBtZXNzYWdlXG4gICAqL1xuICBzdGF0aWMgZnJvbUlkKGNsaWVudDogQ2xpZW50LCBtZXNzYWdlSWQ6IG51bWJlcik6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5mcm9tSWRzKGNsaWVudCwgW21lc3NhZ2VJZF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBNZXNzYWdlIG5vdCBmb3VuZDogJHttZXNzYWdlSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVzc2FnZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBwcml2YXRlIG1lc3NhZ2VcbiAgICogQHBhcmFtIGNsaWVudCAtIENsaWVudCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gcmVjaXBpZW50IC0gUmVjaXBpZW50XG4gICAqIEBwYXJhbSBzdWJqZWN0IC0gU3ViamVjdFxuICAgKiBAcGFyYW0gYm9keSAtIEJvZHlcbiAgICovXG4gIHN0YXRpYyBzZW5kKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIHJlY2lwaWVudDogVXNlcixcbiAgICBzdWJqZWN0OiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBjbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBzZW5kIG1lc3NhZ2UnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuYW1jQ2xpZW50LnJlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZTogYm9keSxcbiAgICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgICB0b191c2VyX2lkOiByZWNpcGllbnQuaWQsXG4gICAgICAgICAgICBhY3Rpb246ICdEYXNoYm9hcmRNZXNzYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2VuZCcsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZW5kIG1lc3NhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUHJpdmF0ZU1lc3NhZ2UoaWQ9JHt0aGlzLmlkfSwgc2VuZGVyPSR7dGhpcy5zZW5kZXJ9LCByZWNpcGllbnQ9JHt0aGlzLnJlY2lwaWVudH0sIHN1YmplY3Q9JHt0aGlzLnN1YmplY3R9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQcml2YXRlIG1lc3NhZ2UgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50O1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBtZXNzYWdlcz86IFByaXZhdGVNZXNzYWdlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIGlmIChtZXNzYWdlcykge1xuICAgICAgdGhpcy5wdXNoKC4uLm1lc3NhZ2VzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IFByaXZhdGVNZXNzYWdlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChtZXNzYWdlKSA9PiBtZXNzYWdlLmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lc3NhZ2VzIGZyb20gbGlzdCBvZiBtZXNzYWdlIElEc1xuICAgKi9cbiAgc3RhdGljIGZyb21JZHMoXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgbWVzc2FnZUlkczogbnVtYmVyW11cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gZ2V0IG1lc3NhZ2VzJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYm9kaWVzID0gbWVzc2FnZUlkcy5tYXAoKG1lc3NhZ2VJZCkgPT4gKHtcbiAgICAgICAgICBpdGVtOiBtZXNzYWdlSWQsXG4gICAgICAgICAgbW9kdWxlTmFtZTogJ2Rhc2hib2FyZC9tZXNzYWdlcy9ETVZpZXdNZXNzYWdlTW9kdWxlJyxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXNzYWdlczogUHJpdmF0ZU1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVzc2FnZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IG1lc3NhZ2VJZHNbaV07XG4gICAgICAgICAgaWYgKCFyZXNwb25zZSB8fCBtZXNzYWdlSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgICAvLyBHZXQgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgIGNvbnN0IHByaW50dXNlckVsZW1zID0gJCgnZGl2LnBtZXNzYWdlIGRpdi5oZWFkZXIgc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICBpZiAocHJpbnR1c2VyRWxlbXMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkVycm9yKGBGYWlsZWQgdG8gZ2V0IG1lc3NhZ2U6ICR7bWVzc2FnZUlkfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNlbmRlckVsZW0gPSAkKHByaW50dXNlckVsZW1zWzBdKTtcbiAgICAgICAgICBjb25zdCByZWNpcGllbnRFbGVtID0gJChwcmludHVzZXJFbGVtc1sxXSk7XG5cbiAgICAgICAgICBjb25zdCBzZW5kZXIgPSBwYXJzZVVzZXIoY2xpZW50LCBzZW5kZXJFbGVtKTtcbiAgICAgICAgICBjb25zdCByZWNpcGllbnQgPSBwYXJzZVVzZXIoY2xpZW50LCByZWNpcGllbnRFbGVtKTtcblxuICAgICAgICAgIC8vIFN1YmplY3RcbiAgICAgICAgICBjb25zdCBzdWJqZWN0RWxlbSA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuaGVhZGVyIHNwYW4uc3ViamVjdCcpO1xuICAgICAgICAgIGNvbnN0IHN1YmplY3QgPSBzdWJqZWN0RWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gQm9keVxuICAgICAgICAgIGNvbnN0IGJvZHlFbGVtID0gJCgnZGl2LnBtZXNzYWdlIGRpdi5ib2R5Jyk7XG4gICAgICAgICAgY29uc3QgYm9keSA9IGJvZHlFbGVtLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICAvLyBUaW1lc3RhbXBcbiAgICAgICAgICBjb25zdCBvZGF0ZUVsZW0gPSAkKCdkaXYuaGVhZGVyIHNwYW4ub2RhdGUnKTtcbiAgICAgICAgICBjb25zdCBjcmVhdGVkQXQgPVxuICAgICAgICAgICAgb2RhdGVFbGVtLmxlbmd0aCA+IDAgPyAocGFyc2VPZGF0ZShvZGF0ZUVsZW0pID8/IG5ldyBEYXRlKDApKSA6IG5ldyBEYXRlKDApO1xuXG4gICAgICAgICAgbWVzc2FnZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBQcml2YXRlTWVzc2FnZSh7XG4gICAgICAgICAgICAgIGNsaWVudCxcbiAgICAgICAgICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgc2VuZGVyLFxuICAgICAgICAgICAgICByZWNpcGllbnQsXG4gICAgICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uKGNsaWVudCwgbWVzc2FnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBtZXNzYWdlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGdldCBtZXNzYWdlcyBmcm9tIG1vZHVsZVxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBhY3F1aXJlRnJvbU1vZHVsZShcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICBtb2R1bGVOYW1lOiBzdHJpbmdcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gZ2V0IG1lc3NhZ2VzJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gR2V0IHBhZ2VyXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gYXdhaXQgY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0KFt7IG1vZHVsZU5hbWUgfV0pO1xuICAgICAgICBpZiAoZmlyc3RSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IGZpcnN0UmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIWZpcnN0UmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEh0bWwgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0SHRtbCk7XG5cbiAgICAgICAgLy8gR2V0IHBhZ2UgY291bnRcbiAgICAgICAgY29uc3QgcGFnZXJUYXJnZXRzID0gJGZpcnN0KCdkaXYucGFnZXIgc3Bhbi50YXJnZXQnKTtcbiAgICAgICAgbGV0IG1heFBhZ2UgPSAxO1xuICAgICAgICBpZiAocGFnZXJUYXJnZXRzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICBjb25zdCBsYXN0UGFnZVRleHQgPSAkZmlyc3QocGFnZXJUYXJnZXRzW3BhZ2VyVGFyZ2V0cy5sZW5ndGggLSAyXSlcbiAgICAgICAgICAgIC50ZXh0KClcbiAgICAgICAgICAgIC50cmltKCk7XG4gICAgICAgICAgbWF4UGFnZSA9IE51bWJlci5wYXJzZUludChsYXN0UGFnZVRleHQsIDEwKSB8fCAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IG1lc3NhZ2UgSURzIGZyb20gYWxsIHBhZ2VzXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJZHM6IG51bWJlcltdID0gW107XG5cbiAgICAgICAgaWYgKG1heFBhZ2UgPiAxKSB7XG4gICAgICAgICAgY29uc3QgYm9kaWVzID0gW107XG4gICAgICAgICAgZm9yIChsZXQgcGFnZSA9IDE7IHBhZ2UgPD0gbWF4UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgICBib2RpZXMucHVzaCh7IHBhZ2UsIG1vZHVsZU5hbWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0KGJvZGllcyk7XG4gICAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IGFkZGl0aW9uYWxSZXN1bHRzLmVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcbiAgICAgICAgICAgICQoJ3RyLm1lc3NhZ2UnKS5lYWNoKChfaSwgZWxlbSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBkYXRhSHJlZiA9ICQoZWxlbSkuYXR0cignZGF0YS1ocmVmJykgPz8gJyc7XG4gICAgICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBkYXRhSHJlZi5tYXRjaCgvXFwvKFxcZCspJC8pO1xuICAgICAgICAgICAgICBpZiAoaWRNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkcy5wdXNoKE51bWJlci5wYXJzZUludChpZE1hdGNoWzFdLCAxMCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGZpcnN0KCd0ci5tZXNzYWdlJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFIcmVmID0gJGZpcnN0KGVsZW0pLmF0dHIoJ2RhdGEtaHJlZicpID8/ICcnO1xuICAgICAgICAgICAgY29uc3QgaWRNYXRjaCA9IGRhdGFIcmVmLm1hdGNoKC9cXC8oXFxkKykkLyk7XG4gICAgICAgICAgICBpZiAoaWRNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2VJZHMucHVzaChOdW1iZXIucGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBtZXNzYWdlc1xuICAgICAgICBjb25zdCBtZXNzYWdlc1Jlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5mcm9tSWRzKGNsaWVudCwgbWVzc2FnZUlkcyk7XG4gICAgICAgIGlmIChtZXNzYWdlc1Jlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgbWVzc2FnZXNSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVzc2FnZXNSZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IgfHxcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgbWVzc2FnZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogSW5ib3hcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlSW5ib3ggZXh0ZW5kcyBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24ge1xuICAvKipcbiAgICogR2V0IGFsbCBtZXNzYWdlcyBpbiBpbmJveFxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUoY2xpZW50OiBDbGllbnQpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2VJbmJveD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5hY3F1aXJlRnJvbU1vZHVsZShcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgJ2Rhc2hib2FyZC9tZXNzYWdlcy9ETUluYm94TW9kdWxlJ1xuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5ib3ggPSBuZXcgUHJpdmF0ZU1lc3NhZ2VJbmJveChjbGllbnQpO1xuICAgICAgICBpbmJveC5wdXNoKC4uLnJlc3VsdC52YWx1ZSk7XG4gICAgICAgIHJldHVybiBpbmJveDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIGluYm94OiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFNlbnQgYm94XG4gKi9cbmV4cG9ydCBjbGFzcyBQcml2YXRlTWVzc2FnZVNlbnRCb3ggZXh0ZW5kcyBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24ge1xuICAvKipcbiAgICogR2V0IGFsbCBtZXNzYWdlcyBpbiBzZW50IGJveFxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUoY2xpZW50OiBDbGllbnQpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2VTZW50Qm94PiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uLmFjcXVpcmVGcm9tTW9kdWxlKFxuICAgICAgICAgIGNsaWVudCxcbiAgICAgICAgICAnZGFzaGJvYXJkL21lc3NhZ2VzL0RNU2VudE1vZHVsZSdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbnRCb3ggPSBuZXcgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94KGNsaWVudCk7XG4gICAgICAgIHNlbnRCb3gucHVzaCguLi5yZXN1bHQudmFsdWUpO1xuICAgICAgICByZXR1cm4gc2VudEJveDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHNlbnQgYm94OiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQge1xuICBQcml2YXRlTWVzc2FnZSxcbiAgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uLFxuICBQcml2YXRlTWVzc2FnZUluYm94LFxuICBQcml2YXRlTWVzc2FnZVNlbnRCb3gsXG59IGZyb20gJy4uLy4uL3ByaXZhdGUtbWVzc2FnZSc7XG5pbXBvcnQgdHlwZSB7IFVzZXIgfSBmcm9tICcuLi8uLi91c2VyL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuXG4vKipcbiAqIFByaXZhdGUgbWVzc2FnZSBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEdldCBpbmJveFxuICogY29uc3QgaW5ib3hSZXN1bHQgPSBhd2FpdCBjbGllbnQucHJpdmF0ZU1lc3NhZ2UuaW5ib3goKTtcbiAqIGlmICghaW5ib3hSZXN1bHQuaXNPaygpKSB7XG4gKiAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBpbmJveCcpO1xuICogfVxuICogY29uc3QgaW5ib3ggPSBpbmJveFJlc3VsdC52YWx1ZTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2VBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZXNzYWdlIGJ5IG1lc3NhZ2UgSURcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gTWVzc2FnZSBJRFxuICAgKiBAcmV0dXJucyBNZXNzYWdlIG9iamVjdCB3cmFwcGVkIGluIFJlc3VsdCB0eXBlXG4gICAqL1xuICBnZXQoaWQ6IG51bWJlcik6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZT4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZS5mcm9tSWQodGhpcy5jbGllbnQsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVzc2FnZXMgZnJvbSBtdWx0aXBsZSBtZXNzYWdlIElEc1xuICAgKiBAcGFyYW0gaWRzIC0gQXJyYXkgb2YgbWVzc2FnZSBJRHNcbiAgICogQHJldHVybnMgTWVzc2FnZSBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRNZXNzYWdlcyhpZHM6IG51bWJlcltdKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyh0aGlzLmNsaWVudCwgaWRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaW5ib3ggbWVzc2FnZSBsaXN0XG4gICAqIEByZXR1cm5zIEluYm94XG4gICAqL1xuICBpbmJveCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2VJbmJveD4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZUluYm94LmFjcXVpcmUodGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZW50IGJveCBtZXNzYWdlIGxpc3RcbiAgICogQHJldHVybnMgU2VudCBib3hcbiAgICovXG4gIHNlbnRCb3goKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlU2VudEJveD4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZVNlbnRCb3guYWNxdWlyZSh0aGlzLmNsaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIHByaXZhdGUgbWVzc2FnZVxuICAgKiBAcGFyYW0gcmVjaXBpZW50IC0gUmVjaXBpZW50XG4gICAqIEBwYXJhbSBzdWJqZWN0IC0gU3ViamVjdFxuICAgKiBAcGFyYW0gYm9keSAtIEJvZHlcbiAgICovXG4gIHNlbmQocmVjaXBpZW50OiBVc2VyLCBzdWJqZWN0OiBzdHJpbmcsIGJvZHk6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFByaXZhdGVNZXNzYWdlLnNlbmQodGhpcy5jbGllbnQsIHJlY2lwaWVudCwgc3ViamVjdCwgYm9keSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUHJpdmF0ZU1lc3NhZ2UsIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbiwgUHJpdmF0ZU1lc3NhZ2VJbmJveCwgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94IH07XG4iLAogICAgImltcG9ydCB0eXBlIHsgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7XG4gIEZvcnVtQ2F0ZWdvcnksXG4gIEZvcnVtQ2F0ZWdvcnlDb2xsZWN0aW9uLFxuICBGb3J1bVBvc3QsXG4gIEZvcnVtVGhyZWFkLFxuICBGb3J1bVRocmVhZENvbGxlY3Rpb24sXG59IGZyb20gJy4uLy4uL2ZvcnVtJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuXG4vKipcbiAqIEZvcnVtIG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcnVtQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlKSB7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZm9ydW0gY2F0ZWdvcnkgbGlzdFxuICAgKiBAcmV0dXJucyBDYXRlZ29yeSBsaXN0XG4gICAqL1xuICBnZXRDYXRlZ29yaWVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbi5hY3F1aXJlQWxsKHRoaXMuc2l0ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRocmVhZFxuICAgKiBAcGFyYW0gdGhyZWFkSWQgLSBUaHJlYWQgSURcbiAgICogQHJldHVybnMgVGhyZWFkXG4gICAqL1xuICBnZXRUaHJlYWQodGhyZWFkSWQ6IG51bWJlcik6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBGb3J1bVRocmVhZC5nZXRGcm9tSWQodGhpcy5zaXRlLCB0aHJlYWRJZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG11bHRpcGxlIHRocmVhZHNcbiAgICogQHBhcmFtIHRocmVhZElkcyAtIEFycmF5IG9mIHRocmVhZCBJRHNcbiAgICogQHJldHVybnMgVGhyZWFkIGNvbGxlY3Rpb25cbiAgICovXG4gIGdldFRocmVhZHModGhyZWFkSWRzOiBudW1iZXJbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZENvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVGcm9tVGhyZWFkSWRzKHRoaXMuc2l0ZSwgdGhyZWFkSWRzKTtcbiAgfVxufVxuXG5leHBvcnQgeyBGb3J1bUNhdGVnb3J5LCBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbiwgRm9ydW1UaHJlYWQsIEZvcnVtVGhyZWFkQ29sbGVjdGlvbiwgRm9ydW1Qb3N0IH07XG4iLAogICAgImltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgVGFyZ2V0RXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdFN0YXR1c0Vycm9yLFxufSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyB0eXBlIFFNQ1VzZXIsIFF1aWNrTW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9xdWljay1tb2R1bGUnO1xuaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSAnLi4vLi4vdXNlci91c2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHsgU2l0ZUFwcGxpY2F0aW9uIH0gZnJvbSAnLi4vc2l0ZS1hcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBTaXRlTWVtYmVyIH0gZnJvbSAnLi4vc2l0ZS1tZW1iZXInO1xuXG4vKipcbiAqIFNpdGUgbWVtYmVyIG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIE1lbWJlckFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBtZW1iZXJzXG4gICAqIEByZXR1cm5zIE1lbWJlciBsaXN0XG4gICAqL1xuICBnZXRBbGwoKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVNZW1iZXJbXT4ge1xuICAgIHJldHVybiBTaXRlTWVtYmVyLmdldE1lbWJlcnModGhpcy5zaXRlLCAnJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1vZGVyYXRvciBsaXN0XG4gICAqIEByZXR1cm5zIE1vZGVyYXRvciBsaXN0XG4gICAqL1xuICBnZXRNb2RlcmF0b3JzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJ21vZGVyYXRvcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWRtaW4gbGlzdFxuICAgKiBAcmV0dXJucyBBZG1pbiBsaXN0XG4gICAqL1xuICBnZXRBZG1pbnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVNZW1iZXJbXT4ge1xuICAgIHJldHVybiBTaXRlTWVtYmVyLmdldE1lbWJlcnModGhpcy5zaXRlLCAnYWRtaW5zJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBlbmRpbmcgbWVtYmVyc2hpcCBhcHBsaWNhdGlvbnNcbiAgICogQHJldHVybnMgQXBwbGljYXRpb24gbGlzdFxuICAgKi9cbiAgZ2V0QXBwbGljYXRpb25zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlQXBwbGljYXRpb25bXT4ge1xuICAgIHJldHVybiBTaXRlQXBwbGljYXRpb24uYWNxdWlyZUFsbCh0aGlzLnNpdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBtZW1iZXJzXG4gICAqIEBwYXJhbSBxdWVyeSAtIFNlYXJjaCBxdWVyeSAocGFydCBvZiB1c2VybmFtZSlcbiAgICogQHJldHVybnMgTWF0Y2hlZCB1c2VyIGxpc3QgKFFNQ1VzZXIgZm9ybWF0KVxuICAgKi9cbiAgbG9va3VwKHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gICAgcmV0dXJuIFF1aWNrTW9kdWxlLm1lbWJlckxvb2t1cCh0aGlzLnNpdGUuaWQsIHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZpdGUgdXNlciB0byBzaXRlXG4gICAqIEBwYXJhbSB1c2VyIC0gVXNlciB0byBpbnZpdGVcbiAgICogQHBhcmFtIHRleHQgLSBJbnZpdGF0aW9uIG1lc3NhZ2VcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgaW52aXRlKHVzZXI6IFVzZXIsIHRleHQ6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ01hbmFnZVNpdGVNZW1iZXJzaGlwQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnaW52aXRlTWVtYmVyJyxcbiAgICAgICAgICAgIHVzZXJfaWQ6IHVzZXIuaWQsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdFN0YXR1c0Vycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ2FscmVhZHlfaW52aXRlZCcpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldEVycm9yKFxuICAgICAgICAgICAgICAgIGBVc2VyIGlzIGFscmVhZHkgaW52aXRlZCB0byAke3RoaXMuc2l0ZS51bml4TmFtZX06ICR7dXNlci5uYW1lfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSAnYWxyZWFkeV9tZW1iZXInKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5IGEgbWVtYmVyIG9mICR7dGhpcy5zaXRlLnVuaXhOYW1lfTogJHt1c2VyLm5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUYXJnZXRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGludml0ZSB1c2VyOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTaXRlTWVtYmVyLCBTaXRlQXBwbGljYXRpb24gfTtcbiIsCiAgICAiLyoqXG4gKiBRdWlja01vZHVsZSAtIFdpa2lkb3QgbGlnaHR3ZWlnaHQgQVBJXG4gKlxuICogU2VhcmNoIGZ1bmN0aW9uYWxpdHkgdXNpbmcgcXVpY2ttb2R1bGUucGhwIGVuZHBvaW50XG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBOb3RGb3VuZEV4Y2VwdGlvbiwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgREVGQVVMVF9BTUNfQ09ORklHIH0gZnJvbSAnLi4vY29ubmVjdG9yL2FtYy1jb25maWcnO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuL2h0dHAnO1xuXG4vKipcbiAqIFF1aWNrTW9kdWxlIG1vZHVsZSBuYW1lXG4gKi9cbmV4cG9ydCB0eXBlIFF1aWNrTW9kdWxlTmFtZSA9ICdNZW1iZXJMb29rdXBRTW9kdWxlJyB8ICdVc2VyTG9va3VwUU1vZHVsZScgfCAnUGFnZUxvb2t1cFFNb2R1bGUnO1xuXG4vKipcbiAqIFF1aWNrTW9kdWxlIHVzZXIgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRTUNVc2VyIHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFF1aWNrTW9kdWxlIHBhZ2UgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRTUNQYWdlIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgdW5peE5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZSByZXNwb25zZSBzY2hlbWFcbiAqL1xuY29uc3QgcXVpY2tNb2R1bGVVc2VyUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHVzZXJzOiB6LnVuaW9uKFtcbiAgICB6LmFycmF5KFxuICAgICAgei5vYmplY3Qoe1xuICAgICAgICB1c2VyX2lkOiB6LnVuaW9uKFt6LnN0cmluZygpLCB6Lm51bWJlcigpXSksXG4gICAgICAgIG5hbWU6IHouc3RyaW5nKCksXG4gICAgICB9KVxuICAgICksXG4gICAgei5saXRlcmFsKGZhbHNlKSxcbiAgXSksXG59KTtcblxuY29uc3QgcXVpY2tNb2R1bGVQYWdlUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHBhZ2VzOiB6LnVuaW9uKFtcbiAgICB6LmFycmF5KFxuICAgICAgei5vYmplY3Qoe1xuICAgICAgICB0aXRsZTogei5zdHJpbmcoKSxcbiAgICAgICAgdW5peF9uYW1lOiB6LnN0cmluZygpLFxuICAgICAgfSlcbiAgICApLFxuICAgIHoubGl0ZXJhbChmYWxzZSksXG4gIF0pLFxufSk7XG5cbi8qKlxuICogU2VuZCByZXF1ZXN0IHRvIFF1aWNrTW9kdWxlIGVuZHBvaW50XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RRdWlja01vZHVsZShcbiAgbW9kdWxlTmFtZTogUXVpY2tNb2R1bGVOYW1lLFxuICBzaXRlSWQ6IG51bWJlcixcbiAgcXVlcnk6IHN0cmluZ1xuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy53aWtpZG90LmNvbS9xdWlja21vZHVsZS5waHA/bW9kdWxlPSR7bW9kdWxlTmFtZX0mcz0ke3NpdGVJZH0mcT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9YDtcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoV2l0aFJldHJ5KHVybCwgREVGQVVMVF9BTUNfQ09ORklHLCB7XG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB9LFxuICAgIGNoZWNrT2s6IGZhbHNlLCAvLyBIYW5kbGUgSFRUUCBlcnJvcnMgbWFudWFsbHlcbiAgfSk7XG5cbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNTAwKSB7XG4gICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBTaXRlIG5vdCBmb3VuZDogc2l0ZUlkPSR7c2l0ZUlkfWApO1xuICB9XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFF1aWNrTW9kdWxlIHJlcXVlc3QgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZS5qc29uKCk7XG59XG5cbi8qKlxuICogU2VhcmNoIHNpdGUgbWVtYmVyc1xuICogQHBhcmFtIHNpdGVJZCAtIFNpdGUgSURcbiAqIEBwYXJhbSBxdWVyeSAtIFNlYXJjaCBxdWVyeSAocGFydGlhbCB1c2VybmFtZSlcbiAqIEByZXR1cm5zIExpc3Qgb2YgbWF0Y2hpbmcgdXNlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbWJlckxvb2t1cChzaXRlSWQ6IG51bWJlciwgcXVlcnk6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxRTUNVc2VyW10+IHtcbiAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVxdWVzdFF1aWNrTW9kdWxlKCdNZW1iZXJMb29rdXBRTW9kdWxlJywgc2l0ZUlkLCBxdWVyeSk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBxdWlja01vZHVsZVVzZXJSZXNwb25zZVNjaGVtYS5wYXJzZShkYXRhKTtcblxuICAgICAgaWYgKHBhcnNlZC51c2VycyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkLnVzZXJzLm1hcCgodXNlcikgPT4gKHtcbiAgICAgICAgaWQ6IHR5cGVvZiB1c2VyLnVzZXJfaWQgPT09ICdzdHJpbmcnID8gTnVtYmVyLnBhcnNlSW50KHVzZXIudXNlcl9pZCwgMTApIDogdXNlci51c2VyX2lkLFxuICAgICAgICBuYW1lOiB1c2VyLm5hbWUsXG4gICAgICB9KSk7XG4gICAgfSkoKSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgTWVtYmVyIGxvb2t1cCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogU2VhcmNoIHVzZXJzIGFjcm9zcyBhbGwgV2lraWRvdFxuICogQHBhcmFtIHNpdGVJZCAtIFNpdGUgSUQgKGFueSBzaXRlIElEIHdvcmtzKVxuICogQHBhcmFtIHF1ZXJ5IC0gU2VhcmNoIHF1ZXJ5IChwYXJ0aWFsIHVzZXJuYW1lKVxuICogQHJldHVybnMgTGlzdCBvZiBtYXRjaGluZyB1c2Vyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlckxvb2t1cChzaXRlSWQ6IG51bWJlciwgcXVlcnk6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxRTUNVc2VyW10+IHtcbiAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVxdWVzdFF1aWNrTW9kdWxlKCdVc2VyTG9va3VwUU1vZHVsZScsIHNpdGVJZCwgcXVlcnkpO1xuICAgICAgY29uc3QgcGFyc2VkID0gcXVpY2tNb2R1bGVVc2VyUmVzcG9uc2VTY2hlbWEucGFyc2UoZGF0YSk7XG5cbiAgICAgIGlmIChwYXJzZWQudXNlcnMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZC51c2Vycy5tYXAoKHVzZXIpID0+ICh7XG4gICAgICAgIGlkOiB0eXBlb2YgdXNlci51c2VyX2lkID09PSAnc3RyaW5nJyA/IE51bWJlci5wYXJzZUludCh1c2VyLnVzZXJfaWQsIDEwKSA6IHVzZXIudXNlcl9pZCxcbiAgICAgICAgbmFtZTogdXNlci5uYW1lLFxuICAgICAgfSkpO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYFVzZXIgbG9va3VwIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBTZWFyY2ggcGFnZXMgd2l0aGluIHNpdGVcbiAqIEBwYXJhbSBzaXRlSWQgLSBTaXRlIElEXG4gKiBAcGFyYW0gcXVlcnkgLSBTZWFyY2ggcXVlcnkgKHBhcnRpYWwgcGFnZSBuYW1lKVxuICogQHJldHVybnMgTGlzdCBvZiBtYXRjaGluZyBwYWdlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFnZUxvb2t1cChzaXRlSWQ6IG51bWJlciwgcXVlcnk6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxRTUNQYWdlW10+IHtcbiAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVxdWVzdFF1aWNrTW9kdWxlKCdQYWdlTG9va3VwUU1vZHVsZScsIHNpdGVJZCwgcXVlcnkpO1xuICAgICAgY29uc3QgcGFyc2VkID0gcXVpY2tNb2R1bGVQYWdlUmVzcG9uc2VTY2hlbWEucGFyc2UoZGF0YSk7XG5cbiAgICAgIGlmIChwYXJzZWQucGFnZXMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZC5wYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgIHRpdGxlOiBwYWdlLnRpdGxlLFxuICAgICAgICB1bml4TmFtZTogcGFnZS51bml4X25hbWUsXG4gICAgICB9KSk7XG4gICAgfSkoKSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgUGFnZSBsb29rdXAgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFF1aWNrTW9kdWxlIEFQSSAobWFpbnRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpXG4gKiBAZGVwcmVjYXRlZCBVc2UgaW5kaXZpZHVhbCBmdW5jdGlvbnMgKG1lbWJlckxvb2t1cCwgdXNlckxvb2t1cCwgcGFnZUxvb2t1cCkgaW5zdGVhZFxuICovXG5leHBvcnQgY29uc3QgUXVpY2tNb2R1bGU6IHtcbiAgbWVtYmVyTG9va3VwOiB0eXBlb2YgbWVtYmVyTG9va3VwO1xuICB1c2VyTG9va3VwOiB0eXBlb2YgdXNlckxvb2t1cDtcbiAgcGFnZUxvb2t1cDogdHlwZW9mIHBhZ2VMb29rdXA7XG59ID0ge1xuICBtZW1iZXJMb29rdXA6IG1lbWJlckxvb2t1cCxcbiAgdXNlckxvb2t1cDogdXNlckxvb2t1cCxcbiAgcGFnZUxvb2t1cDogcGFnZUxvb2t1cCxcbn07XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTG9naW5SZXF1aXJlZEVycm9yLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgVW5leHBlY3RlZEVycm9yLFxuICBXaWtpZG90U3RhdHVzRXJyb3IsXG59IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlVXNlciB9IGZyb20gJy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuL3NpdGUnO1xuXG4vKipcbiAqIFNpdGUgbWVtYmVyc2hpcCBhcHBsaWNhdGlvbiBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZUFwcGxpY2F0aW9uRGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNpdGUgbWVtYmVyc2hpcCBhcHBsaWNhdGlvblxuICovXG5leHBvcnQgY2xhc3MgU2l0ZUFwcGxpY2F0aW9uIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSB1c2VyOiBBYnN0cmFjdFVzZXI7XG4gIHB1YmxpYyByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogU2l0ZUFwcGxpY2F0aW9uRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgdGhpcy50ZXh0ID0gZGF0YS50ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcGVuZGluZyBtZW1iZXJzaGlwIGFwcGxpY2F0aW9uc1xuICAgKiBAcGFyYW0gc2l0ZSAtIFRhcmdldCBzaXRlXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbChzaXRlOiBTaXRlKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVBcHBsaWNhdGlvbltdPiB7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBzaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBhcHBsaWNhdGlvbnMnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHsgbW9kdWxlTmFtZTogJ21hbmFnZXNpdGUvTWFuYWdlU2l0ZU1lbWJlcnNBcHBsaWNhdGlvbnNNb2R1bGUnIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG5cbiAgICAgICAgLy8gUGVybWlzc2lvbiBjaGVja1xuICAgICAgICBpZiAoaHRtbC5pbmNsdWRlcygnV0lLSURPVC5wYWdlLmxpc3RlbmVycy5sb2dpbkNsaWNrKGV2ZW50KScpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkVycm9yKCdZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB0aGlzIHBhZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgIGNvbnN0IGFwcGxpY2F0aW9uczogU2l0ZUFwcGxpY2F0aW9uW10gPSBbXTtcblxuICAgICAgICBjb25zdCB1c2VyRWxlbWVudHMgPSAkKCdoMyBzcGFuLnByaW50dXNlcicpLnRvQXJyYXkoKTtcbiAgICAgICAgY29uc3QgdGV4dFdyYXBwZXJFbGVtZW50cyA9ICQoJ3RhYmxlJykudG9BcnJheSgpO1xuXG4gICAgICAgIGlmICh1c2VyRWxlbWVudHMubGVuZ3RoICE9PSB0ZXh0V3JhcHBlckVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoXG4gICAgICAgICAgICAnTGVuZ3RoIG9mIHVzZXJfZWxlbWVudHMgYW5kIHRleHRfd3JhcHBlcl9lbGVtZW50cyBhcmUgZGlmZmVyZW50J1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVzZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHVzZXJFbGVtZW50ID0gdXNlckVsZW1lbnRzW2ldO1xuICAgICAgICAgIGNvbnN0IHRleHRXcmFwcGVyRWxlbWVudCA9IHRleHRXcmFwcGVyRWxlbWVudHNbaV07XG5cbiAgICAgICAgICBpZiAoIXVzZXJFbGVtZW50IHx8ICF0ZXh0V3JhcHBlckVsZW1lbnQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgdXNlciA9IHBhcnNlVXNlcihzaXRlLmNsaWVudCwgJCh1c2VyRWxlbWVudCkpO1xuICAgICAgICAgIGNvbnN0IHRleHRFbGVtZW50ID0gJCh0ZXh0V3JhcHBlckVsZW1lbnQpLmZpbmQoJ3RkJykuZXEoMSk7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IHRleHRFbGVtZW50LnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICBhcHBsaWNhdGlvbnMucHVzaChuZXcgU2l0ZUFwcGxpY2F0aW9uKHsgc2l0ZSwgdXNlciwgdGV4dCB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXBwbGljYXRpb25zO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBhcHBsaWNhdGlvbnM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBwcm9jZXNzIGFwcGxpY2F0aW9uXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHByaXZhdGUgcHJvY2VzcyhhY3Rpb246ICdhY2NlcHQnIHwgJ2RlY2xpbmUnKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnTWFuYWdlU2l0ZU1lbWJlcnNoaXBBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdhY2NlcHRBcHBsaWNhdGlvbicsXG4gICAgICAgICAgICB1c2VyX2lkOiB0aGlzLnVzZXIuaWQsXG4gICAgICAgICAgICB0ZXh0OiBgeW91ciBhcHBsaWNhdGlvbiBoYXMgYmVlbiAke2FjdGlvbn1lZGAsXG4gICAgICAgICAgICB0eXBlOiBhY3Rpb24sXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90U3RhdHVzRXJyb3IgJiYgZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ25vX2FwcGxpY2F0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBBcHBsaWNhdGlvbiBub3QgZm91bmQ6ICR7dGhpcy51c2VyLm5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyBhcHBsaWNhdGlvbjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0IG1lbWJlcnNoaXAgYXBwbGljYXRpb25cbiAgICovXG4gIGFjY2VwdCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3MoJ2FjY2VwdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2xpbmUgbWVtYmVyc2hpcCBhcHBsaWNhdGlvblxuICAgKi9cbiAgZGVjbGluZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3MoJ2RlY2xpbmUnKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTaXRlQXBwbGljYXRpb24odXNlcj0ke3RoaXMudXNlci5uYW1lfSwgc2l0ZT0ke3RoaXMuc2l0ZS51bml4TmFtZX0sIHRleHQ9JHt0aGlzLnRleHR9KWA7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgVGFyZ2V0RXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdFN0YXR1c0Vycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi9zaXRlJztcblxuLyoqXG4gKiBTaXRlIG1lbWJlciBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZU1lbWJlckRhdGEge1xuICBzaXRlOiBTaXRlO1xuICB1c2VyOiBBYnN0cmFjdFVzZXI7XG4gIGpvaW5lZEF0OiBEYXRlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBTaXRlIG1lbWJlclxuICovXG5leHBvcnQgY2xhc3MgU2l0ZU1lbWJlciB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBwdWJsaWMgcmVhZG9ubHkgam9pbmVkQXQ6IERhdGUgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFNpdGVNZW1iZXJEYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMudXNlciA9IGRhdGEudXNlcjtcbiAgICB0aGlzLmpvaW5lZEF0ID0gZGF0YS5qb2luZWRBdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBtZW1iZXIgaW5mb3JtYXRpb24gZnJvbSBIVE1MXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwYXJzZShzaXRlOiBTaXRlLCBodG1sOiBzdHJpbmcpOiBTaXRlTWVtYmVyW10ge1xuICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgY29uc3QgbWVtYmVyczogU2l0ZU1lbWJlcltdID0gW107XG5cbiAgICAkKCd0YWJsZSB0cicpLmVhY2goKF9pLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IHRkcyA9ICQocm93KS5maW5kKCd0ZCcpO1xuICAgICAgY29uc3QgdXNlckVsZW0gPSAkKHRkc1swXSkuZmluZCgnLnByaW50dXNlcicpO1xuXG4gICAgICBpZiAodXNlckVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXNlciA9IHBhcnNlVXNlcihzaXRlLmNsaWVudCwgdXNlckVsZW0pO1xuXG4gICAgICAvLyBTZWNvbmQgdGQgY29udGFpbnMgam9pbiBkYXRlIGlmIGV4aXN0c1xuICAgICAgbGV0IGpvaW5lZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAodGRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIGNvbnN0IG9kYXRlRWxlbSA9ICQodGRzWzFdKS5maW5kKCcub2RhdGUnKTtcbiAgICAgICAgaWYgKG9kYXRlRWxlbS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgam9pbmVkQXQgPSBwYXJzZU9kYXRlKG9kYXRlRWxlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWVtYmVycy5wdXNoKG5ldyBTaXRlTWVtYmVyKHsgc2l0ZSwgdXNlciwgam9pbmVkQXQgfSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1lbWJlcnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNpdGUgbWVtYmVyIGxpc3RcbiAgICogQHBhcmFtIHNpdGUgLSBUYXJnZXQgc2l0ZVxuICAgKiBAcGFyYW0gZ3JvdXAgLSBHcm91cCAoXCJhZG1pbnNcIiwgXCJtb2RlcmF0b3JzXCIsIG9yIGVtcHR5IHN0cmluZyBmb3IgYWxsIG1lbWJlcnMpXG4gICAqL1xuICBzdGF0aWMgZ2V0TWVtYmVycyhcbiAgICBzaXRlOiBTaXRlLFxuICAgIGdyb3VwOiAnYWRtaW5zJyB8ICdtb2RlcmF0b3JzJyB8ICcnID0gJydcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVNZW1iZXJbXT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnM6IFNpdGVNZW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIC8vIEdldCBmaXJzdCBwYWdlXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnbWVtYmVyc2hpcC9NZW1iZXJzTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwYWdlOiAxLFxuICAgICAgICAgICAgZ3JvdXAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0SHRtbCA9IFN0cmluZyhmaXJzdFJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBtZW1iZXJzLnB1c2goLi4uU2l0ZU1lbWJlci5wYXJzZShzaXRlLCBmaXJzdEh0bWwpKTtcblxuICAgICAgICAvLyBDaGVjayBwYWdlclxuICAgICAgICBjb25zdCAkZmlyc3QgPSBjaGVlcmlvLmxvYWQoZmlyc3RIdG1sKTtcbiAgICAgICAgY29uc3QgcGFnZXJMaW5rcyA9ICRmaXJzdCgnZGl2LnBhZ2VyIGEnKTtcbiAgICAgICAgaWYgKHBhZ2VyTGlua3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHJldHVybiBtZW1iZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJGZpcnN0KHBhZ2VyTGlua3NbcGFnZXJMaW5rcy5sZW5ndGggLSAyXSlcbiAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgY29uc3QgbGFzdFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCkgfHwgMTtcbiAgICAgICAgaWYgKGxhc3RQYWdlIDw9IDEpIHtcbiAgICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCByZW1haW5pbmcgcGFnZXNcbiAgICAgICAgY29uc3QgYm9kaWVzID0gW107XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IGxhc3RQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICBib2RpZXMucHVzaCh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnbWVtYmVyc2hpcC9NZW1iZXJzTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgZ3JvdXAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChib2RpZXMpO1xuICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdHMuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGFkZGl0aW9uYWxSZXN1bHRzLmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBhZGRpdGlvbmFsUmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgIG1lbWJlcnMucHVzaCguLi5TaXRlTWVtYmVyLnBhcnNlKHNpdGUsIGh0bWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtZW1iZXJzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBtZW1iZXJzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBjaGFuZ2UgZ3JvdXBcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgcHJpdmF0ZSBjaGFuZ2VHcm91cChcbiAgICBldmVudDogJ3RvTW9kZXJhdG9ycycgfCAncmVtb3ZlTW9kZXJhdG9yJyB8ICd0b0FkbWlucycgfCAncmVtb3ZlQWRtaW4nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ01hbmFnZVNpdGVNZW1iZXJzaGlwQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgdXNlcl9pZDogdGhpcy51c2VyLmlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzdWx0LmVycm9yO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RTdGF0dXNFcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdub3RfYWxyZWFkeScpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldEVycm9yKGBVc2VyIGlzIG5vdCBtb2RlcmF0b3IvYWRtaW46ICR7dGhpcy51c2VyLm5hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ2FscmVhZHlfYWRtaW4nIHx8IGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X21vZGVyYXRvcicpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldEVycm9yKFxuICAgICAgICAgICAgICAgIGBVc2VyIGlzIGFscmVhZHkgJHtlcnJvci5zdGF0dXNDb2RlLnJlcGxhY2UoJ2FscmVhZHlfJywgJycpfTogJHt0aGlzLnVzZXIubmFtZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFRhcmdldEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY2hhbmdlIG1lbWJlciBncm91cDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUHJvbW90ZSB0byBtb2RlcmF0b3JcbiAgICovXG4gIHRvTW9kZXJhdG9yKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3RvTW9kZXJhdG9ycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBtb2RlcmF0b3IgcHJpdmlsZWdlc1xuICAgKi9cbiAgcmVtb3ZlTW9kZXJhdG9yKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3JlbW92ZU1vZGVyYXRvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb21vdGUgdG8gYWRtaW5cbiAgICovXG4gIHRvQWRtaW4oKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFuZ2VHcm91cCgndG9BZG1pbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWRtaW4gcHJpdmlsZWdlc1xuICAgKi9cbiAgcmVtb3ZlQWRtaW4oKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFuZ2VHcm91cCgncmVtb3ZlQWRtaW4nKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTaXRlTWVtYmVyKHVzZXI9JHt0aGlzLnVzZXIubmFtZX0sIHNpdGU9JHt0aGlzLnNpdGUudW5peE5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlVXNlciB9IGZyb20gJy4uLy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB7IFBhZ2UsIFBhZ2VDb2xsZWN0aW9uLCBTZWFyY2hQYWdlc1F1ZXJ5IH0gZnJvbSAnLi4vLi4vcGFnZSc7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcblxuLyoqXG4gKiBTaW5nbGUgcGFnZSBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlKSB7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBieSBVTklYIG5hbWVcbiAgICogQHBhcmFtIHVuaXhOYW1lIC0gUGFnZSBVTklYIG5hbWUgKGUuZy4sICdzY3AtMTczJylcbiAgICogQHJldHVybnMgUGFnZSAobnVsbCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBnZXQodW5peE5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFNlYXJjaFBhZ2VzUXVlcnkoeyBmdWxsbmFtZTogdW5peE5hbWUgfSk7XG4gICAgICAgIGNvbnN0IHVzZXJQYXJzZXIgPSBwYXJzZVVzZXIuYmluZChudWxsLCB0aGlzLnNpdGUuY2xpZW50KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5zZWFyY2hQYWdlcyh0aGlzLnNpdGUsIHVzZXJQYXJzZXIsIHF1ZXJ5KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZS5sZW5ndGggPiAwID8gKHJlc3VsdC52YWx1ZVswXSA/PyBudWxsKSA6IG51bGw7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHBhZ2VcbiAgICogQHBhcmFtIGZ1bGxuYW1lIC0gUGFnZSBmdWxsbmFtZSAoZS5nLiwgJ3NjcC0xNzMnKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENyZWF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgY3JlYXRlKFxuICAgIGZ1bGxuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczoge1xuICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgICAgZm9yY2VFZGl0PzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uY3JlYXRlT3JFZGl0KHRoaXMuc2l0ZSwgZnVsbG5hbWUsIHtcbiAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxuICAgICAgc291cmNlOiBvcHRpb25zLnNvdXJjZSxcbiAgICAgIGNvbW1lbnQ6IG9wdGlvbnMuY29tbWVudCxcbiAgICAgIGZvcmNlRWRpdDogb3B0aW9ucy5mb3JjZUVkaXQsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGFnZSB9O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoZWVyaW8gfSBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCBwTGltaXQgZnJvbSAncC1saW1pdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIEZvcmJpZGRlbkVycm9yLFxuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIE5vRWxlbWVudEVycm9yLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgVGFyZ2V0RXhpc3RzRXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBTUNSZXF1ZXN0Qm9keSB9IGZyb20gJy4uLy4uL2Nvbm5lY3Rvcic7XG5pbXBvcnQgeyBmZXRjaFdpdGhSZXRyeSB9IGZyb20gJy4uLy4uL3V0aWwvaHR0cCc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgeyBQYWdlRmlsZUNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2UtZmlsZSc7XG5pbXBvcnQgeyBQYWdlTWV0YUNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2UtbWV0YSc7XG5pbXBvcnQgeyBQYWdlUmV2aXNpb24sIFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2UtcmV2aXNpb24nO1xuaW1wb3J0IHsgUGFnZVNvdXJjZSB9IGZyb20gJy4vcGFnZS1zb3VyY2UnO1xuaW1wb3J0IHsgUGFnZVZvdGUsIFBhZ2VWb3RlQ29sbGVjdGlvbiB9IGZyb20gJy4vcGFnZS12b3RlJztcbmltcG9ydCB7IERFRkFVTFRfTU9EVUxFX0JPRFksIERFRkFVTFRfUEVSX1BBR0UsIFNlYXJjaFBhZ2VzUXVlcnkgfSBmcm9tICcuL3NlYXJjaC1xdWVyeSc7XG5cbi8qKlxuICogU2NoZW1hIGZvciBMaXN0UGFnZXNNb2R1bGUgcGFyc2UgcmVzdWx0XG4gKiBVc2VzIFpvZCBmb3IgdHlwZS1zYWZlIHZhbGlkYXRpb24gb2YgcGFyc2UgcmVzdWx0c1xuICovXG5jb25zdCBwYWdlUGFyYW1zU2NoZW1hID0gei5vYmplY3Qoe1xuICBmdWxsbmFtZTogei5wcmVwcm9jZXNzKCh2KSA9PiB2ID8/ICcnLCB6LnN0cmluZygpKSxcbiAgbmFtZTogei5wcmVwcm9jZXNzKCh2KSA9PiB2ID8/ICcnLCB6LnN0cmluZygpKSxcbiAgY2F0ZWdvcnk6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIHRpdGxlOiB6LnByZXByb2Nlc3MoKHYpID0+IHYgPz8gJycsIHouc3RyaW5nKCkpLFxuICBjaGlsZHJlbl9jb3VudDogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgwKSxcbiAgY29tbWVudHNfY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHNpemU6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHJhdGluZzogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgwKSxcbiAgdm90ZXNfY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHJhdGluZ19wZXJjZW50OiB6LmNvZXJjZS5udW1iZXIoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIHJldmlzaW9uc19jb3VudDogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgwKSxcbiAgcGFyZW50X2Z1bGxuYW1lOiB6LnN0cmluZygpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdGFnczogei5hcnJheSh6LnN0cmluZygpKS5kZWZhdWx0KFtdKSxcbiAgY3JlYXRlZF9ieTogei5jdXN0b208QWJzdHJhY3RVc2VyPigpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgY3JlYXRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICB1cGRhdGVkX2J5OiB6LmN1c3RvbTxBYnN0cmFjdFVzZXI+KCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICB1cGRhdGVkX2F0OiB6LmRhdGUoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNvbW1lbnRlZF9ieTogei5jdXN0b208QWJzdHJhY3RVc2VyPigpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgY29tbWVudGVkX2F0OiB6LmRhdGUoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG59KTtcblxuLyoqXG4gKiBQYWdlIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlRGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIGZ1bGxuYW1lOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgY2hpbGRyZW5Db3VudDogbnVtYmVyO1xuICBjb21tZW50c0NvdW50OiBudW1iZXI7XG4gIHNpemU6IG51bWJlcjtcbiAgcmF0aW5nOiBudW1iZXI7XG4gIHZvdGVzQ291bnQ6IG51bWJlcjtcbiAgcmF0aW5nUGVyY2VudDogbnVtYmVyIHwgbnVsbDtcbiAgcmV2aXNpb25zQ291bnQ6IG51bWJlcjtcbiAgcGFyZW50RnVsbG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHRhZ3M6IHN0cmluZ1tdO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgdXBkYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICB1cGRhdGVkQXQ6IERhdGU7XG4gIGNvbW1lbnRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjb21tZW50ZWRBdDogRGF0ZSB8IG51bGw7XG59XG5cbi8qKlxuICogV2lraWRvdCBwYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSBmdWxsbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY2F0ZWdvcnk6IHN0cmluZztcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBjaGlsZHJlbkNvdW50OiBudW1iZXI7XG4gIHB1YmxpYyBjb21tZW50c0NvdW50OiBudW1iZXI7XG4gIHB1YmxpYyBzaXplOiBudW1iZXI7XG4gIHB1YmxpYyByYXRpbmc6IG51bWJlcjtcbiAgcHVibGljIHZvdGVzQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHJhdGluZ1BlcmNlbnQ6IG51bWJlciB8IG51bGw7XG4gIHB1YmxpYyByZXZpc2lvbnNDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgcGFyZW50RnVsbG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyB0YWdzOiBzdHJpbmdbXTtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcbiAgcHVibGljIHVwZGF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIHVwZGF0ZWRBdDogRGF0ZTtcbiAgcHVibGljIGNvbW1lbnRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgY29tbWVudGVkQXQ6IERhdGUgfCBudWxsO1xuXG4gIHByaXZhdGUgX2lkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc291cmNlOiBQYWdlU291cmNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3JldmlzaW9uczogUGFnZVJldmlzaW9uQ29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF92b3RlczogUGFnZVZvdGVDb2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG4gIF9maWxlczogUGFnZUZpbGVDb2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZURhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy5mdWxsbmFtZSA9IGRhdGEuZnVsbG5hbWU7XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMuY2F0ZWdvcnkgPSBkYXRhLmNhdGVnb3J5O1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgIHRoaXMuY2hpbGRyZW5Db3VudCA9IGRhdGEuY2hpbGRyZW5Db3VudDtcbiAgICB0aGlzLmNvbW1lbnRzQ291bnQgPSBkYXRhLmNvbW1lbnRzQ291bnQ7XG4gICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICAgIHRoaXMucmF0aW5nID0gZGF0YS5yYXRpbmc7XG4gICAgdGhpcy52b3Rlc0NvdW50ID0gZGF0YS52b3Rlc0NvdW50O1xuICAgIHRoaXMucmF0aW5nUGVyY2VudCA9IGRhdGEucmF0aW5nUGVyY2VudDtcbiAgICB0aGlzLnJldmlzaW9uc0NvdW50ID0gZGF0YS5yZXZpc2lvbnNDb3VudDtcbiAgICB0aGlzLnBhcmVudEZ1bGxuYW1lID0gZGF0YS5wYXJlbnRGdWxsbmFtZTtcbiAgICB0aGlzLnRhZ3MgPSBkYXRhLnRhZ3M7XG4gICAgdGhpcy5jcmVhdGVkQnkgPSBkYXRhLmNyZWF0ZWRCeTtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IGRhdGEuY3JlYXRlZEF0O1xuICAgIHRoaXMudXBkYXRlZEJ5ID0gZGF0YS51cGRhdGVkQnk7XG4gICAgdGhpcy51cGRhdGVkQXQgPSBkYXRhLnVwZGF0ZWRBdDtcbiAgICB0aGlzLmNvbW1lbnRlZEJ5ID0gZGF0YS5jb21tZW50ZWRCeTtcbiAgICB0aGlzLmNvbW1lbnRlZEF0ID0gZGF0YS5jb21tZW50ZWRBdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBVUkxcbiAgICovXG4gIGdldFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnNpdGUuZ2V0QmFzZVVybCgpfS8ke3RoaXMuZnVsbG5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHBhZ2UgSUQgaGFzIGJlZW4gYWNxdWlyZWRcbiAgICovXG4gIGlzSWRBY3F1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faWQgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgSURcbiAgICovXG4gIGdldCBpZCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBhZ2UgSURcbiAgICovXG4gIHNldCBpZCh2YWx1ZTogbnVtYmVyIHwgbnVsbCkge1xuICAgIHRoaXMuX2lkID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlXG4gICAqL1xuICBnZXQgc291cmNlKCk6IFBhZ2VTb3VyY2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzb3VyY2UgY29kZVxuICAgKi9cbiAgc2V0IHNvdXJjZSh2YWx1ZTogUGFnZVNvdXJjZSB8IG51bGwpIHtcbiAgICB0aGlzLl9zb3VyY2UgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmV2aXNpb24gaGlzdG9yeVxuICAgKi9cbiAgZ2V0IHJldmlzaW9ucygpOiBQYWdlUmV2aXNpb25Db2xsZWN0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3JldmlzaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcmV2aXNpb24gaGlzdG9yeVxuICAgKi9cbiAgc2V0IHJldmlzaW9ucyh2YWx1ZTogUGFnZVJldmlzaW9uQ29sbGVjdGlvbiB8IG51bGwpIHtcbiAgICB0aGlzLl9yZXZpc2lvbnMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdm90ZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgZ2V0IHZvdGVzKCk6IFBhZ2VWb3RlQ29sbGVjdGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl92b3RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdm90ZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgc2V0IHZvdGVzKHZhbHVlOiBQYWdlVm90ZUNvbGxlY3Rpb24gfCBudWxsKSB7XG4gICAgdGhpcy5fdm90ZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGF0ZXN0IHJldmlzaW9uXG4gICAqL1xuICBnZXQgbGF0ZXN0UmV2aXNpb24oKTogUGFnZVJldmlzaW9uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX3JldmlzaW9ucyB8fCB0aGlzLl9yZXZpc2lvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLl9yZXZpc2lvbnMucmVkdWNlKChtYXgsIHJldikgPT4gKHJldi5yZXZObyA+IG1heC5yZXZObyA/IHJldiA6IG1heCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBwYWdlIElEIGlzIGF2YWlsYWJsZSAoYXV0by1hY3F1aXJlIGlmIG5vdCB5ZXQgYWNxdWlyZWQpXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSBPcGVyYXRpb24gbmFtZSAoZm9yIGVycm9yIG1lc3NhZ2UpXG4gICAqIEB0aHJvd3MgSWYgSUQgYWNxdWlzaXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlSWQob3BlcmF0aW9uOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICh0aGlzLl9pZCA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VJZHModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBhY3F1aXJlIHBhZ2UgSUQgZm9yICR7b3BlcmF0aW9ufTogJHtyZXN1bHQuZXJyb3IubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl9pZCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcihgUGFnZSBJRCBhY3F1aXNpdGlvbiBmYWlsZWQgZm9yICR7b3BlcmF0aW9ufWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIHBhZ2VcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgZGVzdHJveSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2RlbGV0aW9uJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ2RlbGV0ZVBhZ2UnLFxuICAgICAgICAgICAgcGFnZV9pZDogcGFnZUlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZGVsZXRlIHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB0YWdzXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNvbW1pdFRhZ3MoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdzYXZpbmcgdGFncycpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFnczogdGhpcy50YWdzLmpvaW4oJyAnKSxcbiAgICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZVRhZ3MnLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlSWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzYXZlIHRhZ3M6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBhcmVudCBwYWdlXG4gICAqIEBwYXJhbSBwYXJlbnRGdWxsbmFtZSAtIFBhcmVudCBwYWdlIGZ1bGxuYW1lIChudWxsIHRvIHJlbW92ZSlcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgc2V0UGFyZW50KHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdzZXR0aW5nIHBhcmVudCcpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdzZXRQYXJlbnRQYWdlJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwYWdlSWQ6IFN0cmluZyhwYWdlSWQpLFxuICAgICAgICAgICAgcGFyZW50TmFtZTogcGFyZW50RnVsbG5hbWUgPz8gJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcmVudEZ1bGxuYW1lID0gcGFyZW50RnVsbG5hbWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2V0IHBhcmVudDogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWb3RlIG9uIHBhZ2VcbiAgICogQHBhcmFtIHZhbHVlIC0gVm90ZSB2YWx1ZVxuICAgKiBAcmV0dXJucyBOZXcgcmF0aW5nXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHZvdGUodmFsdWU6IG51bWJlcik6IFdpa2lkb3RSZXN1bHRBc3luYzxudW1iZXI+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCd2b3RpbmcnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1JhdGVBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdyYXRlUGFnZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlSWQsXG4gICAgICAgICAgICBwb2ludHM6IHZhbHVlLFxuICAgICAgICAgICAgZm9yY2U6ICd5ZXMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIHZvdGUgcmVxdWVzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1JhdGluZyA9IE51bWJlci5wYXJzZUludChTdHJpbmcocmVzcG9uc2UucG9pbnRzID8/IHRoaXMucmF0aW5nKSwgMTApO1xuICAgICAgICB0aGlzLnJhdGluZyA9IG5ld1JhdGluZztcbiAgICAgICAgcmV0dXJuIG5ld1JhdGluZztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byB2b3RlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCB2b3RlXG4gICAqIEByZXR1cm5zIE5ldyByYXRpbmdcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgY2FuY2VsVm90ZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnY2FuY2VsaW5nIHZvdGUnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1JhdGVBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdjYW5jZWxWb3RlJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwYWdlSWQ6IHBhZ2VJZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSBjYW5jZWwgdm90ZSByZXF1ZXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3UmF0aW5nID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhyZXNwb25zZS5wb2ludHMgPz8gdGhpcy5yYXRpbmcpLCAxMCk7XG4gICAgICAgIHRoaXMucmF0aW5nID0gbmV3UmF0aW5nO1xuICAgICAgICByZXR1cm4gbmV3UmF0aW5nO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNhbmNlbCB2b3RlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlIHBhZ2VcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBFZGl0IG9wdGlvbnNcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgZWRpdChvcHRpb25zOiB7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgc291cmNlPzogc3RyaW5nO1xuICAgIGNvbW1lbnQ/OiBzdHJpbmc7XG4gICAgZm9yY2VFZGl0PzogYm9vbGVhbjtcbiAgfSk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnZWRpdGluZycpO1xuXG4gICAgICAgIC8vIEdldCBjdXJyZW50IHNvdXJjZSAoaWYgbm90IHNwZWNpZmllZClcbiAgICAgICAgbGV0IGN1cnJlbnRTb3VyY2UgPSBvcHRpb25zLnNvdXJjZTtcbiAgICAgICAgaWYgKGN1cnJlbnRTb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nU291cmNlID0gdGhpcy5fc291cmNlO1xuICAgICAgICAgIGlmIChleGlzdGluZ1NvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY3VycmVudFNvdXJjZSA9IGV4aXN0aW5nU291cmNlLndpa2lUZXh0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBY3F1aXJlIHNvdXJjZVxuICAgICAgICAgICAgY29uc3Qgc291cmNlUmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VTb3VyY2VzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgICB0aHJvdyBzb3VyY2VSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBZnRlciBhY3F1aXJlUGFnZVNvdXJjZXMsIHRoaXMuX3NvdXJjZSBpcyBzZXRcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSB0aGlzLl9zb3VyY2U/Lndpa2lUZXh0ID8/ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmNyZWF0ZU9yRWRpdCh0aGlzLnNpdGUsIHRoaXMuZnVsbG5hbWUsIHtcbiAgICAgICAgICBwYWdlSWQsXG4gICAgICAgICAgdGl0bGU6IG9wdGlvbnMudGl0bGUgPz8gdGhpcy50aXRsZSxcbiAgICAgICAgICBzb3VyY2U6IGN1cnJlbnRTb3VyY2UsXG4gICAgICAgICAgY29tbWVudDogb3B0aW9ucy5jb21tZW50ID8/ICcnLFxuICAgICAgICAgIGZvcmNlRWRpdDogb3B0aW9ucy5mb3JjZUVkaXQgPz8gZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBlZGl0IHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmFtZSB0aGUgcGFnZVxuICAgKiBAcGFyYW0gbmV3RnVsbG5hbWUgLSBOZXcgZnVsbG5hbWVcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgcmVuYW1lKG5ld0Z1bGxuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ3JlbmFtaW5nJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3JlbmFtZVBhZ2UnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2VJZCxcbiAgICAgICAgICAgIG5ld19uYW1lOiBuZXdGdWxsbmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBwcm9wZXJ0aWVzICh1c2luZyBPYmplY3QuYXNzaWduIHNpbmNlIHJlYWRvbmx5KVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHtcbiAgICAgICAgICBmdWxsbmFtZTogbmV3RnVsbG5hbWUsXG4gICAgICAgICAgY2F0ZWdvcnk6IG5ld0Z1bGxuYW1lLmluY2x1ZGVzKCc6JykgPyBuZXdGdWxsbmFtZS5zcGxpdCgnOicpWzBdIDogJ19kZWZhdWx0JyxcbiAgICAgICAgICBuYW1lOiBuZXdGdWxsbmFtZS5pbmNsdWRlcygnOicpID8gbmV3RnVsbG5hbWUuc3BsaXQoJzonKVsxXSA6IG5ld0Z1bGxuYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byByZW5hbWUgcGFnZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byB0aGUgcGFnZVxuICAgKi9cbiAgZ2V0RmlsZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VGaWxlQ29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl9maWxlcyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFByb21pc2UucmVzb2x2ZSh0aGlzLl9maWxlcyksIChlKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKFN0cmluZyhlKSkpO1xuICAgIH1cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBuZXcgUGFnZUNvbGxlY3Rpb24odGhpcy5zaXRlLCBbdGhpc10pLmdldFBhZ2VGaWxlcygpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gX2ZpbGVzIHNob3VsZCBiZSBzZXQgYnkgZ2V0UGFnZUZpbGVzKClcbiAgICAgICAgaWYgKHRoaXMuX2ZpbGVzID09PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fZmlsZXMgPSBuZXcgUGFnZUZpbGVDb2xsZWN0aW9uKHRoaXMsIFtdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZmlsZXM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IGZpbGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGlzY3Vzc2lvbiB0aHJlYWQgZm9yIHRoZSBwYWdlXG4gICAqL1xuICBnZXREaXNjdXNzaW9uKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxpbXBvcnQoJy4uL2ZvcnVtJykuRm9ydW1UaHJlYWQgfCBudWxsPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnZ2V0dGluZyBkaXNjdXNzaW9uJyk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bUNvbW1lbnRzTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwYWdlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIC8vIEV4dHJhY3QgdGhyZWFkIElEXG4gICAgICAgIGNvbnN0IG1hdGNoID0gaHRtbC5tYXRjaChcbiAgICAgICAgICAvV0lLSURPVFxcLm1vZHVsZXNcXC5Gb3J1bVZpZXdUaHJlYWRNb2R1bGVcXC52YXJzXFwudGhyZWFkSWRcXHMqPVxccyooXFxkKykvXG4gICAgICAgICk7XG4gICAgICAgIGlmICghbWF0Y2g/LlsxXSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhyZWFkSWQgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcblxuICAgICAgICAvLyBHZXQgRm9ydW1UaHJlYWRcbiAgICAgICAgY29uc3QgeyBGb3J1bVRocmVhZCB9ID0gYXdhaXQgaW1wb3J0KCcuLi9mb3J1bScpO1xuICAgICAgICBjb25zdCB0aHJlYWRSZXN1bHQgPSBhd2FpdCBGb3J1bVRocmVhZC5nZXRGcm9tSWQodGhpcy5zaXRlLCB0aHJlYWRJZCk7XG4gICAgICAgIGlmICh0aHJlYWRSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHRocmVhZFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyZWFkUmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBkaXNjdXNzaW9uOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBtZXRhIHRhZ3MgZm9yIHRoZSBwYWdlXG4gICAqIEByZXR1cm5zIE1ldGEgdGFnIGNvbGxlY3Rpb25cbiAgICovXG4gIGdldE1ldGFzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlTWV0YUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUlkKCdnZXR0aW5nIG1ldGFzJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VNZXRhQ29sbGVjdGlvbi5hY3F1aXJlKHRoaXMpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWV0YXM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgbWV0YSB0YWdcbiAgICogQHBhcmFtIG5hbWUgLSBNZXRhIHRhZyBuYW1lXG4gICAqIEBwYXJhbSBjb250ZW50IC0gTWV0YSB0YWcgdmFsdWVcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgc2V0TWV0YShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJZCgnc2V0dGluZyBtZXRhJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VNZXRhQ29sbGVjdGlvbi5zZXRNZXRhKHRoaXMsIG5hbWUsIGNvbnRlbnQpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZXQgbWV0YTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBtZXRhIHRhZ1xuICAgKiBAcGFyYW0gbmFtZSAtIE1ldGEgdGFnIG5hbWVcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgZGVsZXRlTWV0YShuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2RlbGV0aW5nIG1ldGEnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZU1ldGFDb2xsZWN0aW9uLmRlbGV0ZU1ldGEodGhpcywgbmFtZSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBtZXRhOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYWdlIHNvdXJjZSAoYXV0by1hY3F1aXJlIGlmIG5vdCB5ZXQgYWNxdWlyZWQpXG4gICAqIEByZXR1cm5zIFBhZ2Ugc291cmNlXG4gICAqL1xuICBnZXRTb3VyY2UoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VTb3VyY2U+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VJZHModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzb3VyY2VSZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVNvdXJjZXModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgIGlmIChzb3VyY2VSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgc291cmNlUmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdDYW5ub3QgZmluZCBwYWdlIHNvdXJjZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHNvdXJjZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJldmlzaW9uIGhpc3RvcnkgKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRSZXZpc2lvbnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fcmV2aXNpb25zID09PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VJZHModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByZXZSZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVJldmlzaW9ucyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHJldlJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyByZXZSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9yZXZpc2lvbnMgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oJ0Nhbm5vdCBmaW5kIHBhZ2UgcmV2aXNpb25zJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3JldmlzaW9ucztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcmV2aXNpb25zOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdm90ZSBpbmZvcm1hdGlvbiAoYXV0by1hY3F1aXJlIGlmIG5vdCB5ZXQgYWNxdWlyZWQpXG4gICAqIEByZXR1cm5zIFZvdGUgY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0Vm90ZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VWb3RlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl92b3RlcyA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgdm90ZXNSZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVZvdGVzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAodm90ZXNSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgdm90ZXNSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl92b3RlcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignQ2Fubm90IGZpbmQgcGFnZSB2b3RlcycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl92b3RlcztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdm90ZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2UoZnVsbG5hbWU9JHt0aGlzLmZ1bGxuYW1lfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG5cbi8qKlxuICogUGFnZSBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2U+IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSwgcGFnZXM/OiBQYWdlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKHBhZ2VzKSB7XG4gICAgICB0aGlzLnB1c2goLi4ucGFnZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IGZ1bGxuYW1lXG4gICAqIEBwYXJhbSBmdWxsbmFtZSAtIFBhZ2UgZnVsbG5hbWVcbiAgICogQHJldHVybnMgUGFnZSAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeUZ1bGxuYW1lKGZ1bGxuYW1lOiBzdHJpbmcpOiBQYWdlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChwYWdlKSA9PiBwYWdlLmZ1bGxuYW1lID09PSBmdWxsbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBwYWdlIElEcyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlSWRzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUlkcyh0aGlzLnNpdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgcGFnZSBzb3VyY2VzIGluIGJ1bGtcbiAgICovXG4gIGdldFBhZ2VTb3VyY2VzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVNvdXJjZXModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIHBhZ2UgcmV2aXNpb25zIGluIGJ1bGtcbiAgICovXG4gIGdldFBhZ2VSZXZpc2lvbnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlUmV2aXNpb25zKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBwYWdlIHZvdGVzIGluIGJ1bGtcbiAgICovXG4gIGdldFBhZ2VWb3RlcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VWb3Rlcyh0aGlzLnNpdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgcGFnZSBmaWxlcyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlRmlsZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlRmlsZXModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwYWdlIGZpbGVzIGluIGJ1bGtcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZUZpbGVzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gcGFnZS5pZCAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmaWxlcy9QYWdlRmlsZXNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZV9pZDogcGFnZS5pZCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldFBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFnZSA9IHRhcmdldFBhZ2VzW2ldO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGlmICghcGFnZSB8fCAhcmVzcG9uc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICAgIGNvbnN0IGZpbGVzID0gUGFnZUZpbGVDb2xsZWN0aW9uLl9wYXJzZUZyb21IdG1sKHBhZ2UsICQpO1xuICAgICAgICAgIHBhZ2UuX2ZpbGVzID0gbmV3IFBhZ2VGaWxlQ29sbGVjdGlvbihwYWdlLCBmaWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBhZ2UgZmlsZXM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFjcXVpcmUgcGFnZSBJRHMgaW4gYnVsa1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQYWdlSWRzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gIXBhZ2UuaXNJZEFjcXVpcmVkKCkpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpbWl0IGNvbmN1cnJlbnQgY29ubmVjdGlvbnMgKHVzaW5nIHNhbWUgc2VtYXBob3JlTGltaXQgYXMgQU1DQ2xpZW50KVxuICAgICAgICBjb25zdCBsaW1pdCA9IHBMaW1pdChzaXRlLmNsaWVudC5hbWNDbGllbnQuY29uZmlnLnNlbWFwaG9yZUxpbWl0KTtcbiAgICAgICAgY29uc3QgY29uZmlnID0gc2l0ZS5jbGllbnQuYW1jQ2xpZW50LmNvbmZpZztcblxuICAgICAgICAvLyBBY2Nlc3Mgd2l0aCBub3JlbmRlciwgbm9yZWRpcmVjdCAod2l0aCByZXRyeSlcbiAgICAgICAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGFyZ2V0UGFnZXMubWFwKChwYWdlKSA9PlxuICAgICAgICAgICAgbGltaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB1cmwgPSBgJHtwYWdlLmdldFVybCgpfS9ub3JlbmRlci90cnVlL25vcmVkaXJlY3QvdHJ1ZWA7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkodXJsLCBjb25maWcsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBzaXRlLmNsaWVudC5hbWNDbGllbnQuaGVhZGVyLmdldEhlYWRlcnMoKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB7IHBhZ2UsIHJlc3BvbnNlIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHsgcGFnZSwgcmVzcG9uc2UgfSBvZiByZXNwb25zZXMpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGV4dC5tYXRjaCgvV0lLSVJFUVVFU1RcXC5pbmZvXFwucGFnZUlkXFxzKj1cXHMqKFxcZCspOy8pO1xuICAgICAgICAgIGlmICghbWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBDYW5ub3QgZmluZCBwYWdlIGlkOiAke3BhZ2UuZnVsbG5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhZ2UuaWQgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBJRHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhY3F1aXJlIHBhZ2Ugc291cmNlcyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VTb3VyY2VzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gcGFnZS5zb3VyY2UgPT09IG51bGwgJiYgcGFnZS5pZCAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICd2aWV3c291cmNlL1ZpZXdTb3VyY2VNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZV9pZDogcGFnZS5pZCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldFBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFnZSA9IHRhcmdldFBhZ2VzW2ldO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGlmICghcGFnZSB8fCAhcmVzcG9uc2UpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJykucmVwbGFjZSgvJm5ic3A7L2csICcgJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBjb25zdCBzb3VyY2VFbGVtZW50ID0gJCgnZGl2LnBhZ2Utc291cmNlJyk7XG4gICAgICAgICAgaWYgKHNvdXJjZUVsZW1lbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYENhbm5vdCBmaW5kIHNvdXJjZSBlbGVtZW50IGZvciBwYWdlOiAke3BhZ2UuZnVsbG5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHdpa2lUZXh0ID0gc291cmNlRWxlbWVudC50ZXh0KCkudHJpbSgpLnJlcGxhY2UoL15cXHQvLCAnJyk7XG4gICAgICAgICAgcGFnZS5zb3VyY2UgPSBuZXcgUGFnZVNvdXJjZSh7IHBhZ2UsIHdpa2lUZXh0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIHNvdXJjZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhY3F1aXJlIHBhZ2UgcmV2aXNpb25zIGluIGJ1bGtcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZVJldmlzaW9ucyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UucmV2aXNpb25zID09PSBudWxsICYmIHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlUmV2aXNpb25MaXN0TW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgICBvcHRpb25zOiB7IGFsbDogdHJ1ZSB9LFxuICAgICAgICAgICAgcGVycGFnZTogMTAwMDAwMDAwLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlIHJldmlzaW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldFBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFnZSA9IHRhcmdldFBhZ2VzW2ldO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGlmICghcGFnZSB8fCAhcmVzcG9uc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuICAgICAgICAgIGNvbnN0IHJldmlzaW9uczogUGFnZVJldmlzaW9uW10gPSBbXTtcblxuICAgICAgICAgICQoJ3RhYmxlLnBhZ2UtaGlzdG9yeSB0cltpZF49XCJyZXZpc2lvbi1yb3ctXCJdJykuZWFjaCgoX2osIHJldkVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0ICRyZXYgPSAkKHJldkVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgcmV2SWRBdHRyID0gJHJldi5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgaWYgKCFyZXZJZEF0dHIpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgcmV2SWQgPSBOdW1iZXIucGFyc2VJbnQocmV2SWRBdHRyLnJlcGxhY2UoJ3JldmlzaW9uLXJvdy0nLCAnJyksIDEwKTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocmV2SWQpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0ICR0ZHMgPSAkcmV2LmZpbmQoJ3RkJyk7XG4gICAgICAgICAgICBpZiAoJHRkcy5sZW5ndGggPCA3KSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHJldk5vVGV4dCA9ICR0ZHMuZXEoMCkudGV4dCgpLnRyaW0oKS5yZXBsYWNlKC9cXC4kLywgJycpO1xuICAgICAgICAgICAgY29uc3QgcmV2Tm8gPSBOdW1iZXIucGFyc2VJbnQocmV2Tm9UZXh0LCAxMCk7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldk5vKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCAkY3JlYXRlZEJ5RWxlbSA9ICR0ZHMuZXEoNCkuZmluZCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICAgIGlmICgkY3JlYXRlZEJ5RWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9IHBhcnNlVXNlcihzaXRlLmNsaWVudCwgJGNyZWF0ZWRCeUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPik7XG5cbiAgICAgICAgICAgIGNvbnN0ICRjcmVhdGVkQXRFbGVtID0gJHRkcy5lcSg1KS5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgICBpZiAoJGNyZWF0ZWRBdEVsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSBwYXJzZU9kYXRlKCRjcmVhdGVkQXRFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pID8/IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSAkdGRzLmVxKDYpLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICAgIHJldmlzaW9ucy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgUGFnZVJldmlzaW9uKHtcbiAgICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICAgIGlkOiByZXZJZCxcbiAgICAgICAgICAgICAgICByZXZObyxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGNvbW1lbnQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcGFnZS5yZXZpc2lvbnMgPSBuZXcgUGFnZVJldmlzaW9uQ29sbGVjdGlvbihwYWdlLCByZXZpc2lvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIHJldmlzaW9uczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwYWdlIHZvdGVzIGluIGJ1bGtcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZVZvdGVzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gcGFnZS52b3RlcyA9PT0gbnVsbCAmJiBwYWdlLmlkICE9PSBudWxsKTtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoXG4gICAgICAgICAgdGFyZ2V0UGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ3BhZ2VyYXRlL1dob1JhdGVkUGFnZU1vZHVsZScsXG4gICAgICAgICAgICBwYWdlSWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2Ugdm90ZXNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcblxuICAgICAgICAgIGNvbnN0ICR1c2VyRWxlbXMgPSAkKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0ICR2YWx1ZUVsZW1zID0gJChcInNwYW5bc3R5bGVePSdjb2xvciddXCIpO1xuXG4gICAgICAgICAgaWYgKCR1c2VyRWxlbXMubGVuZ3RoICE9PSAkdmFsdWVFbGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ1VzZXIgYW5kIHZhbHVlIGNvdW50IG1pc21hdGNoIGluIHZvdGVzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgdm90ZXM6IFBhZ2VWb3RlW10gPSBbXTtcbiAgICAgICAgICAkdXNlckVsZW1zLmVhY2goKGosIHVzZXJFbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkdXNlciA9ICQodXNlckVsZW0pO1xuICAgICAgICAgICAgY29uc3QgJHZhbHVlID0gJHZhbHVlRWxlbXMuZXEoaik7XG5cbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICR1c2VyIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVUZXh0ID0gJHZhbHVlLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICAgIGxldCB2YWx1ZTogbnVtYmVyO1xuICAgICAgICAgICAgaWYgKHZhbHVlVGV4dCA9PT0gJysnKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVUZXh0ID09PSAnLScpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlVGV4dCwgMTApIHx8IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZvdGVzLnB1c2gobmV3IFBhZ2VWb3RlKHsgcGFnZSwgdXNlciwgdmFsdWUgfSkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcGFnZS52b3RlcyA9IG5ldyBQYWdlVm90ZUNvbGxlY3Rpb24ocGFnZSwgdm90ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIHZvdGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIExpc3RQYWdlc01vZHVsZSByZXNwb25zZVxuICAgKi9cbiAgc3RhdGljIHBhcnNlKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgaHRtbEJvZHk6IGNoZWVyaW8uQ2hlZXJpb0FQSSxcbiAgICBfcGFyc2VVc2VyOiAoZWxlbWVudDogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KSA9PiBBYnN0cmFjdFVzZXJcbiAgKTogUGFnZUNvbGxlY3Rpb24ge1xuICAgIGNvbnN0IHBhZ2VzOiBQYWdlW10gPSBbXTtcblxuICAgIGh0bWxCb2R5KCdkaXYucGFnZScpLmVhY2goKF9pLCBwYWdlRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgJHBhZ2UgPSBodG1sQm9keShwYWdlRWxlbWVudCk7XG4gICAgICBjb25zdCBwYWdlUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgICAvLyBDaGVjayBmb3IgNS1zdGFyIHJhdGluZ1xuICAgICAgY29uc3QgaXM1U3RhclJhdGluZyA9ICRwYWdlLmZpbmQoJ3NwYW4ucmF0aW5nIHNwYW4ucGFnZS1yYXRlLWxpc3QtcGFnZXMtc3RhcnQnKS5sZW5ndGggPiAwO1xuXG4gICAgICAvLyBHZXQgZWFjaCB2YWx1ZVxuICAgICAgJHBhZ2UuZmluZCgnc3Bhbi5zZXQnKS5lYWNoKChfaiwgc2V0RWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCAkc2V0ID0gaHRtbEJvZHkoc2V0RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGtleUVsZW1lbnQgPSAkc2V0LmZpbmQoJ3NwYW4ubmFtZScpO1xuICAgICAgICBpZiAoa2V5RWxlbWVudC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBsZXQga2V5ID0ga2V5RWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICBjb25zdCB2YWx1ZUVsZW1lbnQgPSAkc2V0LmZpbmQoJ3NwYW4udmFsdWUnKTtcblxuICAgICAgICBsZXQgdmFsdWU6IHVua25vd24gPSBudWxsO1xuXG4gICAgICAgIGlmICh2YWx1ZUVsZW1lbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKFsnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ2NvbW1lbnRlZF9hdCddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICBjb25zdCBvZGF0ZUVsZW1lbnQgPSB2YWx1ZUVsZW1lbnQuZmluZCgnc3Bhbi5vZGF0ZScpO1xuICAgICAgICAgIGlmIChvZGF0ZUVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdGltZXN0YW1wID0gb2RhdGVFbGVtZW50LmF0dHIoJ2NsYXNzJyk/Lm1hdGNoKC90aW1lXyhcXGQrKS8pPy5bMV07XG4gICAgICAgICAgICB2YWx1ZSA9IHRpbWVzdGFtcCA/IG5ldyBEYXRlKE51bWJlci5wYXJzZUludCh0aW1lc3RhbXAsIDEwKSAqIDEwMDApIDogbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgWydjcmVhdGVkX2J5X2xpbmtlZCcsICd1cGRhdGVkX2J5X2xpbmtlZCcsICdjb21tZW50ZWRfYnlfbGlua2VkJ10uaW5jbHVkZXMoa2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwcmludHVzZXJFbGVtZW50ID0gdmFsdWVFbGVtZW50LmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgaWYgKHByaW50dXNlckVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFsdWUgPSBfcGFyc2VVc2VyKHByaW50dXNlckVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChbJ3RhZ3MnLCAnX3RhZ3MnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZUVsZW1lbnQudGV4dCgpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICB9IGVsc2UgaWYgKFsncmF0aW5nX3ZvdGVzJywgJ2NvbW1lbnRzJywgJ3NpemUnLCAncmV2aXNpb25zJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmcnKSB7XG4gICAgICAgICAgY29uc3QgcmF0aW5nVGV4dCA9IHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIHZhbHVlID0gaXM1U3RhclJhdGluZ1xuICAgICAgICAgICAgPyBOdW1iZXIucGFyc2VGbG9hdChyYXRpbmdUZXh0KSB8fCAwXG4gICAgICAgICAgICA6IE51bWJlci5wYXJzZUludChyYXRpbmdUZXh0LCAxMCkgfHwgMDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmdfcGVyY2VudCcpIHtcbiAgICAgICAgICBpZiAoaXM1U3RhclJhdGluZykge1xuICAgICAgICAgICAgdmFsdWUgPSAoTnVtYmVyLnBhcnNlRmxvYXQodmFsdWVFbGVtZW50LnRleHQoKS50cmltKCkpIHx8IDApIC8gMTAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVFbGVtZW50LnRleHQoKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBLZXkgY29udmVyc2lvblxuICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCdfbGlua2VkJykpIHtcbiAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgnX2xpbmtlZCcsICcnKTtcbiAgICAgICAgfSBlbHNlIGlmIChbJ2NvbW1lbnRzJywgJ2NoaWxkcmVuJywgJ3JldmlzaW9ucyddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICBrZXkgPSBgJHtrZXl9X2NvdW50YDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmdfdm90ZXMnKSB7XG4gICAgICAgICAga2V5ID0gJ3ZvdGVzX2NvdW50JztcbiAgICAgICAgfVxuXG4gICAgICAgIHBhZ2VQYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIE1lcmdlIHRhZ3NcbiAgICAgIGNvbnN0IHRhZ3MgPSBBcnJheS5pc0FycmF5KHBhZ2VQYXJhbXMudGFncykgPyBwYWdlUGFyYW1zLnRhZ3MgOiBbXTtcbiAgICAgIGNvbnN0IGhpZGRlblRhZ3MgPSBBcnJheS5pc0FycmF5KHBhZ2VQYXJhbXMuX3RhZ3MpID8gcGFnZVBhcmFtcy5fdGFncyA6IFtdO1xuICAgICAgcGFnZVBhcmFtcy50YWdzID0gWy4uLnRhZ3MsIC4uLmhpZGRlblRhZ3NdO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB3aXRoIFpvZCBzY2hlbWEgYW5kIGFwcGx5IGRlZmF1bHRzXG4gICAgICBjb25zdCBwYXJzZWQgPSBwYWdlUGFyYW1zU2NoZW1hLnBhcnNlKHBhZ2VQYXJhbXMpO1xuXG4gICAgICAvLyBDcmVhdGUgUGFnZSBvYmplY3RcbiAgICAgIHBhZ2VzLnB1c2goXG4gICAgICAgIG5ldyBQYWdlKHtcbiAgICAgICAgICBzaXRlLFxuICAgICAgICAgIGZ1bGxuYW1lOiBwYXJzZWQuZnVsbG5hbWUsXG4gICAgICAgICAgbmFtZTogcGFyc2VkLm5hbWUsXG4gICAgICAgICAgY2F0ZWdvcnk6IHBhcnNlZC5jYXRlZ29yeSxcbiAgICAgICAgICB0aXRsZTogcGFyc2VkLnRpdGxlLFxuICAgICAgICAgIGNoaWxkcmVuQ291bnQ6IHBhcnNlZC5jaGlsZHJlbl9jb3VudCxcbiAgICAgICAgICBjb21tZW50c0NvdW50OiBwYXJzZWQuY29tbWVudHNfY291bnQsXG4gICAgICAgICAgc2l6ZTogcGFyc2VkLnNpemUsXG4gICAgICAgICAgcmF0aW5nOiBwYXJzZWQucmF0aW5nLFxuICAgICAgICAgIHZvdGVzQ291bnQ6IHBhcnNlZC52b3Rlc19jb3VudCxcbiAgICAgICAgICByYXRpbmdQZXJjZW50OiBwYXJzZWQucmF0aW5nX3BlcmNlbnQsXG4gICAgICAgICAgcmV2aXNpb25zQ291bnQ6IHBhcnNlZC5yZXZpc2lvbnNfY291bnQsXG4gICAgICAgICAgcGFyZW50RnVsbG5hbWU6IHBhcnNlZC5wYXJlbnRfZnVsbG5hbWUsXG4gICAgICAgICAgdGFnczogcGFyc2VkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEJ5OiBwYXJzZWQuY3JlYXRlZF9ieSxcbiAgICAgICAgICBjcmVhdGVkQXQ6IHBhcnNlZC5jcmVhdGVkX2F0ID8/IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXBkYXRlZEJ5OiBwYXJzZWQudXBkYXRlZF9ieSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IHBhcnNlZC51cGRhdGVkX2F0ID8/IG5ldyBEYXRlKCksXG4gICAgICAgICAgY29tbWVudGVkQnk6IHBhcnNlZC5jb21tZW50ZWRfYnksXG4gICAgICAgICAgY29tbWVudGVkQXQ6IHBhcnNlZC5jb21tZW50ZWRfYXQsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHBhZ2VzXG4gICAqL1xuICBzdGF0aWMgc2VhcmNoUGFnZXMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBwYXJzZVVzZXI6IChlbGVtZW50OiBjaGVlcmlvLkNoZWVyaW88QW55Tm9kZT4pID0+IEFic3RyYWN0VXNlcixcbiAgICBxdWVyeTogU2VhcmNoUGFnZXNRdWVyeSB8IG51bGwgPSBudWxsXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHEgPSBxdWVyeSA/PyBuZXcgU2VhcmNoUGFnZXNRdWVyeSgpO1xuICAgICAgICBjb25zdCBxdWVyeURpY3QgPSBxLmFzRGljdCgpO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIG1vZHVsZSBib2R5XG4gICAgICAgIGNvbnN0IG1vZHVsZUJvZHkgPSBgW1tkaXYgY2xhc3M9XCJwYWdlXCJdXVxcbiR7REVGQVVMVF9NT0RVTEVfQk9EWS5tYXAoXG4gICAgICAgICAgKGtleSkgPT5cbiAgICAgICAgICAgIGBbW3NwYW4gY2xhc3M9XCJzZXQgJHtrZXl9XCJdXVtbc3BhbiBjbGFzcz1cIm5hbWVcIl1dICR7a2V5fSBbWy9zcGFuXV1bW3NwYW4gY2xhc3M9XCJ2YWx1ZVwiXV0gJSUke2tleX0lJSBbWy9zcGFuXV1bWy9zcGFuXV1gXG4gICAgICAgICkuam9pbignJyl9XFxuW1svZGl2XV1gO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIC4uLnF1ZXJ5RGljdCxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnbGlzdC9MaXN0UGFnZXNNb2R1bGUnLFxuICAgICAgICAgIG1vZHVsZV9ib2R5OiBtb2R1bGVCb2R5LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbcmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5lcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdub3Rfb2snKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkVycm9yKCdGYWlsZWQgdG8gZ2V0IHBhZ2VzLCB0YXJnZXQgc2l0ZSBtYXkgYmUgcHJpdmF0ZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKGZpcnN0UmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkZmlyc3QgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgbGV0IHRvdGFsID0gMTtcbiAgICAgICAgY29uc3QgaHRtbEJvZGllczogY2hlZXJpby5DaGVlcmlvQVBJW10gPSBbJGZpcnN0XTtcblxuICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgIGNvbnN0IHBhZ2VyRWxlbWVudCA9ICRmaXJzdCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgIGlmIChwYWdlckVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGxhc3RQYWdlckVsZW1lbnRzID0gJGZpcnN0KCdkaXYucGFnZXIgc3Bhbi50YXJnZXQnKTtcbiAgICAgICAgICBpZiAobGFzdFBhZ2VyRWxlbWVudHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZExhc3RQYWdlciA9ICRmaXJzdChsYXN0UGFnZXJFbGVtZW50c1tsYXN0UGFnZXJFbGVtZW50cy5sZW5ndGggLSAyXSk7XG4gICAgICAgICAgICBjb25zdCBsYXN0UGFnZXJMaW5rID0gc2Vjb25kTGFzdFBhZ2VyLmZpbmQoJ2EnKTtcbiAgICAgICAgICAgIGlmIChsYXN0UGFnZXJMaW5rLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdG90YWwgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VyTGluay50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgYWRkaXRpb25hbCBwYWdlc1xuICAgICAgICBpZiAodG90YWwgPiAxKSB7XG4gICAgICAgICAgY29uc3QgYWRkaXRpb25hbEJvZGllczogQU1DUmVxdWVzdEJvZHlbXSA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdG90YWw7IGkrKykge1xuICAgICAgICAgICAgYWRkaXRpb25hbEJvZGllcy5wdXNoKHtcbiAgICAgICAgICAgICAgLi4ucXVlcnlEaWN0LFxuICAgICAgICAgICAgICBtb2R1bGVOYW1lOiAnbGlzdC9MaXN0UGFnZXNNb2R1bGUnLFxuICAgICAgICAgICAgICBtb2R1bGVfYm9keTogbW9kdWxlQm9keSxcbiAgICAgICAgICAgICAgb2Zmc2V0OiBpICogKHEucGVyUGFnZSA/PyBERUZBVUxUX1BFUl9QQUdFKSxcbiAgICAgICAgICAgIH0gYXMgQU1DUmVxdWVzdEJvZHkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KGFkZGl0aW9uYWxCb2RpZXMpO1xuICAgICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwQm9keSA9IFN0cmluZyhyZXNwb25zZT8uYm9keSA/PyAnJyk7XG4gICAgICAgICAgICBodG1sQm9kaWVzLnB1c2goY2hlZXJpby5sb2FkKHJlc3BCb2R5KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2VcbiAgICAgICAgY29uc3QgcGFnZXM6IFBhZ2VbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0ICRodG1sIG9mIGh0bWxCb2RpZXMpIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBQYWdlQ29sbGVjdGlvbi5wYXJzZShzaXRlLCAkaHRtbCwgcGFyc2VVc2VyKTtcbiAgICAgICAgICBwYWdlcy5wdXNoKC4uLnBhcnNlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNlYXJjaCBwYWdlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG9yIGVkaXQgYSBwYWdlXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlT3JFZGl0KFxuICAgIHNpdGU6IFNpdGUsXG4gICAgZnVsbG5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7XG4gICAgICBwYWdlSWQ/OiBudW1iZXIgfCBudWxsO1xuICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgICAgZm9yY2VFZGl0PzogYm9vbGVhbjtcbiAgICAgIHJhaXNlT25FeGlzdHM/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBjcmVhdGUvZWRpdCBwYWdlJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHBhZ2VJZCA9IG51bGwsXG4gICAgICAgICAgdGl0bGUgPSAnJyxcbiAgICAgICAgICBzb3VyY2UgPSAnJyxcbiAgICAgICAgICBjb21tZW50ID0gJycsXG4gICAgICAgICAgZm9yY2VFZGl0ID0gZmFsc2UsXG4gICAgICAgICAgcmFpc2VPbkV4aXN0cyA9IGZhbHNlLFxuICAgICAgICB9ID0gb3B0aW9ucztcblxuICAgICAgICAvLyBBY3F1aXJlIHBhZ2UgbG9ja1xuICAgICAgICBjb25zdCBsb2NrUmVxdWVzdEJvZHk6IEFNQ1JlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIG1vZGU6ICdwYWdlJyxcbiAgICAgICAgICB3aWtpX3BhZ2U6IGZ1bGxuYW1lLFxuICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L1BhZ2VFZGl0TW9kdWxlJyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZvcmNlRWRpdCkge1xuICAgICAgICAgIGxvY2tSZXF1ZXN0Qm9keS5mb3JjZV9sb2NrID0gJ3llcyc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtsb2NrUmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKGxvY2tSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGxvY2tSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrUmVzcG9uc2UgPSBsb2NrUmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAobG9ja1Jlc3BvbnNlPy5sb2NrZWQgfHwgbG9ja1Jlc3BvbnNlPy5vdGhlcl9sb2Nrcykge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgJHtmdWxsbmFtZX0gaXMgbG9ja2VkIG9yIG90aGVyIGxvY2tzIGV4aXN0YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0V4aXN0ID0gJ3BhZ2VfcmV2aXNpb25faWQnIGluIChsb2NrUmVzcG9uc2UgPz8ge30pO1xuXG4gICAgICAgIGlmIChyYWlzZU9uRXhpc3RzICYmIGlzRXhpc3QpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXhpc3RzRXJyb3IoYFBhZ2UgJHtmdWxsbmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0V4aXN0ICYmIHBhZ2VJZCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ3BhZ2VfaWQgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBlZGl0aW5nIGV4aXN0aW5nIHBhZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2tJZCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LmxvY2tfaWQgPz8gJycpO1xuICAgICAgICBjb25zdCBsb2NrU2VjcmV0ID0gU3RyaW5nKGxvY2tSZXNwb25zZT8ubG9ja19zZWNyZXQgPz8gJycpO1xuICAgICAgICBjb25zdCBwYWdlUmV2aXNpb25JZCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LnBhZ2VfcmV2aXNpb25faWQgPz8gJycpO1xuXG4gICAgICAgIC8vIFNhdmUgcGFnZVxuICAgICAgICBjb25zdCBlZGl0UmVxdWVzdEJvZHk6IEFNQ1JlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICBldmVudDogJ3NhdmVQYWdlJyxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIG1vZGU6ICdwYWdlJyxcbiAgICAgICAgICBsb2NrX2lkOiBsb2NrSWQsXG4gICAgICAgICAgbG9ja19zZWNyZXQ6IGxvY2tTZWNyZXQsXG4gICAgICAgICAgcmV2aXNpb25faWQ6IHBhZ2VSZXZpc2lvbklkLFxuICAgICAgICAgIHdpa2lfcGFnZTogZnVsbG5hbWUsXG4gICAgICAgICAgcGFnZV9pZDogcGFnZUlkID8/ICcnLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICBjb21tZW50czogY29tbWVudCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlZGl0UmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtlZGl0UmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKGVkaXRSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGVkaXRSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGFyZ2V0RXhpc3RzRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUvZWRpdCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTZWFyY2hQYWdlc1F1ZXJ5IH07XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIFBhZ2UgZmlsZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUZpbGVEYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgbWltZVR5cGU6IHN0cmluZztcbiAgc2l6ZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhZ2UgYXR0YWNobWVudCBmaWxlXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlRmlsZSB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgbWltZVR5cGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlRmlsZURhdGEpIHtcbiAgICB0aGlzLnBhZ2UgPSBkYXRhLnBhZ2U7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG4gICAgdGhpcy5taW1lVHlwZSA9IGRhdGEubWltZVR5cGU7XG4gICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VGaWxlKGlkPSR7dGhpcy5pZH0sIG5hbWU9JHt0aGlzLm5hbWV9LCBzaXplPSR7dGhpcy5zaXplfSlgO1xuICB9XG59XG5cbi8qKlxuICogUGFnZSBmaWxlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VGaWxlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VGaWxlPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UsIGZpbGVzPzogUGFnZUZpbGVbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAoZmlsZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5maWxlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQYWdlRmlsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgoZmlsZSkgPT4gZmlsZS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgbmFtZVxuICAgKi9cbiAgZmluZEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBQYWdlRmlsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgoZmlsZSkgPT4gZmlsZS5uYW1lID09PSBuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHNpemUgc3RyaW5nIHRvIGJ5dGVzIChwdWJsaWMgZm9yIGJhdGNoIG9wZXJhdGlvbnMpXG4gICAqL1xuICBzdGF0aWMgcGFyc2VTaXplKHNpemVUZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHRleHQgPSBzaXplVGV4dC50cmltKCk7XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ0J5dGVzJykpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKE51bWJlci5wYXJzZUZsb2F0KHRleHQucmVwbGFjZSgnQnl0ZXMnLCAnJykudHJpbSgpKSk7XG4gICAgfVxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdrQicpKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihOdW1iZXIucGFyc2VGbG9hdCh0ZXh0LnJlcGxhY2UoJ2tCJywgJycpLnRyaW0oKSkgKiAxMDAwKTtcbiAgICB9XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ01CJykpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKE51bWJlci5wYXJzZUZsb2F0KHRleHQucmVwbGFjZSgnTUInLCAnJykudHJpbSgpKSAqIDEwMDAwMDApO1xuICAgIH1cbiAgICBpZiAodGV4dC5pbmNsdWRlcygnR0InKSkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTnVtYmVyLnBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKCdHQicsICcnKS50cmltKCkpICogMTAwMDAwMDAwMCk7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGZpbGUgaW5mb3JtYXRpb24gZnJvbSBIVE1MIHJlc3BvbnNlXG4gICAqIEludGVybmFsIGhlbHBlciBmb3IgYWNxdWlyZSgpIGFuZCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUZpbGVzKClcbiAgICovXG4gIHN0YXRpYyBfcGFyc2VGcm9tSHRtbChwYWdlOiBQYWdlLCAkOiBjaGVlcmlvLkNoZWVyaW9BUEkpOiBQYWdlRmlsZVtdIHtcbiAgICBjb25zdCBmaWxlc1RhYmxlID0gJCgndGFibGUucGFnZS1maWxlcycpO1xuICAgIGlmIChmaWxlc1RhYmxlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzOiBQYWdlRmlsZVtdID0gW107XG5cbiAgICBmaWxlc1RhYmxlLmZpbmQoXCJ0Ym9keSB0cltpZF49J2ZpbGUtcm93LSddXCIpLmVhY2goKF9pLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IHJvd0lkID0gJChyb3cpLmF0dHIoJ2lkJyk7XG4gICAgICBpZiAoIXJvd0lkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGZpbGVJZCA9IE51bWJlci5wYXJzZUludChyb3dJZC5yZXBsYWNlKCdmaWxlLXJvdy0nLCAnJyksIDEwKTtcbiAgICAgIGNvbnN0IHRkcyA9ICQocm93KS5maW5kKCd0ZCcpO1xuICAgICAgaWYgKHRkcy5sZW5ndGggPCAzKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGxpbmtFbGVtID0gJCh0ZHNbMF0pLmZpbmQoJ2EnKTtcbiAgICAgIGlmIChsaW5rRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgbmFtZSA9IGxpbmtFbGVtLnRleHQoKS50cmltKCk7XG4gICAgICBjb25zdCBocmVmID0gbGlua0VsZW0uYXR0cignaHJlZicpID8/ICcnO1xuICAgICAgY29uc3QgdXJsID0gYCR7cGFnZS5zaXRlLmdldEJhc2VVcmwoKX0ke2hyZWZ9YDtcblxuICAgICAgY29uc3QgbWltZUVsZW0gPSAkKHRkc1sxXSkuZmluZCgnc3BhbicpO1xuICAgICAgY29uc3QgbWltZVR5cGUgPSBtaW1lRWxlbS5hdHRyKCd0aXRsZScpID8/ICcnO1xuXG4gICAgICBjb25zdCBzaXplVGV4dCA9ICQodGRzWzJdKS50ZXh0KCkudHJpbSgpO1xuICAgICAgY29uc3Qgc2l6ZSA9IFBhZ2VGaWxlQ29sbGVjdGlvbi5wYXJzZVNpemUoc2l6ZVRleHQpO1xuXG4gICAgICBmaWxlcy5wdXNoKFxuICAgICAgICBuZXcgUGFnZUZpbGUoe1xuICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgaWQ6IGZpbGVJZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICBtaW1lVHlwZSxcbiAgICAgICAgICBzaXplLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaWxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byBwYWdlXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZShwYWdlOiBQYWdlKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VGaWxlQ29sbGVjdGlvbj4ge1xuICAgIGlmIChwYWdlLmlkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUGFnZSBJRCBub3QgYWNxdWlyZWQnKSksXG4gICAgICAgICgpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ1BhZ2UgSUQgbXVzdCBiZSBhY3F1aXJlZCBiZWZvcmUgZ2V0dGluZyBmaWxlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VJZCA9IHBhZ2UuaWQ7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZpbGVzL1BhZ2VGaWxlc01vZHVsZScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBQYWdlRmlsZUNvbGxlY3Rpb24uX3BhcnNlRnJvbUh0bWwocGFnZSwgJCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlRmlsZUNvbGxlY3Rpb24ocGFnZSwgZmlsZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgZmlsZXM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yLCBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlUmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIFBhZ2UgbWV0YSB0YWcgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VNZXRhRGF0YSB7XG4gIHBhZ2U6IFBhZ2VSZWY7XG4gIG5hbWU6IHN0cmluZztcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhZ2UgbWV0YSB0YWdcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VNZXRhIHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2VSZWY7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBjb250ZW50OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZU1ldGFEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLmNvbnRlbnQgPSBkYXRhLmNvbnRlbnQ7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG1ldGEgdGFnIHZhbHVlXG4gICAqIEBwYXJhbSBjb250ZW50IC0gTmV3IHZhbHVlXG4gICAqL1xuICB1cGRhdGUoY29udGVudDogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gUGFnZU1ldGFDb2xsZWN0aW9uLnNldE1ldGEodGhpcy5wYWdlLCB0aGlzLm5hbWUsIGNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBtZXRhIHRhZ1xuICAgKi9cbiAgZGVsZXRlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFBhZ2VNZXRhQ29sbGVjdGlvbi5kZWxldGVNZXRhKHRoaXMucGFnZSwgdGhpcy5uYW1lKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlTWV0YShuYW1lPSR7dGhpcy5uYW1lfSwgY29udGVudD0ke3RoaXMuY29udGVudH0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgbWV0YSB0YWcgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZU1ldGFDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UGFnZU1ldGE+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2VSZWY7XG5cbiAgY29uc3RydWN0b3IocGFnZTogUGFnZVJlZiwgbWV0YXM/OiBQYWdlTWV0YVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIGlmIChtZXRhcykge1xuICAgICAgdGhpcy5wdXNoKC4uLm1ldGFzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIC0gTWV0YSB0YWcgbmFtZVxuICAgKiBAcmV0dXJucyBNZXRhIHRhZyAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nKTogUGFnZU1ldGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKG1ldGEpID0+IG1ldGEubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgbWV0YSB0YWdzXG4gICAqIEBwYXJhbSBwYWdlIC0gUGFnZSByZWZlcmVuY2VcbiAgICogQHJldHVybnMgTWV0YSB0YWcgY29sbGVjdGlvblxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUocGFnZTogUGFnZVJlZik6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlTWV0YUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2VkaXQvRWRpdE1ldGFNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgbWV0YXM6IFBhZ2VNZXRhW10gPSBbXTtcblxuICAgICAgICAvLyBQYXJzZSBIVE1MLWVuY29kZWQgbWV0YSB0YWdzIHdpdGggcmVnZXhcbiAgICAgICAgLy8gRm9ybWF0OiAmbHQ7bWV0YSBuYW1lPVwieHh4XCIgY29udGVudD1cInl5eVwiLyZndDtcbiAgICAgICAgY29uc3QgbWV0YVJlZ2V4ID0gLyZsdDttZXRhIG5hbWU9XCIoW15cIl0rKVwiIGNvbnRlbnQ9XCIoW15cIl0qKVwiXFwvPyZndDsvZztcbiAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBodG1sLm1hdGNoQWxsKG1ldGFSZWdleCkpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gbWF0Y2hbMV07XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IG1hdGNoWzJdO1xuICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBtZXRhcy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgUGFnZU1ldGEoe1xuICAgICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50ID8/ICcnLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VNZXRhQ29sbGVjdGlvbihwYWdlLCBtZXRhcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIG1ldGFzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWV0YSB0YWdcbiAgICogQHBhcmFtIHBhZ2UgLSBQYWdlIHJlZmVyZW5jZVxuICAgKiBAcGFyYW0gbmFtZSAtIE1ldGEgdGFnIG5hbWVcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBNZXRhIHRhZyB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIHNldE1ldGEocGFnZTogUGFnZVJlZiwgbmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gcGFnZS5zaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIHNldCBtZXRhIHRhZycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVNZXRhVGFnJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L0VkaXRNZXRhTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZS5pZCxcbiAgICAgICAgICAgIG1ldGFOYW1lOiBuYW1lLFxuICAgICAgICAgICAgbWV0YUNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNldCBtZXRhIHRhZzogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIG1ldGEgdGFnXG4gICAqIEBwYXJhbSBwYWdlIC0gUGFnZSByZWZlcmVuY2VcbiAgICogQHBhcmFtIG5hbWUgLSBNZXRhIHRhZyBuYW1lXG4gICAqL1xuICBzdGF0aWMgZGVsZXRlTWV0YShwYWdlOiBQYWdlUmVmLCBuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gcGFnZS5zaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGRlbGV0ZSBtZXRhIHRhZycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ2RlbGV0ZU1ldGFUYWcnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2VkaXQvRWRpdE1ldGFNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlLmlkLFxuICAgICAgICAgICAgbWV0YU5hbWU6IG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBtZXRhIHRhZzogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcbmltcG9ydCB0eXBlIHsgUGFnZVNvdXJjZSB9IGZyb20gJy4vcGFnZS1zb3VyY2UnO1xuXG4vKipcbiAqIFBhZ2UgcmV2aXNpb24gZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VSZXZpc2lvbkRhdGEge1xuICBwYWdlOiBQYWdlO1xuICBpZDogbnVtYmVyO1xuICByZXZObzogbnVtYmVyO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICBjb21tZW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFnZSByZXZpc2lvbiAodmVyc2lvbiBpbiBlZGl0IGhpc3RvcnkpXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlUmV2aXNpb24ge1xuICAvKiogUGFnZSB0aGlzIHJldmlzaW9uIGJlbG9uZ3MgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG5cbiAgLyoqIFJldmlzaW9uIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBSZXZpc2lvbiBudW1iZXIgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldk5vOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIGNyZWF0b3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyO1xuXG4gIC8qKiBSZXZpc2lvbiBjcmVhdGlvbiBkYXRlICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG5cbiAgLyoqIEVkaXQgY29tbWVudCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tbWVudDogc3RyaW5nO1xuXG4gIC8qKiBTb3VyY2UgY29kZSAoaW50ZXJuYWwgY2FjaGUpICovXG4gIHByaXZhdGUgX3NvdXJjZTogUGFnZVNvdXJjZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBIVE1MIGRpc3BsYXkgKGludGVybmFsIGNhY2hlKSAqL1xuICBwcml2YXRlIF9odG1sOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlUmV2aXNpb25EYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMucmV2Tm8gPSBkYXRhLnJldk5vO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLmNvbW1lbnQgPSBkYXRhLmNvbW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBzb3VyY2UgY29kZSBoYXMgYmVlbiBhY3F1aXJlZFxuICAgKi9cbiAgaXNTb3VyY2VBY3F1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgSFRNTCBkaXNwbGF5IGhhcyBiZWVuIGFjcXVpcmVkXG4gICAqL1xuICBpc0h0bWxBY3F1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbCAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc291cmNlIGNvZGUgKGNhY2hlZClcbiAgICovXG4gIGdldCBzb3VyY2UoKTogUGFnZVNvdXJjZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNvdXJjZSBjb2RlXG4gICAqL1xuICBzZXQgc291cmNlKHZhbHVlOiBQYWdlU291cmNlIHwgbnVsbCkge1xuICAgIHRoaXMuX3NvdXJjZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVE1MIGRpc3BsYXkgKGNhY2hlZClcbiAgICovXG4gIGdldCBodG1sKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9odG1sO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBIVE1MIGRpc3BsYXlcbiAgICovXG4gIHNldCBodG1sKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5faHRtbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBzb3VyY2UgKFJFVi0wMDEpXG4gICAqIEByZXR1cm5zIFNvdXJjZSBzdHJpbmdcbiAgICovXG4gIGdldFNvdXJjZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmV0dXJuIGNhY2hlIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAodGhpcy5fc291cmNlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS53aWtpVGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdoaXN0b3J5L1BhZ2VTb3VyY2VNb2R1bGUnLFxuICAgICAgICAgICAgcmV2aXNpb25faWQ6IHRoaXMuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gUGFnZVNvdXJjZU1vZHVsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcblxuICAgICAgICAvLyBTb3VyY2UgY29kZSBpcyBpbnNpZGUgPGRpdiBjbGFzcz1cInBhZ2Utc291cmNlXCI+XG4gICAgICAgIGNvbnN0IHNvdXJjZUVsZW0gPSAkKCdkaXYucGFnZS1zb3VyY2UnKTtcbiAgICAgICAgaWYgKHNvdXJjZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdTb3VyY2UgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZVRleHQgPSBzb3VyY2VFbGVtLnRleHQoKTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVRleHQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIHNvdXJjZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJldmlzaW9uIEhUTUwgKFJFVi0wMDIpXG4gICAqIEByZXR1cm5zIEhUTUwgc3RyaW5nXG4gICAqL1xuICBnZXRIdG1sKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxzdHJpbmc+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBSZXR1cm4gY2FjaGUgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmICh0aGlzLl9odG1sKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2h0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlVmVyc2lvbk1vZHVsZScsXG4gICAgICAgICAgICByZXZpc2lvbl9pZDogdGhpcy5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSBQYWdlVmVyc2lvbk1vZHVsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcblxuICAgICAgICAvLyBIVE1MIGNvbnRlbnQgaXMgaW5zaWRlIDxkaXYgaWQ9XCJwYWdlLWNvbnRlbnRcIj5cbiAgICAgICAgY29uc3QgY29udGVudEVsZW0gPSAkKCcjcGFnZS1jb250ZW50Jyk7XG4gICAgICAgIGlmIChjb250ZW50RWxlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBSZXR1cm4gZW50aXJlIGJvZHkgaWYgcGFnZS1jb250ZW50IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICB0aGlzLl9odG1sID0gaHRtbDtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRIdG1sID0gY29udGVudEVsZW0uaHRtbCgpID8/ICcnO1xuICAgICAgICB0aGlzLl9odG1sID0gY29udGVudEh0bWw7XG4gICAgICAgIHJldHVybiBjb250ZW50SHRtbDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcmV2aXNpb24gSFRNTDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZVJldmlzaW9uKGlkPSR7dGhpcy5pZH0sIHJldk5vPSR7dGhpcy5yZXZOb30pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgcmV2aXNpb24gY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZVJldmlzaW9uQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VSZXZpc2lvbj4ge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZSB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IocGFnZTogUGFnZSB8IG51bGwsIHJldmlzaW9ucz86IFBhZ2VSZXZpc2lvbltdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIGlmIChyZXZpc2lvbnMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5yZXZpc2lvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqIEBwYXJhbSBpZCAtIFJldmlzaW9uIElEXG4gICAqIEByZXR1cm5zIFJldmlzaW9uICh1bmRlZmluZWQgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IFBhZ2VSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocmV2aXNpb24pID0+IHJldmlzaW9uLmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZXMgZm9yIGFsbCByZXZpc2lvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygc291cmNlIHN0cmluZ3NcbiAgICovXG4gIGdldFNvdXJjZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRoaXMubWFwKGFzeW5jIChyZXZpc2lvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmV2aXNpb24uZ2V0U291cmNlKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgc291cmNlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEhUTUwgZm9yIGFsbCByZXZpc2lvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgSFRNTCBzdHJpbmdzXG4gICAqL1xuICBnZXRIdG1scygpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGhpcy5tYXAoYXN5bmMgKHJldmlzaW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXZpc2lvbi5nZXRIdG1sKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgSFRNTHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUGFnZSB9IGZyb20gJy4vcGFnZSc7XG5cbi8qKlxuICogUGFnZSBzb3VyY2UgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VTb3VyY2VEYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgd2lraVRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYWdlIHNvdXJjZSBjb2RlIChXaWtpZG90IHN5bnRheClcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VTb3VyY2Uge1xuICAvKiogUGFnZSB0aGlzIHNvdXJjZSBiZWxvbmdzIHRvICovXG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIC8qKiBTb3VyY2UgY29kZSAoV2lraWRvdCBzeW50YXgpICovXG4gIHB1YmxpYyByZWFkb25seSB3aWtpVGV4dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VTb3VyY2VEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMud2lraVRleHQgPSBkYXRhLndpa2lUZXh0O1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VTb3VyY2UocGFnZT0ke3RoaXMucGFnZS5mdWxsbmFtZX0sIGxlbmd0aD0ke3RoaXMud2lraVRleHQubGVuZ3RofSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIFBhZ2Ugdm90ZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVZvdGVEYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgdXNlcjogQWJzdHJhY3RVc2VyO1xuICB2YWx1ZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhZ2Ugdm90ZSAocmF0aW5nKVxuICovXG5leHBvcnQgY2xhc3MgUGFnZVZvdGUge1xuICAvKiogUGFnZSB0aGlzIHZvdGUgYmVsb25ncyB0byAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcblxuICAvKiogVXNlciB3aG8gdm90ZWQgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IEFic3RyYWN0VXNlcjtcblxuICAvKiogVm90ZSB2YWx1ZSAoKzEvLTEgb3IgbnVtZXJpYykgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZVZvdGVEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMudXNlciA9IGRhdGEudXNlcjtcbiAgICB0aGlzLnZhbHVlID0gZGF0YS52YWx1ZTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlVm90ZSh1c2VyPSR7dGhpcy51c2VyLm5hbWV9LCB2YWx1ZT0ke3RoaXMudmFsdWV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQYWdlIHZvdGUgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZVZvdGVDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UGFnZVZvdGU+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG5cbiAgY29uc3RydWN0b3IocGFnZTogUGFnZSwgdm90ZXM/OiBQYWdlVm90ZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIGlmICh2b3Rlcykge1xuICAgICAgdGhpcy5wdXNoKC4uLnZvdGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSB1c2VyXG4gICAqIEBwYXJhbSB1c2VyIC0gVXNlciB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIFZvdGUgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlVc2VyKHVzZXI6IEFic3RyYWN0VXNlcik6IFBhZ2VWb3RlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKCh2b3RlKSA9PiB2b3RlLnVzZXIuaWQgPT09IHVzZXIuaWQpO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICogUGFnZSBzZWFyY2ggcXVlcnkgcGFyYW1ldGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMge1xuICAvKiogUGFnZSB0eXBlIChlLmcuLCAnbm9ybWFsJywgJ2FkbWluJykgKi9cbiAgcGFnZXR5cGU/OiBzdHJpbmc7XG4gIC8qKiBDYXRlZ29yeSBuYW1lICovXG4gIGNhdGVnb3J5Pzogc3RyaW5nO1xuICAvKiogVGFncyB0byBzZWFyY2ggKEFORCBjb25kaXRpb24pICovXG4gIHRhZ3M/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqIFBhcmVudCBwYWdlIG5hbWUgKi9cbiAgcGFyZW50Pzogc3RyaW5nO1xuICAvKiogTGlua2VkIHBhZ2UgbmFtZSAqL1xuICBsaW5rVG8/OiBzdHJpbmc7XG4gIC8qKiBDcmVhdGVkIGRhdGUgY29uZGl0aW9uICovXG4gIGNyZWF0ZWRBdD86IHN0cmluZztcbiAgLyoqIFVwZGF0ZWQgZGF0ZSBjb25kaXRpb24gKi9cbiAgdXBkYXRlZEF0Pzogc3RyaW5nO1xuICAvKiogQ3JlYXRvciAqL1xuICBjcmVhdGVkQnk/OiBBYnN0cmFjdFVzZXIgfCBzdHJpbmc7XG4gIC8qKiBSYXRpbmcgY29uZGl0aW9uICovXG4gIHJhdGluZz86IHN0cmluZztcbiAgLyoqIFZvdGUgY291bnQgY29uZGl0aW9uICovXG4gIHZvdGVzPzogc3RyaW5nO1xuICAvKiogUGFnZSBuYW1lIGNvbmRpdGlvbiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogRnVsbG5hbWUgKGV4YWN0IG1hdGNoKSAqL1xuICBmdWxsbmFtZT86IHN0cmluZztcbiAgLyoqIFJhbmdlIHNwZWNpZmljYXRpb24gKi9cbiAgcmFuZ2U/OiBzdHJpbmc7XG4gIC8qKiBTb3J0IG9yZGVyIChlLmcuLCAnY3JlYXRlZF9hdCBkZXNjJykgKi9cbiAgb3JkZXI/OiBzdHJpbmc7XG4gIC8qKiBTdGFydCBvZmZzZXQgKi9cbiAgb2Zmc2V0PzogbnVtYmVyO1xuICAvKiogUmVzdWx0IGxpbWl0ICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogSXRlbXMgcGVyIHBhZ2UgKi9cbiAgcGVyUGFnZT86IG51bWJlcjtcbiAgLyoqIFNlcGFyYXRlIGRpc3BsYXkgKi9cbiAgc2VwYXJhdGU/OiBzdHJpbmc7XG4gIC8qKiBXcmFwcGVyIGRpc3BsYXkgKi9cbiAgd3JhcHBlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGl0ZW1zIHBlciBwYWdlXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BFUl9QQUdFID0gMjUwO1xuXG4vKipcbiAqIERlZmF1bHQgbW9kdWxlIGJvZHkgZmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PRFVMRV9CT0RZID0gW1xuICAnZnVsbG5hbWUnLFxuICAnY2F0ZWdvcnknLFxuICAnbmFtZScsXG4gICd0aXRsZScsXG4gICdjcmVhdGVkX2F0JyxcbiAgJ2NyZWF0ZWRfYnlfbGlua2VkJyxcbiAgJ3VwZGF0ZWRfYXQnLFxuICAndXBkYXRlZF9ieV9saW5rZWQnLFxuICAnY29tbWVudGVkX2F0JyxcbiAgJ2NvbW1lbnRlZF9ieV9saW5rZWQnLFxuICAncGFyZW50X2Z1bGxuYW1lJyxcbiAgJ2NvbW1lbnRzJyxcbiAgJ3NpemUnLFxuICAnY2hpbGRyZW4nLFxuICAncmF0aW5nX3ZvdGVzJyxcbiAgJ3JhdGluZycsXG4gICdyYXRpbmdfcGVyY2VudCcsXG4gICdyZXZpc2lvbnMnLFxuICAndGFncycsXG4gICdfdGFncycsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIFBhZ2Ugc2VhcmNoIHF1ZXJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hQYWdlc1F1ZXJ5IHtcbiAgLyoqIFBhZ2UgdHlwZSAqL1xuICBwYWdldHlwZTogc3RyaW5nO1xuICAvKiogQ2F0ZWdvcnkgKi9cbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgLyoqIFRhZ3MgKi9cbiAgdGFnczogc3RyaW5nIHwgc3RyaW5nW10gfCBudWxsO1xuICAvKiogUGFyZW50IHBhZ2UgKi9cbiAgcGFyZW50OiBzdHJpbmcgfCBudWxsO1xuICAvKiogTGluayB0YXJnZXQgKi9cbiAgbGlua1RvOiBzdHJpbmcgfCBudWxsO1xuICAvKiogQ3JlYXRlZCBkYXRlIGNvbmRpdGlvbiAqL1xuICBjcmVhdGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBVcGRhdGVkIGRhdGUgY29uZGl0aW9uICovXG4gIHVwZGF0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIENyZWF0b3IgKi9cbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBzdHJpbmcgfCBudWxsO1xuICAvKiogUmF0aW5nIGNvbmRpdGlvbiAqL1xuICByYXRpbmc6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBWb3RlIGNvdW50IGNvbmRpdGlvbiAqL1xuICB2b3Rlczogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFBhZ2UgbmFtZSBjb25kaXRpb24gKi9cbiAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEZ1bGxuYW1lIGNvbmRpdGlvbiAqL1xuICBmdWxsbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFJhbmdlICovXG4gIHJhbmdlOiBzdHJpbmcgfCBudWxsO1xuICAvKiogU29ydCBvcmRlciAqL1xuICBvcmRlcjogc3RyaW5nO1xuICAvKiogT2Zmc2V0ICovXG4gIG9mZnNldDogbnVtYmVyO1xuICAvKiogUmVzdWx0IGxpbWl0ICovXG4gIGxpbWl0OiBudW1iZXIgfCBudWxsO1xuICAvKiogSXRlbXMgcGVyIHBhZ2UgKi9cbiAgcGVyUGFnZTogbnVtYmVyO1xuICAvKiogU2VwYXJhdGUgZGlzcGxheSAqL1xuICBzZXBhcmF0ZTogc3RyaW5nO1xuICAvKiogV3JhcHBlciBkaXNwbGF5ICovXG4gIHdyYXBwZXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwYXJhbXM6IFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMgPSB7fSkge1xuICAgIHRoaXMucGFnZXR5cGUgPSBwYXJhbXMucGFnZXR5cGUgPz8gJyonO1xuICAgIHRoaXMuY2F0ZWdvcnkgPSBwYXJhbXMuY2F0ZWdvcnkgPz8gJyonO1xuICAgIHRoaXMudGFncyA9IHBhcmFtcy50YWdzID8/IG51bGw7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJhbXMucGFyZW50ID8/IG51bGw7XG4gICAgdGhpcy5saW5rVG8gPSBwYXJhbXMubGlua1RvID8/IG51bGw7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBwYXJhbXMuY3JlYXRlZEF0ID8/IG51bGw7XG4gICAgdGhpcy51cGRhdGVkQXQgPSBwYXJhbXMudXBkYXRlZEF0ID8/IG51bGw7XG4gICAgdGhpcy5jcmVhdGVkQnkgPSBwYXJhbXMuY3JlYXRlZEJ5ID8/IG51bGw7XG4gICAgdGhpcy5yYXRpbmcgPSBwYXJhbXMucmF0aW5nID8/IG51bGw7XG4gICAgdGhpcy52b3RlcyA9IHBhcmFtcy52b3RlcyA/PyBudWxsO1xuICAgIHRoaXMubmFtZSA9IHBhcmFtcy5uYW1lID8/IG51bGw7XG4gICAgdGhpcy5mdWxsbmFtZSA9IHBhcmFtcy5mdWxsbmFtZSA/PyBudWxsO1xuICAgIHRoaXMucmFuZ2UgPSBwYXJhbXMucmFuZ2UgPz8gbnVsbDtcbiAgICB0aGlzLm9yZGVyID0gcGFyYW1zLm9yZGVyID8/ICdjcmVhdGVkX2F0IGRlc2MnO1xuICAgIHRoaXMub2Zmc2V0ID0gcGFyYW1zLm9mZnNldCA/PyAwO1xuICAgIHRoaXMubGltaXQgPSBwYXJhbXMubGltaXQgPz8gbnVsbDtcbiAgICB0aGlzLnBlclBhZ2UgPSBwYXJhbXMucGVyUGFnZSA/PyBERUZBVUxUX1BFUl9QQUdFO1xuICAgIHRoaXMuc2VwYXJhdGUgPSBwYXJhbXMuc2VwYXJhdGUgPz8gJ25vJztcbiAgICB0aGlzLndyYXBwZXIgPSBwYXJhbXMud3JhcHBlciA/PyAnbm8nO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdG8gZGljdGlvbmFyeSBmb3JtYXRcbiAgICovXG4gIGFzRGljdCgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgLy8gcGFnZXR5cGUgYW5kIGNhdGVnb3J5IG11c3QgYWx3YXlzIGJlIGluY2x1ZGVkXG4gICAgLy8gV2lraWRvdCBkZWZhdWx0czogcGFnZXR5cGU9XCJub3JtYWxcIiwgY2F0ZWdvcnk9XCIuXCIgKGN1cnJlbnQgY2F0ZWdvcnkpXG4gICAgLy8gVG8gZ2V0IGFsbCBwYWdlcywgd2UgbmVlZCB0byBleHBsaWNpdGx5IHNlbmQgXCIqXCJcbiAgICByZXN1bHQucGFnZXR5cGUgPSB0aGlzLnBhZ2V0eXBlO1xuICAgIHJlc3VsdC5jYXRlZ29yeSA9IHRoaXMuY2F0ZWdvcnk7XG4gICAgaWYgKHRoaXMudGFncyAhPT0gbnVsbCkge1xuICAgICAgcmVzdWx0LnRhZ3MgPSBBcnJheS5pc0FycmF5KHRoaXMudGFncykgPyB0aGlzLnRhZ3Muam9pbignICcpIDogdGhpcy50YWdzO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJlbnQgIT09IG51bGwpIHJlc3VsdC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICBpZiAodGhpcy5saW5rVG8gIT09IG51bGwpIHJlc3VsdC5saW5rX3RvID0gdGhpcy5saW5rVG87XG4gICAgaWYgKHRoaXMuY3JlYXRlZEF0ICE9PSBudWxsKSByZXN1bHQuY3JlYXRlZF9hdCA9IHRoaXMuY3JlYXRlZEF0O1xuICAgIGlmICh0aGlzLnVwZGF0ZWRBdCAhPT0gbnVsbCkgcmVzdWx0LnVwZGF0ZWRfYXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICBpZiAodGhpcy5jcmVhdGVkQnkgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdC5jcmVhdGVkX2J5ID0gdHlwZW9mIHRoaXMuY3JlYXRlZEJ5ID09PSAnc3RyaW5nJyA/IHRoaXMuY3JlYXRlZEJ5IDogdGhpcy5jcmVhdGVkQnkubmFtZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmF0aW5nICE9PSBudWxsKSByZXN1bHQucmF0aW5nID0gdGhpcy5yYXRpbmc7XG4gICAgaWYgKHRoaXMudm90ZXMgIT09IG51bGwpIHJlc3VsdC52b3RlcyA9IHRoaXMudm90ZXM7XG4gICAgaWYgKHRoaXMubmFtZSAhPT0gbnVsbCkgcmVzdWx0Lm5hbWUgPSB0aGlzLm5hbWU7XG4gICAgaWYgKHRoaXMuZnVsbG5hbWUgIT09IG51bGwpIHJlc3VsdC5mdWxsbmFtZSA9IHRoaXMuZnVsbG5hbWU7XG4gICAgaWYgKHRoaXMucmFuZ2UgIT09IG51bGwpIHJlc3VsdC5yYW5nZSA9IHRoaXMucmFuZ2U7XG5cbiAgICByZXN1bHQub3JkZXIgPSB0aGlzLm9yZGVyO1xuICAgIHJlc3VsdC5vZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICBpZiAodGhpcy5saW1pdCAhPT0gbnVsbCkgcmVzdWx0LmxpbWl0ID0gdGhpcy5saW1pdDtcbiAgICByZXN1bHQucGVyUGFnZSA9IHRoaXMucGVyUGFnZTtcbiAgICByZXN1bHQuc2VwYXJhdGUgPSB0aGlzLnNlcGFyYXRlO1xuICAgIHJlc3VsdC53cmFwcGVyID0gdGhpcy53cmFwcGVyO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlT2RhdGUsIHBhcnNlVXNlciB9IGZyb20gJy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcblxuLyoqXG4gKiBTaXRlIGNoYW5nZSBoaXN0b3J5IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaXRlQ2hhbmdlRGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIHBhZ2VGdWxsbmFtZTogc3RyaW5nO1xuICBwYWdlVGl0bGU6IHN0cmluZztcbiAgcmV2aXNpb25ObzogbnVtYmVyO1xuICBjaGFuZ2VkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIGNoYW5nZWRBdDogRGF0ZSB8IG51bGw7XG4gIGZsYWdzOiBzdHJpbmdbXTtcbiAgY29tbWVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNpdGUgY2hhbmdlIGhpc3RvcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVDaGFuZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VGdWxsbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZVRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByZXZpc2lvbk5vOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBjaGFuZ2VkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBjaGFuZ2VkQXQ6IERhdGUgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgZmxhZ3M6IHN0cmluZ1tdO1xuICBwdWJsaWMgcmVhZG9ubHkgY29tbWVudDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFNpdGVDaGFuZ2VEYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMucGFnZUZ1bGxuYW1lID0gZGF0YS5wYWdlRnVsbG5hbWU7XG4gICAgdGhpcy5wYWdlVGl0bGUgPSBkYXRhLnBhZ2VUaXRsZTtcbiAgICB0aGlzLnJldmlzaW9uTm8gPSBkYXRhLnJldmlzaW9uTm87XG4gICAgdGhpcy5jaGFuZ2VkQnkgPSBkYXRhLmNoYW5nZWRCeTtcbiAgICB0aGlzLmNoYW5nZWRBdCA9IGRhdGEuY2hhbmdlZEF0O1xuICAgIHRoaXMuZmxhZ3MgPSBkYXRhLmZsYWdzO1xuICAgIHRoaXMuY29tbWVudCA9IGRhdGEuY29tbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBVUkxcbiAgICovXG4gIGdldFBhZ2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zaXRlLmdldEJhc2VVcmwoKX0vJHt0aGlzLnBhZ2VGdWxsbmFtZX1gO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFNpdGVDaGFuZ2UocGFnZT0ke3RoaXMucGFnZUZ1bGxuYW1lfSwgcmV2PSR7dGhpcy5yZXZpc2lvbk5vfSwgYnk9JHt0aGlzLmNoYW5nZWRCeX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFNpdGUgY2hhbmdlIGhpc3RvcnkgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgU2l0ZUNoYW5nZUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxTaXRlQ2hhbmdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUsIGNoYW5nZXM/OiBTaXRlQ2hhbmdlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5jaGFuZ2VzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlY2VudCBjaGFuZ2UgaGlzdG9yeVxuICAgKiBAcGFyYW0gc2l0ZSAtIFNpdGUgaW5zdGFuY2VcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zXG4gICAqIEByZXR1cm5zIENoYW5nZSBoaXN0b3J5IGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgb3B0aW9ucz86IHsgcGVyUGFnZT86IG51bWJlcjsgcGFnZT86IG51bWJlcjsgbGltaXQ/OiBudW1iZXIgfVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUNoYW5nZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwZXJQYWdlID0gb3B0aW9ucz8ucGVyUGFnZSA/PyAyMDtcbiAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZSA/PyAxO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucz8ubGltaXQ7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdjaGFuZ2VzL1NpdGVDaGFuZ2VzTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwZXJwYWdlOiBwZXJQYWdlLFxuICAgICAgICAgICAgcGFnZTogcGFnZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgIGNvbnN0IGNoYW5nZXM6IFNpdGVDaGFuZ2VbXSA9IFtdO1xuXG4gICAgICAgIC8vIFBhcnNlIHRhYmxlIHJvd3NcbiAgICAgICAgJCgndGFibGUud2lraS1jb250ZW50LXRhYmxlIHRyJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJChlbGVtKTtcbiAgICAgICAgICBjb25zdCAkY2VsbHMgPSAkcm93LmZpbmQoJ3RkJyk7XG4gICAgICAgICAgaWYgKCRjZWxscy5sZW5ndGggPCA0KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBQYWdlIGxpbmtcbiAgICAgICAgICBjb25zdCBwYWdlTGluayA9ICQoJGNlbGxzWzBdKS5maW5kKCdhJyk7XG4gICAgICAgICAgY29uc3QgaHJlZiA9IHBhZ2VMaW5rLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgICAgICBjb25zdCBwYWdlRnVsbG5hbWUgPSBocmVmLnJlcGxhY2UoL15cXC8vLCAnJykuc3BsaXQoJy8nKVswXSA/PyAnJztcbiAgICAgICAgICBjb25zdCBwYWdlVGl0bGUgPSBwYWdlTGluay50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gUmV2aXNpb24gbnVtYmVyXG4gICAgICAgICAgY29uc3QgcmV2VGV4dCA9ICQoJGNlbGxzWzFdKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHJldk1hdGNoID0gcmV2VGV4dC5tYXRjaCgvKFxcZCspLyk7XG4gICAgICAgICAgY29uc3QgcmV2aXNpb25ObyA9IHJldk1hdGNoPy5bMV0gPyBOdW1iZXIucGFyc2VJbnQocmV2TWF0Y2hbMV0sIDEwKSA6IDA7XG5cbiAgICAgICAgICAvLyBGbGFnc1xuICAgICAgICAgIGNvbnN0IGZsYWdzQ2VsbCA9ICQoJGNlbGxzWzJdKTtcbiAgICAgICAgICBjb25zdCBmbGFnczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICBmbGFnc0NlbGwuZmluZCgnc3BhbicpLmVhY2goKF9qLCBmbGFnRWxlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmxhZ0NsYXNzID0gJChmbGFnRWxlbSkuYXR0cignY2xhc3MnKSA/PyAnJztcbiAgICAgICAgICAgIGlmIChmbGFnQ2xhc3MuaW5jbHVkZXMoJ3NwYW50aXAnKSkge1xuICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9ICQoZmxhZ0VsZW0pLmF0dHIoJ3RpdGxlJykgPz8gJyc7XG4gICAgICAgICAgICAgIGlmICh0aXRsZSkgZmxhZ3MucHVzaCh0aXRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBVc2VyIGFuZCB0aW1lc3RhbXBcbiAgICAgICAgICBjb25zdCBpbmZvQ2VsbCA9ICQoJGNlbGxzWzNdKTtcbiAgICAgICAgICBjb25zdCB1c2VyRWxlbSA9IGluZm9DZWxsLmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgY29uc3QgY2hhbmdlZEJ5ID0gdXNlckVsZW0ubGVuZ3RoID4gMCA/IHBhcnNlVXNlcihzaXRlLmNsaWVudCwgdXNlckVsZW0pIDogbnVsbDtcblxuICAgICAgICAgIGNvbnN0IG9kYXRlRWxlbSA9IGluZm9DZWxsLmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgICAgICBjb25zdCBjaGFuZ2VkQXQgPSBvZGF0ZUVsZW0ubGVuZ3RoID4gMCA/IHBhcnNlT2RhdGUob2RhdGVFbGVtKSA6IG51bGw7XG5cbiAgICAgICAgICAvLyBDb21tZW50XG4gICAgICAgICAgY29uc3QgY29tbWVudEVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLmNvbW1lbnRzJyk7XG4gICAgICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRFbGVtXG4gICAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAucmVwbGFjZSgvXltcIlwiXXxbXCJcIl0kL2csICcnKTtcblxuICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBTaXRlQ2hhbmdlKHtcbiAgICAgICAgICAgICAgc2l0ZSxcbiAgICAgICAgICAgICAgcGFnZUZ1bGxuYW1lLFxuICAgICAgICAgICAgICBwYWdlVGl0bGUsXG4gICAgICAgICAgICAgIHJldmlzaW9uTm8sXG4gICAgICAgICAgICAgIGNoYW5nZWRCeSxcbiAgICAgICAgICAgICAgY2hhbmdlZEF0LFxuICAgICAgICAgICAgICBmbGFncyxcbiAgICAgICAgICAgICAgY29tbWVudCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTGltaXQgcmVzdWx0cyBpZiBsaW1pdCBpcyBzcGVjaWZpZWRcbiAgICAgICAgY29uc3QgbGltaXRlZENoYW5nZXMgPSBsaW1pdCAhPT0gdW5kZWZpbmVkID8gY2hhbmdlcy5zbGljZSgwLCBsaW1pdCkgOiBjaGFuZ2VzO1xuICAgICAgICByZXR1cm4gbmV3IFNpdGVDaGFuZ2VDb2xsZWN0aW9uKHNpdGUsIGxpbWl0ZWRDaGFuZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHNpdGUgY2hhbmdlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHtcbiAgUGFnZSxcbiAgUGFnZUNvbGxlY3Rpb24sXG4gIFNlYXJjaFBhZ2VzUXVlcnksXG4gIHR5cGUgU2VhcmNoUGFnZXNRdWVyeVBhcmFtcyxcbiAgU2l0ZUNoYW5nZUNvbGxlY3Rpb24sXG59IGZyb20gJy4uLy4uL3BhZ2UnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5cbi8qKlxuICogUGFnZSBsaXN0IG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VzQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlKSB7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggcGFnZXMgbWF0Y2hpbmcgY29uZGl0aW9uc1xuICAgKiBAcGFyYW0gcGFyYW1zIC0gU2VhcmNoIGNvbmRpdGlvbnNcbiAgICogQHJldHVybnMgUGFnZSBjb2xsZWN0aW9uXG4gICAqL1xuICBzZWFyY2gocGFyYW1zPzogU2VhcmNoUGFnZXNRdWVyeVBhcmFtcyk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFNlYXJjaFBhZ2VzUXVlcnkocGFyYW1zKTtcbiAgICAgICAgY29uc3QgdXNlclBhcnNlciA9IHBhcnNlVXNlci5iaW5kKG51bGwsIHRoaXMuc2l0ZS5jbGllbnQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLnNlYXJjaFBhZ2VzKHRoaXMuc2l0ZSwgdXNlclBhcnNlciwgcXVlcnkpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNlYXJjaCBwYWdlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBhZ2VzXG4gICAqIEByZXR1cm5zIFBhZ2UgY29sbGVjdGlvblxuICAgKi9cbiAgYWxsKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaCh7fSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlY2VudCBjaGFuZ2VzXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9ucy5wZXJQYWdlIC0gSXRlbXMgcGVyIHBhZ2UgKGRlZmF1bHQ6IDIwKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5wYWdlIC0gUGFnZSBudW1iZXIgKGRlZmF1bHQ6IDEpXG4gICAqIEByZXR1cm5zIENoYW5nZSBoaXN0b3J5IGNvbGxlY3Rpb25cbiAgICovXG4gIGdldFJlY2VudENoYW5nZXMob3B0aW9ucz86IHtcbiAgICBwZXJQYWdlPzogbnVtYmVyO1xuICAgIHBhZ2U/OiBudW1iZXI7XG4gIH0pOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUNoYW5nZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gU2l0ZUNoYW5nZUNvbGxlY3Rpb24uYWNxdWlyZSh0aGlzLnNpdGUsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFBhZ2UsXG4gIFBhZ2VDb2xsZWN0aW9uLFxuICBTZWFyY2hQYWdlc1F1ZXJ5LFxuICBTaXRlQ2hhbmdlQ29sbGVjdGlvbixcbiAgdHlwZSBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zLFxufTtcbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBOb3RGb3VuZEV4Y2VwdGlvbiwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBTUNSZXF1ZXN0Qm9keSwgQU1DUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuLi8uLi91dGlsL2h0dHAnO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQvY2xpZW50JztcbmltcG9ydCB7IEZvcnVtQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9mb3J1bS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBNZW1iZXJBY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3JzL21lbWJlci1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBQYWdlQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9wYWdlLWFjY2Vzc29yJztcbmltcG9ydCB7IFBhZ2VzQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9wYWdlcy1hY2Nlc3Nvcic7XG5cbi8qKlxuICogU2l0ZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZURhdGEge1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICB1bml4TmFtZTogc3RyaW5nO1xuICBkb21haW46IHN0cmluZztcbiAgc3NsU3VwcG9ydGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFNpdGUgY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgLyoqIFNpdGUgSUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIFNpdGUgdGl0bGUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqIFVOSVggbmFtZSAoZS5nLiwgc2NwLWpwKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdW5peE5hbWU6IHN0cmluZztcblxuICAvKiogRG9tYWluICovXG4gIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZztcblxuICAvKiogU1NMIHN1cHBvcnQgZmxhZyAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3NsU3VwcG9ydGVkOiBib29sZWFuO1xuXG4gIC8qKiBQYWdlIGFjY2Vzc29yICovXG4gIHByaXZhdGUgX3BhZ2U6IFBhZ2VBY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBQYWdlcyBhY2Nlc3NvciAqL1xuICBwcml2YXRlIF9wYWdlczogUGFnZXNBY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBGb3J1bSBhY2Nlc3NvciAqL1xuICBwcml2YXRlIF9mb3J1bTogRm9ydW1BY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBNZW1iZXIgYWNjZXNzb3IgKi9cbiAgcHJpdmF0ZSBfbWVtYmVyOiBNZW1iZXJBY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBkYXRhOiBTaXRlRGF0YSkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgIHRoaXMudW5peE5hbWUgPSBkYXRhLnVuaXhOYW1lO1xuICAgIHRoaXMuZG9tYWluID0gZGF0YS5kb21haW47XG4gICAgdGhpcy5zc2xTdXBwb3J0ZWQgPSBkYXRhLnNzbFN1cHBvcnRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBhY2Nlc3NvclxuICAgKi9cbiAgZ2V0IHBhZ2UoKTogUGFnZUFjY2Vzc29yIHtcbiAgICBpZiAoIXRoaXMuX3BhZ2UpIHtcbiAgICAgIHRoaXMuX3BhZ2UgPSBuZXcgUGFnZUFjY2Vzc29yKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZXMgYWNjZXNzb3JcbiAgICovXG4gIGdldCBwYWdlcygpOiBQYWdlc0FjY2Vzc29yIHtcbiAgICBpZiAoIXRoaXMuX3BhZ2VzKSB7XG4gICAgICB0aGlzLl9wYWdlcyA9IG5ldyBQYWdlc0FjY2Vzc29yKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFnZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZvcnVtIGFjY2Vzc29yXG4gICAqL1xuICBnZXQgZm9ydW0oKTogRm9ydW1BY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9mb3J1bSkge1xuICAgICAgdGhpcy5fZm9ydW0gPSBuZXcgRm9ydW1BY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZvcnVtO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZW1iZXIgYWNjZXNzb3JcbiAgICovXG4gIGdldCBtZW1iZXIoKTogTWVtYmVyQWNjZXNzb3Ige1xuICAgIGlmICghdGhpcy5fbWVtYmVyKSB7XG4gICAgICB0aGlzLl9tZW1iZXIgPSBuZXcgTWVtYmVyQWNjZXNzb3IodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9tZW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJhc2UgVVJMIG9mIHRoZSBzaXRlXG4gICAqL1xuICBnZXRCYXNlVXJsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLnNzbFN1cHBvcnRlZCA/ICdodHRwcycgOiAnaHR0cCc7XG4gICAgcmV0dXJuIGAke3Byb3RvY29sfTovLyR7dGhpcy5kb21haW59YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIEFNQyByZXF1ZXN0IHRvIHRoaXMgc2l0ZVxuICAgKiBAcGFyYW0gYm9kaWVzIC0gUmVxdWVzdCBib2R5IGFycmF5XG4gICAqIEByZXR1cm5zIEFNQyByZXNwb25zZSBhcnJheVxuICAgKi9cbiAgYW1jUmVxdWVzdChib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10pOiBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2VbXT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMsIHRoaXMudW5peE5hbWUsIHRoaXMuc3NsU3VwcG9ydGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgc2luZ2xlIEFNQyByZXF1ZXN0XG4gICAqIEBwYXJhbSBib2R5IC0gUmVxdWVzdCBib2R5XG4gICAqIEByZXR1cm5zIEFNQyByZXNwb25zZVxuICAgKi9cbiAgYW1jUmVxdWVzdFNpbmdsZShib2R5OiBBTUNSZXF1ZXN0Qm9keSk6IFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYW1jUmVxdWVzdChbYm9keV0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdBTUMgcmVxdWVzdCByZXR1cm5lZCBlbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVW5leHBlY3RlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBBTUMgcmVxdWVzdCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIGZyb20gVU5JWCBuYW1lXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnRcbiAgICogQHBhcmFtIHVuaXhOYW1lIC0gU2l0ZSBVTklYIG5hbWUgKGUuZy4sICdzY3AtanAnKVxuICAgKiBAcmV0dXJucyBTaXRlXG4gICAqL1xuICBzdGF0aWMgZnJvbVVuaXhOYW1lKGNsaWVudDogQ2xpZW50LCB1bml4TmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGU+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBGZXRjaCBzaXRlIHBhZ2UgKEhUVFAgcmVxdWVzdCwgZm9sbG93aW5nIHJlZGlyZWN0cywgd2l0aCByZXRyeSlcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHA6Ly8ke3VuaXhOYW1lfS53aWtpZG90LmNvbWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkodXJsLCBjbGllbnQuYW1jQ2xpZW50LmNvbmZpZywge1xuICAgICAgICAgIGhlYWRlcnM6IGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLmdldEhlYWRlcnMoKSxcbiAgICAgICAgICBjaGVja09rOiBmYWxzZSwgLy8gSGFuZGxlIEhUVFAgZXJyb3JzIG1hbnVhbGx5IGZvciBiZXR0ZXIgZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBTaXRlIG5vdCBmb3VuZDogJHt1bml4TmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGZldGNoIHNpdGU6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcblxuICAgICAgICAvLyBQYXJzZSBXSUtJUkVRVUVTVC5pbmZvXG4gICAgICAgIGNvbnN0IHNjcmlwdHMgPSAkKCdzY3JpcHQnKS50b0FycmF5KCk7XG4gICAgICAgIGxldCBzaXRlSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgc2l0ZVVuaXhOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IGRvbWFpbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCB0aXRsZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgZm9yIChjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSAkKHNjcmlwdCkuaHRtbCgpO1xuICAgICAgICAgIGlmICghY29udGVudCB8fCAhY29udGVudC5pbmNsdWRlcygnV0lLSVJFUVVFU1QnKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2l0ZUlkXG4gICAgICAgICAgY29uc3Qgc2l0ZUlkTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9XSUtJUkVRVUVTVFxcLmluZm9cXC5zaXRlSWRcXHMqPVxccyooXFxkKykvKTtcbiAgICAgICAgICBpZiAoc2l0ZUlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgc2l0ZUlkID0gTnVtYmVyLnBhcnNlSW50KHNpdGVJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2l0ZVVuaXhOYW1lXG4gICAgICAgICAgY29uc3Qgc2l0ZVVuaXhOYW1lTWF0Y2ggPSBjb250ZW50Lm1hdGNoKFxuICAgICAgICAgICAgL1dJS0lSRVFVRVNUXFwuaW5mb1xcLnNpdGVVbml4TmFtZVxccyo9XFxzKltcIiddKFteXCInXSspW1wiJ10vXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoc2l0ZVVuaXhOYW1lTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgc2l0ZVVuaXhOYW1lID0gc2l0ZVVuaXhOYW1lTWF0Y2hbMV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZG9tYWluXG4gICAgICAgICAgY29uc3QgZG9tYWluTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9XSUtJUkVRVUVTVFxcLmluZm9cXC5kb21haW5cXHMqPVxccypbXCInXShbXlwiJ10rKVtcIiddLyk7XG4gICAgICAgICAgaWYgKGRvbWFpbk1hdGNoPy5bMV0pIHtcbiAgICAgICAgICAgIGRvbWFpbiA9IGRvbWFpbk1hdGNoWzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRpdGxlIGZyb20gPHRpdGxlPiB0YWdcbiAgICAgICAgdGl0bGUgPSAkKCd0aXRsZScpLnRleHQoKS50cmltKCkgfHwgbnVsbDtcbiAgICAgICAgLy8gUmVtb3ZlIFwiIC0gV2lraWRvdFwiIHN1ZmZpeCBpZiBwcmVzZW50XG4gICAgICAgIGlmICh0aXRsZT8uZW5kc1dpdGgoJyAtIFdpa2lkb3QnKSkge1xuICAgICAgICAgIHRpdGxlID0gdGl0bGUuc2xpY2UoMCwgLTEwKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2l0ZUlkID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdTaXRlIElEIG5vdCBmb3VuZCBpbiBXSUtJUkVRVUVTVCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaXRlVW5peE5hbWUgPT09IG51bGwpIHtcbiAgICAgICAgICBzaXRlVW5peE5hbWUgPSB1bml4TmFtZTsgLy8gRmFsbGJhY2tcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9tYWluID09PSBudWxsKSB7XG4gICAgICAgICAgZG9tYWluID0gYCR7dW5peE5hbWV9Lndpa2lkb3QuY29tYDsgLy8gRmFsbGJhY2tcbiAgICAgICAgfVxuICAgICAgICBpZiAodGl0bGUgPT09IG51bGwpIHtcbiAgICAgICAgICB0aXRsZSA9IHVuaXhOYW1lOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgU1NMIHN1cHBvcnQgKGJhc2VkIG9uIHdoZXRoZXIgdGhlIHJlZGlyZWN0IFVSTCBzdGFydHMgd2l0aCBodHRwcylcbiAgICAgICAgY29uc3Qgc3NsU3VwcG9ydGVkID0gcmVzcG9uc2UudXJsLnN0YXJ0c1dpdGgoJ2h0dHBzJyk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTaXRlKGNsaWVudCwge1xuICAgICAgICAgIGlkOiBzaXRlSWQsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgdW5peE5hbWU6IHNpdGVVbml4TmFtZSxcbiAgICAgICAgICBkb21haW4sXG4gICAgICAgICAgc3NsU3VwcG9ydGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24gfHwgZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBzaXRlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTaXRlKGlkPSR7dGhpcy5pZH0sIHVuaXhOYW1lPSR7dGhpcy51bml4TmFtZX0sIHRpdGxlPSR7dGhpcy50aXRsZX0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBTaXRlIH0gZnJvbSAnLi4vLi4vc2l0ZSc7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5cbi8qKlxuICogU2l0ZSBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2l0ZSBieSBVTklYIG5hbWVcbiAgICpcbiAgICogQHBhcmFtIHVuaXhOYW1lIC0gU2l0ZSBVTklYIG5hbWUgKGUuZy4sICdzY3AtanAnKVxuICAgKiBAcmV0dXJucyBTaXRlIG9iamVjdCB3cmFwcGVkIGluIFJlc3VsdCB0eXBlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc2l0ZVJlc3VsdCA9IGF3YWl0IGNsaWVudC5zaXRlLmdldCgnc2NwLWpwJyk7XG4gICAqIGlmICghc2l0ZVJlc3VsdC5pc09rKCkpIHtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgc2l0ZScpO1xuICAgKiB9XG4gICAqIGNvbnN0IHNpdGUgPSBzaXRlUmVzdWx0LnZhbHVlO1xuICAgKiBgYGBcbiAgICovXG4gIGdldCh1bml4TmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGU+IHtcbiAgICByZXR1cm4gU2l0ZS5mcm9tVW5peE5hbWUodGhpcy5jbGllbnQsIHVuaXhOYW1lKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTaXRlIH07XG4iLAogICAgImltcG9ydCB7IE5vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYywgd2RFcnJBc3luYywgd2RPa0FzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IFVzZXIsIHR5cGUgVXNlckNvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi91c2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiBVc2VyIHJldHJpZXZhbCBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VXNlck9wdGlvbnMge1xuICAvKiogVGhyb3cgZXJyb3IgaWYgdXNlciBub3QgZm91bmQgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICByYWlzZVdoZW5Ob3RGb3VuZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVXNlciBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdXNlciBieSB1c2VybmFtZVxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFVzZXJuYW1lXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gUmV0cmlldmFsIG9wdGlvbnNcbiAgICogQHJldHVybnMgVXNlciB3cmFwcGVkIGluIFJlc3VsdCB0eXBlIChudWxsIGlmIG5vdCBmb3VuZCwgZXJyb3IgaWYgcmFpc2VXaGVuTm90Rm91bmQgaXMgdHJ1ZSlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VyUmVzdWx0ID0gYXdhaXQgY2xpZW50LnVzZXIuZ2V0KCd1c2VybmFtZScpO1xuICAgKiBpZiAoIXVzZXJSZXN1bHQuaXNPaygpKSB7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IHVzZXInKTtcbiAgICogfVxuICAgKiBjb25zdCB1c2VyID0gdXNlclJlc3VsdC52YWx1ZTtcbiAgICogYGBgXG4gICAqL1xuICBnZXQobmFtZTogc3RyaW5nLCBvcHRpb25zOiBHZXRVc2VyT3B0aW9ucyA9IHt9KTogV2lraWRvdFJlc3VsdEFzeW5jPFVzZXIgfCBudWxsPiB7XG4gICAgY29uc3QgeyByYWlzZVdoZW5Ob3RGb3VuZCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIFVzZXIuZnJvbU5hbWUodGhpcy5jbGllbnQsIG5hbWUpLmFuZFRoZW4oKHVzZXIpID0+IHtcbiAgICAgIGlmICh1c2VyID09PSBudWxsICYmIHJhaXNlV2hlbk5vdEZvdW5kKSB7XG4gICAgICAgIHJldHVybiB3ZEVyckFzeW5jKG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVXNlciBub3QgZm91bmQ6ICR7bmFtZX1gKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKHVzZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VycyBmcm9tIG11bHRpcGxlIHVzZXJuYW1lc1xuICAgKiBAcGFyYW0gbmFtZXMgLSBBcnJheSBvZiB1c2VybmFtZXNcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBSZXRyaWV2YWwgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBVc2VyIGNvbGxlY3Rpb24gKG51bGwgZm9yIG5vbi1leGlzdGVudCB1c2VycywgZXJyb3IgaWYgcmFpc2VXaGVuTm90Rm91bmQgaXMgdHJ1ZSlcbiAgICovXG4gIGdldE1hbnkobmFtZXM6IHN0cmluZ1tdLCBvcHRpb25zOiBHZXRVc2VyT3B0aW9ucyA9IHt9KTogV2lraWRvdFJlc3VsdEFzeW5jPFVzZXJDb2xsZWN0aW9uPiB7XG4gICAgY29uc3QgeyByYWlzZVdoZW5Ob3RGb3VuZCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIFVzZXIuZnJvbU5hbWVzKHRoaXMuY2xpZW50LCBuYW1lcykuYW5kVGhlbigoY29sbGVjdGlvbikgPT4ge1xuICAgICAgaWYgKHJhaXNlV2hlbk5vdEZvdW5kKSB7XG4gICAgICAgIGNvbnN0IG5vdEZvdW5kTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gbmFtZXNbaV07XG4gICAgICAgICAgaWYgKGNvbGxlY3Rpb25baV0gPT09IG51bGwgJiYgbmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBub3RGb3VuZE5hbWVzLnB1c2gobmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RGb3VuZE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgTm90Rm91bmRFeGNlcHRpb24oYFVzZXJzIG5vdCBmb3VuZDogJHtub3RGb3VuZE5hbWVzLmpvaW4oJywgJyl9YCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKGNvbGxlY3Rpb24pO1xuICAgIH0pO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgZnJvbVByb21pc2UsXG4gIHR5cGUgV2lraWRvdFJlc3VsdCxcbiAgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsXG4gIHdkRXJyLFxuICB3ZE9rLFxuICB3ZE9rQXN5bmMsXG59IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBBTUNDbGllbnQsIHR5cGUgQU1DQ29uZmlnLCBsb2dpbiwgbG9nb3V0IH0gZnJvbSAnLi4vLi4vY29ubmVjdG9yJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi91c2VyL3VzZXInO1xuaW1wb3J0IHsgUHJpdmF0ZU1lc3NhZ2VBY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3JzL3BtLWFjY2Vzc29yJztcbmltcG9ydCB7IFNpdGVBY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3JzL3NpdGUtYWNjZXNzb3InO1xuaW1wb3J0IHsgVXNlckFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvdXNlci1hY2Nlc3Nvcic7XG5cbi8qKlxuICogQ2xpZW50IGNyZWF0aW9uIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRPcHRpb25zIHtcbiAgLyoqIFdpa2lkb3QgdXNlcm5hbWUgKi9cbiAgdXNlcm5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqIFdpa2lkb3QgcGFzc3dvcmQgKi9cbiAgcGFzc3dvcmQ/OiBzdHJpbmc7XG5cbiAgLyoqIEJhc2UgZG9tYWluIChkZWZhdWx0OiB3aWtpZG90LmNvbSkgKi9cbiAgZG9tYWluPzogc3RyaW5nO1xuXG4gIC8qKiBBTUMgY29uZmlndXJhdGlvbiBvdmVycmlkZSAqL1xuICBhbWNDb25maWc/OiBQYXJ0aWFsPEFNQ0NvbmZpZz47XG59XG5cbi8qKlxuICogV2lraWRvdCBjbGllbnRcbiAqIE1haW4gZW50cnkgcG9pbnQgb2YgdGhlIGxpYnJhcnlcbiAqL1xuZXhwb3J0IGNsYXNzIENsaWVudCB7XG4gIC8qKiBBTUMgY2xpZW50ICovXG4gIHB1YmxpYyByZWFkb25seSBhbWNDbGllbnQ6IEFNQ0NsaWVudDtcblxuICAvKiogQmFzZSBkb21haW4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nO1xuXG4gIC8qKiBVc2VyIG9wZXJhdGlvbnMgYWNjZXNzb3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IFVzZXJBY2Nlc3NvcjtcblxuICAvKiogU2l0ZSBvcGVyYXRpb25zIGFjY2Vzc29yICovXG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlQWNjZXNzb3I7XG5cbiAgLyoqIFByaXZhdGUgbWVzc2FnZSBvcGVyYXRpb25zIGFjY2Vzc29yICovXG4gIHB1YmxpYyByZWFkb25seSBwcml2YXRlTWVzc2FnZTogUHJpdmF0ZU1lc3NhZ2VBY2Nlc3NvcjtcblxuICAvKiogVXNlcm5hbWUgb2YgdGhlIGxvZ2dlZC1pbiB1c2VyICovXG4gIHByaXZhdGUgX3VzZXJuYW1lOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKiBMb2dnZWQtaW4gdXNlciAqL1xuICBwcml2YXRlIF9tZTogVXNlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yXG4gICAqIFVzZSB0aGUgY3JlYXRlIG1ldGhvZCB0byBjcmVhdGUgYW4gaW5zdGFuY2VcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IoYW1jQ2xpZW50OiBBTUNDbGllbnQsIGRvbWFpbjogc3RyaW5nLCB1c2VybmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcbiAgICB0aGlzLmFtY0NsaWVudCA9IGFtY0NsaWVudDtcbiAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjtcbiAgICB0aGlzLl91c2VybmFtZSA9IHVzZXJuYW1lO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhY2Nlc3NvcnNcbiAgICB0aGlzLnVzZXIgPSBuZXcgVXNlckFjY2Vzc29yKHRoaXMpO1xuICAgIHRoaXMuc2l0ZSA9IG5ldyBTaXRlQWNjZXNzb3IodGhpcyk7XG4gICAgdGhpcy5wcml2YXRlTWVzc2FnZSA9IG5ldyBQcml2YXRlTWVzc2FnZUFjY2Vzc29yKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlcm5hbWUgb2YgdGhlIGxvZ2dlZC1pbiB1c2VyXG4gICAqL1xuICBnZXQgdXNlcm5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9nZ2VkLWluIHVzZXJcbiAgICogUmV0dXJucyBudWxsIGlmIG5vdCBsb2dnZWQgaW5cbiAgICovXG4gIGdldCBtZSgpOiBVc2VyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21lO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNsaWVudFxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENsaWVudCBvcHRpb25zXG4gICAqIEByZXR1cm5zIENsaWVudCBpbnN0YW5jZSB3cmFwcGVkIGluIFJlc3VsdCB0eXBlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnQHVrd2hhdG4vd2lraWRvdCc7XG4gICAqXG4gICAqIC8vIENyZWF0ZSBhIGNsaWVudFxuICAgKiBjb25zdCBjbGllbnRSZXN1bHQgPSBhd2FpdCBDbGllbnQuY3JlYXRlKHtcbiAgICogICB1c2VybmFtZTogJ3lvdXJfdXNlcm5hbWUnLFxuICAgKiAgIHBhc3N3b3JkOiAneW91cl9wYXNzd29yZCcsXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBSZXN1bHQgdHlwZSByZXF1aXJlcyBpc09rKCkgY2hlY2sgYmVmb3JlIGFjY2Vzc2luZyAudmFsdWVcbiAgICogaWYgKCFjbGllbnRSZXN1bHQuaXNPaygpKSB7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGNsaWVudCcpO1xuICAgKiB9XG4gICAqIGNvbnN0IGNsaWVudCA9IGNsaWVudFJlc3VsdC52YWx1ZTtcbiAgICpcbiAgICogLy8gTm93IHlvdSBjYW4gYWNjZXNzIGNsaWVudC5zaXRlLCBldGMuXG4gICAqIGNvbnN0IHNpdGVSZXN1bHQgPSBhd2FpdCBjbGllbnQuc2l0ZS5nZXQoJ3NjcC1qcCcpO1xuICAgKiBgYGBcbiAgICovXG4gIHN0YXRpYyBjcmVhdGUob3B0aW9uczogQ2xpZW50T3B0aW9ucyA9IHt9KTogV2lraWRvdFJlc3VsdEFzeW5jPENsaWVudD4ge1xuICAgIGNvbnN0IHsgdXNlcm5hbWUsIHBhc3N3b3JkLCBkb21haW4gPSAnd2lraWRvdC5jb20nLCBhbWNDb25maWcgPSB7fSB9ID0gb3B0aW9ucztcblxuICAgIC8vIENyZWF0ZSBBTUMgY2xpZW50XG4gICAgY29uc3QgYW1jQ2xpZW50ID0gbmV3IEFNQ0NsaWVudChhbWNDb25maWcsIGRvbWFpbik7XG5cbiAgICAvLyBMb2dpbiBpZiBjcmVkZW50aWFscyBhcmUgcHJvdmlkZWRcbiAgICBpZiAodXNlcm5hbWUgJiYgcGFzc3dvcmQpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KGFtY0NsaWVudCwgZG9tYWluLCB1c2VybmFtZSk7XG4gICAgICAgICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBsb2dpbihjbGllbnQsIHVzZXJuYW1lLCBwYXNzd29yZCk7XG4gICAgICAgICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IGxvZ2luUmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEdldCBsb2dnZWQtaW4gdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgIGNvbnN0IHVzZXJSZXN1bHQgPSBhd2FpdCBVc2VyLmZyb21OYW1lKGNsaWVudCwgdXNlcm5hbWUpO1xuICAgICAgICAgIGlmICh1c2VyUmVzdWx0LmlzT2soKSAmJiB1c2VyUmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgICBjbGllbnQuX21lID0gdXNlclJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY2xpZW50O1xuICAgICAgICB9KSgpLFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgY2xpZW50OiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHVuYXV0aGVudGljYXRlZCBjbGllbnRcbiAgICByZXR1cm4gd2RPa0FzeW5jKG5ldyBDbGllbnQoYW1jQ2xpZW50LCBkb21haW4pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gdW5hdXRoZW50aWNhdGVkIGNsaWVudFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENsaWVudCBvcHRpb25zIChleGNsdWRpbmcgY3JlZGVudGlhbHMpXG4gICAqIEByZXR1cm5zIENsaWVudCBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUFub255bW91cyhvcHRpb25zOiBPbWl0PENsaWVudE9wdGlvbnMsICd1c2VybmFtZScgfCAncGFzc3dvcmQnPiA9IHt9KTogQ2xpZW50IHtcbiAgICBjb25zdCB7IGRvbWFpbiA9ICd3aWtpZG90LmNvbScsIGFtY0NvbmZpZyA9IHt9IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGFtY0NsaWVudCA9IG5ldyBBTUNDbGllbnQoYW1jQ29uZmlnLCBkb21haW4pO1xuICAgIHJldHVybiBuZXcgQ2xpZW50KGFtY0NsaWVudCwgZG9tYWluKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBsb2dpbiBzdGF0dXNcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBsb2dnZWQgaW5cbiAgICovXG4gIGlzTG9nZ2VkSW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJuYW1lICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVpcmUgbG9naW5cbiAgICogUmV0dXJucyBMb2dpblJlcXVpcmVkRXJyb3IgaWYgbm90IGxvZ2dlZCBpblxuICAgKiBAcmV0dXJucyB2b2lkIG9uIHN1Y2Nlc3NcbiAgICovXG4gIHJlcXVpcmVMb2dpbigpOiBXaWtpZG90UmVzdWx0PHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNMb2dnZWRJbigpKSB7XG4gICAgICByZXR1cm4gd2RFcnIobmV3IExvZ2luUmVxdWlyZWRFcnJvcigpKTtcbiAgICB9XG4gICAgcmV0dXJuIHdkT2sodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgY2xpZW50XG4gICAqIEF0dGVtcHRzIHRvIGxvZ291dCBpZiBhIHNlc3Npb24gZXhpc3RzXG4gICAqL1xuICBjbG9zZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzTG9nZ2VkSW4oKSkge1xuICAgICAgcmV0dXJuIGxvZ291dCh0aGlzKS5tYXAoKCkgPT4ge1xuICAgICAgICB0aGlzLl91c2VybmFtZSA9IG51bGw7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHdkT2tBc3luYyh1bmRlZmluZWQpO1xuICB9XG59XG4iLAogICAgImV4cG9ydCAqIGZyb20gJy4vY2xpZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZm9ydW0nO1xuZXhwb3J0ICogZnJvbSAnLi9wYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJpdmF0ZS1tZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vc2l0ZSc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vdXNlcic7XG4iLAogICAgImV4cG9ydCAqIGZyb20gJy4vcGFyc2VyJztcbmV4cG9ydCAqIGZyb20gJy4vcXVpY2stbW9kdWxlJztcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUlzQixjQWtCVDtBQUFBO0FBQUEsRUFsQlMsZUFBZixNQUFlLHFCQUFxQixNQUFNO0FBQUEsSUFFdEI7QUFBQSxJQUt6QixXQUFXLENBQUMsU0FBaUI7QUFBQSxNQUMzQixNQUFNLE9BQU87QUFBQSxNQUNiLEtBQUssT0FBTyxLQUFLLFlBQVk7QUFBQSxNQUM3QixPQUFPLGVBQWUsTUFBTSxXQUFXLFNBQVM7QUFBQTtBQUFBLEVBRXBEO0FBQUEsRUFNYSxrQkFBTixNQUFNLHdCQUF3QixhQUFhO0FBQUEsRUFBQztBQUFBOzs7SUNqQnRDLFVBTUEsY0FrQkEsb0JBa0JBO0FBQUE7QUFBQSxFQS9DYjtBQUFBLEVBS2EsV0FBTixNQUFNLGlCQUFpQixhQUFhO0FBQUEsRUFBQztBQUFBLEVBTS9CLGVBQU4sTUFBTSxxQkFBcUIsU0FBUztBQUFBLElBRXpCO0FBQUEsSUFNaEIsV0FBVyxDQUFDLFNBQWlCLFlBQW9CO0FBQUEsTUFDL0MsTUFBTSxPQUFPO0FBQUEsTUFDYixLQUFLLGFBQWE7QUFBQTtBQUFBLEVBRXRCO0FBQUEsRUFNYSxxQkFBTixNQUFNLDJCQUEyQixTQUFTO0FBQUEsSUFFL0I7QUFBQSxJQU1oQixXQUFXLENBQUMsU0FBaUIsWUFBb0I7QUFBQSxNQUMvQyxNQUFNLE9BQU87QUFBQSxNQUNiLEtBQUssYUFBYTtBQUFBO0FBQUEsRUFFdEI7QUFBQSxFQU1hLG9CQUFOLE1BQU0sMEJBQTBCLFNBQVM7QUFBQSxFQUFDO0FBQUE7OztJQzFDcEMsY0FNQSxvQkFNQTtBQUFBO0FBQUEsRUFqQmI7QUFBQSxFQUthLGVBQU4sTUFBTSxxQkFBcUIsYUFBYTtBQUFBLEVBQUM7QUFB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Q1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElB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WUFBWTtBQUFBLFFBQ1gsTUFBTSxTQUFTLElBQUksT0FBTyxXQUFXLFFBQVEsUUFBUTtBQUFBLFFBQ3JELE1BQU0sY0FBYyxNQUFNLE1BQU0sUUFBUSxVQUFVLFFBQVE7QUFBQSxRQUMxRCxJQUFJLFlBQVksTUFBTSxHQUFHO0FBQUEsVUFDdkIsTUFBTSxZQUFZO0FBQUEsUUFDcEI7QUFBQSxRQUdBLE1BQU0sYUFBYSxNQUFNLEtBQUssU0FBUyxRQUFRLFFBQVE7QUFBQSxRQUN2RCxJQUFJLFdBQVcsS0FBSyxLQUFLLFdBQVcsT0FBTztBQUFBLFVBQ3pDLE9BQU8sTUFBTSxXQUFXO0FBQUEsUUFDMUI7QUFBQSxRQUVBLE9BQU87QUFBQSxTQUNOLEdBQ0gsQ0FBQyxVQUFVO0FBQUEsUUFDVCxJQUFJLGlCQUFpQixvQkFBb0I7QUFBQSxVQUN2QyxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0EsT0FBTyxJQUFJLG1CQUFtQiw0QkFBNEIsT0FBTyxLQUFLLEdBQUc7QUFBQSxPQUU3RTtBQUFBLElBQ0Y7QUFBQSxJQUdBLE9BQU8sVUFBVSxJQUFJLE9BQU8sV0FBVyxNQUFNLENBQUM7QUFBQTtBQUFBLFNBUXpDLGVBQWUsQ0FBQyxVQUF3RCxDQUFDLEdBQVc7QUFBQSxJQUN6RixRQUFRLFNBQVMsZUFBZSxZQUFZLENBQUMsTUFBTTtBQUFBLElBQ25ELE1BQU0sWUFBWSxJQUFJLFVBQVUsV0FBVyxNQUFNO0FBQUEsSUFDakQsT0FBTyxJQUFJLE9BQU8sV0FBVyxNQUFNO0FBQUE7QUFBQSxFQU9yQyxVQUFVLEdBQVk7QUFBQSxJQUNwQixPQUFPLEtBQUssY0FBYztBQUFBO0FBQUEsRUFRNUIsWUFBWSxHQUF3QjtBQUFBLElBQ2xDLElBQUksQ0FBQyxLQUFLLFdBQVcsR0FBRztBQUFBLE1BQ3RCLE9BQU8sTUFBTSxJQUFJLGtCQUFvQjtBQUFBLElBQ3ZDO0FBQUEsSUFDQSxPQUFPLEtBQUssU0FBUztBQUFBO0FBQUEsRUFPdkIsS0FBSyxHQUE2QjtBQUFBLElBQ2hDLElBQUksS0FBSyxXQUFXLEdBQUc7QUFBQSxNQUNyQixPQUFPLE9BQU8sSUFBSSxFQUFFLElBQUksTUFBTTtBQUFBLFFBQzVCLEtBQUssWUFBWTtBQUFBLFFBQ2pCO0FBQUEsT0FDRDtBQUFBLElBQ0g7QUFBQSxJQUNBLE9BQU8sVUFBVSxTQUFTO0FBQUE7QUFFOUI7O0FDbE1BO0FBS0E7O0FDTkE7IiwKICAiZGVidWdJZCI6ICIwRDg0MzA3QzYwRDgxQzUzNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
5108
|
+
//# debugId=23DC43E4EDFB747B64756E2164756E21
|
|
5109
|
+
//# 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+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcmV2aXNpb25zOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBGb3J1bVBvc3QoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG5cbi8qKlxuICogRm9ydW0gcG9zdCBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVBvc3RDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8Rm9ydW1Qb3N0PiB7XG4gIHB1YmxpYyByZWFkb25seSB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmO1xuXG4gIGNvbnN0cnVjdG9yKHRocmVhZDogRm9ydW1UaHJlYWRSZWYsIHBvc3RzPzogRm9ydW1Qb3N0W10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudGhyZWFkID0gdGhyZWFkO1xuICAgIGlmIChwb3N0cykge1xuICAgICAgdGhpcy5wdXNoKC4uLnBvc3RzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKiBAcGFyYW0gaWQgLSBQb3N0IElEXG4gICAqIEByZXR1cm5zIFBvc3QgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1Qb3N0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChwb3N0KSA9PiBwb3N0LmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgcG9zdHMgZnJvbSBIVE1MIChpbnRlcm5hbCBtZXRob2QpXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfcGFyc2UodGhyZWFkOiBGb3J1bVRocmVhZFJlZiwgJDogQ2hlZXJpb0FQSSk6IEZvcnVtUG9zdFtdIHtcbiAgICBjb25zdCBwb3N0czogRm9ydW1Qb3N0W10gPSBbXTtcblxuICAgICQoJ2Rpdi5wb3N0JykuZWFjaCgoX2ksIHBvc3RFbGVtKSA9PiB7XG4gICAgICBjb25zdCAkcG9zdCA9ICQocG9zdEVsZW0pO1xuICAgICAgY29uc3QgcG9zdElkQXR0ciA9ICRwb3N0LmF0dHIoJ2lkJyk7XG4gICAgICBpZiAoIXBvc3RJZEF0dHIpIHJldHVybjtcblxuICAgICAgY29uc3QgcG9zdElkID0gTnVtYmVyLnBhcnNlSW50KHBvc3RJZEF0dHIucmVwbGFjZSgncG9zdC0nLCAnJyksIDEwKTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4ocG9zdElkKSkgcmV0dXJuO1xuXG4gICAgICAvLyBHZXQgcGFyZW50IHBvc3QgSURcbiAgICAgIGxldCBwYXJlbnRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCAkcGFyZW50Q29udGFpbmVyID0gJHBvc3QucGFyZW50KCk7XG4gICAgICBpZiAoJHBhcmVudENvbnRhaW5lci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0ICRncmFuZHBhcmVudCA9ICRwYXJlbnRDb250YWluZXIucGFyZW50KCk7XG4gICAgICAgIGlmICgkZ3JhbmRwYXJlbnQubGVuZ3RoID4gMCAmJiAkZ3JhbmRwYXJlbnRbMF0/Lm5hbWUgIT09ICdib2R5Jykge1xuICAgICAgICAgIGNvbnN0IGdyYW5kcGFyZW50Q2xhc3NlcyA9ICRncmFuZHBhcmVudC5hdHRyKCdjbGFzcycpID8/ICcnO1xuICAgICAgICAgIGlmIChncmFuZHBhcmVudENsYXNzZXMuaW5jbHVkZXMoJ3Bvc3QtY29udGFpbmVyJykpIHtcbiAgICAgICAgICAgIGNvbnN0ICRwYXJlbnRQb3N0ID0gJGdyYW5kcGFyZW50LmZpbmQoJz4gZGl2LnBvc3QnKTtcbiAgICAgICAgICAgIGlmICgkcGFyZW50UG9zdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBvc3RJZEF0dHIgPSAkcGFyZW50UG9zdC5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgICBpZiAocGFyZW50UG9zdElkQXR0cikge1xuICAgICAgICAgICAgICAgIHBhcmVudElkID0gTnVtYmVyLnBhcnNlSW50KHBhcmVudFBvc3RJZEF0dHIucmVwbGFjZSgncG9zdC0nLCAnJyksIDEwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdGl0bGUgYW5kIGNvbnRlbnRcbiAgICAgIGNvbnN0ICR3cmFwcGVyID0gJHBvc3QuZmluZCgnZGl2LmxvbmcnKTtcbiAgICAgIGlmICgkd3JhcHBlci5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgJGhlYWQgPSAkd3JhcHBlci5maW5kKCdkaXYuaGVhZCcpO1xuICAgICAgaWYgKCRoZWFkLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCAkdGl0bGUgPSAkaGVhZC5maW5kKCdkaXYudGl0bGUnKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gJHRpdGxlLnRleHQoKS50cmltKCk7XG5cbiAgICAgIGNvbnN0ICRjb250ZW50ID0gJHdyYXBwZXIuZmluZCgnZGl2LmNvbnRlbnQnKTtcbiAgICAgIGNvbnN0IHRleHQgPSAkY29udGVudC5odG1sKCkgPz8gJyc7XG5cbiAgICAgIC8vIEF1dGhvciBhbmQgdGltZXN0YW1wXG4gICAgICBjb25zdCAkaW5mbyA9ICRoZWFkLmZpbmQoJ2Rpdi5pbmZvJyk7XG4gICAgICBpZiAoJGluZm8ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0ICR1c2VyRWxlbSA9ICRpbmZvLmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICBpZiAoJHVzZXJFbGVtLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBjcmVhdGVkQnkgPSBwYXJzZVVzZXIodGhyZWFkLnNpdGUuY2xpZW50IGFzIENsaWVudCwgJHVzZXJFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuXG4gICAgICBjb25zdCAkb2RhdGVFbGVtID0gJGluZm8uZmluZCgnc3Bhbi5vZGF0ZScpO1xuICAgICAgaWYgKCRvZGF0ZUVsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHBhcnNlT2RhdGUoJG9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgICAvLyBFZGl0IGluZm8gKGlmIGV4aXN0cylcbiAgICAgIGxldCBlZGl0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgZWRpdGVkQXQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICAgIGNvbnN0ICRjaGFuZ2VzID0gJHdyYXBwZXIuZmluZCgnZGl2LmNoYW5nZXMnKTtcbiAgICAgIGlmICgkY2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0ICRlZGl0VXNlckVsZW0gPSAkY2hhbmdlcy5maW5kKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICBjb25zdCAkZWRpdE9kYXRlRWxlbSA9ICRjaGFuZ2VzLmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgICAgaWYgKCRlZGl0VXNlckVsZW0ubGVuZ3RoID4gMCAmJiAkZWRpdE9kYXRlRWxlbS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZWRpdGVkQnkgPSBwYXJzZVVzZXIodGhyZWFkLnNpdGUuY2xpZW50IGFzIENsaWVudCwgJGVkaXRVc2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KTtcbiAgICAgICAgICBlZGl0ZWRBdCA9IHBhcnNlT2RhdGUoJGVkaXRPZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPik7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcG9zdHMucHVzaChcbiAgICAgICAgbmV3IEZvcnVtUG9zdCh7XG4gICAgICAgICAgdGhyZWFkLFxuICAgICAgICAgIGlkOiBwb3N0SWQsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICBlbGVtZW50OiBwb3N0RWxlbSBhcyBFbGVtZW50LFxuICAgICAgICAgIGNyZWF0ZWRCeSxcbiAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgZWRpdGVkQnksXG4gICAgICAgICAgZWRpdGVkQXQsXG4gICAgICAgICAgcGFyZW50SWQsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBvc3RzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcG9zdHMgaW4gYSB0aHJlYWRcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsSW5UaHJlYWQodGhyZWFkOiBGb3J1bVRocmVhZFJlZik6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVBvc3RDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcG9zdHM6IEZvcnVtUG9zdFtdID0gW107XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXN1bHQgPSBhd2FpdCB0aHJlYWQuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3VGhyZWFkUG9zdHNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZU5vOiAnMScsXG4gICAgICAgICAgICB0OiBTdHJpbmcodGhyZWFkLmlkKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAoZmlyc3RSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IGZpcnN0UmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIWZpcnN0UmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEJvZHkgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0Qm9keSk7XG5cbiAgICAgICAgcG9zdHMucHVzaCguLi5Gb3J1bVBvc3RDb2xsZWN0aW9uLl9wYXJzZSh0aHJlYWQsICRmaXJzdCkpO1xuXG4gICAgICAgIC8vIENoZWNrIHBhZ2luYXRpb25cbiAgICAgICAgY29uc3QgJHBhZ2VyID0gJGZpcnN0KCdkaXYucGFnZXInKTtcbiAgICAgICAgaWYgKCRwYWdlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtUG9zdENvbGxlY3Rpb24odGhyZWFkLCBwb3N0cyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCAkcGFnZXJUYXJnZXRzID0gJHBhZ2VyLmZpbmQoJ3NwYW4udGFyZ2V0Jyk7XG4gICAgICAgIGlmICgkcGFnZXJUYXJnZXRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtUG9zdENvbGxlY3Rpb24odGhyZWFkLCBwb3N0cyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgbGFzdCBwYWdlIG51bWJlciBmcm9tIHNlY29uZCB0byBsYXN0IHBhZ2UgbGlua1xuICAgICAgICBjb25zdCBsYXN0UGFnZVRleHQgPSAkcGFnZXJUYXJnZXRzXG4gICAgICAgICAgLmVxKCRwYWdlclRhcmdldHMubGVuZ3RoIC0gMilcbiAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgY29uc3QgbGFzdFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCk7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4obGFzdFBhZ2UpIHx8IGxhc3RQYWdlIDw9IDEpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZvcnVtUG9zdENvbGxlY3Rpb24odGhyZWFkLCBwb3N0cyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcmVtYWluaW5nIHBhZ2VzXG4gICAgICAgIGNvbnN0IGJvZGllczogeyBtb2R1bGVOYW1lOiBzdHJpbmc7IHBhZ2VObzogc3RyaW5nOyB0OiBzdHJpbmcgfVtdID0gW107XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IGxhc3RQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICBib2RpZXMucHVzaCh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3VGhyZWFkUG9zdHNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZU5vOiBTdHJpbmcocGFnZSksXG4gICAgICAgICAgICB0OiBTdHJpbmcodGhyZWFkLmlkKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgdGhyZWFkLnNpdGUuYW1jUmVxdWVzdChib2RpZXMpO1xuICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdHMuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGFkZGl0aW9uYWxSZXN1bHRzLmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBhZGRpdGlvbmFsUmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG4gICAgICAgICAgcG9zdHMucHVzaCguLi5Gb3J1bVBvc3RDb2xsZWN0aW9uLl9wYXJzZSh0aHJlYWQsICQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1Qb3N0Q29sbGVjdGlvbih0aHJlYWQsIHBvc3RzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBvc3RzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBvc3RzIGZyb20gbXVsdGlwbGUgdGhyZWFkc1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVBbGxJblRocmVhZHMoXG4gICAgdGhyZWFkczogRm9ydW1UaHJlYWRSZWZbXVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8TWFwPG51bWJlciwgRm9ydW1Qb3N0Q29sbGVjdGlvbj4+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhyZWFkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IE1hcDxudW1iZXIsIEZvcnVtUG9zdENvbGxlY3Rpb24+KCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPG51bWJlciwgRm9ydW1Qb3N0Q29sbGVjdGlvbj4oKTtcbiAgICAgICAgY29uc3Qgc2l0ZSA9IHRocmVhZHNbMF0hLnNpdGU7XG5cbiAgICAgICAgLy8gU3RlcCAxOiBHZXQgZmlyc3QgcGFnZSBvZiBhbGwgdGhyZWFkc1xuICAgICAgICBjb25zdCBmaXJzdFBhZ2VSZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoXG4gICAgICAgICAgdGhyZWFkcy5tYXAoKHRocmVhZCkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVZpZXdUaHJlYWRQb3N0c01vZHVsZScsXG4gICAgICAgICAgICBwYWdlTm86ICcxJyxcbiAgICAgICAgICAgIHQ6IFN0cmluZyh0aHJlYWQuaWQpLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChmaXJzdFBhZ2VSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0UGFnZVJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgMjogUGFyc2UgZmlyc3QgcGFnZXMgYW5kIGRldGVybWluZSBwYWdpbmF0aW9uXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXF1ZXN0czogeyB0aHJlYWQ6IEZvcnVtVGhyZWFkUmVmOyBwYWdlOiBudW1iZXIgfVtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHJlYWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdGhyZWFkID0gdGhyZWFkc1tpXSE7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBmaXJzdFBhZ2VSZXN1bHQudmFsdWVbaV07XG4gICAgICAgICAgaWYgKCFyZXNwb25zZSkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgICBjb25zdCBwb3N0cyA9IEZvcnVtUG9zdENvbGxlY3Rpb24uX3BhcnNlKHRocmVhZCwgJCk7XG4gICAgICAgICAgcmVzdWx0LnNldCh0aHJlYWQuaWQsIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpKTtcblxuICAgICAgICAgIC8vIENoZWNrIHBhZ2luYXRpb25cbiAgICAgICAgICBjb25zdCAkcGFnZXIgPSAkKCdkaXYucGFnZXInKTtcbiAgICAgICAgICBpZiAoJHBhZ2VyLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCAkcGFnZXJUYXJnZXRzID0gJHBhZ2VyLmZpbmQoJ3NwYW4udGFyZ2V0Jyk7XG4gICAgICAgICAgaWYgKCRwYWdlclRhcmdldHMubGVuZ3RoIDwgMikgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBsYXN0UGFnZVRleHQgPSAkcGFnZXJUYXJnZXRzXG4gICAgICAgICAgICAuZXEoJHBhZ2VyVGFyZ2V0cy5sZW5ndGggLSAyKVxuICAgICAgICAgICAgLnRleHQoKVxuICAgICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBsYXN0UGFnZSA9IE51bWJlci5wYXJzZUludChsYXN0UGFnZVRleHQsIDEwKTtcbiAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGxhc3RQYWdlKSB8fCBsYXN0UGFnZSA8PSAxKSBjb250aW51ZTtcblxuICAgICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IGxhc3RQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICAgIGFkZGl0aW9uYWxSZXF1ZXN0cy5wdXNoKHsgdGhyZWFkLCBwYWdlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgMzogRmV0Y2ggYWRkaXRpb25hbCBwYWdlc1xuICAgICAgICBpZiAoYWRkaXRpb25hbFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgICAgYWRkaXRpb25hbFJlcXVlc3RzLm1hcCgoeyB0aHJlYWQsIHBhZ2UgfSkgPT4gKHtcbiAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZvcnVtL0ZvcnVtVmlld1RocmVhZFBvc3RzTW9kdWxlJyxcbiAgICAgICAgICAgICAgcGFnZU5vOiBTdHJpbmcocGFnZSksXG4gICAgICAgICAgICAgIHQ6IFN0cmluZyh0aHJlYWQuaWQpLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IGFkZGl0aW9uYWxSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsUmVxdWVzdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGhyZWFkIH0gPSBhZGRpdGlvbmFsUmVxdWVzdHNbaV0hO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhZGRpdGlvbmFsUmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgICAgaWYgKCFyZXNwb25zZSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuICAgICAgICAgICAgY29uc3QgcG9zdHMgPSBGb3J1bVBvc3RDb2xsZWN0aW9uLl9wYXJzZSh0aHJlYWQsICQpO1xuXG4gICAgICAgICAgICBjb25zdCBleGlzdGluZyA9IHJlc3VsdC5nZXQodGhyZWFkLmlkKTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICBleGlzdGluZy5wdXNoKC4uLnBvc3RzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcG9zdHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhY3F1aXJlIHBvc3Qgc291cmNlcyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBvc3RTb3VyY2VzKFxuICAgIHRocmVhZDogRm9ydW1UaHJlYWRSZWYsXG4gICAgcG9zdHM6IEZvcnVtUG9zdFtdXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVBvc3RDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UG9zdHMgPSBwb3N0cy5maWx0ZXIoKHBvc3QpID0+IHBvc3Quc291cmNlID09PSBudWxsKTtcblxuICAgICAgICBpZiAodGFyZ2V0UG9zdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhyZWFkLnNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQb3N0cy5tYXAoKHBvc3QpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vc3ViL0ZvcnVtRWRpdFBvc3RGb3JtTW9kdWxlJyxcbiAgICAgICAgICAgIHRocmVhZElkOiB0aHJlYWQuaWQsXG4gICAgICAgICAgICBwb3N0SWQ6IHBvc3QuaWQsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQb3N0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBvc3QgPSB0YXJnZXRQb3N0c1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBvc3QgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKSk7XG4gICAgICAgICAgY29uc3Qgc291cmNlRWxlbSA9ICQoXCJ0ZXh0YXJlYVtuYW1lPSdzb3VyY2UnXVwiKTtcbiAgICAgICAgICBpZiAoc291cmNlRWxlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgU291cmNlIHRleHRhcmVhIG5vdCBmb3VuZCBmb3IgcG9zdDogJHtwb3N0LmlkfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3N0LnNvdXJjZSA9IHNvdXJjZUVsZW0udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRocmVhZCwgcG9zdHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcG9zdCBzb3VyY2VzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc291cmNlcyBmb3IgYWxsIHBvc3RzIGluIHRoZSBjb2xsZWN0aW9uXG4gICAqIEByZXR1cm5zIFJlc3VsdCBjb250YWluaW5nIHRoZSBjb2xsZWN0aW9uIChmb3IgbWV0aG9kIGNoYWluaW5nKVxuICAgKi9cbiAgZ2V0UG9zdFNvdXJjZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtUG9zdENvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gRm9ydW1Qb3N0Q29sbGVjdGlvbi5hY3F1aXJlUG9zdFNvdXJjZXModGhpcy50aHJlYWQsIEFycmF5LmZyb20odGhpcykpO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2hlZXJpbyB9IGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB0eXBlIHsgQW55Tm9kZSB9IGZyb20gJ2RvbWhhbmRsZXInO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlT2RhdGUsIHBhcnNlVXNlciB9IGZyb20gJy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcbmltcG9ydCB0eXBlIHsgRm9ydW1DYXRlZ29yeSB9IGZyb20gJy4vZm9ydW0tY2F0ZWdvcnknO1xuaW1wb3J0IHsgRm9ydW1Qb3N0Q29sbGVjdGlvbiB9IGZyb20gJy4vZm9ydW0tcG9zdCc7XG5cbi8qKlxuICogRm9ydW0gdGhyZWFkIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3J1bVRocmVhZERhdGEge1xuICBzaXRlOiBTaXRlO1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgcG9zdENvdW50OiBudW1iZXI7XG4gIGNhdGVnb3J5PzogRm9ydW1DYXRlZ29yeSB8IG51bGw7XG59XG5cbi8qKlxuICogRm9ydW0gdGhyZWFkXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVRocmVhZCB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0OiBEYXRlO1xuICBwdWJsaWMgcG9zdENvdW50OiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBjYXRlZ29yeTogRm9ydW1DYXRlZ29yeSB8IG51bGw7XG4gIHByaXZhdGUgX3Bvc3RzOiBGb3J1bVBvc3RDb2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogRm9ydW1UaHJlYWREYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkYXRhLmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLnBvc3RDb3VudCA9IGRhdGEucG9zdENvdW50O1xuICAgIHRoaXMuY2F0ZWdvcnkgPSBkYXRhLmNhdGVnb3J5ID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRocmVhZCBVUkxcbiAgICovXG4gIGdldFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnNpdGUuZ2V0QmFzZVVybCgpfS9mb3J1bS90LSR7dGhpcy5pZH0vYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcG9zdCBsaXN0XG4gICAqL1xuICBnZXRQb3N0cygpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1Qb3N0Q29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl9wb3N0cyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFByb21pc2UucmVzb2x2ZSh0aGlzLl9wb3N0cyksIChlKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKFN0cmluZyhlKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IEZvcnVtUG9zdENvbGxlY3Rpb24uYWNxdWlyZUFsbEluVGhyZWFkcyhbdGhpc10pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcG9zdHMgPSByZXN1bHQudmFsdWUuZ2V0KHRoaXMuaWQpID8/IG5ldyBGb3J1bVBvc3RDb2xsZWN0aW9uKHRoaXMsIFtdKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc3RzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBwb3N0czogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBseSB0byB0aHJlYWRcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgcmVwbHkoXG4gICAgc291cmNlOiBzdHJpbmcsXG4gICAgdGl0bGUgPSAnJyxcbiAgICBwYXJlbnRQb3N0SWQ6IG51bWJlciB8IG51bGwgPSBudWxsXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0aHJlYWRJZDogU3RyaW5nKHRoaXMuaWQpLFxuICAgICAgICAgICAgcGFyZW50SWQ6IHBhcmVudFBvc3RJZCAhPT0gbnVsbCA/IFN0cmluZyhwYXJlbnRQb3N0SWQpIDogJycsXG4gICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgIGFjdGlvbjogJ0ZvcnVtQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZVBvc3QnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Bvc3RzID0gbnVsbDtcbiAgICAgICAgdGhpcy5wb3N0Q291bnQgKz0gMTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gcmVwbHk6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRm9ydW1UaHJlYWQoaWQ9JHt0aGlzLmlkfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWQgYnkgSURcbiAgICovXG4gIHN0YXRpYyBnZXRGcm9tSWQoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICB0aHJlYWRJZDogbnVtYmVyLFxuICAgIGNhdGVnb3J5OiBGb3J1bUNhdGVnb3J5IHwgbnVsbCA9IG51bGxcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVGcm9tVGhyZWFkSWRzKHNpdGUsIFt0aHJlYWRJZF0sIGNhdGVnb3J5KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRocmVhZCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCF0aHJlYWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYFRocmVhZCBub3QgZm91bmQ6ICR7dGhyZWFkSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRocmVhZDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdGhyZWFkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIEZvcnVtIHRocmVhZCBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bVRocmVhZENvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxGb3J1bVRocmVhZD4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlLCB0aHJlYWRzPzogRm9ydW1UaHJlYWRbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgICBpZiAodGhyZWFkcykge1xuICAgICAgdGhpcy5wdXNoKC4uLnRocmVhZHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1UaHJlYWQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKHRocmVhZCkgPT4gdGhyZWFkLmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aHJlYWRzIGluIGNhdGVnb3J5XG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbEluQ2F0ZWdvcnkoY2F0ZWdvcnk6IEZvcnVtQ2F0ZWdvcnkpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGhyZWFkczogRm9ydW1UaHJlYWRbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gYXdhaXQgY2F0ZWdvcnkuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwOiAxLFxuICAgICAgICAgICAgYzogY2F0ZWdvcnkuaWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3Q2F0ZWdvcnlNb2R1bGUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChmaXJzdFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gZmlyc3RSZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghZmlyc3RSZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0Qm9keSA9IFN0cmluZyhmaXJzdFJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkZmlyc3QgPSBjaGVlcmlvLmxvYWQoZmlyc3RCb2R5KTtcblxuICAgICAgICAkZmlyc3QoJ3RhYmxlLnRhYmxlIHRyLmhlYWR+dHInKS5lYWNoKChfaSwgZWxlbSkgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyb3cgPSAkZmlyc3QoZWxlbSk7XG4gICAgICAgICAgY29uc3QgdGl0bGVFbGVtID0gJHJvdy5maW5kKCdkaXYudGl0bGUgYScpO1xuICAgICAgICAgIGNvbnN0IGhyZWYgPSB0aXRsZUVsZW0uYXR0cignaHJlZicpID8/ICcnO1xuICAgICAgICAgIGNvbnN0IHRocmVhZElkTWF0Y2ggPSBocmVmLm1hdGNoKC90LShcXGQrKS8pO1xuICAgICAgICAgIGlmICghdGhyZWFkSWRNYXRjaD8uWzFdKSByZXR1cm47XG5cbiAgICAgICAgICBjb25zdCB0aHJlYWRJZCA9IE51bWJlci5wYXJzZUludCh0aHJlYWRJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSB0aXRsZUVsZW0udGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9ICRyb3cuZmluZCgnZGl2LmRlc2NyaXB0aW9uJykudGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBwb3N0Q291bnQgPSBOdW1iZXIucGFyc2VJbnQoJHJvdy5maW5kKCd0ZC5wb3N0cycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuXG4gICAgICAgICAgLy8gUGFyc2UgdXNlciBhbmQgdGltZXN0YW1wXG4gICAgICAgICAgY29uc3QgJHVzZXJFbGVtID0gJHJvdy5maW5kKCd0ZC5zdGFydGVkIHNwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgY29uc3QgJG9kYXRlRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLm9kYXRlJyk7XG5cbiAgICAgICAgICBjb25zdCBjcmVhdGVkQnkgPVxuICAgICAgICAgICAgJHVzZXJFbGVtLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgPyBwYXJzZVVzZXIoY2F0ZWdvcnkuc2l0ZS5jbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KVxuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgY29uc3QgY3JlYXRlZEF0ID1cbiAgICAgICAgICAgICRvZGF0ZUVsZW0ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICA/IChwYXJzZU9kYXRlKCRvZGF0ZUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPikgPz8gbmV3IERhdGUoKSlcbiAgICAgICAgICAgICAgOiBuZXcgRGF0ZSgpO1xuXG4gICAgICAgICAgdGhyZWFkcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEZvcnVtVGhyZWFkKHtcbiAgICAgICAgICAgICAgc2l0ZTogY2F0ZWdvcnkuc2l0ZSxcbiAgICAgICAgICAgICAgaWQ6IHRocmVhZElkLFxuICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIGNyZWF0ZWRCeSxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgICAgICBwb3N0Q291bnQsXG4gICAgICAgICAgICAgIGNhdGVnb3J5LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgIGNvbnN0IHBhZ2VyID0gJGZpcnN0KCdkaXYucGFnZXInKTtcbiAgICAgICAgaWYgKHBhZ2VyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFnZXJMaW5rcyA9IHBhZ2VyLmZpbmQoJ2EnKTtcbiAgICAgICAgaWYgKHBhZ2VyTGlua3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFBhZ2VMaW5rID0gcGFnZXJMaW5rc1twYWdlckxpbmtzLmxlbmd0aCAtIDJdO1xuICAgICAgICBjb25zdCBsYXN0UGFnZVRleHQgPSBsYXN0UGFnZUxpbmsgPyAkZmlyc3QobGFzdFBhZ2VMaW5rKS50ZXh0KCkudHJpbSgpIDogJzEnO1xuICAgICAgICBjb25zdCBsYXN0UGFnZSA9IE51bWJlci5wYXJzZUludChsYXN0UGFnZVRleHQsIDEwKSB8fCAxO1xuXG4gICAgICAgIGlmIChsYXN0UGFnZSA8PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVRocmVhZENvbGxlY3Rpb24oY2F0ZWdvcnkuc2l0ZSwgdGhyZWFkcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGZXRjaCByZW1haW5pbmcgcGFnZXNcbiAgICAgICAgY29uc3QgYm9kaWVzOiB7IHA6IG51bWJlcjsgYzogbnVtYmVyOyBtb2R1bGVOYW1lOiBzdHJpbmcgfVtdID0gW107XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IGxhc3RQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICBib2RpZXMucHVzaCh7XG4gICAgICAgICAgICBwOiBwYWdlLFxuICAgICAgICAgICAgYzogY2F0ZWdvcnkuaWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3Q2F0ZWdvcnlNb2R1bGUnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWRkaXRpb25hbFJlc3VsdHMgPSBhd2FpdCBjYXRlZ29yeS5zaXRlLmFtY1JlcXVlc3QoYm9kaWVzKTtcbiAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlPy5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuXG4gICAgICAgICAgJCgndGFibGUudGFibGUgdHIuaGVhZH50cicpLmVhY2goKF9pLCBlbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkcm93ID0gJChlbGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlRWxlbSA9ICRyb3cuZmluZCgnZGl2LnRpdGxlIGEnKTtcbiAgICAgICAgICAgIGNvbnN0IGhyZWYgPSB0aXRsZUVsZW0uYXR0cignaHJlZicpID8/ICcnO1xuICAgICAgICAgICAgY29uc3QgdGhyZWFkSWRNYXRjaCA9IGhyZWYubWF0Y2goL3QtKFxcZCspLyk7XG4gICAgICAgICAgICBpZiAoIXRocmVhZElkTWF0Y2g/LlsxXSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCB0aHJlYWRJZCA9IE51bWJlci5wYXJzZUludCh0aHJlYWRJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9IHRpdGxlRWxlbS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSAkcm93LmZpbmQoJ2Rpdi5kZXNjcmlwdGlvbicpLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgICBjb25zdCBwb3N0Q291bnQgPSBOdW1iZXIucGFyc2VJbnQoJHJvdy5maW5kKCd0ZC5wb3N0cycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuXG4gICAgICAgICAgICAvLyBQYXJzZSB1c2VyIGFuZCB0aW1lc3RhbXBcbiAgICAgICAgICAgIGNvbnN0ICR1c2VyRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgICAgY29uc3QgJG9kYXRlRWxlbSA9ICRyb3cuZmluZCgndGQuc3RhcnRlZCBzcGFuLm9kYXRlJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9XG4gICAgICAgICAgICAgICR1c2VyRWxlbS5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBwYXJzZVVzZXIoY2F0ZWdvcnkuc2l0ZS5jbGllbnQsICR1c2VyRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9XG4gICAgICAgICAgICAgICRvZGF0ZUVsZW0ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gKHBhcnNlT2RhdGUoJG9kYXRlRWxlbSBhcyBDaGVlcmlvPEFueU5vZGU+KSA/PyBuZXcgRGF0ZSgpKVxuICAgICAgICAgICAgICAgIDogbmV3IERhdGUoKTtcblxuICAgICAgICAgICAgdGhyZWFkcy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgRm9ydW1UaHJlYWQoe1xuICAgICAgICAgICAgICAgIHNpdGU6IGNhdGVnb3J5LnNpdGUsXG4gICAgICAgICAgICAgICAgaWQ6IHRocmVhZElkLFxuICAgICAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIGNyZWF0ZWRCeSxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQsXG4gICAgICAgICAgICAgICAgcG9zdENvdW50LFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1UaHJlYWRDb2xsZWN0aW9uKGNhdGVnb3J5LnNpdGUsIHRocmVhZHMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgdGhyZWFkczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2luZ2xlIHRocmVhZCBieSB0aHJlYWQgSURcbiAgICogQHBhcmFtIHNpdGUgLSBTaXRlIGluc3RhbmNlXG4gICAqIEBwYXJhbSB0aHJlYWRJZCAtIFRocmVhZCBJRFxuICAgKi9cbiAgc3RhdGljIGZyb21JZChzaXRlOiBTaXRlLCB0aHJlYWRJZDogbnVtYmVyKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVGcm9tVGhyZWFkSWRzKHNpdGUsIFt0aHJlYWRJZF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGhyZWFkID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXRocmVhZCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcihgVGhyZWFkIG5vdCBmb3VuZDogJHt0aHJlYWRJZH1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyZWFkO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCB0aHJlYWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aHJlYWRzIGJ5IHRocmVhZCBJRHNcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlRnJvbVRocmVhZElkcyhcbiAgICBzaXRlOiBTaXRlLFxuICAgIHRocmVhZElkczogbnVtYmVyW10sXG4gICAgY2F0ZWdvcnk6IEZvcnVtQ2F0ZWdvcnkgfCBudWxsID0gbnVsbFxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1UaHJlYWRDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHRocmVhZElkcy5tYXAoKHRocmVhZElkKSA9PiAoe1xuICAgICAgICAgICAgdDogdGhyZWFkSWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnZm9ydW0vRm9ydW1WaWV3VGhyZWFkTW9kdWxlJyxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aHJlYWRzOiBGb3J1bVRocmVhZFtdID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHJlYWRJZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBjb25zdCB0aHJlYWRJZCA9IHRocmVhZElkc1tpXTtcbiAgICAgICAgICBpZiAoIXJlc3BvbnNlIHx8ICF0aHJlYWRJZCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgICAvLyBQYXJzZSB0aHJlYWQgaW5mbyBmcm9tIHBhZ2VcbiAgICAgICAgICBjb25zdCBiY0VsZW0gPSAkKCdkaXYuZm9ydW0tYnJlYWRjcnVtYnMnKTtcbiAgICAgICAgICBpZiAoYmNFbGVtLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdCcmVhZGNydW1icyBub3QgZm91bmQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYmNQYXJ0cyA9IGJjRWxlbS50ZXh0KCkuc3BsaXQoJ8K7Jyk7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSBiY1BhcnRzLmxlbmd0aCA+IDAgPyAoYmNQYXJ0c1tiY1BhcnRzLmxlbmd0aCAtIDFdPy50cmltKCkgPz8gJycpIDogJyc7XG5cbiAgICAgICAgICBjb25zdCBkZXNjQmxvY2tFbGVtID0gJCgnZGl2LmRlc2NyaXB0aW9uLWJsb2NrJyk7XG4gICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBkZXNjQmxvY2tFbGVtLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICBjb25zdCBwb3N0Q291bnRNYXRjaCA9ICQoJ2Rpdi5zdGF0aXN0aWNzJykudGV4dCgpLm1hdGNoKC8oXFxkKykvKTtcbiAgICAgICAgICBjb25zdCBwb3N0Q291bnQgPSBwb3N0Q291bnRNYXRjaD8uWzFdID8gTnVtYmVyLnBhcnNlSW50KHBvc3RDb3VudE1hdGNoWzFdLCAxMCkgOiAwO1xuXG4gICAgICAgICAgdGhyZWFkcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEZvcnVtVGhyZWFkKHtcbiAgICAgICAgICAgICAgc2l0ZSxcbiAgICAgICAgICAgICAgaWQ6IHRocmVhZElkLFxuICAgICAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgIGNyZWF0ZWRCeTogbnVsbCxcbiAgICAgICAgICAgICAgY3JlYXRlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICBwb3N0Q291bnQsXG4gICAgICAgICAgICAgIGNhdGVnb3J5LFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3J1bVRocmVhZENvbGxlY3Rpb24oc2l0ZSwgdGhyZWFkcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSB0aHJlYWRzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgUmVxdWlyZUxvZ2luIH0gZnJvbSAnLi4vLi4vY29tbW9uL2RlY29yYXRvcnMnO1xuaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yLCBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5pbXBvcnQgeyBGb3J1bVRocmVhZCwgRm9ydW1UaHJlYWRDb2xsZWN0aW9uIH0gZnJvbSAnLi9mb3J1bS10aHJlYWQnO1xuXG4vKipcbiAqIEZvcnVtIGNhdGVnb3J5IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3J1bUNhdGVnb3J5RGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIGlkOiBudW1iZXI7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHRocmVhZHNDb3VudDogbnVtYmVyO1xuICBwb3N0c0NvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogRm9ydW0gY2F0ZWdvcnlcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcnVtQ2F0ZWdvcnkge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHRocmVhZHNDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgcG9zdHNDb3VudDogbnVtYmVyO1xuICBwcml2YXRlIF90aHJlYWRzOiBGb3J1bVRocmVhZENvbGxlY3Rpb24gfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBGb3J1bUNhdGVnb3J5RGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLmlkID0gZGF0YS5pZDtcbiAgICB0aGlzLnRpdGxlID0gZGF0YS50aXRsZTtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGF0YS5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLnRocmVhZHNDb3VudCA9IGRhdGEudGhyZWFkc0NvdW50O1xuICAgIHRoaXMucG9zdHNDb3VudCA9IGRhdGEucG9zdHNDb3VudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhyZWFkIGxpc3RcbiAgICovXG4gIGdldFRocmVhZHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl90aHJlYWRzICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3RocmVhZHMpLCAoZSkgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihTdHJpbmcoZSkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBGb3J1bVRocmVhZENvbGxlY3Rpb24uYWNxdWlyZUFsbEluQ2F0ZWdvcnkodGhpcyk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90aHJlYWRzID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICByZXR1cm4gdGhpcy5fdGhyZWFkcztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdGhyZWFkczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxvYWQgdGhyZWFkIGxpc3RcbiAgICovXG4gIHJlbG9hZFRocmVhZHMoKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMuX3RocmVhZHMgPSBudWxsO1xuICAgIHJldHVybiB0aGlzLmdldFRocmVhZHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhyZWFkXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNyZWF0ZVRocmVhZChcbiAgICB0aXRsZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgc291cmNlOiBzdHJpbmdcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPEZvcnVtVGhyZWFkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBhY3Rpb246ICdGb3J1bUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ25ld1RocmVhZCcsXG4gICAgICAgICAgICBjYXRlZ29yeV9pZDogdGhpcy5pZCxcbiAgICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UgfHwgdHlwZW9mIHJlc3BvbnNlLnRocmVhZElkICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignVGhyZWFkIElEIG5vdCBmb3VuZCBpbiByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhyZWFkSWQgPSByZXNwb25zZS50aHJlYWRJZCBhcyBudW1iZXI7XG4gICAgICAgIGNvbnN0IHRocmVhZFJlc3VsdCA9IGF3YWl0IEZvcnVtVGhyZWFkLmdldEZyb21JZCh0aGlzLnNpdGUsIHRocmVhZElkLCB0aGlzKTtcbiAgICAgICAgaWYgKHRocmVhZFJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgdGhyZWFkUmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aHJlYWRSZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHRocmVhZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRm9ydW1DYXRlZ29yeShpZD0ke3RoaXMuaWR9LCB0aXRsZT0ke3RoaXMudGl0bGV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3J1bSBjYXRlZ29yeSBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbiBleHRlbmRzIEFycmF5PEZvcnVtQ2F0ZWdvcnk+IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSwgY2F0ZWdvcmllcz86IEZvcnVtQ2F0ZWdvcnlbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgICBpZiAoY2F0ZWdvcmllcykge1xuICAgICAgdGhpcy5wdXNoKC4uLmNhdGVnb3JpZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqL1xuICBmaW5kQnlJZChpZDogbnVtYmVyKTogRm9ydW1DYXRlZ29yeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBjYXRlZ29yaWVzIGZvciBhIHNpdGVcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlQWxsKHNpdGU6IFNpdGUpOiBXaWtpZG90UmVzdWx0QXN5bmM8Rm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bVN0YXJ0TW9kdWxlJyxcbiAgICAgICAgICAgIGhpZGRlbjogJ3RydWUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcblxuICAgICAgICBjb25zdCBjYXRlZ29yaWVzOiBGb3J1bUNhdGVnb3J5W10gPSBbXTtcblxuICAgICAgICAkKCd0YWJsZSB0ci5oZWFkfnRyJykuZWFjaCgoX2ksIHJvdykgPT4ge1xuICAgICAgICAgIGNvbnN0ICRyb3cgPSAkKHJvdyk7XG4gICAgICAgICAgY29uc3QgbmFtZUVsZW0gPSAkcm93LmZpbmQoJ3RkLm5hbWUnKTtcbiAgICAgICAgICBjb25zdCBuYW1lTGlua0VsZW0gPSBuYW1lRWxlbS5maW5kKCdhJyk7XG4gICAgICAgICAgY29uc3QgaHJlZiA9IG5hbWVMaW5rRWxlbS5hdHRyKCdocmVmJykgPz8gJyc7XG5cbiAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkTWF0Y2ggPSBocmVmLm1hdGNoKC9jLShcXGQrKS8pO1xuICAgICAgICAgIGlmICghY2F0ZWdvcnlJZE1hdGNoPy5bMV0pIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IGNhdGVnb3J5SWQgPSBOdW1iZXIucGFyc2VJbnQoY2F0ZWdvcnlJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgY29uc3QgdGl0bGUgPSBuYW1lTGlua0VsZW0udGV4dCgpLnRyaW0oKTtcbiAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IG5hbWVFbGVtLmZpbmQoJ2Rpdi5kZXNjcmlwdGlvbicpLnRleHQoKS50cmltKCk7XG4gICAgICAgICAgY29uc3QgdGhyZWFkc0NvdW50ID0gTnVtYmVyLnBhcnNlSW50KCRyb3cuZmluZCgndGQudGhyZWFkcycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuICAgICAgICAgIGNvbnN0IHBvc3RzQ291bnQgPSBOdW1iZXIucGFyc2VJbnQoJHJvdy5maW5kKCd0ZC5wb3N0cycpLnRleHQoKS50cmltKCksIDEwKSB8fCAwO1xuXG4gICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKFxuICAgICAgICAgICAgbmV3IEZvcnVtQ2F0ZWdvcnkoe1xuICAgICAgICAgICAgICBzaXRlLFxuICAgICAgICAgICAgICBpZDogY2F0ZWdvcnlJZCxcbiAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICB0aHJlYWRzQ291bnQsXG4gICAgICAgICAgICAgIHBvc3RzQ291bnQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgRm9ydW1DYXRlZ29yeUNvbGxlY3Rpb24oc2l0ZSwgY2F0ZWdvcmllcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBjYXRlZ29yaWVzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJleHBvcnQgeyBGb3J1bUNhdGVnb3J5LCBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbiwgdHlwZSBGb3J1bUNhdGVnb3J5RGF0YSB9IGZyb20gJy4vZm9ydW0tY2F0ZWdvcnknO1xuZXhwb3J0IHsgRm9ydW1Qb3N0LCBGb3J1bVBvc3RDb2xsZWN0aW9uLCB0eXBlIEZvcnVtUG9zdERhdGEgfSBmcm9tICcuL2ZvcnVtLXBvc3QnO1xuZXhwb3J0IHtcbiAgRm9ydW1Qb3N0UmV2aXNpb24sXG4gIEZvcnVtUG9zdFJldmlzaW9uQ29sbGVjdGlvbixcbiAgdHlwZSBGb3J1bVBvc3RSZXZpc2lvbkRhdGEsXG59IGZyb20gJy4vZm9ydW0tcG9zdC1yZXZpc2lvbic7XG5leHBvcnQgeyBGb3J1bVRocmVhZCwgRm9ydW1UaHJlYWRDb2xsZWN0aW9uLCB0eXBlIEZvcnVtVGhyZWFkRGF0YSB9IGZyb20gJy4vZm9ydW0tdGhyZWFkJztcbiIsCiAgICAiLy8gQ29tbW9uXG5leHBvcnQgKiBmcm9tICcuL2NvbW1vbi9lcnJvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vbG9nZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL3R5cGVzJztcblxuLy8gQ29ubmVjdG9yXG5leHBvcnQgKiBmcm9tICcuL2Nvbm5lY3Rvcic7XG5cbi8vIE1vZHVsZVxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGUnO1xuXG4vLyBVdGlsXG5leHBvcnQgKiBmcm9tICcuL3V0aWwnO1xuIiwKICAgICJpbXBvcnQga3ksIHsgdHlwZSBLeUluc3RhbmNlIH0gZnJvbSAna3knO1xuaW1wb3J0IHBMaW1pdCwgeyB0eXBlIExpbWl0RnVuY3Rpb24gfSBmcm9tICdwLWxpbWl0JztcbmltcG9ydCB7XG4gIEFNQ0h0dHBFcnJvcixcbiAgRm9yYmlkZGVuRXJyb3IsXG4gIE5vdEZvdW5kRXhjZXB0aW9uLFxuICBSZXNwb25zZURhdGFFcnJvcixcbiAgVW5leHBlY3RlZEVycm9yLFxuICBXaWtpZG90RXJyb3IsXG4gIFdpa2lkb3RTdGF0dXNFcnJvcixcbn0gZnJvbSAnLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsIHdkRXJyQXN5bmMsIHdkT2tBc3luYyB9IGZyb20gJy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBmZXRjaFdpdGhSZXRyeSB9IGZyb20gJy4uL3V0aWwvaHR0cCc7XG5pbXBvcnQge1xuICB0eXBlIEFNQ0NvbmZpZyxcbiAgREVGQVVMVF9BTUNfQ09ORklHLFxuICBERUZBVUxUX0hUVFBfU1RBVFVTX0NPREUsXG4gIFdJS0lET1RfVE9LRU43LFxufSBmcm9tICcuL2FtYy1jb25maWcnO1xuaW1wb3J0IHsgQU1DSGVhZGVyIH0gZnJvbSAnLi9hbWMtaGVhZGVyJztcbmltcG9ydCB7IHR5cGUgQU1DUmVxdWVzdEJvZHksIHR5cGUgQU1DUmVzcG9uc2UsIGFtY1Jlc3BvbnNlU2NoZW1hIH0gZnJvbSAnLi9hbWMtdHlwZXMnO1xuXG4vKipcbiAqIE1hc2sgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIChmb3IgbG9nZ2luZylcbiAqIEBwYXJhbSBib2R5IC0gUmVxdWVzdCBib2R5IHRvIG1hc2tcbiAqIEByZXR1cm5zIE1hc2tlZCBib2R5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXNrU2Vuc2l0aXZlRGF0YShib2R5OiBBTUNSZXF1ZXN0Qm9keSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgY29uc3QgbWFza2VkID0geyAuLi5ib2R5IH07XG4gIGNvbnN0IHNlbnNpdGl2ZUtleXMgPSBbJ3Bhc3N3b3JkJywgJ2xvZ2luJywgJ1dJS0lET1RfU0VTU0lPTl9JRCcsICd3aWtpZG90X3Rva2VuNyddO1xuICBmb3IgKGNvbnN0IGtleSBvZiBzZW5zaXRpdmVLZXlzKSB7XG4gICAgaWYgKGtleSBpbiBtYXNrZWQpIHtcbiAgICAgIG1hc2tlZFtrZXldID0gJyoqKk1BU0tFRCoqKic7XG4gICAgfVxuICB9XG4gIHJldHVybiBtYXNrZWQ7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGV4cG9uZW50aWFsIGJhY2tvZmYgaW50ZXJ2YWwgKHdpdGggaml0dGVyKVxuICogQHBhcmFtIHJldHJ5Q291bnQgLSBDdXJyZW50IHJldHJ5IGNvdW50IChzdGFydHMgZnJvbSAxKVxuICogQHBhcmFtIGJhc2VJbnRlcnZhbCAtIEJhc2UgaW50ZXJ2YWwgKG1pbGxpc2Vjb25kcylcbiAqIEBwYXJhbSBiYWNrb2ZmRmFjdG9yIC0gQmFja29mZiBmYWN0b3JcbiAqIEBwYXJhbSBtYXhCYWNrb2ZmIC0gTWF4aW11bSBiYWNrb2ZmIGludGVydmFsIChtaWxsaXNlY29uZHMpXG4gKiBAcmV0dXJucyBDYWxjdWxhdGVkIGJhY2tvZmYgaW50ZXJ2YWwgKG1pbGxpc2Vjb25kcylcbiAqL1xuZnVuY3Rpb24gY2FsY3VsYXRlQmFja29mZihcbiAgcmV0cnlDb3VudDogbnVtYmVyLFxuICBiYXNlSW50ZXJ2YWw6IG51bWJlcixcbiAgYmFja29mZkZhY3RvcjogbnVtYmVyLFxuICBtYXhCYWNrb2ZmOiBudW1iZXJcbik6IG51bWJlciB7XG4gIGNvbnN0IGJhY2tvZmYgPSBiYXNlSW50ZXJ2YWwgKiBiYWNrb2ZmRmFjdG9yICoqIChyZXRyeUNvdW50IC0gMSk7XG4gIGNvbnN0IGppdHRlciA9IE1hdGgucmFuZG9tKCkgKiBiYWNrb2ZmICogMC4xO1xuICByZXR1cm4gTWF0aC5taW4oYmFja29mZiArIGppdHRlciwgbWF4QmFja29mZik7XG59XG5cbi8qKlxuICogU2xlZXAgZm9yIHNwZWNpZmllZCBkdXJhdGlvblxuICogQHBhcmFtIG1zIC0gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzXG4gKi9cbmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbi8qKlxuICogQU1DIHJlcXVlc3Qgb3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFNQ1JlcXVlc3RPcHRpb25zIHtcbiAgLyoqIFNpdGUgbmFtZSAoZGVmYXVsdDogd3d3KSAqL1xuICBzaXRlTmFtZT86IHN0cmluZztcbiAgLyoqIFNTTCBzdXBwb3J0IChhdXRvLWRldGVjdGVkIGlmIG9taXR0ZWQpICovXG4gIHNzbFN1cHBvcnRlZD86IGJvb2xlYW47XG4gIC8qKiBJbmNsdWRlIGVycm9ycyBpbiByZXN1bHRzIGluc3RlYWQgb2YgdGhyb3dpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICByZXR1cm5FeGNlcHRpb25zPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBamF4IE1vZHVsZSBDb25uZWN0b3IgY2xpZW50XG4gKiBNYW5hZ2VzIHJlcXVlc3RzIHRvIFdpa2lkb3QgQU1DIGVuZHBvaW50XG4gKi9cbmV4cG9ydCBjbGFzcyBBTUNDbGllbnQge1xuICAvKioga3kgaW5zdGFuY2UgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBreTogS3lJbnN0YW5jZTtcblxuICAvKiogQ29uY3VycmVudCByZXF1ZXN0IGxpbWl0ZXIgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsaW1pdDogTGltaXRGdW5jdGlvbjtcblxuICAvKiogSGVhZGVyIG1hbmFnZXIgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhlYWRlcjogQU1DSGVhZGVyO1xuXG4gIC8qKiBDb25maWd1cmF0aW9uICovXG4gIHB1YmxpYyByZWFkb25seSBjb25maWc6IEFNQ0NvbmZpZztcblxuICAvKiogQmFzZSBkb21haW4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nO1xuXG4gIC8qKiBTU0wgc3VwcG9ydCBzdGF0dXMgY2FjaGUgKi9cbiAgcHJpdmF0ZSBzc2xDYWNoZTogTWFwPHN0cmluZywgYm9vbGVhbj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjb25maWcgLSBBTUMgY29uZmlndXJhdGlvbiAodXNlcyBkZWZhdWx0cyBpZiBvbWl0dGVkKVxuICAgKiBAcGFyYW0gZG9tYWluIC0gQmFzZSBkb21haW4gKGRlZmF1bHQ6IHdpa2lkb3QuY29tKVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29uZmlnOiBQYXJ0aWFsPEFNQ0NvbmZpZz4gPSB7fSwgZG9tYWluID0gJ3dpa2lkb3QuY29tJykge1xuICAgIHRoaXMuY29uZmlnID0geyAuLi5ERUZBVUxUX0FNQ19DT05GSUcsIC4uLmNvbmZpZyB9O1xuICAgIHRoaXMuZG9tYWluID0gZG9tYWluO1xuICAgIHRoaXMuaGVhZGVyID0gbmV3IEFNQ0hlYWRlcigpO1xuICAgIHRoaXMubGltaXQgPSBwTGltaXQodGhpcy5jb25maWcuc2VtYXBob3JlTGltaXQpO1xuXG4gICAgdGhpcy5reSA9IGt5LmNyZWF0ZSh7XG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZy50aW1lb3V0LFxuICAgICAgcmV0cnk6IDAsIC8vIE1hbnVhbCByZXRyeSBjb250cm9sXG4gICAgfSk7XG5cbiAgICAvLyB3d3cgYWx3YXlzIHN1cHBvcnRzIFNTTFxuICAgIHRoaXMuc3NsQ2FjaGUuc2V0KCd3d3cnLCB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBzaXRlIGV4aXN0ZW5jZSBhbmQgU1NMIHN1cHBvcnQgc3RhdHVzXG4gICAqIEBwYXJhbSBzaXRlTmFtZSAtIFNpdGUgbmFtZVxuICAgKiBAcmV0dXJucyBTU0wgc3VwcG9ydCBzdGF0dXMgKHRydWU6IEhUVFBTLCBmYWxzZTogSFRUUClcbiAgICovXG4gIGNoZWNrU2l0ZVNTTChzaXRlTmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPGJvb2xlYW4+IHtcbiAgICAvLyBSZXR1cm4gY2FjaGVkIHZhbHVlIGlmIGV4aXN0c1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuc3NsQ2FjaGUuZ2V0KHNpdGVOYW1lKTtcbiAgICBpZiAoY2FjaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB3ZE9rQXN5bmMoY2FjaGVkKTtcbiAgICB9XG5cbiAgICAvLyB3d3cgYWx3YXlzIHN1cHBvcnRzIFNTTFxuICAgIGlmIChzaXRlTmFtZSA9PT0gJ3d3dycpIHtcbiAgICAgIHJldHVybiB3ZE9rQXN5bmModHJ1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeShgaHR0cDovLyR7c2l0ZU5hbWV9LiR7dGhpcy5kb21haW59YCwgdGhpcy5jb25maWcsIHtcbiAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgIHJlZGlyZWN0OiAnbWFudWFsJyxcbiAgICAgICAgICBjaGVja09rOiBmYWxzZSwgLy8gRG9uJ3QgcmV0cnkgb24gSFRUUCBlcnJvcnMgKDMwMSBpcyBleHBlY3RlZClcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gNDA0IG1lYW5zIHNpdGUgZG9lcyBub3QgZXhpc3RcbiAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBTaXRlIGlzIG5vdCBmb3VuZDogJHtzaXRlTmFtZX0uJHt0aGlzLmRvbWFpbn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNTTCBzdXBwb3J0ZWQgaWYgMzAxIHJlZGlyZWN0IHRvIGh0dHBzXG4gICAgICAgIGNvbnN0IGlzU1NMID1cbiAgICAgICAgICByZXNwb25zZS5zdGF0dXMgPT09IDMwMSAmJiByZXNwb25zZS5oZWFkZXJzLmdldCgnTG9jYXRpb24nKT8uc3RhcnRzV2l0aCgnaHR0cHMnKSA9PT0gdHJ1ZTtcblxuICAgICAgICAvLyBTYXZlIHRvIGNhY2hlXG4gICAgICAgIHRoaXMuc3NsQ2FjaGUuc2V0KHNpdGVOYW1lLCBpc1NTTCk7XG4gICAgICAgIHJldHVybiBpc1NTTDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY2hlY2sgU1NMIGZvciAke3NpdGVOYW1lfTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBBTUMgcmVxdWVzdFxuICAgKiBAcGFyYW0gYm9kaWVzIC0gUmVxdWVzdCBib2R5IGFycmF5XG4gICAqIEBwYXJhbSBzaXRlTmFtZSAtIFNpdGUgbmFtZSAoZGVmYXVsdDogd3d3KVxuICAgKiBAcGFyYW0gc3NsU3VwcG9ydGVkIC0gU1NMIHN1cHBvcnQgKGF1dG8tZGV0ZWN0ZWQgaWYgb21pdHRlZClcbiAgICogQHJldHVybnMgUmVzcG9uc2UgYXJyYXlcbiAgICovXG4gIHJlcXVlc3QoXG4gICAgYm9kaWVzOiBBTUNSZXF1ZXN0Qm9keVtdLFxuICAgIHNpdGVOYW1lID0gJ3d3dycsXG4gICAgc3NsU3VwcG9ydGVkPzogYm9vbGVhblxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2VbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RXaXRoT3B0aW9ucyhib2RpZXMsIHtcbiAgICAgIHNpdGVOYW1lLFxuICAgICAgc3NsU3VwcG9ydGVkLFxuICAgICAgcmV0dXJuRXhjZXB0aW9uczogZmFsc2UsXG4gICAgfSkgYXMgV2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlW10+O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgQU1DIHJlcXVlc3QgKHdpdGggb3B0aW9ucylcbiAgICogQHBhcmFtIGJvZGllcyAtIFJlcXVlc3QgYm9keSBhcnJheVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlcXVlc3Qgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBSZXNwb25zZSBhcnJheSAoaW5jbHVkZXMgZXJyb3JzIGlmIHJldHVybkV4Y2VwdGlvbnMgaXMgdHJ1ZSlcbiAgICovXG4gIHJlcXVlc3RXaXRoT3B0aW9ucyhcbiAgICBib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10sXG4gICAgb3B0aW9uczogQU1DUmVxdWVzdE9wdGlvbnMgPSB7fVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8KEFNQ1Jlc3BvbnNlIHwgV2lraWRvdEVycm9yKVtdPiB7XG4gICAgY29uc3QgeyBzaXRlTmFtZSA9ICd3d3cnLCBzc2xTdXBwb3J0ZWQsIHJldHVybkV4Y2VwdGlvbnMgPSBmYWxzZSB9ID0gb3B0aW9ucztcblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEdldCBTU0wgc3VwcG9ydCBzdGF0dXNcbiAgICAgICAgbGV0IHNzbCA9IHNzbFN1cHBvcnRlZDtcbiAgICAgICAgaWYgKHNzbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3Qgc3NsUmVzdWx0ID0gYXdhaXQgdGhpcy5jaGVja1NpdGVTU0woc2l0ZU5hbWUpO1xuICAgICAgICAgIGlmIChzc2xSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgc3NsUmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzc2wgPSBzc2xSZXN1bHQudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNzbCA/ICdodHRwcycgOiAnaHR0cCc7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3Byb3RvY29sfTovLyR7c2l0ZU5hbWV9LiR7dGhpcy5kb21haW59L2FqYXgtbW9kdWxlLWNvbm5lY3Rvci5waHBgO1xuXG4gICAgICAgIC8vIEV4ZWN1dGUgcmVxdWVzdHMgaW4gcGFyYWxsZWxcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIGJvZGllcy5tYXAoKGJvZHkpID0+IHRoaXMubGltaXQoKCkgPT4gdGhpcy5zaW5nbGVSZXF1ZXN0KGJvZHksIHVybCkpKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXR1cm5FeGNlcHRpb25zKSB7XG4gICAgICAgICAgLy8gUmV0dXJuIGFsbCByZXN1bHRzIGluY2x1ZGluZyBlcnJvcnNcbiAgICAgICAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHIpID0+IHtcbiAgICAgICAgICAgIGlmIChyLmlzT2soKSkge1xuICAgICAgICAgICAgICByZXR1cm4gci52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByLmVycm9yO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhyb3cgZmlyc3QgZXJyb3IgaWYgYW55XG4gICAgICAgIGNvbnN0IGZpcnN0RXJyb3IgPSByZXN1bHRzLmZpbmQoKHIpID0+IHIuaXNFcnIoKSk7XG4gICAgICAgIGlmIChmaXJzdEVycm9yPy5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgZmlyc3RFcnJvci5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocikgPT4ge1xuICAgICAgICAgIGlmIChyLmlzT2soKSkge1xuICAgICAgICAgICAgcmV0dXJuIHIudmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ1VuZXhwZWN0ZWQgZXJyb3IgaW4gcmVzdWx0IHByb2Nlc3NpbmcnKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgQU1DIHJlcXVlc3QgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gZXhlY3V0ZSBhIHNpbmdsZSByZXF1ZXN0XG4gICAqIEBwYXJhbSBib2R5IC0gUmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSB1cmwgLSBSZXF1ZXN0IFVSTFxuICAgKiBAcmV0dXJucyBSZXNwb25zZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzaW5nbGVSZXF1ZXN0KFxuICAgIGJvZHk6IEFNQ1JlcXVlc3RCb2R5LFxuICAgIHVybDogc3RyaW5nXG4gICk6IFByb21pc2U8V2lraWRvdFJlc3VsdEFzeW5jPEFNQ1Jlc3BvbnNlPj4ge1xuICAgIGxldCByZXRyeUNvdW50ID0gMDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBBZGQgd2lraWRvdF90b2tlbjdcbiAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7IC4uLmJvZHksIHdpa2lkb3RfdG9rZW43OiBXSUtJRE9UX1RPS0VONyB9O1xuXG4gICAgICAgIC8vIENyZWF0ZSBVUkwtZW5jb2RlZCBib2R5XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZXF1ZXN0Qm9keSkpIHtcbiAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmt5LnBvc3QodXJsLCB7XG4gICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXIuZ2V0SGVhZGVycygpLFxuICAgICAgICAgIGJvZHk6IGZvcm1EYXRhLnRvU3RyaW5nKCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFBhcnNlIGFzIEpTT05cbiAgICAgICAgbGV0IHJlc3BvbnNlRGF0YTogdW5rbm93bjtcbiAgICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3BvbnNlRGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gUmV0cnkgb24gSlNPTiBwYXJzZSBlcnJvciAoZS5nLiwgZW1wdHkgcmVzcG9uc2UpXG4gICAgICAgICAgcmV0cnlDb3VudCsrO1xuICAgICAgICAgIGlmIChyZXRyeUNvdW50ID49IHRoaXMuY29uZmlnLnJldHJ5TGltaXQpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKFxuICAgICAgICAgICAgICBuZXcgUmVzcG9uc2VEYXRhRXJyb3IoYEFNQyByZXNwb25kZWQgd2l0aCBub24tSlNPTiBkYXRhOiAke3Jlc3BvbnNlVGV4dH1gKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYmFja29mZiA9IGNhbGN1bGF0ZUJhY2tvZmYoXG4gICAgICAgICAgICByZXRyeUNvdW50LFxuICAgICAgICAgICAgdGhpcy5jb25maWcucmV0cnlJbnRlcnZhbCxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmJhY2tvZmZGYWN0b3IsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5tYXhCYWNrb2ZmXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBzbGVlcChiYWNrb2ZmKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIHdpdGggem9kXG4gICAgICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gYW1jUmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKHJlc3BvbnNlRGF0YSk7XG4gICAgICAgIGlmICghcGFyc2VSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKFxuICAgICAgICAgICAgbmV3IFJlc3BvbnNlRGF0YUVycm9yKGBJbnZhbGlkIEFNQyByZXNwb25zZSBmb3JtYXQ6ICR7cGFyc2VSZXN1bHQuZXJyb3IubWVzc2FnZX1gKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhbWNSZXNwb25zZSA9IHBhcnNlUmVzdWx0LmRhdGE7XG5cbiAgICAgICAgLy8gUmV0cnkgaWYgdHJ5X2FnYWluXG4gICAgICAgIGlmIChhbWNSZXNwb25zZS5zdGF0dXMgPT09ICd0cnlfYWdhaW4nKSB7XG4gICAgICAgICAgcmV0cnlDb3VudCsrO1xuICAgICAgICAgIGlmIChyZXRyeUNvdW50ID49IHRoaXMuY29uZmlnLnJldHJ5TGltaXQpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKG5ldyBXaWtpZG90U3RhdHVzRXJyb3IoJ0FNQyByZXNwb25kZWQgd2l0aCB0cnlfYWdhaW4nLCAndHJ5X2FnYWluJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBiYWNrb2ZmID0gY2FsY3VsYXRlQmFja29mZihcbiAgICAgICAgICAgIHJldHJ5Q291bnQsXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5yZXRyeUludGVydmFsLFxuICAgICAgICAgICAgdGhpcy5jb25maWcuYmFja29mZkZhY3RvcixcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLm1heEJhY2tvZmZcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHNsZWVwKGJhY2tvZmYpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9yYmlkZGVuRXJyb3IgaWYgbm9fcGVybWlzc2lvblxuICAgICAgICBpZiAoYW1jUmVzcG9uc2Uuc3RhdHVzID09PSAnbm9fcGVybWlzc2lvbicpIHtcbiAgICAgICAgICBjb25zdCB0YXJnZXRTdHIgPSBib2R5Lm1vZHVsZU5hbWVcbiAgICAgICAgICAgID8gYG1vZHVsZU5hbWU6ICR7Ym9keS5tb2R1bGVOYW1lfWBcbiAgICAgICAgICAgIDogYm9keS5hY3Rpb25cbiAgICAgICAgICAgICAgPyBgYWN0aW9uOiAke2JvZHkuYWN0aW9ufS8ke2JvZHkuZXZlbnQgPz8gJyd9YFxuICAgICAgICAgICAgICA6ICd1bmtub3duJztcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhcbiAgICAgICAgICAgIG5ldyBGb3JiaWRkZW5FcnJvcihcbiAgICAgICAgICAgICAgYFlvdXIgYWNjb3VudCBoYXMgbm8gcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoaXMgYWN0aW9uOiAke3RhcmdldFN0cn1gXG4gICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVycm9yIGlmIHN0YXR1cyBpcyBub3Qgb2tcbiAgICAgICAgaWYgKGFtY1Jlc3BvbnNlLnN0YXR1cyAhPT0gJ29rJykge1xuICAgICAgICAgIHJldHVybiB3ZEVyckFzeW5jKFxuICAgICAgICAgICAgbmV3IFdpa2lkb3RTdGF0dXNFcnJvcihcbiAgICAgICAgICAgICAgYEFNQyByZXNwb25kZWQgd2l0aCBlcnJvciBzdGF0dXM6IFwiJHthbWNSZXNwb25zZS5zdGF0dXN9XCJgLFxuICAgICAgICAgICAgICBhbWNSZXNwb25zZS5zdGF0dXNcbiAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdkT2tBc3luYyhhbWNSZXNwb25zZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBSZXRyeSBvbiBhbGwgZXJyb3JzIChIVFRQIGVycm9ycywgbmV0d29yayBlcnJvcnMsIHRpbWVvdXRzLCBldGMuKVxuICAgICAgICAvLyBXaWtpZG90IHNlcnZlciBoYXMgYSByZWxhdGl2ZWx5IGhpZ2ggZXJyb3IgcmF0ZSwgc28gcmV0cnkgaXMgZXNzZW50aWFsXG4gICAgICAgIHJldHJ5Q291bnQrKztcbiAgICAgICAgaWYgKHJldHJ5Q291bnQgPj0gdGhpcy5jb25maWcucmV0cnlMaW1pdCkge1xuICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPVxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAncmVzcG9uc2UnIGluIGVycm9yXG4gICAgICAgICAgICAgID8gKChlcnJvciBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXIgfSB9KS5yZXNwb25zZT8uc3RhdHVzID8/XG4gICAgICAgICAgICAgICAgREVGQVVMVF9IVFRQX1NUQVRVU19DT0RFKVxuICAgICAgICAgICAgICA6IERFRkFVTFRfSFRUUF9TVEFUVVNfQ09ERTtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgQU1DSHR0cEVycm9yKGBBTUMgcmVxdWVzdCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gLCBzdGF0dXNDb2RlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYWNrb2ZmID0gY2FsY3VsYXRlQmFja29mZihcbiAgICAgICAgICByZXRyeUNvdW50LFxuICAgICAgICAgIHRoaXMuY29uZmlnLnJldHJ5SW50ZXJ2YWwsXG4gICAgICAgICAgdGhpcy5jb25maWcuYmFja29mZkZhY3RvcixcbiAgICAgICAgICB0aGlzLmNvbmZpZy5tYXhCYWNrb2ZmXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IHNsZWVwKGJhY2tvZmYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwKICAgICIvKipcbiAqIENsYXNzIGZvciBtYW5hZ2luZyBBTUMgcmVxdWVzdCBoZWFkZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBBTUNIZWFkZXIge1xuICBwcml2YXRlIGNvb2tpZXM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG4gIHByaXZhdGUgY29udGVudFR5cGU6IHN0cmluZztcbiAgcHJpdmF0ZSB1c2VyQWdlbnQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWZlcmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gSGVhZGVyIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiB7IGNvbnRlbnRUeXBlPzogc3RyaW5nOyB1c2VyQWdlbnQ/OiBzdHJpbmc7IHJlZmVyZXI/OiBzdHJpbmcgfSkge1xuICAgIHRoaXMuY29udGVudFR5cGUgPSBvcHRpb25zPy5jb250ZW50VHlwZSA/PyAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04JztcbiAgICB0aGlzLnVzZXJBZ2VudCA9IG9wdGlvbnM/LnVzZXJBZ2VudCA/PyAnV2lraWRvdFRTJztcbiAgICB0aGlzLnJlZmVyZXIgPSBvcHRpb25zPy5yZWZlcmVyID8/ICdodHRwczovL3d3dy53aWtpZG90LmNvbS8nO1xuICAgIHRoaXMuY29va2llcyA9IG5ldyBNYXAoW1snd2lraWRvdF90b2tlbjcnLCAnMTIzNDU2J11dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBjb29raWVcbiAgICogQHBhcmFtIG5hbWUgLSBDb29raWUgbmFtZVxuICAgKiBAcGFyYW0gdmFsdWUgLSBDb29raWUgdmFsdWVcbiAgICovXG4gIHNldENvb2tpZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvb2tpZXMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBjb29raWVcbiAgICogQHBhcmFtIG5hbWUgLSBDb29raWUgbmFtZVxuICAgKi9cbiAgZGVsZXRlQ29va2llKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29va2llcy5kZWxldGUobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgY29va2llXG4gICAqIEBwYXJhbSBuYW1lIC0gQ29va2llIG5hbWVcbiAgICogQHJldHVybnMgQ29va2llIHZhbHVlLCB1bmRlZmluZWQgaWYgbm90IGV4aXN0c1xuICAgKi9cbiAgZ2V0Q29va2llKG5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY29va2llcy5nZXQobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEhUVFAgaGVhZGVycyBvYmplY3RcbiAgICogQHJldHVybnMgSGVhZGVycyBkaWN0aW9uYXJ5XG4gICAqL1xuICBnZXRIZWFkZXJzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IGNvb2tpZVN0cmluZyA9IEFycmF5LmZyb20odGhpcy5jb29raWVzLmVudHJpZXMoKSlcbiAgICAgIC5tYXAoKFtuYW1lLCB2YWx1ZV0pID0+IGAke25hbWV9PSR7dmFsdWV9YClcbiAgICAgIC5qb2luKCc7ICcpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICdDb250ZW50LVR5cGUnOiB0aGlzLmNvbnRlbnRUeXBlLFxuICAgICAgJ1VzZXItQWdlbnQnOiB0aGlzLnVzZXJBZ2VudCxcbiAgICAgIFJlZmVyZXI6IHRoaXMucmVmZXJlcixcbiAgICAgIENvb2tpZTogY29va2llU3RyaW5nLFxuICAgIH07XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbi8qKlxuICogQU1DIHJlcXVlc3QgYm9keSB2YWx1ZSB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIEFNQ1JlcXVlc3RCb2R5VmFsdWUgPVxuICB8IHN0cmluZ1xuICB8IG51bWJlclxuICB8IGJvb2xlYW5cbiAgfCBudWxsXG4gIHwgdW5kZWZpbmVkXG4gIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgfCBBTUNSZXF1ZXN0Qm9keVZhbHVlW107XG5cbi8qKlxuICogQU1DIHJlcXVlc3QgYm9keSB0eXBlIGRlZmluaXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBTUNSZXF1ZXN0Qm9keSB7XG4gIG1vZHVsZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbj86IHN0cmluZztcbiAgZXZlbnQ/OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IEFNQ1JlcXVlc3RCb2R5VmFsdWU7XG59XG5cbi8qKlxuICogQU1DIHJlc3BvbnNlIGJhc2Ugc2NoZW1hXG4gKi9cbmNvbnN0IGJhc2VTY2hlbWE6IHouWm9kT2JqZWN0PHtcbiAgc3RhdHVzOiB6LlpvZFN0cmluZztcbiAgYm9keTogei5ab2RPcHRpb25hbDx6LlpvZFN0cmluZz47XG4gIG1lc3NhZ2U6IHouWm9kT3B0aW9uYWw8ei5ab2RTdHJpbmc+O1xufT4gPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5zdHJpbmcoKSxcbiAgYm9keTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBtZXNzYWdlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG59KTtcblxuLyoqXG4gKiBBTUMgcmVzcG9uc2Ugc2NoZW1hXG4gKi9cbmV4cG9ydCBjb25zdCBhbWNSZXNwb25zZVNjaGVtYTogei5ab2RUeXBlPHouaW5mZXI8dHlwZW9mIGJhc2VTY2hlbWE+ICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID1cbiAgYmFzZVNjaGVtYS5wYXNzdGhyb3VnaCgpO1xuXG4vKipcbiAqIEFNQyByZXNwb25zZSB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIEFNQ1Jlc3BvbnNlID0gei5pbmZlcjx0eXBlb2YgYW1jUmVzcG9uc2VTY2hlbWE+O1xuXG4vKipcbiAqIFN1Y2Nlc3NmdWwgQU1DIHJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQU1DU3VjY2Vzc1Jlc3BvbnNlIHtcbiAgc3RhdHVzOiAnb2snO1xuICBib2R5OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBBTUMgcmVzcG9uc2UgaXMgc3VjY2Vzc2Z1bFxuICogQHBhcmFtIHJlc3BvbnNlIC0gQU1DIHJlc3BvbnNlXG4gKiBAcmV0dXJucyB0cnVlIGlmIHJlc3BvbnNlIGlzIHN1Y2Nlc3NmdWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3VjY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlOiBBTUNSZXNwb25zZSk6IHJlc3BvbnNlIGlzIEFNQ1N1Y2Nlc3NSZXNwb25zZSB7XG4gIHJldHVybiByZXNwb25zZS5zdGF0dXMgPT09ICdvayc7XG59XG4iLAogICAgImV4cG9ydCB7IEFNQ0NsaWVudCwgdHlwZSBBTUNSZXF1ZXN0T3B0aW9ucywgbWFza1NlbnNpdGl2ZURhdGEgfSBmcm9tICcuL2FtYy1jbGllbnQnO1xuZXhwb3J0IHsgdHlwZSBBTUNDb25maWcsIERFRkFVTFRfQU1DX0NPTkZJRyB9IGZyb20gJy4vYW1jLWNvbmZpZyc7XG5leHBvcnQgeyBBTUNIZWFkZXIgfSBmcm9tICcuL2FtYy1oZWFkZXInO1xuZXhwb3J0IHtcbiAgdHlwZSBBTUNSZXF1ZXN0Qm9keSxcbiAgdHlwZSBBTUNSZXNwb25zZSxcbiAgdHlwZSBBTUNTdWNjZXNzUmVzcG9uc2UsXG4gIGFtY1Jlc3BvbnNlU2NoZW1hLFxuICBpc1N1Y2Nlc3NSZXNwb25zZSxcbn0gZnJvbSAnLi9hbWMtdHlwZXMnO1xuZXhwb3J0IHsgbG9naW4sIGxvZ291dCB9IGZyb20gJy4vYXV0aCc7XG4iLAogICAgImltcG9ydCB7IFNlc3Npb25DcmVhdGVFcnJvciB9IGZyb20gJy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jLCB3ZE9rQXN5bmMgfSBmcm9tICcuLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBdXRoQ2xpZW50Q29udGV4dCB9IGZyb20gJy4uL21vZHVsZS90eXBlcyc7XG5pbXBvcnQgeyBmZXRjaFdpdGhSZXRyeSB9IGZyb20gJy4uL3V0aWwvaHR0cCc7XG5pbXBvcnQgeyBERUZBVUxUX0FNQ19DT05GSUcgfSBmcm9tICcuL2FtYy1jb25maWcnO1xuXG5jb25zdCBMT0dJTl9VUkwgPSAnaHR0cHM6Ly93d3cud2lraWRvdC5jb20vZGVmYXVsdC0tZmxvdy9sb2dpbl9fTG9naW5Qb3B1cFNjcmVlbic7XG5cbi8qKiBMb2dpbiByZXRyeSBsaW1pdCAocmVkdWNlZCB0byBwcmV2ZW50IGFjY291bnQgbG9ja291dCkgKi9cbmNvbnN0IExPR0lOX1JFVFJZX0xJTUlUID0gMztcblxuLyoqXG4gKiBMb2dpbiB0byBXaWtpZG90IHdpdGggdXNlcm5hbWUgYW5kIHBhc3N3b3JkXG4gKiBAcGFyYW0gY2xpZW50IC0gQ2xpZW50IGNvbnRleHQgKG9iamVjdCB3aXRoIEFNQ0NsaWVudClcbiAqIEBwYXJhbSB1c2VybmFtZSAtIFVzZXJuYW1lXG4gKiBAcGFyYW0gcGFzc3dvcmQgLSBQYXNzd29yZFxuICogQHJldHVybnMgdm9pZCBvbiBzdWNjZXNzLCBTZXNzaW9uQ3JlYXRlRXJyb3Igb24gZmFpbHVyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9naW4oXG4gIGNsaWVudDogQXV0aENsaWVudENvbnRleHQsXG4gIHVzZXJuYW1lOiBzdHJpbmcsXG4gIHBhc3N3b3JkOiBzdHJpbmdcbik6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgbG9naW46IHVzZXJuYW1lLFxuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXG4gICAgICAgIGFjdGlvbjogJ0xvZ2luMkFjdGlvbicsXG4gICAgICAgIGV2ZW50OiAnbG9naW4nLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFVzZSByZWR1Y2VkIHJldHJ5IGxpbWl0IGZvciBsb2dpbiB0byBwcmV2ZW50IGFjY291bnQgbG9ja291dFxuICAgICAgY29uc3QgbG9naW5Db25maWcgPSB7XG4gICAgICAgIC4uLkRFRkFVTFRfQU1DX0NPTkZJRyxcbiAgICAgICAgcmV0cnlMaW1pdDogTE9HSU5fUkVUUllfTElNSVQsXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeShMT0dJTl9VUkwsIGxvZ2luQ29uZmlnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiBjbGllbnQuYW1jQ2xpZW50LmhlYWRlci5nZXRIZWFkZXJzKCksXG4gICAgICAgIGJvZHk6IGZvcm1EYXRhLnRvU3RyaW5nKCksXG4gICAgICAgIGNoZWNrT2s6IGZhbHNlLCAvLyBIYW5kbGUgSFRUUCBlcnJvcnMgbWFudWFsbHkgZm9yIGJldHRlciBlcnJvciBtZXNzYWdlc1xuICAgICAgfSk7XG5cbiAgICAgIC8vIENoZWNrIHN0YXR1cyBjb2RlXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXNzaW9uQ3JlYXRlRXJyb3IoXG4gICAgICAgICAgYExvZ2luIGF0dGVtcHQgZmFpbGVkIGR1ZSB0byBIVFRQIHN0YXR1cyBjb2RlOiAke3Jlc3BvbnNlLnN0YXR1c31gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGJvZHkgZm9yIGVycm9yIG1lc3NhZ2VcbiAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICBpZiAoYm9keS5pbmNsdWRlcygnVGhlIGxvZ2luIGFuZCBwYXNzd29yZCBkbyBub3QgbWF0Y2gnKSkge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKCdMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gaW52YWxpZCB1c2VybmFtZSBvciBwYXNzd29yZCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBjb29raWVzXG4gICAgICBjb25zdCBjb29raWVzID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoJ1NldC1Db29raWUnKTtcbiAgICAgIGlmICghY29va2llcykge1xuICAgICAgICB0aHJvdyBuZXcgU2Vzc2lvbkNyZWF0ZUVycm9yKCdMb2dpbiBhdHRlbXB0IGZhaWxlZCBkdWUgdG8gbWlzc2luZyBjb29raWVzJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEV4dHJhY3QgV0lLSURPVF9TRVNTSU9OX0lEIGZyb20gY29va2llc1xuICAgICAgY29uc3Qgc2Vzc2lvbklkTWF0Y2ggPSBjb29raWVzLm1hdGNoKC9XSUtJRE9UX1NFU1NJT05fSUQ9KFteO10rKS8pO1xuICAgICAgaWYgKCFzZXNzaW9uSWRNYXRjaD8uWzFdKSB7XG4gICAgICAgIHRocm93IG5ldyBTZXNzaW9uQ3JlYXRlRXJyb3IoXG4gICAgICAgICAgJ0xvZ2luIGF0dGVtcHQgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIFdJS0lET1RfU0VTU0lPTl9JRCBjb29raWUnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBzZXNzaW9uIGNvb2tpZVxuICAgICAgY2xpZW50LmFtY0NsaWVudC5oZWFkZXIuc2V0Q29va2llKCdXSUtJRE9UX1NFU1NJT05fSUQnLCBzZXNzaW9uSWRNYXRjaFsxXSk7XG4gICAgfSkoKSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlc3Npb25DcmVhdGVFcnJvcikge1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFNlc3Npb25DcmVhdGVFcnJvcihgTG9naW4gZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIExvZ291dCBmcm9tIFdpa2lkb3RcbiAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnQgY29udGV4dCAob2JqZWN0IHdpdGggQU1DQ2xpZW50KVxuICogQHJldHVybnMgdm9pZCBvbiBzdWNjZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dvdXQoY2xpZW50OiBBdXRoQ2xpZW50Q29udGV4dCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gIC8vIFRyeSB0byBsb2dvdXQgdmlhIEFNQywgdGhlbiBhbHdheXMgcmVtb3ZlIHNlc3Npb24gY29va2llXG4gIHJldHVybiBjbGllbnQuYW1jQ2xpZW50XG4gICAgLnJlcXVlc3QoW1xuICAgICAge1xuICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICBhY3Rpb246ICdMb2dpbjJBY3Rpb24nLFxuICAgICAgICBldmVudDogJ2xvZ291dCcsXG4gICAgICB9LFxuICAgIF0pXG4gICAgLm1hcCgoKSA9PiB7XG4gICAgICAvLyBMb2dvdXQgc3VjY2VlZGVkLCByZW1vdmUgc2Vzc2lvbiBjb29raWVcbiAgICAgIGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLmRlbGV0ZUNvb2tpZSgnV0lLSURPVF9TRVNTSU9OX0lEJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0pXG4gICAgLm9yRWxzZSgoKSA9PiB7XG4gICAgICAvLyBFdmVuIGlmIGxvZ291dCByZXF1ZXN0IGZhaWxzLCB3ZSBzdGlsbCB3YW50IHRvIGNsZWFyIHRoZSBzZXNzaW9uIGxvY2FsbHlcbiAgICAgIGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLmRlbGV0ZUNvb2tpZSgnV0lLSURPVF9TRVNTSU9OX0lEJyk7XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKHVuZGVmaW5lZCk7XG4gICAgfSk7XG59XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTG9naW5SZXF1aXJlZEVycm9yLFxuICBOb0VsZW1lbnRFcnJvcixcbiAgVW5leHBlY3RlZEVycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSAnLi4vdXNlci91c2VyJztcblxuLyoqXG4gKiBQcml2YXRlIG1lc3NhZ2UgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVNZXNzYWdlRGF0YSB7XG4gIGNsaWVudDogQ2xpZW50O1xuICBpZDogbnVtYmVyO1xuICBzZW5kZXI6IEFic3RyYWN0VXNlcjtcbiAgcmVjaXBpZW50OiBBYnN0cmFjdFVzZXI7XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgYm9keTogc3RyaW5nO1xuICBjcmVhdGVkQXQ6IERhdGU7XG59XG5cbi8qKlxuICogUHJpdmF0ZSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBQcml2YXRlTWVzc2FnZSB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBzZW5kZXI6IEFic3RyYWN0VXNlcjtcbiAgcHVibGljIHJlYWRvbmx5IHJlY2lwaWVudDogQWJzdHJhY3RVc2VyO1xuICBwdWJsaWMgcmVhZG9ubHkgc3ViamVjdDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgYm9keTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZEF0OiBEYXRlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFByaXZhdGVNZXNzYWdlRGF0YSkge1xuICAgIHRoaXMuY2xpZW50ID0gZGF0YS5jbGllbnQ7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy5zZW5kZXIgPSBkYXRhLnNlbmRlcjtcbiAgICB0aGlzLnJlY2lwaWVudCA9IGRhdGEucmVjaXBpZW50O1xuICAgIHRoaXMuc3ViamVjdCA9IGRhdGEuc3ViamVjdDtcbiAgICB0aGlzLmJvZHkgPSBkYXRhLmJvZHk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVzc2FnZSBieSBtZXNzYWdlIElEXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIG1lc3NhZ2VJZCAtIE1lc3NhZ2UgSURcbiAgICogQHJldHVybnMgUHJpdmF0ZSBtZXNzYWdlXG4gICAqL1xuICBzdGF0aWMgZnJvbUlkKGNsaWVudDogQ2xpZW50LCBtZXNzYWdlSWQ6IG51bWJlcik6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5mcm9tSWRzKGNsaWVudCwgW21lc3NhZ2VJZF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBNZXNzYWdlIG5vdCBmb3VuZDogJHttZXNzYWdlSWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWVzc2FnZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBwcml2YXRlIG1lc3NhZ2VcbiAgICogQHBhcmFtIGNsaWVudCAtIENsaWVudCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gcmVjaXBpZW50IC0gUmVjaXBpZW50XG4gICAqIEBwYXJhbSBzdWJqZWN0IC0gU3ViamVjdFxuICAgKiBAcGFyYW0gYm9keSAtIEJvZHlcbiAgICovXG4gIHN0YXRpYyBzZW5kKFxuICAgIGNsaWVudDogQ2xpZW50LFxuICAgIHJlY2lwaWVudDogVXNlcixcbiAgICBzdWJqZWN0OiBzdHJpbmcsXG4gICAgYm9keTogc3RyaW5nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBjbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBzZW5kIG1lc3NhZ2UnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjbGllbnQuYW1jQ2xpZW50LnJlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNvdXJjZTogYm9keSxcbiAgICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgICB0b191c2VyX2lkOiByZWNpcGllbnQuaWQsXG4gICAgICAgICAgICBhY3Rpb246ICdEYXNoYm9hcmRNZXNzYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2VuZCcsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZW5kIG1lc3NhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUHJpdmF0ZU1lc3NhZ2UoaWQ9JHt0aGlzLmlkfSwgc2VuZGVyPSR7dGhpcy5zZW5kZXJ9LCByZWNpcGllbnQ9JHt0aGlzLnJlY2lwaWVudH0sIHN1YmplY3Q9JHt0aGlzLnN1YmplY3R9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQcml2YXRlIG1lc3NhZ2UgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UHJpdmF0ZU1lc3NhZ2U+IHtcbiAgcHVibGljIHJlYWRvbmx5IGNsaWVudDogQ2xpZW50O1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBtZXNzYWdlcz86IFByaXZhdGVNZXNzYWdlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIGlmIChtZXNzYWdlcykge1xuICAgICAgdGhpcy5wdXNoKC4uLm1lc3NhZ2VzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBJRFxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IFByaXZhdGVNZXNzYWdlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChtZXNzYWdlKSA9PiBtZXNzYWdlLmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1lc3NhZ2VzIGZyb20gbGlzdCBvZiBtZXNzYWdlIElEc1xuICAgKi9cbiAgc3RhdGljIGZyb21JZHMoXG4gICAgY2xpZW50OiBDbGllbnQsXG4gICAgbWVzc2FnZUlkczogbnVtYmVyW11cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gZ2V0IG1lc3NhZ2VzJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgYm9kaWVzID0gbWVzc2FnZUlkcy5tYXAoKG1lc3NhZ2VJZCkgPT4gKHtcbiAgICAgICAgICBpdGVtOiBtZXNzYWdlSWQsXG4gICAgICAgICAgbW9kdWxlTmFtZTogJ2Rhc2hib2FyZC9tZXNzYWdlcy9ETVZpZXdNZXNzYWdlTW9kdWxlJyxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXNzYWdlczogUHJpdmF0ZU1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVzc2FnZUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IG1lc3NhZ2VJZHNbaV07XG4gICAgICAgICAgaWYgKCFyZXNwb25zZSB8fCBtZXNzYWdlSWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgICAgICBjb25zdCBodG1sID0gU3RyaW5nKHJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG5cbiAgICAgICAgICAvLyBHZXQgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgIGNvbnN0IHByaW50dXNlckVsZW1zID0gJCgnZGl2LnBtZXNzYWdlIGRpdi5oZWFkZXIgc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICBpZiAocHJpbnR1c2VyRWxlbXMubGVuZ3RoIDwgMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkVycm9yKGBGYWlsZWQgdG8gZ2V0IG1lc3NhZ2U6ICR7bWVzc2FnZUlkfWApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNlbmRlckVsZW0gPSAkKHByaW50dXNlckVsZW1zWzBdKTtcbiAgICAgICAgICBjb25zdCByZWNpcGllbnRFbGVtID0gJChwcmludHVzZXJFbGVtc1sxXSk7XG5cbiAgICAgICAgICBjb25zdCBzZW5kZXIgPSBwYXJzZVVzZXIoY2xpZW50LCBzZW5kZXJFbGVtKTtcbiAgICAgICAgICBjb25zdCByZWNpcGllbnQgPSBwYXJzZVVzZXIoY2xpZW50LCByZWNpcGllbnRFbGVtKTtcblxuICAgICAgICAgIC8vIFN1YmplY3RcbiAgICAgICAgICBjb25zdCBzdWJqZWN0RWxlbSA9ICQoJ2Rpdi5wbWVzc2FnZSBkaXYuaGVhZGVyIHNwYW4uc3ViamVjdCcpO1xuICAgICAgICAgIGNvbnN0IHN1YmplY3QgPSBzdWJqZWN0RWxlbS50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gQm9keVxuICAgICAgICAgIGNvbnN0IGJvZHlFbGVtID0gJCgnZGl2LnBtZXNzYWdlIGRpdi5ib2R5Jyk7XG4gICAgICAgICAgY29uc3QgYm9keSA9IGJvZHlFbGVtLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICAvLyBUaW1lc3RhbXBcbiAgICAgICAgICBjb25zdCBvZGF0ZUVsZW0gPSAkKCdkaXYuaGVhZGVyIHNwYW4ub2RhdGUnKTtcbiAgICAgICAgICBjb25zdCBjcmVhdGVkQXQgPVxuICAgICAgICAgICAgb2RhdGVFbGVtLmxlbmd0aCA+IDAgPyAocGFyc2VPZGF0ZShvZGF0ZUVsZW0pID8/IG5ldyBEYXRlKDApKSA6IG5ldyBEYXRlKDApO1xuXG4gICAgICAgICAgbWVzc2FnZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBQcml2YXRlTWVzc2FnZSh7XG4gICAgICAgICAgICAgIGNsaWVudCxcbiAgICAgICAgICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgc2VuZGVyLFxuICAgICAgICAgICAgICByZWNpcGllbnQsXG4gICAgICAgICAgICAgIHN1YmplY3QsXG4gICAgICAgICAgICAgIGJvZHksXG4gICAgICAgICAgICAgIGNyZWF0ZWRBdCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uKGNsaWVudCwgbWVzc2FnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBtZXNzYWdlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGdldCBtZXNzYWdlcyBmcm9tIG1vZHVsZVxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXRpYyBhY3F1aXJlRnJvbU1vZHVsZShcbiAgICBjbGllbnQ6IENsaWVudCxcbiAgICBtb2R1bGVOYW1lOiBzdHJpbmdcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gY2xpZW50LnJlcXVpcmVMb2dpbigpO1xuICAgIGlmIChsb2dpblJlc3VsdC5pc0VycigpKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KGxvZ2luUmVzdWx0LmVycm9yKSxcbiAgICAgICAgKCkgPT4gbmV3IExvZ2luUmVxdWlyZWRFcnJvcignTG9naW4gcmVxdWlyZWQgdG8gZ2V0IG1lc3NhZ2VzJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gR2V0IHBhZ2VyXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gYXdhaXQgY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0KFt7IG1vZHVsZU5hbWUgfV0pO1xuICAgICAgICBpZiAoZmlyc3RSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGZpcnN0UmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlyc3RSZXNwb25zZSA9IGZpcnN0UmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIWZpcnN0UmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdEh0bWwgPSBTdHJpbmcoZmlyc3RSZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJGZpcnN0ID0gY2hlZXJpby5sb2FkKGZpcnN0SHRtbCk7XG5cbiAgICAgICAgLy8gR2V0IHBhZ2UgY291bnRcbiAgICAgICAgY29uc3QgcGFnZXJUYXJnZXRzID0gJGZpcnN0KCdkaXYucGFnZXIgc3Bhbi50YXJnZXQnKTtcbiAgICAgICAgbGV0IG1heFBhZ2UgPSAxO1xuICAgICAgICBpZiAocGFnZXJUYXJnZXRzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICBjb25zdCBsYXN0UGFnZVRleHQgPSAkZmlyc3QocGFnZXJUYXJnZXRzW3BhZ2VyVGFyZ2V0cy5sZW5ndGggLSAyXSlcbiAgICAgICAgICAgIC50ZXh0KClcbiAgICAgICAgICAgIC50cmltKCk7XG4gICAgICAgICAgbWF4UGFnZSA9IE51bWJlci5wYXJzZUludChsYXN0UGFnZVRleHQsIDEwKSB8fCAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IG1lc3NhZ2UgSURzIGZyb20gYWxsIHBhZ2VzXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VJZHM6IG51bWJlcltdID0gW107XG5cbiAgICAgICAgaWYgKG1heFBhZ2UgPiAxKSB7XG4gICAgICAgICAgY29uc3QgYm9kaWVzID0gW107XG4gICAgICAgICAgZm9yIChsZXQgcGFnZSA9IDE7IHBhZ2UgPD0gbWF4UGFnZTsgcGFnZSsrKSB7XG4gICAgICAgICAgICBib2RpZXMucHVzaCh7IHBhZ2UsIG1vZHVsZU5hbWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgY2xpZW50LmFtY0NsaWVudC5yZXF1ZXN0KGJvZGllcyk7XG4gICAgICAgICAgaWYgKGFkZGl0aW9uYWxSZXN1bHRzLmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IGFkZGl0aW9uYWxSZXN1bHRzLmVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgYWRkaXRpb25hbFJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcbiAgICAgICAgICAgICQoJ3RyLm1lc3NhZ2UnKS5lYWNoKChfaSwgZWxlbSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBkYXRhSHJlZiA9ICQoZWxlbSkuYXR0cignZGF0YS1ocmVmJykgPz8gJyc7XG4gICAgICAgICAgICAgIGNvbnN0IGlkTWF0Y2ggPSBkYXRhSHJlZi5tYXRjaCgvXFwvKFxcZCspJC8pO1xuICAgICAgICAgICAgICBpZiAoaWRNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZUlkcy5wdXNoKE51bWJlci5wYXJzZUludChpZE1hdGNoWzFdLCAxMCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgJGZpcnN0KCd0ci5tZXNzYWdlJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFIcmVmID0gJGZpcnN0KGVsZW0pLmF0dHIoJ2RhdGEtaHJlZicpID8/ICcnO1xuICAgICAgICAgICAgY29uc3QgaWRNYXRjaCA9IGRhdGFIcmVmLm1hdGNoKC9cXC8oXFxkKykkLyk7XG4gICAgICAgICAgICBpZiAoaWRNYXRjaD8uWzFdKSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2VJZHMucHVzaChOdW1iZXIucGFyc2VJbnQoaWRNYXRjaFsxXSwgMTApKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBtZXNzYWdlc1xuICAgICAgICBjb25zdCBtZXNzYWdlc1Jlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5mcm9tSWRzKGNsaWVudCwgbWVzc2FnZUlkcyk7XG4gICAgICAgIGlmIChtZXNzYWdlc1Jlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgbWVzc2FnZXNSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWVzc2FnZXNSZXN1bHQudmFsdWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEZvcmJpZGRlbkVycm9yIHx8XG4gICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IgfHxcbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgbWVzc2FnZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogSW5ib3hcbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVNZXNzYWdlSW5ib3ggZXh0ZW5kcyBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24ge1xuICAvKipcbiAgICogR2V0IGFsbCBtZXNzYWdlcyBpbiBpbmJveFxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUoY2xpZW50OiBDbGllbnQpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2VJbmJveD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbi5hY3F1aXJlRnJvbU1vZHVsZShcbiAgICAgICAgICBjbGllbnQsXG4gICAgICAgICAgJ2Rhc2hib2FyZC9tZXNzYWdlcy9ETUluYm94TW9kdWxlJ1xuICAgICAgICApO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5ib3ggPSBuZXcgUHJpdmF0ZU1lc3NhZ2VJbmJveChjbGllbnQpO1xuICAgICAgICBpbmJveC5wdXNoKC4uLnJlc3VsdC52YWx1ZSk7XG4gICAgICAgIHJldHVybiBpbmJveDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIGluYm94OiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFNlbnQgYm94XG4gKi9cbmV4cG9ydCBjbGFzcyBQcml2YXRlTWVzc2FnZVNlbnRCb3ggZXh0ZW5kcyBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24ge1xuICAvKipcbiAgICogR2V0IGFsbCBtZXNzYWdlcyBpbiBzZW50IGJveFxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUoY2xpZW50OiBDbGllbnQpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2VTZW50Qm94PiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uLmFjcXVpcmVGcm9tTW9kdWxlKFxuICAgICAgICAgIGNsaWVudCxcbiAgICAgICAgICAnZGFzaGJvYXJkL21lc3NhZ2VzL0RNU2VudE1vZHVsZSdcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbnRCb3ggPSBuZXcgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94KGNsaWVudCk7XG4gICAgICAgIHNlbnRCb3gucHVzaCguLi5yZXN1bHQudmFsdWUpO1xuICAgICAgICByZXR1cm4gc2VudEJveDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHNlbnQgYm94OiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQge1xuICBQcml2YXRlTWVzc2FnZSxcbiAgUHJpdmF0ZU1lc3NhZ2VDb2xsZWN0aW9uLFxuICBQcml2YXRlTWVzc2FnZUluYm94LFxuICBQcml2YXRlTWVzc2FnZVNlbnRCb3gsXG59IGZyb20gJy4uLy4uL3ByaXZhdGUtbWVzc2FnZSc7XG5pbXBvcnQgdHlwZSB7IFVzZXIgfSBmcm9tICcuLi8uLi91c2VyL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQnO1xuXG4vKipcbiAqIFByaXZhdGUgbWVzc2FnZSBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEdldCBpbmJveFxuICogY29uc3QgaW5ib3hSZXN1bHQgPSBhd2FpdCBjbGllbnQucHJpdmF0ZU1lc3NhZ2UuaW5ib3goKTtcbiAqIGlmICghaW5ib3hSZXN1bHQuaXNPaygpKSB7XG4gKiAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCBpbmJveCcpO1xuICogfVxuICogY29uc3QgaW5ib3ggPSBpbmJveFJlc3VsdC52YWx1ZTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZU1lc3NhZ2VBY2Nlc3NvciB7XG4gIHB1YmxpYyByZWFkb25seSBjbGllbnQ6IENsaWVudDtcblxuICBjb25zdHJ1Y3RvcihjbGllbnQ6IENsaWVudCkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZXNzYWdlIGJ5IG1lc3NhZ2UgSURcbiAgICpcbiAgICogQHBhcmFtIGlkIC0gTWVzc2FnZSBJRFxuICAgKiBAcmV0dXJucyBNZXNzYWdlIG9iamVjdCB3cmFwcGVkIGluIFJlc3VsdCB0eXBlXG4gICAqL1xuICBnZXQoaWQ6IG51bWJlcik6IFdpa2lkb3RSZXN1bHRBc3luYzxQcml2YXRlTWVzc2FnZT4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZS5mcm9tSWQodGhpcy5jbGllbnQsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVzc2FnZXMgZnJvbSBtdWx0aXBsZSBtZXNzYWdlIElEc1xuICAgKiBAcGFyYW0gaWRzIC0gQXJyYXkgb2YgbWVzc2FnZSBJRHNcbiAgICogQHJldHVybnMgTWVzc2FnZSBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRNZXNzYWdlcyhpZHM6IG51bWJlcltdKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZUNvbGxlY3Rpb24uZnJvbUlkcyh0aGlzLmNsaWVudCwgaWRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaW5ib3ggbWVzc2FnZSBsaXN0XG4gICAqIEByZXR1cm5zIEluYm94XG4gICAqL1xuICBpbmJveCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8UHJpdmF0ZU1lc3NhZ2VJbmJveD4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZUluYm94LmFjcXVpcmUodGhpcy5jbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzZW50IGJveCBtZXNzYWdlIGxpc3RcbiAgICogQHJldHVybnMgU2VudCBib3hcbiAgICovXG4gIHNlbnRCb3goKTogV2lraWRvdFJlc3VsdEFzeW5jPFByaXZhdGVNZXNzYWdlU2VudEJveD4ge1xuICAgIHJldHVybiBQcml2YXRlTWVzc2FnZVNlbnRCb3guYWNxdWlyZSh0aGlzLmNsaWVudCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIHByaXZhdGUgbWVzc2FnZVxuICAgKiBAcGFyYW0gcmVjaXBpZW50IC0gUmVjaXBpZW50XG4gICAqIEBwYXJhbSBzdWJqZWN0IC0gU3ViamVjdFxuICAgKiBAcGFyYW0gYm9keSAtIEJvZHlcbiAgICovXG4gIHNlbmQocmVjaXBpZW50OiBVc2VyLCBzdWJqZWN0OiBzdHJpbmcsIGJvZHk6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFByaXZhdGVNZXNzYWdlLnNlbmQodGhpcy5jbGllbnQsIHJlY2lwaWVudCwgc3ViamVjdCwgYm9keSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUHJpdmF0ZU1lc3NhZ2UsIFByaXZhdGVNZXNzYWdlQ29sbGVjdGlvbiwgUHJpdmF0ZU1lc3NhZ2VJbmJveCwgUHJpdmF0ZU1lc3NhZ2VTZW50Qm94IH07XG4iLAogICAgImltcG9ydCB0eXBlIHsgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7XG4gIEZvcnVtQ2F0ZWdvcnksXG4gIEZvcnVtQ2F0ZWdvcnlDb2xsZWN0aW9uLFxuICBGb3J1bVBvc3QsXG4gIEZvcnVtVGhyZWFkLFxuICBGb3J1bVRocmVhZENvbGxlY3Rpb24sXG59IGZyb20gJy4uLy4uL2ZvcnVtJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuXG4vKipcbiAqIEZvcnVtIG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIEZvcnVtQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlKSB7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZm9ydW0gY2F0ZWdvcnkgbGlzdFxuICAgKiBAcmV0dXJucyBDYXRlZ29yeSBsaXN0XG4gICAqL1xuICBnZXRDYXRlZ29yaWVzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbi5hY3F1aXJlQWxsKHRoaXMuc2l0ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRocmVhZFxuICAgKiBAcGFyYW0gdGhyZWFkSWQgLSBUaHJlYWQgSURcbiAgICogQHJldHVybnMgVGhyZWFkXG4gICAqL1xuICBnZXRUaHJlYWQodGhyZWFkSWQ6IG51bWJlcik6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZD4ge1xuICAgIHJldHVybiBGb3J1bVRocmVhZC5nZXRGcm9tSWQodGhpcy5zaXRlLCB0aHJlYWRJZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG11bHRpcGxlIHRocmVhZHNcbiAgICogQHBhcmFtIHRocmVhZElkcyAtIEFycmF5IG9mIHRocmVhZCBJRHNcbiAgICogQHJldHVybnMgVGhyZWFkIGNvbGxlY3Rpb25cbiAgICovXG4gIGdldFRocmVhZHModGhyZWFkSWRzOiBudW1iZXJbXSk6IFdpa2lkb3RSZXN1bHRBc3luYzxGb3J1bVRocmVhZENvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gRm9ydW1UaHJlYWRDb2xsZWN0aW9uLmFjcXVpcmVGcm9tVGhyZWFkSWRzKHRoaXMuc2l0ZSwgdGhyZWFkSWRzKTtcbiAgfVxufVxuXG5leHBvcnQgeyBGb3J1bUNhdGVnb3J5LCBGb3J1bUNhdGVnb3J5Q29sbGVjdGlvbiwgRm9ydW1UaHJlYWQsIEZvcnVtVGhyZWFkQ29sbGVjdGlvbiwgRm9ydW1Qb3N0IH07XG4iLAogICAgImltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgVGFyZ2V0RXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdFN0YXR1c0Vycm9yLFxufSBmcm9tICcuLi8uLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyB0eXBlIFFNQ1VzZXIsIFF1aWNrTW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9xdWljay1tb2R1bGUnO1xuaW1wb3J0IHR5cGUgeyBVc2VyIH0gZnJvbSAnLi4vLi4vdXNlci91c2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHsgU2l0ZUFwcGxpY2F0aW9uIH0gZnJvbSAnLi4vc2l0ZS1hcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBTaXRlTWVtYmVyIH0gZnJvbSAnLi4vc2l0ZS1tZW1iZXInO1xuXG4vKipcbiAqIFNpdGUgbWVtYmVyIG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIE1lbWJlckFjY2Vzc29yIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSkge1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBtZW1iZXJzXG4gICAqIEByZXR1cm5zIE1lbWJlciBsaXN0XG4gICAqL1xuICBnZXRBbGwoKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVNZW1iZXJbXT4ge1xuICAgIHJldHVybiBTaXRlTWVtYmVyLmdldE1lbWJlcnModGhpcy5zaXRlLCAnJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG1vZGVyYXRvciBsaXN0XG4gICAqIEByZXR1cm5zIE1vZGVyYXRvciBsaXN0XG4gICAqL1xuICBnZXRNb2RlcmF0b3JzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlTWVtYmVyW10+IHtcbiAgICByZXR1cm4gU2l0ZU1lbWJlci5nZXRNZW1iZXJzKHRoaXMuc2l0ZSwgJ21vZGVyYXRvcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWRtaW4gbGlzdFxuICAgKiBAcmV0dXJucyBBZG1pbiBsaXN0XG4gICAqL1xuICBnZXRBZG1pbnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVNZW1iZXJbXT4ge1xuICAgIHJldHVybiBTaXRlTWVtYmVyLmdldE1lbWJlcnModGhpcy5zaXRlLCAnYWRtaW5zJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBlbmRpbmcgbWVtYmVyc2hpcCBhcHBsaWNhdGlvbnNcbiAgICogQHJldHVybnMgQXBwbGljYXRpb24gbGlzdFxuICAgKi9cbiAgZ2V0QXBwbGljYXRpb25zKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxTaXRlQXBwbGljYXRpb25bXT4ge1xuICAgIHJldHVybiBTaXRlQXBwbGljYXRpb24uYWNxdWlyZUFsbCh0aGlzLnNpdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBtZW1iZXJzXG4gICAqIEBwYXJhbSBxdWVyeSAtIFNlYXJjaCBxdWVyeSAocGFydCBvZiB1c2VybmFtZSlcbiAgICogQHJldHVybnMgTWF0Y2hlZCB1c2VyIGxpc3QgKFFNQ1VzZXIgZm9ybWF0KVxuICAgKi9cbiAgbG9va3VwKHF1ZXJ5OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8UU1DVXNlcltdPiB7XG4gICAgcmV0dXJuIFF1aWNrTW9kdWxlLm1lbWJlckxvb2t1cCh0aGlzLnNpdGUuaWQsIHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZpdGUgdXNlciB0byBzaXRlXG4gICAqIEBwYXJhbSB1c2VyIC0gVXNlciB0byBpbnZpdGVcbiAgICogQHBhcmFtIHRleHQgLSBJbnZpdGF0aW9uIG1lc3NhZ2VcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgaW52aXRlKHVzZXI6IFVzZXIsIHRleHQ6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ01hbmFnZVNpdGVNZW1iZXJzaGlwQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnaW52aXRlTWVtYmVyJyxcbiAgICAgICAgICAgIHVzZXJfaWQ6IHVzZXIuaWQsXG4gICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3I7XG4gICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgV2lraWRvdFN0YXR1c0Vycm9yKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ2FscmVhZHlfaW52aXRlZCcpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldEVycm9yKFxuICAgICAgICAgICAgICAgIGBVc2VyIGlzIGFscmVhZHkgaW52aXRlZCB0byAke3RoaXMuc2l0ZS51bml4TmFtZX06ICR7dXNlci5uYW1lfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXNDb2RlID09PSAnYWxyZWFkeV9tZW1iZXInKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYXJnZXRFcnJvcihcbiAgICAgICAgICAgICAgICBgVXNlciBpcyBhbHJlYWR5IGEgbWVtYmVyIG9mICR7dGhpcy5zaXRlLnVuaXhOYW1lfTogJHt1c2VyLm5hbWV9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUYXJnZXRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGludml0ZSB1c2VyOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTaXRlTWVtYmVyLCBTaXRlQXBwbGljYXRpb24gfTtcbiIsCiAgICAiLyoqXG4gKiBRdWlja01vZHVsZSAtIFdpa2lkb3QgbGlnaHR3ZWlnaHQgQVBJXG4gKlxuICogU2VhcmNoIGZ1bmN0aW9uYWxpdHkgdXNpbmcgcXVpY2ttb2R1bGUucGhwIGVuZHBvaW50XG4gKi9cblxuaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBOb3RGb3VuZEV4Y2VwdGlvbiwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgREVGQVVMVF9BTUNfQ09ORklHIH0gZnJvbSAnLi4vY29ubmVjdG9yL2FtYy1jb25maWcnO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuL2h0dHAnO1xuXG4vKipcbiAqIFF1aWNrTW9kdWxlIG1vZHVsZSBuYW1lXG4gKi9cbmV4cG9ydCB0eXBlIFF1aWNrTW9kdWxlTmFtZSA9ICdNZW1iZXJMb29rdXBRTW9kdWxlJyB8ICdVc2VyTG9va3VwUU1vZHVsZScgfCAnUGFnZUxvb2t1cFFNb2R1bGUnO1xuXG4vKipcbiAqIFF1aWNrTW9kdWxlIHVzZXIgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRTUNVc2VyIHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFF1aWNrTW9kdWxlIHBhZ2UgaW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRTUNQYWdlIHtcbiAgdGl0bGU6IHN0cmluZztcbiAgdW5peE5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBRdWlja01vZHVsZSByZXNwb25zZSBzY2hlbWFcbiAqL1xuY29uc3QgcXVpY2tNb2R1bGVVc2VyUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHVzZXJzOiB6LnVuaW9uKFtcbiAgICB6LmFycmF5KFxuICAgICAgei5vYmplY3Qoe1xuICAgICAgICB1c2VyX2lkOiB6LnVuaW9uKFt6LnN0cmluZygpLCB6Lm51bWJlcigpXSksXG4gICAgICAgIG5hbWU6IHouc3RyaW5nKCksXG4gICAgICB9KVxuICAgICksXG4gICAgei5saXRlcmFsKGZhbHNlKSxcbiAgXSksXG59KTtcblxuY29uc3QgcXVpY2tNb2R1bGVQYWdlUmVzcG9uc2VTY2hlbWEgPSB6Lm9iamVjdCh7XG4gIHBhZ2VzOiB6LnVuaW9uKFtcbiAgICB6LmFycmF5KFxuICAgICAgei5vYmplY3Qoe1xuICAgICAgICB0aXRsZTogei5zdHJpbmcoKSxcbiAgICAgICAgdW5peF9uYW1lOiB6LnN0cmluZygpLFxuICAgICAgfSlcbiAgICApLFxuICAgIHoubGl0ZXJhbChmYWxzZSksXG4gIF0pLFxufSk7XG5cbi8qKlxuICogU2VuZCByZXF1ZXN0IHRvIFF1aWNrTW9kdWxlIGVuZHBvaW50XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RRdWlja01vZHVsZShcbiAgbW9kdWxlTmFtZTogUXVpY2tNb2R1bGVOYW1lLFxuICBzaXRlSWQ6IG51bWJlcixcbiAgcXVlcnk6IHN0cmluZ1xuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGNvbnN0IHVybCA9IGBodHRwczovL3d3dy53aWtpZG90LmNvbS9xdWlja21vZHVsZS5waHA/bW9kdWxlPSR7bW9kdWxlTmFtZX0mcz0ke3NpdGVJZH0mcT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9YDtcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoV2l0aFJldHJ5KHVybCwgREVGQVVMVF9BTUNfQ09ORklHLCB7XG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgICBoZWFkZXJzOiB7XG4gICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB9LFxuICAgIGNoZWNrT2s6IGZhbHNlLCAvLyBIYW5kbGUgSFRUUCBlcnJvcnMgbWFudWFsbHlcbiAgfSk7XG5cbiAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNTAwKSB7XG4gICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBTaXRlIG5vdCBmb3VuZDogc2l0ZUlkPSR7c2l0ZUlkfWApO1xuICB9XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFF1aWNrTW9kdWxlIHJlcXVlc3QgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZS5qc29uKCk7XG59XG5cbi8qKlxuICogU2VhcmNoIHNpdGUgbWVtYmVyc1xuICogQHBhcmFtIHNpdGVJZCAtIFNpdGUgSURcbiAqIEBwYXJhbSBxdWVyeSAtIFNlYXJjaCBxdWVyeSAocGFydGlhbCB1c2VybmFtZSlcbiAqIEByZXR1cm5zIExpc3Qgb2YgbWF0Y2hpbmcgdXNlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbWJlckxvb2t1cChzaXRlSWQ6IG51bWJlciwgcXVlcnk6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxRTUNVc2VyW10+IHtcbiAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVxdWVzdFF1aWNrTW9kdWxlKCdNZW1iZXJMb29rdXBRTW9kdWxlJywgc2l0ZUlkLCBxdWVyeSk7XG4gICAgICBjb25zdCBwYXJzZWQgPSBxdWlja01vZHVsZVVzZXJSZXNwb25zZVNjaGVtYS5wYXJzZShkYXRhKTtcblxuICAgICAgaWYgKHBhcnNlZC51c2VycyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkLnVzZXJzLm1hcCgodXNlcikgPT4gKHtcbiAgICAgICAgaWQ6IHR5cGVvZiB1c2VyLnVzZXJfaWQgPT09ICdzdHJpbmcnID8gTnVtYmVyLnBhcnNlSW50KHVzZXIudXNlcl9pZCwgMTApIDogdXNlci51c2VyX2lkLFxuICAgICAgICBuYW1lOiB1c2VyLm5hbWUsXG4gICAgICB9KSk7XG4gICAgfSkoKSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgTWVtYmVyIGxvb2t1cCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKlxuICogU2VhcmNoIHVzZXJzIGFjcm9zcyBhbGwgV2lraWRvdFxuICogQHBhcmFtIHNpdGVJZCAtIFNpdGUgSUQgKGFueSBzaXRlIElEIHdvcmtzKVxuICogQHBhcmFtIHF1ZXJ5IC0gU2VhcmNoIHF1ZXJ5IChwYXJ0aWFsIHVzZXJuYW1lKVxuICogQHJldHVybnMgTGlzdCBvZiBtYXRjaGluZyB1c2Vyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlckxvb2t1cChzaXRlSWQ6IG51bWJlciwgcXVlcnk6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxRTUNVc2VyW10+IHtcbiAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVxdWVzdFF1aWNrTW9kdWxlKCdVc2VyTG9va3VwUU1vZHVsZScsIHNpdGVJZCwgcXVlcnkpO1xuICAgICAgY29uc3QgcGFyc2VkID0gcXVpY2tNb2R1bGVVc2VyUmVzcG9uc2VTY2hlbWEucGFyc2UoZGF0YSk7XG5cbiAgICAgIGlmIChwYXJzZWQudXNlcnMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZC51c2Vycy5tYXAoKHVzZXIpID0+ICh7XG4gICAgICAgIGlkOiB0eXBlb2YgdXNlci51c2VyX2lkID09PSAnc3RyaW5nJyA/IE51bWJlci5wYXJzZUludCh1c2VyLnVzZXJfaWQsIDEwKSA6IHVzZXIudXNlcl9pZCxcbiAgICAgICAgbmFtZTogdXNlci5uYW1lLFxuICAgICAgfSkpO1xuICAgIH0pKCksXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikgcmV0dXJuIGVycm9yO1xuICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYFVzZXIgbG9va3VwIGZhaWxlZDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgIH1cbiAgKTtcbn1cblxuLyoqXG4gKiBTZWFyY2ggcGFnZXMgd2l0aGluIHNpdGVcbiAqIEBwYXJhbSBzaXRlSWQgLSBTaXRlIElEXG4gKiBAcGFyYW0gcXVlcnkgLSBTZWFyY2ggcXVlcnkgKHBhcnRpYWwgcGFnZSBuYW1lKVxuICogQHJldHVybnMgTGlzdCBvZiBtYXRjaGluZyBwYWdlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFnZUxvb2t1cChzaXRlSWQ6IG51bWJlciwgcXVlcnk6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxRTUNQYWdlW10+IHtcbiAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVxdWVzdFF1aWNrTW9kdWxlKCdQYWdlTG9va3VwUU1vZHVsZScsIHNpdGVJZCwgcXVlcnkpO1xuICAgICAgY29uc3QgcGFyc2VkID0gcXVpY2tNb2R1bGVQYWdlUmVzcG9uc2VTY2hlbWEucGFyc2UoZGF0YSk7XG5cbiAgICAgIGlmIChwYXJzZWQucGFnZXMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcnNlZC5wYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgIHRpdGxlOiBwYWdlLnRpdGxlLFxuICAgICAgICB1bml4TmFtZTogcGFnZS51bml4X25hbWUsXG4gICAgICB9KSk7XG4gICAgfSkoKSxcbiAgICAoZXJyb3IpID0+IHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgUGFnZSBsb29rdXAgZmFpbGVkOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuICApO1xufVxuXG4vKipcbiAqIFF1aWNrTW9kdWxlIEFQSSAobWFpbnRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpXG4gKiBAZGVwcmVjYXRlZCBVc2UgaW5kaXZpZHVhbCBmdW5jdGlvbnMgKG1lbWJlckxvb2t1cCwgdXNlckxvb2t1cCwgcGFnZUxvb2t1cCkgaW5zdGVhZFxuICovXG5leHBvcnQgY29uc3QgUXVpY2tNb2R1bGU6IHtcbiAgbWVtYmVyTG9va3VwOiB0eXBlb2YgbWVtYmVyTG9va3VwO1xuICB1c2VyTG9va3VwOiB0eXBlb2YgdXNlckxvb2t1cDtcbiAgcGFnZUxvb2t1cDogdHlwZW9mIHBhZ2VMb29rdXA7XG59ID0ge1xuICBtZW1iZXJMb29rdXA6IG1lbWJlckxvb2t1cCxcbiAgdXNlckxvb2t1cDogdXNlckxvb2t1cCxcbiAgcGFnZUxvb2t1cDogcGFnZUxvb2t1cCxcbn07XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBSZXF1aXJlTG9naW4gfSBmcm9tICcuLi8uLi9jb21tb24vZGVjb3JhdG9ycyc7XG5pbXBvcnQge1xuICBGb3JiaWRkZW5FcnJvcixcbiAgTG9naW5SZXF1aXJlZEVycm9yLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgVW5leHBlY3RlZEVycm9yLFxuICBXaWtpZG90U3RhdHVzRXJyb3IsXG59IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlVXNlciB9IGZyb20gJy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuL3NpdGUnO1xuXG4vKipcbiAqIFNpdGUgbWVtYmVyc2hpcCBhcHBsaWNhdGlvbiBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZUFwcGxpY2F0aW9uRGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIHVzZXI6IEFic3RyYWN0VXNlcjtcbiAgdGV4dDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNpdGUgbWVtYmVyc2hpcCBhcHBsaWNhdGlvblxuICovXG5leHBvcnQgY2xhc3MgU2l0ZUFwcGxpY2F0aW9uIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSB1c2VyOiBBYnN0cmFjdFVzZXI7XG4gIHB1YmxpYyByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogU2l0ZUFwcGxpY2F0aW9uRGF0YSkge1xuICAgIHRoaXMuc2l0ZSA9IGRhdGEuc2l0ZTtcbiAgICB0aGlzLnVzZXIgPSBkYXRhLnVzZXI7XG4gICAgdGhpcy50ZXh0ID0gZGF0YS50ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgcGVuZGluZyBtZW1iZXJzaGlwIGFwcGxpY2F0aW9uc1xuICAgKiBAcGFyYW0gc2l0ZSAtIFRhcmdldCBzaXRlXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZUFsbChzaXRlOiBTaXRlKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVBcHBsaWNhdGlvbltdPiB7XG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBzaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGdldCBhcHBsaWNhdGlvbnMnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHsgbW9kdWxlTmFtZTogJ21hbmFnZXNpdGUvTWFuYWdlU2l0ZU1lbWJlcnNBcHBsaWNhdGlvbnNNb2R1bGUnIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG5cbiAgICAgICAgLy8gUGVybWlzc2lvbiBjaGVja1xuICAgICAgICBpZiAoaHRtbC5pbmNsdWRlcygnV0lLSURPVC5wYWdlLmxpc3RlbmVycy5sb2dpbkNsaWNrKGV2ZW50KScpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkVycm9yKCdZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGFjY2VzcyB0aGlzIHBhZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgIGNvbnN0IGFwcGxpY2F0aW9uczogU2l0ZUFwcGxpY2F0aW9uW10gPSBbXTtcblxuICAgICAgICBjb25zdCB1c2VyRWxlbWVudHMgPSAkKCdoMyBzcGFuLnByaW50dXNlcicpLnRvQXJyYXkoKTtcbiAgICAgICAgY29uc3QgdGV4dFdyYXBwZXJFbGVtZW50cyA9ICQoJ3RhYmxlJykudG9BcnJheSgpO1xuXG4gICAgICAgIGlmICh1c2VyRWxlbWVudHMubGVuZ3RoICE9PSB0ZXh0V3JhcHBlckVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoXG4gICAgICAgICAgICAnTGVuZ3RoIG9mIHVzZXJfZWxlbWVudHMgYW5kIHRleHRfd3JhcHBlcl9lbGVtZW50cyBhcmUgZGlmZmVyZW50J1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVzZXJFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHVzZXJFbGVtZW50ID0gdXNlckVsZW1lbnRzW2ldO1xuICAgICAgICAgIGNvbnN0IHRleHRXcmFwcGVyRWxlbWVudCA9IHRleHRXcmFwcGVyRWxlbWVudHNbaV07XG5cbiAgICAgICAgICBpZiAoIXVzZXJFbGVtZW50IHx8ICF0ZXh0V3JhcHBlckVsZW1lbnQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgdXNlciA9IHBhcnNlVXNlcihzaXRlLmNsaWVudCwgJCh1c2VyRWxlbWVudCkpO1xuICAgICAgICAgIGNvbnN0IHRleHRFbGVtZW50ID0gJCh0ZXh0V3JhcHBlckVsZW1lbnQpLmZpbmQoJ3RkJykuZXEoMSk7XG4gICAgICAgICAgY29uc3QgdGV4dCA9IHRleHRFbGVtZW50LnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICBhcHBsaWNhdGlvbnMucHVzaChuZXcgU2l0ZUFwcGxpY2F0aW9uKHsgc2l0ZSwgdXNlciwgdGV4dCB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXBwbGljYXRpb25zO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBGb3JiaWRkZW5FcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBhcHBsaWNhdGlvbnM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBwcm9jZXNzIGFwcGxpY2F0aW9uXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHByaXZhdGUgcHJvY2VzcyhhY3Rpb246ICdhY2NlcHQnIHwgJ2RlY2xpbmUnKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnTWFuYWdlU2l0ZU1lbWJlcnNoaXBBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdhY2NlcHRBcHBsaWNhdGlvbicsXG4gICAgICAgICAgICB1c2VyX2lkOiB0aGlzLnVzZXIuaWQsXG4gICAgICAgICAgICB0ZXh0OiBgeW91ciBhcHBsaWNhdGlvbiBoYXMgYmVlbiAke2FjdGlvbn1lZGAsXG4gICAgICAgICAgICB0eXBlOiBhY3Rpb24sXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXaWtpZG90U3RhdHVzRXJyb3IgJiYgZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ25vX2FwcGxpY2F0aW9uJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBBcHBsaWNhdGlvbiBub3QgZm91bmQ6ICR7dGhpcy51c2VyLm5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gcHJvY2VzcyBhcHBsaWNhdGlvbjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0IG1lbWJlcnNoaXAgYXBwbGljYXRpb25cbiAgICovXG4gIGFjY2VwdCgpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3MoJ2FjY2VwdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY2xpbmUgbWVtYmVyc2hpcCBhcHBsaWNhdGlvblxuICAgKi9cbiAgZGVjbGluZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnByb2Nlc3MoJ2RlY2xpbmUnKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTaXRlQXBwbGljYXRpb24odXNlcj0ke3RoaXMudXNlci5uYW1lfSwgc2l0ZT0ke3RoaXMuc2l0ZS51bml4TmFtZX0sIHRleHQ9JHt0aGlzLnRleHR9KWA7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIExvZ2luUmVxdWlyZWRFcnJvcixcbiAgVGFyZ2V0RXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbiAgV2lraWRvdFN0YXR1c0Vycm9yLFxufSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi9zaXRlJztcblxuLyoqXG4gKiBTaXRlIG1lbWJlciBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZU1lbWJlckRhdGEge1xuICBzaXRlOiBTaXRlO1xuICB1c2VyOiBBYnN0cmFjdFVzZXI7XG4gIGpvaW5lZEF0OiBEYXRlIHwgbnVsbDtcbn1cblxuLyoqXG4gKiBTaXRlIG1lbWJlclxuICovXG5leHBvcnQgY2xhc3MgU2l0ZU1lbWJlciB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuICBwdWJsaWMgcmVhZG9ubHkgdXNlcjogQWJzdHJhY3RVc2VyO1xuICBwdWJsaWMgcmVhZG9ubHkgam9pbmVkQXQ6IERhdGUgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFNpdGVNZW1iZXJEYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMudXNlciA9IGRhdGEudXNlcjtcbiAgICB0aGlzLmpvaW5lZEF0ID0gZGF0YS5qb2luZWRBdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBtZW1iZXIgaW5mb3JtYXRpb24gZnJvbSBIVE1MXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBwYXJzZShzaXRlOiBTaXRlLCBodG1sOiBzdHJpbmcpOiBTaXRlTWVtYmVyW10ge1xuICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgY29uc3QgbWVtYmVyczogU2l0ZU1lbWJlcltdID0gW107XG5cbiAgICAkKCd0YWJsZSB0cicpLmVhY2goKF9pLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IHRkcyA9ICQocm93KS5maW5kKCd0ZCcpO1xuICAgICAgY29uc3QgdXNlckVsZW0gPSAkKHRkc1swXSkuZmluZCgnLnByaW50dXNlcicpO1xuXG4gICAgICBpZiAodXNlckVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdXNlciA9IHBhcnNlVXNlcihzaXRlLmNsaWVudCwgdXNlckVsZW0pO1xuXG4gICAgICAvLyBTZWNvbmQgdGQgY29udGFpbnMgam9pbiBkYXRlIGlmIGV4aXN0c1xuICAgICAgbGV0IGpvaW5lZEF0OiBEYXRlIHwgbnVsbCA9IG51bGw7XG4gICAgICBpZiAodGRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIGNvbnN0IG9kYXRlRWxlbSA9ICQodGRzWzFdKS5maW5kKCcub2RhdGUnKTtcbiAgICAgICAgaWYgKG9kYXRlRWxlbS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgam9pbmVkQXQgPSBwYXJzZU9kYXRlKG9kYXRlRWxlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWVtYmVycy5wdXNoKG5ldyBTaXRlTWVtYmVyKHsgc2l0ZSwgdXNlciwgam9pbmVkQXQgfSkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG1lbWJlcnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNpdGUgbWVtYmVyIGxpc3RcbiAgICogQHBhcmFtIHNpdGUgLSBUYXJnZXQgc2l0ZVxuICAgKiBAcGFyYW0gZ3JvdXAgLSBHcm91cCAoXCJhZG1pbnNcIiwgXCJtb2RlcmF0b3JzXCIsIG9yIGVtcHR5IHN0cmluZyBmb3IgYWxsIG1lbWJlcnMpXG4gICAqL1xuICBzdGF0aWMgZ2V0TWVtYmVycyhcbiAgICBzaXRlOiBTaXRlLFxuICAgIGdyb3VwOiAnYWRtaW5zJyB8ICdtb2RlcmF0b3JzJyB8ICcnID0gJydcbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGVNZW1iZXJbXT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lbWJlcnM6IFNpdGVNZW1iZXJbXSA9IFtdO1xuXG4gICAgICAgIC8vIEdldCBmaXJzdCBwYWdlXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnbWVtYmVyc2hpcC9NZW1iZXJzTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwYWdlOiAxLFxuICAgICAgICAgICAgZ3JvdXAsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKGZpcnN0UmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyBmaXJzdFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0UmVzcG9uc2UgPSBmaXJzdFJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFmaXJzdFJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0SHRtbCA9IFN0cmluZyhmaXJzdFJlc3BvbnNlLmJvZHkgPz8gJycpO1xuICAgICAgICBtZW1iZXJzLnB1c2goLi4uU2l0ZU1lbWJlci5wYXJzZShzaXRlLCBmaXJzdEh0bWwpKTtcblxuICAgICAgICAvLyBDaGVjayBwYWdlclxuICAgICAgICBjb25zdCAkZmlyc3QgPSBjaGVlcmlvLmxvYWQoZmlyc3RIdG1sKTtcbiAgICAgICAgY29uc3QgcGFnZXJMaW5rcyA9ICRmaXJzdCgnZGl2LnBhZ2VyIGEnKTtcbiAgICAgICAgaWYgKHBhZ2VyTGlua3MubGVuZ3RoIDwgMikge1xuICAgICAgICAgIHJldHVybiBtZW1iZXJzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFBhZ2VUZXh0ID0gJGZpcnN0KHBhZ2VyTGlua3NbcGFnZXJMaW5rcy5sZW5ndGggLSAyXSlcbiAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgLnRyaW0oKTtcbiAgICAgICAgY29uc3QgbGFzdFBhZ2UgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VUZXh0LCAxMCkgfHwgMTtcbiAgICAgICAgaWYgKGxhc3RQYWdlIDw9IDEpIHtcbiAgICAgICAgICByZXR1cm4gbWVtYmVycztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCByZW1haW5pbmcgcGFnZXNcbiAgICAgICAgY29uc3QgYm9kaWVzID0gW107XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSAyOyBwYWdlIDw9IGxhc3RQYWdlOyBwYWdlKyspIHtcbiAgICAgICAgICBib2RpZXMucHVzaCh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnbWVtYmVyc2hpcC9NZW1iZXJzTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgZ3JvdXAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVzdWx0cyA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChib2RpZXMpO1xuICAgICAgICBpZiAoYWRkaXRpb25hbFJlc3VsdHMuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGFkZGl0aW9uYWxSZXN1bHRzLmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCByZXNwb25zZSBvZiBhZGRpdGlvbmFsUmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICAgIG1lbWJlcnMucHVzaCguLi5TaXRlTWVtYmVyLnBhcnNlKHNpdGUsIGh0bWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtZW1iZXJzO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBtZW1iZXJzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBjaGFuZ2UgZ3JvdXBcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgcHJpdmF0ZSBjaGFuZ2VHcm91cChcbiAgICBldmVudDogJ3RvTW9kZXJhdG9ycycgfCAncmVtb3ZlTW9kZXJhdG9yJyB8ICd0b0FkbWlucycgfCAncmVtb3ZlQWRtaW4nXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ01hbmFnZVNpdGVNZW1iZXJzaGlwQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgdXNlcl9pZDogdGhpcy51c2VyLmlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzdWx0LmVycm9yO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFdpa2lkb3RTdGF0dXNFcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1c0NvZGUgPT09ICdub3RfYWxyZWFkeScpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldEVycm9yKGBVc2VyIGlzIG5vdCBtb2RlcmF0b3IvYWRtaW46ICR7dGhpcy51c2VyLm5hbWV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzQ29kZSA9PT0gJ2FscmVhZHlfYWRtaW4nIHx8IGVycm9yLnN0YXR1c0NvZGUgPT09ICdhbHJlYWR5X21vZGVyYXRvcicpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRhcmdldEVycm9yKFxuICAgICAgICAgICAgICAgIGBVc2VyIGlzIGFscmVhZHkgJHtlcnJvci5zdGF0dXNDb2RlLnJlcGxhY2UoJ2FscmVhZHlfJywgJycpfTogJHt0aGlzLnVzZXIubmFtZX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFRhcmdldEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gY2hhbmdlIG1lbWJlciBncm91cDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUHJvbW90ZSB0byBtb2RlcmF0b3JcbiAgICovXG4gIHRvTW9kZXJhdG9yKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3RvTW9kZXJhdG9ycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBtb2RlcmF0b3IgcHJpdmlsZWdlc1xuICAgKi9cbiAgcmVtb3ZlTW9kZXJhdG9yKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2hhbmdlR3JvdXAoJ3JlbW92ZU1vZGVyYXRvcicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb21vdGUgdG8gYWRtaW5cbiAgICovXG4gIHRvQWRtaW4oKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFuZ2VHcm91cCgndG9BZG1pbnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYWRtaW4gcHJpdmlsZWdlc1xuICAgKi9cbiAgcmVtb3ZlQWRtaW4oKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFuZ2VHcm91cCgncmVtb3ZlQWRtaW4nKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTaXRlTWVtYmVyKHVzZXI9JHt0aGlzLnVzZXIubmFtZX0sIHNpdGU9JHt0aGlzLnNpdGUudW5peE5hbWV9KWA7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlVXNlciB9IGZyb20gJy4uLy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB7IFBhZ2UsIFBhZ2VDb2xsZWN0aW9uLCBTZWFyY2hQYWdlc1F1ZXJ5IH0gZnJvbSAnLi4vLi4vcGFnZSc7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcblxuLyoqXG4gKiBTaW5nbGUgcGFnZSBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlKSB7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBieSBVTklYIG5hbWVcbiAgICogQHBhcmFtIHVuaXhOYW1lIC0gUGFnZSBVTklYIG5hbWUgKGUuZy4sICdzY3AtMTczJylcbiAgICogQHJldHVybnMgUGFnZSAobnVsbCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBnZXQodW5peE5hbWU6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFNlYXJjaFBhZ2VzUXVlcnkoeyBmdWxsbmFtZTogdW5peE5hbWUgfSk7XG4gICAgICAgIGNvbnN0IHVzZXJQYXJzZXIgPSBwYXJzZVVzZXIuYmluZChudWxsLCB0aGlzLnNpdGUuY2xpZW50KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5zZWFyY2hQYWdlcyh0aGlzLnNpdGUsIHVzZXJQYXJzZXIsIHF1ZXJ5KTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZS5sZW5ndGggPiAwID8gKHJlc3VsdC52YWx1ZVswXSA/PyBudWxsKSA6IG51bGw7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHBhZ2VcbiAgICogQHBhcmFtIGZ1bGxuYW1lIC0gUGFnZSBmdWxsbmFtZSAoZS5nLiwgJ3NjcC0xNzMnKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENyZWF0aW9uIG9wdGlvbnNcbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgY3JlYXRlKFxuICAgIGZ1bGxuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9uczoge1xuICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgICAgZm9yY2VFZGl0PzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uY3JlYXRlT3JFZGl0KHRoaXMuc2l0ZSwgZnVsbG5hbWUsIHtcbiAgICAgIHRpdGxlOiBvcHRpb25zLnRpdGxlLFxuICAgICAgc291cmNlOiBvcHRpb25zLnNvdXJjZSxcbiAgICAgIGNvbW1lbnQ6IG9wdGlvbnMuY29tbWVudCxcbiAgICAgIGZvcmNlRWRpdDogb3B0aW9ucy5mb3JjZUVkaXQsXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IHsgUGFnZSB9O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IENoZWVyaW8gfSBmcm9tICdjaGVlcmlvJztcbmltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgdHlwZSB7IEFueU5vZGUgfSBmcm9tICdkb21oYW5kbGVyJztcbmltcG9ydCBwTGltaXQgZnJvbSAncC1saW1pdCc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFJlcXVpcmVMb2dpbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIEZvcmJpZGRlbkVycm9yLFxuICBMb2dpblJlcXVpcmVkRXJyb3IsXG4gIE5vRWxlbWVudEVycm9yLFxuICBOb3RGb3VuZEV4Y2VwdGlvbixcbiAgVGFyZ2V0RXhpc3RzRXJyb3IsXG4gIFVuZXhwZWN0ZWRFcnJvcixcbn0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBTUNSZXF1ZXN0Qm9keSB9IGZyb20gJy4uLy4uL2Nvbm5lY3Rvcic7XG5pbXBvcnQgeyBmZXRjaFdpdGhSZXRyeSB9IGZyb20gJy4uLy4uL3V0aWwvaHR0cCc7XG5pbXBvcnQgeyBwYXJzZU9kYXRlLCBwYXJzZVVzZXIgfSBmcm9tICcuLi8uLi91dGlsL3BhcnNlcic7XG5pbXBvcnQgdHlwZSB7IFNpdGUgfSBmcm9tICcuLi9zaXRlJztcbmltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgeyBQYWdlRmlsZUNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2UtZmlsZSc7XG5pbXBvcnQgeyBQYWdlTWV0YUNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2UtbWV0YSc7XG5pbXBvcnQgeyBQYWdlUmV2aXNpb24sIFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24gfSBmcm9tICcuL3BhZ2UtcmV2aXNpb24nO1xuaW1wb3J0IHsgUGFnZVNvdXJjZSB9IGZyb20gJy4vcGFnZS1zb3VyY2UnO1xuaW1wb3J0IHsgUGFnZVZvdGUsIFBhZ2VWb3RlQ29sbGVjdGlvbiB9IGZyb20gJy4vcGFnZS12b3RlJztcbmltcG9ydCB7IERFRkFVTFRfTU9EVUxFX0JPRFksIERFRkFVTFRfUEVSX1BBR0UsIFNlYXJjaFBhZ2VzUXVlcnkgfSBmcm9tICcuL3NlYXJjaC1xdWVyeSc7XG5cbi8qKlxuICogU2NoZW1hIGZvciBMaXN0UGFnZXNNb2R1bGUgcGFyc2UgcmVzdWx0XG4gKiBVc2VzIFpvZCBmb3IgdHlwZS1zYWZlIHZhbGlkYXRpb24gb2YgcGFyc2UgcmVzdWx0c1xuICovXG5jb25zdCBwYWdlUGFyYW1zU2NoZW1hID0gei5vYmplY3Qoe1xuICBmdWxsbmFtZTogei5wcmVwcm9jZXNzKCh2KSA9PiB2ID8/ICcnLCB6LnN0cmluZygpKSxcbiAgbmFtZTogei5wcmVwcm9jZXNzKCh2KSA9PiB2ID8/ICcnLCB6LnN0cmluZygpKSxcbiAgY2F0ZWdvcnk6IHoucHJlcHJvY2VzcygodikgPT4gdiA/PyAnJywgei5zdHJpbmcoKSksXG4gIHRpdGxlOiB6LnByZXByb2Nlc3MoKHYpID0+IHYgPz8gJycsIHouc3RyaW5nKCkpLFxuICBjaGlsZHJlbl9jb3VudDogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgwKSxcbiAgY29tbWVudHNfY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHNpemU6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHJhdGluZzogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgwKSxcbiAgdm90ZXNfY291bnQ6IHouY29lcmNlLm51bWJlcigpLmRlZmF1bHQoMCksXG4gIHJhdGluZ19wZXJjZW50OiB6LmNvZXJjZS5udW1iZXIoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIHJldmlzaW9uc19jb3VudDogei5jb2VyY2UubnVtYmVyKCkuZGVmYXVsdCgwKSxcbiAgcGFyZW50X2Z1bGxuYW1lOiB6LnN0cmluZygpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgdGFnczogei5hcnJheSh6LnN0cmluZygpKS5kZWZhdWx0KFtdKSxcbiAgY3JlYXRlZF9ieTogei5jdXN0b208QWJzdHJhY3RVc2VyPigpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgY3JlYXRlZF9hdDogei5kYXRlKCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICB1cGRhdGVkX2J5OiB6LmN1c3RvbTxBYnN0cmFjdFVzZXI+KCkubnVsbGFibGUoKS5kZWZhdWx0KG51bGwpLFxuICB1cGRhdGVkX2F0OiB6LmRhdGUoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG4gIGNvbW1lbnRlZF9ieTogei5jdXN0b208QWJzdHJhY3RVc2VyPigpLm51bGxhYmxlKCkuZGVmYXVsdChudWxsKSxcbiAgY29tbWVudGVkX2F0OiB6LmRhdGUoKS5udWxsYWJsZSgpLmRlZmF1bHQobnVsbCksXG59KTtcblxuLyoqXG4gKiBQYWdlIGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdlRGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIGZ1bGxuYW1lOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgY2hpbGRyZW5Db3VudDogbnVtYmVyO1xuICBjb21tZW50c0NvdW50OiBudW1iZXI7XG4gIHNpemU6IG51bWJlcjtcbiAgcmF0aW5nOiBudW1iZXI7XG4gIHZvdGVzQ291bnQ6IG51bWJlcjtcbiAgcmF0aW5nUGVyY2VudDogbnVtYmVyIHwgbnVsbDtcbiAgcmV2aXNpb25zQ291bnQ6IG51bWJlcjtcbiAgcGFyZW50RnVsbG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHRhZ3M6IHN0cmluZ1tdO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIGNyZWF0ZWRBdDogRGF0ZTtcbiAgdXBkYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICB1cGRhdGVkQXQ6IERhdGU7XG4gIGNvbW1lbnRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBjb21tZW50ZWRBdDogRGF0ZSB8IG51bGw7XG59XG5cbi8qKlxuICogV2lraWRvdCBwYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlIHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG4gIHB1YmxpYyByZWFkb25seSBmdWxsbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY2F0ZWdvcnk6IHN0cmluZztcbiAgcHVibGljIHRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyBjaGlsZHJlbkNvdW50OiBudW1iZXI7XG4gIHB1YmxpYyBjb21tZW50c0NvdW50OiBudW1iZXI7XG4gIHB1YmxpYyBzaXplOiBudW1iZXI7XG4gIHB1YmxpYyByYXRpbmc6IG51bWJlcjtcbiAgcHVibGljIHZvdGVzQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIHJhdGluZ1BlcmNlbnQ6IG51bWJlciB8IG51bGw7XG4gIHB1YmxpYyByZXZpc2lvbnNDb3VudDogbnVtYmVyO1xuICBwdWJsaWMgcGFyZW50RnVsbG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIHB1YmxpYyB0YWdzOiBzdHJpbmdbXTtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRBdDogRGF0ZTtcbiAgcHVibGljIHVwZGF0ZWRCeTogQWJzdHJhY3RVc2VyIHwgbnVsbDtcbiAgcHVibGljIHVwZGF0ZWRBdDogRGF0ZTtcbiAgcHVibGljIGNvbW1lbnRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBudWxsO1xuICBwdWJsaWMgY29tbWVudGVkQXQ6IERhdGUgfCBudWxsO1xuXG4gIHByaXZhdGUgX2lkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc291cmNlOiBQYWdlU291cmNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3JldmlzaW9uczogUGFnZVJldmlzaW9uQ29sbGVjdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF92b3RlczogUGFnZVZvdGVDb2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG4gIF9maWxlczogUGFnZUZpbGVDb2xsZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZURhdGEpIHtcbiAgICB0aGlzLnNpdGUgPSBkYXRhLnNpdGU7XG4gICAgdGhpcy5mdWxsbmFtZSA9IGRhdGEuZnVsbG5hbWU7XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMuY2F0ZWdvcnkgPSBkYXRhLmNhdGVnb3J5O1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgIHRoaXMuY2hpbGRyZW5Db3VudCA9IGRhdGEuY2hpbGRyZW5Db3VudDtcbiAgICB0aGlzLmNvbW1lbnRzQ291bnQgPSBkYXRhLmNvbW1lbnRzQ291bnQ7XG4gICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICAgIHRoaXMucmF0aW5nID0gZGF0YS5yYXRpbmc7XG4gICAgdGhpcy52b3Rlc0NvdW50ID0gZGF0YS52b3Rlc0NvdW50O1xuICAgIHRoaXMucmF0aW5nUGVyY2VudCA9IGRhdGEucmF0aW5nUGVyY2VudDtcbiAgICB0aGlzLnJldmlzaW9uc0NvdW50ID0gZGF0YS5yZXZpc2lvbnNDb3VudDtcbiAgICB0aGlzLnBhcmVudEZ1bGxuYW1lID0gZGF0YS5wYXJlbnRGdWxsbmFtZTtcbiAgICB0aGlzLnRhZ3MgPSBkYXRhLnRhZ3M7XG4gICAgdGhpcy5jcmVhdGVkQnkgPSBkYXRhLmNyZWF0ZWRCeTtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IGRhdGEuY3JlYXRlZEF0O1xuICAgIHRoaXMudXBkYXRlZEJ5ID0gZGF0YS51cGRhdGVkQnk7XG4gICAgdGhpcy51cGRhdGVkQXQgPSBkYXRhLnVwZGF0ZWRBdDtcbiAgICB0aGlzLmNvbW1lbnRlZEJ5ID0gZGF0YS5jb21tZW50ZWRCeTtcbiAgICB0aGlzLmNvbW1lbnRlZEF0ID0gZGF0YS5jb21tZW50ZWRBdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBVUkxcbiAgICovXG4gIGdldFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnNpdGUuZ2V0QmFzZVVybCgpfS8ke3RoaXMuZnVsbG5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHBhZ2UgSUQgaGFzIGJlZW4gYWNxdWlyZWRcbiAgICovXG4gIGlzSWRBY3F1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faWQgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgSURcbiAgICovXG4gIGdldCBpZCgpOiBudW1iZXIgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBhZ2UgSURcbiAgICovXG4gIHNldCBpZCh2YWx1ZTogbnVtYmVyIHwgbnVsbCkge1xuICAgIHRoaXMuX2lkID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBjb2RlXG4gICAqL1xuICBnZXQgc291cmNlKCk6IFBhZ2VTb3VyY2UgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBzb3VyY2UgY29kZVxuICAgKi9cbiAgc2V0IHNvdXJjZSh2YWx1ZTogUGFnZVNvdXJjZSB8IG51bGwpIHtcbiAgICB0aGlzLl9zb3VyY2UgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmV2aXNpb24gaGlzdG9yeVxuICAgKi9cbiAgZ2V0IHJldmlzaW9ucygpOiBQYWdlUmV2aXNpb25Db2xsZWN0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3JldmlzaW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcmV2aXNpb24gaGlzdG9yeVxuICAgKi9cbiAgc2V0IHJldmlzaW9ucyh2YWx1ZTogUGFnZVJldmlzaW9uQ29sbGVjdGlvbiB8IG51bGwpIHtcbiAgICB0aGlzLl9yZXZpc2lvbnMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdm90ZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgZ2V0IHZvdGVzKCk6IFBhZ2VWb3RlQ29sbGVjdGlvbiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl92b3RlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdm90ZSBpbmZvcm1hdGlvblxuICAgKi9cbiAgc2V0IHZvdGVzKHZhbHVlOiBQYWdlVm90ZUNvbGxlY3Rpb24gfCBudWxsKSB7XG4gICAgdGhpcy5fdm90ZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGF0ZXN0IHJldmlzaW9uXG4gICAqL1xuICBnZXQgbGF0ZXN0UmV2aXNpb24oKTogUGFnZVJldmlzaW9uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX3JldmlzaW9ucyB8fCB0aGlzLl9yZXZpc2lvbnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLl9yZXZpc2lvbnMucmVkdWNlKChtYXgsIHJldikgPT4gKHJldi5yZXZObyA+IG1heC5yZXZObyA/IHJldiA6IG1heCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuc3VyZSBwYWdlIElEIGlzIGF2YWlsYWJsZSAoYXV0by1hY3F1aXJlIGlmIG5vdCB5ZXQgYWNxdWlyZWQpXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSBPcGVyYXRpb24gbmFtZSAoZm9yIGVycm9yIG1lc3NhZ2UpXG4gICAqIEB0aHJvd3MgSWYgSUQgYWNxdWlzaXRpb24gZmFpbHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlSWQob3BlcmF0aW9uOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGlmICh0aGlzLl9pZCA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VJZHModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoXG4gICAgICAgICAgYEZhaWxlZCB0byBhY3F1aXJlIHBhZ2UgSUQgZm9yICR7b3BlcmF0aW9ufTogJHtyZXN1bHQuZXJyb3IubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl9pZCA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcihgUGFnZSBJRCBhY3F1aXNpdGlvbiBmYWlsZWQgZm9yICR7b3BlcmF0aW9ufWApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIHBhZ2VcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgZGVzdHJveSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2RlbGV0aW9uJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ2RlbGV0ZVBhZ2UnLFxuICAgICAgICAgICAgcGFnZV9pZDogcGFnZUlkLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZGVsZXRlIHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB0YWdzXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIGNvbW1pdFRhZ3MoKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdzYXZpbmcgdGFncycpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGFnczogdGhpcy50YWdzLmpvaW4oJyAnKSxcbiAgICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50OiAnc2F2ZVRhZ3MnLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlSWQsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzYXZlIHRhZ3M6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHBhcmVudCBwYWdlXG4gICAqIEBwYXJhbSBwYXJlbnRGdWxsbmFtZSAtIFBhcmVudCBwYWdlIGZ1bGxuYW1lIChudWxsIHRvIHJlbW92ZSlcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgc2V0UGFyZW50KHBhcmVudEZ1bGxuYW1lOiBzdHJpbmcgfCBudWxsKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCdzZXR0aW5nIHBhcmVudCcpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWN0aW9uOiAnV2lraVBhZ2VBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdzZXRQYXJlbnRQYWdlJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwYWdlSWQ6IFN0cmluZyhwYWdlSWQpLFxuICAgICAgICAgICAgcGFyZW50TmFtZTogcGFyZW50RnVsbG5hbWUgPz8gJycsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcmVudEZ1bGxuYW1lID0gcGFyZW50RnVsbG5hbWU7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gc2V0IHBhcmVudDogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWb3RlIG9uIHBhZ2VcbiAgICogQHBhcmFtIHZhbHVlIC0gVm90ZSB2YWx1ZVxuICAgKiBAcmV0dXJucyBOZXcgcmF0aW5nXG4gICAqL1xuICBAUmVxdWlyZUxvZ2luXG4gIHZvdGUodmFsdWU6IG51bWJlcik6IFdpa2lkb3RSZXN1bHRBc3luYzxudW1iZXI+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwYWdlSWQgPSBhd2FpdCB0aGlzLmVuc3VyZUlkKCd2b3RpbmcnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1JhdGVBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdyYXRlUGFnZScsXG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlSWQsXG4gICAgICAgICAgICBwb2ludHM6IHZhbHVlLFxuICAgICAgICAgICAgZm9yY2U6ICd5ZXMnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdFbXB0eSByZXNwb25zZSBmcm9tIHZvdGUgcmVxdWVzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1JhdGluZyA9IE51bWJlci5wYXJzZUludChTdHJpbmcocmVzcG9uc2UucG9pbnRzID8/IHRoaXMucmF0aW5nKSwgMTApO1xuICAgICAgICB0aGlzLnJhdGluZyA9IG5ld1JhdGluZztcbiAgICAgICAgcmV0dXJuIG5ld1JhdGluZztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byB2b3RlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCB2b3RlXG4gICAqIEByZXR1cm5zIE5ldyByYXRpbmdcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgY2FuY2VsVm90ZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8bnVtYmVyPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnY2FuY2VsaW5nIHZvdGUnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFjdGlvbjogJ1JhdGVBY3Rpb24nLFxuICAgICAgICAgICAgZXZlbnQ6ICdjYW5jZWxWb3RlJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdFbXB0eScsXG4gICAgICAgICAgICBwYWdlSWQ6IHBhZ2VJZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSBjYW5jZWwgdm90ZSByZXF1ZXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3UmF0aW5nID0gTnVtYmVyLnBhcnNlSW50KFN0cmluZyhyZXNwb25zZS5wb2ludHMgPz8gdGhpcy5yYXRpbmcpLCAxMCk7XG4gICAgICAgIHRoaXMucmF0aW5nID0gbmV3UmF0aW5nO1xuICAgICAgICByZXR1cm4gbmV3UmF0aW5nO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGNhbmNlbCB2b3RlOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVkaXQgdGhlIHBhZ2VcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBFZGl0IG9wdGlvbnNcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgZWRpdChvcHRpb25zOiB7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgc291cmNlPzogc3RyaW5nO1xuICAgIGNvbW1lbnQ/OiBzdHJpbmc7XG4gICAgZm9yY2VFZGl0PzogYm9vbGVhbjtcbiAgfSk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnZWRpdGluZycpO1xuXG4gICAgICAgIC8vIEdldCBjdXJyZW50IHNvdXJjZSAoaWYgbm90IHNwZWNpZmllZClcbiAgICAgICAgbGV0IGN1cnJlbnRTb3VyY2UgPSBvcHRpb25zLnNvdXJjZTtcbiAgICAgICAgaWYgKGN1cnJlbnRTb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGV4aXN0aW5nU291cmNlID0gdGhpcy5fc291cmNlO1xuICAgICAgICAgIGlmIChleGlzdGluZ1NvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY3VycmVudFNvdXJjZSA9IGV4aXN0aW5nU291cmNlLndpa2lUZXh0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBY3F1aXJlIHNvdXJjZVxuICAgICAgICAgICAgY29uc3Qgc291cmNlUmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VTb3VyY2VzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgICB0aHJvdyBzb3VyY2VSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBZnRlciBhY3F1aXJlUGFnZVNvdXJjZXMsIHRoaXMuX3NvdXJjZSBpcyBzZXRcbiAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSB0aGlzLl9zb3VyY2U/Lndpa2lUZXh0ID8/ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmNyZWF0ZU9yRWRpdCh0aGlzLnNpdGUsIHRoaXMuZnVsbG5hbWUsIHtcbiAgICAgICAgICBwYWdlSWQsXG4gICAgICAgICAgdGl0bGU6IG9wdGlvbnMudGl0bGUgPz8gdGhpcy50aXRsZSxcbiAgICAgICAgICBzb3VyY2U6IGN1cnJlbnRTb3VyY2UsXG4gICAgICAgICAgY29tbWVudDogb3B0aW9ucy5jb21tZW50ID8/ICcnLFxuICAgICAgICAgIGZvcmNlRWRpdDogb3B0aW9ucy5mb3JjZUVkaXQgPz8gZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTG9naW5SZXF1aXJlZEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBlZGl0IHBhZ2U6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmFtZSB0aGUgcGFnZVxuICAgKiBAcGFyYW0gbmV3RnVsbG5hbWUgLSBOZXcgZnVsbG5hbWVcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgcmVuYW1lKG5ld0Z1bGxuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhZ2VJZCA9IGF3YWl0IHRoaXMuZW5zdXJlSWQoJ3JlbmFtaW5nJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3JlbmFtZVBhZ2UnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ0VtcHR5JyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2VJZCxcbiAgICAgICAgICAgIG5ld19uYW1lOiBuZXdGdWxsbmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVwZGF0ZSBwcm9wZXJ0aWVzICh1c2luZyBPYmplY3QuYXNzaWduIHNpbmNlIHJlYWRvbmx5KVxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHtcbiAgICAgICAgICBmdWxsbmFtZTogbmV3RnVsbG5hbWUsXG4gICAgICAgICAgY2F0ZWdvcnk6IG5ld0Z1bGxuYW1lLmluY2x1ZGVzKCc6JykgPyBuZXdGdWxsbmFtZS5zcGxpdCgnOicpWzBdIDogJ19kZWZhdWx0JyxcbiAgICAgICAgICBuYW1lOiBuZXdGdWxsbmFtZS5pbmNsdWRlcygnOicpID8gbmV3RnVsbG5hbWUuc3BsaXQoJzonKVsxXSA6IG5ld0Z1bGxuYW1lLFxuICAgICAgICB9KTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byByZW5hbWUgcGFnZTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byB0aGUgcGFnZVxuICAgKi9cbiAgZ2V0RmlsZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VGaWxlQ29sbGVjdGlvbj4ge1xuICAgIGlmICh0aGlzLl9maWxlcyAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFByb21pc2UucmVzb2x2ZSh0aGlzLl9maWxlcyksIChlKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKFN0cmluZyhlKSkpO1xuICAgIH1cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBuZXcgUGFnZUNvbGxlY3Rpb24odGhpcy5zaXRlLCBbdGhpc10pLmdldFBhZ2VGaWxlcygpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgLy8gX2ZpbGVzIHNob3VsZCBiZSBzZXQgYnkgZ2V0UGFnZUZpbGVzKClcbiAgICAgICAgaWYgKHRoaXMuX2ZpbGVzID09PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5fZmlsZXMgPSBuZXcgUGFnZUZpbGVDb2xsZWN0aW9uKHRoaXMsIFtdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZmlsZXM7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IGZpbGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZGlzY3Vzc2lvbiB0aHJlYWQgZm9yIHRoZSBwYWdlXG4gICAqL1xuICBnZXREaXNjdXNzaW9uKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxpbXBvcnQoJy4uL2ZvcnVtJykuRm9ydW1UaHJlYWQgfCBudWxsPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcGFnZUlkID0gYXdhaXQgdGhpcy5lbnN1cmVJZCgnZ2V0dGluZyBkaXNjdXNzaW9uJyk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmb3J1bS9Gb3J1bUNvbW1lbnRzTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwYWdlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIC8vIEV4dHJhY3QgdGhyZWFkIElEXG4gICAgICAgIGNvbnN0IG1hdGNoID0gaHRtbC5tYXRjaChcbiAgICAgICAgICAvV0lLSURPVFxcLm1vZHVsZXNcXC5Gb3J1bVZpZXdUaHJlYWRNb2R1bGVcXC52YXJzXFwudGhyZWFkSWRcXHMqPVxccyooXFxkKykvXG4gICAgICAgICk7XG4gICAgICAgIGlmICghbWF0Y2g/LlsxXSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGhyZWFkSWQgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcblxuICAgICAgICAvLyBHZXQgRm9ydW1UaHJlYWRcbiAgICAgICAgY29uc3QgeyBGb3J1bVRocmVhZCB9ID0gYXdhaXQgaW1wb3J0KCcuLi9mb3J1bScpO1xuICAgICAgICBjb25zdCB0aHJlYWRSZXN1bHQgPSBhd2FpdCBGb3J1bVRocmVhZC5nZXRGcm9tSWQodGhpcy5zaXRlLCB0aHJlYWRJZCk7XG4gICAgICAgIGlmICh0aHJlYWRSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHRocmVhZFJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhyZWFkUmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBkaXNjdXNzaW9uOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBtZXRhIHRhZ3MgZm9yIHRoZSBwYWdlXG4gICAqIEByZXR1cm5zIE1ldGEgdGFnIGNvbGxlY3Rpb25cbiAgICovXG4gIGdldE1ldGFzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlTWV0YUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUlkKCdnZXR0aW5nIG1ldGFzJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VNZXRhQ29sbGVjdGlvbi5hY3F1aXJlKHRoaXMpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgbWV0YXM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgbWV0YSB0YWdcbiAgICogQHBhcmFtIG5hbWUgLSBNZXRhIHRhZyBuYW1lXG4gICAqIEBwYXJhbSBjb250ZW50IC0gTWV0YSB0YWcgdmFsdWVcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgc2V0TWV0YShuYW1lOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVJZCgnc2V0dGluZyBtZXRhJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VNZXRhQ29sbGVjdGlvbi5zZXRNZXRhKHRoaXMsIG5hbWUsIGNvbnRlbnQpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBzZXQgbWV0YTogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBtZXRhIHRhZ1xuICAgKiBAcGFyYW0gbmFtZSAtIE1ldGEgdGFnIG5hbWVcbiAgICovXG4gIEBSZXF1aXJlTG9naW5cbiAgZGVsZXRlTWV0YShuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlSWQoJ2RlbGV0aW5nIG1ldGEnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZU1ldGFDb2xsZWN0aW9uLmRlbGV0ZU1ldGEodGhpcywgbmFtZSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBtZXRhOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwYWdlIHNvdXJjZSAoYXV0by1hY3F1aXJlIGlmIG5vdCB5ZXQgYWNxdWlyZWQpXG4gICAqIEByZXR1cm5zIFBhZ2Ugc291cmNlXG4gICAqL1xuICBnZXRTb3VyY2UoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VTb3VyY2U+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fc291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VJZHModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzb3VyY2VSZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVNvdXJjZXModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgIGlmIChzb3VyY2VSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgc291cmNlUmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc291cmNlID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCdDYW5ub3QgZmluZCBwYWdlIHNvdXJjZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vdEZvdW5kRXhjZXB0aW9uKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHNvdXJjZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJldmlzaW9uIGhpc3RvcnkgKGF1dG8tYWNxdWlyZSBpZiBub3QgeWV0IGFjcXVpcmVkKVxuICAgKiBAcmV0dXJucyBSZXZpc2lvbiBjb2xsZWN0aW9uXG4gICAqL1xuICBnZXRSZXZpc2lvbnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VSZXZpc2lvbkNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fcmV2aXNpb25zID09PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VJZHModGhpcy5zaXRlLCBbdGhpc10pO1xuICAgICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByZXZSZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVJldmlzaW9ucyh0aGlzLnNpdGUsIFt0aGlzXSk7XG4gICAgICAgICAgaWYgKHJldlJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyByZXZSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9yZXZpc2lvbnMgPT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oJ0Nhbm5vdCBmaW5kIHBhZ2UgcmV2aXNpb25zJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3JldmlzaW9ucztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcmV2aXNpb25zOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdm90ZSBpbmZvcm1hdGlvbiAoYXV0by1hY3F1aXJlIGlmIG5vdCB5ZXQgYWNxdWlyZWQpXG4gICAqIEByZXR1cm5zIFZvdGUgY29sbGVjdGlvblxuICAgKi9cbiAgZ2V0Vm90ZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VWb3RlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl92b3RlcyA9PT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlSWRzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgdm90ZXNSZXN1bHQgPSBhd2FpdCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVZvdGVzKHRoaXMuc2l0ZSwgW3RoaXNdKTtcbiAgICAgICAgICBpZiAodm90ZXNSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgICAgdGhyb3cgdm90ZXNSZXN1bHQuZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl92b3RlcyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbignQ2Fubm90IGZpbmQgcGFnZSB2b3RlcycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl92b3RlcztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24pIHJldHVybiBlcnJvcjtcbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgdm90ZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2UoZnVsbG5hbWU9JHt0aGlzLmZ1bGxuYW1lfSwgdGl0bGU9JHt0aGlzLnRpdGxlfSlgO1xuICB9XG59XG5cbi8qKlxuICogUGFnZSBjb2xsZWN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2U+IHtcbiAgcHVibGljIHJlYWRvbmx5IHNpdGU6IFNpdGU7XG5cbiAgY29uc3RydWN0b3Ioc2l0ZTogU2l0ZSwgcGFnZXM/OiBQYWdlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKHBhZ2VzKSB7XG4gICAgICB0aGlzLnB1c2goLi4ucGFnZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IGZ1bGxuYW1lXG4gICAqIEBwYXJhbSBmdWxsbmFtZSAtIFBhZ2UgZnVsbG5hbWVcbiAgICogQHJldHVybnMgUGFnZSAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeUZ1bGxuYW1lKGZ1bGxuYW1lOiBzdHJpbmcpOiBQYWdlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKChwYWdlKSA9PiBwYWdlLmZ1bGxuYW1lID09PSBmdWxsbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBwYWdlIElEcyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlSWRzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUlkcyh0aGlzLnNpdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgcGFnZSBzb3VyY2VzIGluIGJ1bGtcbiAgICovXG4gIGdldFBhZ2VTb3VyY2VzKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZVNvdXJjZXModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3F1aXJlIHBhZ2UgcmV2aXNpb25zIGluIGJ1bGtcbiAgICovXG4gIGdldFBhZ2VSZXZpc2lvbnMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlUmV2aXNpb25zKHRoaXMuc2l0ZSwgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQWNxdWlyZSBwYWdlIHZvdGVzIGluIGJ1bGtcbiAgICovXG4gIGdldFBhZ2VWb3RlcygpOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gUGFnZUNvbGxlY3Rpb24uYWNxdWlyZVBhZ2VWb3Rlcyh0aGlzLnNpdGUsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjcXVpcmUgcGFnZSBmaWxlcyBpbiBidWxrXG4gICAqL1xuICBnZXRQYWdlRmlsZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIFBhZ2VDb2xsZWN0aW9uLmFjcXVpcmVQYWdlRmlsZXModGhpcy5zaXRlLCB0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwYWdlIGZpbGVzIGluIGJ1bGtcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZUZpbGVzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gcGFnZS5pZCAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdmaWxlcy9QYWdlRmlsZXNNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZV9pZDogcGFnZS5pZCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldFBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFnZSA9IHRhcmdldFBhZ2VzW2ldO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGlmICghcGFnZSB8fCAhcmVzcG9uc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGh0bWwpO1xuICAgICAgICAgIGNvbnN0IGZpbGVzID0gUGFnZUZpbGVDb2xsZWN0aW9uLl9wYXJzZUZyb21IdG1sKHBhZ2UsICQpO1xuICAgICAgICAgIHBhZ2UuX2ZpbGVzID0gbmV3IFBhZ2VGaWxlQ29sbGVjdGlvbihwYWdlLCBmaWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHBhZ2UgZmlsZXM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFjcXVpcmUgcGFnZSBJRHMgaW4gYnVsa1xuICAgKi9cbiAgc3RhdGljIGFjcXVpcmVQYWdlSWRzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gIXBhZ2UuaXNJZEFjcXVpcmVkKCkpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExpbWl0IGNvbmN1cnJlbnQgY29ubmVjdGlvbnMgKHVzaW5nIHNhbWUgc2VtYXBob3JlTGltaXQgYXMgQU1DQ2xpZW50KVxuICAgICAgICBjb25zdCBsaW1pdCA9IHBMaW1pdChzaXRlLmNsaWVudC5hbWNDbGllbnQuY29uZmlnLnNlbWFwaG9yZUxpbWl0KTtcbiAgICAgICAgY29uc3QgY29uZmlnID0gc2l0ZS5jbGllbnQuYW1jQ2xpZW50LmNvbmZpZztcblxuICAgICAgICAvLyBBY2Nlc3Mgd2l0aCBub3JlbmRlciwgbm9yZWRpcmVjdCAod2l0aCByZXRyeSlcbiAgICAgICAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGFyZ2V0UGFnZXMubWFwKChwYWdlKSA9PlxuICAgICAgICAgICAgbGltaXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB1cmwgPSBgJHtwYWdlLmdldFVybCgpfS9ub3JlbmRlci90cnVlL25vcmVkaXJlY3QvdHJ1ZWA7XG4gICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkodXJsLCBjb25maWcsIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBzaXRlLmNsaWVudC5hbWNDbGllbnQuaGVhZGVyLmdldEhlYWRlcnMoKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybiB7IHBhZ2UsIHJlc3BvbnNlIH07XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHsgcGFnZSwgcmVzcG9uc2UgfSBvZiByZXNwb25zZXMpIHtcbiAgICAgICAgICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGV4dC5tYXRjaCgvV0lLSVJFUVVFU1RcXC5pbmZvXFwucGFnZUlkXFxzKj1cXHMqKFxcZCspOy8pO1xuICAgICAgICAgIGlmICghbWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKGBDYW5ub3QgZmluZCBwYWdlIGlkOiAke3BhZ2UuZnVsbG5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhZ2UuaWQgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikgcmV0dXJuIGVycm9yO1xuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgcGFnZSBJRHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhY3F1aXJlIHBhZ2Ugc291cmNlcyBpbiBidWxrXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZVBhZ2VTb3VyY2VzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gcGFnZS5zb3VyY2UgPT09IG51bGwgJiYgcGFnZS5pZCAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKHRhcmdldFBhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBuZXcgUGFnZUNvbGxlY3Rpb24oc2l0ZSwgcGFnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFxuICAgICAgICAgIHRhcmdldFBhZ2VzLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICd2aWV3c291cmNlL1ZpZXdTb3VyY2VNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZV9pZDogcGFnZS5pZCxcbiAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldFBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFnZSA9IHRhcmdldFBhZ2VzW2ldO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGlmICghcGFnZSB8fCAhcmVzcG9uc2UpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJykucmVwbGFjZSgvJm5ic3A7L2csICcgJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcbiAgICAgICAgICBjb25zdCBzb3VyY2VFbGVtZW50ID0gJCgnZGl2LnBhZ2Utc291cmNlJyk7XG4gICAgICAgICAgaWYgKHNvdXJjZUVsZW1lbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoYENhbm5vdCBmaW5kIHNvdXJjZSBlbGVtZW50IGZvciBwYWdlOiAke3BhZ2UuZnVsbG5hbWV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHdpa2lUZXh0ID0gc291cmNlRWxlbWVudC50ZXh0KCkudHJpbSgpLnJlcGxhY2UoL15cXHQvLCAnJyk7XG4gICAgICAgICAgcGFnZS5zb3VyY2UgPSBuZXcgUGFnZVNvdXJjZSh7IHBhZ2UsIHdpa2lUZXh0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSByZXR1cm4gZXJyb3I7XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIHNvdXJjZXM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhY3F1aXJlIHBhZ2UgcmV2aXNpb25zIGluIGJ1bGtcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZVJldmlzaW9ucyhzaXRlOiBTaXRlLCBwYWdlczogUGFnZVtdKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VDb2xsZWN0aW9uPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGFnZXMgPSBwYWdlcy5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UucmV2aXNpb25zID09PSBudWxsICYmIHBhZ2UuaWQgIT09IG51bGwpO1xuXG4gICAgICAgIGlmICh0YXJnZXRQYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChcbiAgICAgICAgICB0YXJnZXRQYWdlcy5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlUmV2aXNpb25MaXN0TW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgICBvcHRpb25zOiB7IGFsbDogdHJ1ZSB9LFxuICAgICAgICAgICAgcGVycGFnZTogMTAwMDAwMDAwLFxuICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlIHJldmlzaW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldFBhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFnZSA9IHRhcmdldFBhZ2VzW2ldO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlW2ldO1xuICAgICAgICAgIGlmICghcGFnZSB8fCAhcmVzcG9uc2UpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgY29uc3QgYm9keSA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgICBjb25zdCAkID0gY2hlZXJpby5sb2FkKGJvZHkpO1xuICAgICAgICAgIGNvbnN0IHJldmlzaW9uczogUGFnZVJldmlzaW9uW10gPSBbXTtcblxuICAgICAgICAgICQoJ3RhYmxlLnBhZ2UtaGlzdG9yeSB0cltpZF49XCJyZXZpc2lvbi1yb3ctXCJdJykuZWFjaCgoX2osIHJldkVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0ICRyZXYgPSAkKHJldkVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgcmV2SWRBdHRyID0gJHJldi5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgaWYgKCFyZXZJZEF0dHIpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3QgcmV2SWQgPSBOdW1iZXIucGFyc2VJbnQocmV2SWRBdHRyLnJlcGxhY2UoJ3JldmlzaW9uLXJvdy0nLCAnJyksIDEwKTtcbiAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocmV2SWQpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0ICR0ZHMgPSAkcmV2LmZpbmQoJ3RkJyk7XG4gICAgICAgICAgICBpZiAoJHRkcy5sZW5ndGggPCA3KSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHJldk5vVGV4dCA9ICR0ZHMuZXEoMCkudGV4dCgpLnRyaW0oKS5yZXBsYWNlKC9cXC4kLywgJycpO1xuICAgICAgICAgICAgY29uc3QgcmV2Tm8gPSBOdW1iZXIucGFyc2VJbnQocmV2Tm9UZXh0LCAxMCk7XG4gICAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHJldk5vKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBjb25zdCAkY3JlYXRlZEJ5RWxlbSA9ICR0ZHMuZXEoNCkuZmluZCgnc3Bhbi5wcmludHVzZXInKTtcbiAgICAgICAgICAgIGlmICgkY3JlYXRlZEJ5RWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRCeSA9IHBhcnNlVXNlcihzaXRlLmNsaWVudCwgJGNyZWF0ZWRCeUVsZW0gYXMgQ2hlZXJpbzxBbnlOb2RlPik7XG5cbiAgICAgICAgICAgIGNvbnN0ICRjcmVhdGVkQXRFbGVtID0gJHRkcy5lcSg1KS5maW5kKCdzcGFuLm9kYXRlJyk7XG4gICAgICAgICAgICBpZiAoJGNyZWF0ZWRBdEVsZW0ubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSBwYXJzZU9kYXRlKCRjcmVhdGVkQXRFbGVtIGFzIENoZWVyaW88QW55Tm9kZT4pID8/IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSAkdGRzLmVxKDYpLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICAgIHJldmlzaW9ucy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgUGFnZVJldmlzaW9uKHtcbiAgICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICAgIGlkOiByZXZJZCxcbiAgICAgICAgICAgICAgICByZXZObyxcbiAgICAgICAgICAgICAgICBjcmVhdGVkQnksXG4gICAgICAgICAgICAgICAgY3JlYXRlZEF0LFxuICAgICAgICAgICAgICAgIGNvbW1lbnQsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcGFnZS5yZXZpc2lvbnMgPSBuZXcgUGFnZVJldmlzaW9uQ29sbGVjdGlvbihwYWdlLCByZXZpc2lvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIHJldmlzaW9uczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gYWNxdWlyZSBwYWdlIHZvdGVzIGluIGJ1bGtcbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlUGFnZVZvdGVzKHNpdGU6IFNpdGUsIHBhZ2VzOiBQYWdlW10pOiBXaWtpZG90UmVzdWx0QXN5bmM8UGFnZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRQYWdlcyA9IHBhZ2VzLmZpbHRlcigocGFnZSkgPT4gcGFnZS52b3RlcyA9PT0gbnVsbCAmJiBwYWdlLmlkICE9PSBudWxsKTtcblxuICAgICAgICBpZiAodGFyZ2V0UGFnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoXG4gICAgICAgICAgdGFyZ2V0UGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ3BhZ2VyYXRlL1dob1JhdGVkUGFnZU1vZHVsZScsXG4gICAgICAgICAgICBwYWdlSWQ6IHBhZ2UuaWQsXG4gICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2Ugdm90ZXNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXJnZXRQYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhZ2UgPSB0YXJnZXRQYWdlc1tpXTtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVtpXTtcbiAgICAgICAgICBpZiAoIXBhZ2UgfHwgIXJlc3BvbnNlKSBjb250aW51ZTtcblxuICAgICAgICAgIGNvbnN0IGJvZHkgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChib2R5KTtcblxuICAgICAgICAgIGNvbnN0ICR1c2VyRWxlbXMgPSAkKCdzcGFuLnByaW50dXNlcicpO1xuICAgICAgICAgIGNvbnN0ICR2YWx1ZUVsZW1zID0gJChcInNwYW5bc3R5bGVePSdjb2xvciddXCIpO1xuXG4gICAgICAgICAgaWYgKCR1c2VyRWxlbXMubGVuZ3RoICE9PSAkdmFsdWVFbGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ1VzZXIgYW5kIHZhbHVlIGNvdW50IG1pc21hdGNoIGluIHZvdGVzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgdm90ZXM6IFBhZ2VWb3RlW10gPSBbXTtcbiAgICAgICAgICAkdXNlckVsZW1zLmVhY2goKGosIHVzZXJFbGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCAkdXNlciA9ICQodXNlckVsZW0pO1xuICAgICAgICAgICAgY29uc3QgJHZhbHVlID0gJHZhbHVlRWxlbXMuZXEoaik7XG5cbiAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBwYXJzZVVzZXIoc2l0ZS5jbGllbnQsICR1c2VyIGFzIENoZWVyaW88QW55Tm9kZT4pO1xuICAgICAgICAgICAgY29uc3QgdmFsdWVUZXh0ID0gJHZhbHVlLnRleHQoKS50cmltKCk7XG5cbiAgICAgICAgICAgIGxldCB2YWx1ZTogbnVtYmVyO1xuICAgICAgICAgICAgaWYgKHZhbHVlVGV4dCA9PT0gJysnKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gMTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVUZXh0ID09PSAnLScpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSAtMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlVGV4dCwgMTApIHx8IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZvdGVzLnB1c2gobmV3IFBhZ2VWb3RlKHsgcGFnZSwgdXNlciwgdmFsdWUgfSkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcGFnZS52b3RlcyA9IG5ldyBQYWdlVm90ZUNvbGxlY3Rpb24ocGFnZSwgdm90ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIHZvdGVzOiAke1N0cmluZyhlcnJvcil9YClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIExpc3RQYWdlc01vZHVsZSByZXNwb25zZVxuICAgKi9cbiAgc3RhdGljIHBhcnNlKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgaHRtbEJvZHk6IGNoZWVyaW8uQ2hlZXJpb0FQSSxcbiAgICBfcGFyc2VVc2VyOiAoZWxlbWVudDogY2hlZXJpby5DaGVlcmlvPEFueU5vZGU+KSA9PiBBYnN0cmFjdFVzZXJcbiAgKTogUGFnZUNvbGxlY3Rpb24ge1xuICAgIGNvbnN0IHBhZ2VzOiBQYWdlW10gPSBbXTtcblxuICAgIGh0bWxCb2R5KCdkaXYucGFnZScpLmVhY2goKF9pLCBwYWdlRWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgJHBhZ2UgPSBodG1sQm9keShwYWdlRWxlbWVudCk7XG4gICAgICBjb25zdCBwYWdlUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgICAvLyBDaGVjayBmb3IgNS1zdGFyIHJhdGluZ1xuICAgICAgY29uc3QgaXM1U3RhclJhdGluZyA9ICRwYWdlLmZpbmQoJ3NwYW4ucmF0aW5nIHNwYW4ucGFnZS1yYXRlLWxpc3QtcGFnZXMtc3RhcnQnKS5sZW5ndGggPiAwO1xuXG4gICAgICAvLyBHZXQgZWFjaCB2YWx1ZVxuICAgICAgJHBhZ2UuZmluZCgnc3Bhbi5zZXQnKS5lYWNoKChfaiwgc2V0RWxlbWVudCkgPT4ge1xuICAgICAgICBjb25zdCAkc2V0ID0gaHRtbEJvZHkoc2V0RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGtleUVsZW1lbnQgPSAkc2V0LmZpbmQoJ3NwYW4ubmFtZScpO1xuICAgICAgICBpZiAoa2V5RWxlbWVudC5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBsZXQga2V5ID0ga2V5RWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICBjb25zdCB2YWx1ZUVsZW1lbnQgPSAkc2V0LmZpbmQoJ3NwYW4udmFsdWUnKTtcblxuICAgICAgICBsZXQgdmFsdWU6IHVua25vd24gPSBudWxsO1xuXG4gICAgICAgIGlmICh2YWx1ZUVsZW1lbnQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKFsnY3JlYXRlZF9hdCcsICd1cGRhdGVkX2F0JywgJ2NvbW1lbnRlZF9hdCddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICBjb25zdCBvZGF0ZUVsZW1lbnQgPSB2YWx1ZUVsZW1lbnQuZmluZCgnc3Bhbi5vZGF0ZScpO1xuICAgICAgICAgIGlmIChvZGF0ZUVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgdGltZXN0YW1wID0gb2RhdGVFbGVtZW50LmF0dHIoJ2NsYXNzJyk/Lm1hdGNoKC90aW1lXyhcXGQrKS8pPy5bMV07XG4gICAgICAgICAgICB2YWx1ZSA9IHRpbWVzdGFtcCA/IG5ldyBEYXRlKE51bWJlci5wYXJzZUludCh0aW1lc3RhbXAsIDEwKSAqIDEwMDApIDogbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgWydjcmVhdGVkX2J5X2xpbmtlZCcsICd1cGRhdGVkX2J5X2xpbmtlZCcsICdjb21tZW50ZWRfYnlfbGlua2VkJ10uaW5jbHVkZXMoa2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBwcmludHVzZXJFbGVtZW50ID0gdmFsdWVFbGVtZW50LmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgaWYgKHByaW50dXNlckVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmFsdWUgPSBfcGFyc2VVc2VyKHByaW50dXNlckVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChbJ3RhZ3MnLCAnX3RhZ3MnXS5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgdmFsdWUgPSB2YWx1ZUVsZW1lbnQudGV4dCgpLnNwbGl0KC9cXHMrLykuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICB9IGVsc2UgaWYgKFsncmF0aW5nX3ZvdGVzJywgJ2NvbW1lbnRzJywgJ3NpemUnLCAncmV2aXNpb25zJ10uaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgIHZhbHVlID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmcnKSB7XG4gICAgICAgICAgY29uc3QgcmF0aW5nVGV4dCA9IHZhbHVlRWxlbWVudC50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIHZhbHVlID0gaXM1U3RhclJhdGluZ1xuICAgICAgICAgICAgPyBOdW1iZXIucGFyc2VGbG9hdChyYXRpbmdUZXh0KSB8fCAwXG4gICAgICAgICAgICA6IE51bWJlci5wYXJzZUludChyYXRpbmdUZXh0LCAxMCkgfHwgMDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmdfcGVyY2VudCcpIHtcbiAgICAgICAgICBpZiAoaXM1U3RhclJhdGluZykge1xuICAgICAgICAgICAgdmFsdWUgPSAoTnVtYmVyLnBhcnNlRmxvYXQodmFsdWVFbGVtZW50LnRleHQoKS50cmltKCkpIHx8IDApIC8gMTAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVFbGVtZW50LnRleHQoKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBLZXkgY29udmVyc2lvblxuICAgICAgICBpZiAoa2V5LmluY2x1ZGVzKCdfbGlua2VkJykpIHtcbiAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgnX2xpbmtlZCcsICcnKTtcbiAgICAgICAgfSBlbHNlIGlmIChbJ2NvbW1lbnRzJywgJ2NoaWxkcmVuJywgJ3JldmlzaW9ucyddLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICBrZXkgPSBgJHtrZXl9X2NvdW50YDtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdyYXRpbmdfdm90ZXMnKSB7XG4gICAgICAgICAga2V5ID0gJ3ZvdGVzX2NvdW50JztcbiAgICAgICAgfVxuXG4gICAgICAgIHBhZ2VQYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIE1lcmdlIHRhZ3NcbiAgICAgIGNvbnN0IHRhZ3MgPSBBcnJheS5pc0FycmF5KHBhZ2VQYXJhbXMudGFncykgPyBwYWdlUGFyYW1zLnRhZ3MgOiBbXTtcbiAgICAgIGNvbnN0IGhpZGRlblRhZ3MgPSBBcnJheS5pc0FycmF5KHBhZ2VQYXJhbXMuX3RhZ3MpID8gcGFnZVBhcmFtcy5fdGFncyA6IFtdO1xuICAgICAgcGFnZVBhcmFtcy50YWdzID0gWy4uLnRhZ3MsIC4uLmhpZGRlblRhZ3NdO1xuXG4gICAgICAvLyBWYWxpZGF0ZSB3aXRoIFpvZCBzY2hlbWEgYW5kIGFwcGx5IGRlZmF1bHRzXG4gICAgICBjb25zdCBwYXJzZWQgPSBwYWdlUGFyYW1zU2NoZW1hLnBhcnNlKHBhZ2VQYXJhbXMpO1xuXG4gICAgICAvLyBDcmVhdGUgUGFnZSBvYmplY3RcbiAgICAgIHBhZ2VzLnB1c2goXG4gICAgICAgIG5ldyBQYWdlKHtcbiAgICAgICAgICBzaXRlLFxuICAgICAgICAgIGZ1bGxuYW1lOiBwYXJzZWQuZnVsbG5hbWUsXG4gICAgICAgICAgbmFtZTogcGFyc2VkLm5hbWUsXG4gICAgICAgICAgY2F0ZWdvcnk6IHBhcnNlZC5jYXRlZ29yeSxcbiAgICAgICAgICB0aXRsZTogcGFyc2VkLnRpdGxlLFxuICAgICAgICAgIGNoaWxkcmVuQ291bnQ6IHBhcnNlZC5jaGlsZHJlbl9jb3VudCxcbiAgICAgICAgICBjb21tZW50c0NvdW50OiBwYXJzZWQuY29tbWVudHNfY291bnQsXG4gICAgICAgICAgc2l6ZTogcGFyc2VkLnNpemUsXG4gICAgICAgICAgcmF0aW5nOiBwYXJzZWQucmF0aW5nLFxuICAgICAgICAgIHZvdGVzQ291bnQ6IHBhcnNlZC52b3Rlc19jb3VudCxcbiAgICAgICAgICByYXRpbmdQZXJjZW50OiBwYXJzZWQucmF0aW5nX3BlcmNlbnQsXG4gICAgICAgICAgcmV2aXNpb25zQ291bnQ6IHBhcnNlZC5yZXZpc2lvbnNfY291bnQsXG4gICAgICAgICAgcGFyZW50RnVsbG5hbWU6IHBhcnNlZC5wYXJlbnRfZnVsbG5hbWUsXG4gICAgICAgICAgdGFnczogcGFyc2VkLnRhZ3MsXG4gICAgICAgICAgY3JlYXRlZEJ5OiBwYXJzZWQuY3JlYXRlZF9ieSxcbiAgICAgICAgICBjcmVhdGVkQXQ6IHBhcnNlZC5jcmVhdGVkX2F0ID8/IG5ldyBEYXRlKCksXG4gICAgICAgICAgdXBkYXRlZEJ5OiBwYXJzZWQudXBkYXRlZF9ieSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IHBhcnNlZC51cGRhdGVkX2F0ID8/IG5ldyBEYXRlKCksXG4gICAgICAgICAgY29tbWVudGVkQnk6IHBhcnNlZC5jb21tZW50ZWRfYnksXG4gICAgICAgICAgY29tbWVudGVkQXQ6IHBhcnNlZC5jb21tZW50ZWRfYXQsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQYWdlQ29sbGVjdGlvbihzaXRlLCBwYWdlcyk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIHBhZ2VzXG4gICAqL1xuICBzdGF0aWMgc2VhcmNoUGFnZXMoXG4gICAgc2l0ZTogU2l0ZSxcbiAgICBwYXJzZVVzZXI6IChlbGVtZW50OiBjaGVlcmlvLkNoZWVyaW88QW55Tm9kZT4pID0+IEFic3RyYWN0VXNlcixcbiAgICBxdWVyeTogU2VhcmNoUGFnZXNRdWVyeSB8IG51bGwgPSBudWxsXG4gICk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHEgPSBxdWVyeSA/PyBuZXcgU2VhcmNoUGFnZXNRdWVyeSgpO1xuICAgICAgICBjb25zdCBxdWVyeURpY3QgPSBxLmFzRGljdCgpO1xuXG4gICAgICAgIC8vIEdlbmVyYXRlIG1vZHVsZSBib2R5XG4gICAgICAgIGNvbnN0IG1vZHVsZUJvZHkgPSBgW1tkaXYgY2xhc3M9XCJwYWdlXCJdXVxcbiR7REVGQVVMVF9NT0RVTEVfQk9EWS5tYXAoXG4gICAgICAgICAgKGtleSkgPT5cbiAgICAgICAgICAgIGBbW3NwYW4gY2xhc3M9XCJzZXQgJHtrZXl9XCJdXVtbc3BhbiBjbGFzcz1cIm5hbWVcIl1dICR7a2V5fSBbWy9zcGFuXV1bW3NwYW4gY2xhc3M9XCJ2YWx1ZVwiXV0gJSUke2tleX0lJSBbWy9zcGFuXV1bWy9zcGFuXV1gXG4gICAgICAgICkuam9pbignJyl9XFxuW1svZGl2XV1gO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIC4uLnF1ZXJ5RGljdCxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnbGlzdC9MaXN0UGFnZXNNb2R1bGUnLFxuICAgICAgICAgIG1vZHVsZV9ib2R5OiBtb2R1bGVCb2R5LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpdGUuYW1jUmVxdWVzdChbcmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdC5lcnJvci5tZXNzYWdlLmluY2x1ZGVzKCdub3Rfb2snKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkVycm9yKCdGYWlsZWQgdG8gZ2V0IHBhZ2VzLCB0YXJnZXQgc2l0ZSBtYXkgYmUgcHJpdmF0ZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdFJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBjb25zdCBib2R5ID0gU3RyaW5nKGZpcnN0UmVzcG9uc2U/LmJvZHkgPz8gJycpO1xuICAgICAgICBjb25zdCAkZmlyc3QgPSBjaGVlcmlvLmxvYWQoYm9keSk7XG5cbiAgICAgICAgbGV0IHRvdGFsID0gMTtcbiAgICAgICAgY29uc3QgaHRtbEJvZGllczogY2hlZXJpby5DaGVlcmlvQVBJW10gPSBbJGZpcnN0XTtcblxuICAgICAgICAvLyBDaGVjayBwYWdpbmF0aW9uXG4gICAgICAgIGNvbnN0IHBhZ2VyRWxlbWVudCA9ICRmaXJzdCgnZGl2LnBhZ2VyJyk7XG4gICAgICAgIGlmIChwYWdlckVsZW1lbnQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGxhc3RQYWdlckVsZW1lbnRzID0gJGZpcnN0KCdkaXYucGFnZXIgc3Bhbi50YXJnZXQnKTtcbiAgICAgICAgICBpZiAobGFzdFBhZ2VyRWxlbWVudHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZExhc3RQYWdlciA9ICRmaXJzdChsYXN0UGFnZXJFbGVtZW50c1tsYXN0UGFnZXJFbGVtZW50cy5sZW5ndGggLSAyXSk7XG4gICAgICAgICAgICBjb25zdCBsYXN0UGFnZXJMaW5rID0gc2Vjb25kTGFzdFBhZ2VyLmZpbmQoJ2EnKTtcbiAgICAgICAgICAgIGlmIChsYXN0UGFnZXJMaW5rLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdG90YWwgPSBOdW1iZXIucGFyc2VJbnQobGFzdFBhZ2VyTGluay50ZXh0KCkudHJpbSgpLCAxMCkgfHwgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgYWRkaXRpb25hbCBwYWdlc1xuICAgICAgICBpZiAodG90YWwgPiAxKSB7XG4gICAgICAgICAgY29uc3QgYWRkaXRpb25hbEJvZGllczogQU1DUmVxdWVzdEJvZHlbXSA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdG90YWw7IGkrKykge1xuICAgICAgICAgICAgYWRkaXRpb25hbEJvZGllcy5wdXNoKHtcbiAgICAgICAgICAgICAgLi4ucXVlcnlEaWN0LFxuICAgICAgICAgICAgICBtb2R1bGVOYW1lOiAnbGlzdC9MaXN0UGFnZXNNb2R1bGUnLFxuICAgICAgICAgICAgICBtb2R1bGVfYm9keTogbW9kdWxlQm9keSxcbiAgICAgICAgICAgICAgb2Zmc2V0OiBpICogKHEucGVyUGFnZSA/PyBERUZBVUxUX1BFUl9QQUdFKSxcbiAgICAgICAgICAgIH0gYXMgQU1DUmVxdWVzdEJvZHkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZXN1bHRzID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KGFkZGl0aW9uYWxCb2RpZXMpO1xuICAgICAgICAgIGlmIChhZGRpdGlvbmFsUmVzdWx0cy5pc0VycigpKSB7XG4gICAgICAgICAgICB0aHJvdyBhZGRpdGlvbmFsUmVzdWx0cy5lcnJvcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIGFkZGl0aW9uYWxSZXN1bHRzLnZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwQm9keSA9IFN0cmluZyhyZXNwb25zZT8uYm9keSA/PyAnJyk7XG4gICAgICAgICAgICBodG1sQm9kaWVzLnB1c2goY2hlZXJpby5sb2FkKHJlc3BCb2R5KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGFyc2VcbiAgICAgICAgY29uc3QgcGFnZXM6IFBhZ2VbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0ICRodG1sIG9mIGh0bWxCb2RpZXMpIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBQYWdlQ29sbGVjdGlvbi5wYXJzZShzaXRlLCAkaHRtbCwgcGFyc2VVc2VyKTtcbiAgICAgICAgICBwYWdlcy5wdXNoKC4uLnBhcnNlZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VDb2xsZWN0aW9uKHNpdGUsIHBhZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRm9yYmlkZGVuRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBOb3RGb3VuZEV4Y2VwdGlvbikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNlYXJjaCBwYWdlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIG9yIGVkaXQgYSBwYWdlXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlT3JFZGl0KFxuICAgIHNpdGU6IFNpdGUsXG4gICAgZnVsbG5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiB7XG4gICAgICBwYWdlSWQ/OiBudW1iZXIgfCBudWxsO1xuICAgICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgICBzb3VyY2U/OiBzdHJpbmc7XG4gICAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgICAgZm9yY2VFZGl0PzogYm9vbGVhbjtcbiAgICAgIHJhaXNlT25FeGlzdHM/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gc2l0ZS5jbGllbnQucmVxdWlyZUxvZ2luKCk7XG4gICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgUHJvbWlzZS5yZWplY3QobG9naW5SZXN1bHQuZXJyb3IpLFxuICAgICAgICAoKSA9PiBuZXcgTG9naW5SZXF1aXJlZEVycm9yKCdMb2dpbiByZXF1aXJlZCB0byBjcmVhdGUvZWRpdCBwYWdlJylcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHBhZ2VJZCA9IG51bGwsXG4gICAgICAgICAgdGl0bGUgPSAnJyxcbiAgICAgICAgICBzb3VyY2UgPSAnJyxcbiAgICAgICAgICBjb21tZW50ID0gJycsXG4gICAgICAgICAgZm9yY2VFZGl0ID0gZmFsc2UsXG4gICAgICAgICAgcmFpc2VPbkV4aXN0cyA9IGZhbHNlLFxuICAgICAgICB9ID0gb3B0aW9ucztcblxuICAgICAgICAvLyBBY3F1aXJlIHBhZ2UgbG9ja1xuICAgICAgICBjb25zdCBsb2NrUmVxdWVzdEJvZHk6IEFNQ1JlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIG1vZGU6ICdwYWdlJyxcbiAgICAgICAgICB3aWtpX3BhZ2U6IGZ1bGxuYW1lLFxuICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L1BhZ2VFZGl0TW9kdWxlJyxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGZvcmNlRWRpdCkge1xuICAgICAgICAgIGxvY2tSZXF1ZXN0Qm9keS5mb3JjZV9sb2NrID0gJ3llcyc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrUmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtsb2NrUmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKGxvY2tSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGxvY2tSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2NrUmVzcG9uc2UgPSBsb2NrUmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAobG9ja1Jlc3BvbnNlPy5sb2NrZWQgfHwgbG9ja1Jlc3BvbnNlPy5vdGhlcl9sb2Nrcykge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoYFBhZ2UgJHtmdWxsbmFtZX0gaXMgbG9ja2VkIG9yIG90aGVyIGxvY2tzIGV4aXN0YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0V4aXN0ID0gJ3BhZ2VfcmV2aXNpb25faWQnIGluIChsb2NrUmVzcG9uc2UgPz8ge30pO1xuXG4gICAgICAgIGlmIChyYWlzZU9uRXhpc3RzICYmIGlzRXhpc3QpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFyZ2V0RXhpc3RzRXJyb3IoYFBhZ2UgJHtmdWxsbmFtZX0gYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0V4aXN0ICYmIHBhZ2VJZCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ3BhZ2VfaWQgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiBlZGl0aW5nIGV4aXN0aW5nIHBhZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2tJZCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LmxvY2tfaWQgPz8gJycpO1xuICAgICAgICBjb25zdCBsb2NrU2VjcmV0ID0gU3RyaW5nKGxvY2tSZXNwb25zZT8ubG9ja19zZWNyZXQgPz8gJycpO1xuICAgICAgICBjb25zdCBwYWdlUmV2aXNpb25JZCA9IFN0cmluZyhsb2NrUmVzcG9uc2U/LnBhZ2VfcmV2aXNpb25faWQgPz8gJycpO1xuXG4gICAgICAgIC8vIFNhdmUgcGFnZVxuICAgICAgICBjb25zdCBlZGl0UmVxdWVzdEJvZHk6IEFNQ1JlcXVlc3RCb2R5ID0ge1xuICAgICAgICAgIGFjdGlvbjogJ1dpa2lQYWdlQWN0aW9uJyxcbiAgICAgICAgICBldmVudDogJ3NhdmVQYWdlJyxcbiAgICAgICAgICBtb2R1bGVOYW1lOiAnRW1wdHknLFxuICAgICAgICAgIG1vZGU6ICdwYWdlJyxcbiAgICAgICAgICBsb2NrX2lkOiBsb2NrSWQsXG4gICAgICAgICAgbG9ja19zZWNyZXQ6IGxvY2tTZWNyZXQsXG4gICAgICAgICAgcmV2aXNpb25faWQ6IHBhZ2VSZXZpc2lvbklkLFxuICAgICAgICAgIHdpa2lfcGFnZTogZnVsbG5hbWUsXG4gICAgICAgICAgcGFnZV9pZDogcGFnZUlkID8/ICcnLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICBjb21tZW50czogY29tbWVudCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBlZGl0UmVzdWx0ID0gYXdhaXQgc2l0ZS5hbWNSZXF1ZXN0KFtlZGl0UmVxdWVzdEJvZHldKTtcbiAgICAgICAgaWYgKGVkaXRSZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IGVkaXRSZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVGFyZ2V0RXhpc3RzRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUvZWRpdCBwYWdlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTZWFyY2hQYWdlc1F1ZXJ5IH07XG4iLAogICAgImltcG9ydCAqIGFzIGNoZWVyaW8gZnJvbSAnY2hlZXJpbyc7XG5pbXBvcnQgeyBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIFBhZ2UgZmlsZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUZpbGVEYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgbWltZVR5cGU6IHN0cmluZztcbiAgc2l6ZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhZ2UgYXR0YWNobWVudCBmaWxlXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlRmlsZSB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuICBwdWJsaWMgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgbWltZVR5cGU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlRmlsZURhdGEpIHtcbiAgICB0aGlzLnBhZ2UgPSBkYXRhLnBhZ2U7XG4gICAgdGhpcy5pZCA9IGRhdGEuaWQ7XG4gICAgdGhpcy5uYW1lID0gZGF0YS5uYW1lO1xuICAgIHRoaXMudXJsID0gZGF0YS51cmw7XG4gICAgdGhpcy5taW1lVHlwZSA9IGRhdGEubWltZVR5cGU7XG4gICAgdGhpcy5zaXplID0gZGF0YS5zaXplO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VGaWxlKGlkPSR7dGhpcy5pZH0sIG5hbWU9JHt0aGlzLm5hbWV9LCBzaXplPSR7dGhpcy5zaXplfSlgO1xuICB9XG59XG5cbi8qKlxuICogUGFnZSBmaWxlIGNvbGxlY3Rpb25cbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VGaWxlQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VGaWxlPiB7XG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIGNvbnN0cnVjdG9yKHBhZ2U6IFBhZ2UsIGZpbGVzPzogUGFnZUZpbGVbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5wYWdlID0gcGFnZTtcbiAgICBpZiAoZmlsZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5maWxlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgSURcbiAgICovXG4gIGZpbmRCeUlkKGlkOiBudW1iZXIpOiBQYWdlRmlsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgoZmlsZSkgPT4gZmlsZS5pZCA9PT0gaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYnkgbmFtZVxuICAgKi9cbiAgZmluZEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBQYWdlRmlsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgoZmlsZSkgPT4gZmlsZS5uYW1lID09PSBuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IHNpemUgc3RyaW5nIHRvIGJ5dGVzIChwdWJsaWMgZm9yIGJhdGNoIG9wZXJhdGlvbnMpXG4gICAqL1xuICBzdGF0aWMgcGFyc2VTaXplKHNpemVUZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IHRleHQgPSBzaXplVGV4dC50cmltKCk7XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ0J5dGVzJykpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKE51bWJlci5wYXJzZUZsb2F0KHRleHQucmVwbGFjZSgnQnl0ZXMnLCAnJykudHJpbSgpKSk7XG4gICAgfVxuICAgIGlmICh0ZXh0LmluY2x1ZGVzKCdrQicpKSB7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcihOdW1iZXIucGFyc2VGbG9hdCh0ZXh0LnJlcGxhY2UoJ2tCJywgJycpLnRyaW0oKSkgKiAxMDAwKTtcbiAgICB9XG4gICAgaWYgKHRleHQuaW5jbHVkZXMoJ01CJykpIHtcbiAgICAgIHJldHVybiBNYXRoLmZsb29yKE51bWJlci5wYXJzZUZsb2F0KHRleHQucmVwbGFjZSgnTUInLCAnJykudHJpbSgpKSAqIDEwMDAwMDApO1xuICAgIH1cbiAgICBpZiAodGV4dC5pbmNsdWRlcygnR0InKSkge1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTnVtYmVyLnBhcnNlRmxvYXQodGV4dC5yZXBsYWNlKCdHQicsICcnKS50cmltKCkpICogMTAwMDAwMDAwMCk7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIGZpbGUgaW5mb3JtYXRpb24gZnJvbSBIVE1MIHJlc3BvbnNlXG4gICAqIEludGVybmFsIGhlbHBlciBmb3IgYWNxdWlyZSgpIGFuZCBQYWdlQ29sbGVjdGlvbi5hY3F1aXJlUGFnZUZpbGVzKClcbiAgICovXG4gIHN0YXRpYyBfcGFyc2VGcm9tSHRtbChwYWdlOiBQYWdlLCAkOiBjaGVlcmlvLkNoZWVyaW9BUEkpOiBQYWdlRmlsZVtdIHtcbiAgICBjb25zdCBmaWxlc1RhYmxlID0gJCgndGFibGUucGFnZS1maWxlcycpO1xuICAgIGlmIChmaWxlc1RhYmxlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVzOiBQYWdlRmlsZVtdID0gW107XG5cbiAgICBmaWxlc1RhYmxlLmZpbmQoXCJ0Ym9keSB0cltpZF49J2ZpbGUtcm93LSddXCIpLmVhY2goKF9pLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IHJvd0lkID0gJChyb3cpLmF0dHIoJ2lkJyk7XG4gICAgICBpZiAoIXJvd0lkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGZpbGVJZCA9IE51bWJlci5wYXJzZUludChyb3dJZC5yZXBsYWNlKCdmaWxlLXJvdy0nLCAnJyksIDEwKTtcbiAgICAgIGNvbnN0IHRkcyA9ICQocm93KS5maW5kKCd0ZCcpO1xuICAgICAgaWYgKHRkcy5sZW5ndGggPCAzKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGxpbmtFbGVtID0gJCh0ZHNbMF0pLmZpbmQoJ2EnKTtcbiAgICAgIGlmIChsaW5rRWxlbS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgbmFtZSA9IGxpbmtFbGVtLnRleHQoKS50cmltKCk7XG4gICAgICBjb25zdCBocmVmID0gbGlua0VsZW0uYXR0cignaHJlZicpID8/ICcnO1xuICAgICAgY29uc3QgdXJsID0gYCR7cGFnZS5zaXRlLmdldEJhc2VVcmwoKX0ke2hyZWZ9YDtcblxuICAgICAgY29uc3QgbWltZUVsZW0gPSAkKHRkc1sxXSkuZmluZCgnc3BhbicpO1xuICAgICAgY29uc3QgbWltZVR5cGUgPSBtaW1lRWxlbS5hdHRyKCd0aXRsZScpID8/ICcnO1xuXG4gICAgICBjb25zdCBzaXplVGV4dCA9ICQodGRzWzJdKS50ZXh0KCkudHJpbSgpO1xuICAgICAgY29uc3Qgc2l6ZSA9IFBhZ2VGaWxlQ29sbGVjdGlvbi5wYXJzZVNpemUoc2l6ZVRleHQpO1xuXG4gICAgICBmaWxlcy5wdXNoKFxuICAgICAgICBuZXcgUGFnZUZpbGUoe1xuICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgaWQ6IGZpbGVJZCxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICBtaW1lVHlwZSxcbiAgICAgICAgICBzaXplLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmaWxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGlzdCBvZiBmaWxlcyBhdHRhY2hlZCB0byBwYWdlXG4gICAqL1xuICBzdGF0aWMgYWNxdWlyZShwYWdlOiBQYWdlKTogV2lraWRvdFJlc3VsdEFzeW5jPFBhZ2VGaWxlQ29sbGVjdGlvbj4ge1xuICAgIGlmIChwYWdlLmlkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAgIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUGFnZSBJRCBub3QgYWNxdWlyZWQnKSksXG4gICAgICAgICgpID0+IG5ldyBVbmV4cGVjdGVkRXJyb3IoJ1BhZ2UgSUQgbXVzdCBiZSBhY3F1aXJlZCBiZWZvcmUgZ2V0dGluZyBmaWxlcycpXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhZ2VJZCA9IHBhZ2UuaWQ7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2ZpbGVzL1BhZ2VGaWxlc01vZHVsZScsXG4gICAgICAgICAgICBwYWdlX2lkOiBwYWdlSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBQYWdlRmlsZUNvbGxlY3Rpb24uX3BhcnNlRnJvbUh0bWwocGFnZSwgJCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQYWdlRmlsZUNvbGxlY3Rpb24ocGFnZSwgZmlsZXMpO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGFjcXVpcmUgZmlsZXM6ICR7U3RyaW5nKGVycm9yKX1gKVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgTG9naW5SZXF1aXJlZEVycm9yLCBOb0VsZW1lbnRFcnJvciwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlUmVmIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIFBhZ2UgbWV0YSB0YWcgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VNZXRhRGF0YSB7XG4gIHBhZ2U6IFBhZ2VSZWY7XG4gIG5hbWU6IHN0cmluZztcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhZ2UgbWV0YSB0YWdcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VNZXRhIHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2VSZWY7XG4gIHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBjb250ZW50OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZU1ldGFEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZTtcbiAgICB0aGlzLmNvbnRlbnQgPSBkYXRhLmNvbnRlbnQ7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG1ldGEgdGFnIHZhbHVlXG4gICAqIEBwYXJhbSBjb250ZW50IC0gTmV3IHZhbHVlXG4gICAqL1xuICB1cGRhdGUoY29udGVudDogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPHZvaWQ+IHtcbiAgICByZXR1cm4gUGFnZU1ldGFDb2xsZWN0aW9uLnNldE1ldGEodGhpcy5wYWdlLCB0aGlzLm5hbWUsIGNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBtZXRhIHRhZ1xuICAgKi9cbiAgZGVsZXRlKCk6IFdpa2lkb3RSZXN1bHRBc3luYzx2b2lkPiB7XG4gICAgcmV0dXJuIFBhZ2VNZXRhQ29sbGVjdGlvbi5kZWxldGVNZXRhKHRoaXMucGFnZSwgdGhpcy5uYW1lKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlTWV0YShuYW1lPSR7dGhpcy5uYW1lfSwgY29udGVudD0ke3RoaXMuY29udGVudH0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgbWV0YSB0YWcgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZU1ldGFDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UGFnZU1ldGE+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2VSZWY7XG5cbiAgY29uc3RydWN0b3IocGFnZTogUGFnZVJlZiwgbWV0YXM/OiBQYWdlTWV0YVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIGlmIChtZXRhcykge1xuICAgICAgdGhpcy5wdXNoKC4uLm1ldGFzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSBuYW1lXG4gICAqIEBwYXJhbSBuYW1lIC0gTWV0YSB0YWcgbmFtZVxuICAgKiBAcmV0dXJucyBNZXRhIHRhZyAodW5kZWZpbmVkIGlmIG5vdCBmb3VuZClcbiAgICovXG4gIGZpbmRCeU5hbWUobmFtZTogc3RyaW5nKTogUGFnZU1ldGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpbmQoKG1ldGEpID0+IG1ldGEubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBhZ2UgbWV0YSB0YWdzXG4gICAqIEBwYXJhbSBwYWdlIC0gUGFnZSByZWZlcmVuY2VcbiAgICogQHJldHVybnMgTWV0YSB0YWcgY29sbGVjdGlvblxuICAgKi9cbiAgc3RhdGljIGFjcXVpcmUocGFnZTogUGFnZVJlZik6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlTWV0YUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYWdlLnNpdGUuYW1jUmVxdWVzdChbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2VkaXQvRWRpdE1ldGFNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlLmlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGlmIChyZXN1bHQuaXNFcnIoKSkge1xuICAgICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdFbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgbWV0YXM6IFBhZ2VNZXRhW10gPSBbXTtcblxuICAgICAgICAvLyBQYXJzZSBIVE1MLWVuY29kZWQgbWV0YSB0YWdzIHdpdGggcmVnZXhcbiAgICAgICAgLy8gRm9ybWF0OiAmbHQ7bWV0YSBuYW1lPVwieHh4XCIgY29udGVudD1cInl5eVwiLyZndDtcbiAgICAgICAgY29uc3QgbWV0YVJlZ2V4ID0gLyZsdDttZXRhIG5hbWU9XCIoW15cIl0rKVwiIGNvbnRlbnQ9XCIoW15cIl0qKVwiXFwvPyZndDsvZztcbiAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBodG1sLm1hdGNoQWxsKG1ldGFSZWdleCkpIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gbWF0Y2hbMV07XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IG1hdGNoWzJdO1xuICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBtZXRhcy5wdXNoKFxuICAgICAgICAgICAgICBuZXcgUGFnZU1ldGEoe1xuICAgICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50ID8/ICcnLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBhZ2VNZXRhQ29sbGVjdGlvbihwYWdlLCBtZXRhcyk7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gYWNxdWlyZSBwYWdlIG1ldGFzOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWV0YSB0YWdcbiAgICogQHBhcmFtIHBhZ2UgLSBQYWdlIHJlZmVyZW5jZVxuICAgKiBAcGFyYW0gbmFtZSAtIE1ldGEgdGFnIG5hbWVcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBNZXRhIHRhZyB2YWx1ZVxuICAgKi9cbiAgc3RhdGljIHNldE1ldGEocGFnZTogUGFnZVJlZiwgbmFtZTogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gcGFnZS5zaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIHNldCBtZXRhIHRhZycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ3NhdmVNZXRhVGFnJyxcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdlZGl0L0VkaXRNZXRhTW9kdWxlJyxcbiAgICAgICAgICAgIHBhZ2VJZDogcGFnZS5pZCxcbiAgICAgICAgICAgIG1ldGFOYW1lOiBuYW1lLFxuICAgICAgICAgICAgbWV0YUNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNldCBtZXRhIHRhZzogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIG1ldGEgdGFnXG4gICAqIEBwYXJhbSBwYWdlIC0gUGFnZSByZWZlcmVuY2VcbiAgICogQHBhcmFtIG5hbWUgLSBNZXRhIHRhZyBuYW1lXG4gICAqL1xuICBzdGF0aWMgZGVsZXRlTWV0YShwYWdlOiBQYWdlUmVmLCBuYW1lOiBzdHJpbmcpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGNvbnN0IGxvZ2luUmVzdWx0ID0gcGFnZS5zaXRlLmNsaWVudC5yZXF1aXJlTG9naW4oKTtcbiAgICBpZiAobG9naW5SZXN1bHQuaXNFcnIoKSkge1xuICAgICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgICBQcm9taXNlLnJlamVjdChsb2dpblJlc3VsdC5lcnJvciksXG4gICAgICAgICgpID0+IG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoJ0xvZ2luIHJlcXVpcmVkIHRvIGRlbGV0ZSBtZXRhIHRhZycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhY3Rpb246ICdXaWtpUGFnZUFjdGlvbicsXG4gICAgICAgICAgICBldmVudDogJ2RlbGV0ZU1ldGFUYWcnLFxuICAgICAgICAgICAgbW9kdWxlTmFtZTogJ2VkaXQvRWRpdE1ldGFNb2R1bGUnLFxuICAgICAgICAgICAgcGFnZUlkOiBwYWdlLmlkLFxuICAgICAgICAgICAgbWV0YU5hbWU6IG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIExvZ2luUmVxdWlyZWRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBtZXRhIHRhZzogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBVbmV4cGVjdGVkRXJyb3IgfSBmcm9tICcuLi8uLi9jb21tb24vZXJyb3JzJztcbmltcG9ydCB7IGZyb21Qcm9taXNlLCB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEFic3RyYWN0VXNlciB9IGZyb20gJy4uL3VzZXInO1xuaW1wb3J0IHR5cGUgeyBQYWdlIH0gZnJvbSAnLi9wYWdlJztcbmltcG9ydCB0eXBlIHsgUGFnZVNvdXJjZSB9IGZyb20gJy4vcGFnZS1zb3VyY2UnO1xuXG4vKipcbiAqIFBhZ2UgcmV2aXNpb24gZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VSZXZpc2lvbkRhdGEge1xuICBwYWdlOiBQYWdlO1xuICBpZDogbnVtYmVyO1xuICByZXZObzogbnVtYmVyO1xuICBjcmVhdGVkQnk6IEFic3RyYWN0VXNlcjtcbiAgY3JlYXRlZEF0OiBEYXRlO1xuICBjb21tZW50OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFnZSByZXZpc2lvbiAodmVyc2lvbiBpbiBlZGl0IGhpc3RvcnkpXG4gKi9cbmV4cG9ydCBjbGFzcyBQYWdlUmV2aXNpb24ge1xuICAvKiogUGFnZSB0aGlzIHJldmlzaW9uIGJlbG9uZ3MgdG8gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG5cbiAgLyoqIFJldmlzaW9uIElEICovXG4gIHB1YmxpYyByZWFkb25seSBpZDogbnVtYmVyO1xuXG4gIC8qKiBSZXZpc2lvbiBudW1iZXIgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJldk5vOiBudW1iZXI7XG5cbiAgLyoqIFJldmlzaW9uIGNyZWF0b3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNyZWF0ZWRCeTogQWJzdHJhY3RVc2VyO1xuXG4gIC8qKiBSZXZpc2lvbiBjcmVhdGlvbiBkYXRlICovXG4gIHB1YmxpYyByZWFkb25seSBjcmVhdGVkQXQ6IERhdGU7XG5cbiAgLyoqIEVkaXQgY29tbWVudCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tbWVudDogc3RyaW5nO1xuXG4gIC8qKiBTb3VyY2UgY29kZSAoaW50ZXJuYWwgY2FjaGUpICovXG4gIHByaXZhdGUgX3NvdXJjZTogUGFnZVNvdXJjZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBIVE1MIGRpc3BsYXkgKGludGVybmFsIGNhY2hlKSAqL1xuICBwcml2YXRlIF9odG1sOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBQYWdlUmV2aXNpb25EYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMucmV2Tm8gPSBkYXRhLnJldk5vO1xuICAgIHRoaXMuY3JlYXRlZEJ5ID0gZGF0YS5jcmVhdGVkQnk7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLmNvbW1lbnQgPSBkYXRhLmNvbW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBzb3VyY2UgY29kZSBoYXMgYmVlbiBhY3F1aXJlZFxuICAgKi9cbiAgaXNTb3VyY2VBY3F1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgSFRNTCBkaXNwbGF5IGhhcyBiZWVuIGFjcXVpcmVkXG4gICAqL1xuICBpc0h0bWxBY3F1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faHRtbCAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc291cmNlIGNvZGUgKGNhY2hlZClcbiAgICovXG4gIGdldCBzb3VyY2UoKTogUGFnZVNvdXJjZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHNvdXJjZSBjb2RlXG4gICAqL1xuICBzZXQgc291cmNlKHZhbHVlOiBQYWdlU291cmNlIHwgbnVsbCkge1xuICAgIHRoaXMuX3NvdXJjZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBIVE1MIGRpc3BsYXkgKGNhY2hlZClcbiAgICovXG4gIGdldCBodG1sKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9odG1sO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBIVE1MIGRpc3BsYXlcbiAgICovXG4gIHNldCBodG1sKHZhbHVlOiBzdHJpbmcgfCBudWxsKSB7XG4gICAgdGhpcy5faHRtbCA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZXZpc2lvbiBzb3VyY2UgKFJFVi0wMDEpXG4gICAqIEByZXR1cm5zIFNvdXJjZSBzdHJpbmdcbiAgICovXG4gIGdldFNvdXJjZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gUmV0dXJuIGNhY2hlIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAodGhpcy5fc291cmNlKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX3NvdXJjZS53aWtpVGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucGFnZS5zaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdoaXN0b3J5L1BhZ2VTb3VyY2VNb2R1bGUnLFxuICAgICAgICAgICAgcmV2aXNpb25faWQ6IHRoaXMuaWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdC5pc0VycigpKSB7XG4gICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm9FbGVtZW50RXJyb3IoJ0VtcHR5IHJlc3BvbnNlIGZyb20gUGFnZVNvdXJjZU1vZHVsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcblxuICAgICAgICAvLyBTb3VyY2UgY29kZSBpcyBpbnNpZGUgPGRpdiBjbGFzcz1cInBhZ2Utc291cmNlXCI+XG4gICAgICAgIGNvbnN0IHNvdXJjZUVsZW0gPSAkKCdkaXYucGFnZS1zb3VyY2UnKTtcbiAgICAgICAgaWYgKHNvdXJjZUVsZW0ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdTb3VyY2UgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNvdXJjZVRleHQgPSBzb3VyY2VFbGVtLnRleHQoKTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVRleHQ7XG4gICAgICB9KSgpLFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5vRWxlbWVudEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBGYWlsZWQgdG8gZ2V0IHJldmlzaW9uIHNvdXJjZTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJldmlzaW9uIEhUTUwgKFJFVi0wMDIpXG4gICAqIEByZXR1cm5zIEhUTUwgc3RyaW5nXG4gICAqL1xuICBnZXRIdG1sKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxzdHJpbmc+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBSZXR1cm4gY2FjaGUgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmICh0aGlzLl9odG1sKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2h0bWw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnBhZ2Uuc2l0ZS5hbWNSZXF1ZXN0KFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2R1bGVOYW1lOiAnaGlzdG9yeS9QYWdlVmVyc2lvbk1vZHVsZScsXG4gICAgICAgICAgICByZXZpc2lvbl9pZDogdGhpcy5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UgZnJvbSBQYWdlVmVyc2lvbk1vZHVsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IFN0cmluZyhyZXNwb25zZS5ib2R5ID8/ICcnKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcblxuICAgICAgICAvLyBIVE1MIGNvbnRlbnQgaXMgaW5zaWRlIDxkaXYgaWQ9XCJwYWdlLWNvbnRlbnRcIj5cbiAgICAgICAgY29uc3QgY29udGVudEVsZW0gPSAkKCcjcGFnZS1jb250ZW50Jyk7XG4gICAgICAgIGlmIChjb250ZW50RWxlbS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBSZXR1cm4gZW50aXJlIGJvZHkgaWYgcGFnZS1jb250ZW50IGRvZXNuJ3QgZXhpc3RcbiAgICAgICAgICB0aGlzLl9odG1sID0gaHRtbDtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRIdG1sID0gY29udGVudEVsZW0uaHRtbCgpID8/ICcnO1xuICAgICAgICB0aGlzLl9odG1sID0gY29udGVudEh0bWw7XG4gICAgICAgIHJldHVybiBjb250ZW50SHRtbDtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgcmV2aXNpb24gSFRNTDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiBgUGFnZVJldmlzaW9uKGlkPSR7dGhpcy5pZH0sIHJldk5vPSR7dGhpcy5yZXZOb30pYDtcbiAgfVxufVxuXG4vKipcbiAqIFBhZ2UgcmV2aXNpb24gY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZVJldmlzaW9uQ29sbGVjdGlvbiBleHRlbmRzIEFycmF5PFBhZ2VSZXZpc2lvbj4ge1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZSB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IocGFnZTogUGFnZSB8IG51bGwsIHJldmlzaW9ucz86IFBhZ2VSZXZpc2lvbltdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIGlmIChyZXZpc2lvbnMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5yZXZpc2lvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGJ5IElEXG4gICAqIEBwYXJhbSBpZCAtIFJldmlzaW9uIElEXG4gICAqIEByZXR1cm5zIFJldmlzaW9uICh1bmRlZmluZWQgaWYgbm90IGZvdW5kKVxuICAgKi9cbiAgZmluZEJ5SWQoaWQ6IG51bWJlcik6IFBhZ2VSZXZpc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZmluZCgocmV2aXNpb24pID0+IHJldmlzaW9uLmlkID09PSBpZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZXMgZm9yIGFsbCByZXZpc2lvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2Ygc291cmNlIHN0cmluZ3NcbiAgICovXG4gIGdldFNvdXJjZXMoKTogV2lraWRvdFJlc3VsdEFzeW5jPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlKFxuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgIHRoaXMubWFwKGFzeW5jIChyZXZpc2lvbikgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmV2aXNpb24uZ2V0U291cmNlKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgc291cmNlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IEhUTUwgZm9yIGFsbCByZXZpc2lvbnNcbiAgICogQHJldHVybnMgQXJyYXkgb2YgSFRNTCBzdHJpbmdzXG4gICAqL1xuICBnZXRIdG1scygpOiBXaWtpZG90UmVzdWx0QXN5bmM8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgdGhpcy5tYXAoYXN5bmMgKHJldmlzaW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXZpc2lvbi5nZXRIdG1sKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBnZXQgSFRNTHM6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgUGFnZSB9IGZyb20gJy4vcGFnZSc7XG5cbi8qKlxuICogUGFnZSBzb3VyY2UgZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VTb3VyY2VEYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgd2lraVRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYWdlIHNvdXJjZSBjb2RlIChXaWtpZG90IHN5bnRheClcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VTb3VyY2Uge1xuICAvKiogUGFnZSB0aGlzIHNvdXJjZSBiZWxvbmdzIHRvICovXG4gIHB1YmxpYyByZWFkb25seSBwYWdlOiBQYWdlO1xuXG4gIC8qKiBTb3VyY2UgY29kZSAoV2lraWRvdCBzeW50YXgpICovXG4gIHB1YmxpYyByZWFkb25seSB3aWtpVGV4dDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFBhZ2VTb3VyY2VEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMud2lraVRleHQgPSBkYXRhLndpa2lUZXh0O1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFBhZ2VTb3VyY2UocGFnZT0ke3RoaXMucGFnZS5mdWxsbmFtZX0sIGxlbmd0aD0ke3RoaXMud2lraVRleHQubGVuZ3RofSlgO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5pbXBvcnQgdHlwZSB7IFBhZ2UgfSBmcm9tICcuL3BhZ2UnO1xuXG4vKipcbiAqIFBhZ2Ugdm90ZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVZvdGVEYXRhIHtcbiAgcGFnZTogUGFnZTtcbiAgdXNlcjogQWJzdHJhY3RVc2VyO1xuICB2YWx1ZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhZ2Ugdm90ZSAocmF0aW5nKVxuICovXG5leHBvcnQgY2xhc3MgUGFnZVZvdGUge1xuICAvKiogUGFnZSB0aGlzIHZvdGUgYmVsb25ncyB0byAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZTogUGFnZTtcblxuICAvKiogVXNlciB3aG8gdm90ZWQgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IEFic3RyYWN0VXNlcjtcblxuICAvKiogVm90ZSB2YWx1ZSAoKzEvLTEgb3IgbnVtZXJpYykgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZhbHVlOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoZGF0YTogUGFnZVZvdGVEYXRhKSB7XG4gICAgdGhpcy5wYWdlID0gZGF0YS5wYWdlO1xuICAgIHRoaXMudXNlciA9IGRhdGEudXNlcjtcbiAgICB0aGlzLnZhbHVlID0gZGF0YS52YWx1ZTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQYWdlVm90ZSh1c2VyPSR7dGhpcy51c2VyLm5hbWV9LCB2YWx1ZT0ke3RoaXMudmFsdWV9KWA7XG4gIH1cbn1cblxuLyoqXG4gKiBQYWdlIHZvdGUgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgUGFnZVZvdGVDb2xsZWN0aW9uIGV4dGVuZHMgQXJyYXk8UGFnZVZvdGU+IHtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2U6IFBhZ2U7XG5cbiAgY29uc3RydWN0b3IocGFnZTogUGFnZSwgdm90ZXM/OiBQYWdlVm90ZVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnBhZ2UgPSBwYWdlO1xuICAgIGlmICh2b3Rlcykge1xuICAgICAgdGhpcy5wdXNoKC4uLnZvdGVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBieSB1c2VyXG4gICAqIEBwYXJhbSB1c2VyIC0gVXNlciB0byBzZWFyY2ggZm9yXG4gICAqIEByZXR1cm5zIFZvdGUgKHVuZGVmaW5lZCBpZiBub3QgZm91bmQpXG4gICAqL1xuICBmaW5kQnlVc2VyKHVzZXI6IEFic3RyYWN0VXNlcik6IFBhZ2VWb3RlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5maW5kKCh2b3RlKSA9PiB2b3RlLnVzZXIuaWQgPT09IHVzZXIuaWQpO1xuICB9XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQWJzdHJhY3RVc2VyIH0gZnJvbSAnLi4vdXNlcic7XG5cbi8qKlxuICogUGFnZSBzZWFyY2ggcXVlcnkgcGFyYW1ldGVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMge1xuICAvKiogUGFnZSB0eXBlIChlLmcuLCAnbm9ybWFsJywgJ2FkbWluJykgKi9cbiAgcGFnZXR5cGU/OiBzdHJpbmc7XG4gIC8qKiBDYXRlZ29yeSBuYW1lICovXG4gIGNhdGVnb3J5Pzogc3RyaW5nO1xuICAvKiogVGFncyB0byBzZWFyY2ggKEFORCBjb25kaXRpb24pICovXG4gIHRhZ3M/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqIFBhcmVudCBwYWdlIG5hbWUgKi9cbiAgcGFyZW50Pzogc3RyaW5nO1xuICAvKiogTGlua2VkIHBhZ2UgbmFtZSAqL1xuICBsaW5rVG8/OiBzdHJpbmc7XG4gIC8qKiBDcmVhdGVkIGRhdGUgY29uZGl0aW9uICovXG4gIGNyZWF0ZWRBdD86IHN0cmluZztcbiAgLyoqIFVwZGF0ZWQgZGF0ZSBjb25kaXRpb24gKi9cbiAgdXBkYXRlZEF0Pzogc3RyaW5nO1xuICAvKiogQ3JlYXRvciAqL1xuICBjcmVhdGVkQnk/OiBBYnN0cmFjdFVzZXIgfCBzdHJpbmc7XG4gIC8qKiBSYXRpbmcgY29uZGl0aW9uICovXG4gIHJhdGluZz86IHN0cmluZztcbiAgLyoqIFZvdGUgY291bnQgY29uZGl0aW9uICovXG4gIHZvdGVzPzogc3RyaW5nO1xuICAvKiogUGFnZSBuYW1lIGNvbmRpdGlvbiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogRnVsbG5hbWUgKGV4YWN0IG1hdGNoKSAqL1xuICBmdWxsbmFtZT86IHN0cmluZztcbiAgLyoqIFJhbmdlIHNwZWNpZmljYXRpb24gKi9cbiAgcmFuZ2U/OiBzdHJpbmc7XG4gIC8qKiBTb3J0IG9yZGVyIChlLmcuLCAnY3JlYXRlZF9hdCBkZXNjJykgKi9cbiAgb3JkZXI/OiBzdHJpbmc7XG4gIC8qKiBTdGFydCBvZmZzZXQgKi9cbiAgb2Zmc2V0PzogbnVtYmVyO1xuICAvKiogUmVzdWx0IGxpbWl0ICovXG4gIGxpbWl0PzogbnVtYmVyO1xuICAvKiogSXRlbXMgcGVyIHBhZ2UgKi9cbiAgcGVyUGFnZT86IG51bWJlcjtcbiAgLyoqIFNlcGFyYXRlIGRpc3BsYXkgKi9cbiAgc2VwYXJhdGU/OiBzdHJpbmc7XG4gIC8qKiBXcmFwcGVyIGRpc3BsYXkgKi9cbiAgd3JhcHBlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBEZWZhdWx0IGl0ZW1zIHBlciBwYWdlXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1BFUl9QQUdFID0gMjUwO1xuXG4vKipcbiAqIERlZmF1bHQgbW9kdWxlIGJvZHkgZmllbGRzXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01PRFVMRV9CT0RZID0gW1xuICAnZnVsbG5hbWUnLFxuICAnY2F0ZWdvcnknLFxuICAnbmFtZScsXG4gICd0aXRsZScsXG4gICdjcmVhdGVkX2F0JyxcbiAgJ2NyZWF0ZWRfYnlfbGlua2VkJyxcbiAgJ3VwZGF0ZWRfYXQnLFxuICAndXBkYXRlZF9ieV9saW5rZWQnLFxuICAnY29tbWVudGVkX2F0JyxcbiAgJ2NvbW1lbnRlZF9ieV9saW5rZWQnLFxuICAncGFyZW50X2Z1bGxuYW1lJyxcbiAgJ2NvbW1lbnRzJyxcbiAgJ3NpemUnLFxuICAnY2hpbGRyZW4nLFxuICAncmF0aW5nX3ZvdGVzJyxcbiAgJ3JhdGluZycsXG4gICdyYXRpbmdfcGVyY2VudCcsXG4gICdyZXZpc2lvbnMnLFxuICAndGFncycsXG4gICdfdGFncycsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIFBhZ2Ugc2VhcmNoIHF1ZXJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hQYWdlc1F1ZXJ5IHtcbiAgLyoqIFBhZ2UgdHlwZSAqL1xuICBwYWdldHlwZTogc3RyaW5nO1xuICAvKiogQ2F0ZWdvcnkgKi9cbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgLyoqIFRhZ3MgKi9cbiAgdGFnczogc3RyaW5nIHwgc3RyaW5nW10gfCBudWxsO1xuICAvKiogUGFyZW50IHBhZ2UgKi9cbiAgcGFyZW50OiBzdHJpbmcgfCBudWxsO1xuICAvKiogTGluayB0YXJnZXQgKi9cbiAgbGlua1RvOiBzdHJpbmcgfCBudWxsO1xuICAvKiogQ3JlYXRlZCBkYXRlIGNvbmRpdGlvbiAqL1xuICBjcmVhdGVkQXQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBVcGRhdGVkIGRhdGUgY29uZGl0aW9uICovXG4gIHVwZGF0ZWRBdDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIENyZWF0b3IgKi9cbiAgY3JlYXRlZEJ5OiBBYnN0cmFjdFVzZXIgfCBzdHJpbmcgfCBudWxsO1xuICAvKiogUmF0aW5nIGNvbmRpdGlvbiAqL1xuICByYXRpbmc6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBWb3RlIGNvdW50IGNvbmRpdGlvbiAqL1xuICB2b3Rlczogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFBhZ2UgbmFtZSBjb25kaXRpb24gKi9cbiAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEZ1bGxuYW1lIGNvbmRpdGlvbiAqL1xuICBmdWxsbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFJhbmdlICovXG4gIHJhbmdlOiBzdHJpbmcgfCBudWxsO1xuICAvKiogU29ydCBvcmRlciAqL1xuICBvcmRlcjogc3RyaW5nO1xuICAvKiogT2Zmc2V0ICovXG4gIG9mZnNldDogbnVtYmVyO1xuICAvKiogUmVzdWx0IGxpbWl0ICovXG4gIGxpbWl0OiBudW1iZXIgfCBudWxsO1xuICAvKiogSXRlbXMgcGVyIHBhZ2UgKi9cbiAgcGVyUGFnZTogbnVtYmVyO1xuICAvKiogU2VwYXJhdGUgZGlzcGxheSAqL1xuICBzZXBhcmF0ZTogc3RyaW5nO1xuICAvKiogV3JhcHBlciBkaXNwbGF5ICovXG4gIHdyYXBwZXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwYXJhbXM6IFNlYXJjaFBhZ2VzUXVlcnlQYXJhbXMgPSB7fSkge1xuICAgIHRoaXMucGFnZXR5cGUgPSBwYXJhbXMucGFnZXR5cGUgPz8gJyonO1xuICAgIHRoaXMuY2F0ZWdvcnkgPSBwYXJhbXMuY2F0ZWdvcnkgPz8gJyonO1xuICAgIHRoaXMudGFncyA9IHBhcmFtcy50YWdzID8/IG51bGw7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJhbXMucGFyZW50ID8/IG51bGw7XG4gICAgdGhpcy5saW5rVG8gPSBwYXJhbXMubGlua1RvID8/IG51bGw7XG4gICAgdGhpcy5jcmVhdGVkQXQgPSBwYXJhbXMuY3JlYXRlZEF0ID8/IG51bGw7XG4gICAgdGhpcy51cGRhdGVkQXQgPSBwYXJhbXMudXBkYXRlZEF0ID8/IG51bGw7XG4gICAgdGhpcy5jcmVhdGVkQnkgPSBwYXJhbXMuY3JlYXRlZEJ5ID8/IG51bGw7XG4gICAgdGhpcy5yYXRpbmcgPSBwYXJhbXMucmF0aW5nID8/IG51bGw7XG4gICAgdGhpcy52b3RlcyA9IHBhcmFtcy52b3RlcyA/PyBudWxsO1xuICAgIHRoaXMubmFtZSA9IHBhcmFtcy5uYW1lID8/IG51bGw7XG4gICAgdGhpcy5mdWxsbmFtZSA9IHBhcmFtcy5mdWxsbmFtZSA/PyBudWxsO1xuICAgIHRoaXMucmFuZ2UgPSBwYXJhbXMucmFuZ2UgPz8gbnVsbDtcbiAgICB0aGlzLm9yZGVyID0gcGFyYW1zLm9yZGVyID8/ICdjcmVhdGVkX2F0IGRlc2MnO1xuICAgIHRoaXMub2Zmc2V0ID0gcGFyYW1zLm9mZnNldCA/PyAwO1xuICAgIHRoaXMubGltaXQgPSBwYXJhbXMubGltaXQgPz8gbnVsbDtcbiAgICB0aGlzLnBlclBhZ2UgPSBwYXJhbXMucGVyUGFnZSA/PyBERUZBVUxUX1BFUl9QQUdFO1xuICAgIHRoaXMuc2VwYXJhdGUgPSBwYXJhbXMuc2VwYXJhdGUgPz8gJ25vJztcbiAgICB0aGlzLndyYXBwZXIgPSBwYXJhbXMud3JhcHBlciA/PyAnbm8nO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdG8gZGljdGlvbmFyeSBmb3JtYXRcbiAgICovXG4gIGFzRGljdCgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgLy8gcGFnZXR5cGUgYW5kIGNhdGVnb3J5IG11c3QgYWx3YXlzIGJlIGluY2x1ZGVkXG4gICAgLy8gV2lraWRvdCBkZWZhdWx0czogcGFnZXR5cGU9XCJub3JtYWxcIiwgY2F0ZWdvcnk9XCIuXCIgKGN1cnJlbnQgY2F0ZWdvcnkpXG4gICAgLy8gVG8gZ2V0IGFsbCBwYWdlcywgd2UgbmVlZCB0byBleHBsaWNpdGx5IHNlbmQgXCIqXCJcbiAgICByZXN1bHQucGFnZXR5cGUgPSB0aGlzLnBhZ2V0eXBlO1xuICAgIHJlc3VsdC5jYXRlZ29yeSA9IHRoaXMuY2F0ZWdvcnk7XG4gICAgaWYgKHRoaXMudGFncyAhPT0gbnVsbCkge1xuICAgICAgcmVzdWx0LnRhZ3MgPSBBcnJheS5pc0FycmF5KHRoaXMudGFncykgPyB0aGlzLnRhZ3Muam9pbignICcpIDogdGhpcy50YWdzO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJlbnQgIT09IG51bGwpIHJlc3VsdC5wYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICBpZiAodGhpcy5saW5rVG8gIT09IG51bGwpIHJlc3VsdC5saW5rX3RvID0gdGhpcy5saW5rVG87XG4gICAgaWYgKHRoaXMuY3JlYXRlZEF0ICE9PSBudWxsKSByZXN1bHQuY3JlYXRlZF9hdCA9IHRoaXMuY3JlYXRlZEF0O1xuICAgIGlmICh0aGlzLnVwZGF0ZWRBdCAhPT0gbnVsbCkgcmVzdWx0LnVwZGF0ZWRfYXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgICBpZiAodGhpcy5jcmVhdGVkQnkgIT09IG51bGwpIHtcbiAgICAgIHJlc3VsdC5jcmVhdGVkX2J5ID0gdHlwZW9mIHRoaXMuY3JlYXRlZEJ5ID09PSAnc3RyaW5nJyA/IHRoaXMuY3JlYXRlZEJ5IDogdGhpcy5jcmVhdGVkQnkubmFtZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmF0aW5nICE9PSBudWxsKSByZXN1bHQucmF0aW5nID0gdGhpcy5yYXRpbmc7XG4gICAgaWYgKHRoaXMudm90ZXMgIT09IG51bGwpIHJlc3VsdC52b3RlcyA9IHRoaXMudm90ZXM7XG4gICAgaWYgKHRoaXMubmFtZSAhPT0gbnVsbCkgcmVzdWx0Lm5hbWUgPSB0aGlzLm5hbWU7XG4gICAgaWYgKHRoaXMuZnVsbG5hbWUgIT09IG51bGwpIHJlc3VsdC5mdWxsbmFtZSA9IHRoaXMuZnVsbG5hbWU7XG4gICAgaWYgKHRoaXMucmFuZ2UgIT09IG51bGwpIHJlc3VsdC5yYW5nZSA9IHRoaXMucmFuZ2U7XG5cbiAgICByZXN1bHQub3JkZXIgPSB0aGlzLm9yZGVyO1xuICAgIHJlc3VsdC5vZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICBpZiAodGhpcy5saW1pdCAhPT0gbnVsbCkgcmVzdWx0LmxpbWl0ID0gdGhpcy5saW1pdDtcbiAgICByZXN1bHQucGVyUGFnZSA9IHRoaXMucGVyUGFnZTtcbiAgICByZXN1bHQuc2VwYXJhdGUgPSB0aGlzLnNlcGFyYXRlO1xuICAgIHJlc3VsdC53cmFwcGVyID0gdGhpcy53cmFwcGVyO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuaW1wb3J0IHsgTm9FbGVtZW50RXJyb3IsIFVuZXhwZWN0ZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHsgZnJvbVByb21pc2UsIHR5cGUgV2lraWRvdFJlc3VsdEFzeW5jIH0gZnJvbSAnLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHBhcnNlT2RhdGUsIHBhcnNlVXNlciB9IGZyb20gJy4uLy4uL3V0aWwvcGFyc2VyJztcbmltcG9ydCB0eXBlIHsgU2l0ZSB9IGZyb20gJy4uL3NpdGUnO1xuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFVzZXIgfSBmcm9tICcuLi91c2VyJztcblxuLyoqXG4gKiBTaXRlIGNoYW5nZSBoaXN0b3J5IGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaXRlQ2hhbmdlRGF0YSB7XG4gIHNpdGU6IFNpdGU7XG4gIHBhZ2VGdWxsbmFtZTogc3RyaW5nO1xuICBwYWdlVGl0bGU6IHN0cmluZztcbiAgcmV2aXNpb25ObzogbnVtYmVyO1xuICBjaGFuZ2VkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIGNoYW5nZWRBdDogRGF0ZSB8IG51bGw7XG4gIGZsYWdzOiBzdHJpbmdbXTtcbiAgY29tbWVudDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNpdGUgY2hhbmdlIGhpc3RvcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGVDaGFuZ2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcbiAgcHVibGljIHJlYWRvbmx5IHBhZ2VGdWxsbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgcGFnZVRpdGxlOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSByZXZpc2lvbk5vOiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBjaGFuZ2VkQnk6IEFic3RyYWN0VXNlciB8IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBjaGFuZ2VkQXQ6IERhdGUgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgZmxhZ3M6IHN0cmluZ1tdO1xuICBwdWJsaWMgcmVhZG9ubHkgY29tbWVudDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGE6IFNpdGVDaGFuZ2VEYXRhKSB7XG4gICAgdGhpcy5zaXRlID0gZGF0YS5zaXRlO1xuICAgIHRoaXMucGFnZUZ1bGxuYW1lID0gZGF0YS5wYWdlRnVsbG5hbWU7XG4gICAgdGhpcy5wYWdlVGl0bGUgPSBkYXRhLnBhZ2VUaXRsZTtcbiAgICB0aGlzLnJldmlzaW9uTm8gPSBkYXRhLnJldmlzaW9uTm87XG4gICAgdGhpcy5jaGFuZ2VkQnkgPSBkYXRhLmNoYW5nZWRCeTtcbiAgICB0aGlzLmNoYW5nZWRBdCA9IGRhdGEuY2hhbmdlZEF0O1xuICAgIHRoaXMuZmxhZ3MgPSBkYXRhLmZsYWdzO1xuICAgIHRoaXMuY29tbWVudCA9IGRhdGEuY29tbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBVUkxcbiAgICovXG4gIGdldFBhZ2VVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5zaXRlLmdldEJhc2VVcmwoKX0vJHt0aGlzLnBhZ2VGdWxsbmFtZX1gO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFNpdGVDaGFuZ2UocGFnZT0ke3RoaXMucGFnZUZ1bGxuYW1lfSwgcmV2PSR7dGhpcy5yZXZpc2lvbk5vfSwgYnk9JHt0aGlzLmNoYW5nZWRCeX0pYDtcbiAgfVxufVxuXG4vKipcbiAqIFNpdGUgY2hhbmdlIGhpc3RvcnkgY29sbGVjdGlvblxuICovXG5leHBvcnQgY2xhc3MgU2l0ZUNoYW5nZUNvbGxlY3Rpb24gZXh0ZW5kcyBBcnJheTxTaXRlQ2hhbmdlPiB7XG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlO1xuXG4gIGNvbnN0cnVjdG9yKHNpdGU6IFNpdGUsIGNoYW5nZXM/OiBTaXRlQ2hhbmdlW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2l0ZSA9IHNpdGU7XG4gICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgIHRoaXMucHVzaCguLi5jaGFuZ2VzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlY2VudCBjaGFuZ2UgaGlzdG9yeVxuICAgKiBAcGFyYW0gc2l0ZSAtIFNpdGUgaW5zdGFuY2VcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zXG4gICAqIEByZXR1cm5zIENoYW5nZSBoaXN0b3J5IGNvbGxlY3Rpb25cbiAgICovXG4gIHN0YXRpYyBhY3F1aXJlKFxuICAgIHNpdGU6IFNpdGUsXG4gICAgb3B0aW9ucz86IHsgcGVyUGFnZT86IG51bWJlcjsgcGFnZT86IG51bWJlcjsgbGltaXQ/OiBudW1iZXIgfVxuICApOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUNoYW5nZUNvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwZXJQYWdlID0gb3B0aW9ucz8ucGVyUGFnZSA/PyAyMDtcbiAgICBjb25zdCBwYWdlID0gb3B0aW9ucz8ucGFnZSA/PyAxO1xuICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucz8ubGltaXQ7XG5cbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzaXRlLmFtY1JlcXVlc3QoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZHVsZU5hbWU6ICdjaGFuZ2VzL1NpdGVDaGFuZ2VzTGlzdE1vZHVsZScsXG4gICAgICAgICAgICBwZXJwYWdlOiBwZXJQYWdlLFxuICAgICAgICAgICAgcGFnZTogcGFnZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgICAgIHRocm93IG5ldyBOb0VsZW1lbnRFcnJvcignRW1wdHkgcmVzcG9uc2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGh0bWwgPSBTdHJpbmcocmVzcG9uc2UuYm9keSA/PyAnJyk7XG4gICAgICAgIGNvbnN0ICQgPSBjaGVlcmlvLmxvYWQoaHRtbCk7XG4gICAgICAgIGNvbnN0IGNoYW5nZXM6IFNpdGVDaGFuZ2VbXSA9IFtdO1xuXG4gICAgICAgIC8vIFBhcnNlIHRhYmxlIHJvd3NcbiAgICAgICAgJCgndGFibGUud2lraS1jb250ZW50LXRhYmxlIHRyJykuZWFjaCgoX2ksIGVsZW0pID0+IHtcbiAgICAgICAgICBjb25zdCAkcm93ID0gJChlbGVtKTtcbiAgICAgICAgICBjb25zdCAkY2VsbHMgPSAkcm93LmZpbmQoJ3RkJyk7XG4gICAgICAgICAgaWYgKCRjZWxscy5sZW5ndGggPCA0KSByZXR1cm47XG5cbiAgICAgICAgICAvLyBQYWdlIGxpbmtcbiAgICAgICAgICBjb25zdCBwYWdlTGluayA9ICQoJGNlbGxzWzBdKS5maW5kKCdhJyk7XG4gICAgICAgICAgY29uc3QgaHJlZiA9IHBhZ2VMaW5rLmF0dHIoJ2hyZWYnKSA/PyAnJztcbiAgICAgICAgICBjb25zdCBwYWdlRnVsbG5hbWUgPSBocmVmLnJlcGxhY2UoL15cXC8vLCAnJykuc3BsaXQoJy8nKVswXSA/PyAnJztcbiAgICAgICAgICBjb25zdCBwYWdlVGl0bGUgPSBwYWdlTGluay50ZXh0KCkudHJpbSgpO1xuXG4gICAgICAgICAgLy8gUmV2aXNpb24gbnVtYmVyXG4gICAgICAgICAgY29uc3QgcmV2VGV4dCA9ICQoJGNlbGxzWzFdKS50ZXh0KCkudHJpbSgpO1xuICAgICAgICAgIGNvbnN0IHJldk1hdGNoID0gcmV2VGV4dC5tYXRjaCgvKFxcZCspLyk7XG4gICAgICAgICAgY29uc3QgcmV2aXNpb25ObyA9IHJldk1hdGNoPy5bMV0gPyBOdW1iZXIucGFyc2VJbnQocmV2TWF0Y2hbMV0sIDEwKSA6IDA7XG5cbiAgICAgICAgICAvLyBGbGFnc1xuICAgICAgICAgIGNvbnN0IGZsYWdzQ2VsbCA9ICQoJGNlbGxzWzJdKTtcbiAgICAgICAgICBjb25zdCBmbGFnczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICBmbGFnc0NlbGwuZmluZCgnc3BhbicpLmVhY2goKF9qLCBmbGFnRWxlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmxhZ0NsYXNzID0gJChmbGFnRWxlbSkuYXR0cignY2xhc3MnKSA/PyAnJztcbiAgICAgICAgICAgIGlmIChmbGFnQ2xhc3MuaW5jbHVkZXMoJ3NwYW50aXAnKSkge1xuICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9ICQoZmxhZ0VsZW0pLmF0dHIoJ3RpdGxlJykgPz8gJyc7XG4gICAgICAgICAgICAgIGlmICh0aXRsZSkgZmxhZ3MucHVzaCh0aXRsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBVc2VyIGFuZCB0aW1lc3RhbXBcbiAgICAgICAgICBjb25zdCBpbmZvQ2VsbCA9ICQoJGNlbGxzWzNdKTtcbiAgICAgICAgICBjb25zdCB1c2VyRWxlbSA9IGluZm9DZWxsLmZpbmQoJ3NwYW4ucHJpbnR1c2VyJyk7XG4gICAgICAgICAgY29uc3QgY2hhbmdlZEJ5ID0gdXNlckVsZW0ubGVuZ3RoID4gMCA/IHBhcnNlVXNlcihzaXRlLmNsaWVudCwgdXNlckVsZW0pIDogbnVsbDtcblxuICAgICAgICAgIGNvbnN0IG9kYXRlRWxlbSA9IGluZm9DZWxsLmZpbmQoJ3NwYW4ub2RhdGUnKTtcbiAgICAgICAgICBjb25zdCBjaGFuZ2VkQXQgPSBvZGF0ZUVsZW0ubGVuZ3RoID4gMCA/IHBhcnNlT2RhdGUob2RhdGVFbGVtKSA6IG51bGw7XG5cbiAgICAgICAgICAvLyBDb21tZW50XG4gICAgICAgICAgY29uc3QgY29tbWVudEVsZW0gPSBpbmZvQ2VsbC5maW5kKCdzcGFuLmNvbW1lbnRzJyk7XG4gICAgICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRFbGVtXG4gICAgICAgICAgICAudGV4dCgpXG4gICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAucmVwbGFjZSgvXltcIlwiXXxbXCJcIl0kL2csICcnKTtcblxuICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgIG5ldyBTaXRlQ2hhbmdlKHtcbiAgICAgICAgICAgICAgc2l0ZSxcbiAgICAgICAgICAgICAgcGFnZUZ1bGxuYW1lLFxuICAgICAgICAgICAgICBwYWdlVGl0bGUsXG4gICAgICAgICAgICAgIHJldmlzaW9uTm8sXG4gICAgICAgICAgICAgIGNoYW5nZWRCeSxcbiAgICAgICAgICAgICAgY2hhbmdlZEF0LFxuICAgICAgICAgICAgICBmbGFncyxcbiAgICAgICAgICAgICAgY29tbWVudCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTGltaXQgcmVzdWx0cyBpZiBsaW1pdCBpcyBzcGVjaWZpZWRcbiAgICAgICAgY29uc3QgbGltaXRlZENoYW5nZXMgPSBsaW1pdCAhPT0gdW5kZWZpbmVkID8gY2hhbmdlcy5zbGljZSgwLCBsaW1pdCkgOiBjaGFuZ2VzO1xuICAgICAgICByZXR1cm4gbmV3IFNpdGVDaGFuZ2VDb2xsZWN0aW9uKHNpdGUsIGxpbWl0ZWRDaGFuZ2VzKTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm9FbGVtZW50RXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBVbmV4cGVjdGVkRXJyb3IoYEZhaWxlZCB0byBhY3F1aXJlIHNpdGUgY2hhbmdlczogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICk7XG4gIH1cbn1cbiIsCiAgICAiaW1wb3J0IHsgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgcGFyc2VVc2VyIH0gZnJvbSAnLi4vLi4vLi4vdXRpbC9wYXJzZXInO1xuaW1wb3J0IHtcbiAgUGFnZSxcbiAgUGFnZUNvbGxlY3Rpb24sXG4gIFNlYXJjaFBhZ2VzUXVlcnksXG4gIHR5cGUgU2VhcmNoUGFnZXNRdWVyeVBhcmFtcyxcbiAgU2l0ZUNoYW5nZUNvbGxlY3Rpb24sXG59IGZyb20gJy4uLy4uL3BhZ2UnO1xuaW1wb3J0IHR5cGUgeyBTaXRlIH0gZnJvbSAnLi4vc2l0ZSc7XG5cbi8qKlxuICogUGFnZSBsaXN0IG9wZXJhdGlvbnMgYWNjZXNzb3JcbiAqL1xuZXhwb3J0IGNsYXNzIFBhZ2VzQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgc2l0ZTogU2l0ZTtcblxuICBjb25zdHJ1Y3RvcihzaXRlOiBTaXRlKSB7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2ggcGFnZXMgbWF0Y2hpbmcgY29uZGl0aW9uc1xuICAgKiBAcGFyYW0gcGFyYW1zIC0gU2VhcmNoIGNvbmRpdGlvbnNcbiAgICogQHJldHVybnMgUGFnZSBjb2xsZWN0aW9uXG4gICAqL1xuICBzZWFyY2gocGFyYW1zPzogU2VhcmNoUGFnZXNRdWVyeVBhcmFtcyk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFNlYXJjaFBhZ2VzUXVlcnkocGFyYW1zKTtcbiAgICAgICAgY29uc3QgdXNlclBhcnNlciA9IHBhcnNlVXNlci5iaW5kKG51bGwsIHRoaXMuc2l0ZS5jbGllbnQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IFBhZ2VDb2xsZWN0aW9uLnNlYXJjaFBhZ2VzKHRoaXMuc2l0ZSwgdXNlclBhcnNlciwgcXVlcnkpO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICAgICAgfSkoKSxcbiAgICAgIChlcnJvcikgPT4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIHNlYXJjaCBwYWdlczogJHtTdHJpbmcoZXJyb3IpfWApXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIHBhZ2VzXG4gICAqIEByZXR1cm5zIFBhZ2UgY29sbGVjdGlvblxuICAgKi9cbiAgYWxsKCk6IFdpa2lkb3RSZXN1bHRBc3luYzxQYWdlQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaCh7fSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlY2VudCBjaGFuZ2VzXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uc1xuICAgKiBAcGFyYW0gb3B0aW9ucy5wZXJQYWdlIC0gSXRlbXMgcGVyIHBhZ2UgKGRlZmF1bHQ6IDIwKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5wYWdlIC0gUGFnZSBudW1iZXIgKGRlZmF1bHQ6IDEpXG4gICAqIEByZXR1cm5zIENoYW5nZSBoaXN0b3J5IGNvbGxlY3Rpb25cbiAgICovXG4gIGdldFJlY2VudENoYW5nZXMob3B0aW9ucz86IHtcbiAgICBwZXJQYWdlPzogbnVtYmVyO1xuICAgIHBhZ2U/OiBudW1iZXI7XG4gIH0pOiBXaWtpZG90UmVzdWx0QXN5bmM8U2l0ZUNoYW5nZUNvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gU2l0ZUNoYW5nZUNvbGxlY3Rpb24uYWNxdWlyZSh0aGlzLnNpdGUsIG9wdGlvbnMpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIFBhZ2UsXG4gIFBhZ2VDb2xsZWN0aW9uLFxuICBTZWFyY2hQYWdlc1F1ZXJ5LFxuICBTaXRlQ2hhbmdlQ29sbGVjdGlvbixcbiAgdHlwZSBTZWFyY2hQYWdlc1F1ZXJ5UGFyYW1zLFxufTtcbiIsCiAgICAiaW1wb3J0ICogYXMgY2hlZXJpbyBmcm9tICdjaGVlcmlvJztcbmltcG9ydCB7IE5vRWxlbWVudEVycm9yLCBOb3RGb3VuZEV4Y2VwdGlvbiwgVW5leHBlY3RlZEVycm9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyBmcm9tUHJvbWlzZSwgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMgfSBmcm9tICcuLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBBTUNSZXF1ZXN0Qm9keSwgQU1DUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9jb25uZWN0b3InO1xuaW1wb3J0IHsgZmV0Y2hXaXRoUmV0cnkgfSBmcm9tICcuLi8uLi91dGlsL2h0dHAnO1xuaW1wb3J0IHR5cGUgeyBDbGllbnQgfSBmcm9tICcuLi9jbGllbnQvY2xpZW50JztcbmltcG9ydCB7IEZvcnVtQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9mb3J1bS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBNZW1iZXJBY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3JzL21lbWJlci1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBQYWdlQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9wYWdlLWFjY2Vzc29yJztcbmltcG9ydCB7IFBhZ2VzQWNjZXNzb3IgfSBmcm9tICcuL2FjY2Vzc29ycy9wYWdlcy1hY2Nlc3Nvcic7XG5cbi8qKlxuICogU2l0ZSBkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2l0ZURhdGEge1xuICBpZDogbnVtYmVyO1xuICB0aXRsZTogc3RyaW5nO1xuICB1bml4TmFtZTogc3RyaW5nO1xuICBkb21haW46IHN0cmluZztcbiAgc3NsU3VwcG9ydGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFNpdGUgY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFNpdGUge1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgLyoqIFNpdGUgSUQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlkOiBudW1iZXI7XG5cbiAgLyoqIFNpdGUgdGl0bGUgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqIFVOSVggbmFtZSAoZS5nLiwgc2NwLWpwKSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdW5peE5hbWU6IHN0cmluZztcblxuICAvKiogRG9tYWluICovXG4gIHB1YmxpYyByZWFkb25seSBkb21haW46IHN0cmluZztcblxuICAvKiogU1NMIHN1cHBvcnQgZmxhZyAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3NsU3VwcG9ydGVkOiBib29sZWFuO1xuXG4gIC8qKiBQYWdlIGFjY2Vzc29yICovXG4gIHByaXZhdGUgX3BhZ2U6IFBhZ2VBY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBQYWdlcyBhY2Nlc3NvciAqL1xuICBwcml2YXRlIF9wYWdlczogUGFnZXNBY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBGb3J1bSBhY2Nlc3NvciAqL1xuICBwcml2YXRlIF9mb3J1bTogRm9ydW1BY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBNZW1iZXIgYWNjZXNzb3IgKi9cbiAgcHJpdmF0ZSBfbWVtYmVyOiBNZW1iZXJBY2Nlc3NvciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudDogQ2xpZW50LCBkYXRhOiBTaXRlRGF0YSkge1xuICAgIHRoaXMuY2xpZW50ID0gY2xpZW50O1xuICAgIHRoaXMuaWQgPSBkYXRhLmlkO1xuICAgIHRoaXMudGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgIHRoaXMudW5peE5hbWUgPSBkYXRhLnVuaXhOYW1lO1xuICAgIHRoaXMuZG9tYWluID0gZGF0YS5kb21haW47XG4gICAgdGhpcy5zc2xTdXBwb3J0ZWQgPSBkYXRhLnNzbFN1cHBvcnRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZSBhY2Nlc3NvclxuICAgKi9cbiAgZ2V0IHBhZ2UoKTogUGFnZUFjY2Vzc29yIHtcbiAgICBpZiAoIXRoaXMuX3BhZ2UpIHtcbiAgICAgIHRoaXMuX3BhZ2UgPSBuZXcgUGFnZUFjY2Vzc29yKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGFnZXMgYWNjZXNzb3JcbiAgICovXG4gIGdldCBwYWdlcygpOiBQYWdlc0FjY2Vzc29yIHtcbiAgICBpZiAoIXRoaXMuX3BhZ2VzKSB7XG4gICAgICB0aGlzLl9wYWdlcyA9IG5ldyBQYWdlc0FjY2Vzc29yKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcGFnZXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZvcnVtIGFjY2Vzc29yXG4gICAqL1xuICBnZXQgZm9ydW0oKTogRm9ydW1BY2Nlc3NvciB7XG4gICAgaWYgKCF0aGlzLl9mb3J1bSkge1xuICAgICAgdGhpcy5fZm9ydW0gPSBuZXcgRm9ydW1BY2Nlc3Nvcih0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2ZvcnVtO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBtZW1iZXIgYWNjZXNzb3JcbiAgICovXG4gIGdldCBtZW1iZXIoKTogTWVtYmVyQWNjZXNzb3Ige1xuICAgIGlmICghdGhpcy5fbWVtYmVyKSB7XG4gICAgICB0aGlzLl9tZW1iZXIgPSBuZXcgTWVtYmVyQWNjZXNzb3IodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9tZW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJhc2UgVVJMIG9mIHRoZSBzaXRlXG4gICAqL1xuICBnZXRCYXNlVXJsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLnNzbFN1cHBvcnRlZCA/ICdodHRwcycgOiAnaHR0cCc7XG4gICAgcmV0dXJuIGAke3Byb3RvY29sfTovLyR7dGhpcy5kb21haW59YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIEFNQyByZXF1ZXN0IHRvIHRoaXMgc2l0ZVxuICAgKiBAcGFyYW0gYm9kaWVzIC0gUmVxdWVzdCBib2R5IGFycmF5XG4gICAqIEByZXR1cm5zIEFNQyByZXNwb25zZSBhcnJheVxuICAgKi9cbiAgYW1jUmVxdWVzdChib2RpZXM6IEFNQ1JlcXVlc3RCb2R5W10pOiBXaWtpZG90UmVzdWx0QXN5bmM8QU1DUmVzcG9uc2VbXT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5hbWNDbGllbnQucmVxdWVzdChib2RpZXMsIHRoaXMudW5peE5hbWUsIHRoaXMuc3NsU3VwcG9ydGVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgc2luZ2xlIEFNQyByZXF1ZXN0XG4gICAqIEBwYXJhbSBib2R5IC0gUmVxdWVzdCBib2R5XG4gICAqIEByZXR1cm5zIEFNQyByZXNwb25zZVxuICAgKi9cbiAgYW1jUmVxdWVzdFNpbmdsZShib2R5OiBBTUNSZXF1ZXN0Qm9keSk6IFdpa2lkb3RSZXN1bHRBc3luYzxBTUNSZXNwb25zZT4ge1xuICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYW1jUmVxdWVzdChbYm9keV0pO1xuICAgICAgICBpZiAocmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVW5leHBlY3RlZEVycm9yKCdBTUMgcmVxdWVzdCByZXR1cm5lZCBlbXB0eSByZXNwb25zZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVW5leHBlY3RlZEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVW5leHBlY3RlZEVycm9yKGBBTUMgcmVxdWVzdCBmYWlsZWQ6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzaXRlIGZyb20gVU5JWCBuYW1lXG4gICAqIEBwYXJhbSBjbGllbnQgLSBDbGllbnRcbiAgICogQHBhcmFtIHVuaXhOYW1lIC0gU2l0ZSBVTklYIG5hbWUgKGUuZy4sICdzY3AtanAnKVxuICAgKiBAcmV0dXJucyBTaXRlXG4gICAqL1xuICBzdGF0aWMgZnJvbVVuaXhOYW1lKGNsaWVudDogQ2xpZW50LCB1bml4TmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGU+IHtcbiAgICByZXR1cm4gZnJvbVByb21pc2UoXG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBGZXRjaCBzaXRlIHBhZ2UgKEhUVFAgcmVxdWVzdCwgZm9sbG93aW5nIHJlZGlyZWN0cywgd2l0aCByZXRyeSlcbiAgICAgICAgY29uc3QgdXJsID0gYGh0dHA6Ly8ke3VuaXhOYW1lfS53aWtpZG90LmNvbWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hXaXRoUmV0cnkodXJsLCBjbGllbnQuYW1jQ2xpZW50LmNvbmZpZywge1xuICAgICAgICAgIGhlYWRlcnM6IGNsaWVudC5hbWNDbGllbnQuaGVhZGVyLmdldEhlYWRlcnMoKSxcbiAgICAgICAgICBjaGVja09rOiBmYWxzZSwgLy8gSGFuZGxlIEhUVFAgZXJyb3JzIG1hbnVhbGx5IGZvciBiZXR0ZXIgZXJyb3IgbWVzc2FnZXNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwNCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKGBTaXRlIG5vdCBmb3VuZDogJHt1bml4TmFtZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGZldGNoIHNpdGU6ICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgY29uc3QgJCA9IGNoZWVyaW8ubG9hZChodG1sKTtcblxuICAgICAgICAvLyBQYXJzZSBXSUtJUkVRVUVTVC5pbmZvXG4gICAgICAgIGNvbnN0IHNjcmlwdHMgPSAkKCdzY3JpcHQnKS50b0FycmF5KCk7XG4gICAgICAgIGxldCBzaXRlSWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgc2l0ZVVuaXhOYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICAgICAgbGV0IGRvbWFpbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCB0aXRsZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgZm9yIChjb25zdCBzY3JpcHQgb2Ygc2NyaXB0cykge1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSAkKHNjcmlwdCkuaHRtbCgpO1xuICAgICAgICAgIGlmICghY29udGVudCB8fCAhY29udGVudC5pbmNsdWRlcygnV0lLSVJFUVVFU1QnKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2l0ZUlkXG4gICAgICAgICAgY29uc3Qgc2l0ZUlkTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9XSUtJUkVRVUVTVFxcLmluZm9cXC5zaXRlSWRcXHMqPVxccyooXFxkKykvKTtcbiAgICAgICAgICBpZiAoc2l0ZUlkTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgc2l0ZUlkID0gTnVtYmVyLnBhcnNlSW50KHNpdGVJZE1hdGNoWzFdLCAxMCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gc2l0ZVVuaXhOYW1lXG4gICAgICAgICAgY29uc3Qgc2l0ZVVuaXhOYW1lTWF0Y2ggPSBjb250ZW50Lm1hdGNoKFxuICAgICAgICAgICAgL1dJS0lSRVFVRVNUXFwuaW5mb1xcLnNpdGVVbml4TmFtZVxccyo9XFxzKltcIiddKFteXCInXSspW1wiJ10vXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoc2l0ZVVuaXhOYW1lTWF0Y2g/LlsxXSkge1xuICAgICAgICAgICAgc2l0ZVVuaXhOYW1lID0gc2l0ZVVuaXhOYW1lTWF0Y2hbMV07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gZG9tYWluXG4gICAgICAgICAgY29uc3QgZG9tYWluTWF0Y2ggPSBjb250ZW50Lm1hdGNoKC9XSUtJUkVRVUVTVFxcLmluZm9cXC5kb21haW5cXHMqPVxccypbXCInXShbXlwiJ10rKVtcIiddLyk7XG4gICAgICAgICAgaWYgKGRvbWFpbk1hdGNoPy5bMV0pIHtcbiAgICAgICAgICAgIGRvbWFpbiA9IGRvbWFpbk1hdGNoWzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRpdGxlIGZyb20gPHRpdGxlPiB0YWdcbiAgICAgICAgdGl0bGUgPSAkKCd0aXRsZScpLnRleHQoKS50cmltKCkgfHwgbnVsbDtcbiAgICAgICAgLy8gUmVtb3ZlIFwiIC0gV2lraWRvdFwiIHN1ZmZpeCBpZiBwcmVzZW50XG4gICAgICAgIGlmICh0aXRsZT8uZW5kc1dpdGgoJyAtIFdpa2lkb3QnKSkge1xuICAgICAgICAgIHRpdGxlID0gdGl0bGUuc2xpY2UoMCwgLTEwKS50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2l0ZUlkID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vRWxlbWVudEVycm9yKCdTaXRlIElEIG5vdCBmb3VuZCBpbiBXSUtJUkVRVUVTVCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaXRlVW5peE5hbWUgPT09IG51bGwpIHtcbiAgICAgICAgICBzaXRlVW5peE5hbWUgPSB1bml4TmFtZTsgLy8gRmFsbGJhY2tcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9tYWluID09PSBudWxsKSB7XG4gICAgICAgICAgZG9tYWluID0gYCR7dW5peE5hbWV9Lndpa2lkb3QuY29tYDsgLy8gRmFsbGJhY2tcbiAgICAgICAgfVxuICAgICAgICBpZiAodGl0bGUgPT09IG51bGwpIHtcbiAgICAgICAgICB0aXRsZSA9IHVuaXhOYW1lOyAvLyBGYWxsYmFja1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgU1NMIHN1cHBvcnQgKGJhc2VkIG9uIHdoZXRoZXIgdGhlIHJlZGlyZWN0IFVSTCBzdGFydHMgd2l0aCBodHRwcylcbiAgICAgICAgY29uc3Qgc3NsU3VwcG9ydGVkID0gcmVzcG9uc2UudXJsLnN0YXJ0c1dpdGgoJ2h0dHBzJyk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTaXRlKGNsaWVudCwge1xuICAgICAgICAgIGlkOiBzaXRlSWQsXG4gICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgdW5peE5hbWU6IHNpdGVVbml4TmFtZSxcbiAgICAgICAgICBkb21haW4sXG4gICAgICAgICAgc3NsU3VwcG9ydGVkLFxuICAgICAgICB9KTtcbiAgICAgIH0pKCksXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTm90Rm91bmRFeGNlcHRpb24gfHwgZXJyb3IgaW5zdGFuY2VvZiBOb0VsZW1lbnRFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFVuZXhwZWN0ZWRFcnJvcihgRmFpbGVkIHRvIGdldCBzaXRlOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBTaXRlKGlkPSR7dGhpcy5pZH0sIHVuaXhOYW1lPSR7dGhpcy51bml4TmFtZX0sIHRpdGxlPSR7dGhpcy50aXRsZX0pYDtcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IFdpa2lkb3RSZXN1bHRBc3luYyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBTaXRlIH0gZnJvbSAnLi4vLi4vc2l0ZSc7XG5pbXBvcnQgdHlwZSB7IENsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5cbi8qKlxuICogU2l0ZSBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBTaXRlQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc2l0ZSBieSBVTklYIG5hbWVcbiAgICpcbiAgICogQHBhcmFtIHVuaXhOYW1lIC0gU2l0ZSBVTklYIG5hbWUgKGUuZy4sICdzY3AtanAnKVxuICAgKiBAcmV0dXJucyBTaXRlIG9iamVjdCB3cmFwcGVkIGluIFJlc3VsdCB0eXBlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc2l0ZVJlc3VsdCA9IGF3YWl0IGNsaWVudC5zaXRlLmdldCgnc2NwLWpwJyk7XG4gICAqIGlmICghc2l0ZVJlc3VsdC5pc09rKCkpIHtcbiAgICogICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBnZXQgc2l0ZScpO1xuICAgKiB9XG4gICAqIGNvbnN0IHNpdGUgPSBzaXRlUmVzdWx0LnZhbHVlO1xuICAgKiBgYGBcbiAgICovXG4gIGdldCh1bml4TmFtZTogc3RyaW5nKTogV2lraWRvdFJlc3VsdEFzeW5jPFNpdGU+IHtcbiAgICByZXR1cm4gU2l0ZS5mcm9tVW5peE5hbWUodGhpcy5jbGllbnQsIHVuaXhOYW1lKTtcbiAgfVxufVxuXG5leHBvcnQgeyBTaXRlIH07XG4iLAogICAgImltcG9ydCB7IE5vdEZvdW5kRXhjZXB0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2Vycm9ycyc7XG5pbXBvcnQgeyB0eXBlIFdpa2lkb3RSZXN1bHRBc3luYywgd2RFcnJBc3luYywgd2RPa0FzeW5jIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IFVzZXIsIHR5cGUgVXNlckNvbGxlY3Rpb24gfSBmcm9tICcuLi8uLi91c2VyJztcbmltcG9ydCB0eXBlIHsgQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcblxuLyoqXG4gKiBVc2VyIHJldHJpZXZhbCBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VXNlck9wdGlvbnMge1xuICAvKiogVGhyb3cgZXJyb3IgaWYgdXNlciBub3QgZm91bmQgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICByYWlzZVdoZW5Ob3RGb3VuZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogVXNlciBvcGVyYXRpb25zIGFjY2Vzc29yXG4gKi9cbmV4cG9ydCBjbGFzcyBVc2VyQWNjZXNzb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgY2xpZW50OiBDbGllbnQ7XG5cbiAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdXNlciBieSB1c2VybmFtZVxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFVzZXJuYW1lXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gUmV0cmlldmFsIG9wdGlvbnNcbiAgICogQHJldHVybnMgVXNlciB3cmFwcGVkIGluIFJlc3VsdCB0eXBlIChudWxsIGlmIG5vdCBmb3VuZCwgZXJyb3IgaWYgcmFpc2VXaGVuTm90Rm91bmQgaXMgdHJ1ZSlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VyUmVzdWx0ID0gYXdhaXQgY2xpZW50LnVzZXIuZ2V0KCd1c2VybmFtZScpO1xuICAgKiBpZiAoIXVzZXJSZXN1bHQuaXNPaygpKSB7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IHVzZXInKTtcbiAgICogfVxuICAgKiBjb25zdCB1c2VyID0gdXNlclJlc3VsdC52YWx1ZTtcbiAgICogYGBgXG4gICAqL1xuICBnZXQobmFtZTogc3RyaW5nLCBvcHRpb25zOiBHZXRVc2VyT3B0aW9ucyA9IHt9KTogV2lraWRvdFJlc3VsdEFzeW5jPFVzZXIgfCBudWxsPiB7XG4gICAgY29uc3QgeyByYWlzZVdoZW5Ob3RGb3VuZCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIFVzZXIuZnJvbU5hbWUodGhpcy5jbGllbnQsIG5hbWUpLmFuZFRoZW4oKHVzZXIpID0+IHtcbiAgICAgIGlmICh1c2VyID09PSBudWxsICYmIHJhaXNlV2hlbk5vdEZvdW5kKSB7XG4gICAgICAgIHJldHVybiB3ZEVyckFzeW5jKG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihgVXNlciBub3QgZm91bmQ6ICR7bmFtZX1gKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKHVzZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VycyBmcm9tIG11bHRpcGxlIHVzZXJuYW1lc1xuICAgKiBAcGFyYW0gbmFtZXMgLSBBcnJheSBvZiB1c2VybmFtZXNcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBSZXRyaWV2YWwgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBVc2VyIGNvbGxlY3Rpb24gKG51bGwgZm9yIG5vbi1leGlzdGVudCB1c2VycywgZXJyb3IgaWYgcmFpc2VXaGVuTm90Rm91bmQgaXMgdHJ1ZSlcbiAgICovXG4gIGdldE1hbnkobmFtZXM6IHN0cmluZ1tdLCBvcHRpb25zOiBHZXRVc2VyT3B0aW9ucyA9IHt9KTogV2lraWRvdFJlc3VsdEFzeW5jPFVzZXJDb2xsZWN0aW9uPiB7XG4gICAgY29uc3QgeyByYWlzZVdoZW5Ob3RGb3VuZCA9IGZhbHNlIH0gPSBvcHRpb25zO1xuXG4gICAgcmV0dXJuIFVzZXIuZnJvbU5hbWVzKHRoaXMuY2xpZW50LCBuYW1lcykuYW5kVGhlbigoY29sbGVjdGlvbikgPT4ge1xuICAgICAgaWYgKHJhaXNlV2hlbk5vdEZvdW5kKSB7XG4gICAgICAgIGNvbnN0IG5vdEZvdW5kTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBuYW1lID0gbmFtZXNbaV07XG4gICAgICAgICAgaWYgKGNvbGxlY3Rpb25baV0gPT09IG51bGwgJiYgbmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBub3RGb3VuZE5hbWVzLnB1c2gobmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RGb3VuZE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXR1cm4gd2RFcnJBc3luYyhuZXcgTm90Rm91bmRFeGNlcHRpb24oYFVzZXJzIG5vdCBmb3VuZDogJHtub3RGb3VuZE5hbWVzLmpvaW4oJywgJyl9YCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gd2RPa0FzeW5jKGNvbGxlY3Rpb24pO1xuICAgIH0pO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IExvZ2luUmVxdWlyZWRFcnJvciB9IGZyb20gJy4uLy4uL2NvbW1vbi9lcnJvcnMnO1xuaW1wb3J0IHtcbiAgZnJvbVByb21pc2UsXG4gIHR5cGUgV2lraWRvdFJlc3VsdCxcbiAgdHlwZSBXaWtpZG90UmVzdWx0QXN5bmMsXG4gIHdkRXJyLFxuICB3ZE9rLFxuICB3ZE9rQXN5bmMsXG59IGZyb20gJy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBBTUNDbGllbnQsIHR5cGUgQU1DQ29uZmlnLCBsb2dpbiwgbG9nb3V0IH0gZnJvbSAnLi4vLi4vY29ubmVjdG9yJztcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi91c2VyL3VzZXInO1xuaW1wb3J0IHsgUHJpdmF0ZU1lc3NhZ2VBY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3JzL3BtLWFjY2Vzc29yJztcbmltcG9ydCB7IFNpdGVBY2Nlc3NvciB9IGZyb20gJy4vYWNjZXNzb3JzL3NpdGUtYWNjZXNzb3InO1xuaW1wb3J0IHsgVXNlckFjY2Vzc29yIH0gZnJvbSAnLi9hY2Nlc3NvcnMvdXNlci1hY2Nlc3Nvcic7XG5cbi8qKlxuICogQ2xpZW50IGNyZWF0aW9uIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRPcHRpb25zIHtcbiAgLyoqIFdpa2lkb3QgdXNlcm5hbWUgKi9cbiAgdXNlcm5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqIFdpa2lkb3QgcGFzc3dvcmQgKi9cbiAgcGFzc3dvcmQ/OiBzdHJpbmc7XG5cbiAgLyoqIEJhc2UgZG9tYWluIChkZWZhdWx0OiB3aWtpZG90LmNvbSkgKi9cbiAgZG9tYWluPzogc3RyaW5nO1xuXG4gIC8qKiBBTUMgY29uZmlndXJhdGlvbiBvdmVycmlkZSAqL1xuICBhbWNDb25maWc/OiBQYXJ0aWFsPEFNQ0NvbmZpZz47XG59XG5cbi8qKlxuICogV2lraWRvdCBjbGllbnRcbiAqIE1haW4gZW50cnkgcG9pbnQgb2YgdGhlIGxpYnJhcnlcbiAqL1xuZXhwb3J0IGNsYXNzIENsaWVudCB7XG4gIC8qKiBBTUMgY2xpZW50ICovXG4gIHB1YmxpYyByZWFkb25seSBhbWNDbGllbnQ6IEFNQ0NsaWVudDtcblxuICAvKiogQmFzZSBkb21haW4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbjogc3RyaW5nO1xuXG4gIC8qKiBVc2VyIG9wZXJhdGlvbnMgYWNjZXNzb3IgKi9cbiAgcHVibGljIHJlYWRvbmx5IHVzZXI6IFVzZXJBY2Nlc3NvcjtcblxuICAvKiogU2l0ZSBvcGVyYXRpb25zIGFjY2Vzc29yICovXG4gIHB1YmxpYyByZWFkb25seSBzaXRlOiBTaXRlQWNjZXNzb3I7XG5cbiAgLyoqIFByaXZhdGUgbWVzc2FnZSBvcGVyYXRpb25zIGFjY2Vzc29yICovXG4gIHB1YmxpYyByZWFkb25seSBwcml2YXRlTWVzc2FnZTogUHJpdmF0ZU1lc3NhZ2VBY2Nlc3NvcjtcblxuICAvKiogVXNlcm5hbWUgb2YgdGhlIGxvZ2dlZC1pbiB1c2VyICovXG4gIHByaXZhdGUgX3VzZXJuYW1lOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKiBMb2dnZWQtaW4gdXNlciAqL1xuICBwcml2YXRlIF9tZTogVXNlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yXG4gICAqIFVzZSB0aGUgY3JlYXRlIG1ldGhvZCB0byBjcmVhdGUgYW4gaW5zdGFuY2VcbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IoYW1jQ2xpZW50OiBBTUNDbGllbnQsIGRvbWFpbjogc3RyaW5nLCB1c2VybmFtZTogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcbiAgICB0aGlzLmFtY0NsaWVudCA9IGFtY0NsaWVudDtcbiAgICB0aGlzLmRvbWFpbiA9IGRvbWFpbjtcbiAgICB0aGlzLl91c2VybmFtZSA9IHVzZXJuYW1lO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhY2Nlc3NvcnNcbiAgICB0aGlzLnVzZXIgPSBuZXcgVXNlckFjY2Vzc29yKHRoaXMpO1xuICAgIHRoaXMuc2l0ZSA9IG5ldyBTaXRlQWNjZXNzb3IodGhpcyk7XG4gICAgdGhpcy5wcml2YXRlTWVzc2FnZSA9IG5ldyBQcml2YXRlTWVzc2FnZUFjY2Vzc29yKHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdXNlcm5hbWUgb2YgdGhlIGxvZ2dlZC1pbiB1c2VyXG4gICAqL1xuICBnZXQgdXNlcm5hbWUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9nZ2VkLWluIHVzZXJcbiAgICogUmV0dXJucyBudWxsIGlmIG5vdCBsb2dnZWQgaW5cbiAgICovXG4gIGdldCBtZSgpOiBVc2VyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX21lO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGNsaWVudFxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENsaWVudCBvcHRpb25zXG4gICAqIEByZXR1cm5zIENsaWVudCBpbnN0YW5jZSB3cmFwcGVkIGluIFJlc3VsdCB0eXBlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW1wb3J0IHsgQ2xpZW50IH0gZnJvbSAnQHVrd2hhdG4vd2lraWRvdCc7XG4gICAqXG4gICAqIC8vIENyZWF0ZSBhIGNsaWVudFxuICAgKiBjb25zdCBjbGllbnRSZXN1bHQgPSBhd2FpdCBDbGllbnQuY3JlYXRlKHtcbiAgICogICB1c2VybmFtZTogJ3lvdXJfdXNlcm5hbWUnLFxuICAgKiAgIHBhc3N3b3JkOiAneW91cl9wYXNzd29yZCcsXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBSZXN1bHQgdHlwZSByZXF1aXJlcyBpc09rKCkgY2hlY2sgYmVmb3JlIGFjY2Vzc2luZyAudmFsdWVcbiAgICogaWYgKCFjbGllbnRSZXN1bHQuaXNPaygpKSB7XG4gICAqICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGNsaWVudCcpO1xuICAgKiB9XG4gICAqIGNvbnN0IGNsaWVudCA9IGNsaWVudFJlc3VsdC52YWx1ZTtcbiAgICpcbiAgICogLy8gTm93IHlvdSBjYW4gYWNjZXNzIGNsaWVudC5zaXRlLCBldGMuXG4gICAqIGNvbnN0IHNpdGVSZXN1bHQgPSBhd2FpdCBjbGllbnQuc2l0ZS5nZXQoJ3NjcC1qcCcpO1xuICAgKiBgYGBcbiAgICovXG4gIHN0YXRpYyBjcmVhdGUob3B0aW9uczogQ2xpZW50T3B0aW9ucyA9IHt9KTogV2lraWRvdFJlc3VsdEFzeW5jPENsaWVudD4ge1xuICAgIGNvbnN0IHsgdXNlcm5hbWUsIHBhc3N3b3JkLCBkb21haW4gPSAnd2lraWRvdC5jb20nLCBhbWNDb25maWcgPSB7fSB9ID0gb3B0aW9ucztcblxuICAgIC8vIENyZWF0ZSBBTUMgY2xpZW50XG4gICAgY29uc3QgYW1jQ2xpZW50ID0gbmV3IEFNQ0NsaWVudChhbWNDb25maWcsIGRvbWFpbik7XG5cbiAgICAvLyBMb2dpbiBpZiBjcmVkZW50aWFscyBhcmUgcHJvdmlkZWRcbiAgICBpZiAodXNlcm5hbWUgJiYgcGFzc3dvcmQpIHtcbiAgICAgIHJldHVybiBmcm9tUHJvbWlzZShcbiAgICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjbGllbnQgPSBuZXcgQ2xpZW50KGFtY0NsaWVudCwgZG9tYWluLCB1c2VybmFtZSk7XG4gICAgICAgICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCBsb2dpbihjbGllbnQsIHVzZXJuYW1lLCBwYXNzd29yZCk7XG4gICAgICAgICAgaWYgKGxvZ2luUmVzdWx0LmlzRXJyKCkpIHtcbiAgICAgICAgICAgIHRocm93IGxvZ2luUmVzdWx0LmVycm9yO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEdldCBsb2dnZWQtaW4gdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgIGNvbnN0IHVzZXJSZXN1bHQgPSBhd2FpdCBVc2VyLmZyb21OYW1lKGNsaWVudCwgdXNlcm5hbWUpO1xuICAgICAgICAgIGlmICh1c2VyUmVzdWx0LmlzT2soKSAmJiB1c2VyUmVzdWx0LnZhbHVlKSB7XG4gICAgICAgICAgICBjbGllbnQuX21lID0gdXNlclJlc3VsdC52YWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY2xpZW50O1xuICAgICAgICB9KSgpLFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBMb2dpblJlcXVpcmVkRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBMb2dpblJlcXVpcmVkRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgY2xpZW50OiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHVuYXV0aGVudGljYXRlZCBjbGllbnRcbiAgICByZXR1cm4gd2RPa0FzeW5jKG5ldyBDbGllbnQoYW1jQ2xpZW50LCBkb21haW4pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gdW5hdXRoZW50aWNhdGVkIGNsaWVudFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENsaWVudCBvcHRpb25zIChleGNsdWRpbmcgY3JlZGVudGlhbHMpXG4gICAqIEByZXR1cm5zIENsaWVudCBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUFub255bW91cyhvcHRpb25zOiBPbWl0PENsaWVudE9wdGlvbnMsICd1c2VybmFtZScgfCAncGFzc3dvcmQnPiA9IHt9KTogQ2xpZW50IHtcbiAgICBjb25zdCB7IGRvbWFpbiA9ICd3aWtpZG90LmNvbScsIGFtY0NvbmZpZyA9IHt9IH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGFtY0NsaWVudCA9IG5ldyBBTUNDbGllbnQoYW1jQ29uZmlnLCBkb21haW4pO1xuICAgIHJldHVybiBuZXcgQ2xpZW50KGFtY0NsaWVudCwgZG9tYWluKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBsb2dpbiBzdGF0dXNcbiAgICogQHJldHVybnMgdHJ1ZSBpZiBsb2dnZWQgaW5cbiAgICovXG4gIGlzTG9nZ2VkSW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJuYW1lICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVpcmUgbG9naW5cbiAgICogUmV0dXJucyBMb2dpblJlcXVpcmVkRXJyb3IgaWYgbm90IGxvZ2dlZCBpblxuICAgKiBAcmV0dXJucyB2b2lkIG9uIHN1Y2Nlc3NcbiAgICovXG4gIHJlcXVpcmVMb2dpbigpOiBXaWtpZG90UmVzdWx0PHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNMb2dnZWRJbigpKSB7XG4gICAgICByZXR1cm4gd2RFcnIobmV3IExvZ2luUmVxdWlyZWRFcnJvcigpKTtcbiAgICB9XG4gICAgcmV0dXJuIHdkT2sodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgY2xpZW50XG4gICAqIEF0dGVtcHRzIHRvIGxvZ291dCBpZiBhIHNlc3Npb24gZXhpc3RzXG4gICAqL1xuICBjbG9zZSgpOiBXaWtpZG90UmVzdWx0QXN5bmM8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzTG9nZ2VkSW4oKSkge1xuICAgICAgcmV0dXJuIGxvZ291dCh0aGlzKS5tYXAoKCkgPT4ge1xuICAgICAgICB0aGlzLl91c2VybmFtZSA9IG51bGw7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHdkT2tBc3luYyh1bmRlZmluZWQpO1xuICB9XG59XG4iLAogICAgImV4cG9ydCAqIGZyb20gJy4vY2xpZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZm9ydW0nO1xuZXhwb3J0ICogZnJvbSAnLi9wYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJpdmF0ZS1tZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vc2l0ZSc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vdXNlcic7XG4iLAogICAgImV4cG9ydCAqIGZyb20gJy4vcGFyc2VyJztcbmV4cG9ydCAqIGZyb20gJy4vcXVpY2stbW9kdWxlJztcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUlzQixjQWtCVDtBQUFBO0FBQUEsRUFsQlMsZUFBZixNQUFlLHFCQUFxQixNQUFNO0FBQUEsSUFFdEI7QUFBQSxJQUt6QixXQUFXLENBQUMsU0FBaUI7QUFBQSxNQUMzQixNQUFNLE9BQU87QUFBQSxNQUNiLEtBQUssT0FBTyxLQUFLLFlBQVk7QUFBQSxNQUM3QixPQUFPLGVBQWUsTUFBTSxXQUFXLFNBQVM7QUFBQTtBQUFBLEVBRXBEO0FBQUEsRUFNYSxrQkFBTixNQUFNLHdCQUF3QixhQUFhO0FBQUEsRUFBQztBQUFBOzs7SUNqQnRDLFVBTUEsY0FrQkEsb0JBa0JBO0FBQUE7QUFBQSxFQS9DYjtBQUFBLEVBS2EsV0FBTixNQUFNLGlCQUFpQixhQUFhO0FBQUEsRUFBQztBQUFBLEVBTS9CLGVBQU4sTUFBTSxxQkFBcUIsU0FBUztBQUFBLElBRXpCO0FBQUEsSUFNaEIsV0FBVyxDQUFDLFNBQWlCLFlBQW9CO0FBQUEsTUFDL0MsTUFBTSxPQUFPO0FBQUEsTUFDYixLQUFLLGFBQWE7QUFBQTtBQUFBLEVBRXRCO0FBQUEsRUFNYSxxQkFBTixNQUFNLDJCQUEyQixTQUFTO0FBQUEsSUFFL0I7QUFBQSxJQU1oQixXQUFXLENBQUMsU0FBaUIsWUFBb0I7QUFBQSxNQUMvQyxNQUFNLE9BQU87QUFBQSxNQUNiLEtBQUssYUFBYTtBQUFBO0FBQUEsRUFFdEI7QUFBQSxFQU1hLG9CQUFOLE1BQU0sMEJBQTBCLFNBQVM7QUFBQSxFQUFDO0FBQUE7OztJQzFDcEMsY0FNQSxvQkFNQTtBQUFBO0FBQUEsRUFqQmI7QUFBQSxFQUthLGVBQU4sTUFBTSxxQkFBcUIsYUFBYTtBQUFBLEVBQUM7QUFBQSxFQU1uQyxxQkFBTixNQUFNLDJCQUEyQixhQUFhO0FBQUEsRUFBQztBQUFBLEVBTXpDLHFCQUFOLE1BQU0sMkJBQTJCLGFBQWE7QUFBQSxJQUNuRCxXQUFXLENBQUMsVUFBVSx3Q0FBd0M7QUFBQSxNQUM1RCxNQUFNLE9BQU87QUFBQTtBQUFBLEVBRWpCO0FBQUE7OztJQ2ZhLG1CQU1BLG1CQU1BLGFBTUEsZ0JBTUE7QUFBQTtBQUFBLEVBOUJiO0FBQUEsRUFNYSxvQkFBTixNQUFNLDBCQUEwQixhQUFhO0FBQUEsRUFBQztBQUFBLEVBTXhDLG9CQUFOLE1BQU0sMEJBQTBCLGFBQWE7QUFBQSxFQUFDO0FBQUEsRUFNeEMsY0FBTixNQUFNLG9CQUFvQixhQUFhO0FBQUEsRUFBQztBQUFBLEVBTWxDLGlCQUFOLE1BQU0sdUJBQXVCLGFBQWE7QUFBQSxFQUFDO0FBQUEsRUFNckMsaUJBQU4sTUFBTSx1QkFBdUIsYUFBYTtBQUFBLEVBQUM7QUFBQTs7OztFQzNCbEQ7QUFBQSxFQUNBO0FBQUEsRUFFQTtBQUFBLEVBR0E7QUFBQTs7O0FDNkRPLE1BQU0sT0FBTztBQUFBLEVBQ0Q7QUFBQSxFQUNUO0FBQUEsRUFDQTtBQUFBLEVBRVIsV0FBVyxDQUFDLE1BQWMsVUFBc0IsYUFBYSxRQUFrQixRQUFRO0FBQUEsSUFDckYsS0FBSyxPQUFPO0FBQUEsSUFDWixLQUFLLFVBQVU7QUFBQSxJQUNmLEtBQUssUUFBUTtBQUFBO0FBQUEsRUFNZixVQUFVLENBQUMsU0FBMkI7QUFBQSxJQUNwQyxLQUFLLFVBQVU7QUFBQTtBQUFBLEVBTWpCLFFBQVEsQ0FBQyxPQUF1QjtBQUFBLElBQzlCLEtBQUssUUFBUTtBQUFBO0FBQUEsRUFNUCxTQUFTLENBQUMsT0FBMEI7QUFBQSxJQUMxQyxPQUFPLG1CQUFtQixVQUFVLG1CQUFtQixLQUFLO0FBQUE7QUFBQSxFQU10RCxHQUFHLENBQUMsT0FBaUIsWUFBb0IsTUFBdUI7QUFBQSxJQUN0RSxJQUFJLEtBQUssVUFBVSxLQUFLLEdBQUc7QUFBQSxNQUN6QixLQUFLLFFBQVEsT0FBTyxLQUFLLE1BQU0sU0FBUyxHQUFHLElBQUk7QUFBQSxJQUNqRDtBQUFBO0FBQUEsRUFHRixLQUFLLENBQUMsWUFBb0IsTUFBdUI7QUFBQSxJQUMvQyxLQUFLLElBQUksU0FBUyxTQUFTLEdBQUcsSUFBSTtBQUFBO0FBQUEsRUFHcEMsSUFBSSxDQUFDLFlBQW9CLE1BQXVCO0FBQUEsSUFDOUMsS0FBSyxJQUFJLFFBQVEsU0FBUyxHQUFHLElBQUk7QUFBQTtBQUFBLEVBR25DLElBQUksQ0FBQyxZQUFvQixNQUF1QjtBQUFBLElBQzlDLEtBQUssSUFBSSxRQUFRLFNBQVMsR0FBRyxJQUFJO0FBQUE7QUFBQSxFQUduQyxLQUFLLENBQUMsWUFBb0IsTUFBdUI7QUFBQSxJQUMvQyxLQUFLLElBQUksU0FBUyxTQUFTLEdBQUcsSUFBSTtBQUFBO0FBRXRDO0FBT08sU0FBUyxTQUFTLENBQUMsT0FBTyxXQUFtQjtBQUFBLEVBQ2xELE9BQU8sSUFBSSxPQUFPLElBQUk7QUFBQTtBQVFqQixTQUFTLG1CQUFtQixDQUFDLFFBQWdCLFFBQWtCLFFBQWM7QUFBQSxFQUNsRixPQUFPLFdBQVcsY0FBYztBQUFBLEVBQ2hDLE9BQU8sU0FBUyxLQUFLO0FBQUE7QUFBQSxJQWpJakIsb0JBb0JPLGNBQTBCLE1BQU0sSUFPaEMsaUJBQTZCLENBQ3hDLE9BQ0EsTUFDQSxZQUNHLFNBQ0E7QUFBQSxFQUNILE1BQU0sWUFBWSxJQUFJLEtBQUssRUFBRSxZQUFZO0FBQUEsRUFDekMsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLFFBQVEsTUFBTSxZQUFZLE1BQU07QUFBQSxFQUUxRSxRQUFRO0FBQUEsU0FDRDtBQUFBLE1BQ0gsUUFBUSxNQUFNLGtCQUFrQixHQUFHLElBQUk7QUFBQSxNQUN2QztBQUFBLFNBQ0c7QUFBQSxNQUNILFFBQVEsS0FBSyxrQkFBa0IsR0FBRyxJQUFJO0FBQUEsTUFDdEM7QUFBQSxTQUNHO0FBQUEsTUFDSCxRQUFRLEtBQUssa0JBQWtCLEdBQUcsSUFBSTtBQUFBLE1BQ3RDO0FBQUEsU0FDRztBQUFBLE1BQ0gsUUFBUSxNQUFNLGtCQUFrQixHQUFHLElBQUk7QUFBQSxNQUN2QztBQUFBO0FBQUEsR0F1Rk87QUFBQTtBQUFBLEVBdklQLHFCQUErQztBQUFBLElBQ25ELE9BQU87QUFBQSxJQUNQLE1BQU07QUFBQSxJQUNOLE1BQU07QUFBQSxJQUNOLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFrSWEsU0FBaUIsVUFBVTtBQUFBOztBQ3RKeEM7QUFBQSxJQVVhLE9BQU8sQ0FBSSxVQUErQixHQUFHLEtBQUssR0FHbEQsUUFBUSxDQUF5QixVQUFtQyxJQUFJLEtBQUssR0FHN0UsWUFBWSxDQUFJLFVBQW9DLFFBQVEsS0FBSyxHQUdqRSxhQUFhLENBQXlCLFVBQ2pELFNBQVMsS0FBSyxHQUdILGNBQWMsQ0FDekIsU0FDQSxnQkFDMEIsWUFBWSxZQUFZLFNBQVMsV0FBVyxHQUczRCxpQkFBaUIsQ0FBSSxZQUNoQyxZQUFZLFFBQVEsT0FBTztBQUFBOzs7O0VDN0I3QjtBQUFBOzs7SUN1QmEsb0JBY0EsaUJBQWlCLFVBTWpCLDJCQUEyQjtBQUFBO0FBQUEsRUFwQjNCLHFCQUFnQztBQUFBLElBQzNDLFNBQVM7QUFBQSxJQUNULFlBQVk7QUFBQSxJQUNaLGVBQWU7QUFBQSxJQUNmLFlBQVk7QUFBQSxJQUNaLGVBQWU7QUFBQSxJQUNmLGdCQUFnQjtBQUFBLEVBQ2xCO0FBQUE7OztBQ2pCTyxTQUFTLGdCQUFnQixDQUM5QixZQUNBLGNBQ0EsZUFDQSxZQUNRO0FBQUEsRUFDUixNQUFNLFVBQVUsZUFBZSxrQkFBa0IsYUFBYTtBQUFBLEVBQzlELE1BQU0sU0FBUyxLQUFLLE9BQU8sSUFBSSxVQUFVO0FBQUEsRUFDekMsT0FBTyxLQUFLLElBQUksVUFBVSxRQUFRLFVBQVU7QUFBQTtBQU05QyxTQUFTLEtBQUssQ0FBQyxJQUEyQjtBQUFBLEVBQ3hDLE9BQU8sSUFBSSxRQUFRLENBQUMsWUFBWSxXQUFXLFNBQVMsRUFBRSxDQUFDO0FBQUE7QUFjekQsU0FBUyxpQkFBaUIsQ0FBQyxRQUF5QjtBQUFBLEVBQ2xELE9BQU8sVUFBVSxPQUFPLFNBQVM7QUFBQTtBQVduQyxlQUFzQixjQUFjLENBQ2xDLEtBQ0EsU0FBb0Isb0JBQ3BCLFVBQWlDLENBQUMsR0FDZjtBQUFBLEVBQ25CLFFBQVEsVUFBVSxTQUFTLGlCQUFpQjtBQUFBLEVBRTVDLFNBQVMsVUFBVSxFQUFHLFVBQVUsT0FBTyxZQUFZLFdBQVc7QUFBQSxJQUM1RCxJQUFJO0FBQUEsTUFDRixNQUFNLFdBQVcsTUFBTSxNQUFNLEtBQUs7QUFBQSxXQUM3QjtBQUFBLFFBQ0gsUUFBUSxZQUFZLFFBQVEsT0FBTyxPQUFPO0FBQUEsTUFDNUMsQ0FBQztBQUFBLE1BR0QsSUFBSSxXQUFXLENBQUMsU0FBUyxJQUFJO0FBQUEsUUFDM0IsSUFBSSxDQUFDLGtCQUFrQixTQUFTLE1BQU0sR0FBRztBQUFBLFVBQ3ZDLE1BQU0sSUFBSSxNQUFNLFFBQVEsU0FBUyxXQUFXLFNBQVMsWUFBWTtBQUFBLFFBQ25FO0FBQUEsUUFFQSxNQUFNLElBQUksTUFBTSxRQUFRLFNBQVMsV0FBVyxTQUFTLFlBQVk7QUFBQSxNQUNuRTtBQUFBLE1BQ0EsT0FBTztBQUFBLE1BQ1AsT0FBTyxPQUFPO0FBQUEsTUFFZCxJQUFJLGlCQUFpQixTQUFTLE1BQU0sUUFBUSxXQUFXLFFBQVEsR0FBRztBQUFBLFFBQ2hFLE1BQU07QUFBQSxNQUNSO0FBQUEsTUFDQSxJQUFJLFdBQVcsT0FBTyxhQUFhLEdBQUc7QUFBQSxRQUNwQyxNQUFNO0FBQUEsTUFDUjtBQUFBLE1BQ0EsTUFBTSxVQUFVLGlCQUNkLFVBQVUsR0FDVixPQUFPLGVBQ1AsT0FBTyxlQUNQLE9BQU8sVUFDVDtBQUFBLE1BQ0EsTUFBTSxNQUFNLE9BQU87QUFBQTtBQUFBLEVBRXZCO0FBQUEsRUFDQSxNQUFNLElBQUksTUFBTSxhQUFhO0FBQUE7QUFBQTtBQUFBLEVBM0YvQjtBQUFBOzs7QUNFTyxNQUFNLGNBQXNDO0FBQUEsRUFDakM7QUFBQSxFQUdBLEtBQWE7QUFBQSxFQUdiLE9BQWU7QUFBQSxFQUdmLFdBQW1CO0FBQUEsRUFHbkIsWUFBMkI7QUFBQSxFQUczQjtBQUFBLEVBR0EsV0FBcUI7QUFBQSxFQUVyQyxXQUFXLENBQUMsUUFBbUIsSUFBWTtBQUFBLElBQ3pDLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxLQUFLO0FBQUE7QUFBQSxFQUlaLE1BQU0sR0FBWTtBQUFBLElBQ2hCLE9BQU87QUFBQTtBQUFBLEVBRVQsYUFBYSxHQUFZO0FBQUEsSUFDdkIsT0FBTztBQUFBO0FBQUEsRUFFVCxlQUFlLEdBQVk7QUFBQSxJQUN6QixPQUFPO0FBQUE7QUFBQSxFQUVULFdBQVcsR0FBWTtBQUFBLElBQ3JCLE9BQU87QUFBQTtBQUFBLEVBRVQsYUFBYSxHQUFZO0FBQUEsSUFDdkIsT0FBTztBQUFBO0FBQUEsRUFHVCxRQUFRLEdBQVc7QUFBQSxJQUNqQixPQUFPLHNCQUFzQixLQUFLLGtCQUFrQixLQUFLLGdCQUFnQixLQUFLO0FBQUE7QUFFbEY7OztBQzlDTyxNQUFNLFlBQW9DO0FBQUEsRUFDL0I7QUFBQSxFQUdBO0FBQUEsRUFHQSxPQUFlO0FBQUEsRUFHZixXQUFtQjtBQUFBLEVBR25CLFlBQTJCO0FBQUEsRUFHM0IsS0FBb0I7QUFBQSxFQUdwQixXQUFxQjtBQUFBLEVBRXJDLFdBQVcsQ0FBQyxRQUFtQixJQUFZO0FBQUEsSUFDekMsS0FBSyxTQUFTO0FBQUEsSUFDZCxLQUFLLEtBQUs7QUFBQTtBQUFBLEVBSVosTUFBTSxHQUFZO0FBQUEsSUFDaEIsT0FBTztBQUFBO0FBQUEsRUFFVCxhQUFhLEdBQVk7QUFBQSxJQUN2QixPQUFPO0FBQUE7QUFBQSxFQUVULGVBQWUsR0FBWTtBQUFBLElBQ3pCLE9BQU87QUFBQTtBQUFBLEVBRVQsV0FBVyxHQUFZO0FBQUEsSUFDckIsT0FBTztBQUFBO0FBQUEsRUFFVCxhQUFhLEdBQVk7QUFBQSxJQUN2QixPQUFPO0FBQUE7QUFBQSxFQUdULFFBQVEsR0FBVztBQUFBLElBQ2pCLE9BQU8sa0JBQWtCLEtBQUssWUFBWSxLQUFLLGtCQUFrQixLQUFLO0FBQUE7QUFFMUU7OztBQzlDTyxNQUFNLFVBQWtDO0FBQUEsRUFDN0I7QUFBQSxFQUdBLEtBQWE7QUFBQSxFQUdiO0FBQUEsRUFHQSxXQUEwQjtBQUFBLEVBRzFCO0FBQUEsRUFHQSxLQUFvQjtBQUFBLEVBR3BCLFdBQXFCO0FBQUEsRUFFckMsV0FBVyxDQUFDLFFBQW1CLE1BQWMsWUFBMkIsTUFBTTtBQUFBLElBQzVFLEtBQUssU0FBUztBQUFBLElBQ2QsS0FBSyxPQUFPO0FBQUEsSUFDWixLQUFLLFlBQVk7QUFBQTtBQUFBLEVBSW5CLE1BQU0sR0FBWTtBQUFBLElBQ2hCLE9BQU87QUFBQTtBQUFBLEVBRVQsYUFBYSxHQUFZO0FBQUEsSUFDdkIsT0FBTztBQUFBO0FBQUEsRUFFVCxlQUFlLEdBQVk7QUFBQSxJQUN6QixPQUFPO0FBQUE7QUFBQSxFQUVULFdBQVcsR0FBWTtBQUFBLElBQ3JCLE9BQU87QUFBQTtBQUFBLEVBRVQsYUFBYSxHQUFZO0FBQUEsSUFDdkIsT0FBTztBQUFBO0FBQUEsRUFHVCxRQUFRLEdBQVc7QUFBQSxJQUNqQixPQUFPLGtCQUFrQixLQUFLO0FBQUE7QUFFbEM7OztJQzlDYTtBQUFBO0FBQUEsbUJBQXlDO0FBQUEsSUFDcEQsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1YsS0FBVTtBQUFBLElBQ1Ys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
|