@webex/plugin-meetings 2.12.0 → 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,328 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+
5
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
+
7
+ _Object$defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+
11
+ exports.default = void 0;
12
+
13
+ var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
14
+
15
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
16
+
17
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
18
+
19
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
20
+
21
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
22
+
23
+ var _internalMediaCore = require("@webex/internal-media-core");
24
+
25
+ var _constants = _interopRequireDefault(require("../metrics/constants"));
26
+
27
+ var _metrics = _interopRequireDefault(require("../metrics"));
28
+
29
+ var _util = _interopRequireDefault(require("../media/util"));
30
+
31
+ var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
32
+
33
+ var _constants2 = require("../constants");
34
+
35
+ /* eslint-disable no-param-reassign */
36
+ var createEffectsState = function createEffectsState(type) {
37
+ _loggerProxy.default.logger.info("Meeting:effectState#createEffectsState --> creating effectsState for effect ".concat(type));
38
+
39
+ return new EffectsState(type);
40
+ };
41
+ /* The purpose of this class is to manage the effects state(for eg., BNR).
42
+ */
43
+
44
+
45
+ var EffectsState = /*#__PURE__*/function () {
46
+ function EffectsState(type) {
47
+ (0, _classCallCheck2.default)(this, EffectsState);
48
+ this.effectType = type;
49
+ this.state = {
50
+ bnr: {
51
+ enabled: _constants2.BNR_STATUS.NOT_ENABLED
52
+ },
53
+ callToWebrtcBNRInProgress: false
54
+ }; // these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call
55
+
56
+ this.pendingPromiseResolve = null;
57
+ this.pendingPromiseReject = null;
58
+ }
59
+ /**
60
+ * @memberof EffectsState
61
+ * @param {Boolean} [isEnable] true for enableBNR, false for disableBNR request
62
+ * @param {Object} [meeting] the meeting object
63
+ * @returns {Promise}
64
+ */
65
+
66
+
67
+ (0, _createClass2.default)(EffectsState, [{
68
+ key: "handleClientRequest",
69
+ value: function () {
70
+ var _handleClientRequest = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(isEnable, meeting) {
71
+ var _this = this;
72
+
73
+ return _regenerator.default.wrap(function _callee$(_context) {
74
+ while (1) {
75
+ switch (_context.prev = _context.next) {
76
+ case 0:
77
+ return _context.abrupt("return", new _promise.default(function (resolve, reject) {
78
+ if (_this.pendingPromiseResolve) {
79
+ // resolve the last promise we returned to the client as the client has issued a new request that has superseded the previous one
80
+ _this.pendingPromiseResolve();
81
+ }
82
+
83
+ _this.pendingPromiseResolve = resolve;
84
+ _this.pendingPromiseReject = reject;
85
+ if (isEnable) _this.enableBNR(meeting);else _this.disableBNR(meeting);
86
+ }));
87
+
88
+ case 1:
89
+ case "end":
90
+ return _context.stop();
91
+ }
92
+ }
93
+ }, _callee);
94
+ }));
95
+
96
+ function handleClientRequest(_x, _x2) {
97
+ return _handleClientRequest.apply(this, arguments);
98
+ }
99
+
100
+ return handleClientRequest;
101
+ }()
102
+ /**
103
+ * Internal API to return status of BNR
104
+ * @memberof EffectsState
105
+ * @returns {Boolean}
106
+ * @public
107
+ * @memberof Meeting
108
+ */
109
+
110
+ }, {
111
+ key: "isBnrEnabled",
112
+ value: function isBnrEnabled() {
113
+ return this.state.bnr.enabled === _constants2.BNR_STATUS.ENABLED;
114
+ }
115
+ }, {
116
+ key: "resolvePromise",
117
+ value: function resolvePromise() {
118
+ if (this.pendingPromiseResolve) {
119
+ this.pendingPromiseResolve(true);
120
+ }
121
+
122
+ this.pendingPromiseResolve = null;
123
+ this.pendingPromiseReject = null;
124
+ }
125
+ }, {
126
+ key: "rejectPromise",
127
+ value: function rejectPromise(e) {
128
+ if (this.pendingPromiseReject) {
129
+ this.pendingPromiseReject(e);
130
+ }
131
+
132
+ this.pendingPromiseResolve = null;
133
+ this.pendingPromiseReject = null;
134
+ }
135
+ /**
136
+ * enableBNR API
137
+ * @param {Object} meeting the meeting object
138
+ * @returns {Promise<Boolean>}
139
+ * @public
140
+ * @memberof EffectsState
141
+ */
142
+
143
+ }, {
144
+ key: "enableBNR",
145
+ value: function () {
146
+ var _enableBNR = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(meeting) {
147
+ var bnr, audioStream;
148
+ return _regenerator.default.wrap(function _callee2$(_context2) {
149
+ while (1) {
150
+ switch (_context2.prev = _context2.next) {
151
+ case 0:
152
+ _loggerProxy.default.logger.info('Meeting:effectState#enableBNR. Enable BNR called');
153
+
154
+ if (!this.isBnrEnabled()) {
155
+ _context2.next = 4;
156
+ break;
157
+ }
158
+
159
+ _loggerProxy.default.logger.warn('Meeting:index#enableBNR. BNR is already enabled');
160
+
161
+ return _context2.abrupt("return", this.resolvePromise());
162
+
163
+ case 4:
164
+ if (!this.state.callToWebrtcBNRInProgress) {
165
+ _context2.next = 7;
166
+ break;
167
+ }
168
+
169
+ _loggerProxy.default.logger.warn('Meeting:effectState#enableBNR. Call to WebRTC in progress, we need to wait for it to complete');
170
+
171
+ return _context2.abrupt("return", this.resolvePromise());
172
+
173
+ case 7:
174
+ bnr = this.state.bnr;
175
+ _context2.prev = 8;
176
+ bnr.enabled = _constants2.BNR_STATUS.SHOULD_ENABLE;
177
+ this.state.callToWebrtcBNRInProgress = true;
178
+ audioStream = _util.default.createMediaStream([meeting.mediaProperties.audioTrack]);
179
+
180
+ _loggerProxy.default.logger.info('Meeting:effectState#enableBNR. MediaStream created from meeting & sent to updateAudio');
181
+
182
+ _context2.next = 15;
183
+ return meeting.updateAudio({
184
+ sendAudio: true,
185
+ receiveAudio: meeting.mediaProperties.mediaDirection.receiveAudio,
186
+ stream: audioStream,
187
+ bnrEnabled: bnr.enabled
188
+ });
189
+
190
+ case 15:
191
+ _loggerProxy.default.logger.info('Meeting:effectState#enableBNR. Updated meeting audio with bnr enabled track');
192
+
193
+ bnr.enabled = _constants2.BNR_STATUS.ENABLED;
194
+ this.state.callToWebrtcBNRInProgress = false;
195
+
196
+ _metrics.default.sendBehavioralMetric(_constants.default.ENABLE_BNR_SUCCESS);
197
+
198
+ _context2.next = 29;
199
+ break;
200
+
201
+ case 21:
202
+ _context2.prev = 21;
203
+ _context2.t0 = _context2["catch"](8);
204
+ bnr.enabled = _constants2.BNR_STATUS.NOT_ENABLED;
205
+ this.state.callToWebrtcBNRInProgress = false;
206
+
207
+ _loggerProxy.default.logger.error('Meeting:index#enableBNR.', _context2.t0);
208
+
209
+ _metrics.default.sendBehavioralMetric(_constants.default.ENABLE_BNR_FAILURE, {
210
+ reason: _context2.t0.message,
211
+ stack: _context2.t0.stack
212
+ });
213
+
214
+ this.rejectPromise(_context2.t0);
215
+ throw _context2.t0;
216
+
217
+ case 29:
218
+ return _context2.abrupt("return", this.resolvePromise());
219
+
220
+ case 30:
221
+ case "end":
222
+ return _context2.stop();
223
+ }
224
+ }
225
+ }, _callee2, this, [[8, 21]]);
226
+ }));
227
+
228
+ function enableBNR(_x3) {
229
+ return _enableBNR.apply(this, arguments);
230
+ }
231
+
232
+ return enableBNR;
233
+ }()
234
+ /**
235
+ * disableBNR API
236
+ * @param {Object} meeting the meeting object
237
+ * @returns {Promise<Boolean>}
238
+ * @public
239
+ * @memberof EffectsState
240
+ */
241
+
242
+ }, {
243
+ key: "disableBNR",
244
+ value: function () {
245
+ var _disableBNR = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(meeting) {
246
+ var bnr, audioTrack, audioStream;
247
+ return _regenerator.default.wrap(function _callee3$(_context3) {
248
+ while (1) {
249
+ switch (_context3.prev = _context3.next) {
250
+ case 0:
251
+ _loggerProxy.default.logger.info('Meeting:effectState#disableBNR. Disable BNR called');
252
+
253
+ bnr = this.state.bnr;
254
+ _context3.prev = 2;
255
+
256
+ if (!this.state.callToWebrtcBNRInProgress) {
257
+ _context3.next = 6;
258
+ break;
259
+ }
260
+
261
+ _loggerProxy.default.logger.info('Meeting:effectState#disableBNR. Call to WebRTC in progress, we need to wait for it to complete');
262
+
263
+ return _context3.abrupt("return", this.resolvePromise());
264
+
265
+ case 6:
266
+ bnr.enabled = _constants2.BNR_STATUS.SHOULD_DISABLE;
267
+ this.state.callToWebrtcBNRInProgress = true;
268
+ audioTrack = _internalMediaCore.Media.Effects.BNR.disableBNR(meeting.mediaProperties.audioTrack);
269
+ audioStream = _util.default.createMediaStream([audioTrack]);
270
+
271
+ _loggerProxy.default.logger.info('Meeting:effectState#disableBNR. Raw media track obtained from WebRTC & sent to updateAudio');
272
+
273
+ _context3.next = 13;
274
+ return meeting.updateAudio({
275
+ sendAudio: true,
276
+ receiveAudio: meeting.mediaProperties.mediaDirection.receiveAudio,
277
+ stream: audioStream
278
+ });
279
+
280
+ case 13:
281
+ bnr.enabled = _constants2.BNR_STATUS.NOT_ENABLED;
282
+ this.state.callToWebrtcBNRInProgress = false;
283
+
284
+ _metrics.default.sendBehavioralMetric(_constants.default.DISABLE_BNR_SUCCESS);
285
+
286
+ _context3.next = 26;
287
+ break;
288
+
289
+ case 18:
290
+ _context3.prev = 18;
291
+ _context3.t0 = _context3["catch"](2);
292
+ bnr.enabled = _constants2.BNR_STATUS.ENABLED;
293
+ this.state.callToWebrtcBNRInProgress = false;
294
+
295
+ _loggerProxy.default.logger.error("Meeting:index#disableBNR. ".concat(_context3.t0));
296
+
297
+ _metrics.default.sendBehavioralMetric(_constants.default.DISABLE_BNR_FAILURE, {
298
+ reason: _context3.t0.message,
299
+ stack: _context3.t0.stack
300
+ });
301
+
302
+ this.rejectPromise(_context3.t0);
303
+ throw _context3.t0;
304
+
305
+ case 26:
306
+ return _context3.abrupt("return", this.resolvePromise());
307
+
308
+ case 27:
309
+ case "end":
310
+ return _context3.stop();
311
+ }
312
+ }
313
+ }, _callee3, this, [[2, 18]]);
314
+ }));
315
+
316
+ function disableBNR(_x4) {
317
+ return _disableBNR.apply(this, arguments);
318
+ }
319
+
320
+ return disableBNR;
321
+ }()
322
+ }]);
323
+ return EffectsState;
324
+ }();
325
+
326
+ var _default = createEffectsState;
327
+ exports.default = _default;
328
+ //# sourceMappingURL=effectsState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createEffectsState","type","LoggerProxy","logger","info","EffectsState","effectType","state","bnr","enabled","BNR_STATUS","NOT_ENABLED","callToWebrtcBNRInProgress","pendingPromiseResolve","pendingPromiseReject","isEnable","meeting","resolve","reject","enableBNR","disableBNR","ENABLED","e","isBnrEnabled","warn","resolvePromise","SHOULD_ENABLE","audioStream","MediaUtil","createMediaStream","mediaProperties","audioTrack","updateAudio","sendAudio","receiveAudio","mediaDirection","stream","bnrEnabled","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","ENABLE_BNR_SUCCESS","error","ENABLE_BNR_FAILURE","reason","message","stack","rejectPromise","SHOULD_DISABLE","WebRTCMedia","Effects","BNR","DISABLE_BNR_SUCCESS","DISABLE_BNR_FAILURE"],"sources":["effectsState.js"],"sourcesContent":["/* eslint-disable no-param-reassign */\nimport {Media as WebRTCMedia} from '@webex/internal-media-core';\n\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport Metrics from '../metrics';\nimport MediaUtil from '../media/util';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {BNR_STATUS} from '../constants';\n\nconst createEffectsState = (type) => {\n LoggerProxy.logger.info(`Meeting:effectState#createEffectsState --> creating effectsState for effect ${type}`);\n\n return new EffectsState(type);\n};\n\n/* The purpose of this class is to manage the effects state(for eg., BNR).\n*/\nclass EffectsState {\n constructor(type) {\n this.effectType = type;\n this.state = {\n bnr: {\n enabled: BNR_STATUS.NOT_ENABLED\n },\n callToWebrtcBNRInProgress: false\n };\n // these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call\n this.pendingPromiseResolve = null;\n this.pendingPromiseReject = null;\n }\n\n /**\n * @memberof EffectsState\n * @param {Boolean} [isEnable] true for enableBNR, false for disableBNR request\n * @param {Object} [meeting] the meeting object\n * @returns {Promise}\n */\n async handleClientRequest(isEnable, meeting) {\n return new Promise((resolve, reject) => {\n if (this.pendingPromiseResolve) {\n // resolve the last promise we returned to the client as the client has issued a new request that has superseded the previous one\n this.pendingPromiseResolve();\n }\n this.pendingPromiseResolve = resolve;\n this.pendingPromiseReject = reject;\n\n if (isEnable) this.enableBNR(meeting);\n else this.disableBNR(meeting);\n });\n }\n\n /**\n * Internal API to return status of BNR\n * @memberof EffectsState\n * @returns {Boolean}\n * @public\n * @memberof Meeting\n */\n isBnrEnabled() {\n return this.state.bnr.enabled === BNR_STATUS.ENABLED;\n }\n\n resolvePromise() {\n if (this.pendingPromiseResolve) {\n this.pendingPromiseResolve(true);\n }\n this.pendingPromiseResolve = null;\n this.pendingPromiseReject = null;\n }\n\n rejectPromise(e) {\n if (this.pendingPromiseReject) {\n this.pendingPromiseReject(e);\n }\n this.pendingPromiseResolve = null;\n this.pendingPromiseReject = null;\n }\n\n /**\n * enableBNR API\n * @param {Object} meeting the meeting object\n * @returns {Promise<Boolean>}\n * @public\n * @memberof EffectsState\n */\n async enableBNR(meeting) {\n LoggerProxy.logger.info('Meeting:effectState#enableBNR. Enable BNR called');\n\n if (this.isBnrEnabled()) {\n LoggerProxy.logger.warn('Meeting:index#enableBNR. BNR is already enabled');\n\n return this.resolvePromise();\n }\n\n if (this.state.callToWebrtcBNRInProgress) {\n LoggerProxy.logger.warn('Meeting:effectState#enableBNR. Call to WebRTC in progress, we need to wait for it to complete');\n\n return this.resolvePromise();\n }\n\n const {bnr} = this.state;\n\n try {\n bnr.enabled = BNR_STATUS.SHOULD_ENABLE;\n this.state.callToWebrtcBNRInProgress = true;\n const audioStream = MediaUtil.createMediaStream([meeting.mediaProperties.audioTrack]);\n\n LoggerProxy.logger.info('Meeting:effectState#enableBNR. MediaStream created from meeting & sent to updateAudio');\n await meeting.updateAudio({\n sendAudio: true,\n receiveAudio: meeting.mediaProperties.mediaDirection.receiveAudio,\n stream: audioStream,\n bnrEnabled: bnr.enabled\n });\n\n LoggerProxy.logger.info('Meeting:effectState#enableBNR. Updated meeting audio with bnr enabled track');\n bnr.enabled = BNR_STATUS.ENABLED;\n this.state.callToWebrtcBNRInProgress = false;\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.ENABLE_BNR_SUCCESS,\n );\n }\n catch (error) {\n bnr.enabled = BNR_STATUS.NOT_ENABLED;\n this.state.callToWebrtcBNRInProgress = false;\n LoggerProxy.logger.error('Meeting:index#enableBNR.', error);\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.ENABLE_BNR_FAILURE,\n {\n reason: error.message,\n stack: error.stack\n }\n );\n this.rejectPromise(error);\n\n throw error;\n }\n\n return this.resolvePromise();\n }\n\n /**\n * disableBNR API\n * @param {Object} meeting the meeting object\n * @returns {Promise<Boolean>}\n * @public\n * @memberof EffectsState\n */\n async disableBNR(meeting) {\n LoggerProxy.logger.info('Meeting:effectState#disableBNR. Disable BNR called');\n\n const {bnr} = this.state;\n\n try {\n if (this.state.callToWebrtcBNRInProgress) {\n LoggerProxy.logger.info('Meeting:effectState#disableBNR. Call to WebRTC in progress, we need to wait for it to complete');\n\n return this.resolvePromise();\n }\n\n bnr.enabled = BNR_STATUS.SHOULD_DISABLE;\n this.state.callToWebrtcBNRInProgress = true;\n\n const audioTrack = WebRTCMedia.Effects.BNR.disableBNR(meeting.mediaProperties.audioTrack);\n\n const audioStream = MediaUtil.createMediaStream([audioTrack]);\n\n LoggerProxy.logger.info('Meeting:effectState#disableBNR. Raw media track obtained from WebRTC & sent to updateAudio');\n\n await meeting.updateAudio({\n sendAudio: true,\n receiveAudio: meeting.mediaProperties.mediaDirection.receiveAudio,\n stream: audioStream\n });\n\n bnr.enabled = BNR_STATUS.NOT_ENABLED;\n\n this.state.callToWebrtcBNRInProgress = false;\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.DISABLE_BNR_SUCCESS\n );\n }\n catch (error) {\n bnr.enabled = BNR_STATUS.ENABLED;\n this.state.callToWebrtcBNRInProgress = false;\n LoggerProxy.logger.error(`Meeting:index#disableBNR. ${error}`);\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.DISABLE_BNR_FAILURE,\n {\n reason: error.message,\n stack: error.stack\n }\n );\n this.rejectPromise(error);\n\n throw error;\n }\n\n return this.resolvePromise();\n }\n}\n\nexport default createEffectsState;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AACA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AAPA;AASA,IAAMA,kBAAkB,GAAG,SAArBA,kBAAqB,CAACC,IAAD,EAAU;EACnCC,qBAAYC,MAAZ,CAAmBC,IAAnB,uFAAuGH,IAAvG;;EAEA,OAAO,IAAII,YAAJ,CAAiBJ,IAAjB,CAAP;AACD,CAJD;AAMA;AACA;;;IACMI,Y;EACJ,sBAAYJ,IAAZ,EAAkB;IAAA;IAChB,KAAKK,UAAL,GAAkBL,IAAlB;IACA,KAAKM,KAAL,GAAa;MACXC,GAAG,EAAE;QACHC,OAAO,EAAEC,uBAAWC;MADjB,CADM;MAIXC,yBAAyB,EAAE;IAJhB,CAAb,CAFgB,CAQhB;;IACA,KAAKC,qBAAL,GAA6B,IAA7B;IACA,KAAKC,oBAAL,GAA4B,IAA5B;EACD;EAED;AACF;AACA;AACA;AACA;AACA;;;;;;yGACE,iBAA0BC,QAA1B,EAAoCC,OAApC;QAAA;;QAAA;UAAA;YAAA;cAAA;gBAAA,iCACS,qBAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;kBACtC,IAAI,KAAI,CAACL,qBAAT,EAAgC;oBAC9B;oBACA,KAAI,CAACA,qBAAL;kBACD;;kBACD,KAAI,CAACA,qBAAL,GAA6BI,OAA7B;kBACA,KAAI,CAACH,oBAAL,GAA4BI,MAA5B;kBAEA,IAAIH,QAAJ,EAAc,KAAI,CAACI,SAAL,CAAeH,OAAf,EAAd,KACK,KAAI,CAACI,UAAL,CAAgBJ,OAAhB;gBACN,CAVM,CADT;;cAAA;cAAA;gBAAA;YAAA;UAAA;QAAA;MAAA,C;;;;;;;;IAcA;AACF;AACA;AACA;AACA;AACA;AACA;;;;WACE,wBAAe;MACb,OAAO,KAAKT,KAAL,CAAWC,GAAX,CAAeC,OAAf,KAA2BC,uBAAWW,OAA7C;IACD;;;WAED,0BAAiB;MACf,IAAI,KAAKR,qBAAT,EAAgC;QAC9B,KAAKA,qBAAL,CAA2B,IAA3B;MACD;;MACD,KAAKA,qBAAL,GAA6B,IAA7B;MACA,KAAKC,oBAAL,GAA4B,IAA5B;IACD;;;WAED,uBAAcQ,CAAd,EAAiB;MACf,IAAI,KAAKR,oBAAT,EAA+B;QAC7B,KAAKA,oBAAL,CAA0BQ,CAA1B;MACD;;MACD,KAAKT,qBAAL,GAA6B,IAA7B;MACA,KAAKC,oBAAL,GAA4B,IAA5B;IACD;IAED;AACF;AACA;AACA;AACA;AACA;AACA;;;;;+FACE,kBAAgBE,OAAhB;QAAA;QAAA;UAAA;YAAA;cAAA;gBACEd,qBAAYC,MAAZ,CAAmBC,IAAnB,CAAwB,kDAAxB;;gBADF,KAGM,KAAKmB,YAAL,EAHN;kBAAA;kBAAA;gBAAA;;gBAIIrB,qBAAYC,MAAZ,CAAmBqB,IAAnB,CAAwB,iDAAxB;;gBAJJ,kCAMW,KAAKC,cAAL,EANX;;cAAA;gBAAA,KASM,KAAKlB,KAAL,CAAWK,yBATjB;kBAAA;kBAAA;gBAAA;;gBAUIV,qBAAYC,MAAZ,CAAmBqB,IAAnB,CAAwB,+FAAxB;;gBAVJ,kCAYW,KAAKC,cAAL,EAZX;;cAAA;gBAeSjB,GAfT,GAegB,KAAKD,KAfrB,CAeSC,GAfT;gBAAA;gBAkBIA,GAAG,CAACC,OAAJ,GAAcC,uBAAWgB,aAAzB;gBACA,KAAKnB,KAAL,CAAWK,yBAAX,GAAuC,IAAvC;gBACMe,WApBV,GAoBwBC,cAAUC,iBAAV,CAA4B,CAACb,OAAO,CAACc,eAAR,CAAwBC,UAAzB,CAA5B,CApBxB;;gBAsBI7B,qBAAYC,MAAZ,CAAmBC,IAAnB,CAAwB,uFAAxB;;gBAtBJ;gBAAA,OAuBUY,OAAO,CAACgB,WAAR,CAAoB;kBACxBC,SAAS,EAAE,IADa;kBAExBC,YAAY,EAAElB,OAAO,CAACc,eAAR,CAAwBK,cAAxB,CAAuCD,YAF7B;kBAGxBE,MAAM,EAAET,WAHgB;kBAIxBU,UAAU,EAAE7B,GAAG,CAACC;gBAJQ,CAApB,CAvBV;;cAAA;gBA8BIP,qBAAYC,MAAZ,CAAmBC,IAAnB,CAAwB,6EAAxB;;gBACAI,GAAG,CAACC,OAAJ,GAAcC,uBAAWW,OAAzB;gBACA,KAAKd,KAAL,CAAWK,yBAAX,GAAuC,KAAvC;;gBACA0B,iBAAQC,oBAAR,CACEC,mBAAmBC,kBADrB;;gBAjCJ;gBAAA;;cAAA;gBAAA;gBAAA;gBAsCIjC,GAAG,CAACC,OAAJ,GAAcC,uBAAWC,WAAzB;gBACA,KAAKJ,KAAL,CAAWK,yBAAX,GAAuC,KAAvC;;gBACAV,qBAAYC,MAAZ,CAAmBuC,KAAnB,CAAyB,0BAAzB;;gBAEAJ,iBAAQC,oBAAR,CACEC,mBAAmBG,kBADrB,EAEE;kBACEC,MAAM,EAAE,aAAMC,OADhB;kBAEEC,KAAK,EAAE,aAAMA;gBAFf,CAFF;;gBAOA,KAAKC,aAAL;gBAjDJ;;cAAA;gBAAA,kCAsDS,KAAKtB,cAAL,EAtDT;;cAAA;cAAA;gBAAA;YAAA;UAAA;QAAA;MAAA,C;;;;;;;;IAyDA;AACF;AACA;AACA;AACA;AACA;AACA;;;;;gGACE,kBAAiBT,OAAjB;QAAA;QAAA;UAAA;YAAA;cAAA;gBACEd,qBAAYC,MAAZ,CAAmBC,IAAnB,CAAwB,oDAAxB;;gBAEOI,GAHT,GAGgB,KAAKD,KAHrB,CAGSC,GAHT;gBAAA;;gBAAA,KAMQ,KAAKD,KAAL,CAAWK,yBANnB;kBAAA;kBAAA;gBAAA;;gBAOMV,qBAAYC,MAAZ,CAAmBC,IAAnB,CAAwB,gGAAxB;;gBAPN,kCASa,KAAKqB,cAAL,EATb;;cAAA;gBAYIjB,GAAG,CAACC,OAAJ,GAAcC,uBAAWsC,cAAzB;gBACA,KAAKzC,KAAL,CAAWK,yBAAX,GAAuC,IAAvC;gBAEMmB,UAfV,GAeuBkB,yBAAYC,OAAZ,CAAoBC,GAApB,CAAwB/B,UAAxB,CAAmCJ,OAAO,CAACc,eAAR,CAAwBC,UAA3D,CAfvB;gBAiBUJ,WAjBV,GAiBwBC,cAAUC,iBAAV,CAA4B,CAACE,UAAD,CAA5B,CAjBxB;;gBAmBI7B,qBAAYC,MAAZ,CAAmBC,IAAnB,CAAwB,4FAAxB;;gBAnBJ;gBAAA,OAqBUY,OAAO,CAACgB,WAAR,CAAoB;kBACxBC,SAAS,EAAE,IADa;kBAExBC,YAAY,EAAElB,OAAO,CAACc,eAAR,CAAwBK,cAAxB,CAAuCD,YAF7B;kBAGxBE,MAAM,EAAET;gBAHgB,CAApB,CArBV;;cAAA;gBA2BInB,GAAG,CAACC,OAAJ,GAAcC,uBAAWC,WAAzB;gBAEA,KAAKJ,KAAL,CAAWK,yBAAX,GAAuC,KAAvC;;gBAEA0B,iBAAQC,oBAAR,CACEC,mBAAmBY,mBADrB;;gBA/BJ;gBAAA;;cAAA;gBAAA;gBAAA;gBAoCI5C,GAAG,CAACC,OAAJ,GAAcC,uBAAWW,OAAzB;gBACA,KAAKd,KAAL,CAAWK,yBAAX,GAAuC,KAAvC;;gBACAV,qBAAYC,MAAZ,CAAmBuC,KAAnB;;gBAEAJ,iBAAQC,oBAAR,CACEC,mBAAmBa,mBADrB,EAEE;kBACET,MAAM,EAAE,aAAMC,OADhB;kBAEEC,KAAK,EAAE,aAAMA;gBAFf,CAFF;;gBAOA,KAAKC,aAAL;gBA/CJ;;cAAA;gBAAA,kCAoDS,KAAKtB,cAAL,EApDT;;cAAA;cAAA;gBAAA;YAAA;UAAA;QAAA;MAAA,C;;;;;;;;;;;;eAwDazB,kB"}