@agilemotion/oui-react-js 2.0.16 → 2.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/components/Calender.css +1 -1
  2. package/dist/components/TableCellContent.js +8 -18
  3. package/dist/components/dashboard/FoldingSideTabDashboard.css +1 -1
  4. package/dist/components/dashboard/FoldingSideTabDashboard.js +10 -7
  5. package/dist/components/form/LookupField.js +27 -3
  6. package/dist/components/layout/Layout.js +15 -3
  7. package/dist/components/layout/ViewPort.js +2 -2
  8. package/dist/components/layout/Window.css +4 -1
  9. package/dist/components/layout/Window.js +147 -29
  10. package/dist/components/layout/WindowDialog.js +8 -5
  11. package/dist/components/layout/WindowViewPort.js +8 -2
  12. package/dist/components/media/Chat.js +4 -2
  13. package/dist/components/media/ClosablePanel.js +55 -27
  14. package/dist/components/media/MediaSoupHelper.js +13 -1
  15. package/dist/components/media/SideBarContent.js +22 -8
  16. package/dist/components/media/TrainingRoom.js +32 -5
  17. package/dist/components/media/VCEventType.js +3 -1
  18. package/dist/components/media/VCParticipantList.js +53 -27
  19. package/dist/components/media/VCRoom.css +22 -0
  20. package/dist/components/media/VCRoom.js +34 -15
  21. package/dist/components/media/VCRoomParticipant.css +3 -2
  22. package/dist/components/media/VCRoomParticipant.js +140 -48
  23. package/dist/components/media/VCRoomRecorder.js +117 -40
  24. package/dist/components/media/VCRoomWorkspace.css +0 -1
  25. package/dist/components/media/VCRoomWorkspace.js +158 -23
  26. package/dist/components/media/VCSettings.js +462 -0
  27. package/dist/components/media/VideoPlayer.js +4 -1
  28. package/dist/components/media/audioLevelMeter.js +96 -0
  29. package/dist/components/media/chat/ChatRoom.js +13 -9
  30. package/dist/components/media/chat/ChatRoomItem.js +3 -2
  31. package/dist/components/media/chat/ChatRoomWrapper.js +4 -1
  32. package/dist/components/media/chat/ChatRooms.scss +5 -3
  33. package/dist/hooks/useContainerWidth.js +44 -0
  34. package/dist/view/security/RegisterInteractionPortal.js +101 -3
  35. package/package.json +1 -1
@@ -20,19 +20,60 @@ class VCRoomRecorder {
20
20
  _defineProperty(this, "addTrack", (id, track) => {
21
21
  console.log('ADDING TRACK FOR : ' + id);
22
22
  this.audioTracks.set(id, track);
23
- if (this.recorder && this.recorder.state === 'recording') {
24
- let mediaStream = new MediaStream([track]);
25
- const mediaStreamAudioSourceNode = new MediaStreamAudioSourceNode(this.audioContext, {
26
- mediaStream: mediaStream
27
- });
28
- mediaStreamAudioSourceNode.connect(this.mediaStreamAudioDestinationNode);
23
+ if (this.recorder && this.recorder.state === 'recording' && this.audioContext && this.mediaStreamAudioDestinationNode) {
24
+ this.connectAudioTrack(id, track);
29
25
  }
30
26
  });
31
27
  _defineProperty(this, "removeTrack", id => {
28
+ // Disconnect from the live mix before forgetting the track.
29
+ this.disconnectAudioTrack(id);
32
30
  if (this.audioTracks.has(id)) {
33
31
  this.audioTracks.delete(id);
34
32
  }
35
33
  });
34
+ // Route a participant's audio into the mixed recording destination. Replaces
35
+ // any existing node for the id so a re-add doesn't stack duplicate audio.
36
+ _defineProperty(this, "connectAudioTrack", (id, track) => {
37
+ if (!this.audioContext || !this.mediaStreamAudioDestinationNode || !track) {
38
+ return;
39
+ }
40
+ this.disconnectAudioTrack(id);
41
+ try {
42
+ const sourceNode = new MediaStreamAudioSourceNode(this.audioContext, {
43
+ mediaStream: new MediaStream([track])
44
+ });
45
+ sourceNode.connect(this.mediaStreamAudioDestinationNode);
46
+ this.audioSourceNodes.set(id, sourceNode);
47
+ } catch (e) {
48
+ console.error('Failed to connect audio track for ' + id, e);
49
+ }
50
+ });
51
+ _defineProperty(this, "disconnectAudioTrack", id => {
52
+ const existing = this.audioSourceNodes.get(id);
53
+ if (existing) {
54
+ try {
55
+ existing.disconnect();
56
+ } catch (e) {
57
+ /* node may already be detached */
58
+ }
59
+ this.audioSourceNodes.delete(id);
60
+ }
61
+ });
62
+ // Tear down the whole mixing graph. Idempotent.
63
+ _defineProperty(this, "releaseAudioGraph", () => {
64
+ for (const id of Array.from(this.audioSourceNodes.keys())) {
65
+ this.disconnectAudioTrack(id);
66
+ }
67
+ if (this.audioContext) {
68
+ try {
69
+ this.audioContext.close();
70
+ } catch (e) {
71
+ /* already closed */
72
+ }
73
+ this.audioContext = null;
74
+ }
75
+ this.mediaStreamAudioDestinationNode = null;
76
+ });
36
77
  _defineProperty(this, "handleRecordingDataAvailable", e => {
37
78
  if (e.data.size > 0) {
38
79
  console.log('ADDED CHUNK : ' + this.recordingSequence);
@@ -56,13 +97,14 @@ class VCRoomRecorder {
56
97
  _this.recordingType = blob.type;
57
98
  _this.recordingSize += blob.size;
58
99
  data.recordedData = result.replace('data:video/webm;base64,', '');
59
- console.log('======== SAVING RECORDING CHUNK =========');
60
- console.log(data);
61
- _SocketManager.default.emitEvent(_VCEventType.VCEventType.SAVE_RECORDING, data).then(data => {
62
- console.log('===== SAVE RECORDING SUCCESS ======');
100
+
101
+ // Send STOP_RECORDING once the recording has been stopped, whether or
102
+ // not the final chunk saved — otherwise a failed last SAVE_RECORDING
103
+ // would leave the recording un-finalised server-side.
104
+ const finalizeStop = () => {
63
105
  if (!_this.isRecording) {
64
106
  console.log('======= STOPPING RECORDING =======', _this.meetingTitle);
65
- const data = {
107
+ _SocketManager.default.emitEvent(_VCEventType.VCEventType.STOP_RECORDING, {
66
108
  meetingId: _this.meetingId,
67
109
  userId: _ApplicationManager.default.getUserDetails().username,
68
110
  name: _this.meetingTitle,
@@ -70,11 +112,18 @@ class VCRoomRecorder {
70
112
  size: _this.recordingSize,
71
113
  sequenceNumber: _this.recordingSequence,
72
114
  sessionId: _this.currentRecordingId
73
- };
74
- _SocketManager.default.emitEvent(_VCEventType.VCEventType.STOP_RECORDING, data).catch(error => {});
115
+ }).catch(error => {
116
+ console.error('STOP RECORDING ERROR', error);
117
+ });
75
118
  }
119
+ };
120
+ console.log('======== SAVING RECORDING CHUNK =========');
121
+ _SocketManager.default.emitEvent(_VCEventType.VCEventType.SAVE_RECORDING, data).then(() => {
122
+ console.log('===== SAVE RECORDING SUCCESS ======');
123
+ finalizeStop();
76
124
  }).catch(error => {
77
- console.log('===== SAVE RECORDING ERROR ======');
125
+ console.error('SAVE RECORDING ERROR', error);
126
+ finalizeStop();
78
127
  });
79
128
  };
80
129
  _this.recordingSequence++;
@@ -86,7 +135,9 @@ class VCRoomRecorder {
86
135
  this.recorder = null;
87
136
  try {
88
137
  this.recorder = await this.createMediaRecorder();
89
- } catch (e) {}
138
+ } catch (e) {
139
+ console.error('FAILED TO CREATE MEDIA RECORDER', e);
140
+ }
90
141
  let _this = this;
91
142
  if (this.recorder != null) {
92
143
  _SocketManager.default.emitEvent(_VCEventType.VCEventType.TOGGLE_RECORD_MEETING, {
@@ -103,6 +154,13 @@ class VCRoomRecorder {
103
154
  }).catch(error => {
104
155
  console.log('RECORD START ERROR');
105
156
  console.log(error);
157
+ // The recorder was created (screen-share prompt accepted) but the
158
+ // server never acknowledged — release the captured media + graph.
159
+ _this.releaseAudioGraph();
160
+ if (_this.recorder && _this.recorder.stream) {
161
+ _this.recorder.stream.getTracks().forEach(t => t.stop());
162
+ }
163
+ _this.recorder = null;
106
164
  });
107
165
  }
108
166
  });
@@ -112,17 +170,25 @@ class VCRoomRecorder {
112
170
  _SocketManager.default.emitEvent(_VCEventType.VCEventType.TOGGLE_RECORD_MEETING, {
113
171
  roomId: this.meetingId,
114
172
  isRecording: false
115
- }).catch(error => {});
173
+ }).catch(error => {
174
+ console.error('TOGGLE RECORD (stop) ERROR', error);
175
+ });
116
176
  if (this.recorder && this.recorder.stream) {
117
177
  if (this.recorder.stream.getVideoTracks().length > 0) {
118
178
  this.recorder.stream.getVideoTracks()[0].stop();
119
179
  }
120
180
  if (this.recorder.state === 'recording') {
181
+ // onstop releases the audio graph after the final chunk flushes.
121
182
  this.recorder.stop();
183
+ return;
122
184
  }
123
185
  }
186
+
187
+ // No active recorder to stop — release the graph directly.
188
+ this.releaseAudioGraph();
124
189
  } catch (e) {
125
190
  console.error(e);
191
+ this.releaseAudioGraph();
126
192
  }
127
193
  });
128
194
  _defineProperty(this, "createMediaRecorder", () => {
@@ -142,32 +208,37 @@ class VCRoomRecorder {
142
208
  const options = {
143
209
  mimeType: 'video/webm; codecs=vp9'
144
210
  };
145
- let audioContext = new AudioContext();
146
- let mediaStreamAudioDestinationNode = new MediaStreamAudioDestinationNode(audioContext);
147
- let tracks = [mediaStreamAudioDestinationNode.stream.getAudioTracks()[0], stream.getVideoTracks()[0]];
148
- if (this.audioTracks.size > 0) {
149
- for (const value of this.audioTracks.values()) {
150
- tracks.push(value);
151
- let mediaStreamAudioSourceNode = new MediaStreamAudioSourceNode(audioContext, {
152
- mediaStream: new MediaStream([value])
153
- });
154
- mediaStreamAudioSourceNode.connect(mediaStreamAudioDestinationNode);
155
- }
156
- } else {
157
- let mediaStreamAudioSourceNode = new MediaStreamAudioSourceNode(audioContext, {
158
- mediaStream: new MediaStream(tracks)
159
- });
160
- mediaStreamAudioSourceNode.connect(mediaStreamAudioDestinationNode);
211
+ const audioContext = new AudioContext();
212
+ const mediaStreamAudioDestinationNode = new MediaStreamAudioDestinationNode(audioContext);
213
+ _this.audioContext = audioContext;
214
+ _this.mediaStreamAudioDestinationNode = mediaStreamAudioDestinationNode;
215
+ _this.audioSourceNodes = new Map();
216
+
217
+ // Mix every known participant's audio into the single destination
218
+ // track (tracked so we can disconnect them later).
219
+ for (const [id, track] of _this.audioTracks.entries()) {
220
+ _this.connectAudioTrack(id, track);
161
221
  }
162
- console.log('INIT WITH TRACKS : ', tracks);
163
- let initialMediaStream = new MediaStream(tracks);
222
+
223
+ // Record ONLY the mixed audio + screen video. (Pushing the raw
224
+ // per-participant tracks here used to rely on MediaRecorder
225
+ // silently ignoring extra audio tracks — fragile across browsers.)
226
+ const recordedTracks = [mediaStreamAudioDestinationNode.stream.getAudioTracks()[0], stream.getVideoTracks()[0]];
227
+ const initialMediaStream = new MediaStream(recordedTracks);
164
228
  const recorder = new MediaRecorder(initialMediaStream, options);
165
229
  recorder.ondataavailable = _this.handleRecordingDataAvailable;
166
- recorder.onstop = e => {
230
+ recorder.onstop = () => {
167
231
  _this.isRecording = false;
232
+ _this.releaseAudioGraph();
168
233
  };
169
- this.audioContext = audioContext;
170
- this.mediaStreamAudioDestinationNode = mediaStreamAudioDestinationNode;
234
+
235
+ // If the user ends the share via the browser's own "Stop sharing"
236
+ // control, the video track ends — stop the recording cleanly
237
+ // instead of carrying on with a dead track.
238
+ const videoTrack = stream.getVideoTracks()[0];
239
+ if (videoTrack) {
240
+ videoTrack.onended = () => _this.stopRecordingMeeting();
241
+ }
171
242
  resolve(recorder);
172
243
  }).catch(e => {
173
244
  console.error(e);
@@ -179,13 +250,19 @@ class VCRoomRecorder {
179
250
  this.meetingTitle = '';
180
251
  this.recordingSequence = 0;
181
252
  this.currentRecordingId = null;
182
- this.recordingType = null;
183
- this.recordingSize = null;
253
+ this.recordingType = '';
254
+ this.recordingSize = 0;
184
255
  this.isRecording = false;
185
256
  this.recorder = null;
186
257
  this.audioTracks = new Map();
258
+ // Web Audio graph used to mix every participant's audio into one track.
259
+ this.audioContext = null;
260
+ this.mediaStreamAudioDestinationNode = null;
261
+ // Source nodes keyed by participant id so they can be disconnected when a
262
+ // participant leaves (otherwise they leak + re-adds stack duplicate audio).
263
+ this.audioSourceNodes = new Map();
187
264
  }
188
265
  }
189
266
  const instance = new VCRoomRecorder();
190
267
  var _default = exports.default = instance;
191
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfU29ja2V0TWFuYWdlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX1ZDRXZlbnRUeXBlIiwiX0FwcGxpY2F0aW9uTWFuYWdlciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIl9kZWZpbmVQcm9wZXJ0eSIsInIiLCJ0IiwiX3RvUHJvcGVydHlLZXkiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiaSIsIl90b1ByaW1pdGl2ZSIsIlN5bWJvbCIsInRvUHJpbWl0aXZlIiwiY2FsbCIsIlR5cGVFcnJvciIsIlN0cmluZyIsIk51bWJlciIsIlZDUm9vbVJlY29yZGVyIiwiY29uc3RydWN0b3IiLCJtZWV0aW5nSWQiLCJtZWV0aW5nVGl0bGUiLCJpZCIsInRyYWNrIiwiY29uc29sZSIsImxvZyIsImF1ZGlvVHJhY2tzIiwic2V0IiwicmVjb3JkZXIiLCJzdGF0ZSIsIm1lZGlhU3RyZWFtIiwiTWVkaWFTdHJlYW0iLCJtZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZSIsIk1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlIiwiYXVkaW9Db250ZXh0IiwiY29ubmVjdCIsIm1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUiLCJoYXMiLCJkZWxldGUiLCJkYXRhIiwic2l6ZSIsInJlY29yZGluZ1NlcXVlbmNlIiwiYmxvYiIsIkJsb2IiLCJ0eXBlIiwidXNlcklkIiwiYXBwbGljYXRpb25NYW5hZ2VyIiwiZ2V0VXNlckRldGFpbHMiLCJ1c2VybmFtZSIsIm5hbWUiLCJzZXF1ZW5jZU51bWJlciIsInNlc3Npb25JZCIsImN1cnJlbnRSZWNvcmRpbmdJZCIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJyZWFkQXNEYXRhVVJMIiwiX3RoaXMiLCJvbmxvYWQiLCJldnQiLCJyZXN1bHQiLCJ0YXJnZXQiLCJyZWNvcmRpbmdUeXBlIiwicmVjb3JkaW5nU2l6ZSIsInJlY29yZGVkRGF0YSIsInJlcGxhY2UiLCJzb2NrZXRNYW5hZ2VyIiwiZW1pdEV2ZW50IiwiVkNFdmVudFR5cGUiLCJTQVZFX1JFQ09SRElORyIsInRoZW4iLCJpc1JlY29yZGluZyIsIlNUT1BfUkVDT1JESU5HIiwiY2F0Y2giLCJlcnJvciIsImNyZWF0ZU1lZGlhUmVjb3JkZXIiLCJUT0dHTEVfUkVDT1JEX01FRVRJTkciLCJyb29tSWQiLCJzdGFydCIsInN0cmVhbSIsImdldFZpZGVvVHJhY2tzIiwibGVuZ3RoIiwic3RvcCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwidmlkZW9Db25zdHJhaW50cyIsImN1cnNvciIsImF1ZGlvIiwibWVkaWFTb3VyY2UiLCJwcmVmZXJDdXJyZW50VGFiIiwic2VsZkJyb3dzZXJTdXJmYWNlIiwic3lzdGVtQXVkaW8iLCJzdXJmYWNlU3dpdGNoaW5nIiwibW9uaXRvclR5cGVTdXJmYWNlcyIsIm5hdmlnYXRvciIsIm1lZGlhRGV2aWNlcyIsImdldERpc3BsYXlNZWRpYSIsIm9wdGlvbnMiLCJtaW1lVHlwZSIsIkF1ZGlvQ29udGV4dCIsIk1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUiLCJ0cmFja3MiLCJnZXRBdWRpb1RyYWNrcyIsInZhbHVlcyIsInB1c2giLCJpbml0aWFsTWVkaWFTdHJlYW0iLCJNZWRpYVJlY29yZGVyIiwib25kYXRhYXZhaWxhYmxlIiwiaGFuZGxlUmVjb3JkaW5nRGF0YUF2YWlsYWJsZSIsIm9uc3RvcCIsIkVycm9yIiwibWVzc2FnZSIsIk1hcCIsImluc3RhbmNlIiwiX2RlZmF1bHQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21lZGlhL1ZDUm9vbVJlY29yZGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzb2NrZXRNYW5hZ2VyIGZyb20gJy4uL1NvY2tldE1hbmFnZXInO1xuaW1wb3J0IHsgVkNFdmVudFR5cGUgfSBmcm9tICcuL1ZDRXZlbnRUeXBlJztcbmltcG9ydCBhcHBsaWNhdGlvbk1hbmFnZXIgZnJvbSBcIi4uLy4uL0FwcGxpY2F0aW9uTWFuYWdlclwiO1xuXG5jbGFzcyBWQ1Jvb21SZWNvcmRlciB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5tZWV0aW5nSWQgPSBudWxsO1xuICAgICAgICB0aGlzLm1lZXRpbmdUaXRsZSA9ICcnO1xuICAgICAgICB0aGlzLnJlY29yZGluZ1NlcXVlbmNlID0gMDtcbiAgICAgICAgdGhpcy5jdXJyZW50UmVjb3JkaW5nSWQgPSBudWxsO1xuICAgICAgICB0aGlzLnJlY29yZGluZ1R5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLnJlY29yZGluZ1NpemUgPSBudWxsO1xuICAgICAgICB0aGlzLmlzUmVjb3JkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVjb3JkZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmF1ZGlvVHJhY2tzID0gbmV3IE1hcCgpO1xuICAgIH1cblxuICAgIGluaXQgPSBhc3luYyAobWVldGluZ0lkLCBtZWV0aW5nVGl0bGUpID0+IHtcbiAgICAgICAgdGhpcy5tZWV0aW5nSWQgPSBtZWV0aW5nSWQ7XG4gICAgICAgIHRoaXMubWVldGluZ1RpdGxlID0gbWVldGluZ1RpdGxlO1xuICAgIH07XG5cbiAgICBhZGRUcmFjayA9IChpZCwgdHJhY2spID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0FERElORyBUUkFDSyBGT1IgOiAnICsgaWQpO1xuICAgICAgICB0aGlzLmF1ZGlvVHJhY2tzLnNldChpZCwgdHJhY2spO1xuXG4gICAgICAgIGlmICh0aGlzLnJlY29yZGVyICYmIHRoaXMucmVjb3JkZXIuc3RhdGUgPT09ICdyZWNvcmRpbmcnKSB7XG4gICAgICAgICAgICBsZXQgbWVkaWFTdHJlYW0gPSBuZXcgTWVkaWFTdHJlYW0oW3RyYWNrXSk7XG4gICAgICAgICAgICBjb25zdCBtZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZSA9IG5ldyBNZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZShcbiAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvQ29udGV4dCxcbiAgICAgICAgICAgICAgICB7IG1lZGlhU3RyZWFtOiBtZWRpYVN0cmVhbSB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBtZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZS5jb25uZWN0KHRoaXMubWVkaWFTdHJlYW1BdWRpb0Rlc3RpbmF0aW9uTm9kZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVtb3ZlVHJhY2sgPSAoaWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuYXVkaW9UcmFja3MuaGFzKGlkKSkge1xuICAgICAgICAgICAgdGhpcy5hdWRpb1RyYWNrcy5kZWxldGUoaWQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGhhbmRsZVJlY29yZGluZ0RhdGFBdmFpbGFibGUgPSAoZSkgPT4ge1xuICAgICAgICBpZiAoZS5kYXRhLnNpemUgPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQURERUQgQ0hVTksgOiAnICsgdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSk7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2UuZGF0YV0sIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndmlkZW8vd2VibScsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICB1c2VySWQ6IGFwcGxpY2F0aW9uTWFuYWdlci5nZXRVc2VyRGV0YWlscygpLnVzZXJuYW1lLFxuICAgICAgICAgICAgICAgIG1lZXRpbmdJZDogdGhpcy5tZWV0aW5nSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5tZWV0aW5nVGl0bGUsXG4gICAgICAgICAgICAgICAgdHlwZTogYmxvYi50eXBlLFxuICAgICAgICAgICAgICAgIHNpemU6IGJsb2Iuc2l6ZSxcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZU51bWJlcjogdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSxcbiAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMuY3VycmVudFJlY29yZGluZ0lkXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0RhdGFVUkwoYmxvYik7XG4gICAgICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGV2dC50YXJnZXQucmVzdWx0O1xuICAgICAgICAgICAgICAgIF90aGlzLnJlY29yZGluZ1R5cGUgPSBibG9iLnR5cGU7XG4gICAgICAgICAgICAgICAgX3RoaXMucmVjb3JkaW5nU2l6ZSArPSBibG9iLnNpemU7XG5cbiAgICAgICAgICAgICAgICBkYXRhLnJlY29yZGVkRGF0YSA9IHJlc3VsdC5yZXBsYWNlKCdkYXRhOnZpZGVvL3dlYm07YmFzZTY0LCcsICcnKTtcblxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09PSBTQVZJTkcgUkVDT1JESU5HIENIVU5LID09PT09PT09PScpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICAgICAgICAgIHNvY2tldE1hbmFnZXIuZW1pdEV2ZW50KFZDRXZlbnRUeXBlLlNBVkVfUkVDT1JESU5HLCBkYXRhKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJz09PT09IFNBVkUgUkVDT1JESU5HIFNVQ0NFU1MgPT09PT09Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV90aGlzLmlzUmVjb3JkaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJz09PT09PT0gU1RPUFBJTkcgUkVDT1JESU5HID09PT09PT0nLCBfdGhpcy5tZWV0aW5nVGl0bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZXRpbmdJZDogX3RoaXMubWVldGluZ0lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ6IGFwcGxpY2F0aW9uTWFuYWdlci5nZXRVc2VyRGV0YWlscygpLnVzZXJuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBfdGhpcy5tZWV0aW5nVGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IF90aGlzLnJlY29yZGluZ1R5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IF90aGlzLnJlY29yZGluZ1NpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyOiBfdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkOiBfdGhpcy5jdXJyZW50UmVjb3JkaW5nSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0TWFuYWdlci5lbWl0RXZlbnQoVkNFdmVudFR5cGUuU1RPUF9SRUNPUkRJTkcsIGRhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCc9PT09PSBTQVZFIFJFQ09SRElORyBFUlJPUiA9PT09PT0nKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBfdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ25vIGRhdGEgdG8gcHVzaCcpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJlY29yZE1lZXRpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVjb3JkZXIgPSBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnJlY29yZGVyID0gYXdhaXQgdGhpcy5jcmVhdGVNZWRpYVJlY29yZGVyKCk7XG4gICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKHRoaXMucmVjb3JkZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgc29ja2V0TWFuYWdlci5lbWl0RXZlbnQoVkNFdmVudFR5cGUuVE9HR0xFX1JFQ09SRF9NRUVUSU5HLCB7XG4gICAgICAgICAgICAgICAgcm9vbUlkOiBfdGhpcy5tZWV0aW5nSWQsXG4gICAgICAgICAgICAgICAgaXNSZWNvcmRpbmc6IHRydWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1JFQ09SRElORyBTVEFSVEVEIDogJyArIGRhdGEuaWQpO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5jdXJyZW50UmVjb3JkaW5nSWQgPSBkYXRhLmlkO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlY29yZGluZ1NpemUgPSAwO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWNvcmRpbmdUeXBlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlY29yZGVyLnN0YXJ0KDYwMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuaXNSZWNvcmRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUkVDT1JEIFNUQVJUIEVSUk9SJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBzdG9wUmVjb3JkaW5nTWVldGluZyA9ICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHNvY2tldE1hbmFnZXIuZW1pdEV2ZW50KFZDRXZlbnRUeXBlLlRPR0dMRV9SRUNPUkRfTUVFVElORywge1xuICAgICAgICAgICAgICAgIHJvb21JZDogdGhpcy5tZWV0aW5nSWQsXG4gICAgICAgICAgICAgICAgaXNSZWNvcmRpbmc6IGZhbHNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMucmVjb3JkZXIgJiYgdGhpcy5yZWNvcmRlci5zdHJlYW0pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNvcmRlci5zdHJlYW0uZ2V0VmlkZW9UcmFja3MoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb3JkZXIuc3RyZWFtLmdldFZpZGVvVHJhY2tzKClbMF0uc3RvcCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmKHRoaXMucmVjb3JkZXIuc3RhdGUgPT09ICdyZWNvcmRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb3JkZXIuc3RvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjcmVhdGVNZWRpYVJlY29yZGVyID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmlkZW9Db25zdHJhaW50cyA9IHtcbiAgICAgICAgICAgICAgICBjdXJzb3I6IHRydWUsXG4gICAgICAgICAgICAgICAgYXVkaW86IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lZGlhU291cmNlOiBcInNjcmVlblwiLFxuICAgICAgICAgICAgICAgIHByZWZlckN1cnJlbnRUYWI6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VsZkJyb3dzZXJTdXJmYWNlOiAnaW5jbHVkZScsXG4gICAgICAgICAgICAgICAgc3lzdGVtQXVkaW86ICdleGNsdWRlJyxcbiAgICAgICAgICAgICAgICBzdXJmYWNlU3dpdGNoaW5nOiAnZXhjbHVkZScsXG4gICAgICAgICAgICAgICAgbW9uaXRvclR5cGVTdXJmYWNlczogJ2V4Y2x1ZGUnXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgICAgICAgICAgIC5nZXREaXNwbGF5TWVkaWEodmlkZW9Db25zdHJhaW50cylcbiAgICAgICAgICAgICAgICAudGhlbigoc3RyZWFtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZTogJ3ZpZGVvL3dlYm07IGNvZGVjcz12cDknXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvQ29udGV4dCA9IG5ldyBBdWRpb0NvbnRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUgPSBuZXcgTWVkaWFTdHJlYW1BdWRpb0Rlc3RpbmF0aW9uTm9kZShhdWRpb0NvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB0cmFja3MgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVN0cmVhbUF1ZGlvRGVzdGluYXRpb25Ob2RlLnN0cmVhbS5nZXRBdWRpb1RyYWNrcygpWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmdldFZpZGVvVHJhY2tzKClbMF1cbiAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdWRpb1RyYWNrcy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLmF1ZGlvVHJhY2tzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tzLnB1c2godmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZSA9IG5ldyBNZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Db250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lZGlhU3RyZWFtOiBuZXcgTWVkaWFTdHJlYW0oW3ZhbHVlXSkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZS5jb25uZWN0KG1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlID0gbmV3IE1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG1lZGlhU3RyZWFtOiBuZXcgTWVkaWFTdHJlYW0odHJhY2tzKSB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZS5jb25uZWN0KG1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0lOSVQgV0lUSCBUUkFDS1MgOiAnLCB0cmFja3MpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbE1lZGlhU3RyZWFtID0gbmV3IE1lZGlhU3RyZWFtKHRyYWNrcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkZXIgPSBuZXcgTWVkaWFSZWNvcmRlcihpbml0aWFsTWVkaWFTdHJlYW0sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRlci5vbmRhdGFhdmFpbGFibGUgPSBfdGhpcy5oYW5kbGVSZWNvcmRpbmdEYXRhQXZhaWxhYmxlO1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRlci5vbnN0b3AgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvQ29udGV4dCA9IGF1ZGlvQ29udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpYVN0cmVhbUF1ZGlvRGVzdGluYXRpb25Ob2RlID0gbWVkaWFTdHJlYW1BdWRpb0Rlc3RpbmF0aW9uTm9kZTtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlY29yZGVyKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihlLm1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuY29uc3QgaW5zdGFuY2UgPSBuZXcgVkNSb29tUmVjb3JkZXIoKTtcbmV4cG9ydCBkZWZhdWx0IGluc3RhbmNlO1xuXG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLGNBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFlBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLG1CQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFBMEQsU0FBQUQsdUJBQUFJLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVBQUFGLENBQUE7QUFBQSxTQUFBRyxnQkFBQUgsQ0FBQSxFQUFBSSxDQUFBLEVBQUFDLENBQUEsWUFBQUQsQ0FBQSxHQUFBRSxjQUFBLENBQUFGLENBQUEsTUFBQUosQ0FBQSxHQUFBTyxNQUFBLENBQUFDLGNBQUEsQ0FBQVIsQ0FBQSxFQUFBSSxDQUFBLElBQUFLLEtBQUEsRUFBQUosQ0FBQSxFQUFBSyxVQUFBLE1BQUFDLFlBQUEsTUFBQUMsUUFBQSxVQUFBWixDQUFBLENBQUFJLENBQUEsSUFBQUMsQ0FBQSxFQUFBTCxDQUFBO0FBQUEsU0FBQU0sZUFBQUQsQ0FBQSxRQUFBUSxDQUFBLEdBQUFDLFlBQUEsQ0FBQVQs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
268
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfU29ja2V0TWFuYWdlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX1ZDRXZlbnRUeXBlIiwiX0FwcGxpY2F0aW9uTWFuYWdlciIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIl9kZWZpbmVQcm9wZXJ0eSIsInIiLCJ0IiwiX3RvUHJvcGVydHlLZXkiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiaSIsIl90b1ByaW1pdGl2ZSIsIlN5bWJvbCIsInRvUHJpbWl0aXZlIiwiY2FsbCIsIlR5cGVFcnJvciIsIlN0cmluZyIsIk51bWJlciIsIlZDUm9vbVJlY29yZGVyIiwiY29uc3RydWN0b3IiLCJtZWV0aW5nSWQiLCJtZWV0aW5nVGl0bGUiLCJpZCIsInRyYWNrIiwiY29uc29sZSIsImxvZyIsImF1ZGlvVHJhY2tzIiwic2V0IiwicmVjb3JkZXIiLCJzdGF0ZSIsImF1ZGlvQ29udGV4dCIsIm1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUiLCJjb25uZWN0QXVkaW9UcmFjayIsImRpc2Nvbm5lY3RBdWRpb1RyYWNrIiwiaGFzIiwiZGVsZXRlIiwic291cmNlTm9kZSIsIk1lZGlhU3RyZWFtQXVkaW9Tb3VyY2VOb2RlIiwibWVkaWFTdHJlYW0iLCJNZWRpYVN0cmVhbSIsImNvbm5lY3QiLCJhdWRpb1NvdXJjZU5vZGVzIiwiZXJyb3IiLCJleGlzdGluZyIsImdldCIsImRpc2Nvbm5lY3QiLCJBcnJheSIsImZyb20iLCJrZXlzIiwiY2xvc2UiLCJkYXRhIiwic2l6ZSIsInJlY29yZGluZ1NlcXVlbmNlIiwiYmxvYiIsIkJsb2IiLCJ0eXBlIiwidXNlcklkIiwiYXBwbGljYXRpb25NYW5hZ2VyIiwiZ2V0VXNlckRldGFpbHMiLCJ1c2VybmFtZSIsIm5hbWUiLCJzZXF1ZW5jZU51bWJlciIsInNlc3Npb25JZCIsImN1cnJlbnRSZWNvcmRpbmdJZCIsInJlYWRlciIsIkZpbGVSZWFkZXIiLCJyZWFkQXNEYXRhVVJMIiwiX3RoaXMiLCJvbmxvYWQiLCJldnQiLCJyZXN1bHQiLCJ0YXJnZXQiLCJyZWNvcmRpbmdUeXBlIiwicmVjb3JkaW5nU2l6ZSIsInJlY29yZGVkRGF0YSIsInJlcGxhY2UiLCJmaW5hbGl6ZVN0b3AiLCJpc1JlY29yZGluZyIsInNvY2tldE1hbmFnZXIiLCJlbWl0RXZlbnQiLCJWQ0V2ZW50VHlwZSIsIlNUT1BfUkVDT1JESU5HIiwiY2F0Y2giLCJTQVZFX1JFQ09SRElORyIsInRoZW4iLCJjcmVhdGVNZWRpYVJlY29yZGVyIiwiVE9HR0xFX1JFQ09SRF9NRUVUSU5HIiwicm9vbUlkIiwic3RhcnQiLCJyZWxlYXNlQXVkaW9HcmFwaCIsInN0cmVhbSIsImdldFRyYWNrcyIsImZvckVhY2giLCJzdG9wIiwiZ2V0VmlkZW9UcmFja3MiLCJsZW5ndGgiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInZpZGVvQ29uc3RyYWludHMiLCJjdXJzb3IiLCJhdWRpbyIsIm1lZGlhU291cmNlIiwicHJlZmVyQ3VycmVudFRhYiIsInNlbGZCcm93c2VyU3VyZmFjZSIsInN5c3RlbUF1ZGlvIiwic3VyZmFjZVN3aXRjaGluZyIsIm1vbml0b3JUeXBlU3VyZmFjZXMiLCJuYXZpZ2F0b3IiLCJtZWRpYURldmljZXMiLCJnZXREaXNwbGF5TWVkaWEiLCJvcHRpb25zIiwibWltZVR5cGUiLCJBdWRpb0NvbnRleHQiLCJNZWRpYVN0cmVhbUF1ZGlvRGVzdGluYXRpb25Ob2RlIiwiTWFwIiwiZW50cmllcyIsInJlY29yZGVkVHJhY2tzIiwiZ2V0QXVkaW9UcmFja3MiLCJpbml0aWFsTWVkaWFTdHJlYW0iLCJNZWRpYVJlY29yZGVyIiwib25kYXRhYXZhaWxhYmxlIiwiaGFuZGxlUmVjb3JkaW5nRGF0YUF2YWlsYWJsZSIsIm9uc3RvcCIsInZpZGVvVHJhY2siLCJvbmVuZGVkIiwic3RvcFJlY29yZGluZ01lZXRpbmciLCJFcnJvciIsIm1lc3NhZ2UiLCJpbnN0YW5jZSIsIl9kZWZhdWx0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tZWRpYS9WQ1Jvb21SZWNvcmRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc29ja2V0TWFuYWdlciBmcm9tICcuLi9Tb2NrZXRNYW5hZ2VyJztcbmltcG9ydCB7IFZDRXZlbnRUeXBlIH0gZnJvbSAnLi9WQ0V2ZW50VHlwZSc7XG5pbXBvcnQgYXBwbGljYXRpb25NYW5hZ2VyIGZyb20gXCIuLi8uLi9BcHBsaWNhdGlvbk1hbmFnZXJcIjtcblxuY2xhc3MgVkNSb29tUmVjb3JkZXIge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMubWVldGluZ0lkID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZWV0aW5nVGl0bGUgPSAnJztcbiAgICAgICAgdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSA9IDA7XG4gICAgICAgIHRoaXMuY3VycmVudFJlY29yZGluZ0lkID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWNvcmRpbmdUeXBlID0gJyc7XG4gICAgICAgIHRoaXMucmVjb3JkaW5nU2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZWNvcmRlciA9IG51bGw7XG4gICAgICAgIHRoaXMuYXVkaW9UcmFja3MgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIFdlYiBBdWRpbyBncmFwaCB1c2VkIHRvIG1peCBldmVyeSBwYXJ0aWNpcGFudCdzIGF1ZGlvIGludG8gb25lIHRyYWNrLlxuICAgICAgICB0aGlzLmF1ZGlvQ29udGV4dCA9IG51bGw7XG4gICAgICAgIHRoaXMubWVkaWFTdHJlYW1BdWRpb0Rlc3RpbmF0aW9uTm9kZSA9IG51bGw7XG4gICAgICAgIC8vIFNvdXJjZSBub2RlcyBrZXllZCBieSBwYXJ0aWNpcGFudCBpZCBzbyB0aGV5IGNhbiBiZSBkaXNjb25uZWN0ZWQgd2hlbiBhXG4gICAgICAgIC8vIHBhcnRpY2lwYW50IGxlYXZlcyAob3RoZXJ3aXNlIHRoZXkgbGVhayArIHJlLWFkZHMgc3RhY2sgZHVwbGljYXRlIGF1ZGlvKS5cbiAgICAgICAgdGhpcy5hdWRpb1NvdXJjZU5vZGVzID0gbmV3IE1hcCgpO1xuICAgIH1cblxuICAgIGluaXQgPSBhc3luYyAobWVldGluZ0lkLCBtZWV0aW5nVGl0bGUpID0+IHtcbiAgICAgICAgdGhpcy5tZWV0aW5nSWQgPSBtZWV0aW5nSWQ7XG4gICAgICAgIHRoaXMubWVldGluZ1RpdGxlID0gbWVldGluZ1RpdGxlO1xuICAgIH07XG5cbiAgICBhZGRUcmFjayA9IChpZCwgdHJhY2spID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ0FERElORyBUUkFDSyBGT1IgOiAnICsgaWQpO1xuICAgICAgICB0aGlzLmF1ZGlvVHJhY2tzLnNldChpZCwgdHJhY2spO1xuXG4gICAgICAgIGlmICh0aGlzLnJlY29yZGVyICYmIHRoaXMucmVjb3JkZXIuc3RhdGUgPT09ICdyZWNvcmRpbmcnXG4gICAgICAgICAgICAmJiB0aGlzLmF1ZGlvQ29udGV4dCAmJiB0aGlzLm1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdEF1ZGlvVHJhY2soaWQsIHRyYWNrKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZW1vdmVUcmFjayA9IChpZCkgPT4ge1xuICAgICAgICAvLyBEaXNjb25uZWN0IGZyb20gdGhlIGxpdmUgbWl4IGJlZm9yZSBmb3JnZXR0aW5nIHRoZSB0cmFjay5cbiAgICAgICAgdGhpcy5kaXNjb25uZWN0QXVkaW9UcmFjayhpZCk7XG4gICAgICAgIGlmICh0aGlzLmF1ZGlvVHJhY2tzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9UcmFja3MuZGVsZXRlKGlkKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBSb3V0ZSBhIHBhcnRpY2lwYW50J3MgYXVkaW8gaW50byB0aGUgbWl4ZWQgcmVjb3JkaW5nIGRlc3RpbmF0aW9uLiBSZXBsYWNlc1xuICAgIC8vIGFueSBleGlzdGluZyBub2RlIGZvciB0aGUgaWQgc28gYSByZS1hZGQgZG9lc24ndCBzdGFjayBkdXBsaWNhdGUgYXVkaW8uXG4gICAgY29ubmVjdEF1ZGlvVHJhY2sgPSAoaWQsIHRyYWNrKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hdWRpb0NvbnRleHQgfHwgIXRoaXMubWVkaWFTdHJlYW1BdWRpb0Rlc3RpbmF0aW9uTm9kZSB8fCAhdHJhY2spIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpc2Nvbm5lY3RBdWRpb1RyYWNrKGlkKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZU5vZGUgPSBuZXcgTWVkaWFTdHJlYW1BdWRpb1NvdXJjZU5vZGUodGhpcy5hdWRpb0NvbnRleHQsIHtcbiAgICAgICAgICAgICAgICBtZWRpYVN0cmVhbTogbmV3IE1lZGlhU3RyZWFtKFt0cmFja10pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHNvdXJjZU5vZGUuY29ubmVjdCh0aGlzLm1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUpO1xuICAgICAgICAgICAgdGhpcy5hdWRpb1NvdXJjZU5vZGVzLnNldChpZCwgc291cmNlTm9kZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjb25uZWN0IGF1ZGlvIHRyYWNrIGZvciAnICsgaWQsIGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGRpc2Nvbm5lY3RBdWRpb1RyYWNrID0gKGlkKSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5hdWRpb1NvdXJjZU5vZGVzLmdldChpZCk7XG4gICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBleGlzdGluZy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLyogbm9kZSBtYXkgYWxyZWFkeSBiZSBkZXRhY2hlZCAqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hdWRpb1NvdXJjZU5vZGVzLmRlbGV0ZShpZCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gVGVhciBkb3duIHRoZSB3aG9sZSBtaXhpbmcgZ3JhcGguIElkZW1wb3RlbnQuXG4gICAgcmVsZWFzZUF1ZGlvR3JhcGggPSAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgQXJyYXkuZnJvbSh0aGlzLmF1ZGlvU291cmNlTm9kZXMua2V5cygpKSkge1xuICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0QXVkaW9UcmFjayhpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYXVkaW9Db250ZXh0KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9Db250ZXh0LmNsb3NlKCk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLyogYWxyZWFkeSBjbG9zZWQgKi9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXVkaW9Db250ZXh0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUgPSBudWxsO1xuICAgIH07XG5cbiAgICBoYW5kbGVSZWNvcmRpbmdEYXRhQXZhaWxhYmxlID0gKGUpID0+IHtcbiAgICAgICAgaWYgKGUuZGF0YS5zaXplID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0FEREVEIENIVU5LIDogJyArIHRoaXMucmVjb3JkaW5nU2VxdWVuY2UpO1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtlLmRhdGFdLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3ZpZGVvL3dlYm0nLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgdXNlcklkOiBhcHBsaWNhdGlvbk1hbmFnZXIuZ2V0VXNlckRldGFpbHMoKS51c2VybmFtZSxcbiAgICAgICAgICAgICAgICBtZWV0aW5nSWQ6IHRoaXMubWVldGluZ0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubWVldGluZ1RpdGxlLFxuICAgICAgICAgICAgICAgIHR5cGU6IGJsb2IudHlwZSxcbiAgICAgICAgICAgICAgICBzaXplOiBibG9iLnNpemUsXG4gICAgICAgICAgICAgICAgc2VxdWVuY2VOdW1iZXI6IHRoaXMucmVjb3JkaW5nU2VxdWVuY2UsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkOiB0aGlzLmN1cnJlbnRSZWNvcmRpbmdJZFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xuICAgICAgICAgICAgbGV0IF90aGlzID0gdGhpcztcblxuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBldnQudGFyZ2V0LnJlc3VsdDtcbiAgICAgICAgICAgICAgICBfdGhpcy5yZWNvcmRpbmdUeXBlID0gYmxvYi50eXBlO1xuICAgICAgICAgICAgICAgIF90aGlzLnJlY29yZGluZ1NpemUgKz0gYmxvYi5zaXplO1xuXG4gICAgICAgICAgICAgICAgZGF0YS5yZWNvcmRlZERhdGEgPSByZXN1bHQucmVwbGFjZSgnZGF0YTp2aWRlby93ZWJtO2Jhc2U2NCwnLCAnJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBTZW5kIFNUT1BfUkVDT1JESU5HIG9uY2UgdGhlIHJlY29yZGluZyBoYXMgYmVlbiBzdG9wcGVkLCB3aGV0aGVyIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90IHRoZSBmaW5hbCBjaHVuayBzYXZlZCDigJQgb3RoZXJ3aXNlIGEgZmFpbGVkIGxhc3QgU0FWRV9SRUNPUkRJTkdcbiAgICAgICAgICAgICAgICAvLyB3b3VsZCBsZWF2ZSB0aGUgcmVjb3JkaW5nIHVuLWZpbmFsaXNlZCBzZXJ2ZXItc2lkZS5cbiAgICAgICAgICAgICAgICBjb25zdCBmaW5hbGl6ZVN0b3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghX3RoaXMuaXNSZWNvcmRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCc9PT09PT09IFNUT1BQSU5HIFJFQ09SRElORyA9PT09PT09JywgX3RoaXMubWVldGluZ1RpdGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldE1hbmFnZXIuZW1pdEV2ZW50KFZDRXZlbnRUeXBlLlNUT1BfUkVDT1JESU5HLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVldGluZ0lkOiBfdGhpcy5tZWV0aW5nSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcklkOiBhcHBsaWNhdGlvbk1hbmFnZXIuZ2V0VXNlckRldGFpbHMoKS51c2VybmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBfdGhpcy5tZWV0aW5nVGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogX3RoaXMucmVjb3JkaW5nVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOiBfdGhpcy5yZWNvcmRpbmdTaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlTnVtYmVyOiBfdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQ6IF90aGlzLmN1cnJlbnRSZWNvcmRpbmdJZFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignU1RPUCBSRUNPUkRJTkcgRVJST1InLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnPT09PT09PT0gU0FWSU5HIFJFQ09SRElORyBDSFVOSyA9PT09PT09PT0nKTtcbiAgICAgICAgICAgICAgICBzb2NrZXRNYW5hZ2VyLmVtaXRFdmVudChWQ0V2ZW50VHlwZS5TQVZFX1JFQ09SRElORywgZGF0YSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJz09PT09IFNBVkUgUkVDT1JESU5HIFNVQ0NFU1MgPT09PT09Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZVN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignU0FWRSBSRUNPUkRJTkcgRVJST1InLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZVN0b3AoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBfdGhpcy5yZWNvcmRpbmdTZXF1ZW5jZSsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ25vIGRhdGEgdG8gcHVzaCcpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJlY29yZE1lZXRpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMucmVjb3JkZXIgPSBudWxsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnJlY29yZGVyID0gYXdhaXQgdGhpcy5jcmVhdGVNZWRpYVJlY29yZGVyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZBSUxFRCBUTyBDUkVBVEUgTUVESUEgUkVDT1JERVInLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBfdGhpcyA9IHRoaXM7XG4gICAgICAgIGlmICh0aGlzLnJlY29yZGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNvY2tldE1hbmFnZXIuZW1pdEV2ZW50KFZDRXZlbnRUeXBlLlRPR0dMRV9SRUNPUkRfTUVFVElORywge1xuICAgICAgICAgICAgICAgIHJvb21JZDogX3RoaXMubWVldGluZ0lkLFxuICAgICAgICAgICAgICAgIGlzUmVjb3JkaW5nOiB0cnVlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSRUNPUkRJTkcgU1RBUlRFRCA6ICcgKyBkYXRhLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuY3VycmVudFJlY29yZGluZ0lkID0gZGF0YS5pZDtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVjb3JkaW5nU2VxdWVuY2UgPSAwO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWNvcmRpbmdTaXplID0gMDtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVjb3JkaW5nVHlwZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWNvcmRlci5zdGFydCg2MDAwMCk7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmlzUmVjb3JkaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1JFQ09SRCBTVEFSVCBFUlJPUicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZWNvcmRlciB3YXMgY3JlYXRlZCAoc2NyZWVuLXNoYXJlIHByb21wdCBhY2NlcHRlZCkgYnV0IHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBzZXJ2ZXIgbmV2ZXIgYWNrbm93bGVkZ2VkIOKAlCByZWxlYXNlIHRoZSBjYXB0dXJlZCBtZWRpYSArIGdyYXBoLlxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWxlYXNlQXVkaW9HcmFwaCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMucmVjb3JkZXIgJiYgX3RoaXMucmVjb3JkZXIuc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZWNvcmRlci5zdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLnJlY29yZGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBzdG9wUmVjb3JkaW5nTWVldGluZyA9ICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHNvY2tldE1hbmFnZXIuZW1pdEV2ZW50KFZDRXZlbnRUeXBlLlRPR0dMRV9SRUNPUkRfTUVFVElORywge1xuICAgICAgICAgICAgICAgIHJvb21JZDogdGhpcy5tZWV0aW5nSWQsXG4gICAgICAgICAgICAgICAgaXNSZWNvcmRpbmc6IGZhbHNlXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVE9HR0xFIFJFQ09SRCAoc3RvcCkgRVJST1InLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlY29yZGVyICYmIHRoaXMucmVjb3JkZXIuc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucmVjb3JkZXIuc3RyZWFtLmdldFZpZGVvVHJhY2tzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlY29yZGVyLnN0cmVhbS5nZXRWaWRlb1RyYWNrcygpWzBdLnN0b3AoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWNvcmRlci5zdGF0ZSA9PT0gJ3JlY29yZGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gb25zdG9wIHJlbGVhc2VzIHRoZSBhdWRpbyBncmFwaCBhZnRlciB0aGUgZmluYWwgY2h1bmsgZmx1c2hlcy5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvcmRlci5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE5vIGFjdGl2ZSByZWNvcmRlciB0byBzdG9wIOKAlCByZWxlYXNlIHRoZSBncmFwaCBkaXJlY3RseS5cbiAgICAgICAgICAgIHRoaXMucmVsZWFzZUF1ZGlvR3JhcGgoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIHRoaXMucmVsZWFzZUF1ZGlvR3JhcGgoKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBjcmVhdGVNZWRpYVJlY29yZGVyID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmlkZW9Db25zdHJhaW50cyA9IHtcbiAgICAgICAgICAgICAgICBjdXJzb3I6IHRydWUsXG4gICAgICAgICAgICAgICAgYXVkaW86IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lZGlhU291cmNlOiBcInNjcmVlblwiLFxuICAgICAgICAgICAgICAgIHByZWZlckN1cnJlbnRUYWI6IHRydWUsXG4gICAgICAgICAgICAgICAgc2VsZkJyb3dzZXJTdXJmYWNlOiAnaW5jbHVkZScsXG4gICAgICAgICAgICAgICAgc3lzdGVtQXVkaW86ICdleGNsdWRlJyxcbiAgICAgICAgICAgICAgICBzdXJmYWNlU3dpdGNoaW5nOiAnZXhjbHVkZScsXG4gICAgICAgICAgICAgICAgbW9uaXRvclR5cGVTdXJmYWNlczogJ2V4Y2x1ZGUnXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgX3RoaXMgPSB0aGlzO1xuICAgICAgICAgICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlc1xuICAgICAgICAgICAgICAgIC5nZXREaXNwbGF5TWVkaWEodmlkZW9Db25zdHJhaW50cylcbiAgICAgICAgICAgICAgICAudGhlbigoc3RyZWFtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZTogJ3ZpZGVvL3dlYm07IGNvZGVjcz12cDknXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9Db250ZXh0ID0gbmV3IEF1ZGlvQ29udGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYVN0cmVhbUF1ZGlvRGVzdGluYXRpb25Ob2RlID0gbmV3IE1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUoYXVkaW9Db250ZXh0KTtcblxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5hdWRpb0NvbnRleHQgPSBhdWRpb0NvbnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLm1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUgPSBtZWRpYVN0cmVhbUF1ZGlvRGVzdGluYXRpb25Ob2RlO1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5hdWRpb1NvdXJjZU5vZGVzID0gbmV3IE1hcCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE1peCBldmVyeSBrbm93biBwYXJ0aWNpcGFudCdzIGF1ZGlvIGludG8gdGhlIHNpbmdsZSBkZXN0aW5hdGlvblxuICAgICAgICAgICAgICAgICAgICAvLyB0cmFjayAodHJhY2tlZCBzbyB3ZSBjYW4gZGlzY29ubmVjdCB0aGVtIGxhdGVyKS5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaWQsIHRyYWNrXSBvZiBfdGhpcy5hdWRpb1RyYWNrcy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmNvbm5lY3RBdWRpb1RyYWNrKGlkLCB0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBSZWNvcmQgT05MWSB0aGUgbWl4ZWQgYXVkaW8gKyBzY3JlZW4gdmlkZW8uIChQdXNoaW5nIHRoZSByYXdcbiAgICAgICAgICAgICAgICAgICAgLy8gcGVyLXBhcnRpY2lwYW50IHRyYWNrcyBoZXJlIHVzZWQgdG8gcmVseSBvbiBNZWRpYVJlY29yZGVyXG4gICAgICAgICAgICAgICAgICAgIC8vIHNpbGVudGx5IGlnbm9yaW5nIGV4dHJhIGF1ZGlvIHRyYWNrcyDigJQgZnJhZ2lsZSBhY3Jvc3MgYnJvd3NlcnMuKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRlZFRyYWNrcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhU3RyZWFtQXVkaW9EZXN0aW5hdGlvbk5vZGUuc3RyZWFtLmdldEF1ZGlvVHJhY2tzKClbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZ2V0VmlkZW9UcmFja3MoKVswXVxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsTWVkaWFTdHJlYW0gPSBuZXcgTWVkaWFTdHJlYW0ocmVjb3JkZWRUcmFja3MpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIoaW5pdGlhbE1lZGlhU3RyZWFtLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkZXIub25kYXRhYXZhaWxhYmxlID0gX3RoaXMuaGFuZGxlUmVjb3JkaW5nRGF0YUF2YWlsYWJsZTtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3JkZXIub25zdG9wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbGVhc2VBdWRpb0dyYXBoKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgZW5kcyB0aGUgc2hhcmUgdmlhIHRoZSBicm93c2VyJ3Mgb3duIFwiU3RvcCBzaGFyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29udHJvbCwgdGhlIHZpZGVvIHRyYWNrIGVuZHMg4oCUIHN0b3AgdGhlIHJlY29yZGluZyBjbGVhbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgY2Fycnlpbmcgb24gd2l0aCBhIGRlYWQgdHJhY2suXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvVHJhY2sgPSBzdHJlYW0uZ2V0VmlkZW9UcmFja3MoKVswXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvVHJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvVHJhY2sub25lbmRlZCA9ICgpID0+IF90aGlzLnN0b3BSZWNvcmRpbmdNZWV0aW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlY29yZGVyKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihlLm1lc3NhZ2UpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuY29uc3QgaW5zdGFuY2UgPSBuZXcgVkNSb29tUmVjb3JkZXIoKTtcbmV4cG9ydCBkZWZhdWx0IGluc3RhbmNlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFBQSxjQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxZQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxtQkFBQSxHQUFBSCxzQkFBQSxDQUFBQyxPQUFBO0FBQTBELFNBQUFELHVCQUFBSSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBQUEsU0FBQUcsZ0JBQUFILENBQUEsRUFBQUksQ0FBQSxFQUFBQyxDQUFBLFlBQUFELENBQUEsR0FBQUUsY0FBQSxDQUFBRixDQUFBLE1BQUFKLENBQUEsR0FBQU8sTUFBQSxDQUFBQyxjQUFBLENBQUFSLENBQUEsRUFBQUksQ0FBQSxJQUFBSyxLQUFBLEVBQUFKLENBQUEsRUFBQUssVUFBQSxNQUFBQyxZQUFBLE1BQUFDLFFBQUEsVUFBQVosQ0FBQSxDQUFBSSxDQUFBLElBQUFDLENBQUEsRUFBQUwsQ0FBQTtBQUFBLFNBQUFNLGVBQUFELENBQUEsUUFBQVEsQ0FBQSxHQUFBQyxZQUFBLENBQUFULENBQUEsdUNBQUFRLENBQUEsR0FBQUEsQ0FBQSxHQUFBQSxDQUFBO0FBQUEsU0FBQUMsYUFBQVQsQ0FBQSxFQUFBRCxDQUFBLDJCQUFBQyxDQUFBLEtBQUFBLENBQUEsU0FBQUEsQ0FBQSxNQUFBTCxDQUFBLEdBQUFLLENBQUEsQ0FBQVUsTUFBQSxDQUFBQyxXQUFBLGtCQUFBaEIsQ0FB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
@@ -47,7 +47,6 @@
47
47
  .grid-side-bar {
48
48
  width: 320px;
49
49
  margin: 4px 12px !important;
50
- max-height: 90%;
51
50
  overflow: auto;
52
51
  }
53
52