@scout9/app 1.0.0-alpha.0.8.0 → 1.0.0-alpha.0.8.2

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.
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var spirits = require("./spirits-02db68e3.cjs");
3
+ var spirits = require("./spirits-5dc52d64.cjs");
4
4
  var require$$0$4 = require('util');
5
5
  var require$$0$3 = require('stream');
6
6
  var require$$1 = require('path');
@@ -30272,7 +30272,7 @@ common.createRequestFunction = createRequestFunction;
30272
30272
  var configuration = {};
30273
30273
 
30274
30274
  var name$1 = "@scout9/admin";
30275
- var version$2 = "1.0.0-alpha.0.0.62";
30275
+ var version$2 = "1.0.0-alpha.0.0.65";
30276
30276
  var description$1 = "";
30277
30277
  var main$2 = "./build/index.js";
30278
30278
  var types$1 = "./build/index.d.ts";
@@ -35337,7 +35337,7 @@ function _loadUserPackageJson() {
35337
35337
  targetPkgUrl = isTest ? packageTestJsonUrl : packageJsonUrl;
35338
35338
  _context2.t0 = JSON;
35339
35339
  _context2.next = 10;
35340
- return fs__default["default"].readFile(new URL(targetPkgUrl, (typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('dev-4051ca91.js', document.baseURI).href))), 'utf-8');
35340
+ return fs__default["default"].readFile(new URL(targetPkgUrl, (typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('dev-bc9e04ca.js', document.baseURI).href))), 'utf-8');
35341
35341
  case 10:
35342
35342
  _context2.t1 = _context2.sent;
35343
35343
  pkg = _context2.t0.parse.call(_context2.t0, _context2.t1);
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var spirits = require("./spirits-02db68e3.cjs");
4
- var dev = require("./dev-4051ca91.cjs");
3
+ var spirits = require("./spirits-5dc52d64.cjs");
4
+ var dev = require("./dev-bc9e04ca.cjs");
5
5
  var macros = require("./macros-f62cceac.cjs");
6
6
  var require$$0 = require('fs');
7
7
  var require$$2$1 = require('events');
@@ -29483,7 +29483,7 @@ class Body {
29483
29483
  }
29484
29484
  const {
29485
29485
  toFormData
29486
- } = await Promise.resolve().then(function () { return require("./multipart-parser-c7246b66.cjs"); });
29486
+ } = await Promise.resolve().then(function () { return require("./multipart-parser-0717500b.cjs"); });
29487
29487
  return toFormData(this.body, ct);
29488
29488
  }
29489
29489
 
@@ -41884,7 +41884,7 @@ function _loadUserPackageJson() {
41884
41884
  targetPkgUrl = isTest ? packageTestJsonUrl : packageJsonUrl;
41885
41885
  _context.t0 = JSON;
41886
41886
  _context.next = 10;
41887
- return fs__default["default"].readFile(new URL(targetPkgUrl, (typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('index-be7da4e6.js', document.baseURI).href))), 'utf-8');
41887
+ return fs__default["default"].readFile(new URL(targetPkgUrl, (typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('index-0d4223e3.js', document.baseURI).href))), 'utf-8');
41888
41888
  case 10:
41889
41889
  _context.t1 = _context.sent;
41890
41890
  pkg = _context.t0.parse.call(_context.t0, _context.t1);
@@ -43176,7 +43176,7 @@ var ProjectFiles = /*#__PURE__*/function () {
43176
43176
  return ProjectFiles;
43177
43177
  }();
43178
43178
 
43179
- var __filename$1 = node_url.fileURLToPath((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('index-be7da4e6.js', document.baseURI).href)));
43179
+ var __filename$1 = node_url.fileURLToPath((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('index-0d4223e3.js', document.baseURI).href)));
43180
43180
  var __dirname$1 = path__default["default"].dirname(__filename$1);
43181
43181
  function zipDirectory(source, out) {
43182
43182
  var archive = archiver$1('tar', {
@@ -43391,7 +43391,7 @@ function _buildApp() {
43391
43391
  case 11:
43392
43392
  _context4.t0 = JSON;
43393
43393
  _context4.next = 14;
43394
- return fs__default["default"].readFile(new URL(templatePackagePath, (typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('index-be7da4e6.js', document.baseURI).href))), 'utf-8');
43394
+ return fs__default["default"].readFile(new URL(templatePackagePath, (typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('index-0d4223e3.js', document.baseURI).href))), 'utf-8');
43395
43395
  case 14:
43396
43396
  _context4.t1 = _context4.sent;
43397
43397
  packageTemplate = _context4.t0.parse.call(_context4.t0, _context4.t1);
package/dist/index.cjs CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var index = require("./index-be7da4e6.cjs");
6
- var dev = require("./dev-4051ca91.cjs");
7
- require("./spirits-02db68e3.cjs");
5
+ var index = require("./index-0d4223e3.cjs");
6
+ var dev = require("./dev-bc9e04ca.cjs");
7
+ require("./spirits-5dc52d64.cjs");
8
8
  require("./macros-f62cceac.cjs");
9
9
  require('fs');
10
10
  require('events');
@@ -2,9 +2,9 @@
2
2
 
3
3
  require('node:fs');
4
4
  require('node:path');
5
- var index = require("./index-be7da4e6.cjs");
6
- require("./spirits-02db68e3.cjs");
7
- require("./dev-4051ca91.cjs");
5
+ var index = require("./index-0d4223e3.cjs");
6
+ require("./spirits-5dc52d64.cjs");
7
+ require("./dev-bc9e04ca.cjs");
8
8
  require('util');
9
9
  require('stream');
10
10
  require('path');
@@ -634,8 +634,8 @@ var _excluded = ["keywords"];
634
634
  * @typedef {Object} ConversationData
635
635
  * @property {import('@scout9/app').Scout9ProjectBuildConfig} config - used to define generation and extract persona metadata
636
636
  * @property {import('@scout9/app').Conversation} conversation
637
- * @property {Array<import('@scout9/app').Message>} messages
638
- * @property {import('@scout9/app').Message} message - the message sent by the customer (should exist in messages)
637
+ * @property {Array<import('@scout9/admin').Message>} messages
638
+ * @property {import('@scout9/admin').Message} message - the message sent by the customer (should exist in messages)
639
639
  * @property {import('@scout9/app').Customer} customer
640
640
  * @property {import('@scout9/app').ConversationProgress} progress - progress checklist for manual/auto ingress workflows
641
641
  * @property {any} context - event context
@@ -643,16 +643,16 @@ var _excluded = ["keywords"];
643
643
 
644
644
  /**
645
645
  * @typedef {Object} ParseOutput
646
- * @property {Array<import('@scout9/app').Message>} messages
646
+ * @property {Array<import('@scout9/admin').Message>} messages
647
647
  * @property {import('@scout9/app').Conversation} conversation
648
- * @property {import('@scout9/app').Message} message
648
+ * @property {import('@scout9/admin').Message} message
649
649
  * @property {any} context
650
650
  */
651
651
 
652
652
  /**
653
653
  * @typedef {Object} WorkflowOutput
654
654
  * @property {Array<import('@scout9/app').WorkflowResponseSlot>} slots
655
- * @property {Array<import('@scout9/app').Message>} messages
655
+ * @property {Array<import('@scout9/admin').Message>} messages
656
656
  * @property {import('@scout9/app').Conversation} conversation
657
657
  * @property {any} context
658
658
  */
@@ -660,7 +660,7 @@ var _excluded = ["keywords"];
660
660
  /**
661
661
  * @typedef {Object} GenerateOutput
662
662
  * @property {import('@scout9/admin').GenerateResponse | undefined} generate
663
- * @property {Array<import('@scout9/app').Message>} messages
663
+ * @property {Array<import('@scout9/admin').Message>} messages
664
664
  * @property {import('@scout9/app').Conversation} conversation
665
665
  * @property {any} context
666
666
  */
@@ -672,6 +672,12 @@ var _excluded = ["keywords"];
672
672
  * @returns {Promise<import('@scout9/admin').ParseResponse>}
673
673
  */
674
674
 
675
+ /**
676
+ * @callback ContextualizerFun
677
+ * @param {Pick<import('@scout9/app').WorkflowEvent, 'messages' | 'conversation'>} args - message to send
678
+ * @returns {Promise<import('@scout9/app').WorkflowEvent['messages']>}
679
+ */
680
+
675
681
  /**
676
682
  * @callback WorkflowFun
677
683
  * @param {import('@scout9/app').WorkflowEvent} event - conversation data
@@ -692,7 +698,7 @@ var _excluded = ["keywords"];
692
698
 
693
699
  /**
694
700
  * @callback IdGeneratorFun
695
- * @param {import('@scout9/app').Message['role']} prefix
701
+ * @param {import('@scout9/admin').Message['role']} prefix
696
702
  * @returns {string}
697
703
  */
698
704
 
@@ -708,6 +714,7 @@ var _excluded = ["keywords"];
708
714
  /**
709
715
  * @typedef {Object} CustomerSpiritCallbacks
710
716
  * @property {ParseFun} parser
717
+ * @property {ContextualizerFun} contextualizer
711
718
  * @property {WorkflowFun} workflow
712
719
  * @property {GenerateFun} generator
713
720
  * @property {TransformerFun} transformer
@@ -721,9 +728,9 @@ var _excluded = ["keywords"];
721
728
  * forwardNote?: string;
722
729
  * forward?: import('@scout9/app').WorkflowResponseSlot['forward'];
723
730
  * })} conversation
724
- * @property {Change<Array<import('@scout9/app').Message>>} messages
731
+ * @property {Change<Array<import('@scout9/admin').Message>>} messages
725
732
  * @property {Change<any>} context
726
- * @property {Change<import('@scout9/app').Message>} message
733
+ * @property {Change<import('@scout9/admin').Message>} message
727
734
  * @property {Array<import('@scout9/app').Followup>} followup
728
735
  * @property {Array<import('@scout9/app').EntityContextUpsert>} entityContextUpsert
729
736
  */
@@ -741,6 +748,7 @@ var Spirits = {
741
748
  customer,
742
749
  config,
743
750
  parser,
751
+ contextualizer,
744
752
  workflow,
745
753
  generator,
746
754
  transformer,
@@ -775,6 +783,10 @@ var Spirits = {
775
783
  newKeyCount,
776
784
  noNewContext,
777
785
  _messages2,
786
+ newContextMessages,
787
+ _iterator,
788
+ _step,
789
+ contextMessage,
778
790
  slots,
779
791
  hasNoInstructions,
780
792
  hasNoCustomMessage,
@@ -784,9 +796,9 @@ var Spirits = {
784
796
  _forward,
785
797
  _forwardNote,
786
798
  _tasks,
787
- _iterator,
788
- _step,
789
- _step$value,
799
+ _iterator2,
800
+ _step2,
801
+ _step2$value,
790
802
  forward,
791
803
  forwardNote,
792
804
  instructions,
@@ -808,11 +820,11 @@ var Spirits = {
808
820
  _slot,
809
821
  slotId,
810
822
  _tasks2,
811
- _iterator4,
812
- _step4,
813
- instruction,
814
823
  _iterator5,
815
824
  _step5,
825
+ instruction,
826
+ _iterator6,
827
+ _step6,
816
828
  _loop,
817
829
  manualMessageObj,
818
830
  now,
@@ -824,11 +836,11 @@ var Spirits = {
824
836
  agentMessages,
825
837
  lastAgentMessage,
826
838
  addedMessages,
827
- _iterator2,
828
- _step2,
829
- newMessage,
830
839
  _iterator3,
831
840
  _step3,
841
+ newMessage,
842
+ _iterator4,
843
+ _step4,
832
844
  transformResponse,
833
845
  _agentMessages,
834
846
  _lastAgentMessage,
@@ -837,7 +849,7 @@ var Spirits = {
837
849
  while (1) switch (_context2.prev = _context2.next) {
838
850
  case 0:
839
851
  onError = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : function () {};
840
- customer = input.customer, config = input.config, parser = input.parser, workflow = input.workflow, generator = input.generator, transformer = input.transformer, idGenerator = input.idGenerator, _input$progress = input.progress, progress = _input$progress === void 0 ? function (message, level, type, payload) {} : _input$progress, messageBefore = input.message, contextBefore = input.context, messagesBefore = input.messages, conversationBefore = input.conversation;
852
+ customer = input.customer, config = input.config, parser = input.parser, contextualizer = input.contextualizer, workflow = input.workflow, generator = input.generator, transformer = input.transformer, idGenerator = input.idGenerator, _input$progress = input.progress, progress = _input$progress === void 0 ? function (message, level, type, payload) {} : _input$progress, messageBefore = input.message, contextBefore = input.context, messagesBefore = input.messages, conversationBefore = input.conversation;
841
853
  conversation = input.conversation, messages = input.messages, context = input.context, message = input.message; // Storing post process events here
842
854
  followup = [];
843
855
  entityContextUpsert = []; // 0. Setup Helpers
@@ -1064,9 +1076,29 @@ var Spirits = {
1064
1076
  })));
1065
1077
  }
1066
1078
 
1067
- // 3. Run the workflow
1079
+ // 3. Run the contextualizer
1080
+ _context2.next = 46;
1081
+ return contextualizer({
1082
+ conversation: conversation,
1083
+ messages: messages
1084
+ });
1085
+ case 46:
1086
+ newContextMessages = _context2.sent;
1087
+ _iterator = _createForOfIteratorHelper(newContextMessages);
1088
+ try {
1089
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
1090
+ contextMessage = _step.value;
1091
+ messages.push(contextMessage);
1092
+ }
1093
+
1094
+ // 4. Run the workflow
1095
+ } catch (err) {
1096
+ _iterator.e(err);
1097
+ } finally {
1098
+ _iterator.f();
1099
+ }
1068
1100
  progress('Running workflow', 'info', 'SET_PROCESSING', 'system');
1069
- _context2.next = 47;
1101
+ _context2.next = 52;
1070
1102
  return workflow({
1071
1103
  messages: messages,
1072
1104
  conversation: conversation,
@@ -1095,7 +1127,7 @@ var Spirits = {
1095
1127
  return accumulator;
1096
1128
  }, []);
1097
1129
  });
1098
- case 47:
1130
+ case 52:
1099
1131
  slots = _context2.sent;
1100
1132
  hasNoInstructions = slots.every(function (s) {
1101
1133
  return !s.instructions || Array.isArray(s.instructions) && s.instructions.length === 0;
@@ -1121,21 +1153,21 @@ var Spirits = {
1121
1153
  }
1122
1154
  resettedIntent = false;
1123
1155
  /** @type {Array<string> | undefined} */
1124
- _iterator = _createForOfIteratorHelper(slots);
1125
- _context2.prev = 55;
1126
- _iterator.s();
1127
- case 57:
1128
- if ((_step = _iterator.n()).done) {
1129
- _context2.next = 128;
1156
+ _iterator2 = _createForOfIteratorHelper(slots);
1157
+ _context2.prev = 60;
1158
+ _iterator2.s();
1159
+ case 62:
1160
+ if ((_step2 = _iterator2.n()).done) {
1161
+ _context2.next = 133;
1130
1162
  break;
1131
1163
  }
1132
- _step$value = _step.value, forward = _step$value.forward, forwardNote = _step$value.forwardNote, instructions = _step$value.instructions, removeInstructions = _step$value.removeInstructions, manualMessage = _step$value.message, scheduled = _step$value.scheduled, resetIntent = _step$value.resetIntent, secondsDelay = _step$value.secondsDelay, contextUpsert = _step$value.contextUpsert, anticipate = _step$value.anticipate, slotFollowup = _step$value.followup, slotEntityContextUpsert = _step$value.entityContextUpsert, tasks = _step$value.tasks;
1164
+ _step2$value = _step2.value, forward = _step2$value.forward, forwardNote = _step2$value.forwardNote, instructions = _step2$value.instructions, removeInstructions = _step2$value.removeInstructions, manualMessage = _step2$value.message, scheduled = _step2$value.scheduled, resetIntent = _step2$value.resetIntent, secondsDelay = _step2$value.secondsDelay, contextUpsert = _step2$value.contextUpsert, anticipate = _step2$value.anticipate, slotFollowup = _step2$value.followup, slotEntityContextUpsert = _step2$value.entityContextUpsert, tasks = _step2$value.tasks;
1133
1165
  if (!anticipate) {
1134
- _context2.next = 72;
1166
+ _context2.next = 77;
1135
1167
  break;
1136
1168
  }
1137
1169
  if (!Array.isArray(anticipate)) {
1138
- _context2.next = 67;
1170
+ _context2.next = 72;
1139
1171
  break;
1140
1172
  }
1141
1173
  // 'literal' anticipation
@@ -1155,11 +1187,11 @@ var Spirits = {
1155
1187
  slots: _slots,
1156
1188
  map: map
1157
1189
  });
1158
- _context2.next = 72;
1190
+ _context2.next = 77;
1159
1191
  break;
1160
- case 67:
1192
+ case 72:
1161
1193
  if (!('yes' in anticipate && 'no' in anticipate && 'did' in anticipate)) {
1162
- _context2.next = 71;
1194
+ _context2.next = 76;
1163
1195
  break;
1164
1196
  }
1165
1197
  // "did" anticipation
@@ -1171,11 +1203,11 @@ var Spirits = {
1171
1203
  },
1172
1204
  did: anticipate.did
1173
1205
  });
1174
- _context2.next = 72;
1206
+ _context2.next = 77;
1175
1207
  break;
1176
- case 71:
1208
+ case 76:
1177
1209
  throw new Error("Invalid anticipate payload \"".concat(JSON.stringify(anticipate), "\""));
1178
- case 72:
1210
+ case 77:
1179
1211
  // tasks from auto/manual ingress to execute
1180
1212
  if (!!tasks && Array.isArray(tasks) && !!tasks.length) {
1181
1213
  if (!_tasks) _tasks = [];
@@ -1231,25 +1263,25 @@ var Spirits = {
1231
1263
 
1232
1264
  // Insert instructions context
1233
1265
  if (!instructions) {
1234
- _context2.next = 91;
1266
+ _context2.next = 96;
1235
1267
  break;
1236
1268
  }
1237
1269
  if (!(typeof instructions === 'string')) {
1238
- _context2.next = 81;
1270
+ _context2.next = 86;
1239
1271
  break;
1240
1272
  }
1241
1273
  addInstruction(instructions, previousLockAttempt);
1242
- _context2.next = 91;
1274
+ _context2.next = 96;
1243
1275
  break;
1244
- case 81:
1276
+ case 86:
1245
1277
  if (!Array.isArray(instructions)) {
1246
- _context2.next = 86;
1278
+ _context2.next = 91;
1247
1279
  break;
1248
1280
  }
1249
- _iterator4 = _createForOfIteratorHelper(instructions);
1281
+ _iterator5 = _createForOfIteratorHelper(instructions);
1250
1282
  try {
1251
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
1252
- instruction = _step4.value;
1283
+ for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
1284
+ instruction = _step5.value;
1253
1285
  if (typeof instruction === 'string') {
1254
1286
  addInstruction(instruction, previousLockAttempt);
1255
1287
  } else {
@@ -1257,35 +1289,35 @@ var Spirits = {
1257
1289
  }
1258
1290
  }
1259
1291
  } catch (err) {
1260
- _iterator4.e(err);
1292
+ _iterator5.e(err);
1261
1293
  } finally {
1262
- _iterator4.f();
1294
+ _iterator5.f();
1263
1295
  }
1264
- _context2.next = 91;
1296
+ _context2.next = 96;
1265
1297
  break;
1266
- case 86:
1298
+ case 91:
1267
1299
  if (!(_typeof(instructions) === 'object' && 'content' in instructions)) {
1268
- _context2.next = 90;
1300
+ _context2.next = 95;
1269
1301
  break;
1270
1302
  }
1271
1303
  addInstruction(instructions.content, previousLockAttempt, instructions.id);
1272
- _context2.next = 91;
1304
+ _context2.next = 96;
1273
1305
  break;
1274
- case 90:
1306
+ case 95:
1275
1307
  throw new Error("SpiritsError: instructions must be a string or array or {content: \"<instruction>\"}, got: ".concat(JSON.stringify(instructions)));
1276
- case 91:
1308
+ case 96:
1277
1309
  if (!removeInstructions) {
1278
- _context2.next = 108;
1310
+ _context2.next = 113;
1279
1311
  break;
1280
1312
  }
1281
- _iterator5 = _createForOfIteratorHelper(removeInstructions);
1282
- _context2.prev = 93;
1313
+ _iterator6 = _createForOfIteratorHelper(removeInstructions);
1314
+ _context2.prev = 98;
1283
1315
  _loop = /*#__PURE__*/_regeneratorRuntime().mark(function _loop() {
1284
1316
  var instructionId, index;
1285
1317
  return _regeneratorRuntime().wrap(function _loop$(_context) {
1286
1318
  while (1) switch (_context.prev = _context.next) {
1287
1319
  case 0:
1288
- instructionId = _step5.value;
1320
+ instructionId = _step6.value;
1289
1321
  index = messages.findIndex(function (m) {
1290
1322
  return m.id === instructionId;
1291
1323
  });
@@ -1303,33 +1335,33 @@ var Spirits = {
1303
1335
  }
1304
1336
  }, _loop);
1305
1337
  });
1306
- _iterator5.s();
1307
- case 96:
1308
- if ((_step5 = _iterator5.n()).done) {
1309
- _context2.next = 100;
1338
+ _iterator6.s();
1339
+ case 101:
1340
+ if ((_step6 = _iterator6.n()).done) {
1341
+ _context2.next = 105;
1310
1342
  break;
1311
1343
  }
1312
- return _context2.delegateYield(_loop(), "t0", 98);
1313
- case 98:
1314
- _context2.next = 96;
1315
- break;
1316
- case 100:
1317
- _context2.next = 105;
1344
+ return _context2.delegateYield(_loop(), "t0", 103);
1345
+ case 103:
1346
+ _context2.next = 101;
1318
1347
  break;
1319
- case 102:
1320
- _context2.prev = 102;
1321
- _context2.t1 = _context2["catch"](93);
1322
- _iterator5.e(_context2.t1);
1323
1348
  case 105:
1324
- _context2.prev = 105;
1325
- _iterator5.f();
1326
- return _context2.finish(105);
1327
- case 108:
1349
+ _context2.next = 110;
1350
+ break;
1351
+ case 107:
1352
+ _context2.prev = 107;
1353
+ _context2.t1 = _context2["catch"](98);
1354
+ _iterator6.e(_context2.t1);
1355
+ case 110:
1356
+ _context2.prev = 110;
1357
+ _iterator6.f();
1358
+ return _context2.finish(110);
1359
+ case 113:
1328
1360
  if (!manualMessage) {
1329
- _context2.next = 124;
1361
+ _context2.next = 129;
1330
1362
  break;
1331
1363
  }
1332
- /** @type {import('@scout9/app').Message} */
1364
+ /** @type {import('@scout9/admin').Message} */
1333
1365
  manualMessageObj = {
1334
1366
  id: idGenerator('persona'),
1335
1367
  role: 'agent',
@@ -1338,25 +1370,25 @@ var Spirits = {
1338
1370
  time: new Date().toISOString()
1339
1371
  };
1340
1372
  if (!(_typeof(manualMessage) === 'object')) {
1341
- _context2.next = 116;
1373
+ _context2.next = 121;
1342
1374
  break;
1343
1375
  }
1344
1376
  Object.assign(manualMessageObj, manualMessage);
1345
1377
  manualMessageObj.role = 'agent';
1346
1378
  manualMessageObj.time = new Date().toISOString();
1347
- _context2.next = 121;
1379
+ _context2.next = 126;
1348
1380
  break;
1349
- case 116:
1381
+ case 121:
1350
1382
  if (!(typeof manualMessage === 'string')) {
1351
- _context2.next = 120;
1383
+ _context2.next = 125;
1352
1384
  break;
1353
1385
  }
1354
1386
  manualMessageObj.content = manualMessage;
1355
- _context2.next = 121;
1387
+ _context2.next = 126;
1356
1388
  break;
1357
- case 120:
1389
+ case 125:
1358
1390
  throw new Error('Manual message must be of type "string" or "DirectMessage"');
1359
- case 121:
1391
+ case 126:
1360
1392
  if (scheduled) {
1361
1393
  manualMessageObj.time = new Date(scheduled * 1000).toISOString();
1362
1394
  manualMessageObj.scheduled = manualMessageObj.time;
@@ -1368,7 +1400,7 @@ var Spirits = {
1368
1400
  }
1369
1401
  messages.push(manualMessageObj);
1370
1402
  progress('Added manual message', 'info', 'ADD_MESSAGE', messages[messages.length - 1]);
1371
- case 124:
1403
+ case 129:
1372
1404
  if (contextUpsert) {
1373
1405
  context = updateContext(context, contextUpsert);
1374
1406
  progress('Upserted context', 'info', 'UPDATE_CONTEXT', contextUpsert);
@@ -1376,21 +1408,21 @@ var Spirits = {
1376
1408
  if (resetIntent) {
1377
1409
  resettedIntent = true;
1378
1410
  }
1379
- case 126:
1380
- _context2.next = 57;
1381
- break;
1382
- case 128:
1383
- _context2.next = 133;
1411
+ case 131:
1412
+ _context2.next = 62;
1384
1413
  break;
1385
- case 130:
1386
- _context2.prev = 130;
1387
- _context2.t2 = _context2["catch"](55);
1388
- _iterator.e(_context2.t2);
1389
1414
  case 133:
1390
- _context2.prev = 133;
1391
- _iterator.f();
1392
- return _context2.finish(133);
1393
- case 136:
1415
+ _context2.next = 138;
1416
+ break;
1417
+ case 135:
1418
+ _context2.prev = 135;
1419
+ _context2.t2 = _context2["catch"](60);
1420
+ _iterator2.e(_context2.t2);
1421
+ case 138:
1422
+ _context2.prev = 138;
1423
+ _iterator2.f();
1424
+ return _context2.finish(138);
1425
+ case 141:
1394
1426
  if (resettedIntent && !_forward) {
1395
1427
  conversation.intent = null;
1396
1428
  conversation.intentScore = null;
@@ -1406,17 +1438,17 @@ var Spirits = {
1406
1438
  });
1407
1439
  }
1408
1440
 
1409
- // 4. Generate response
1441
+ // 5. Generate response
1410
1442
  // If conversation previously locked, don't generate
1411
1443
  if (input.conversation.locked) {
1412
- _context2.next = 188;
1444
+ _context2.next = 193;
1413
1445
  break;
1414
1446
  }
1415
1447
  if (!((!conversation.locked || !hasNoInstructions) && !!hasNoCustomMessage)) {
1416
- _context2.next = 154;
1448
+ _context2.next = 159;
1417
1449
  break;
1418
1450
  }
1419
- _context2.prev = 139;
1451
+ _context2.prev = 144;
1420
1452
  progress('Generating message', 'info', 'SET_PROCESSING', 'system');
1421
1453
 
1422
1454
  /** @type {import('@scout9/admin').GenerateRequestOneOf1} */
@@ -1430,9 +1462,9 @@ var Spirits = {
1430
1462
  if (!!_tasks && Array.isArray(_tasks) && !!_tasks.length) {
1431
1463
  generatorInput.tasks = _tasks;
1432
1464
  }
1433
- _context2.next = 145;
1465
+ _context2.next = 150;
1434
1466
  return generator(generatorInput);
1435
- case 145:
1467
+ case 150:
1436
1468
  generatorPayload = _context2.sent;
1437
1469
  if (!generatorPayload.send) {
1438
1470
  progress('Generated response', 'failed', undefined, {
@@ -1448,12 +1480,25 @@ var Spirits = {
1448
1480
  });
1449
1481
  lastAgentMessage = agentMessages[agentMessages.length - 1];
1450
1482
  addedMessages = _toConsumableArray(((generatorPayload === null || generatorPayload === void 0 ? void 0 : generatorPayload.messages) || []).map(function (message) {
1451
- var _message$time, _message$entities, _message$context;
1483
+ var _message$entities, _message$context;
1484
+ var time = message.time;
1485
+ if (typeof time !== 'string') {
1486
+ // Convert the time string
1487
+ if (!time) {
1488
+ progress("Message \"".concat(message.content, "\" wasn't given a timestamp, defaulting to now"));
1489
+ time = new Date().toISOString();
1490
+ } else if (!'toDate' in time) {
1491
+ progress("Message \"".concat(message.content, "\" wasn't given a timestamp (").concat(JSON.stringify(time), ") without a toDate method, defaulting to now"));
1492
+ time = new Date().toISOString();
1493
+ } else {
1494
+ time = message.time.toDate().toISOString();
1495
+ }
1496
+ }
1452
1497
  return {
1453
1498
  id: idGenerator(message.role),
1454
1499
  content: message.content,
1455
1500
  role: message.role,
1456
- time: ((_message$time = message.time) === null || _message$time === void 0 || (_message$time = _message$time.toDate()) === null || _message$time === void 0 ? void 0 : _message$time.toISOString()) || new Date().toISOString(),
1501
+ time: time,
1457
1502
  entities: (_message$entities = message.entities) !== null && _message$entities !== void 0 ? _message$entities : {},
1458
1503
  context: (_message$context = message.context) !== null && _message$context !== void 0 ? _message$context : {},
1459
1504
  mediaUrls: message.mediaUrls
@@ -1470,17 +1515,17 @@ var Spirits = {
1470
1515
  // Error should not have happened
1471
1516
  conversation = lockConversation(conversation, 'Duplicate message');
1472
1517
  } else {
1473
- _iterator2 = _createForOfIteratorHelper(addedMessages);
1518
+ _iterator3 = _createForOfIteratorHelper(addedMessages);
1474
1519
  try {
1475
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
1476
- newMessage = _step2.value;
1520
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
1521
+ newMessage = _step3.value;
1477
1522
  messages.push(newMessage);
1478
1523
  progress('Added agent message', 'info', 'ADD_MESSAGE', messages[messages.length - 1]);
1479
1524
  }
1480
1525
  } catch (err) {
1481
- _iterator2.e(err);
1526
+ _iterator3.e(err);
1482
1527
  } finally {
1483
- _iterator2.f();
1528
+ _iterator3.f();
1484
1529
  }
1485
1530
  }
1486
1531
 
@@ -1493,30 +1538,30 @@ var Spirits = {
1493
1538
  }
1494
1539
  }
1495
1540
  }
1496
- _context2.next = 154;
1541
+ _context2.next = 159;
1497
1542
  break;
1498
- case 149:
1499
- _context2.prev = 149;
1500
- _context2.t3 = _context2["catch"](139);
1543
+ case 154:
1544
+ _context2.prev = 154;
1545
+ _context2.t3 = _context2["catch"](144);
1501
1546
  onError(_context2.t3);
1502
1547
  console.error("Spirits: Locking conversation, error generating response: ".concat(_context2.t3.message));
1503
1548
  conversation = lockConversation(conversation, 'API: ' + _context2.t3.message);
1504
- case 154:
1549
+ case 159:
1505
1550
  if (!(messagesToTransform.length && transformer)) {
1506
- _context2.next = 187;
1551
+ _context2.next = 192;
1507
1552
  break;
1508
1553
  }
1509
- _context2.prev = 155;
1510
- _iterator3 = _createForOfIteratorHelper(messagesToTransform);
1511
- _context2.prev = 157;
1512
- _iterator3.s();
1513
- case 159:
1514
- if ((_step3 = _iterator3.n()).done) {
1515
- _context2.next = 170;
1554
+ _context2.prev = 160;
1555
+ _iterator4 = _createForOfIteratorHelper(messagesToTransform);
1556
+ _context2.prev = 162;
1557
+ _iterator4.s();
1558
+ case 164:
1559
+ if ((_step4 = _iterator4.n()).done) {
1560
+ _context2.next = 175;
1516
1561
  break;
1517
1562
  }
1518
- _step3.value;
1519
- _context2.next = 163;
1563
+ _step4.value;
1564
+ _context2.next = 168;
1520
1565
  return transformer({
1521
1566
  message: messagesToTransform,
1522
1567
  persona: persona,
@@ -1524,7 +1569,7 @@ var Spirits = {
1524
1569
  messages: messages,
1525
1570
  context: context
1526
1571
  });
1527
- case 163:
1572
+ case 168:
1528
1573
  transformResponse = _context2.sent;
1529
1574
  progress('Generated response', 'success', undefined, undefined);
1530
1575
  // Check if already had message
@@ -1544,37 +1589,37 @@ var Spirits = {
1544
1589
  });
1545
1590
  progress('Added agent message', 'info', 'ADD_MESSAGE', messages[messages.length - 1]);
1546
1591
  }
1547
- case 168:
1548
- _context2.next = 159;
1592
+ case 173:
1593
+ _context2.next = 164;
1549
1594
  break;
1550
- case 170:
1551
- _context2.next = 175;
1552
- break;
1553
- case 172:
1554
- _context2.prev = 172;
1555
- _context2.t4 = _context2["catch"](157);
1556
- _iterator3.e(_context2.t4);
1557
1595
  case 175:
1558
- _context2.prev = 175;
1559
- _iterator3.f();
1560
- return _context2.finish(175);
1561
- case 178:
1562
- _context2.next = 185;
1596
+ _context2.next = 180;
1563
1597
  break;
1598
+ case 177:
1599
+ _context2.prev = 177;
1600
+ _context2.t4 = _context2["catch"](162);
1601
+ _iterator4.e(_context2.t4);
1564
1602
  case 180:
1565
1603
  _context2.prev = 180;
1566
- _context2.t5 = _context2["catch"](155);
1604
+ _iterator4.f();
1605
+ return _context2.finish(180);
1606
+ case 183:
1607
+ _context2.next = 190;
1608
+ break;
1609
+ case 185:
1610
+ _context2.prev = 185;
1611
+ _context2.t5 = _context2["catch"](160);
1567
1612
  console.error("Locking conversation, error transforming response: ".concat(_context2.t5.message));
1568
1613
  conversation = lockConversation(conversation, 'API: ' + _context2.t5.message);
1569
1614
  onError(_context2.t5);
1570
- case 185:
1571
- _context2.next = 188;
1615
+ case 190:
1616
+ _context2.next = 193;
1572
1617
  break;
1573
- case 187:
1618
+ case 192:
1574
1619
  if (messagesToTransform.length) {
1575
1620
  console.warn("No transformer provided");
1576
1621
  }
1577
- case 188:
1622
+ case 193:
1578
1623
  progress('Parsing message', 'info', 'SET_PROCESSING', null);
1579
1624
  return _context2.abrupt("return", {
1580
1625
  conversation: {
@@ -1598,11 +1643,11 @@ var Spirits = {
1598
1643
  followup: followup,
1599
1644
  entityContextUpsert: entityContextUpsert
1600
1645
  });
1601
- case 190:
1646
+ case 195:
1602
1647
  case "end":
1603
1648
  return _context2.stop();
1604
1649
  }
1605
- }, _callee, null, [[55, 130, 133, 136], [93, 102, 105, 108], [139, 149], [155, 180], [157, 172, 175, 178]]);
1650
+ }, _callee, null, [[60, 135, 138, 141], [98, 107, 110, 113], [144, 154], [160, 185], [162, 177, 180, 183]]);
1606
1651
  }));
1607
1652
  function customer(_x) {
1608
1653
  return _customer.apply(this, arguments);
package/dist/spirits.cjs CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var spirits = require("./spirits-02db68e3.cjs");
5
+ var spirits = require("./spirits-5dc52d64.cjs");
6
6
 
7
7
 
8
8
 
@@ -2,8 +2,8 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var dev = require("./dev-4051ca91.cjs");
6
- require("./spirits-02db68e3.cjs");
5
+ var dev = require("./dev-bc9e04ca.cjs");
6
+ require("./spirits-5dc52d64.cjs");
7
7
  require('util');
8
8
  require('stream');
9
9
  require('path');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scout9/app",
3
- "version": "1.0.0-alpha.0.8.0",
3
+ "version": "1.0.0-alpha.0.8.2",
4
4
  "description": "Build and deploy your Scout9 app for SMS auto replies",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -15,8 +15,8 @@
15
15
  * @typedef {Object} ConversationData
16
16
  * @property {import('@scout9/app').Scout9ProjectBuildConfig} config - used to define generation and extract persona metadata
17
17
  * @property {import('@scout9/app').Conversation} conversation
18
- * @property {Array<import('@scout9/app').Message>} messages
19
- * @property {import('@scout9/app').Message} message - the message sent by the customer (should exist in messages)
18
+ * @property {Array<import('@scout9/admin').Message>} messages
19
+ * @property {import('@scout9/admin').Message} message - the message sent by the customer (should exist in messages)
20
20
  * @property {import('@scout9/app').Customer} customer
21
21
  * @property {import('@scout9/app').ConversationProgress} progress - progress checklist for manual/auto ingress workflows
22
22
  * @property {any} context - event context
@@ -24,16 +24,16 @@
24
24
 
25
25
  /**
26
26
  * @typedef {Object} ParseOutput
27
- * @property {Array<import('@scout9/app').Message>} messages
27
+ * @property {Array<import('@scout9/admin').Message>} messages
28
28
  * @property {import('@scout9/app').Conversation} conversation
29
- * @property {import('@scout9/app').Message} message
29
+ * @property {import('@scout9/admin').Message} message
30
30
  * @property {any} context
31
31
  */
32
32
 
33
33
  /**
34
34
  * @typedef {Object} WorkflowOutput
35
35
  * @property {Array<import('@scout9/app').WorkflowResponseSlot>} slots
36
- * @property {Array<import('@scout9/app').Message>} messages
36
+ * @property {Array<import('@scout9/admin').Message>} messages
37
37
  * @property {import('@scout9/app').Conversation} conversation
38
38
  * @property {any} context
39
39
  */
@@ -41,7 +41,7 @@
41
41
  /**
42
42
  * @typedef {Object} GenerateOutput
43
43
  * @property {import('@scout9/admin').GenerateResponse | undefined} generate
44
- * @property {Array<import('@scout9/app').Message>} messages
44
+ * @property {Array<import('@scout9/admin').Message>} messages
45
45
  * @property {import('@scout9/app').Conversation} conversation
46
46
  * @property {any} context
47
47
  */
@@ -53,6 +53,12 @@
53
53
  * @returns {Promise<import('@scout9/admin').ParseResponse>}
54
54
  */
55
55
 
56
+ /**
57
+ * @callback ContextualizerFun
58
+ * @param {Pick<import('@scout9/app').WorkflowEvent, 'messages' | 'conversation'>} args - message to send
59
+ * @returns {Promise<import('@scout9/app').WorkflowEvent['messages']>}
60
+ */
61
+
56
62
  /**
57
63
  * @callback WorkflowFun
58
64
  * @param {import('@scout9/app').WorkflowEvent} event - conversation data
@@ -73,7 +79,7 @@
73
79
 
74
80
  /**
75
81
  * @callback IdGeneratorFun
76
- * @param {import('@scout9/app').Message['role']} prefix
82
+ * @param {import('@scout9/admin').Message['role']} prefix
77
83
  * @returns {string}
78
84
  */
79
85
 
@@ -89,6 +95,7 @@
89
95
  /**
90
96
  * @typedef {Object} CustomerSpiritCallbacks
91
97
  * @property {ParseFun} parser
98
+ * @property {ContextualizerFun} contextualizer
92
99
  * @property {WorkflowFun} workflow
93
100
  * @property {GenerateFun} generator
94
101
  * @property {TransformerFun} transformer
@@ -103,9 +110,9 @@
103
110
  * forwardNote?: string;
104
111
  * forward?: import('@scout9/app').WorkflowResponseSlot['forward'];
105
112
  * })} conversation
106
- * @property {Change<Array<import('@scout9/app').Message>>} messages
113
+ * @property {Change<Array<import('@scout9/admin').Message>>} messages
107
114
  * @property {Change<any>} context
108
- * @property {Change<import('@scout9/app').Message>} message
115
+ * @property {Change<import('@scout9/admin').Message>} message
109
116
  * @property {Array<import('@scout9/app').Followup>} followup
110
117
  * @property {Array<import('@scout9/app').EntityContextUpsert>} entityContextUpsert
111
118
  */
@@ -123,6 +130,7 @@ export const Spirits = {
123
130
  customer,
124
131
  config,
125
132
  parser,
133
+ contextualizer,
126
134
  workflow,
127
135
  generator,
128
136
  transformer,
@@ -352,7 +360,13 @@ export const Spirits = {
352
360
  })));
353
361
  }
354
362
 
355
- // 3. Run the workflow
363
+ // 3. Run the contextualizer
364
+ const newContextMessages = await contextualizer({conversation, messages});
365
+ for (const contextMessage of newContextMessages) {
366
+ messages.push(contextMessage);
367
+ }
368
+
369
+ // 4. Run the workflow
356
370
  progress('Running workflow', 'info', 'SET_PROCESSING', 'system');
357
371
 
358
372
  const slots = await workflow({
@@ -543,7 +557,7 @@ export const Spirits = {
543
557
 
544
558
  if (manualMessage) {
545
559
 
546
- /** @type {import('@scout9/app').Message} */
560
+ /** @type {import('@scout9/admin').Message} */
547
561
  let manualMessageObj = {
548
562
  id: idGenerator('persona'),
549
563
  role: 'agent', // @TODO switch role to persona
@@ -598,7 +612,7 @@ export const Spirits = {
598
612
  );
599
613
  }
600
614
 
601
- // 4. Generate response
615
+ // 5. Generate response
602
616
  // If conversation previously locked, don't generate
603
617
  if (!input.conversation.locked) {
604
618
  // If conversation is newly locked, don't generate, unless instructions were provided and no custom messages were provided
@@ -636,15 +650,32 @@ export const Spirits = {
636
650
  const lastAgentMessage = agentMessages[agentMessages.length - 1];
637
651
  const addedMessages = [
638
652
  ...(generatorPayload?.messages || [])
639
- .map((message) => ({
653
+ .map((message) => {
654
+
655
+ let time = message.time;
656
+
657
+ if (typeof time !== 'string') {
658
+ // Convert the time string
659
+ if (!time) {
660
+ progress(`Message "${message.content}" wasn't given a timestamp, defaulting to now`);
661
+ time = new Date().toISOString();
662
+ } else if (!'toDate' in time) {
663
+ progress(`Message "${message.content}" wasn't given a timestamp (${JSON.stringify(time)}) without a toDate method, defaulting to now`);
664
+ time = new Date().toISOString();
665
+ } else {
666
+ time = message.time.toDate().toISOString();
667
+ }
668
+ }
669
+
670
+ return ({
640
671
  id: idGenerator(message.role),
641
672
  content: message.content,
642
673
  role: message.role,
643
- time: message.time?.toDate()?.toISOString() || new Date().toISOString(),
674
+ time,
644
675
  entities: message.entities ?? {},
645
676
  context: message.context ?? {},
646
677
  mediaUrls: message.mediaUrls
647
- }))
678
+ })})
648
679
  ]
649
680
  .reduce((accumulator, message) => {
650
681
  if (!accumulator.find(m => m.content === message.content)) accumulator.push(message);
package/types/index.d.ts CHANGED
@@ -930,11 +930,11 @@ declare module '@scout9/app/spirits' {
930
930
  */
931
931
  config: any;
932
932
  conversation: any;
933
- messages: Array<any>;
933
+ messages: Array<import('@scout9/admin').Message>;
934
934
  /**
935
935
  * - the message sent by the customer (should exist in messages)
936
936
  */
937
- message: any;
937
+ message: import('@scout9/admin').Message;
938
938
  customer: any;
939
939
  /**
940
940
  * - progress checklist for manual/auto ingress workflows
@@ -946,31 +946,33 @@ declare module '@scout9/app/spirits' {
946
946
  context: any;
947
947
  };
948
948
  export type ParseOutput = {
949
- messages: Array<any>;
949
+ messages: Array<import('@scout9/admin').Message>;
950
950
  conversation: any;
951
- message: any;
951
+ message: import('@scout9/admin').Message;
952
952
  context: any;
953
953
  };
954
954
  export type WorkflowOutput = {
955
955
  slots: Array<any>;
956
- messages: Array<any>;
956
+ messages: Array<import('@scout9/admin').Message>;
957
957
  conversation: any;
958
958
  context: any;
959
959
  };
960
960
  export type GenerateOutput = {
961
961
  generate: import('@scout9/admin').GenerateResponse | undefined;
962
- messages: Array<any>;
962
+ messages: Array<import('@scout9/admin').Message>;
963
963
  conversation: any;
964
964
  context: any;
965
965
  };
966
966
  export type ParseFun = (message: string, language: string | undefined) => Promise<import('@scout9/admin').ParseResponse>;
967
+ export type ContextualizerFun = (args: Pick<any, 'messages' | 'conversation'>) => Promise<any['messages']>;
967
968
  export type WorkflowFun = (event: any) => Promise<any>;
968
969
  export type GenerateFun = (data: import('@scout9/admin').GenerateRequestOneOf1) => Promise<import('@scout9/admin').GenerateResponse>;
969
970
  export type TransformerFun = (data: import('@scout9/admin').PmtTransformRequest) => Promise<import('@scout9/admin').PmtTransformResponse>;
970
- export type IdGeneratorFun = (prefix: any) => string;
971
+ export type IdGeneratorFun = (prefix: import('@scout9/admin').Message['role']) => string;
971
972
  export type StatusCallback = (message: string, level?: 'info' | 'warn' | 'error' | 'success' | undefined, type?: string | undefined, payload?: any | undefined) => void;
972
973
  export type CustomerSpiritCallbacks = {
973
974
  parser: ParseFun;
975
+ contextualizer: ContextualizerFun;
974
976
  workflow: WorkflowFun;
975
977
  generator: GenerateFun;
976
978
  transformer: TransformerFun;
@@ -982,9 +984,9 @@ declare module '@scout9/app/spirits' {
982
984
  forwardNote?: string;
983
985
  forward?: any['forward'];
984
986
  });
985
- messages: Change<Array<any>>;
987
+ messages: Change<Array<import('@scout9/admin').Message>>;
986
988
  context: Change<any>;
987
- message: Change<any>;
989
+ message: Change<import('@scout9/admin').Message>;
988
990
  followup: Array<any>;
989
991
  entityContextUpsert: Array<any>;
990
992
  };
@@ -167,5 +167,5 @@
167
167
  null,
168
168
  null
169
169
  ],
170
- "mappings": "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BlBC,yBAAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAsCzBC,8BAA8BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cC3F9BC,4BAA4BA;;;;;;;;;;;;;;;;;;;;;;cAyC5BC,yBAAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAI1BC,yBAAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAEzBC,2BAA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAE3BC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAEZC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cClEdC,aAAaA;;;;;;;;;;;;;cAWbC,uBAAuBA;;;;;;;;;;;;;cAYvBjD,iCAAiCA;;;;;;;;;;;;;;;;;;;;cAWjCC,uBAAuBA;;;;;;;;;;;;;;;;;;;cAavBC,kCAAkCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAuBlCgD,iBAAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;cASjBC,kBAAkBA;;;;;;;;;;;;;;;;cAUlBC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAUdC,2BAA2BA;;;;;;;;;;cAU3BC,4BAA4BA;;;;;;;;;;cAE5BC,yBAAyBA;;;;;;;;;;;;;cAMzBC,mBAAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoBnBC,mBAAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAKnBC,8BAA8BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqC9BC,yBAAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAQzBC,0BAA0BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqB1BC,sBAAsBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAKtBC,sBAAsBA"
170
+ "mappings": "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C8BlBC,yBAAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAsCzBC,8BAA8BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cC3F9BC,4BAA4BA;;;;;;;;;;;;;;;;;;;;;;cAyC5BC,yBAAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAI1BC,yBAAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAEzBC,2BAA2BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAE3BC,YAAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAEZC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cClEdC,aAAaA;;;;;;;;;;;;;cAWbC,uBAAuBA;;;;;;;;;;;;;cAYvBjD,iCAAiCA;;;;;;;;;;;;;;;;;;;;cAWjCC,uBAAuBA;;;;;;;;;;;;;;;;;;;cAavBC,kCAAkCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAuBlCgD,iBAAiBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;cASjBC,kBAAkBA;;;;;;;;;;;;;;;;cAUlBC,cAAcA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAUdC,2BAA2BA;;;;;;;;;;cAU3BC,4BAA4BA;;;;;;;;;;cAE5BC,yBAAyBA;;;;;;;;;;;;;cAMzBC,mBAAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAoBnBC,mBAAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAKnBC,8BAA8BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqC9BC,yBAAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAQzBC,0BAA0BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqB1BC,sBAAsBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAKtBC,sBAAsBA"
171
171
  }