@dashkite/joy 0.3.16 → 0.5.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.
@@ -1,48 +1,144 @@
1
1
  "use strict";
2
-
3
2
  Object.defineProperty(exports, "__esModule", {
4
- value: true
3
+ value: true
5
4
  });
6
- exports.timer = exports.sleep = exports.milliseconds = exports.benchmark = void 0;
7
-
8
- var _function = require("./function.js");
9
-
10
- var benchmark, milliseconds, sleep, timer;
11
- exports.timer = timer;
12
- exports.sleep = sleep;
13
- exports.milliseconds = milliseconds;
14
- exports.benchmark = benchmark;
15
- exports.timer = timer = (0, _function.curry)(function (interval, action) {
16
- var id;
17
- id = setTimeout(action, interval);
18
- return function () {
19
- return clearTimeout(id);
20
- };
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ benchmark: function() {
13
+ return benchmark;
14
+ },
15
+ debounce: function() {
16
+ return debounce;
17
+ },
18
+ default: function() {
19
+ return _default //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiL0BkYXNoa2l0ZS9qb3kvc3JjL3RpbWUuY29mZmVlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLElBQUEsU0FBQSxFQUFBLFFBQUEsRUFBQSxNQUFBLEVBQUEsS0FBQSxFQUFBLE9BQUEsRUFBQSxZQUFBLEVBQUEsS0FBQSxFQUFBOztBQUFBLE9BQUE7RUFBUSxLQUFSO0NBQUEsTUFBQTs7QUFFQSxLQUFBLEdBQVEsS0FBQSxDQUFNLFFBQUEsQ0FBQyxRQUFELEVBQVcsTUFBWCxDQUFBO0FBQ2QsTUFBQTtFQUFFLEVBQUEsR0FBSyxVQUFBLENBQVcsTUFBWCxFQUFtQixRQUFuQjtTQUNMLFFBQUEsQ0FBQSxDQUFBO1dBQUcsWUFBQSxDQUFjLEVBQWQ7RUFBSDtBQUZZLENBQU47O0FBSVIsS0FBQSxHQUFRLFFBQUEsQ0FBQyxRQUFELENBQUE7U0FDTixJQUFJLE9BQUosQ0FBWSxRQUFBLENBQUMsT0FBRCxDQUFBO1dBQWEsVUFBQSxDQUFXLE9BQVgsRUFBb0IsUUFBcEI7RUFBYixDQUFaO0FBRE07O0FBR1IsWUFBQSxHQUNLLDBEQUFILEdBQ0UsUUFBQSxDQUFBLENBQUE7U0FBRyxXQUFXLENBQUMsR0FBWixDQUFBO0FBQUgsQ0FERixHQUdFLFFBQUEsQ0FBQSxDQUFBO1NBQUcsSUFBSSxDQUFDLEdBQUwsQ0FBQTtBQUFIOztBQUVKLFNBQUEsR0FBWSxNQUFBLFFBQUEsQ0FBRSxJQUFGLENBQUE7U0FDVixDQUFFLENBQUEsTUFBTSxPQUFBLENBQVEsV0FBUixFQUFxQixJQUFyQixDQUFOLENBQUYsQ0FDRSxDQUFDO0FBRk87O0FBSVosT0FBQSxHQUFVLFFBQUEsQ0FBRSxJQUFGLEVBQVEsSUFBUixDQUFBO1NBQ0wsQ0FBQSxRQUFBLENBQUMsQ0FBRSxNQUFGLEVBQVUsT0FBVixFQUFtQixNQUFuQixDQUFELENBQUE7SUFDRCxXQUFXLENBQUMsSUFBWixDQUFpQixDQUFBLENBQUEsQ0FBSSxJQUFKLENBQUEsTUFBQSxDQUFqQjtJQUNBLE1BQUEsR0FBUyxRQUFBLENBQUEsQ0FBQTtNQUNQLFdBQVcsQ0FBQyxJQUFaLENBQWlCLENBQUEsQ0FBQSxDQUFJLElBQUosQ0FBQSxPQUFBLENBQWpCO01BQ0EsT0FBQSxHQUFVLFdBQVcsQ0FBQyxPQUFaLENBQW9CLENBQUEsQ0FBQSxDQUFJLElBQUosQ0FBQSxDQUFwQixFQUNSLENBQUEsQ0FBQSxDQUFJLElBQUosQ0FBQSxNQUFBLENBRFEsRUFDVyxDQUFBLENBQUEsQ0FBSSxJQUFKLENBQUEsT0FBQSxDQURYO2FBRVY7SUFKTztJQUtULE1BQUEsR0FBUyxJQUFBLENBQUE7SUFDVCxJQUFHLG1CQUFIO2FBQXVCLE1BQU0sQ0FBQyxJQUFQLENBQVksTUFBWixFQUF2QjtLQUFBLE1BQUE7YUFBaUQsTUFBQSxDQUFBLEVBQWpEOztFQVJDLENBQUEsRUFBK0IsQ0FBQTtBQUQxQjs7QUFXVixRQUFBLEdBQWMsQ0FBQSxRQUFBLENBQUUsSUFBRixDQUFBO1NBQ1osUUFBQSxDQUFFLFFBQUYsRUFBWSxDQUFaLENBQUE7V0FBbUIsUUFBQSxDQUFBLENBQUE7QUFDckIsVUFBQTtNQUFJLEdBQUEsR0FBTSxJQUFJLENBQUMsR0FBTCxDQUFBO01BQ04sSUFBRyxDQUFFLEdBQUEsR0FBTSxJQUFSLENBQUEsR0FBaUIsUUFBcEI7UUFDRSxJQUFBLEdBQU87ZUFDSixJQUZMOztJQUZpQjtFQUFuQjtBQURZLENBQUEsRUFBUyxHQTlCdkI7OztBQXdDQSxLQUFBLEdBQVEsUUFBQSxDQUFBLENBQUE7U0FDTixJQUFJLE9BQUosQ0FBWSxRQUFBLENBQUUsT0FBRixDQUFBO1dBQ1YsY0FBQSxDQUFlLE9BQWY7RUFEVSxDQUFaO0FBRE0sRUF4Q1I7Ozs7QUE4Q0EsTUFBQSxHQUFTLFFBQUEsQ0FBQSxDQUFBO0FBQ1QsTUFBQTtFQUFFLElBQUEsR0FBTztTQUNKLENBQUEsUUFBQSxDQUFDLENBQUUsT0FBRixFQUFXLFNBQVgsRUFBc0IsS0FBdEIsRUFBNkIsTUFBN0IsRUFBcUMsSUFBckMsQ0FBRCxDQUFBO0lBRUQsQ0FBRSxPQUFGLEVBQVcsU0FBWCxDQUFBO0FBQXlCLGNBQU8sSUFBSSxDQUFDLE1BQVo7QUFBQSxhQUNsQixDQURrQjtpQkFDWCxDQUFDLENBQUEsQ0FBRCxFQUFLLEdBQUEsSUFBTDtBQURXLGFBRWxCLENBRmtCO2lCQUVYO0FBRlc7VUFHbEIsTUFBTSxJQUFJLEtBQUosQ0FBVSwyQkFBVjtBQUhZOzs7TUFLekIsT0FBTyxDQUFDLFVBQVc7O0lBQ25CLEtBQUEsR0FBUSxJQUFJLENBQUMsR0FBTCxDQUFBO0lBRVIsSUFBQSxHQUFPLFFBQUEsQ0FBQSxDQUFBO2FBQ0wsQ0FBRSxNQUFBLEdBQVMsU0FBQSxDQUFBLENBQVgsQ0FBQSxJQUNFLENBQUMsQ0FBRSxJQUFJLENBQUMsR0FBTCxDQUFBLENBQUEsR0FBYSxLQUFmLENBQUEsR0FBeUIsT0FBTyxDQUFDLE9BQWxDO0lBRkc7SUFJUCxNQUFBLEdBQVM7V0FFVCxJQUFJLE9BQUosQ0FBWSxNQUFBLFFBQUEsQ0FBRSxPQUFGLENBQUE7QUFDVixhQUF1QixDQUFDLElBQUEsQ0FBQSxDQUF4QjtRQUFFLENBQUEsTUFBTSxLQUFBLENBQU0sQ0FBTixDQUFOO01BQUY7YUFDQSxPQUFBLENBQVEsTUFBUjtJQUZVLENBQVo7RUFoQkMsQ0FBQSxFQUErQyxDQUFBO0FBRjNDOztBQXNCVCxPQUFBO0VBQ0UsS0FERjtFQUVFLEtBRkY7RUFHRSxZQUhGO0VBSUUsU0FKRjtFQUtFLE9BTEY7RUFNRSxRQU5GO0VBT0UsS0FQRjtFQVFFLE1BUkY7OztBQVdBLE9BQUEsUUFBZSxDQUNiLEtBRGEsRUFFYixLQUZhLEVBR2IsWUFIYSxFQUliLFNBSmEsRUFLYixPQUxhLEVBTWIsUUFOYSxFQU9iLEtBUGEsRUFRYixNQVJhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjdXJyeX0gZnJvbSBcIi4vZnVuY3Rpb25cIlxuXG50aW1lciA9IGN1cnJ5IChpbnRlcnZhbCwgYWN0aW9uKSAtPlxuICBpZCA9IHNldFRpbWVvdXQoYWN0aW9uLCBpbnRlcnZhbClcbiAgLT4gY2xlYXJUaW1lb3V0KCBpZCApXG5cbnNsZWVwID0gKGludGVydmFsKSAtPlxuICBuZXcgUHJvbWlzZSAocmVzb2x2ZSkgLT4gc2V0VGltZW91dCByZXNvbHZlLCBpbnRlcnZhbFxuXG5taWxsaXNlY29uZHMgPVxuICBpZiBwZXJmb3JtYW5jZT9cbiAgICAtPiBwZXJmb3JtYW5jZS5ub3coKVxuICBlbHNlXG4gICAgLT4gRGF0ZS5ub3coKVxuXG5iZW5jaG1hcmsgPSAoIHRhc2sgKSAtPlxuICAoIGF3YWl0IG1lYXN1cmUgXCJhbm9ueW1vdXNcIiwgdGFzayApXG4gICAgLmR1cmF0aW9uXG5cbm1lYXN1cmUgPSAoIG5hbWUsIHRhc2sgKSAtPlxuICBkbyAoeyBmaW5pc2gsIG1lYXN1cmUsIHJlc3VsdCB9ID0ge30pIC0+XG4gICAgcGVyZm9ybWFuY2UubWFyayBcIiN7IG5hbWUgfS1zdGFydFwiXG4gICAgZmluaXNoID0gLT5cbiAgICAgIHBlcmZvcm1hbmNlLm1hcmsgXCIjeyBuYW1lIH0tZmluaXNoXCJcbiAgICAgIG1lYXN1cmUgPSBwZXJmb3JtYW5jZS5tZWFzdXJlIFwiI3sgbmFtZSB9XCIsIFxuICAgICAgICBcIiN7IG5hbWUgfS1zdGFydFwiLCBcIiN7IG5hbWUgfS1maW5pc2hcIlxuICAgICAgbWVhc3VyZVxuICAgIHJlc3VsdCA9IHRhc2soKVxuICAgIGlmIHJlc3VsdC50aGVuPyB0aGVuICggcmVzdWx0LnRoZW4gZmluaXNoICkgZWxzZSBmaW5pc2goKVxuXG5kZWJvdW5jZSA9IGRvICggbGFzdCA9IDAgKSAtPlxuICAoIGludGVydmFsLCBmICkgLT4gLT5cbiAgICBub3cgPSBEYXRlLm5vdygpXG4gICAgaWYgKCBub3cgLSBsYXN0ICkgPiBpbnRlcnZhbFxuICAgICAgbGFzdCA9IG5vd1xuICAgICAgZG8gZlxuXG5cbiMgZnJvbSBXYXlsYW5kXG5cbmZyYW1lID0gLT5cbiAgbmV3IFByb21pc2UgKCByZXNvbHZlICkgLT5cbiAgICBxdWV1ZU1pY3JvdGFzayByZXNvbHZlXG5cbiMgd2UncmUgZm9yY2VkIHRvIHVzZSBEYXRlLm5vdyBiZWxvd1xuIyBiZWNhdXNlIE5vZGUgZG9lc24ndCBpbmNsdWRlIGl0IGFzIGEgZ2xvYmFsXG5leHBlY3QgPSAtPlxuICBhcmdzID0gYXJndW1lbnRzXG4gIGRvICh7IG9wdGlvbnMsIHByZWRpY2F0ZSwgc3RhcnQsIHJlc3VsdCwgZG9uZSB9ID0ge30pIC0+XG5cbiAgICBbIG9wdGlvbnMsIHByZWRpY2F0ZSBdID0gc3dpdGNoIGFyZ3MubGVuZ3RoXG4gICAgICB3aGVuIDEgdGhlbiBbe30sIGFyZ3MuLi4gXVxuICAgICAgd2hlbiAyIHRoZW4gYXJnc1xuICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IgXCJleHBlY3Q6IGludmFsaWQgYXJndW1lbnRzXCJcblxuICAgIG9wdGlvbnMudGltZW91dCA/PSAxMDAwXG4gICAgc3RhcnQgPSBEYXRlLm5vdygpXG5cbiAgICBkb25lID0gLT5cbiAgICAgICggcmVzdWx0ID0gcHJlZGljYXRlKCkpIHx8XG4gICAgICAgICgoIERhdGUubm93KCkgLSBzdGFydCApID4gb3B0aW9ucy50aW1lb3V0IClcblxuICAgIHJlc3VsdCA9IGZhbHNlXG5cbiAgICBuZXcgUHJvbWlzZSAoIHJlc29sdmUgKSAtPlxuICAgICAgKCBhd2FpdCBzbGVlcCAxKSB3aGlsZSAhZG9uZSgpXG4gICAgICByZXNvbHZlIHJlc3VsdFxuXG5leHBvcnQge1xuICBzbGVlcFxuICB0aW1lclxuICBtaWxsaXNlY29uZHNcbiAgYmVuY2htYXJrXG4gIG1lYXN1cmVcbiAgZGVib3VuY2VcbiAgZnJhbWVcbiAgZXhwZWN0XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc2xlZXBcbiAgdGltZXJcbiAgbWlsbGlzZWNvbmRzXG4gIGJlbmNobWFya1xuICBtZWFzdXJlXG4gIGRlYm91bmNlXG4gIGZyYW1lXG4gIGV4cGVjdFxufVxuIl19
20
+ //# sourceURL=/@dashkite/joy/src/time.coffee
21
+ ;
22
+ },
23
+ expect: function() {
24
+ return expect;
25
+ },
26
+ frame: function() {
27
+ return frame;
28
+ },
29
+ measure: function() {
30
+ return measure;
31
+ },
32
+ milliseconds: function() {
33
+ return milliseconds;
34
+ },
35
+ sleep: function() {
36
+ return sleep;
37
+ },
38
+ timer: function() {
39
+ return timer;
40
+ }
21
41
  });
22
-
23
- exports.sleep = sleep = function (interval) {
24
- return new Promise(function (resolve) {
25
- return setTimeout(resolve, interval);
26
- });
42
+ const _function = require("./function");
43
+ var benchmark, debounce, expect, frame, measure, milliseconds, sleep, timer;
44
+ timer = (0, _function.curry)(function(interval, action) {
45
+ var id;
46
+ id = setTimeout(action, interval);
47
+ return function() {
48
+ return clearTimeout(id);
49
+ };
50
+ });
51
+ sleep = function(interval) {
52
+ return new Promise(function(resolve) {
53
+ return setTimeout(resolve, interval);
54
+ });
27
55
  };
28
-
29
- exports.milliseconds = milliseconds = typeof performance !== "undefined" && performance !== null ? function () {
30
- return performance.now();
31
- } : function () {
32
- return Date.now();
56
+ milliseconds = typeof performance !== "undefined" && performance !== null ? function() {
57
+ return performance.now();
58
+ } : function() {
59
+ return Date.now();
33
60
  };
34
-
35
- exports.benchmark = benchmark = function (f) {
36
- var r, ref, start;
37
- start = milliseconds();
38
-
39
- if (((ref = r = f()) != null ? ref.then : void 0) != null) {
40
- return r.then(function () {
41
- return milliseconds() - start;
61
+ benchmark = async function(task) {
62
+ return (await measure("anonymous", task)).duration;
63
+ };
64
+ measure = function(name, task) {
65
+ return function({ finish, measure, result }) {
66
+ performance.mark(`${name}-start`);
67
+ finish = function() {
68
+ performance.mark(`${name}-finish`);
69
+ measure = performance.measure(`${name}`, `${name}-start`, `${name}-finish`);
70
+ return measure;
71
+ };
72
+ result = task();
73
+ if (result.then != null) {
74
+ return result.then(finish);
75
+ } else {
76
+ return finish();
77
+ }
78
+ }({});
79
+ };
80
+ debounce = function(last) {
81
+ return function(interval, f) {
82
+ return function() {
83
+ var now;
84
+ now = Date.now();
85
+ if (now - last > interval) {
86
+ last = now;
87
+ return f();
88
+ }
89
+ };
90
+ };
91
+ }(0);
92
+ // from Wayland
93
+ frame = function() {
94
+ return new Promise(function(resolve) {
95
+ return queueMicrotask(resolve);
42
96
  });
43
- } else {
44
- return milliseconds() - start;
45
- }
46
97
  };
47
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy90aW1lLmNvZmZlZSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxJQUFBLFNBQUEsRUFBQSxZQUFBLEVBQUEsS0FBQSxFQUFBLEtBQUE7Ozs7O0FBRUEsZ0JBQUEsS0FBQSxHQUFRLHFCQUFNLFVBQUEsUUFBQSxFQUFBLE1BQUEsRUFBQTtBQUNkLE1BQUEsRUFBQTtBQUFFLEVBQUEsRUFBQSxHQUFLLFVBQUEsQ0FBQSxNQUFBLEVBQUEsUUFBQSxDQUFMO1NBQ0EsWUFBQTtXQUFHLFlBQUEsQ0FBQSxFQUFBLEM7QUFBSCxHO0FBRk0sQ0FBQSxDQUFSOztBQUlBLGdCQUFBLEtBQUEsR0FBUSxVQUFBLFFBQUEsRUFBQTtTQUNOLElBQUEsT0FBQSxDQUFZLFVBQUEsT0FBQSxFQUFBO1dBQWEsVUFBQSxDQUFBLE9BQUEsRUFBQSxRQUFBLEM7QUFBekIsR0FBQSxDO0FBRE0sQ0FBUjs7QUFJQSx1QkFBQSxZQUFBLEdBQ0ssT0FBQSxXQUFBLEtBQUEsV0FBQSxJQUFBLFdBQUEsS0FBSCxJQUFHLEdBQ0QsWUFBQTtTQUFHLFdBQVcsQ0FBWCxHQUFBLEU7QUFETCxDQUFHLEdBR0QsWUFBQTtTQUFHLElBQUksQ0FBSixHQUFBLEU7QUFBSCxDQUpKOztBQU1BLG9CQUFBLFNBQUEsR0FBWSxVQUFBLENBQUEsRUFBQTtBQUNaLE1BQUEsQ0FBQSxFQUFBLEdBQUEsRUFBQSxLQUFBO0FBQUUsRUFBQSxLQUFBLEdBQVEsWUFBQSxFQUFSOztBQUNBLE1BQUcsQ0FBQSxDQUFBLEdBQUEsR0FBQSxDQUFBLEdBQUEsQ0FBQSxFQUFBLEtBQUEsSUFBQSxHQUFBLEdBQUEsQ0FBQSxJQUFBLEdBQUEsS0FBQSxDQUFBLEtBQUgsSUFBQSxFQUFBO1dBQ0UsQ0FBQyxDQUFELElBQUEsQ0FBTyxZQUFBO2FBQUcsWUFBQSxLQUFpQixLO0FBRDdCLEtBQ0UsQztBQURGLEdBQUEsTUFBQTtXQUdFLFlBQUEsS0FIRixLOztBQUZVLENBQVoiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2N1cnJ5fSBmcm9tIFwiLi9mdW5jdGlvblwiXG5cbnRpbWVyID0gY3VycnkgKGludGVydmFsLCBhY3Rpb24pIC0+XG4gIGlkID0gc2V0VGltZW91dChhY3Rpb24sIGludGVydmFsKVxuICAtPiBjbGVhclRpbWVvdXQoIGlkIClcblxuc2xlZXAgPSAoaW50ZXJ2YWwpIC0+XG4gIG5ldyBQcm9taXNlIChyZXNvbHZlKSAtPiBzZXRUaW1lb3V0IHJlc29sdmUsIGludGVydmFsXG5cblxubWlsbGlzZWNvbmRzID1cbiAgaWYgcGVyZm9ybWFuY2U/XG4gICAgLT4gcGVyZm9ybWFuY2Uubm93KClcbiAgZWxzZVxuICAgIC0+IERhdGUubm93KClcblxuYmVuY2htYXJrID0gKGYpIC0+XG4gIHN0YXJ0ID0gbWlsbGlzZWNvbmRzKClcbiAgaWYgKHIgPSBmKCkpPy50aGVuP1xuICAgIHIudGhlbiAtPiBtaWxsaXNlY29uZHMoKSAtIHN0YXJ0XG4gIGVsc2VcbiAgICBtaWxsaXNlY29uZHMoKSAtIHN0YXJ0XG5cbmV4cG9ydCB7XG4gIHNsZWVwXG4gIHRpbWVyXG4gIG1pbGxpc2Vjb25kc1xuICBiZW5jaG1hcmtcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=
48
- //# sourceURL=src/time.coffee
98
+ // we're forced to use Date.now below
99
+ // because Node doesn't include it as a global
100
+ expect = function() {
101
+ var args;
102
+ args = arguments;
103
+ return function({ options, predicate, start, result, done }) {
104
+ [options, predicate] = function() {
105
+ switch(args.length){
106
+ case 1:
107
+ return [
108
+ {},
109
+ ...args
110
+ ];
111
+ case 2:
112
+ return args;
113
+ default:
114
+ throw new Error("expect: invalid arguments");
115
+ }
116
+ }();
117
+ if (options.timeout == null) {
118
+ options.timeout = 1000;
119
+ }
120
+ start = Date.now();
121
+ done = function() {
122
+ return (result = predicate()) || Date.now() - start > options.timeout;
123
+ };
124
+ result = false;
125
+ return new Promise(async function(resolve) {
126
+ while(!done()){
127
+ await sleep(1);
128
+ }
129
+ return resolve(result);
130
+ });
131
+ }({});
132
+ };
133
+ const _default = {
134
+ sleep,
135
+ timer,
136
+ milliseconds,
137
+ benchmark,
138
+ measure,
139
+ debounce,
140
+ frame,
141
+ expect
142
+ };
143
+
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlcyI6WyIvQGRhc2hraXRlL2pveS9zcmMvdGltZS5jb2ZmZWUiXSwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3Vycnl9IGZyb20gXCIuL2Z1bmN0aW9uXCJcblxudGltZXIgPSBjdXJyeSAoaW50ZXJ2YWwsIGFjdGlvbikgLT5cbiAgaWQgPSBzZXRUaW1lb3V0KGFjdGlvbiwgaW50ZXJ2YWwpXG4gIC0+IGNsZWFyVGltZW91dCggaWQgKVxuXG5zbGVlcCA9IChpbnRlcnZhbCkgLT5cbiAgbmV3IFByb21pc2UgKHJlc29sdmUpIC0+IHNldFRpbWVvdXQgcmVzb2x2ZSwgaW50ZXJ2YWxcblxubWlsbGlzZWNvbmRzID1cbiAgaWYgcGVyZm9ybWFuY2U/XG4gICAgLT4gcGVyZm9ybWFuY2Uubm93KClcbiAgZWxzZVxuICAgIC0+IERhdGUubm93KClcblxuYmVuY2htYXJrID0gKCB0YXNrICkgLT5cbiAgKCBhd2FpdCBtZWFzdXJlIFwiYW5vbnltb3VzXCIsIHRhc2sgKVxuICAgIC5kdXJhdGlvblxuXG5tZWFzdXJlID0gKCBuYW1lLCB0YXNrICkgLT5cbiAgZG8gKHsgZmluaXNoLCBtZWFzdXJlLCByZXN1bHQgfSA9IHt9KSAtPlxuICAgIHBlcmZvcm1hbmNlLm1hcmsgXCIjeyBuYW1lIH0tc3RhcnRcIlxuICAgIGZpbmlzaCA9IC0+XG4gICAgICBwZXJmb3JtYW5jZS5tYXJrIFwiI3sgbmFtZSB9LWZpbmlzaFwiXG4gICAgICBtZWFzdXJlID0gcGVyZm9ybWFuY2UubWVhc3VyZSBcIiN7IG5hbWUgfVwiLCBcbiAgICAgICAgXCIjeyBuYW1lIH0tc3RhcnRcIiwgXCIjeyBuYW1lIH0tZmluaXNoXCJcbiAgICAgIG1lYXN1cmVcbiAgICByZXN1bHQgPSB0YXNrKClcbiAgICBpZiByZXN1bHQudGhlbj8gdGhlbiAoIHJlc3VsdC50aGVuIGZpbmlzaCApIGVsc2UgZmluaXNoKClcblxuZGVib3VuY2UgPSBkbyAoIGxhc3QgPSAwICkgLT5cbiAgKCBpbnRlcnZhbCwgZiApIC0+IC0+XG4gICAgbm93ID0gRGF0ZS5ub3coKVxuICAgIGlmICggbm93IC0gbGFzdCApID4gaW50ZXJ2YWxcbiAgICAgIGxhc3QgPSBub3dcbiAgICAgIGRvIGZcblxuXG4jIGZyb20gV2F5bGFuZFxuXG5mcmFtZSA9IC0+XG4gIG5ldyBQcm9taXNlICggcmVzb2x2ZSApIC0+XG4gICAgcXVldWVNaWNyb3Rhc2sgcmVzb2x2ZVxuXG4jIHdlJ3JlIGZvcmNlZCB0byB1c2UgRGF0ZS5ub3cgYmVsb3dcbiMgYmVjYXVzZSBOb2RlIGRvZXNuJ3QgaW5jbHVkZSBpdCBhcyBhIGdsb2JhbFxuZXhwZWN0ID0gLT5cbiAgYXJncyA9IGFyZ3VtZW50c1xuICBkbyAoeyBvcHRpb25zLCBwcmVkaWNhdGUsIHN0YXJ0LCByZXN1bHQsIGRvbmUgfSA9IHt9KSAtPlxuXG4gICAgWyBvcHRpb25zLCBwcmVkaWNhdGUgXSA9IHN3aXRjaCBhcmdzLmxlbmd0aFxuICAgICAgd2hlbiAxIHRoZW4gW3t9LCBhcmdzLi4uIF1cbiAgICAgIHdoZW4gMiB0aGVuIGFyZ3NcbiAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yIFwiZXhwZWN0OiBpbnZhbGlkIGFyZ3VtZW50c1wiXG5cbiAgICBvcHRpb25zLnRpbWVvdXQgPz0gMTAwMFxuICAgIHN0YXJ0ID0gRGF0ZS5ub3coKVxuXG4gICAgZG9uZSA9IC0+XG4gICAgICAoIHJlc3VsdCA9IHByZWRpY2F0ZSgpKSB8fFxuICAgICAgICAoKCBEYXRlLm5vdygpIC0gc3RhcnQgKSA+IG9wdGlvbnMudGltZW91dCApXG5cbiAgICByZXN1bHQgPSBmYWxzZVxuXG4gICAgbmV3IFByb21pc2UgKCByZXNvbHZlICkgLT5cbiAgICAgICggYXdhaXQgc2xlZXAgMSkgd2hpbGUgIWRvbmUoKVxuICAgICAgcmVzb2x2ZSByZXN1bHRcblxuZXhwb3J0IHtcbiAgc2xlZXBcbiAgdGltZXJcbiAgbWlsbGlzZWNvbmRzXG4gIGJlbmNobWFya1xuICBtZWFzdXJlXG4gIGRlYm91bmNlXG4gIGZyYW1lXG4gIGV4cGVjdFxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNsZWVwXG4gIHRpbWVyXG4gIG1pbGxpc2Vjb25kc1xuICBiZW5jaG1hcmtcbiAgbWVhc3VyZVxuICBkZWJvdW5jZVxuICBmcmFtZVxuICBleHBlY3Rcbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztJQXdFRSxTQUpGOzs7WUFBQTtlQU1FOztXQUthOzs7OztVQVhmO2VBUUU7O1NBUkY7ZUFPRTs7V0FQRjtlQUtFOztnQkFMRjtlQUdFOztTQUhGO2VBQ0U7O1NBREY7ZUFFRTs7OzBCQXRFRjtBQUFBLElBQUEsU0FBQSxFQUFBLFFBQUEsRUFBQSxNQUFBLEVBQUEsS0FBQSxFQUFBLE9BQUEsRUFBQSxZQUFBLEVBQUEsS0FBQSxFQUFBO0FBRUEsS0FBQSxPQUFRLGVBQUEsRUFBTSxRQUFBLENBQUMsUUFBRCxFQUFXLE1BQVgsQ0FBQTtJQUNkLElBQUE7SUFBRSxFQUFBLEdBQUssVUFBQSxDQUFXLE1BQVgsRUFBbUIsUUFBbkI7V0FDTCxRQUFBLENBQUEsQ0FBQTtlQUFHLFlBQUEsQ0FBYyxFQUFkO0lBQUg7QUFGWSxDQUFOO0FBSVIsS0FBQSxHQUFRLFFBQUEsQ0FBQyxRQUFELENBQUE7V0FDTixJQUFJLE9BQUosQ0FBWSxRQUFBLENBQUMsT0FBRCxDQUFBO2VBQWEsVUFBQSxDQUFXLE9BQVgsRUFBb0IsUUFBcEI7SUFBYixDQUFaO0FBRE07QUFHUixZQUFBLEdBQ0ssT0FBQSxnQkFBQSxlQUFBLGdCQUFBLElBQUgsR0FDRSxRQUFBLENBQUEsQ0FBQTtXQUFHLFdBQVcsQ0FBQyxHQUFaLENBQUE7QUFBSCxDQURGLEdBR0UsUUFBQSxDQUFBLENBQUE7V0FBRyxJQUFJLENBQUMsR0FBTCxDQUFBO0FBQUg7QUFFSixTQUFBLEdBQVksTUFBQSxRQUFBLENBQUUsSUFBRixDQUFBO1dBQ1YsQ0FBRSxNQUFNLE9BQUEsQ0FBUSxXQUFSLEVBQXFCLEtBQXJCLENBQU4sQ0FDQyxB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