ngx-kel-agent 0.4.10 → 0.5.3

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.
@@ -0,0 +1,18 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ import * as i0 from "@angular/core";
4
+ export class AgentMessageService {
5
+ constructor() {
6
+ this.rxMessage$ = new Subject();
7
+ this.txMessage$ = new Subject();
8
+ }
9
+ }
10
+ AgentMessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
11
+ AgentMessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, providedIn: 'root' });
12
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentMessageService, decorators: [{
13
+ type: Injectable,
14
+ args: [{
15
+ providedIn: 'root',
16
+ }]
17
+ }], ctorParameters: function () { return []; } });
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQtbWVzc2FnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWtlbC1hZ2VudC9zcmMvbGliL2FnZW50LW1lc3NhZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBSy9CLE1BQU0sT0FBTyxtQkFBbUI7SUFJOUI7UUFIQSxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztRQUNoQyxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQU8sQ0FBQztJQUVqQixDQUFDOztnSEFKTCxtQkFBbUI7b0hBQW5CLG1CQUFtQixjQUZsQixNQUFNOzJGQUVQLG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBBZ2VudE1lc3NhZ2VTZXJ2aWNlIHtcbiAgcnhNZXNzYWdlJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcbiAgdHhNZXNzYWdlJCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG59XG4iXX0=
@@ -1,36 +1,19 @@
1
+ import { BehaviorSubject } from 'rxjs';
1
2
  import { Injectable } from '@angular/core';
2
- import { BehaviorSubject, ReplaySubject, Subject, } from "rxjs";
3
- import { debounceTime, delay, retryWhen, tap } from "rxjs/operators";
4
- import { webSocket } from "rxjs/webSocket";
3
+ import { WsjtxService } from './wsjtx.service';
4
+ import { delay, retryWhen, tap } from 'rxjs/operators';
5
+ import { webSocket } from 'rxjs/webSocket';
5
6
  import * as i0 from "@angular/core";
7
+ import * as i1 from "./agent-message.service";
8
+ import * as i2 from "./hamlib.service";
9
+ import * as i3 from "./wsjtx.service";
6
10
  export class AgentService {
7
- constructor() {
11
+ constructor(messages, hamlibService, wsjtxService) {
12
+ this.messages = messages;
13
+ this.hamlibService = hamlibService;
14
+ this.wsjtxService = wsjtxService;
8
15
  /** Whether we're connected to the agent. */
9
16
  this.connectedState$ = new BehaviorSubject(false);
10
- /* WSJT-X */
11
- /** Whether we're getting any messages from WSJT-X. */
12
- this.wsjtxState$ = new BehaviorSubject(false);
13
- /** Subject for listening to WSJT-X "Heartbeat" messages. */
14
- this.wsjtxHeartbeat$ = new ReplaySubject(1);
15
- /** Subject for listening to WSJT-X "Status" messages. */
16
- this.wsjtxStatus$ = new ReplaySubject(1);
17
- /** Subject for listening to WSJT-X "Decode" messages. */
18
- this.wsjtxDecode$ = new Subject();
19
- /** Subject for listening to WSJT-X "Clear" messages. */
20
- this.wsjtxClear$ = new Subject();
21
- /** Subject for listening to WSJT-X "QsoLogged" messages. */
22
- this.wsjtxQsoLogged$ = new Subject();
23
- /** Subject for listening to WSJT-X "Close" messages. */
24
- this.wsjtxClose$ = new Subject();
25
- /** Subject for listening to WSJT-X "WsprDecode" messages. */
26
- this.wsjtxWsprDecode$ = new Subject();
27
- /** Subject for listening to WSJT-X "LoggedAdif" messages. */
28
- this.wsjtxLoggedAdif$ = new Subject();
29
- /* Hamlib */
30
- /** Whether we're getting any messages from Hamlib. */
31
- this.hamlibState$ = new BehaviorSubject(false);
32
- /** Subject for listening to Hamlib "RigState" messages. */
33
- this.hamlibRigState$ = new BehaviorSubject(null);
34
17
  this.defaultAgentHost = 'localhost';
35
18
  this.defaultAgentPort = 8081;
36
19
  this.localStorageHostKey = 'agent-host';
@@ -39,44 +22,24 @@ export class AgentService {
39
22
  this.agentPort = this.defaultAgentPort;
40
23
  this.agentWebSocketSubject = null;
41
24
  this.agentWebsocketSubscription = null;
42
- this.wsjtxId = 'WSJT-X';
25
+ this.hamlibState$ = this.hamlibService.connected$;
26
+ this.hamlibRigState$ = this.hamlibService.rigState$;
27
+ this.wsjtxState$ = this.wsjtxService.connected$;
28
+ this.wsjtxHeartbeat$ = this.wsjtxService.heartbeat$;
29
+ this.wsjtxStatus$ = this.wsjtxService.status$;
30
+ this.wsjtxDecode$ = this.wsjtxService.decode$;
31
+ this.wsjtxClear$ = this.wsjtxService.clear$;
32
+ this.wsjtxQsoLogged$ = this.wsjtxService.qsoLogged$;
33
+ this.wsjtxClose$ = this.wsjtxService.close$;
34
+ this.wsjtxWsprDecode$ = this.wsjtxService.wsprDecode$;
35
+ this.wsjtxLoggedAdif$ = this.wsjtxService.loggedAdif$;
43
36
  }
44
37
  init() {
38
+ this.messages.txMessage$.subscribe((msg) => this.send(msg));
45
39
  this.agentHost = this.getHost();
46
40
  this.agentPort = this.getPort();
47
- this.setupWsjtxBehaviors();
48
- this.setupHamlibBehaviors();
49
41
  this.connect();
50
42
  }
51
- setupWsjtxBehaviors() {
52
- // if we haven't heard from WSJT-X in 15 seconds, consider it "down"
53
- this.wsjtxState$
54
- .pipe(debounceTime(15000))
55
- .subscribe(() => this.wsjtxState$.next(false));
56
- // When WSJT-X announces it's closing, set it to "down" immediately
57
- this.wsjtxClose$.subscribe(() => {
58
- this.wsjtxState$.next(false);
59
- });
60
- // When WSJT-X goes down, clear its persistent message subjects
61
- this.wsjtxState$.subscribe((isUp) => {
62
- if (!isUp) {
63
- this.wsjtxHeartbeat$.next(null);
64
- this.wsjtxStatus$.next(null);
65
- }
66
- });
67
- }
68
- setupHamlibBehaviors() {
69
- // if we haven't heard from Hamlib in 15 seconds, consider it down
70
- this.hamlibState$.pipe(debounceTime(15000)).subscribe(() => {
71
- this.hamlibState$.next(false);
72
- });
73
- // When Hamlib goes down, clear its persistent message subjects
74
- this.hamlibState$.subscribe((isUp) => {
75
- if (!isUp) {
76
- this.hamlibRigState$.next(null);
77
- }
78
- });
79
- }
80
43
  /** Connect (or reconnect) the websocket to the kel-agent server. */
81
44
  connect() {
82
45
  if (this.agentWebsocketSubscription) {
@@ -96,55 +59,15 @@ export class AgentService {
96
59
  .subscribe({
97
60
  next: (msg) => {
98
61
  this.connectedState$.next(true);
99
- this.handleMessage(msg);
62
+ this.messages.rxMessage$.next(msg);
100
63
  },
101
64
  error: () => this.connectedState$.next(false),
102
65
  complete: () => this.connectedState$.next(false),
103
66
  });
104
67
  }
105
- handleMessage(msg) {
106
- if (msg.wsjtx != null && msg.wsjtx.type != null) {
107
- this.wsjtxState$.next(true);
108
- this.wsjtxId = msg.wsjtx.payload.id;
109
- switch (msg.wsjtx.type) {
110
- case 'HeartbeatMessage':
111
- this.wsjtxHeartbeat$.next(msg.wsjtx.payload);
112
- return;
113
- case 'StatusMessage':
114
- this.wsjtxStatus$.next(msg.wsjtx.payload);
115
- return;
116
- case 'DecodeMessage':
117
- this.wsjtxDecode$.next(msg.wsjtx.payload);
118
- return;
119
- case 'ClearMessage':
120
- this.wsjtxClear$.next(msg.wsjtx.payload);
121
- return;
122
- case 'QsoLoggedMessage':
123
- this.wsjtxQsoLogged$.next(msg.wsjtx.payload);
124
- return;
125
- case 'CloseMessage':
126
- this.wsjtxClose$.next(msg.wsjtx.payload);
127
- return;
128
- case 'WSPRDecodeMessage':
129
- this.wsjtxWsprDecode$.next(msg.wsjtx.payload);
130
- return;
131
- case 'LoggedAdifMessage':
132
- this.wsjtxLoggedAdif$.next(msg.wsjtx.payload);
133
- return;
134
- }
135
- }
136
- if (msg.hamlib !== null) {
137
- this.hamlibState$.next(true);
138
- switch (msg.hamlib.type) {
139
- case 'RigState':
140
- this.hamlibRigState$.next(msg.hamlib.payload);
141
- return;
142
- }
143
- }
144
- }
145
68
  /** Get the currently configured kel-agent host. */
146
69
  getHost() {
147
- return localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost;
70
+ return (localStorage.getItem(this.localStorageHostKey) || this.defaultAgentHost);
148
71
  }
149
72
  /** Get the currently configured kel-agent port. */
150
73
  getPort() {
@@ -168,119 +91,89 @@ export class AgentService {
168
91
  localStorage.setItem(this.localStoragePortKey, String(port));
169
92
  this.connect();
170
93
  }
171
- /** Send a command to WSJT-X to clear the Band Activity window. */
172
- sendWsjtxClearBandActivity() {
173
- const wsMsg = {
174
- wsjtx: {
175
- type: 'ClearMessage',
176
- payload: { id: this.wsjtxId, window: 0 },
177
- },
178
- };
94
+ send(wsMsg) {
179
95
  this.agentWebSocketSubject?.next(wsMsg);
180
96
  }
181
- /** Send a command to WSJT-X to clear the Rx Frequency window. */
97
+ /**
98
+ * Send a command to WSJT-X to clear the Band Activity window.
99
+ *
100
+ * @deprecated Use {@link WsjtxService.clearBandActivity} instead.
101
+ */
102
+ sendWsjtxClearBandActivity() {
103
+ this.wsjtxService.clearBandActivity();
104
+ }
105
+ /**
106
+ * Send a command to WSJT-X to clear the Rx Frequency window.
107
+ *
108
+ * @deprecated Use {@link WsjtxService.clearRxFreqWindow} instead.
109
+ */
182
110
  sendWsjtxClearRxFreqWindow() {
183
- const wsMsg = {
184
- wsjtx: {
185
- type: 'ClearMessage',
186
- payload: { id: this.wsjtxId, window: 1 },
187
- },
188
- };
189
- this.agentWebSocketSubject?.next(wsMsg);
111
+ this.wsjtxService.clearRxFreqWindow();
190
112
  }
191
- /** Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows. */
113
+ /**
114
+ * Send a command to WSJT-X to clear the Band Activity and Rx Frequency windows.
115
+ *
116
+ * @deprecated Use {@link WsjtxService.clearAll} instead.
117
+ */
192
118
  sendWsjtxClearAll() {
193
- const wsMsg = {
194
- wsjtx: {
195
- type: 'ClearMessage',
196
- payload: { id: this.wsjtxId, window: 2 },
197
- },
198
- };
199
- this.agentWebSocketSubject?.next(wsMsg);
200
- }
201
- /** Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear
202
- * previous WSJT-X decodes. */
119
+ this.wsjtxService.clearAll();
120
+ }
121
+ /**
122
+ * Send a command to WSJT-X to replay messages. Useful for a fresh client that wants to hear
123
+ * previous WSJT-X decodes.
124
+ *
125
+ * @deprecated Use {@link WsjtxService.replay} instead.
126
+ */
203
127
  sendWsjtxReplay() {
204
- const wsMsg = {
205
- wsjtx: {
206
- type: 'ReplayMessage',
207
- payload: { id: this.wsjtxId },
208
- },
209
- };
210
- this.agentWebSocketSubject?.next(wsMsg);
128
+ this.wsjtxService.replay();
211
129
  }
212
- /** Send a command to WSJT-X to halt any transmissions immediately. */
130
+ /**
131
+ * Send a command to WSJT-X to halt any transmissions immediately.
132
+ *
133
+ * @deprecated Use {@link WsjtxService.haltTxNow} instead.
134
+ */
213
135
  sendWsjtxHaltTxNow() {
214
- const wsMsg = {
215
- wsjtx: {
216
- type: 'HaltTxMessage',
217
- payload: { id: this.wsjtxId, autoTxOnly: false },
218
- },
219
- };
220
- this.agentWebSocketSubject?.next(wsMsg);
136
+ this.wsjtxService.haltTxNow();
221
137
  }
222
- /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round. */
138
+ /** Send a command to WSJT-X to stop auto-transmitting after finishing the current round.
139
+ *
140
+ * @deprecated Use {@link WsjtxService.haltTxAfterCurrent} instead.
141
+ */
223
142
  sendWsjtxHaltTxAfterCurrent() {
224
- const wsMsg = {
225
- wsjtx: {
226
- type: 'HaltTxMessage',
227
- payload: { id: this.wsjtxId, autoTxOnly: true },
228
- },
229
- };
230
- this.agentWebSocketSubject?.next(wsMsg);
143
+ this.wsjtxService.haltTxAfterCurrent();
231
144
  }
232
- /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
145
+ /**
146
+ * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.
147
+ *
148
+ * @deprecated Use {@link WsjtxService.reply} instead.
149
+ */
233
150
  sendWsjtxReply(decode) {
234
- const wsMsg = {
235
- wsjtx: {
236
- type: 'ReplyMessage',
237
- payload: {
238
- id: decode.id,
239
- time: decode.time,
240
- snr: decode.snr,
241
- deltaTime: decode.deltaTime,
242
- deltaFrequency: decode.deltaFrequency,
243
- mode: decode.mode,
244
- message: decode.message,
245
- lowConfidence: decode.lowConfidence,
246
- },
247
- },
248
- };
249
- this.agentWebSocketSubject?.next(wsMsg);
151
+ this.wsjtxService.reply(decode);
250
152
  }
251
- /** Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ. */
153
+ /**
154
+ * Send a command to WSJT-X to reply to the given decode. The message must include CQ or QRZ.
155
+ *
156
+ * @deprecated Use {@link WsjtxService.highlightCallsign} instead.
157
+ */
252
158
  sendWsjtxHighlightCallsign(highlightMsg) {
253
- highlightMsg.id = this.wsjtxId;
254
- const wsMsg = {
255
- wsjtx: {
256
- type: 'HighlightCallsignMessage',
257
- payload: highlightMsg,
258
- },
259
- };
260
- this.agentWebSocketSubject?.next(wsMsg);
261
- }
262
- /** Given a decode message, format a string the same way as displayed in the WSJT-X Band
263
- * Activity/Rx Frequency windows. */
159
+ this.wsjtxService.highlightCallsign(highlightMsg);
160
+ }
161
+ /**
162
+ * Given a decode message, format a string the same way as displayed in the WSJT-X Band
163
+ * Activity/Rx Frequency windows.
164
+ *
165
+ * @deprecated Use {@link WsjtxService.formatDecode} instead.
166
+ */
264
167
  static formatDecode(msg) {
265
- const secondsSinceMidnight = Math.floor(msg.time / 1000);
266
- const hours = Math.floor(secondsSinceMidnight / 3600);
267
- const secondsSinceHour = secondsSinceMidnight - hours * 3600;
268
- const minutes = Math.floor(secondsSinceHour / 60);
269
- const seconds = secondsSinceHour - minutes * 60;
270
- const timeStr = `${hours.toString().padStart(2, '0')}${minutes
271
- .toString()
272
- .padStart(2, '0')}${seconds.toString().padStart(2, '0')}`;
273
- return `${timeStr} ${msg.snr.toString().padStart(3)} ${msg.deltaTime
274
- .toFixed(1)
275
- .padStart(4)} ${msg.deltaFrequency.toString().padStart(4)} ~ ${msg.message}`;
168
+ return WsjtxService.formatDecode(msg);
276
169
  }
277
170
  }
278
- AgentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
171
+ AgentService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, deps: [{ token: i1.AgentMessageService }, { token: i2.HamlibService }, { token: i3.WsjtxService }], target: i0.ɵɵFactoryTarget.Injectable });
279
172
  AgentService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, providedIn: 'root' });
280
173
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: AgentService, decorators: [{
281
174
  type: Injectable,
282
175
  args: [{
283
- providedIn: 'root'
176
+ providedIn: 'root',
284
177
  }]
285
- }], ctorParameters: function () { return []; } });
286
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1rZWwtYWdlbnQvc3JjL2xpYi9hZ2VudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsT0FBTyxHQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM1RSxPQUFPLEVBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFDLFNBQVMsRUFBbUIsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFvQjNELE1BQU0sT0FBTyxZQUFZO0lBMkN2QjtRQTFDQSw0Q0FBNEM7UUFDNUIsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUV0RSxjQUFjO1FBQ2Qsc0RBQXNEO1FBQ3RDLGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDbEUsNERBQTREO1FBQzVDLG9CQUFlLEdBQUcsSUFBSSxhQUFhLENBQXdCLENBQUMsQ0FBQyxDQUFDO1FBQzlFLHlEQUF5RDtRQUN6QyxpQkFBWSxHQUFHLElBQUksYUFBYSxDQUFxQixDQUFDLENBQUMsQ0FBQztRQUN4RSx5REFBeUQ7UUFDekMsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQzFELHdEQUF3RDtRQUN4QyxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFjLENBQUM7UUFDeEQsNERBQTREO1FBQzVDLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQWtCLENBQUM7UUFDaEUsd0RBQXdEO1FBQ3hDLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztRQUN4RCw2REFBNkQ7UUFDN0MscUJBQWdCLEdBQUcsSUFBSSxPQUFPLEVBQW1C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QUcsQ0FBQyxHQUFHLE9BQU87YUFDM0QsUUFBUSxFQUFFO2FBQ1YsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBRTVELE9BQU8sR0FBRyxPQUFPLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLFNBQVM7YUFDakUsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUNWLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FDekQsR0FBRyxDQUFDLE9BQ04sRUFBRSxDQUFDO0lBQ0wsQ0FBQzs7eUdBaFRVLFlBQVk7NkdBQVosWUFBWSxjQUZYLE1BQU07MkZBRVAsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIFJlcGxheVN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbix9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGVsYXksIHJldHJ5V2hlbiwgdGFwfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcbmltcG9ydCB7d2ViU29ja2V0LCBXZWJTb2NrZXRTdWJqZWN0fSBmcm9tIFwicnhqcy93ZWJTb2NrZXRcIjtcbmltcG9ydCB7XG4gIEhhbWxpYlJpZ1N0YXRlLFxuICBXc2p0eENsZWFyLFxuICBXc2p0eENsb3NlLFxuICBXc2p0eERlY29kZSxcbiAgV3NqdHhIYWx0VHgsXG4gIFdzanR4SGVhcnRiZWF0LFxuICBXc2p0eEhpZ2hsaWdodENhbGxzaWduLFxuICBXc2p0eExvZ2dlZEFkaWYsXG4gIFdzanR4UXNvTG9nZ2VkLFxuICBXc2p0eFJlcGxheSxcbiAgV3NqdHhSZXBseSxcbiAgV3NqdHhTdGF0dXMsXG4gIFdzanR4V3NwckRlY29kZVxufSBmcm9tIFwiLi9tZXNzYWdlc1wiO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBZ2VudFNlcnZpY2Uge1xuICAvKiogV2hldGhlciB3ZSdyZSBjb25uZWN0ZWQgdG8gdGhlIGFnZW50LiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29ubmVjdGVkU3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgLyogIFdTSlQtWCAgKi9cbiAgLyoqIFdoZXRoZXIgd2UncmUgZ2V0dGluZyBhbnkgbWVzc2FnZXMgZnJvbSBXU0pULVguICovXG4gIHB1YmxpYyByZWFkb25seSB3c2p0eFN0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkhlYXJ0YmVhdFwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd3NqdHhIZWFydGJlYXQkID0gbmV3IFJlcGxheVN1YmplY3Q8V3NqdHhIZWFydGJlYXQgfCBudWxsPigxKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJTdGF0dXNcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4U3RhdHVzJCA9IG5ldyBSZXBsYXlTdWJqZWN0PFdzanR4U3RhdHVzIHwgbnVsbD4oMSk7XG4gIC8qKiBTdWJqZWN0IGZvciBsaXN0ZW5pbmcgdG8gV1NKVC1YIFwiRGVjb2RlXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSB3c2p0eERlY29kZSQgPSBuZXcgU3ViamVjdDxXc2p0eERlY29kZT4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJDbGVhclwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd3NqdHhDbGVhciQgPSBuZXcgU3ViamVjdDxXc2p0eENsZWFyPigpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIlFzb0xvZ2dlZFwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd3NqdHhRc29Mb2dnZWQkID0gbmV3IFN1YmplY3Q8V3NqdHhRc29Mb2dnZWQ+KCk7XG4gIC8qKiBTdWJqZWN0IGZvciBsaXN0ZW5pbmcgdG8gV1NKVC1YIFwiQ2xvc2VcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4Q2xvc2UkID0gbmV3IFN1YmplY3Q8V3NqdHhDbG9zZT4oKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBXU0pULVggXCJXc3ByRGVjb2RlXCIgbWVzc2FnZXMuICovXG4gIHB1YmxpYyByZWFkb25seSB3c2p0eFdzcHJEZWNvZGUkID0gbmV3IFN1YmplY3Q8V3NqdHhXc3ByRGVjb2RlPigpO1xuICAvKiogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkxvZ2dlZEFkaWZcIiBtZXNzYWdlcy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4TG9nZ2VkQWRpZiQgPSBuZXcgU3ViamVjdDxXc2p0eExvZ2dlZEFkaWY+KCk7XG5cbiAgLyogIEhhbWxpYiAgKi9cbiAgLyoqIFdoZXRoZXIgd2UncmUgZ2V0dGluZyBhbnkgbWVzc2FnZXMgZnJvbSBIYW1saWIuICovXG4gIHB1YmxpYyByZWFkb25seSBoYW1saWJTdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBIYW1saWIgXCJSaWdTdGF0ZVwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGFtbGliUmlnU3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxIYW1saWJSaWdTdGF0ZSB8IG51bGw+KFxuICAgIG51bGxcbiAgKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRBZ2VudEhvc3QgPSAnbG9jYWxob3N0JztcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0QWdlbnRQb3J0ID0gODA4MTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbFN0b3JhZ2VIb3N0S2V5ID0gJ2FnZW50LWhvc3QnO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsU3RvcmFnZVBvcnRLZXkgPSAnYWdlbnQtcG9ydCc7XG5cbiAgcHJpdmF0ZSBhZ2VudEhvc3Q6IHN0cmluZyA9IHRoaXMuZGVmYXVsdEFnZW50SG9zdDtcbiAgcHJpdmF0ZSBhZ2VudFBvcnQ6IG51bWJlciA9IHRoaXMuZGVmYXVsdEFnZW50UG9ydDtcbiAgcHJpdmF0ZSBhZ2VudFdlYlNvY2tldFN1YmplY3Q6IFdlYlNvY2tldFN1YmplY3Q8b2JqZWN0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGFnZW50V2Vic29ja2V0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB3c2p0eElkOiBzdHJpbmcgPSAnV1NKVC1YJztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgfVxuXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYWdlbnRIb3N0ID0gdGhpcy5nZXRIb3N0KCk7XG4gICAgdGhpcy5hZ2VudFBvcnQgPSB0aGlzLmdldFBvcnQoKTtcbiAgICB0aGlzLnNldHVwV3NqdHhCZWhhdmlvcnMoKTtcbiAgICB0aGlzLnNldHVwSGFtbGliQmVoYXZpb3JzKCk7XG4gICAgdGhpcy5jb25uZWN0KCk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwV3NqdHhCZWhhdmlvcnMoKTogdm9pZCB7XG4gICAgLy8gaWYgd2UgaGF2ZW4ndCBoZWFyZCBmcm9tIFdTSlQtWCBpbiAxNSBzZWNvbmRzLCBjb25zaWRlciBpdCBcImRvd25cIlxuICAgIHRoaXMud3NqdHhTdGF0ZSRcbiAgICAgIC5waXBlKGRlYm91bmNlVGltZSgxNTAwMCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMud3NqdHhTdGF0ZSQubmV4dChmYWxzZSkpO1xuICAgIC8vIFdoZW4gV1NKVC1YIGFubm91bmNlcyBpdCdzIGNsb3NpbmcsIHNldCBpdCB0byBcImRvd25cIiBpbW1lZGlhdGVseVxuICAgIHRoaXMud3NqdHhDbG9zZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMud3NqdHhTdGF0ZSQubmV4dChmYWxzZSk7XG4gICAgfSk7XG4gICAgLy8gV2hlbiBXU0pULVggZ29lcyBkb3duLCBjbGVhciBpdHMgcGVyc2lzdGVudCBtZXNzYWdlIHN1YmplY3RzXG4gICAgdGhpcy53c2p0eFN0YXRlJC5zdWJzY3JpYmUoKGlzVXApID0+IHtcbiAgICAgIGlmICghaXNVcCkge1xuICAgICAgICB0aGlzLndzanR4SGVhcnRiZWF0JC5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLndzanR4U3RhdHVzJC5uZXh0KG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cEhhbWxpYkJlaGF2aW9ycygpOiB2b2lkIHtcbiAgICAvLyBpZiB3ZSBoYXZlbid0IGhlYXJkIGZyb20gSGFtbGliIGluIDE1IHNlY29uZHMsIGNvbnNpZGVyIGl0IGRvd25cbiAgICB0aGlzLmhhbWxpYlN0YXRlJC5waXBlKGRlYm91bmNlVGltZSgxNTAwMCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLmhhbWxpYlN0YXRlJC5uZXh0KGZhbHNlKTtcbiAgICB9KTtcbiAgICAvLyBXaGVuIEhhbWxpYiBnb2VzIGRvd24sIGNsZWFyIGl0cyBwZXJzaXN0ZW50IG1lc3NhZ2Ugc3ViamVjdHNcbiAgICB0aGlzLmhhbWxpYlN0YXRlJC5zdWJzY3JpYmUoKGlzVXApID0+IHtcbiAgICAgIGlmICghaXNVcCkge1xuICAgICAgICB0aGlzLmhhbWxpYlJpZ1N0YXRlJC5uZXh0KG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIENvbm5lY3QgKG9yIHJlY29ubmVjdCkgdGhlIHdlYnNvY2tldCB0byB0aGUga2VsLWFnZW50IHNlcnZlci4gKi9cbiAgcHVibGljIGNvbm5lY3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWdlbnRXZWJzb2NrZXRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYWdlbnRXZWJzb2NrZXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5hZ2VudEhvc3QgPSB0aGlzLmdldEhvc3QoKTtcbiAgICB0aGlzLmFnZW50UG9ydCA9IHRoaXMuZ2V0UG9ydCgpO1xuICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5hZ2VudEhvc3QgPT09ICdsb2NhbGhvc3QnID8gJ3dzOi8vJyA6ICd3c3M6Ly8nO1xuICAgIHRoaXMuYWdlbnRXZWJTb2NrZXRTdWJqZWN0ID0gd2ViU29ja2V0PG9iamVjdD4oe1xuICAgICAgdXJsOiBwcm90b2NvbCArIHRoaXMuYWdlbnRIb3N0ICsgJzonICsgdGhpcy5hZ2VudFBvcnQgKyAnL3dlYnNvY2tldCcsXG4gICAgfSk7XG4gICAgdGhpcy5jb25uZWN0ZWRTdGF0ZSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmFnZW50V2Vic29ja2V0U3Vic2NyaXB0aW9uID0gdGhpcy5hZ2VudFdlYlNvY2tldFN1YmplY3RcbiAgICAgIC5waXBlKFxuICAgICAgICByZXRyeVdoZW4oKGVycm9ycykgPT5cbiAgICAgICAgICAvLyByZXRyeSB0aGUgd2Vic29ja2V0IGNvbm5lY3Rpb24gYWZ0ZXIgMTAgc2Vjb25kc1xuICAgICAgICAgIGVycm9ycy5waXBlKFxuICAgICAgICAgICAgdGFwKCgpID0+IHRoaXMuY29ubmVjdGVkU3RhdGUkLm5leHQoZmFsc2UpKSxcbiAgICAgICAgICAgIGRlbGF5KDEwMDAwKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChtc2cpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbm5lY3RlZFN0YXRlJC5uZXh0KHRydWUpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlTWVzc2FnZShtc2cpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4gdGhpcy5jb25uZWN0ZWRTdGF0ZSQubmV4dChmYWxzZSksXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB0aGlzLmNvbm5lY3RlZFN0YXRlJC5uZXh0KGZhbHNlKSxcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNZXNzYWdlKG1zZzogYW55KTogdm9pZCB7XG4gICAgaWYgKG1zZy53c2p0eCAhPSBudWxsICYmIG1zZy53c2p0eC50eXBlICE9IG51bGwpIHtcbiAgICAgIHRoaXMud3NqdHhTdGF0ZSQubmV4dCh0cnVlKTtcbiAgICAgIHRoaXMud3NqdHhJZCA9IG1zZy53c2p0eC5wYXlsb2FkLmlkO1xuICAgICAgc3dpdGNoIChtc2cud3NqdHgudHlwZSkge1xuICAgICAgICBjYXNlICdIZWFydGJlYXRNZXNzYWdlJzpcbiAgICAgICAgICB0aGlzLndzanR4SGVhcnRiZWF0JC5uZXh0KG1zZy53c2p0eC5wYXlsb2FkIGFzIFdzanR4SGVhcnRiZWF0KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ1N0YXR1c01lc3NhZ2UnOlxuICAgICAgICAgIHRoaXMud3NqdHhTdGF0dXMkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhTdGF0dXMpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSAnRGVjb2RlTWVzc2FnZSc6XG4gICAgICAgICAgdGhpcy53c2p0eERlY29kZSQubmV4dChtc2cud3NqdHgucGF5bG9hZCBhcyBXc2p0eERlY29kZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdDbGVhck1lc3NhZ2UnOlxuICAgICAgICAgIHRoaXMud3NqdHhDbGVhciQubmV4dChtc2cud3NqdHgucGF5bG9hZCBhcyBXc2p0eENsZWFyKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ1Fzb0xvZ2dlZE1lc3NhZ2UnOlxuICAgICAgICAgIHRoaXMud3NqdHhRc29Mb2dnZWQkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhRc29Mb2dnZWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSAnQ2xvc2VNZXNzYWdlJzpcbiAgICAgICAgICB0aGlzLndzanR4Q2xvc2UkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhDbG9zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjYXNlICdXU1BSRGVjb2RlTWVzc2FnZSc6XG4gICAgICAgICAgdGhpcy53c2p0eFdzcHJEZWNvZGUkLm5leHQobXNnLndzanR4LnBheWxvYWQgYXMgV3NqdHhXc3ByRGVjb2RlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgJ0xvZ2dlZEFkaWZNZXNzYWdlJzpcbiAgICAgICAgICB0aGlzLndzanR4TG9nZ2VkQWRpZiQubmV4dChtc2cud3NqdHgucGF5bG9hZCBhcyBXc2p0eExvZ2dlZEFkaWYpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1zZy5oYW1saWIgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuaGFtbGliU3RhdGUkLm5leHQodHJ1ZSk7XG4gICAgICBzd2l0Y2ggKG1zZy5oYW1saWIudHlwZSkge1xuICAgICAgICBjYXNlICdSaWdTdGF0ZSc6XG4gICAgICAgICAgdGhpcy5oYW1saWJSaWdTdGF0ZSQubmV4dChtc2cuaGFtbGliLnBheWxvYWQgYXMgSGFtbGliUmlnU3RhdGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogR2V0IHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBrZWwtYWdlbnQgaG9zdC4gKi9cbiAgcHVibGljIGdldEhvc3QoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5sb2NhbFN0b3JhZ2VIb3N0S2V5KSB8fCB0aGlzLmRlZmF1bHRBZ2VudEhvc3Q7XG4gIH1cblxuICAvKiogR2V0IHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBrZWwtYWdlbnQgcG9ydC4gKi9cbiAgcHVibGljIGdldFBvcnQoKTogbnVtYmVyIHtcbiAgICBsZXQgcG9ydFN0ciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlUG9ydEtleSk7XG4gICAgaWYgKHBvcnRTdHIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEFnZW50UG9ydDtcbiAgICB9XG4gICAgbGV0IHBvcnROdW0gPSBwYXJzZUludChwb3J0U3RyLCAxMCk7XG4gICAgaWYgKGlzTmFOKHBvcnROdW0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWZhdWx0QWdlbnRQb3J0O1xuICAgIH1cbiAgICByZXR1cm4gcG9ydE51bTtcbiAgfVxuXG4gIC8qKiBTZXQgdGhlIGtlbC1hZ2VudCBob3N0LiAqL1xuICBwdWJsaWMgc2V0SG9zdChob3N0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUhvc3RLZXksIGhvc3QpO1xuICAgIHRoaXMuY29ubmVjdCgpO1xuICB9XG5cbiAgLyoqIFNldCB0aGUga2VsLWFnZW50IHBvcnQuICovXG4gIHB1YmxpYyBzZXRQb3J0KHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlUG9ydEtleSwgU3RyaW5nKHBvcnQpKTtcbiAgICB0aGlzLmNvbm5lY3QoKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gY2xlYXIgdGhlIEJhbmQgQWN0aXZpdHkgd2luZG93LiAqL1xuICBwdWJsaWMgc2VuZFdzanR4Q2xlYXJCYW5kQWN0aXZpdHkoKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnQ2xlYXJNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4Q2xlYXI+e2lkOiB0aGlzLndzanR4SWQsIHdpbmRvdzogMH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5hZ2VudFdlYlNvY2tldFN1YmplY3Q/Lm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byBjbGVhciB0aGUgUnggRnJlcXVlbmN5IHdpbmRvdy4gKi9cbiAgcHVibGljIHNlbmRXc2p0eENsZWFyUnhGcmVxV2luZG93KCkge1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ0NsZWFyTWVzc2FnZScsXG4gICAgICAgIHBheWxvYWQ6IDxXc2p0eENsZWFyPntpZDogdGhpcy53c2p0eElkLCB3aW5kb3c6IDF9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuYWdlbnRXZWJTb2NrZXRTdWJqZWN0Py5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gY2xlYXIgdGhlIEJhbmQgQWN0aXZpdHkgYW5kIFJ4IEZyZXF1ZW5jeSB3aW5kb3dzLiAqL1xuICBwdWJsaWMgc2VuZFdzanR4Q2xlYXJBbGwoKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnQ2xlYXJNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4Q2xlYXI+e2lkOiB0aGlzLndzanR4SWQsIHdpbmRvdzogMn0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5hZ2VudFdlYlNvY2tldFN1YmplY3Q/Lm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byByZXBsYXkgbWVzc2FnZXMuIFVzZWZ1bCBmb3IgYSBmcmVzaCBjbGllbnQgdGhhdCB3YW50cyB0byBoZWFyXG4gICAqIHByZXZpb3VzIFdTSlQtWCBkZWNvZGVzLiAqL1xuICBwdWJsaWMgc2VuZFdzanR4UmVwbGF5KCkge1xuICAgIGNvbnN0IHdzTXNnID0ge1xuICAgICAgd3NqdHg6IHtcbiAgICAgICAgdHlwZTogJ1JlcGxheU1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiA8V3NqdHhSZXBsYXk+e2lkOiB0aGlzLndzanR4SWR9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuYWdlbnRXZWJTb2NrZXRTdWJqZWN0Py5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gaGFsdCBhbnkgdHJhbnNtaXNzaW9ucyBpbW1lZGlhdGVseS4gKi9cbiAgcHVibGljIHNlbmRXc2p0eEhhbHRUeE5vdygpIHtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdIYWx0VHhNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4SGFsdFR4PntpZDogdGhpcy53c2p0eElkLCBhdXRvVHhPbmx5OiBmYWxzZX0sXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5hZ2VudFdlYlNvY2tldFN1YmplY3Q/Lm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byBzdG9wIGF1dG8tdHJhbnNtaXR0aW5nIGFmdGVyIGZpbmlzaGluZyB0aGUgY3VycmVudCByb3VuZC4gKi9cbiAgcHVibGljIHNlbmRXc2p0eEhhbHRUeEFmdGVyQ3VycmVudCgpIHtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdIYWx0VHhNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4SGFsdFR4PntpZDogdGhpcy53c2p0eElkLCBhdXRvVHhPbmx5OiB0cnVlfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLmFnZW50V2ViU29ja2V0U3ViamVjdD8ubmV4dCh3c01zZyk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIHJlcGx5IHRvIHRoZSBnaXZlbiBkZWNvZGUuIFRoZSBtZXNzYWdlIG11c3QgaW5jbHVkZSBDUSBvciBRUlouICovXG4gIHB1YmxpYyBzZW5kV3NqdHhSZXBseShkZWNvZGU6IFdzanR4RGVjb2RlKSB7XG4gICAgY29uc3Qgd3NNc2cgPSB7XG4gICAgICB3c2p0eDoge1xuICAgICAgICB0eXBlOiAnUmVwbHlNZXNzYWdlJyxcbiAgICAgICAgcGF5bG9hZDogPFdzanR4UmVwbHk+e1xuICAgICAgICAgIGlkOiBkZWNvZGUuaWQsXG4gICAgICAgICAgdGltZTogZGVjb2RlLnRpbWUsXG4gICAgICAgICAgc25yOiBkZWNvZGUuc25yLFxuICAgICAgICAgIGRlbHRhVGltZTogZGVjb2RlLmRlbHRhVGltZSxcbiAgICAgICAgICBkZWx0YUZyZXF1ZW5jeTogZGVjb2RlLmRlbHRhRnJlcXVlbmN5LFxuICAgICAgICAgIG1vZGU6IGRlY29kZS5tb2RlLFxuICAgICAgICAgIG1lc3NhZ2U6IGRlY29kZS5tZXNzYWdlLFxuICAgICAgICAgIGxvd0NvbmZpZGVuY2U6IGRlY29kZS5sb3dDb25maWRlbmNlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuYWdlbnRXZWJTb2NrZXRTdWJqZWN0Py5uZXh0KHdzTXNnKTtcbiAgfVxuXG4gIC8qKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gcmVwbHkgdG8gdGhlIGdpdmVuIGRlY29kZS4gVGhlIG1lc3NhZ2UgbXVzdCBpbmNsdWRlIENRIG9yIFFSWi4gKi9cbiAgcHVibGljIHNlbmRXc2p0eEhpZ2hsaWdodENhbGxzaWduKGhpZ2hsaWdodE1zZzogV3NqdHhIaWdobGlnaHRDYWxsc2lnbikge1xuICAgIGhpZ2hsaWdodE1zZy5pZCA9IHRoaXMud3NqdHhJZDtcbiAgICBjb25zdCB3c01zZyA9IHtcbiAgICAgIHdzanR4OiB7XG4gICAgICAgIHR5cGU6ICdIaWdobGlnaHRDYWxsc2lnbk1lc3NhZ2UnLFxuICAgICAgICBwYXlsb2FkOiBoaWdobGlnaHRNc2csXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5hZ2VudFdlYlNvY2tldFN1YmplY3Q/Lm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqIEdpdmVuIGEgZGVjb2RlIG1lc3NhZ2UsIGZvcm1hdCBhIHN0cmluZyB0aGUgc2FtZSB3YXkgYXMgZGlzcGxheWVkIGluIHRoZSBXU0pULVggQmFuZFxuICAgKiBBY3Rpdml0eS9SeCBGcmVxdWVuY3kgd2luZG93cy4gKi9cbiAgcHVibGljIHN0YXRpYyBmb3JtYXREZWNvZGUobXNnOiBXc2p0eERlY29kZSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2Vjb25kc1NpbmNlTWlkbmlnaHQgPSBNYXRoLmZsb29yKG1zZy50aW1lIC8gMTAwMCk7XG4gICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHNlY29uZHNTaW5jZU1pZG5pZ2h0IC8gMzYwMCk7XG4gICAgY29uc3Qgc2Vjb25kc1NpbmNlSG91ciA9IHNlY29uZHNTaW5jZU1pZG5pZ2h0IC0gaG91cnMgKiAzNjAwO1xuICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHNlY29uZHNTaW5jZUhvdXIgLyA2MCk7XG4gICAgY29uc3Qgc2Vjb25kcyA9IHNlY29uZHNTaW5jZUhvdXIgLSBtaW51dGVzICogNjA7XG4gICAgY29uc3QgdGltZVN0ciA9IGAke2hvdXJzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX0ke21pbnV0ZXNcbiAgICAgIC50b1N0cmluZygpXG4gICAgICAucGFkU3RhcnQoMiwgJzAnKX0ke3NlY29uZHMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpfWA7XG5cbiAgICByZXR1cm4gYCR7dGltZVN0cn0gJHttc2cuc25yLnRvU3RyaW5nKCkucGFkU3RhcnQoMyl9ICR7bXNnLmRlbHRhVGltZVxuICAgICAgLnRvRml4ZWQoMSlcbiAgICAgIC5wYWRTdGFydCg0KX0gJHttc2cuZGVsdGFGcmVxdWVuY3kudG9TdHJpbmcoKS5wYWRTdGFydCg0KX0gfiAgJHtcbiAgICAgIG1zZy5tZXNzYWdlXG4gICAgfWA7XG4gIH1cbn1cbiJdfQ==
178
+ }], ctorParameters: function () { return [{ type: i1.AgentMessageService }, { type: i2.HamlibService }, { type: i3.WsjtxService }]; } });
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1rZWwtYWdlbnQvc3JjL2xpYi9hZ2VudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQXdDLE1BQU0sTUFBTSxDQUFDO0FBRzdFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFZM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQW9CLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBSzdELE1BQU0sT0FBTyxZQUFZO0lBb0Z2QixZQUNVLFFBQTZCLEVBQzdCLGFBQTRCLEVBQzVCLFlBQTBCO1FBRjFCLGFBQVEsR0FBUixRQUFRLENBQXFCO1FBQzdCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBdEZwQyw0Q0FBNEM7UUFDNUIsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQXdFckQscUJBQWdCLEdBQUcsV0FBVyxDQUFDO1FBQy9CLHFCQUFnQixHQUFHLElBQUksQ0FBQztRQUN4Qix3QkFBbUIsR0FBRyxZQUFZLENBQUM7UUFDbkMsd0JBQW1CLEdBQUcsWUFBWSxDQUFDO1FBRTVDLGNBQVMsR0FBVyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFDMUMsY0FBUyxHQUFXLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUMxQywwQkFBcUIsR0FBb0MsSUFBSSxDQUFDO1FBQzlELCtCQUEwQixHQUF3QixJQUFJLENBQUM7UUFPN0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQztRQUNs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IEFnZW50TWVzc2FnZVNlcnZpY2UgfSBmcm9tICcuL2FnZW50LW1lc3NhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFJlcGxheVN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSGFtbGliUmlnU3RhdGUgfSBmcm9tICcuL2hhbWxpYi1tZXNzYWdlcyc7XG5pbXBvcnQgeyBIYW1saWJTZXJ2aWNlIH0gZnJvbSAnLi9oYW1saWIuc2VydmljZSc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBXc2p0eENsZWFyLFxuICBXc2p0eENsb3NlLFxuICBXc2p0eERlY29kZSxcbiAgV3NqdHhIZWFydGJlYXQsXG4gIFdzanR4SGlnaGxpZ2h0Q2FsbHNpZ24sXG4gIFdzanR4TG9nZ2VkQWRpZixcbiAgV3NqdHhRc29Mb2dnZWQsXG4gIFdzanR4U3RhdHVzLFxuICBXc2p0eFdzcHJEZWNvZGUsXG59IGZyb20gJy4vd3NqdHgtbWVzc2FnZXMnO1xuaW1wb3J0IHsgV3NqdHhTZXJ2aWNlIH0gZnJvbSAnLi93c2p0eC5zZXJ2aWNlJztcbmltcG9ydCB7IGRlbGF5LCByZXRyeVdoZW4sIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHdlYlNvY2tldCwgV2ViU29ja2V0U3ViamVjdCB9IGZyb20gJ3J4anMvd2ViU29ja2V0JztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEFnZW50U2VydmljZSB7XG4gIC8qKiBXaGV0aGVyIHdlJ3JlIGNvbm5lY3RlZCB0byB0aGUgYWdlbnQuICovXG4gIHB1YmxpYyByZWFkb25seSBjb25uZWN0ZWRTdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAvKiAgV1NKVC1YICAqL1xuICAvKipcbiAgICogV2hldGhlciB3ZSdyZSBnZXR0aW5nIGFueSBtZXNzYWdlcyBmcm9tIFdTSlQtWC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBXc2p0eFNlcnZpY2UuY29ubmVjdGVkJH0gaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB3c2p0eFN0YXRlJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+O1xuICAvKipcbiAgICogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkhlYXJ0YmVhdFwiIG1lc3NhZ2VzLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFdzanR4U2VydmljZS5oZWFydGJlYXQkfSBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4SGVhcnRiZWF0JDogUmVwbGF5U3ViamVjdDxXc2p0eEhlYXJ0YmVhdCB8IG51bGw+O1xuICAvKipcbiAgICogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIlN0YXR1c1wiIG1lc3NhZ2VzLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFdzanR4U2VydmljZS5zdGF0dXMkfSBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4U3RhdHVzJDogUmVwbGF5U3ViamVjdDxXc2p0eFN0YXR1cyB8IG51bGw+O1xuICAvKipcbiAgICogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkRlY29kZVwiIG1lc3NhZ2VzLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFdzanR4U2VydmljZS5kZWNvZGUkfSBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4RGVjb2RlJDogU3ViamVjdDxXc2p0eERlY29kZT47XG4gIC8qKlxuICAgKiBTdWJqZWN0IGZvciBsaXN0ZW5pbmcgdG8gV1NKVC1YIFwiQ2xlYXJcIiBtZXNzYWdlcy5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBXc2p0eFNlcnZpY2UuY2xlYXIkfSBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4Q2xlYXIkOiBTdWJqZWN0PFdzanR4Q2xlYXI+O1xuICAvKipcbiAgICogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIlFzb0xvZ2dlZFwiIG1lc3NhZ2VzLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFdzanR4U2VydmljZS5xc29Mb2dnZWQkfSBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4UXNvTG9nZ2VkJDogU3ViamVjdDxXc2p0eFFzb0xvZ2dlZD47XG4gIC8qKlxuICAgKiBTdWJqZWN0IGZvciBsaXN0ZW5pbmcgdG8gV1NKVC1YIFwiQ2xvc2VcIiBtZXNzYWdlcy5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBXc2p0eFNlcnZpY2UuY2xvc2UkfSBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdzanR4Q2xvc2UkOiBTdWJqZWN0PFdzanR4Q2xvc2U+O1xuICAvKipcbiAgICogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIldzcHJEZWNvZGVcIiBtZXNzYWdlcy5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBXc2p0eFNlcnZpY2Uud3NwckRlY29kZSR9IGluc3RlYWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd3NqdHhXc3ByRGVjb2RlJDogU3ViamVjdDxXc2p0eFdzcHJEZWNvZGU+O1xuICAvKipcbiAgICogU3ViamVjdCBmb3IgbGlzdGVuaW5nIHRvIFdTSlQtWCBcIkxvZ2dlZEFkaWZcIiBtZXNzYWdlcy5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBXc2p0eFNlcnZpY2UubG9nZ2VkQWRpZiR9IGluc3RlYWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd3NqdHhMb2dnZWRBZGlmJDogU3ViamVjdDxXc2p0eExvZ2dlZEFkaWY+O1xuXG4gIC8qICBIYW1saWIgICovXG4gIC8qKlxuICAgKiBXaGV0aGVyIHdlJ3JlIGdldHRpbmcgYW55IG1lc3NhZ2VzIGZyb20gSGFtbGliLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEhhbWxpYlNlcnZpY2UuY29ubmVjdGVkJH0gaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBoYW1saWJTdGF0ZSQ6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcbiAgLyoqXG4gICAqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBIYW1saWIgXCJSaWdTdGF0ZVwiIG1lc3NhZ2VzLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIEhhbWxpYlNlcnZpY2UucmlnU3RhdGUkfSBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhhbWxpYlJpZ1N0YXRlJDogQmVoYXZpb3JTdWJqZWN0PEhhbWxpYlJpZ1N0YXRlIHwgbnVsbD47XG5cbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0QWdlbnRIb3N0ID0gJ2xvY2FsaG9zdCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdEFnZW50UG9ydCA9IDgwODE7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxTdG9yYWdlSG9zdEtleSA9ICdhZ2VudC1ob3N0JztcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbFN0b3JhZ2VQb3J0S2V5ID0gJ2FnZW50LXBvcnQnO1xuXG4gIHByaXZhdGUgYWdlbnRIb3N0OiBzdHJpbmcgPSB0aGlzLmRlZmF1bHRBZ2VudEhvc3Q7XG4gIHByaXZhdGUgYWdlbnRQb3J0OiBudW1iZXIgPSB0aGlzLmRlZmF1bHRBZ2VudFBvcnQ7XG4gIHByaXZhdGUgYWdlbnRXZWJTb2NrZXRTdWJqZWN0OiBXZWJTb2NrZXRTdWJqZWN0PG9iamVjdD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBhZ2VudFdlYnNvY2tldFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtZXNzYWdlczogQWdlbnRNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIGhhbWxpYlNlcnZpY2U6IEhhbWxpYlNlcnZpY2UsXG4gICAgcHJpdmF0ZSB3c2p0eFNlcnZpY2U6IFdzanR4U2VydmljZVxuICApIHtcbiAgICB0aGlzLmhhbWxpYlN0YXRlJCA9IHRoaXMuaGFtbGliU2VydmljZS5jb25uZWN0ZWQkO1xuICAgIHRoaXMuaGFtbGliUmlnU3RhdGUkID0gdGhpcy5oYW1saWJTZXJ2aWNlLnJpZ1N0YXRlJDtcblxuICAgIHRoaXMud3NqdHhTdGF0ZSQgPSB0aGlzLndzanR4U2VydmljZS5jb25uZWN0ZWQkO1xuICAgIHRoaXMud3NqdHhIZWFydGJlYXQkID0gdGhpcy53c2p0eFNlcnZpY2UuaGVhcnRiZWF0JDtcbiAgICB0aGlzLndzanR4U3RhdHVzJCA9IHRoaXMud3NqdHhTZXJ2aWNlLnN0YXR1cyQ7XG4gICAgdGhpcy53c2p0eERlY29kZSQgPSB0aGlzLndzanR4U2VydmljZS5kZWNvZGUkO1xuICAgIHRoaXMud3NqdHhDbGVhciQgPSB0aGlzLndzanR4U2VydmljZS5jbGVhciQ7XG4gICAgdGhpcy53c2p0eFFzb0xvZ2dlZCQgPSB0aGlzLndzanR4U2VydmljZS5xc29Mb2dnZWQkO1xuICAgIHRoaXMud3NqdHhDbG9zZSQgPSB0aGlzLndzanR4U2VydmljZS5jbG9zZSQ7XG4gICAgdGhpcy53c2p0eFdzcHJEZWNvZGUkID0gdGhpcy53c2p0eFNlcnZpY2Uud3NwckRlY29kZSQ7XG4gICAgdGhpcy53c2p0eExvZ2dlZEFkaWYkID0gdGhpcy53c2p0eFNlcnZpY2UubG9nZ2VkQWRpZiQ7XG4gIH1cblxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm1lc3NhZ2VzLnR4TWVzc2FnZSQuc3Vic2NyaWJlKChtc2cpID0+IHRoaXMuc2VuZChtc2cpKTtcbiAgICB0aGlzLmFnZW50SG9zdCA9IHRoaXMuZ2V0SG9zdCgpO1xuICAgIHRoaXMuYWdlbnRQb3J0ID0gdGhpcy5nZXRQb3J0KCk7XG4gICAgdGhpcy5jb25uZWN0KCk7XG4gIH1cblxuICAvKiogQ29ubmVjdCAob3IgcmVjb25uZWN0KSB0aGUgd2Vic29ja2V0IHRvIHRoZSBrZWwtYWdlbnQgc2VydmVyLiAqL1xuICBwdWJsaWMgY29ubmVjdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hZ2VudFdlYnNvY2tldFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5hZ2VudFdlYnNvY2tldFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICB0aGlzLmFnZW50SG9zdCA9IHRoaXMuZ2V0SG9zdCgpO1xuICAgIHRoaXMuYWdlbnRQb3J0ID0gdGhpcy5nZXRQb3J0KCk7XG4gICAgY29uc3QgcHJvdG9jb2wgPSB0aGlzLmFnZW50SG9zdCA9PT0gJ2xvY2FsaG9zdCcgPyAnd3M6Ly8nIDogJ3dzczovLyc7XG4gICAgdGhpcy5hZ2VudFdlYlNvY2tldFN1YmplY3QgPSB3ZWJTb2NrZXQ8b2JqZWN0Pih7XG4gICAgICB1cmw6IHByb3RvY29sICsgdGhpcy5hZ2VudEhvc3QgKyAnOicgKyB0aGlzLmFnZW50UG9ydCArICcvd2Vic29ja2V0JyxcbiAgICB9KTtcbiAgICB0aGlzLmNvbm5lY3RlZFN0YXRlJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuYWdlbnRXZWJzb2NrZXRTdWJzY3JpcHRpb24gPSB0aGlzLmFnZW50V2ViU29ja2V0U3ViamVjdFxuICAgICAgLnBpcGUoXG4gICAgICAgIHJldHJ5V2hlbigoZXJyb3JzKSA9PlxuICAgICAgICAgIC8vIHJldHJ5IHRoZSB3ZWJzb2NrZXQgY29ubmVjdGlvbiBhZnRlciAxMCBzZWNvbmRzXG4gICAgICAgICAgZXJyb3JzLnBpcGUoXG4gICAgICAgICAgICB0YXAoKCkgPT4gdGhpcy5jb25uZWN0ZWRTdGF0ZSQubmV4dChmYWxzZSkpLFxuICAgICAgICAgICAgZGVsYXkoMTAwMDApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKG1zZykgPT4ge1xuICAgICAgICAgIHRoaXMuY29ubmVjdGVkU3RhdGUkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlcy5yeE1lc3NhZ2UkLm5leHQobXNnKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHRoaXMuY29ubmVjdGVkU3RhdGUkLm5leHQoZmFsc2UpLFxuICAgICAgICBjb21wbGV0ZTogKCkgPT4gdGhpcy5jb25uZWN0ZWRTdGF0ZSQubmV4dChmYWxzZSksXG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIGN1cnJlbnRseSBjb25maWd1cmVkIGtlbC1hZ2VudCBob3N0LiAqL1xuICBwdWJsaWMgZ2V0SG9zdCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUhvc3RLZXkpIHx8IHRoaXMuZGVmYXVsdEFnZW50SG9zdFxuICAgICk7XG4gIH1cblxuICAvKiogR2V0IHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCBrZWwtYWdlbnQgcG9ydC4gKi9cbiAgcHVibGljIGdldFBvcnQoKTogbnVtYmVyIHtcbiAgICBsZXQgcG9ydFN0ciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlUG9ydEtleSk7XG4gICAgaWYgKHBvcnRTdHIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdEFnZW50UG9ydDtcbiAgICB9XG4gICAgbGV0IHBvcnROdW0gPSBwYXJzZUludChwb3J0U3RyLCAxMCk7XG4gICAgaWYgKGlzTmFOKHBvcnROdW0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWZhdWx0QWdlbnRQb3J0O1xuICAgIH1cbiAgICByZXR1cm4gcG9ydE51bTtcbiAgfVxuXG4gIC8qKiBTZXQgdGhlIGtlbC1hZ2VudCBob3N0LiAqL1xuICBwdWJsaWMgc2V0SG9zdChob3N0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmxvY2FsU3RvcmFnZUhvc3RLZXksIGhvc3QpO1xuICAgIHRoaXMuY29ubmVjdCgpO1xuICB9XG5cbiAgLyoqIFNldCB0aGUga2VsLWFnZW50IHBvcnQuICovXG4gIHB1YmxpYyBzZXRQb3J0KHBvcnQ6IG51bWJlcik6IHZvaWQge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubG9jYWxTdG9yYWdlUG9ydEtleSwgU3RyaW5nKHBvcnQpKTtcbiAgICB0aGlzLmNvbm5lY3QoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2VuZCh3c01zZzogYW55KSB7XG4gICAgdGhpcy5hZ2VudFdlYlNvY2tldFN1YmplY3Q/Lm5leHQod3NNc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byBjbGVhciB0aGUgQmFuZCBBY3Rpdml0eSB3aW5kb3cuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgV3NqdHhTZXJ2aWNlLmNsZWFyQmFuZEFjdGl2aXR5fSBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIHNlbmRXc2p0eENsZWFyQmFuZEFjdGl2aXR5KCkge1xuICAgIHRoaXMud3NqdHhTZXJ2aWNlLmNsZWFyQmFuZEFjdGl2aXR5KCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIGNsZWFyIHRoZSBSeCBGcmVxdWVuY3kgd2luZG93LlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFdzanR4U2VydmljZS5jbGVhclJ4RnJlcVdpbmRvd30gaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBzZW5kV3NqdHhDbGVhclJ4RnJlcVdpbmRvdygpIHtcbiAgICB0aGlzLndzanR4U2VydmljZS5jbGVhclJ4RnJlcVdpbmRvdygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byBjbGVhciB0aGUgQmFuZCBBY3Rpdml0eSBhbmQgUnggRnJlcXVlbmN5IHdpbmRvd3MuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgV3NqdHhTZXJ2aWNlLmNsZWFyQWxsfSBpbnN0ZWFkLlxuICAgKi9cbiAgcHVibGljIHNlbmRXc2p0eENsZWFyQWxsKCkge1xuICAgIHRoaXMud3NqdHhTZXJ2aWNlLmNsZWFyQWxsKCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIHJlcGxheSBtZXNzYWdlcy4gVXNlZnVsIGZvciBhIGZyZXNoIGNsaWVudCB0aGF0IHdhbnRzIHRvIGhlYXJcbiAgICogcHJldmlvdXMgV1NKVC1YIGRlY29kZXMuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgV3NqdHhTZXJ2aWNlLnJlcGxheX0gaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBzZW5kV3NqdHhSZXBsYXkoKSB7XG4gICAgdGhpcy53c2p0eFNlcnZpY2UucmVwbGF5KCk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIGhhbHQgYW55IHRyYW5zbWlzc2lvbnMgaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgV3NqdHhTZXJ2aWNlLmhhbHRUeE5vd30gaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBzZW5kV3NqdHhIYWx0VHhOb3coKSB7XG4gICAgdGhpcy53c2p0eFNlcnZpY2UuaGFsdFR4Tm93KCk7XG4gIH1cblxuICAvKiogU2VuZCBhIGNvbW1hbmQgdG8gV1NKVC1YIHRvIHN0b3AgYXV0by10cmFuc21pdHRpbmcgYWZ0ZXIgZmluaXNoaW5nIHRoZSBjdXJyZW50IHJvdW5kLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFdzanR4U2VydmljZS5oYWx0VHhBZnRlckN1cnJlbnR9IGluc3RlYWQuXG4gICAqL1xuICBwdWJsaWMgc2VuZFdzanR4SGFsdFR4QWZ0ZXJDdXJyZW50KCkge1xuICAgIHRoaXMud3NqdHhTZXJ2aWNlLmhhbHRUeEFmdGVyQ3VycmVudCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBjb21tYW5kIHRvIFdTSlQtWCB0byByZXBseSB0byB0aGUgZ2l2ZW4gZGVjb2RlLiBUaGUgbWVzc2FnZSBtdXN0IGluY2x1ZGUgQ1Egb3IgUVJaLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFdzanR4U2VydmljZS5yZXBseX0gaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBzZW5kV3NqdHhSZXBseShkZWNvZGU6IFdzanR4RGVjb2RlKSB7XG4gICAgdGhpcy53c2p0eFNlcnZpY2UucmVwbHkoZGVjb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgY29tbWFuZCB0byBXU0pULVggdG8gcmVwbHkgdG8gdGhlIGdpdmVuIGRlY29kZS4gVGhlIG1lc3NhZ2UgbXVzdCBpbmNsdWRlIENRIG9yIFFSWi5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBXc2p0eFNlcnZpY2UuaGlnaGxpZ2h0Q2FsbHNpZ259IGluc3RlYWQuXG4gICAqL1xuICBwdWJsaWMgc2VuZFdzanR4SGlnaGxpZ2h0Q2FsbHNpZ24oaGlnaGxpZ2h0TXNnOiBXc2p0eEhpZ2hsaWdodENhbGxzaWduKSB7XG4gICAgdGhpcy53c2p0eFNlcnZpY2UuaGlnaGxpZ2h0Q2FsbHNpZ24oaGlnaGxpZ2h0TXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIGRlY29kZSBtZXNzYWdlLCBmb3JtYXQgYSBzdHJpbmcgdGhlIHNhbWUgd2F5IGFzIGRpc3BsYXllZCBpbiB0aGUgV1NKVC1YIEJhbmRcbiAgICogQWN0aXZpdHkvUnggRnJlcXVlbmN5IHdpbmRvd3MuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgV3NqdHhTZXJ2aWNlLmZvcm1hdERlY29kZX0gaW5zdGVhZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZm9ybWF0RGVjb2RlKG1zZzogV3NqdHhEZWNvZGUpOiBzdHJpbmcge1xuICAgIHJldHVybiBXc2p0eFNlcnZpY2UuZm9ybWF0RGVjb2RlKG1zZyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbGliLW1lc3NhZ2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWtlbC1hZ2VudC9zcmMvbGliL2hhbWxpYi1tZXNzYWdlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBIYW1saWJSaWdTdGF0ZSB7XG4gIC8qKiBUcmFuc2NlaXZlciBtb2RlbCBuYW1lICovXG4gIG1vZGVsOiBzdHJpbmc7XG4gIC8qKiBEaWFsIGZyZXF1ZW5jeSBvZiB0aGUgXCJjdXJyZW50XCIgVkZPIGluIEh6ICovXG4gIGZyZXF1ZW5jeTogbnVtYmVyO1xuICAvKiogTW9kZSBuYW1lIG9mIHRoZSBcImN1cnJlbnRcIiBWRk8gKi9cbiAgbW9kZTogc3RyaW5nO1xuICAvKiogV2lkdGggb2YgdGhlIGN1cnJlbnQgcGFzc2JhbmQgZmlsdGVyIGluIEh6ICovXG4gIHBhc3NiYW5kV2lkdGhIejogbnVtYmVyO1xufVxuIl19
@@ -0,0 +1,48 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { debounceTime } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "./agent-message.service";
6
+ export class HamlibService {
7
+ constructor(messages) {
8
+ this.messages = messages;
9
+ /** Whether we're getting any messages from Hamlib. */
10
+ this.connected$ = new BehaviorSubject(false);
11
+ /** Subject for listening to Hamlib "RigState" messages. */
12
+ this.rigState$ = new BehaviorSubject(null);
13
+ this.setupBehaviors();
14
+ }
15
+ setupBehaviors() {
16
+ this.messages.rxMessage$.subscribe((msg) => this.handleMessage(msg));
17
+ // if we haven't heard from Hamlib in 15 seconds, consider it down
18
+ this.connected$.pipe(debounceTime(15000)).subscribe(() => {
19
+ this.connected$.next(false);
20
+ });
21
+ // When Hamlib goes down, clear its persistent message subjects
22
+ this.connected$.subscribe((isUp) => {
23
+ if (!isUp) {
24
+ this.rigState$.next(null);
25
+ }
26
+ });
27
+ }
28
+ handleMessage(msg) {
29
+ if (!msg.hamlib) {
30
+ return;
31
+ }
32
+ this.connected$.next(true);
33
+ switch (msg.hamlib.type) {
34
+ case 'RigState':
35
+ this.rigState$.next(msg.hamlib.payload);
36
+ return;
37
+ }
38
+ }
39
+ }
40
+ HamlibService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, deps: [{ token: i1.AgentMessageService }], target: i0.ɵɵFactoryTarget.Injectable });
41
+ HamlibService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, providedIn: 'root' });
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: HamlibService, decorators: [{
43
+ type: Injectable,
44
+ args: [{
45
+ providedIn: 'root',
46
+ }]
47
+ }], ctorParameters: function () { return [{ type: i1.AgentMessageService }]; } });
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbGliLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gta2VsLWFnZW50L3NyYy9saWIvaGFtbGliLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBTTlDLE1BQU0sT0FBTyxhQUFhO0lBTXhCLFlBQW9CLFFBQTZCO1FBQTdCLGFBQVEsR0FBUixRQUFRLENBQXFCO1FBTGpELHNEQUFzRDtRQUN0QyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDakUsMkRBQTJEO1FBQzNDLGNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBd0IsSUFBSSxDQUFDLENBQUM7UUFHM0UsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckUsa0VBQWtFO1FBQ2xFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDdkQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFDSCwrREFBK0Q7UUFDL0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzNCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sYUFBYSxDQUFDLEdBQVE7UUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixRQUFRLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLEtBQUssVUFBVTtnQkFDYixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQXlCLENBQUMsQ0FBQztnQkFDMUQsT0FBTztTQUNWO0lBQ0gsQ0FBQzs7MEdBbENVLGFBQWE7OEdBQWIsYUFBYSxjQUZaLE1BQU07MkZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEhhbWxpYlJpZ1N0YXRlIH0gZnJvbSAnLi9oYW1saWItbWVzc2FnZXMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQWdlbnRNZXNzYWdlU2VydmljZSB9IGZyb20gJy4vYWdlbnQtbWVzc2FnZS5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEhhbWxpYlNlcnZpY2Uge1xuICAvKiogV2hldGhlciB3ZSdyZSBnZXR0aW5nIGFueSBtZXNzYWdlcyBmcm9tIEhhbWxpYi4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3RlZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIFN1YmplY3QgZm9yIGxpc3RlbmluZyB0byBIYW1saWIgXCJSaWdTdGF0ZVwiIG1lc3NhZ2VzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmlnU3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxIYW1saWJSaWdTdGF0ZSB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWVzc2FnZXM6IEFnZW50TWVzc2FnZVNlcnZpY2UpIHtcbiAgICB0aGlzLnNldHVwQmVoYXZpb3JzKCk7XG4gIH1cblxuICBzZXR1cEJlaGF2aW9ycygpOiB2b2lkIHtcbiAgICB0aGlzLm1lc3NhZ2VzLnJ4TWVzc2FnZSQuc3Vic2NyaWJlKChtc2cpID0+IHRoaXMuaGFuZGxlTWVzc2FnZShtc2cpKTtcbiAgICAvLyBpZiB3ZSBoYXZlbid0IGhlYXJkIGZyb20gSGFtbGliIGluIDE1IHNlY29uZHMsIGNvbnNpZGVyIGl0IGRvd25cbiAgICB0aGlzLmNvbm5lY3RlZCQucGlwZShkZWJvdW5jZVRpbWUoMTUwMDApKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jb25uZWN0ZWQkLm5leHQoZmFsc2UpO1xuICAgIH0pO1xuICAgIC8vIFdoZW4gSGFtbGliIGdvZXMgZG93biwgY2xlYXIgaXRzIHBlcnNpc3RlbnQgbWVzc2FnZSBzdWJqZWN0c1xuICAgIHRoaXMuY29ubmVjdGVkJC5zdWJzY3JpYmUoKGlzVXApID0+IHtcbiAgICAgIGlmICghaXNVcCkge1xuICAgICAgICB0aGlzLnJpZ1N0YXRlJC5uZXh0KG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNZXNzYWdlKG1zZzogYW55KTogdm9pZCB7XG4gICAgaWYgKCFtc2cuaGFtbGliKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY29ubmVjdGVkJC5uZXh0KHRydWUpO1xuICAgIHN3aXRjaCAobXNnLmhhbWxpYi50eXBlKSB7XG4gICAgICBjYXNlICdSaWdTdGF0ZSc6XG4gICAgICAgIHRoaXMucmlnU3RhdGUkLm5leHQobXNnLmhhbWxpYi5wYXlsb2FkIGFzIEhhbWxpYlJpZ1N0YXRlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3NqdHgtbWVzc2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gta2VsLWFnZW50L3NyYy9saWIvd3NqdHgtbWVzc2FnZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIGhlYXJ0YmVhdCAgbWVzc2FnZSBzaGFsbCBiZSAgc2VudCBvbiBhIHBlcmlvZGljICBiYXNpcyBldmVyeVxuICogICAgMTUgICBzZWNvbmRzLiAgVGhpc1xuICogICAgbWVzc2FnZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHNlcnZlcnMgdG8gZGV0ZWN0IHRoZSBwcmVzZW5jZVxuICogICAgb2YgYSAgY2xpZW50IGFuZCBhbHNvICB0aGUgdW5leHBlY3RlZCBkaXNhcHBlYXJhbmNlIG9mICBhIGNsaWVudFxuICogICAgYW5kICBieSBjbGllbnRzICB0byBsZWFybiAgdGhlIHNjaGVtYSAgbmVnb3RpYXRlZCBieSAgdGhlIHNlcnZlclxuICogICAgYWZ0ZXIgaXQgcmVjZWl2ZXMgIHRoZSBpbml0aWFsIGhlYXJ0YmVhdCBtZXNzYWdlICBmcm9tIGEgY2xpZW50LlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS93c2p0eC0yLjUuMi90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wxMTApLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4SGVhcnRiZWF0IHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogV1NKVC1YIGNsaWVudCdzIHN1cHBvcnRlZCBzY2hlbWEgdmVyc2lvbiAqL1xuICBtYXhTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG4gIC8qKiBXU0pULVggY2xpZW50J3MgY29tbWl0IGhhc2ggKi9cbiAgcmV2aXNpb246IHN0cmluZztcbiAgLyoqIFdTSlQtWCBjbGllbnQncyBzZW1hbnRpYyB2ZXJzaW9uICovXG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBXU0pULVggIHNlbmRzIHRoaXMgIHN0YXR1cyBtZXNzYWdlICB3aGVuIHZhcmlvdXMgIGludGVybmFsIHN0YXRlXG4gKiBjaGFuZ2VzIHRvIGFsbG93IHRoZSBzZXJ2ZXIgdG8gIHRyYWNrIHRoZSByZWxldmFudCBzdGF0ZSBvZiBlYWNoXG4gKiBjbGllbnQgd2l0aG91dCB0aGUgbmVlZCBmb3IgIHBvbGxpbmcgY29tbWFuZHMuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDE0MSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhTdGF0dXMge1xuICBjb25maWdOYW1lOiBzdHJpbmc7XG4gIC8qKiBMb2NhbCBzdGF0aW9uJ3MgY2FsbHNpZ24gKi9cbiAgZGVDYWxsOiBzdHJpbmc7XG4gIC8qKiBMb2NhbCBzdGF0aW9uJ3MgTWFpZGVuaGVhZCBncmlkICovXG4gIGRlR3JpZDogc3RyaW5nO1xuICAvKiogV2hldGhlciBXU0pULVggaXMgY3VycmVudGx5IGRlY29kaW5nICovXG4gIGRlY29kaW5nOiBib29sZWFuO1xuICAvKiogVGhlIGNvbm5lY3RlZCB0cmFuc2NlaXZlcidzIGRpYWwgZnJlcXVlbmN5IGluIGhlcnR6ICovXG4gIGRpYWxGcmVxdWVuY3k6IG51bWJlcjtcbiAgLyoqIFJlbW90ZSBzdGF0aW9uJ3MgY2FsbHNpZ24gKi9cbiAgZHhDYWxsOiBzdHJpbmc7XG4gIC8qKiBSZW1vdGUgc3RhdGlvbidzIE1haWRlbmhlYWQgZ3JpZCAqL1xuICBkeEdyaWQ6IHN0cmluZztcbiAgZmFzdE1vZGU6IGJvb2xlYW47XG4gIGZyZXF1ZW5jeVRvbGVyYW5jZTogbnVtYmVyO1xuICAvKiogV1NKVC1YIGNsaWVudCBuYW1lICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBUaGUgcmVjZWl2ZSBwcm90b2NvbCB0aGF0IFdTSlQtWCBpcyBkZWNvZGluZyAqL1xuICBtb2RlOiBzdHJpbmc7XG4gIC8qKiBUaGUgbG9jYWwgc3RhdGlvbidzIHNpZ25hbCByZXBvcnQgZm9yIHRoZSByZW1vdGUgc3RhdGlvbiAqL1xuICByZXBvcnQ6IHN0cmluZztcbiAgLyoqIFRoZSBsaXN0ZW5pbmcgZnJlcXVlbmN5IGluIGhlcnR6IGFib3ZlIHRoZSBkaWFsIGZyZXF1ZW5jeSAqL1xuICByeERlbHRhRnJlcTogbnVtYmVyO1xuICAvKiogSWYgbm9uLXplcm8sIFdTSlQtWCBpcyBpbiBhIHNwZWNpYWwgbW9kZSBsaWtlIEZveC9Ib3VuZCBvciBGaWVsZCBEYXkgKi9cbiAgc3BlY2lhbE1vZGU6IG51bWJlcjtcbiAgc3VibW9kZTogc3RyaW5nO1xuICAvKiogV2hldGhlciBXU0pULVggaXMgdHJhbnNtaXR0aW5nICovXG4gIHRyYW5zbWl0dGluZzogYm9vbGVhbjtcbiAgLyoqIFRoZSB0cmFuc21pdCBmcmVxdWVuY3kgaW4gaGVydHogYWJvdmUgdGhlIGRpYWwgZnJlcXVlbmN5ICovXG4gIHR4RGVsdGFGcmVxOiBudW1iZXI7XG4gIC8qKiBXaGV0aGVyIFdTSlQtWCBpcyBhbGxvd2VkIHRvIHRyYW5zbWl0IGR1cmluZyB0aGUgbmV4dCB3aW5kb3cgKi9cbiAgdHhFbmFibGVkOiBib29sZWFuO1xuICB0eE1vZGU6IHN0cmluZztcbiAgdHhSeFBlcmlvZDogbnVtYmVyO1xuICB0eFdhdGNoZG9nOiBib29sZWFuO1xuICAvKiogVGhlIG1lc3NhZ2UgYmVpbmcgdHJhbnNtaXR0ZWQgKi9cbiAgdHhNZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGRlY29kZSBtZXNzYWdlIGlzIHNlbnQgd2hlbiAgYSBuZXcgZGVjb2RlIGlzIGNvbXBsZXRlZCwgaW5cbiAqIHRoaXMgY2FzZSB0aGUgJ05ldycgZmllbGQgaXMgdHJ1ZS4gSXQgaXMgYWxzbyB1c2VkIGluIHJlc3BvbnNlXG4gKiB0byAgYSBcIlJlcGxheVwiICBtZXNzYWdlIHdoZXJlICBlYWNoICBvbGQgZGVjb2RlICBpbiB0aGUgIFwiQmFuZFxuICogYWN0aXZpdHlcIiB3aW5kb3csIHRoYXQgIGhhcyBub3QgYmVlbiBlcmFzZWQsIGlzICBzZW50IGluIG9yZGVyXG4gKiBhcyBhIG9uZSBvZiB0aGVzZSBtZXNzYWdlcyAgd2l0aCB0aGUgJ05ldycgZmllbGQgc2V0IHRvIGZhbHNlLlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS93c2p0eC0yLjUuMi90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wyMDgpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4RGVjb2RlIHtcbiAgLyoqIFRoZSBkZWNvZGUncyBmcmVxdWVuY3kgaW4gaGVydHogYWJvdmUgdGhlIGRpYWwgZnJlcXVlbmN5ICovXG4gIGRlbHRhRnJlcXVlbmN5OiBudW1iZXI7XG4gIC8qKiBUaGUgcGVyY2VpdmVkIGNsb2NrIGRpZmZlcmVudGlhbCBiZXR3ZWVuIHRoZSBsb2NhbCBzdGF0aW9uIGFuZCByZW1vdGUgc3RhdGlvbiwgaW4gc2Vjb25kcy4gKi9cbiAgZGVsdGFUaW1lOiBudW1iZXI7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgbG93Q29uZmlkZW5jZTogYm9vbGVhbjtcbiAgLyoqIFRoZSBtZXNzYWdlIHBheWxvYWQgY29udGFpbmVkIGluIHRoZSBkZWNvZGUgKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvKiogVGhlIHByb3RvY29sIG9mIHRoZSBkZWNvZGVkIG1lc3NhZ2UgKi9cbiAgbW9kZTogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgZGVjb2RlIGlzIG5ldyBvciByZXBsYXllZCAqL1xuICBuZXc6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBkZWNvZGUgY2FtZSBmcm9tIHBsYXliYWNrIG9mIGEgcmVjb3JkaW5nICovXG4gIG9mZkFpcjogYm9vbGVhbjtcbiAgLyoqIExvY2FsIHN0YXRpb24ncyBwZXJjZWl2ZWQgc2lnbmFsIHRvIG5vaXNlIHJhdGlvICovXG4gIHNucjogbnVtYmVyO1xuICAvKiogQ2xvY2sgdGltZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQgKi9cbiAgdGltZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyAgc2VuZCB3aGVuIGFsbCBwcmlvciBcIkRlY29kZVwiICBtZXNzYWdlcyBpbiB0aGVcbiAqIFwiQmFuZCBBY3Rpdml0eVwiICB3aW5kb3cgaGF2ZSBiZWVuIGRpc2NhcmRlZCAgYW5kIHRoZXJlZm9yZSBhcmVcbiAqIG5vIGxvbmcgYXZhaWxhYmxlIGZvciBhY3Rpb25pbmcgIHdpdGggYSBcIlJlcGx5XCIgbWVzc2FnZS5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsMjM0KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eENsZWFyIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogV2hpY2ggd2luZG93IHRvIGNsZWFyIChzZW5kIG9ubHkpLiBTZW5kIDAgdG8gY2xlYXIgQmFuZCBBY3Rpdml0eSwgMSB0byBjbGVhciBSeCBGcmVxdWVuY3ksICovXG4gIC8qKiBvciAyIHRvIGNsZWFyIGJvdGguICovXG4gIHdpbmRvdzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEluIG9yZGVyIGZvciBhIHNlcnZlciAgdG8gcHJvdmlkZSBhIHVzZWZ1bCBjb29wZXJhdGl2ZSBzZXJ2aWNlXG4gKiB0byBXU0pULVggaXQgIGlzIHBvc3NpYmxlIGZvciBpdCB0byBpbml0aWF0ZSAgYSBRU08gYnkgc2VuZGluZ1xuICogdGhpcyBtZXNzYWdlIHRvIGEgY2xpZW50LiBXU0pULVggZmlsdGVycyB0aGlzIG1lc3NhZ2UgYW5kIG9ubHlcbiAqIGFjdHMgdXBvbiBpdCAgaWYgdGhlIG1lc3NhZ2UgZXhhY3RseSBkZXNjcmliZXMgIGEgcHJpb3IgZGVjb2RlXG4gKiBhbmQgdGhhdCBkZWNvZGUgIGlzIGEgQ1Egb3IgUVJaIG1lc3NhZ2UuICAgVGhlIGFjdGlvbiB0YWtlbiBpc1xuICogZXhhY3RseSBlcXVpdmFsZW50IHRvIHRoZSB1c2VyICBkb3VibGUgY2xpY2tpbmcgdGhlIG1lc3NhZ2UgaW5cbiAqIHRoZSBcIkJhbmQgYWN0aXZpdHlcIiB3aW5kb3cuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDI1NSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhSZXBseSB7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIENsb2NrIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0ICovXG4gIHRpbWU6IG51bWJlcjtcbiAgLyoqIExvY2FsIHN0YXRpb24ncyBwZXJjZWl2ZWQgc2lnbmFsIHRvIG5vaXNlIHJhdGlvICovXG4gIHNucjogbnVtYmVyO1xuICAvKiogVGhlIHBlcmNlaXZlZCBjbG9jayBkaWZmZXJlbnRpYWwgYmV0d2VlbiB0aGUgbG9jYWwgc3RhdGlvbiBhbmQgcmVtb3RlIHN0YXRpb24sIGluIHNlY29uZHMuICovXG4gIGRlbHRhVGltZTogbnVtYmVyO1xuICAvKiogVGhlIGRlY29kZSdzIGZyZXF1ZW5jeSBpbiBoZXJ0eiBhYm92ZSB0aGUgZGlhbCBmcmVxdWVuY3kgKi9cbiAgZGVsdGFGcmVxdWVuY3k6IG51bWJlcjtcbiAgLyoqIFRoZSBwcm90b2NvbCBvZiB0aGUgZGVjb2RlZCBtZXNzYWdlICovXG4gIG1vZGU6IHN0cmluZztcbiAgLyoqIFRoZSBtZXNzYWdlIHBheWxvYWQgY29udGFpbmVkIGluIHRoZSBkZWNvZGUgKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xuICBsb3dDb25maWRlbmNlOiBib29sZWFuO1xuICAvKipcbiAgICogVGhlICBNb2RpZmllcnMgICBmaWVsZCAgYWxsb3dzICB0aGUgIGVxdWl2YWxlbnQgICBvZiAga2V5Ym9hcmRcbiAgICogbW9kaWZpZXJzIHRvIGJlIHNlbnQgXCJhcyBpZlwiIHRob3NlIG1vZGlmaWVyIGtleXMgd2hlcmUgcHJlc3NlZFxuICAgKiB3aGlsZSAgZG91YmxlLWNsaWNraW5nICB0aGUgIHNwZWNpZmllZCAgZGVjb2RlZCAgbWVzc2FnZS4gU2VlXG4gICAqIHRoZSBXU0pULVggc291cmNlIGxpbmsgYWJvdmUuICovXG4gIG1vZGlmaWVyczogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoZSBRU08gbG9nZ2VkIG1lc3NhZ2UgaXMgc2VudCB3aGVuIHRoZSBXU0pULVggdXNlciBhY2NlcHRzIHRoZSBcIkxvZyAgUVNPXCIgZGlhbG9nIGJ5IGNsaWNraW5nXG4gKiB0aGUgXCJPS1wiIGJ1dHRvbi5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsMjk1KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eFFzb0xvZ2dlZCB7XG4gIGNvbW1lbnRzOiBzdHJpbmc7XG4gIGRhdGVUaW1lT2ZmOiBEYXRlO1xuICBkYXRlVGltZU9uOiBEYXRlO1xuICAvKiogcmVtb3RlIHN0YXRpb24ncyBjYWxsc2lnbiAqL1xuICBkeENhbGw6IHN0cmluZztcbiAgLyoqIHJlbW90ZSBzdGF0aW9uJ3MgTWFpZGVuaGVhZCBncmlkICovXG4gIGR4R3JpZDogc3RyaW5nO1xuICAvKiogY29udGVzdCBleGNoYW5nZSByZWNlaXZlZCAqL1xuICBleGNoYW5nZVJlY2VpdmVkOiBzdHJpbmc7XG4gIC8qKiBjb250ZXN0IGV4Y2hhbmdlIHNlbnQgKi9cbiAgZXhjaGFuZ2VTZW50OiBzdHJpbmc7XG4gIG1vZGU6IHN0cmluZztcbiAgLyoqIGxvY2FsIHN0YXRpb24ncyBjYWxsc2lnbiAqL1xuICBteUNhbGw6IHN0cmluZztcbiAgLyoqIGxvY2FsIHN0YXRpb24ncyBNYWlkZW5oZWFkIGdyaWQgKi9cbiAgbXlHcmlkOiBzdHJpbmc7XG4gIC8qKiByZW1vdGUgc3RhdGlvbidzIG9wZXJhdG9yJ3MgbmFtZSAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiByZW1vdGUgc3RhdGlvbnMgb3BlcmF0b3IncyBjYWxsc2lnbiAoaWYgZGlmZmVyZW50IGZyb20gc3RhdGlvbikgKi9cbiAgb3BlcmF0b3JDYWxsOiBzdHJpbmc7XG4gIC8qKiBzaWduYWwgcmVwb3J0IHJlY2VpdmVkICovXG4gIHJlcG9ydFJlY2VpdmVkOiBzdHJpbmc7XG4gIC8qKiBzaWduYWwgcmVwb3J0IHNlbnQgKi9cbiAgcmVwb3J0U2VudDogc3RyaW5nO1xuICAvKiogZnJlcXVlbmN5IGluIGhlcnR6ICovXG4gIHR4RnJlcXVlbmN5OiBudW1iZXI7XG4gIC8qKiBwb3dlciBpbiB3YXR0cyAqL1xuICB0eFBvd2VyOiBzdHJpbmc7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFByb3BhZ2F0aW9uIG1vZGUgdXNpbmcgQURJRiBlbnVtZXJhdGlvbnMgKi9cbiAgcHJvcGFnYXRpb25Nb2RlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ2xvc2UgaXMgIHNlbnQgYnkgIGEgY2xpZW50IGltbWVkaWF0ZWx5ICBwcmlvciB0byAgaXQgc2h1dHRpbmdcbiAqIGRvd24gZ3JhY2VmdWxseS5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsMzIwKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eENsb3NlIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFdoZW4gYSBzZXJ2ZXIgc3RhcnRzIGl0IG1heSAgYmUgdXNlZnVsIGZvciBpdCB0byBkZXRlcm1pbmUgdGhlXG4gKiBzdGF0ZSAgb2YgcHJlZXhpc3RpbmcgIGNsaWVudHMuIFNlbmRpbmcgIHRoaXMgbWVzc2FnZSAgdG8gZWFjaFxuICogY2xpZW50IGFzIGl0IGlzIGRpc2NvdmVyZWQgIHdpbGwgY2F1c2UgdGhhdCBjbGllbnQgKFdTSlQtWCkgdG9cbiAqIHNlbmQgYSBcIkRlY29kZVwiIG1lc3NhZ2UgZm9yIGVhY2ggZGVjb2RlIGN1cnJlbnRseSBpbiBpdHMgXCJCYW5kXG4gKiBhY3Rpdml0eVwiICB3aW5kb3cuIEVhY2ggIFwiRGVjb2RlXCIgbWVzc2FnZSAgc2VudCB3aWxsICBoYXZlIHRoZVxuICogXCJOZXdcIiBmbGFnIHNldCB0byBmYWxzZSBzbyB0aGF0IHRoZXkgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgZnJvbVxuICogbmV3IGRlY29kZXMuIEFmdGVyICBhbGwgdGhlIG9sZCBkZWNvZGVzIGhhdmUgIGJlZW4gYnJvYWRjYXN0IGFcbiAqIFwiU3RhdHVzXCIgbWVzc2FnZSAgaXMgYWxzbyBicm9hZGNhc3QuICBJZiB0aGUgc2VydmVyICB3aXNoZXMgdG9cbiAqIGRldGVybWluZSAgdGhlICBzdGF0dXMgIG9mICBhIG5ld2x5ICBkaXNjb3ZlcmVkICBjbGllbnQ7ICB0aGlzXG4gKiBtZXNzYWdlIHNob3VsZCBiZSB1c2VkLlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS93c2p0eC0yLjUuMi90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wzMjgpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4UmVwbGF5IHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXIgbWF5IHN0b3AgYSBjbGllbnQgZnJvbSB0cmFuc21pdHRpbmcgbWVzc2FnZXMgZWl0aGVyXG4gKiBpbW1lZGlhdGVseSBvciBhdCAgdGhlIGVuZCBvZiB0aGUgIGN1cnJlbnQgdHJhbnNtaXNzaW9uIHBlcmlvZFxuICogdXNpbmcgdGhpcyBtZXNzYWdlLlxuICpcbiAqIFNlZVxuICogW1dTSlQtWCBzb3VyY2VdKGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avd3NqdC93c2p0eC9jaS93c2p0eC0yLjUuMi90cmVlL05ldHdvcmsvTmV0d29ya01lc3NhZ2UuaHBwI2wzNDMpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdzanR4SGFsdFR4IHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogSWYgYGZhbHNlYCwgc3RvcCB0aGUgb25nb2luZyB0cmFuc21pc3Npb24gaW1tZWRpYXRlbHkuIElmIGB0cnVlYCwgdGhpcyBkb2Vzbid0IGhhbHQgdGhlXG4gICAqIGN1cnJlbnQgdHJhbnNtaXNzaW9uLCBpdCBqdXN0IGRpc2FibGVzIFdTSlQtWCBmcm9tIHRyYW5zbWl0dGluZyBhZnRlciB0aGUgY3VycmVudCByb3VuZC4gKi9cbiAgYXV0b1R4T25seTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGlzIG1lc3NhZ2UgIGFsbG93cyB0aGUgc2VydmVyICB0byBzZXQgdGhlIGN1cnJlbnQgIGZyZWUgdGV4dFxuICogbWVzc2FnZSBjb250ZW50LiBTZW5kaW5nIHRoaXMgIG1lc3NhZ2Ugd2l0aCBhIG5vbi1lbXB0eSBcIlRleHRcIlxuICogZmllbGQgaXMgZXF1aXZhbGVudCB0byB0eXBpbmcgIGEgbmV3IG1lc3NhZ2UgKG9sZCBjb250ZW50cyBhcmVcbiAqIGRpc2NhcmRlZCkgaW4gdG8gIHRoZSBXU0pULVggZnJlZSB0ZXh0IG1lc3NhZ2UgIGZpZWxkIG9yIFwiVHg1XCJcbiAqIGZpZWxkIChib3RoICBhcmUgdXBkYXRlZCkgYW5kIGlmICB0aGUgXCJTZW5kXCIgZmxhZyBpcyAgc2V0IHRoZW5cbiAqIGNsaWNraW5nIHRoZSBcIk5vd1wiIHJhZGlvIGJ1dHRvbiBmb3IgdGhlIFwiVHg1XCIgZmllbGQgaWYgdGFiIG9uZVxuICogaXMgY3VycmVudCBvciBjbGlja2luZyB0aGUgXCJGcmVlICBtc2dcIiByYWRpbyBidXR0b24gaWYgdGFiIHR3b1xuICogaXMgY3VycmVudC5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsMzUyKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eEZyZWVUZXh0IHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogQ3VzdG9tIHRleHQgdG8gc2VuZC4gTWF5IGJlIHRydW5jYXRlZCBpZiB0b28gbG9uZyAqL1xuICB0ZXh0OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRvIGFsc28gY2xpY2sgXCJOb3dcIiB0byBiZWdpbiB0cmFuc21pdHRpbmcgd2hlbiBhcHByb3ByaWF0ZSAqL1xuICBzZW5kOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBkZWNvZGUgbWVzc2FnZSBpcyBzZW50IHdoZW4gIGEgbmV3IGRlY29kZSBpcyBjb21wbGV0ZWQsIGluXG4gKiB0aGlzIGNhc2UgdGhlICdOZXcnIGZpZWxkIGlzIHRydWUuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDM4MykuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhXc3ByRGVjb2RlIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogV2hldGhlciB0aGUgZGVjb2RlIGlzIG5ldyBvciByZXBsYXllZCAqL1xuICBuZXc6IGJvb2xlYW47XG4gIC8qKiBDbG9jayB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCAqL1xuICB0aW1lOiBudW1iZXI7XG4gIC8qKiBMb2NhbCBzdGF0aW9uJ3MgcGVyY2VpdmVkIHNpZ25hbCB0byBub2lzZSByYXRpbyAqL1xuICBzbnI6IG51bWJlcjtcbiAgLyoqIFRoZSBwZXJjZWl2ZWQgY2xvY2sgZGlmZmVyZW50aWFsIGJldHdlZW4gdGhlIGxvY2FsIHN0YXRpb24gYW5kIHJlbW90ZSBzdGF0aW9uLCBpbiBzZWNvbmRzLiAqL1xuICBkZWx0YVRpbWU6IG51bWJlcjtcbiAgZnJlcXVlbmN5OiBudW1iZXI7XG4gIGRyaWZ0OiBudW1iZXI7XG4gIC8qKiByZW1vdGUgc3RhdGlvbidzIGNhbGxzaWduICovXG4gIGNhbGxzaWduOiBzdHJpbmc7XG4gIC8qKiByZW1vdGUgc3RhdGlvbidzIE1haWRlbmhlYWQgZ3JpZCAqL1xuICBncmlkOiBzdHJpbmc7XG4gIC8qKiBwb3dlciBpbiBkQm0gKi9cbiAgcG93ZXI6IG51bWJlcjtcbiAgLyoqIHdoZXRoZXIgdGhlIGRlY29kZSBjYW1lIGZyb20gcGxheWJhY2sgb2YgYSByZWNvcmRpbmcgKi9cbiAgb2ZmQWlyOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoaXMgIG1lc3NhZ2UgYWxsb3dzICB0aGUgc2VydmVyICB0byBzZXQgIHRoZSBjdXJyZW50ICBjdXJyZW50XG4gKiBnZW9ncmFwaGljYWwgbG9jYXRpb24gIG9mIG9wZXJhdGlvbi4gVGhlIHN1cHBsaWVkICBsb2NhdGlvbiBpc1xuICogbm90IHBlcnNpc3RlbnQgYnV0ICBpcyB1c2VkIGFzIGEgIHNlc3Npb24gbGlmZXRpbWUgcmVwbGFjZW1lbnRcbiAqIGxvY3Rpb24gdGhhdCBvdmVycmlkZXMgdGhlIE1haWRlbmhlYWQgIGdyaWQgbG9jYXRlciBzZXQgaW4gdGhlXG4gKiBhcHBsaWNhdGlvbiAgc2V0dGluZ3MuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDQwNikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhMb2NhdGlvbiB7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIE1haWRlbmhlYWQgZ3JpZCB0byBzZXQgYXMgdGhlIGxvY2FsIHN0YXRpb24ncyBwb3NpdGlvbiAqL1xuICBsb2NhdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSAgbG9nZ2VkIEFESUYgIG1lc3NhZ2UgaXMgIHNlbnQgdG8gIHRoZSBzZXJ2ZXIocykgIHdoZW4gdGhlXG4gKiBXU0pULVggdXNlciBhY2NlcHRzIHRoZSBcIkxvZyAgUVNPXCIgZGlhbG9nIGJ5IGNsaWNraW5nIHRoZSBcIk9LXCJcbiAqIGJ1dHRvbi5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsNDIzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eExvZ2dlZEFkaWYge1xuICAvKiogV1NKVC1YIGNsaWVudCBuYW1lICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBBRElGIGVuY29kZWQgUVNPIGRhdGEgKi9cbiAgYWRpZjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXIgIG1heSBzZW5kICB0aGlzIG1lc3NhZ2UgYXQgIGFueSB0aW1lLiAgIFRoZSBtZXNzYWdlXG4gKiBzcGVjaWZpZXMgIHRoZSBiYWNrZ3JvdW5kICBhbmQgZm9yZWdyb3VuZCAgY29sb3IgdGhhdCAgd2lsbCBiZVxuICogdXNlZCAgdG8gIGhpZ2hsaWdodCAgdGhlICBzcGVjaWZpZWQgY2FsbHNpZ24gIGluICB0aGUgIGRlY29kZWRcbiAqIG1lc3NhZ2VzICBwcmludGVkICBpbiB0aGUgIEJhbmQgIEFjdGl2aXR5ICBwYW5lbC5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsNDQ0KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eEhpZ2hsaWdodENhbGxzaWduIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogV2hpY2ggY2FsbHNpZ24gdG8gaGlnaGxpZ2h0ICovXG4gIGNhbGxzaWduOiBzdHJpbmc7XG4gIC8qKiBCYWNrZ3JvdW5kIGNvbG9yLiBBbGwgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCA0IGZvcm1hdHMgc2hvdWxkIGJlIHZhbGlkLlxuICAgKiBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1jb2xvci00LyAqL1xuICBiYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgLyoqIEZvcmVncm91bmQgY29sb3IuIEFsbCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDQgZm9ybWF0cyBzaG91bGQgYmUgdmFsaWQuXG4gICAqIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLWNvbG9yLTQvICovXG4gIGZvcmVncm91bmRDb2xvcjogc3RyaW5nO1xuICAvKiogVGhlIFwiSGlnaGxpZ2h0IGxhc3RcIiAgZmllbGQgYWxsb3dzIHRoZSBzZW5kZXIgIHRvIHJlcXVlc3QgdGhhdFxuICAgKiBhbGwgaW5zdGFuY2VzIG9mICBcIkNhbGxzaWduXCIgaW4gdGhlIGxhc3QgIHBlcmlvZCBvbmx5LCBpbnN0ZWFkXG4gICAqIG9mIGFsbCBpbnN0YW5jZXMgaW4gYWxsIHBlcmlvZHMsIGJlIGhpZ2hsaWdodGVkLiAqL1xuICBoaWdobGlnaHRMYXN0OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0byByZXNldCB0aGUgaGlnaGxpZ2h0aW5nIHRvIGRlZmF1bHQgKG92ZXJyaWRlcyBiYWNrZ3JvdW5kIGFuZCBmb3JlZ3JvdW5kIGNvbG9ycykgKi9cbiAgcmVzZXQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogVGhlIHNlcnZlciAgbWF5IHNlbmQgIHRoaXMgbWVzc2FnZSBhdCAgYW55IHRpbWUuICAgVGhlIG1lc3NhZ2VcbiAqIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgIGNvbmZpZ3VyYXRpb24gdG8gc3dpdGNoIHRvLiBUaGUgbmV3XG4gKiBjb25maWd1cmF0aW9uIG11c3QgZXhpc3QuXG4gKlxuICogU2VlXG4gKiBbV1NKVC1YIHNvdXJjZV0oaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC93c2p0L3dzanR4L2NpL3dzanR4LTIuNS4yL3RyZWUvTmV0d29yay9OZXR3b3JrTWVzc2FnZS5ocHAjbDQ0NSkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3NqdHhTd2l0Y2hDb25maWd1cmF0aW9uIHtcbiAgLyoqIFdTSlQtWCBjbGllbnQgbmFtZSAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogTmV3IGNvbmZpZ3VyYXRpb24gc2V0IHRvIHVzZSAobXVzdCBhbHJlYWR5IGV4aXN0KSAqL1xuICBjb25maWd1cmF0aW9uTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXIgIG1heSBzZW5kICB0aGlzIG1lc3NhZ2UgYXQgIGFueSB0aW1lLiAgIFRoZSBtZXNzYWdlXG4gKiBzcGVjaWZpZXMgIHZhcmlvdXMgIGNvbmZpZ3VyYXRpb24gIG9wdGlvbnMuICBGb3IgIHV0ZjggIHN0cmluZ1xuICogZmllbGRzIGFuIGVtcHR5IHZhbHVlIGltcGxpZXMgbm8gY2hhbmdlLCBmb3IgdGhlIHF1aW50MzIgUnggREZcbiAqIGFuZCAgRnJlcXVlbmN5ICBUb2xlcmFuY2UgIGZpZWxkcyB0aGUgIG1heGltdW0gIHF1aW50MzIgIHZhbHVlXG4gKiBpbXBsaWVzICBubyBjaGFuZ2UuICAgSW52YWxpZCBvciAgdW5yZWNvZ25pemVkIHZhbHVlcyAgd2lsbCBiZVxuICogc2lsZW50bHkgaWdub3JlZC5cbiAqXG4gKiBTZWVcbiAqIFtXU0pULVggc291cmNlXShodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3dzanQvd3NqdHgvY2kvd3NqdHgtMi41LjIvdHJlZS9OZXR3b3JrL05ldHdvcmtNZXNzYWdlLmhwcCNsNDc5KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXc2p0eENvbmZpZ3VyZSB7XG4gIC8qKiBXU0pULVggY2xpZW50IG5hbWUgKi9cbiAgaWQ6IHN0cmluZztcbiAgLyoqIFdoaWNoIHByb3RvY29sIHRvIGRlY29kZSBhbmQgc2VuZCAqL1xuICBtb2RlOiBzdHJpbmc7XG4gIGZyZXF1ZW5jeVRvbGVyYW5jZTogbnVtYmVyO1xuICAvKiogV2hpY2ggc3ViLXByb3RvY29sIHRvIGRlY29kZSBhbmQgc2VuZCAqL1xuICBzdWJtb2RlOiBzdHJpbmc7XG4gIGZhc3RNb2RlOiBib29sZWFuO1xuICAvKiogV2hpY2ggcHJvdG9jb2wgdG8gZGVjb2RlIGFuZCBzZW5kICovXG4gIHRyUGVyaW9kOiBudW1iZXI7XG4gIC8qKiBSZWNlaXZlIGRlbHRhIChhYm92ZSBkaWFsKSBmcmVxdWVuY3kgaW4gaGVydHooPykgKi9cbiAgcnhERjogbnVtYmVyO1xuICAvKiogVGhlIHJlbW90ZSBzdGF0aW9uJ3MgY2FsbHNpZ24gKi9cbiAgZHhDYWxsOiBzdHJpbmc7XG4gIC8qKiBUaGUgcmVtb3RlIHN0YXRpb24ncyBNYWlkZW5oZWFkIGdyaWQgKi9cbiAgZHhHcmlkOiBzdHJpbmc7XG4gIC8qKiBSZWdlbmVyYXRlIHRoZSBzdGFuZGFyZCBtZXNzYWdlcyAqL1xuICBnZW5lcmF0ZU1lc3NhZ2VzOiBib29sZWFuO1xufVxuIl19