1 | import { labels, utils } from '@neo-one/utils-esnext-esm';
|
2 | import { concat, of as _of, timer } from 'rxjs';
|
3 | import { concatMap, shareReplay } from 'rxjs/operators';
|
4 | export class NodeAdapter {
|
5 | constructor({ monitor, name, binary, dataPath, settings, }) {
|
6 | this.monitor = monitor;
|
7 | this.name = name;
|
8 | this.binary = binary;
|
9 | this.dataPath = dataPath;
|
10 | this.mutableSettings = settings;
|
11 | const { rpcAddress, tcpAddress, telemetryAddress } = this.getNodeStatus();
|
12 | this.node$ = concat(_of({
|
13 | name: this.name,
|
14 | ready: false,
|
15 | live: false,
|
16 | rpcAddress,
|
17 | tcpAddress,
|
18 | telemetryAddress,
|
19 | }), timer(0, 500).pipe(concatMap(async () => {
|
20 | const config = this.getNodeStatus();
|
21 | const [ready, live] = await Promise.all([this.isReady(), this.isLive()]);
|
22 | return {
|
23 | name: this.name,
|
24 | ready,
|
25 | live,
|
26 | rpcAddress: config.rpcAddress,
|
27 | tcpAddress: config.tcpAddress,
|
28 | telemetryAddress: config.telemetryAddress,
|
29 | };
|
30 | }))).pipe(shareReplay(1));
|
31 | }
|
32 | getDebug() {
|
33 | return [
|
34 | ['Data Path', this.dataPath],
|
35 | [
|
36 | 'Settings',
|
37 | {
|
38 | type: 'describe',
|
39 | table: [
|
40 | ['Type', this.mutableSettings.type],
|
41 | [
|
42 | 'Is Test Net',
|
43 | this.mutableSettings.isTestNet === undefined ? "'null'" : JSON.stringify(this.mutableSettings.isTestNet),
|
44 | ],
|
45 | [
|
46 | 'Seconds Per Block',
|
47 | this.mutableSettings.secondsPerBlock === undefined
|
48 | ? "'null'"
|
49 | : JSON.stringify(this.mutableSettings.secondsPerBlock),
|
50 | ],
|
51 | [
|
52 | 'Standby Validators',
|
53 | this.mutableSettings.standbyValidators === undefined
|
54 | ? "'null'"
|
55 | : JSON.stringify(this.mutableSettings.standbyValidators, undefined, 2),
|
56 | ],
|
57 | [
|
58 | 'Address',
|
59 | this.mutableSettings.address === undefined ? "'null'" : JSON.stringify(this.mutableSettings.address),
|
60 | ],
|
61 | ['RPC Port', JSON.stringify(this.mutableSettings.rpcPort)],
|
62 | ['Listen TCP Port', JSON.stringify(this.mutableSettings.listenTCPPort)],
|
63 | ['Telemetry Port', JSON.stringify(this.mutableSettings.telemetryPort)],
|
64 | ['Consensus Enabled', this.mutableSettings.consensus.enabled ? 'Yes' : 'No'],
|
65 | ['Consensus Private Key', this.mutableSettings.consensus.options.privateKey],
|
66 | ['Seeds', JSON.stringify(this.mutableSettings.seeds, undefined, 2)],
|
67 | ['RPC Endpoints', JSON.stringify(this.mutableSettings.rpcEndpoints, undefined, 2)],
|
68 | ],
|
69 | },
|
70 | ],
|
71 | ];
|
72 | }
|
73 | async create() {
|
74 | await this.monitor.withData({ [labels.NODE_NAME]: this.name }).captureLog(async () => this.createInternal(), {
|
75 | name: 'neo_node_adapter_create',
|
76 | message: `Created node ${this.name}`,
|
77 | error: `Failed to create node ${this.name}`,
|
78 | });
|
79 | }
|
80 | async update(settings) {
|
81 | await this.monitor.withData({ [labels.NODE_NAME]: this.name }).captureLog(async () => {
|
82 | await this.updateInternal(settings);
|
83 | this.mutableSettings = settings;
|
84 | }, {
|
85 | name: 'neo_node_adapter_update',
|
86 | message: `Updated node ${this.name}`,
|
87 | error: `Failed to update node ${this.name}`,
|
88 | });
|
89 | }
|
90 | async start() {
|
91 | await this.monitor.withData({ [labels.NODE_NAME]: this.name }).captureLog(async () => {
|
92 | await this.startInternal();
|
93 | }, {
|
94 | name: 'neo_node_adapter_start',
|
95 | message: `Started node ${this.name}`,
|
96 | error: `Failed to start node ${this.name}`,
|
97 | });
|
98 | }
|
99 | async stop() {
|
100 | await this.monitor.withData({ [labels.NODE_NAME]: this.name }).captureLog(async () => {
|
101 | await this.stopInternal();
|
102 | }, {
|
103 | name: 'neo_node_adapter_stop',
|
104 | message: `Stopped node ${this.name}`,
|
105 | error: `Failed to stop node ${this.name}`,
|
106 | });
|
107 | }
|
108 | async live(timeoutSeconds) {
|
109 | const start = utils.nowSeconds();
|
110 | // tslint:disable-next-line no-loop-statement
|
111 | while (utils.nowSeconds() - start < timeoutSeconds) {
|
112 | const isLive = await this.isLive();
|
113 | if (isLive) {
|
114 | return;
|
115 | }
|
116 | await new Promise((resolve) => setTimeout(resolve, 50));
|
117 | }
|
118 | throw new Error(`Node ${this.name} did not start.`);
|
119 | }
|
120 | async ready(timeoutSeconds) {
|
121 | const start = utils.nowSeconds();
|
122 | // tslint:disable-next-line no-loop-statement
|
123 | while (utils.nowSeconds() - start < timeoutSeconds) {
|
124 | const isLive = await this.isReady();
|
125 | if (isLive) {
|
126 | return;
|
127 | }
|
128 | await new Promise((resolve) => setTimeout(resolve, 50));
|
129 | }
|
130 | throw new Error(`Node ${this.name} is not ready.`);
|
131 | }
|
132 | }
|
133 |
|
134 | //# sourceMappingURL=data:application/json;charset=utf8;base64,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LEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBc0I7UUFDdkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pDLDZDQUE2QztRQUM3QyxPQUFPLEtBQUssQ0FBQyxVQUFVLEVBQUUsR0FBRyxLQUFLLEdBQUcsY0FBYyxFQUFFO1lBQ2xELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3BDLElBQUksTUFBTSxFQUFFO2dCQUNWLE9BQU87YUFDUjtZQUVELE1BQU0sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUMvRDtRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3JELENBQUM7Q0FRRiIsImZpbGUiOiJuZW8tb25lLXNlcnZlci1wbHVnaW4tbmV0d29yay9zcmMvbm9kZS9Ob2RlQWRhcHRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vbml0b3IgfSBmcm9tICdAbmVvLW9uZS9tb25pdG9yJztcbmltcG9ydCB7IEJpbmFyeSwgRGVzY3JpYmVUYWJsZSB9IGZyb20gJ0BuZW8tb25lL3NlcnZlci1wbHVnaW4nO1xuaW1wb3J0IHsgbGFiZWxzLCB1dGlscyB9IGZyb20gJ0BuZW8tb25lL3V0aWxzJztcbmltcG9ydCB7IGNvbmNhdCwgT2JzZXJ2YWJsZSwgb2YgYXMgX29mLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY29uY2F0TWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE5vZGVTZXR0aW5ncyB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBOb2RlIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsaXZlOiBib29sZWFuO1xuICByZWFkb25seSByZWFkeTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcnBjQWRkcmVzczogc3RyaW5nO1xuICByZWFkb25seSB0Y3BBZGRyZXNzOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRlbGVtZXRyeUFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlU3RhdHVzIHtcbiAgcmVhZG9ubHkgcnBjQWRkcmVzczogc3RyaW5nO1xuICByZWFkb25seSB0Y3BBZGRyZXNzOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRlbGVtZXRyeUFkZHJlc3M6IHN0cmluZztcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5vZGVBZGFwdGVyIHtcbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IG5vZGUkOiBPYnNlcnZhYmxlPE5vZGU+O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYmluYXJ5OiBCaW5hcnk7XG4gIHByb3RlY3RlZCByZWFkb25seSBkYXRhUGF0aDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbW9uaXRvcjogTW9uaXRvcjtcbiAgcHJvdGVjdGVkIG11dGFibGVTZXR0aW5nczogTm9kZVNldHRpbmdzO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih7XG4gICAgbW9uaXRvcixcbiAgICBuYW1lLFxuICAgIGJpbmFyeSxcbiAgICBkYXRhUGF0aCxcbiAgICBzZXR0aW5ncyxcbiAgfToge1xuICAgIHJlYWRvbmx5IG1vbml0b3I6IE1vbml0b3I7XG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGJpbmFyeTogQmluYXJ5O1xuICAgIHJlYWRvbmx5IGRhdGFQYXRoOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgc2V0dGluZ3M6IE5vZGVTZXR0aW5ncztcbiAgfSkge1xuICAgIHRoaXMubW9uaXRvciA9IG1vbml0b3I7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmJpbmFyeSA9IGJpbmFyeTtcbiAgICB0aGlzLmRhdGFQYXRoID0gZGF0YVBhdGg7XG5cbiAgICB0aGlzLm11dGFibGVTZXR0aW5ncyA9IHNldHRpbmdzO1xuXG4gICAgY29uc3QgeyBycGNBZGRyZXNzLCB0Y3BBZGRyZXNzLCB0ZWxlbWV0cnlBZGRyZXNzIH0gPSB0aGlzLmdldE5vZGVTdGF0dXMoKTtcbiAgICB0aGlzLm5vZGUkID0gY29uY2F0KFxuICAgICAgX29mKHtcbiAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICByZWFkeTogZmFsc2UsXG4gICAgICAgIGxpdmU6IGZhbHNlLFxuICAgICAgICBycGNBZGRyZXNzLFxuICAgICAgICB0Y3BBZGRyZXNzLFxuICAgICAgICB0ZWxlbWV0cnlBZGRyZXNzLFxuICAgICAgfSksXG4gICAgICB0aW1lcigwLCA1MDApLnBpcGUoXG4gICAgICAgIGNvbmNhdE1hcChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXROb2RlU3RhdHVzKCk7XG4gICAgICAgICAgY29uc3QgW3JlYWR5LCBsaXZlXSA9IGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLmlzUmVhZHkoKSwgdGhpcy5pc0xpdmUoKV0pO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIHJlYWR5LFxuICAgICAgICAgICAgbGl2ZSxcbiAgICAgICAgICAgIHJwY0FkZHJlc3M6IGNvbmZpZy5ycGNBZGRyZXNzLFxuICAgICAgICAgICAgdGNwQWRkcmVzczogY29uZmlnLnRjcEFkZHJlc3MsXG4gICAgICAgICAgICB0ZWxlbWV0cnlBZGRyZXNzOiBjb25maWcudGVsZW1ldHJ5QWRkcmVzcyxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREZWJ1ZygpOiBEZXNjcmliZVRhYmxlIHtcbiAgICByZXR1cm4gW1xuICAgICAgWydEYXRhIFBhdGgnLCB0aGlzLmRhdGFQYXRoXSxcbiAgICAgIFtcbiAgICAgICAgJ1NldHRpbmdzJyxcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICdkZXNjcmliZScsXG4gICAgICAgICAgdGFibGU6IFtcbiAgICAgICAgICAgIFsnVHlwZScsIHRoaXMubXV0YWJsZVNldHRpbmdzLnR5cGVdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAnSXMgVGVzdCBOZXQnLFxuICAgICAgICAgICAgICB0aGlzLm11dGFibGVTZXR0aW5ncy5pc1Rlc3ROZXQgPT09IHVuZGVmaW5lZCA/IFwiJ251bGwnXCIgOiBKU09OLnN0cmluZ2lmeSh0aGlzLm11dGFibGVTZXR0aW5ncy5pc1Rlc3ROZXQpLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgJ1NlY29uZHMgUGVyIEJsb2NrJyxcbiAgICAgICAgICAgICAgdGhpcy5tdXRhYmxlU2V0dGluZ3Muc2Vjb25kc1BlckJsb2NrID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IFwiJ251bGwnXCJcbiAgICAgICAgICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHRoaXMubXV0YWJsZVNldHRpbmdzLnNlY29uZHNQZXJCbG9jayksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAnU3RhbmRieSBWYWxpZGF0b3JzJyxcbiAgICAgICAgICAgICAgdGhpcy5tdXRhYmxlU2V0dGluZ3Muc3RhbmRieVZhbGlkYXRvcnMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8gXCInbnVsbCdcIlxuICAgICAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkodGhpcy5tdXRhYmxlU2V0dGluZ3Muc3RhbmRieVZhbGlkYXRvcnMsIHVuZGVmaW5lZCwgMiksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAnQWRkcmVzcycsXG4gICAgICAgICAgICAgIHRoaXMubXV0YWJsZVNldHRpbmdzLmFkZHJlc3MgPT09IHVuZGVmaW5lZCA/IFwiJ251bGwnXCIgOiBKU09OLnN0cmluZ2lmeSh0aGlzLm11dGFibGVTZXR0aW5ncy5hZGRyZXNzKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbJ1JQQyBQb3J0JywgSlNPTi5zdHJpbmdpZnkodGhpcy5tdXRhYmxlU2V0dGluZ3MucnBjUG9ydCldLFxuICAgICAgICAgICAgWydMaXN0ZW4gVENQIFBvcnQnLCBKU09OLnN0cmluZ2lmeSh0aGlzLm11dGFibGVTZXR0aW5ncy5saXN0ZW5UQ1BQb3J0KV0sXG4gICAgICAgICAgICBbJ1RlbGVtZXRyeSBQb3J0JywgSlNPTi5zdHJpbmdpZnkodGhpcy5tdXRhYmxlU2V0dGluZ3MudGVsZW1ldHJ5UG9ydCldLFxuICAgICAgICAgICAgWydDb25zZW5zdXMgRW5hYmxlZCcsIHRoaXMubXV0YWJsZVNldHRpbmdzLmNvbnNlbnN1cy5lbmFibGVkID8gJ1llcycgOiAnTm8nXSxcbiAgICAgICAgICAgIFsnQ29uc2Vuc3VzIFByaXZhdGUgS2V5JywgdGhpcy5tdXRhYmxlU2V0dGluZ3MuY29uc2Vuc3VzLm9wdGlvbnMucHJpdmF0ZUtleV0sXG4gICAgICAgICAgICBbJ1NlZWRzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5tdXRhYmxlU2V0dGluZ3Muc2VlZHMsIHVuZGVmaW5lZCwgMildLFxuICAgICAgICAgICAgWydSUEMgRW5kcG9pbnRzJywgSlNPTi5zdHJpbmdpZnkodGhpcy5tdXRhYmxlU2V0dGluZ3MucnBjRW5kcG9pbnRzLCB1bmRlZmluZWQsIDIpXSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICBdO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNyZWF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1vbml0b3Iud2l0aERhdGEoeyBbbGFiZWxzLk5PREVfTkFNRV06IHRoaXMubmFtZSB9KS5jYXB0dXJlTG9nKGFzeW5jICgpID0+IHRoaXMuY3JlYXRlSW50ZXJuYWwoKSwge1xuICAgICAgbmFtZTogJ25lb19ub2RlX2FkYXB0ZXJfY3JlYXRlJyxcbiAgICAgIG1lc3NhZ2U6IGBDcmVhdGVkIG5vZGUgJHt0aGlzLm5hbWV9YCxcbiAgICAgIGVycm9yOiBgRmFpbGVkIHRvIGNyZWF0ZSBub2RlICR7dGhpcy5uYW1lfWAsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgdXBkYXRlKHNldHRpbmdzOiBOb2RlU2V0dGluZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1vbml0b3Iud2l0aERhdGEoeyBbbGFiZWxzLk5PREVfTkFNRV06IHRoaXMubmFtZSB9KS5jYXB0dXJlTG9nKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZUludGVybmFsKHNldHRpbmdzKTtcbiAgICAgICAgdGhpcy5tdXRhYmxlU2V0dGluZ3MgPSBzZXR0aW5ncztcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICduZW9fbm9kZV9hZGFwdGVyX3VwZGF0ZScsXG4gICAgICAgIG1lc3NhZ2U6IGBVcGRhdGVkIG5vZGUgJHt0aGlzLm5hbWV9YCxcbiAgICAgICAgZXJyb3I6IGBGYWlsZWQgdG8gdXBkYXRlIG5vZGUgJHt0aGlzLm5hbWV9YCxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1vbml0b3Iud2l0aERhdGEoeyBbbGFiZWxzLk5PREVfTkFNRV06IHRoaXMubmFtZSB9KS5jYXB0dXJlTG9nKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0SW50ZXJuYWwoKTtcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICduZW9fbm9kZV9hZGFwdGVyX3N0YXJ0JyxcbiAgICAgICAgbWVzc2FnZTogYFN0YXJ0ZWQgbm9kZSAke3RoaXMubmFtZX1gLFxuICAgICAgICBlcnJvcjogYEZhaWxlZCB0byBzdGFydCBub2RlICR7dGhpcy5uYW1lfWAsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1vbml0b3Iud2l0aERhdGEoeyBbbGFiZWxzLk5PREVfTkFNRV06IHRoaXMubmFtZSB9KS5jYXB0dXJlTG9nKFxuICAgICAgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnN0b3BJbnRlcm5hbCgpO1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ25lb19ub2RlX2FkYXB0ZXJfc3RvcCcsXG4gICAgICAgIG1lc3NhZ2U6IGBTdG9wcGVkIG5vZGUgJHt0aGlzLm5hbWV9YCxcbiAgICAgICAgZXJyb3I6IGBGYWlsZWQgdG8gc3RvcCBub2RlICR7dGhpcy5uYW1lfWAsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgZ2V0Tm9kZVN0YXR1cygpOiBOb2RlU3RhdHVzO1xuXG4gIHB1YmxpYyBhc3luYyBsaXZlKHRpbWVvdXRTZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydCA9IHV0aWxzLm5vd1NlY29uZHMoKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1zdGF0ZW1lbnRcbiAgICB3aGlsZSAodXRpbHMubm93U2Vjb25kcygpIC0gc3RhcnQgPCB0aW1lb3V0U2Vjb25kcykge1xuICAgICAgY29uc3QgaXNMaXZlID0gYXdhaXQgdGhpcy5pc0xpdmUoKTtcbiAgICAgIGlmIChpc0xpdmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MCkpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgTm9kZSAke3RoaXMubmFtZX0gZGlkIG5vdCBzdGFydC5gKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWFkeSh0aW1lb3V0U2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3RhcnQgPSB1dGlscy5ub3dTZWNvbmRzKCk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3Atc3RhdGVtZW50XG4gICAgd2hpbGUgKHV0aWxzLm5vd1NlY29uZHMoKSAtIHN0YXJ0IDwgdGltZW91dFNlY29uZHMpIHtcbiAgICAgIGNvbnN0IGlzTGl2ZSA9IGF3YWl0IHRoaXMuaXNSZWFkeSgpO1xuICAgICAgaWYgKGlzTGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwKSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBOb2RlICR7dGhpcy5uYW1lfSBpcyBub3QgcmVhZHkuYCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYXN5bmMgaXNMaXZlKCk6IFByb21pc2U8Ym9vbGVhbj47XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhc3luYyBpc1JlYWR5KCk6IFByb21pc2U8Ym9vbGVhbj47XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhc3luYyBjcmVhdGVJbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYXN5bmMgdXBkYXRlSW50ZXJuYWwoX3NldHRpbmdzOiBOb2RlU2V0dGluZ3MpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYXN5bmMgc3RhcnRJbnRlcm5hbCgpOiBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgYXN5bmMgc3RvcEludGVybmFsKCk6IFByb21pc2U8dm9pZD47XG59XG4iXX0=
|