wao 0.5.6 → 0.6.1

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.
package/cjs/aoconnect.js CHANGED
@@ -11,6 +11,7 @@ var _base64url = _interopRequireDefault(require("base64url"));
11
11
  var _utils = require("./utils.js");
12
12
  var _armem = _interopRequireDefault(require("./armem.js"));
13
13
  var _weavedrive = _interopRequireDefault(require("./weavedrive.js"));
14
+ var _kv = _interopRequireDefault(require("./kv.js"));
14
15
  var _aoLoader = _interopRequireDefault(require("@permaweb/ao-loader"));
15
16
  var _fs = require("fs");
16
17
  var _path = require("path");
@@ -40,6 +41,7 @@ var pkg = (_WarpArBundles$defaul = WarpArBundles["default"]) !== null && _WarpAr
40
41
  var DataItem = pkg.DataItem;
41
42
  var connect = exports.connect = function connect(mem) {
42
43
  var _mem;
44
+ var log = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
43
45
  var isMem = ((_mem = mem) === null || _mem === void 0 ? void 0 : _mem.__type__) === "mem";
44
46
  if (!isMem) {
45
47
  var _mem2;
@@ -51,9 +53,11 @@ var connect = exports.connect = function connect(mem) {
51
53
  mem = new _armem["default"](args);
52
54
  }
53
55
  var ar = new _tar["default"]({
54
- mem: mem
56
+ mem: mem,
57
+ log: log
55
58
  });
56
59
  var WeaveDrive = new _weavedrive["default"](ar).drive;
60
+ var KV = new _kv["default"](ar).kv;
57
61
  var transform = function transform(input) {
58
62
  var _input$Tags;
59
63
  var output = {
@@ -91,7 +95,7 @@ var connect = exports.connect = function connect(mem) {
91
95
  Target: p.id,
92
96
  Owner: Owner,
93
97
  Data: data !== null && data !== void 0 && data.length ? data : "",
94
- "Block-Height": p.height.toString(),
98
+ "Block-Height": mem.height.toString(),
95
99
  Timestamp: Date.now().toString(),
96
100
  Module: p.module,
97
101
  From: from,
@@ -150,8 +154,6 @@ var connect = exports.connect = function connect(mem) {
150
154
  format,
151
155
  wasm,
152
156
  _mem$wasms$mod2,
153
- now,
154
- handle,
155
157
  ex,
156
158
  _iterator,
157
159
  _step,
@@ -161,6 +163,10 @@ var connect = exports.connect = function connect(mem) {
161
163
  owner,
162
164
  item,
163
165
  __tags,
166
+ now,
167
+ t,
168
+ wd,
169
+ handle,
164
170
  _tags,
165
171
  res,
166
172
  memory,
@@ -216,32 +222,18 @@ var connect = exports.connect = function connect(mem) {
216
222
  format = mem.wasms[mod].format;
217
223
  }
218
224
  (_format = format) !== null && _format !== void 0 ? _format : format = "wasm64-unknown-emscripten-draft_2024_02_15";
219
- now = Date.now;
220
- _context.next = 17;
221
- return (0, _aoLoader["default"])(wasm, {
222
- format: format,
223
- mode: "test",
224
- WeaveDrive: WeaveDrive
225
- });
226
- case 17:
227
- handle = _context.sent;
228
- Date.now = now;
229
- _module = {
230
- handle: handle,
231
- id: mod
232
- };
233
225
  if (mod) {
234
- _context.next = 22;
226
+ _context.next = 16;
235
227
  break;
236
228
  }
237
229
  throw Error("module not found");
238
- case 22:
230
+ case 16:
239
231
  opt.tags = (0, _utils.buildTags)(null, (0, _ramda.mergeLeft)((0, _utils.tags)((_opt$tags = opt.tags) !== null && _opt$tags !== void 0 ? _opt$tags : []), {
240
232
  "Data-Protocol": "ao",
241
233
  Variant: "ao.TN.1",
242
234
  Type: "Process",
243
235
  SDK: "aoconnect",
244
- Module: opt.module,
236
+ Module: mod,
245
237
  Scheduler: opt.scheduler,
246
238
  "Content-Type": "text/plain"
247
239
  }));
@@ -262,14 +254,14 @@ var connect = exports.connect = function connect(mem) {
262
254
  name: "Type",
263
255
  value: "Process"
264
256
  });
265
- _context.next = 30;
257
+ _context.next = 24;
266
258
  return ar.dataitem({
267
259
  item: opt.item,
268
260
  data: opt.data,
269
261
  signer: opt.signer,
270
262
  tags: (0, _utils.tags)(opt.tags)
271
263
  });
272
- case 30:
264
+ case 24:
273
265
  _yield$ar$dataitem = _context.sent;
274
266
  id = _yield$ar$dataitem.id;
275
267
  owner = _yield$ar$dataitem.owner;
@@ -277,9 +269,27 @@ var connect = exports.connect = function connect(mem) {
277
269
  __tags = _yield$ar$dataitem.tags;
278
270
  opt.tags = (0, _utils.buildTags)(null, __tags);
279
271
  if (opt.item) opt.data = _base64url["default"].decode(item.data);
280
- _context.next = 39;
281
- return ar.postItem(item, _test.su.jwk);
282
- case 39:
272
+ _context.next = 33;
273
+ return ar.postItems(item, _test.su.jwk);
274
+ case 33:
275
+ now = Date.now;
276
+ t = (0, _utils.tags)(opt.tags);
277
+ wd = t.Extension === "KV" ? KV : WeaveDrive;
278
+ _context.next = 38;
279
+ return (0, _aoLoader["default"])(wasm, {
280
+ format: format,
281
+ WeaveDrive: wd,
282
+ spawn: item,
283
+ module: mem.txs[mod],
284
+ blockHeight: "100"
285
+ });
286
+ case 38:
287
+ handle = _context.sent;
288
+ _module = {
289
+ handle: handle,
290
+ id: mod
291
+ };
292
+ Date.now = now;
283
293
  _tags = (0, _utils.tags)(opt.tags);
284
294
  res = null;
285
295
  memory = null;
@@ -298,7 +308,7 @@ var connect = exports.connect = function connect(mem) {
298
308
  opt: opt
299
309
  };
300
310
  if (!(_tags["On-Boot"] || true)) {
301
- _context.next = 57;
311
+ _context.next = 59;
302
312
  break;
303
313
  }
304
314
  data = "";
@@ -311,51 +321,51 @@ var connect = exports.connect = function connect(mem) {
311
321
  auth: _test.mu.addr
312
322
  });
313
323
  _t = (0, _utils.tags)(msg.Tags);
314
- _context.next = 51;
324
+ _context.next = 53;
315
325
  return _module.handle(null, msg, _env);
316
- case 51:
326
+ case 53:
317
327
  res = _context.sent;
318
328
  p.memory = res.Memory;
319
329
  delete res.Memory;
320
330
  p.res[id] = res;
321
- _context.next = 58;
331
+ _context.next = 60;
322
332
  break;
323
- case 57:
333
+ case 59:
324
334
  p.height += 1;
325
- case 58:
335
+ case 60:
326
336
  mem.msgs[id] = opt;
327
337
  mem.env[id] = p;
328
338
  if (!_tags["Cron-Interval"]) {
329
- _context.next = 84;
339
+ _context.next = 86;
330
340
  break;
331
341
  }
332
342
  _tags$CronInterval$s = _tags["Cron-Interval"].split("-"), _tags$CronInterval$s2 = _slicedToArray(_tags$CronInterval$s, 2), num = _tags$CronInterval$s2[0], unit = _tags$CronInterval$s2[1];
333
343
  _int = 0;
334
344
  _context.t0 = unit.replace(/s$/, "");
335
- _context.next = _context.t0 === "millisecond" ? 66 : _context.t0 === "second" ? 68 : _context.t0 === "minute" ? 70 : _context.t0 === "hour" ? 72 : _context.t0 === "day" ? 74 : _context.t0 === "month" ? 76 : _context.t0 === "year" ? 78 : 80;
345
+ _context.next = _context.t0 === "millisecond" ? 68 : _context.t0 === "second" ? 70 : _context.t0 === "minute" ? 72 : _context.t0 === "hour" ? 74 : _context.t0 === "day" ? 76 : _context.t0 === "month" ? 78 : _context.t0 === "year" ? 80 : 82;
336
346
  break;
337
- case 66:
338
- _int = num;
339
- return _context.abrupt("break", 80);
340
347
  case 68:
341
- _int = num * 1000;
342
- return _context.abrupt("break", 80);
348
+ _int = num;
349
+ return _context.abrupt("break", 82);
343
350
  case 70:
344
- _int = num * 1000 * 60;
345
- return _context.abrupt("break", 80);
351
+ _int = num * 1000;
352
+ return _context.abrupt("break", 82);
346
353
  case 72:
347
- _int = num * 1000 * 60 * 60;
348
- return _context.abrupt("break", 80);
354
+ _int = num * 1000 * 60;
355
+ return _context.abrupt("break", 82);
349
356
  case 74:
350
- _int = num * 1000 * 60 * 60 * 24;
351
- return _context.abrupt("break", 80);
357
+ _int = num * 1000 * 60 * 60;
358
+ return _context.abrupt("break", 82);
352
359
  case 76:
353
- _int = num * 1000 * 60 * 60 * 24 * 30;
354
- return _context.abrupt("break", 80);
360
+ _int = num * 1000 * 60 * 60 * 24;
361
+ return _context.abrupt("break", 82);
355
362
  case 78:
356
- _int = num * 1000 * 60 * 60 * 24 * 365;
357
- return _context.abrupt("break", 80);
363
+ _int = num * 1000 * 60 * 60 * 24 * 30;
364
+ return _context.abrupt("break", 82);
358
365
  case 80:
366
+ _int = num * 1000 * 60 * 60 * 24 * 365;
367
+ return _context.abrupt("break", 82);
368
+ case 82:
359
369
  cronTags = [];
360
370
  for (k in _tags) {
361
371
  if (/^Cron-Tag-/.test(k)) {
@@ -367,9 +377,9 @@ var connect = exports.connect = function connect(mem) {
367
377
  }
368
378
  mem.env[id].cronTags = cronTags;
369
379
  mem.env[id].span = _int;
370
- case 84:
380
+ case 86:
371
381
  return _context.abrupt("return", id);
372
- case 85:
382
+ case 87:
373
383
  case "end":
374
384
  return _context.stop();
375
385
  }
@@ -431,40 +441,50 @@ var connect = exports.connect = function connect(mem) {
431
441
  id = _yield$ar$dataitem2.id;
432
442
  owner = _yield$ar$dataitem2.owner;
433
443
  item = _yield$ar$dataitem2.item;
434
- _context2.next = 16;
435
- return ar.postItem(item, _test.su.jwk);
436
- case 16:
437
- _context2.prev = 16;
444
+ if (!opt.message_item) {
445
+ _context2.next = 19;
446
+ break;
447
+ }
448
+ _context2.next = 17;
449
+ return ar.postItems([opt.message_item, item], _test.su.jwk);
450
+ case 17:
451
+ _context2.next = 21;
452
+ break;
453
+ case 19:
454
+ _context2.next = 21;
455
+ return ar.postItems(item, _test.su.jwk);
456
+ case 21:
457
+ _context2.prev = 21;
438
458
  data = (_opt$data2 = _opt.data) !== null && _opt$data2 !== void 0 ? _opt$data2 : "";
439
459
  _tags = _opt.tags;
440
460
  from = (_ref6 = (_opt$from = _opt.from) !== null && _opt$from !== void 0 ? _opt$from : opt.from) !== null && _ref6 !== void 0 ? _ref6 : owner;
441
461
  if (!_opt.item) {
442
- _context2.next = 37;
462
+ _context2.next = 42;
443
463
  break;
444
464
  }
445
- _context2.prev = 21;
465
+ _context2.prev = 26;
446
466
  data = _base64url["default"].decode(_opt.item.data);
447
467
  _tags = _opt.item.tags;
448
468
  if (from) {
449
- _context2.next = 32;
469
+ _context2.next = 37;
450
470
  break;
451
471
  }
452
472
  raw_owner = _opt.item.rawOwner;
453
473
  _context2.t0 = Buffer;
454
- _context2.next = 29;
474
+ _context2.next = 34;
455
475
  return _crypto["default"].subtle.digest("SHA-256", raw_owner);
456
- case 29:
476
+ case 34:
457
477
  _context2.t1 = _context2.sent;
458
478
  hashBuffer = _context2.t0.from.call(_context2.t0, _context2.t1);
459
479
  from = _base64url["default"].encode(hashBuffer);
460
- case 32:
461
- _context2.next = 37;
480
+ case 37:
481
+ _context2.next = 42;
462
482
  break;
463
- case 34:
464
- _context2.prev = 34;
465
- _context2.t2 = _context2["catch"](21);
483
+ case 39:
484
+ _context2.prev = 39;
485
+ _context2.t2 = _context2["catch"](26);
466
486
  console.log(_context2.t2);
467
- case 37:
487
+ case 42:
468
488
  // check: is owner=mu.addr right?
469
489
  msg = genMsg(opt.message, p, data, _tags, from, _test.mu.addr);
470
490
  _env = genEnv({
@@ -473,9 +493,9 @@ var connect = exports.connect = function connect(mem) {
473
493
  module: p.module,
474
494
  auth: _test.mu.addr
475
495
  });
476
- _context2.next = 41;
496
+ _context2.next = 46;
477
497
  return p.handle(p.memory, msg, _env);
478
- case 41:
498
+ case 46:
479
499
  res = _context2.sent;
480
500
  p.memory = res.Memory;
481
501
  delete res.Memory;
@@ -486,19 +506,19 @@ var connect = exports.connect = function connect(mem) {
486
506
  }, opt));
487
507
  mem.msgs[opt.message] = _opt;
488
508
  _iterator2 = _createForOfIteratorHelper((_res$Messages = res.Messages) !== null && _res$Messages !== void 0 ? _res$Messages : []);
489
- _context2.prev = 49;
509
+ _context2.prev = 54;
490
510
  _iterator2.s();
491
- case 51:
511
+ case 56:
492
512
  if ((_step2 = _iterator2.n()).done) {
493
- _context2.next = 58;
513
+ _context2.next = 63;
494
514
  break;
495
515
  }
496
516
  v = _step2.value;
497
517
  if (!mem.env[v.Target]) {
498
- _context2.next = 56;
518
+ _context2.next = 61;
499
519
  break;
500
520
  }
501
- _context2.next = 56;
521
+ _context2.next = 61;
502
522
  return message({
503
523
  process: v.Target,
504
524
  tags: v.Tags,
@@ -506,32 +526,32 @@ var connect = exports.connect = function connect(mem) {
506
526
  signer: _test.mu.signer,
507
527
  from: opt.process
508
528
  });
509
- case 56:
510
- _context2.next = 51;
529
+ case 61:
530
+ _context2.next = 56;
511
531
  break;
512
- case 58:
513
- _context2.next = 63;
532
+ case 63:
533
+ _context2.next = 68;
514
534
  break;
515
- case 60:
516
- _context2.prev = 60;
517
- _context2.t3 = _context2["catch"](49);
535
+ case 65:
536
+ _context2.prev = 65;
537
+ _context2.t3 = _context2["catch"](54);
518
538
  _iterator2.e(_context2.t3);
519
- case 63:
520
- _context2.prev = 63;
539
+ case 68:
540
+ _context2.prev = 68;
521
541
  _iterator2.f();
522
- return _context2.finish(63);
523
- case 66:
542
+ return _context2.finish(68);
543
+ case 71:
524
544
  _iterator3 = _createForOfIteratorHelper((_res$Spawns = res.Spawns) !== null && _res$Spawns !== void 0 ? _res$Spawns : []);
525
- _context2.prev = 67;
545
+ _context2.prev = 72;
526
546
  _iterator3.s();
527
- case 69:
547
+ case 74:
528
548
  if ((_step3 = _iterator3.n()).done) {
529
- _context2.next = 76;
549
+ _context2.next = 81;
530
550
  break;
531
551
  }
532
552
  _v = _step3.value;
533
553
  __tags = (0, _utils.tags)(_v.Tags);
534
- _context2.next = 74;
554
+ _context2.next = 79;
535
555
  return spawn({
536
556
  module: __tags.Module,
537
557
  scheduler: _test.scheduler,
@@ -540,87 +560,87 @@ var connect = exports.connect = function connect(mem) {
540
560
  from: __tags["From-Process"],
541
561
  signer: _test.mu.signer
542
562
  });
543
- case 74:
544
- _context2.next = 69;
563
+ case 79:
564
+ _context2.next = 74;
545
565
  break;
546
- case 76:
547
- _context2.next = 81;
566
+ case 81:
567
+ _context2.next = 86;
548
568
  break;
549
- case 78:
550
- _context2.prev = 78;
551
- _context2.t4 = _context2["catch"](67);
569
+ case 83:
570
+ _context2.prev = 83;
571
+ _context2.t4 = _context2["catch"](72);
552
572
  _iterator3.e(_context2.t4);
553
- case 81:
554
- _context2.prev = 81;
573
+ case 86:
574
+ _context2.prev = 86;
555
575
  _iterator3.f();
556
- return _context2.finish(81);
557
- case 84:
576
+ return _context2.finish(86);
577
+ case 89:
558
578
  _iterator4 = _createForOfIteratorHelper((_res$Assignments = res.Assignments) !== null && _res$Assignments !== void 0 ? _res$Assignments : []);
559
- _context2.prev = 85;
579
+ _context2.prev = 90;
560
580
  _iterator4.s();
561
- case 87:
581
+ case 92:
562
582
  if ((_step4 = _iterator4.n()).done) {
563
- _context2.next = 108;
583
+ _context2.next = 113;
564
584
  break;
565
585
  }
566
586
  _v2 = _step4.value;
567
587
  _iterator5 = _createForOfIteratorHelper(_v2.Processes);
568
- _context2.prev = 90;
588
+ _context2.prev = 95;
569
589
  _iterator5.s();
570
- case 92:
590
+ case 97:
571
591
  if ((_step5 = _iterator5.n()).done) {
572
- _context2.next = 98;
592
+ _context2.next = 103;
573
593
  break;
574
594
  }
575
595
  v2 = _step5.value;
576
- _context2.next = 96;
596
+ _context2.next = 101;
577
597
  return _assign({
578
598
  message: _v2.Message,
579
599
  process: v2,
580
600
  from: opt.process,
581
601
  signer: _test.mu.signer
582
602
  });
583
- case 96:
584
- _context2.next = 92;
603
+ case 101:
604
+ _context2.next = 97;
585
605
  break;
586
- case 98:
587
- _context2.next = 103;
606
+ case 103:
607
+ _context2.next = 108;
588
608
  break;
589
- case 100:
590
- _context2.prev = 100;
591
- _context2.t5 = _context2["catch"](90);
609
+ case 105:
610
+ _context2.prev = 105;
611
+ _context2.t5 = _context2["catch"](95);
592
612
  _iterator5.e(_context2.t5);
593
- case 103:
594
- _context2.prev = 103;
613
+ case 108:
614
+ _context2.prev = 108;
595
615
  _iterator5.f();
596
- return _context2.finish(103);
597
- case 106:
598
- _context2.next = 87;
616
+ return _context2.finish(108);
617
+ case 111:
618
+ _context2.next = 92;
599
619
  break;
600
- case 108:
601
- _context2.next = 113;
620
+ case 113:
621
+ _context2.next = 118;
602
622
  break;
603
- case 110:
604
- _context2.prev = 110;
605
- _context2.t6 = _context2["catch"](85);
623
+ case 115:
624
+ _context2.prev = 115;
625
+ _context2.t6 = _context2["catch"](90);
606
626
  _iterator4.e(_context2.t6);
607
- case 113:
608
- _context2.prev = 113;
627
+ case 118:
628
+ _context2.prev = 118;
609
629
  _iterator4.f();
610
- return _context2.finish(113);
611
- case 116:
630
+ return _context2.finish(118);
631
+ case 121:
612
632
  return _context2.abrupt("return", id);
613
- case 119:
614
- _context2.prev = 119;
615
- _context2.t7 = _context2["catch"](16);
633
+ case 124:
634
+ _context2.prev = 124;
635
+ _context2.t7 = _context2["catch"](21);
616
636
  console.log(_context2.t7);
617
- case 122:
637
+ case 127:
618
638
  return _context2.abrupt("return", null);
619
- case 123:
639
+ case 128:
620
640
  case "end":
621
641
  return _context2.stop();
622
642
  }
623
- }, _callee2, null, [[16, 119], [21, 34], [49, 60, 63, 66], [67, 78, 81, 84], [85, 110, 113, 116], [90, 100, 103, 106]]);
643
+ }, _callee2, null, [[21, 124], [26, 39], [54, 65, 68, 71], [72, 83, 86, 89], [90, 115, 118, 121], [95, 105, 108, 111]]);
624
644
  }));
625
645
  return function assign(_x) {
626
646
  return _ref5.apply(this, arguments);
@@ -678,20 +698,18 @@ var connect = exports.connect = function connect(mem) {
678
698
  id = _yield$ar$dataitem3.id;
679
699
  owner = _yield$ar$dataitem3.owner;
680
700
  case 17:
681
- _context3.next = 19;
682
- return ar.postItem(item, _test.su.jwk);
683
- case 19:
684
701
  mem.msgs[id] = opt;
685
- _context3.next = 22;
702
+ _context3.next = 20;
686
703
  return _assign({
704
+ message_item: item,
687
705
  message: id,
688
706
  process: opt.process,
689
707
  from: owner,
690
708
  signer: _test.mu.signer
691
709
  });
692
- case 22:
710
+ case 20:
693
711
  return _context3.abrupt("return", id);
694
- case 23:
712
+ case 21:
695
713
  case "end":
696
714
  return _context3.stop();
697
715
  }
@@ -884,12 +902,11 @@ var connect = exports.connect = function connect(mem) {
884
902
  case 12:
885
903
  _context9.prev = 12;
886
904
  cloneMemory = function cloneMemory(memory) {
887
- var buffer = memory.buffer.slice(0); // Clone the ArrayBuffer
905
+ var buffer = memory.buffer.slice(0);
888
906
  return new WebAssembly.Memory({
889
907
  initial: memory.buffer.byteLength / 65536,
890
- // Memory size in pages (64KB per page)
891
908
  maximum: memory.maximum || undefined,
892
- shared: memory.shared || false // Retain sharing if applicable
909
+ shared: memory.shared || false
893
910
  });
894
911
  };
895
912
  msg = genMsg(id, p, (_opt$data3 = opt.data) !== null && _opt$data3 !== void 0 ? _opt$data3 : "", opt.tags, owner, _test.mu.addr, true);
package/cjs/ar.js CHANGED
@@ -830,22 +830,30 @@ var AR = /*#__PURE__*/function () {
830
830
  key: "data",
831
831
  value: function () {
832
832
  var _data2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee14(txid) {
833
- var string,
833
+ var _string,
834
+ decode,
835
+ string,
834
836
  _data,
835
837
  _args14 = arguments;
836
838
  return _regeneratorRuntime().wrap(function _callee14$(_context14) {
837
839
  while (1) switch (_context14.prev = _context14.next) {
838
840
  case 0:
839
- string = _args14.length > 1 && _args14[1] !== undefined ? _args14[1] : false;
840
- _context14.next = 3;
841
+ _string = _args14.length > 1 && _args14[1] !== undefined ? _args14[1] : false;
842
+ decode = true;
843
+ string = _string;
844
+ if ((0, _ramda.is)(Object, _string)) {
845
+ if (!(0, _ramda.isNil)(_string.decode)) decode = _string.decode;
846
+ if (!(0, _ramda.isNil)(_string.string)) string = _string.string;
847
+ }
848
+ _context14.next = 6;
841
849
  return this.arweave.transactions.getData(txid, {
842
- decode: true,
850
+ decode: decode,
843
851
  string: string
844
852
  });
845
- case 3:
853
+ case 6:
846
854
  _data = _context14.sent;
847
855
  return _context14.abrupt("return", _data);
848
- case 5:
856
+ case 8:
849
857
  case "end":
850
858
  return _context14.stop();
851
859
  }
package/cjs/armem.js CHANGED
@@ -74,7 +74,8 @@ var ArMem = exports["default"] = /*#__PURE__*/function () {
74
74
  "Input-Encoding": "JSON-V1",
75
75
  "Output-Encoding": "JSON-V1",
76
76
  "Memory-Limit": "1-gb",
77
- "Compute-Limit": "9000000000000"
77
+ "Compute-Limit": "9000000000000",
78
+ Extension: "WeaveDrive"
78
79
  })
79
80
  };
80
81
  }