@expressive/mvc 0.61.0 → 0.63.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.
- package/dist/esm/instruction/ref.js +9 -6
- package/dist/esm/instruction/set.js +4 -2
- package/dist/esm/model.js +32 -33
- package/dist/index.d.ts +7 -0
- package/dist/index.js +45 -41
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { context } from "../control";
|
|
1
|
+
import { addListener, context } from "../control";
|
|
2
2
|
import { update } from "../model";
|
|
3
3
|
import { use } from "./use";
|
|
4
4
|
const { defineProperty, defineProperties } = Object;
|
|
5
5
|
function ref(arg, arg2) {
|
|
6
6
|
return use((key, subject, state) => {
|
|
7
7
|
let value = {};
|
|
8
|
+
const method = (key2) => (callback) => callback ? addListener(subject, () => callback(state[key2]), key2) : state[key2];
|
|
8
9
|
if (arg === subject)
|
|
9
10
|
subject.get(() => {
|
|
10
11
|
for (const key2 in state)
|
|
@@ -18,12 +19,14 @@ function ref(arg, arg2) {
|
|
|
18
19
|
}
|
|
19
20
|
});
|
|
20
21
|
else {
|
|
21
|
-
const get = ()
|
|
22
|
+
const get = method(key2);
|
|
22
23
|
const set = (value2) => {
|
|
23
24
|
update(subject, key2, value2);
|
|
24
25
|
};
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
defineProperties(set, {
|
|
27
|
+
current: { get, set },
|
|
28
|
+
get: { value: get }
|
|
29
|
+
});
|
|
27
30
|
defineProperty(value, key2, { value: set });
|
|
28
31
|
}
|
|
29
32
|
});
|
|
@@ -31,7 +34,7 @@ function ref(arg, arg2) {
|
|
|
31
34
|
throw new Error("ref instruction does not support object which is not 'this'");
|
|
32
35
|
else {
|
|
33
36
|
let unset;
|
|
34
|
-
const get = ()
|
|
37
|
+
const get = method(key);
|
|
35
38
|
const set = (value2) => {
|
|
36
39
|
if (!update(subject, key, value2) || !arg)
|
|
37
40
|
return;
|
|
@@ -60,4 +63,4 @@ function ref(arg, arg2) {
|
|
|
60
63
|
export {
|
|
61
64
|
ref
|
|
62
65
|
};
|
|
63
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luc3RydWN0aW9uL3JlZi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgYWRkTGlzdGVuZXIsIGNvbnRleHQgfSBmcm9tICcuLi9jb250cm9sJztcbmltcG9ydCB7IE1vZGVsLCB1cGRhdGUgfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQgeyB1c2UgfSBmcm9tICcuL3VzZSc7XG5cbmNvbnN0IHsgZGVmaW5lUHJvcGVydHksIGRlZmluZVByb3BlcnRpZXMgfSA9IE9iamVjdDtcblxuZGVjbGFyZSBuYW1lc3BhY2UgcmVmIHtcbiAgdHlwZSBDYWxsYmFjazxUPiA9IChhcmd1bWVudDogVCkgPT5cbiAgICAoKG5leHQ6IFQgfCBudWxsKSA9PiB2b2lkKSB8IFByb21pc2U8dm9pZD4gfCB2b2lkIHwgYm9vbGVhbjtcblxuICBpbnRlcmZhY2UgT2JqZWN0PFQgPSBhbnk+IHtcbiAgICAobmV4dDogVCB8IG51bGwpOiB2b2lkO1xuXG4gICAgLyoqIEN1cnJlbnQgdmFsdWUgaGVsZCBieSB0aGlzIHJlZmVyZW5jZS4gKi9cbiAgICBjdXJyZW50OiBUIHwgbnVsbDtcblxuICAgIC8qKiBcbiAgICAgKiBTdWJzY3JpYmUgdG8gY2hhbmdlcyBvZiB0aGlzIHJlZmVyZW5jZS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBDYWxsYmFjayB0byBpbnZva2Ugd2l0aCB0aGUgY3VycmVudCB2YWx1ZSB3aGVuIGl0IGNoYW5nZXMuXG4gICAgICogQHJldHVybnMgVW5zdWJzY3JpYmUgZnVuY3Rpb24gdG8gc3RvcCBsaXN0ZW5pbmcgdG8gY2hhbmdlcy5cbiAgICAgKi9cbiAgICBnZXQoY2FsbGJhY2s6ICh2YWx1ZTogVCkgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XG5cbiAgICAvKiogUmV0cmlldmUgY3VycmVudCB2YWx1ZS4gKi9cbiAgICBnZXQoKTogVCB8IG51bGw7XG4gIH1cblxuICAvKiogT2JqZWN0IHdpdGggcmVmZXJlbmNlcyB0byBhbGwgbWFuYWdlZCB2YWx1ZXMgb2YgYFRgLiAqL1xuXG4gIC8qKiBPYmplY3Qgd2l0aCByZWZlcmVuY2VzIHRvIGFsbCBtYW5hZ2VkIHZhbHVlcyBvZiBgVGAuICovXG4gIHR5cGUgUHJveHk8VCBleHRlbmRzIE1vZGVsPiA9XG4gICAgJiB7IFtQIGluIE1vZGVsLkZpZWxkPFQ+XS0/OiBPYmplY3Q8VFtQXT4gfVxuICAgICYgeyBnZXQoKTogVCB9O1xuXG4gIHR5cGUgQ3VzdG9tUHJveHk8VCBleHRlbmRzIE1vZGVsLCBSPiA9XG4gICAgJiB7IFtQIGluIE1vZGVsLkZpZWxkPFQ+XS0/OiBSIH1cbiAgICAmIHsgZ2V0KCk6IFQgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHJlZmVyZW5jZXMgdG8gYWxsIG1hbmFnZWQgdmFsdWVzLlxuICogRWFjaCBwcm9wZXJ0eSBpcyBhIGZ1bmN0aW9uIHRvIHNldCB2YWx1ZSBpbiBzdGF0ZSB3aGVuIGludm9rZWQuXG4gKlxuICogKlByb3BlcnRpZXMgYXJlIHNpbXVsdGFuZW91c2x5IGEgcmVmLWZ1bmN0aW9uIGFuZCByZWYtb2JqZWN0LCB1c2UgYXMgbmVlZGVkLipcbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IC0gU291cmNlIG1vZGVsIGZyb20gd2hpY2ggdG8gcmVmZXJlbmNlIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gcmVmIDxUIGV4dGVuZHMgTW9kZWw+ICh0YXJnZXQ6IFQpOiByZWYuUHJveHk8VD47XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB2YWx1ZXMgYmFzZWQgb24gbWFuYWdlZCB2YWx1ZXMuXG4gKiBFYWNoIHByb3BlcnR5IHdpbGwgaW52b2tlIG1hcHBlciBmdW5jdGlvbiBvbiBmaXJzdCBhY2Nlc3Mgc3VwcGx5XG4gKiB0aGUgaXRzIHJldHVybiB2YWx1ZSBnb2luZyBmb3J3YXJkLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBTb3VyY2UgbW9kZWwgZnJvbSB3aGljaCB0byByZWZlcmVuY2UgdmFsdWVzLlxuICogQHBhcmFtIG1hcHBlciAtIEZ1bmN0aW9uIHByb2R1Y2luZyB0aGUgcGxhY2Vob2xkZXIgdmFsdWUgZm9yIGFueSBnaXZlbiBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gcmVmIDxPIGV4dGVuZHMgTW9kZWwsIFI+XG4gICh0YXJnZXQ6IE8sIG1hcHBlcjogKGtleTogTW9kZWwuRmllbGQ8Tz4pID0+IFIpOiByZWYuQ3VzdG9tUHJveHk8TywgUj47XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJlZi1jb21wYXRpYmxlIHByb3BlcnR5LlxuICogV2lsbCBwZXJzaXN0IHZhbHVlLCBhbmQgdXBkYXRlcyB0byB0aGlzIGFyZSBtYWRlIHBhcnQgb2YgY29udHJvbGxlciBldmVudC1zdHJlYW0uXG4gKlxuICogKk91dHB1dCBpcyBzaW11bHRhbmVvdXNseSBhIHJlZi1mdW5jdGlvbiBhbmQgcmVmLW9iamVjdCwgdXNlIGFzIG5lZWRlZC4qXG4gKlxuICogQHBhcmFtIGNhbGxiYWNrIC0gT3B0aW9uYWwgY2FsbGJhY2sgdG8gc3luY2hyb25vdXNseSBmaXJlIHdoZW4gcmVmZXJlbmNlIGlzIGZpcnN0IHNldCBvciBkb2VzIHVwZGF0ZS5cbiAqL1xuZnVuY3Rpb24gcmVmIDxUPiAoY2FsbGJhY2s/OiByZWYuQ2FsbGJhY2s8VD4pOiByZWYuT2JqZWN0PFQ+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZWYtY29tcGF0aWJsZSBwcm9wZXJ0eS5cbiAqIFdpbGwgcGVyc2lzdCB2YWx1ZSwgYW5kIHVwZGF0ZXMgdG8gdGhpcyBhcmUgbWFkZSBwYXJ0IG9mIGNvbnRyb2xsZXIgZXZlbnQtc3RyZWFtLlxuICpcbiAqICpPdXRwdXQgaXMgc2ltdWx0YW5lb3VzbHkgYSByZWYtZnVuY3Rpb24gYW5kIHJlZi1vYmplY3QsIHVzZSBhcyBuZWVkZWQuKlxuICpcbiAqIEBwYXJhbSBjYWxsYmFjayAtIE9wdGlvbmFsIGNhbGxiYWNrIHRvIHN5bmNocm9ub3VzbHkgZmlyZSB3aGVuIHJlZmVyZW5jZSBpcyBmaXJzdCBzZXQgb3IgZG9lcyB1cGRhdGUuXG4gKiBAcGFyYW0gaWdub3JlTnVsbCAtIERlZmF1bHQgYHRydWVgLiBJZiBgZmFsc2VgLCB3aWxsIHN0aWxsIGNhbGxiYWNrIHdpdGggYG51bGxgLlxuICovXG5mdW5jdGlvbiByZWYgPFQ+IChjYWxsYmFjazogcmVmLkNhbGxiYWNrPFQgfCBudWxsPiwgaWdub3JlTnVsbDogYm9vbGVhbik6IHJlZi5PYmplY3Q8VD47XG5cbmZ1bmN0aW9uIHJlZjxUPihcbiAgYXJnPzogcmVmLkNhbGxiYWNrPFQ+IHwgTW9kZWwsXG4gIGFyZzI/OiAoKGtleTogc3RyaW5nKSA9PiBhbnkpIHwgYm9vbGVhbil7XG5cbiAgcmV0dXJuIHVzZTxUPigoa2V5LCBzdWJqZWN0LCBzdGF0ZSkgPT4ge1xuICAgIGxldCB2YWx1ZSA9IHt9O1xuICAgIGNvbnN0IG1ldGhvZCA9IChrZXk6IHN0cmluZykgPT5cbiAgICAgIChjYWxsYmFjaz86ICh2YWx1ZTogVCkgPT4gdm9pZCkgPT4gY2FsbGJhY2tcbiAgICAgICAgPyBhZGRMaXN0ZW5lcihzdWJqZWN0LCAoKSA9PiBjYWxsYmFjayhzdGF0ZVtrZXldKSwga2V5KVxuICAgICAgICA6IHN0YXRlW2tleV07XG5cbiAgICBpZihhcmcgPT09IHN1YmplY3QpXG4gICAgICBzdWJqZWN0LmdldCgoKSA9PiB7XG4gICAgICAgIGZvcihjb25zdCBrZXkgaW4gc3RhdGUpXG4gICAgICAgICAgaWYodHlwZW9mIGFyZzIgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkodmFsdWUsIGtleSwge1xuICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgIGdldCgpe1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dCA9IGFyZzIoa2V5KTtcbiAgICAgICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eSh2YWx1ZSwga2V5LCB7IHZhbHVlOiBvdXQgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGdldCA9IG1ldGhvZChrZXkpO1xuICAgICAgICAgICAgY29uc3Qgc2V0ID0gKHZhbHVlOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgIHVwZGF0ZShzdWJqZWN0LCBrZXksIHZhbHVlKVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhzZXQsIHtcbiAgICAgICAgICAgICAgY3VycmVudDogeyBnZXQsIHNldCB9LFxuICAgICAgICAgICAgICBnZXQ6IHsgdmFsdWU6IGdldCB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkodmFsdWUsIGtleSwgeyB2YWx1ZTogc2V0IH0pO1xuICAgICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICBlbHNlIGlmKHR5cGVvZiBhcmcgPT0gXCJvYmplY3RcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInJlZiBpbnN0cnVjdGlvbiBkb2VzIG5vdCBzdXBwb3J0IG9iamVjdCB3aGljaCBpcyBub3QgJ3RoaXMnXCIpO1xuXG4gICAgZWxzZSB7XG4gICAgICBsZXQgdW5zZXQ6ICgobmV4dDogVCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IGdldCA9IG1ldGhvZChrZXkpO1xuICAgICAgY29uc3Qgc2V0ID0gKHZhbHVlPzogYW55KSA9PiB7XG4gICAgICAgIGlmKCF1cGRhdGUoc3ViamVjdCwga2V5LCB2YWx1ZSkgfHwgIWFyZylcbiAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgaWYodW5zZXQpXG4gICAgICAgICAgdW5zZXQgPSB2b2lkIHVuc2V0KHZhbHVlKTtcbiAgICBcbiAgICAgICAgaWYodmFsdWUgPT09IG51bGwgJiYgYXJnMiAhPT0gZmFsc2UpXG4gICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGN0eCA9IGNvbnRleHQoKTtcbiAgICAgICAgY29uc3Qgb3V0ID0gYXJnLmNhbGwoc3ViamVjdCwgdmFsdWUpO1xuICAgICAgICBjb25zdCBmbHVzaCA9IGN0eCgpO1xuXG4gICAgICAgIHVuc2V0ID0ga2V5ID0+IHtcbiAgICAgICAgICBpZih0eXBlb2Ygb3V0ID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIG91dChrZXkpO1xuXG4gICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgXG4gICAgICBzdGF0ZVtrZXldID0gbnVsbDtcbiAgICAgIHZhbHVlID0gZGVmaW5lUHJvcGVydGllcyhzZXQsIHtcbiAgICAgICAgY3VycmVudDogeyBnZXQsIHNldCB9LFxuICAgICAgICBnZXQ6IHsgdmFsdWU6IGdldCB9XG4gICAgICB9KSBhcyByZWYuT2JqZWN0PFQ+O1xuICAgIH1cblxuICAgIGRlZmluZVByb3BlcnR5KHN1YmplY3QsIGtleSwgeyB2YWx1ZSB9KTtcbiAgfSlcbn1cblxuZXhwb3J0IHsgcmVmIH0iXSwKICAibWFwcGluZ3MiOiAiQUFBQSxTQUFTLGFBQWEsZUFBZTtBQUNyQyxTQUFnQixjQUFjO0FBQzlCLFNBQVMsV0FBVztBQUVwQixNQUFNLEVBQUUsZ0JBQWdCLGlCQUFpQixJQUFJO0FBOEU3QyxTQUFTLElBQ1AsS0FDQSxNQUF3QztBQUV4QyxTQUFPLElBQU8sQ0FBQyxLQUFLLFNBQVMsVUFBVTtBQUNyQyxRQUFJLFFBQVEsQ0FBQztBQUNiLFVBQU0sU0FBUyxDQUFDQSxTQUNkLENBQUMsYUFBa0MsV0FDL0IsWUFBWSxTQUFTLE1BQU0sU0FBUyxNQUFNQSxJQUFHLENBQUMsR0FBR0EsSUFBRyxJQUNwRCxNQUFNQSxJQUFHO0FBRWYsUUFBRyxRQUFRO0FBQ1QsY0FBUSxJQUFJLE1BQU07QUFDaEIsbUJBQVVBLFFBQU87QUFDZixjQUFHLE9BQU8sUUFBUTtBQUNoQiwyQkFBZSxPQUFPQSxNQUFLO0FBQUEsY0FDekIsY0FBYztBQUFBLGNBQ2QsTUFBSztBQUNILHNCQUFNLE1BQU0sS0FBS0EsSUFBRztBQUNwQiwrQkFBZSxPQUFPQSxNQUFLLEVBQUUsT0FBTyxJQUFJLENBQUM7QUFDekMsdUJBQU87QUFBQSxjQUNUO0FBQUEsWUFDRixDQUFDO0FBQUEsZUFDRTtBQUNILGtCQUFNLE1BQU0sT0FBT0EsSUFBRztBQUN0QixrQkFBTSxNQUFNLENBQUNDLFdBQW1CO0FBQzlCLHFCQUFPLFNBQVNELE1BQUtDLE1BQUs7QUFBQSxZQUM1QjtBQUVBLDZCQUFpQixLQUFLO0FBQUEsY0FDcEIsU0FBUyxFQUFFLEtBQUssSUFBSTtBQUFBLGNBQ3BCLEtBQUssRUFBRSxPQUFPLElBQUk7QUFBQSxZQUNwQixDQUFDO0FBRUQsMkJBQWUsT0FBT0QsTUFBSyxFQUFFLE9BQU8sSUFBSSxDQUFDO0FBQUEsVUFDM0M7QUFBQSxNQUNKLENBQUM7QUFBQSxhQUVLLE9BQU8sT0FBTztBQUNwQixZQUFNLElBQUksTUFBTSw2REFBNkQ7QUFBQSxTQUUxRTtBQUNILFVBQUk7QUFFSixZQUFNLE1BQU0sT0FBTyxHQUFHO0FBQ3RCLFlBQU0sTUFBTSxDQUFDQyxXQUFnQjtBQUMzQixZQUFHLENBQUMsT0FBTyxTQUFTLEtBQUtBLE1BQUssS0FBSyxDQUFDO0FBQ2xDO0FBRUYsWUFBRztBQUNELGtCQUFRLEtBQUssTUFBTUEsTUFBSztBQUUxQixZQUFHQSxXQUFVLFFBQVEsU0FBUztBQUM1QjtBQUVGLGNBQU0sTUFBTSxRQUFRO0FBQ3BCLGNBQU0sTUFBTSxJQUFJLEtBQUssU0FBU0EsTUFBSztBQUNuQyxjQUFNLFFBQVEsSUFBSTtBQUVsQixnQkFBUSxDQUFBRCxTQUFPO0FBQ2IsY0FBRyxPQUFPLE9BQU87QUFDZixnQkFBSUEsSUFBRztBQUVULGdCQUFNO0FBQUEsUUFDUjtBQUFBLE1BQ0Y7QUFFQSxZQUFNLEdBQUcsSUFBSTtBQUNiLGNBQVEsaUJBQWlCLEtBQUs7QUFBQSxRQUM1QixTQUFTLEVBQUUsS0FBSyxJQUFJO0FBQUEsUUFDcEIsS0FBSyxFQUFFLE9BQU8sSUFBSTtBQUFBLE1BQ3BCLENBQUM7QUFBQSxJQUNIO0FBRUEsbUJBQWUsU0FBUyxLQUFLLEVBQUUsTUFBTSxDQUFDO0FBQUEsRUFDeEMsQ0FBQztBQUNIOyIsCiAgIm5hbWVzIjogWyJrZXkiLCAidmFsdWUiXQp9Cg==
|
|
@@ -3,7 +3,9 @@ import { event, update } from "../model";
|
|
|
3
3
|
import { use } from "./use";
|
|
4
4
|
function set(value, argument) {
|
|
5
5
|
return use((key, subject) => {
|
|
6
|
-
const property = {
|
|
6
|
+
const property = {
|
|
7
|
+
enumerable: false
|
|
8
|
+
};
|
|
7
9
|
if (typeof value == "function" || value instanceof Promise) {
|
|
8
10
|
let init2 = function() {
|
|
9
11
|
if (typeof value == "function")
|
|
@@ -80,4 +82,4 @@ function attempt(fn) {
|
|
|
80
82
|
export {
|
|
81
83
|
set
|
|
82
84
|
};
|
|
83
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luc3RydWN0aW9uL3NldC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJy4uL2NvbnRyb2wnO1xuaW1wb3J0IHsgTW9kZWwsIGV2ZW50LCB1cGRhdGUgfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQgeyB1c2UgfSBmcm9tICcuL3VzZSc7XG5cbmRlY2xhcmUgbmFtZXNwYWNlIHNldCB7XG4gIHR5cGUgQ2FsbGJhY2s8VCwgUyA9IGFueT4gPSAodGhpczogUywgbmV4dDogVCwgcHJldmlvdXM6IFQpID0+XG4gICAgKChuZXh0OiBUKSA9PiB2b2lkKSB8IFByb21pc2U8YW55PiB8IHZvaWQgfCBib29sZWFuO1xuXG4gIHR5cGUgRmFjdG9yeTxULCBTID0gYW55PiA9ICh0aGlzOiBTLCBrZXk6IHN0cmluZykgPT4gUHJvbWlzZTxUPiB8IFQ7XG59XG5cbi8qKlxuICogU2V0IHByb3BlcnR5IGFzIGB1bmRlZmluZWRgIGJ1dCByZXF1aXJlZC5cbiAqIFxuICogUHJvcGVydHkgY2Fubm90IGJlIGFjY2Vzc2VkIHVudGlsIGl0IGlzIGRlZmluZWQuIElmIGFjY2Vzc2VkIHdoaWxlIHVuZGVmaW5lZCwgYSBoeWJyaWRcbiAqIGBQcm9taXNlYC9gRXJyb3JgIChha2E6IFtTdXNwZW5zZV0oaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2NvbmN1cnJlbnQtbW9kZS1zdXNwZW5zZS5odG1sKSkgd2lsbCBiZSB0aHJvd24uXG4gKi9cbmZ1bmN0aW9uIHNldCA8VCA9IGFueT4oKTogVDtcblxuLyoqXG4gKiBTZXQgcHJvcGVydHkgd2l0aCBhIGZhY3RvcnkgZnVuY3Rpb24uXG4gKiBcbiAqIFJ1biBmYWN0b3J5IG9ubHkgaWYvd2hlbiBhY2Nlc3NlZC4gVmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgdW50aWxcbiAqIGZhY3RvcnkgcmVzb2x2ZXMsIHdoaWNoIHdpbGwgYWxzbyBkaXNwYXRjaCBhbiB1cGRhdGUgZm9yIHRoZSBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gc2V0IDxUPiAoZmFjdG9yeTogc2V0LkZhY3Rvcnk8VD4gfCBQcm9taXNlPFQ+LCByZXF1aXJlZDogZmFsc2UpOiBUIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFNldCBwcm9wZXJ0eSB3aXRoIGEgZmFjdG9yeSBmdW5jdGlvbi5cbiAqXG4gKiBJZiBhc3luYywgcHJvcGVydHkgY2Fubm90IGJlIGFjY2Vzc2VkIHVudGlsIHJlc29sdmVzLCB5ZWlsZGluZyBhIHJlc3VsdC5cbiAqIElmIGFjY2Vzc2VkIHdoaWxlIHN0aWxsIHByb2Nlc3NpbmcsIFJlYWN0IFN1c3BlbnNlIHdpbGwgYmUgdGhyb3duLlxuICpcbiAqIEBwYXJhbSBmYWN0b3J5IC0gQ2FsbGJhY2sgcnVuIHRvIGRlcnJpdmUgcHJvcGVydHkgdmFsdWUuXG4gKiBAcGFyYW0gcmVxdWlyZWQgLSBJZiB0cnVlIHJ1biBmYWN0b3J5IGltbWVkaWF0ZWx5IG9uIGNyZWF0aW9uLCBvdGhlcndpc2Ugb24gYWNjZXNzLlxuICovXG5mdW5jdGlvbiBzZXQgPFQ+IChmYWN0b3J5OiBzZXQuRmFjdG9yeTxUPiB8IFByb21pc2U8VD4sIHJlcXVpcmVkPzogYm9vbGVhbik6IFQ7XG5cbi8qKlxuICogU2V0IGEgcHJvcGVydHkgd2l0aCBlbXB0eSBwbGFjZWhvbGRlciBhbmQvb3IgdXBkYXRlIGNhbGxiYWNrLlxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBTdGFydGluZyB2YWx1ZSBmb3IgcHJvcGVydHkuIElmIHVuZGVmaW5lZCwgc3VzcGVuc2Ugd2lsbCBiZSB0aHJvd24gb24gYWNjZXNzLCB1bnRpbCB2YWx1ZSBpcyBzZXQgYW5kIGFjY2VwdGVkIGJ5IGNhbGxiYWNrLlxuICogQHBhcmFtIG9uVXBkYXRlIC0gQ2FsbGJhY2sgcnVuIHdoZW4gcHJvcGVydHkgaXMgc2V0LiBJZiByZXR1cm5zIGZhbHNlLCB1cGRhdGUgaXMgbm90IGFjY2VwdGVkIGFuZCBwcm9wZXJ0eSB3aWxsIGtlZXAgcHJldmlvdXMgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHNldCA8VD4gKHZhbHVlOiBUIHwgdW5kZWZpbmVkLCBvblVwZGF0ZT86IHNldC5DYWxsYmFjazxUPik6IFQ7XG5cbmZ1bmN0aW9uIHNldCA8VD4gKFxuICB2YWx1ZT86IHNldC5GYWN0b3J5PFQ+IHwgUHJvbWlzZTxUPiB8IFQsXG4gIGFyZ3VtZW50Pzogc2V0LkNhbGxiYWNrPGFueT4gfCBib29sZWFuKXtcblxuICByZXR1cm4gdXNlPFQ+KChrZXksIHN1YmplY3QpID0+
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luc3RydWN0aW9uL3NldC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgY29udGV4dCB9IGZyb20gJy4uL2NvbnRyb2wnO1xuaW1wb3J0IHsgTW9kZWwsIGV2ZW50LCB1cGRhdGUgfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQgeyB1c2UgfSBmcm9tICcuL3VzZSc7XG5cbmRlY2xhcmUgbmFtZXNwYWNlIHNldCB7XG4gIHR5cGUgQ2FsbGJhY2s8VCwgUyA9IGFueT4gPSAodGhpczogUywgbmV4dDogVCwgcHJldmlvdXM6IFQpID0+XG4gICAgKChuZXh0OiBUKSA9PiB2b2lkKSB8IFByb21pc2U8YW55PiB8IHZvaWQgfCBib29sZWFuO1xuXG4gIHR5cGUgRmFjdG9yeTxULCBTID0gYW55PiA9ICh0aGlzOiBTLCBrZXk6IHN0cmluZykgPT4gUHJvbWlzZTxUPiB8IFQ7XG59XG5cbi8qKlxuICogU2V0IHByb3BlcnR5IGFzIGB1bmRlZmluZWRgIGJ1dCByZXF1aXJlZC5cbiAqIFxuICogUHJvcGVydHkgY2Fubm90IGJlIGFjY2Vzc2VkIHVudGlsIGl0IGlzIGRlZmluZWQuIElmIGFjY2Vzc2VkIHdoaWxlIHVuZGVmaW5lZCwgYSBoeWJyaWRcbiAqIGBQcm9taXNlYC9gRXJyb3JgIChha2E6IFtTdXNwZW5zZV0oaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2NvbmN1cnJlbnQtbW9kZS1zdXNwZW5zZS5odG1sKSkgd2lsbCBiZSB0aHJvd24uXG4gKi9cbmZ1bmN0aW9uIHNldCA8VCA9IGFueT4oKTogVDtcblxuLyoqXG4gKiBTZXQgcHJvcGVydHkgd2l0aCBhIGZhY3RvcnkgZnVuY3Rpb24uXG4gKiBcbiAqIFJ1biBmYWN0b3J5IG9ubHkgaWYvd2hlbiBhY2Nlc3NlZC4gVmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgdW50aWxcbiAqIGZhY3RvcnkgcmVzb2x2ZXMsIHdoaWNoIHdpbGwgYWxzbyBkaXNwYXRjaCBhbiB1cGRhdGUgZm9yIHRoZSBwcm9wZXJ0eS5cbiAqL1xuZnVuY3Rpb24gc2V0IDxUPiAoZmFjdG9yeTogc2V0LkZhY3Rvcnk8VD4gfCBQcm9taXNlPFQ+LCByZXF1aXJlZDogZmFsc2UpOiBUIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFNldCBwcm9wZXJ0eSB3aXRoIGEgZmFjdG9yeSBmdW5jdGlvbi5cbiAqXG4gKiBJZiBhc3luYywgcHJvcGVydHkgY2Fubm90IGJlIGFjY2Vzc2VkIHVudGlsIHJlc29sdmVzLCB5ZWlsZGluZyBhIHJlc3VsdC5cbiAqIElmIGFjY2Vzc2VkIHdoaWxlIHN0aWxsIHByb2Nlc3NpbmcsIFJlYWN0IFN1c3BlbnNlIHdpbGwgYmUgdGhyb3duLlxuICpcbiAqIEBwYXJhbSBmYWN0b3J5IC0gQ2FsbGJhY2sgcnVuIHRvIGRlcnJpdmUgcHJvcGVydHkgdmFsdWUuXG4gKiBAcGFyYW0gcmVxdWlyZWQgLSBJZiB0cnVlIHJ1biBmYWN0b3J5IGltbWVkaWF0ZWx5IG9uIGNyZWF0aW9uLCBvdGhlcndpc2Ugb24gYWNjZXNzLlxuICovXG5mdW5jdGlvbiBzZXQgPFQ+IChmYWN0b3J5OiBzZXQuRmFjdG9yeTxUPiB8IFByb21pc2U8VD4sIHJlcXVpcmVkPzogYm9vbGVhbik6IFQ7XG5cbi8qKlxuICogU2V0IGEgcHJvcGVydHkgd2l0aCBlbXB0eSBwbGFjZWhvbGRlciBhbmQvb3IgdXBkYXRlIGNhbGxiYWNrLlxuICogXG4gKiBAcGFyYW0gdmFsdWUgLSBTdGFydGluZyB2YWx1ZSBmb3IgcHJvcGVydHkuIElmIHVuZGVmaW5lZCwgc3VzcGVuc2Ugd2lsbCBiZSB0aHJvd24gb24gYWNjZXNzLCB1bnRpbCB2YWx1ZSBpcyBzZXQgYW5kIGFjY2VwdGVkIGJ5IGNhbGxiYWNrLlxuICogQHBhcmFtIG9uVXBkYXRlIC0gQ2FsbGJhY2sgcnVuIHdoZW4gcHJvcGVydHkgaXMgc2V0LiBJZiByZXR1cm5zIGZhbHNlLCB1cGRhdGUgaXMgbm90IGFjY2VwdGVkIGFuZCBwcm9wZXJ0eSB3aWxsIGtlZXAgcHJldmlvdXMgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIHNldCA8VD4gKHZhbHVlOiBUIHwgdW5kZWZpbmVkLCBvblVwZGF0ZT86IHNldC5DYWxsYmFjazxUPik6IFQ7XG5cbmZ1bmN0aW9uIHNldCA8VD4gKFxuICB2YWx1ZT86IHNldC5GYWN0b3J5PFQ+IHwgUHJvbWlzZTxUPiB8IFQsXG4gIGFyZ3VtZW50Pzogc2V0LkNhbGxiYWNrPGFueT4gfCBib29sZWFuKXtcblxuICByZXR1cm4gdXNlPFQ+KChrZXksIHN1YmplY3QpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0eTogTW9kZWwuRGVzY3JpcHRvciA9IHtcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgfTtcblxuICAgIGlmKHR5cGVvZiB2YWx1ZSA9PSBcImZ1bmN0aW9uXCIgfHwgdmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKXtcbiAgICAgIGZ1bmN0aW9uIGluaXQoKXtcbiAgICAgICAgaWYodHlwZW9mIHZhbHVlID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWUgPSBhdHRlbXB0KHZhbHVlLmJpbmQoc3ViamVjdCwga2V5KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhdGNoKGVycil7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEdlbmVyYXRpbmcgaW5pdGlhbCB2YWx1ZSBmb3IgJHtzdWJqZWN0fS4ke2tleX0gZmFpbGVkLmApO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICBwcm9wZXJ0eS5nZXQgPSBhcmd1bWVudCA9PT0gdHJ1ZTtcblxuICAgICAgICBpZih2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2Upe1xuICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICAudGhlbih2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgIHVwZGF0ZShzdWJqZWN0LCBrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICBldmVudChzdWJqZWN0LCBrZXkpO1xuICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXQgPSAoKSA9PiB7IHRocm93IGVyciB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgdXBkYXRlKHN1YmplY3QsIGtleSwgdmFsdWUpO1xuXG4gICAgICAgIGlmKDAgaW4gYXJndW1lbnRzKVxuICAgICAgICAgIHJldHVybiBzdWJqZWN0W2tleV07XG4gICAgICB9XG5cbiAgICAgIGlmKGFyZ3VtZW50KVxuICAgICAgICBpbml0KCk7XG4gICAgICBlbHNlXG4gICAgICAgIHByb3BlcnR5LmdldCA9IGluaXQ7XG4gICAgfVxuICAgIGVsc2UgaWYodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgIHByb3BlcnR5LnZhbHVlID0gdmFsdWU7XG5cbiAgICBpZih0eXBlb2YgYXJndW1lbnQgPT0gXCJmdW5jdGlvblwiKXtcbiAgICAgIGxldCB1bnNldDogKChuZXh0OiBUKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuICAgICAgcHJvcGVydHkuc2V0ID0gZnVuY3Rpb24odGhpczogYW55LCB2YWx1ZTogYW55LCBwcmV2aW91czogYW55KXtcbiAgICAgICAgY29uc3QgY3R4ID0gY29udGV4dCgpO1xuICAgICAgICBjb25zdCBvdXQgPSBhcmd1bWVudC5jYWxsKHRoaXMsIHZhbHVlLCBwcmV2aW91cyk7XG4gICAgICAgIGNvbnN0IGZsdXNoID0gY3R4KCk7XG5cbiAgICAgICAgaWYob3V0ID09PSBmYWxzZSlcbiAgICAgICAgICByZXR1cm4gb3V0O1xuXG4gICAgICAgIGlmKHR5cGVvZiB1bnNldCA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgdW5zZXQodmFsdWUpO1xuXG4gICAgICAgIHVuc2V0ID0gKG5leHQ6IFQpID0+IHtcbiAgICAgICAgICBpZih0eXBlb2Ygb3V0ID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIG91dChuZXh0KTtcblxuICAgICAgICAgIGZsdXNoKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZVxuICAgICAgcHJvcGVydHkuc2V0ID0gdmFsdWUgPT4ge1xuICAgICAgICBwcm9wZXJ0eS5nZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHVwZGF0ZShzdWJqZWN0LCBrZXksIHZhbHVlKTtcbiAgICAgIH1cblxuICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgfSlcbn1cblxuZnVuY3Rpb24gYXR0ZW1wdChmbjogKCkgPT4gYW55KTogYW55IHtcbiAgZnVuY3Rpb24gcmV0cnkoZXJyOiB1bmtub3duKXtcbiAgICBpZihlcnIgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgcmV0dXJuIGVyci50aGVuKGNvbXB1dGUpO1xuICAgIGVsc2VcbiAgICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXB1dGUoKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gZm4oKTtcblxuICAgICAgcmV0dXJuIG91dHB1dCBpbnN0YW5jZW9mIFByb21pc2VcbiAgICAgICAgPyBvdXRwdXQuY2F0Y2gocmV0cnkpXG4gICAgICAgIDogb3V0cHV0O1xuICAgIH1cbiAgICBjYXRjaChlcnIpe1xuICAgICAgcmV0dXJuIHJldHJ5KGVycik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbXB1dGUoKTtcbn1cblxuZXhwb3J0IHsgc2V0IH0iXSwKICAibWFwcGluZ3MiOiAiQUFBQSxTQUFTLGVBQWU7QUFDeEIsU0FBZ0IsT0FBTyxjQUFjO0FBQ3JDLFNBQVMsV0FBVztBQTRDcEIsU0FBUyxJQUNQLE9BQ0EsVUFBdUM7QUFFdkMsU0FBTyxJQUFPLENBQUMsS0FBSyxZQUFZO0FBQzlCLFVBQU0sV0FBNkI7QUFBQSxNQUNqQyxZQUFZO0FBQUEsSUFDZDtBQUVBLFFBQUcsT0FBTyxTQUFTLGNBQWMsaUJBQWlCLFNBQVE7QUFDeEQsVUFBU0EsUUFBVCxXQUFlO0FBQ2IsWUFBRyxPQUFPLFNBQVM7QUFDakIsY0FBSTtBQUNGLG9CQUFRLFFBQVEsTUFBTSxLQUFLLFNBQVMsR0FBRyxDQUFDO0FBQUEsVUFDMUMsU0FDTSxLQUFJO0FBQ1Isb0JBQVEsS0FBSyxnQ0FBZ0MsT0FBTyxJQUFJLEdBQUcsVUFBVTtBQUNyRSxrQkFBTTtBQUFBLFVBQ1I7QUFFRixpQkFBUyxNQUFNLGFBQWE7QUFFNUIsWUFBRyxpQkFBaUIsU0FBUTtBQUMxQixnQkFDRyxLQUFLLENBQUFDLFdBQVM7QUFDYixtQkFBTyxTQUFTLEtBQUtBLE1BQUs7QUFDMUIsbUJBQU9BO0FBQUEsVUFDVCxDQUFDLEVBQ0EsTUFBTSxTQUFPO0FBQ1osa0JBQU0sU0FBUyxHQUFHO0FBQ2xCLHFCQUFTLE1BQU0sTUFBTTtBQUFFLG9CQUFNO0FBQUEsWUFBSTtBQUFBLFVBQ25DLENBQUM7QUFBQSxRQUNMO0FBRUUsaUJBQU8sU0FBUyxLQUFLLEtBQUs7QUFFNUIsWUFBRyxLQUFLO0FBQ04saUJBQU8sUUFBUSxHQUFHO0FBQUEsTUFDdEI7QUE1QlMsaUJBQUFEO0FBOEJULFVBQUc7QUFDRCxRQUFBQSxNQUFLO0FBQUE7QUFFTCxpQkFBUyxNQUFNQTtBQUFBLElBQ25CLFdBQ1EsVUFBVTtBQUNoQixlQUFTLFFBQVE7QUFFbkIsUUFBRyxPQUFPLFlBQVksWUFBVztBQUMvQixVQUFJO0FBRUosZUFBUyxNQUFNLFNBQW9CQyxRQUFZLFVBQWM7QUFDM0QsY0FBTSxNQUFNLFFBQVE7QUFDcEIsY0FBTSxNQUFNLFNBQVMsS0FBSyxNQUFNQSxRQUFPLFFBQVE7QUFDL0MsY0FBTSxRQUFRLElBQUk7QUFFbEIsWUFBRyxRQUFRO0FBQ1QsaUJBQU87QUFFVCxZQUFHLE9BQU8sU0FBUztBQUNqQixnQkFBTUEsTUFBSztBQUViLGdCQUFRLENBQUMsU0FBWTtBQUNuQixjQUFHLE9BQU8sT0FBTztBQUNmLGdCQUFJLElBQUk7QUFFVixnQkFBTTtBQUFBLFFBQ1I7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUVFLGVBQVMsTUFBTSxDQUFBQSxXQUFTO0FBQ3RCLGlCQUFTLE1BQU07QUFDZixlQUFPLFNBQVMsS0FBS0EsTUFBSztBQUFBLE1BQzVCO0FBRUYsV0FBTztBQUFBLEVBQ1QsQ0FBQztBQUNIO0FBRUEsU0FBUyxRQUFRLElBQW9CO0FBQ25DLFdBQVMsTUFBTSxLQUFhO0FBQzFCLFFBQUcsZUFBZTtBQUNoQixhQUFPLElBQUksS0FBSyxPQUFPO0FBQUE7QUFFdkIsWUFBTTtBQUFBLEVBQ1Y7QUFFQSxXQUFTLFVBQWU7QUFDdEIsUUFBSTtBQUNGLFlBQU0sU0FBUyxHQUFHO0FBRWxCLGFBQU8sa0JBQWtCLFVBQ3JCLE9BQU8sTUFBTSxLQUFLLElBQ2xCO0FBQUEsSUFDTixTQUNNLEtBQUk7QUFDUixhQUFPLE1BQU0sR0FBRztBQUFBLElBQ2xCO0FBQUEsRUFDRjtBQUVBLFNBQU8sUUFBUTtBQUNqQjsiLAogICJuYW1lcyI6IFsiaW5pdCIsICJ2YWx1ZSJdCn0K
|
package/dist/esm/model.js
CHANGED
|
@@ -39,19 +39,9 @@ class Model {
|
|
|
39
39
|
if (key === arg1)
|
|
40
40
|
return arg2.call(self, key, self);
|
|
41
41
|
});
|
|
42
|
-
if (arg1 && typeof arg1 == "object")
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const bind = methods.get(key);
|
|
46
|
-
if (bind)
|
|
47
|
-
bind.call(self, arg1[key]);
|
|
48
|
-
else if (key in self)
|
|
49
|
-
if (arg2 === true || !Object.getOwnPropertyDescriptor(self, key)?.set)
|
|
50
|
-
update(self, key, arg1[key], arg2 === true);
|
|
51
|
-
else
|
|
52
|
-
self[key] = arg1[key];
|
|
53
|
-
}
|
|
54
|
-
} else
|
|
42
|
+
if (arg1 && typeof arg1 == "object")
|
|
43
|
+
assign(self, arg1, arg2 === true);
|
|
44
|
+
else
|
|
55
45
|
event(self, arg1);
|
|
56
46
|
return pending(self);
|
|
57
47
|
}
|
|
@@ -104,6 +94,19 @@ define(Model, "toString", {
|
|
|
104
94
|
return this.name;
|
|
105
95
|
}
|
|
106
96
|
});
|
|
97
|
+
function assign(subject, data, silent) {
|
|
98
|
+
const methods = METHODS.get(subject.constructor);
|
|
99
|
+
for (const key in data) {
|
|
100
|
+
const bind = methods.get(key);
|
|
101
|
+
if (bind)
|
|
102
|
+
bind.call(subject, data[key]);
|
|
103
|
+
else if (key in subject && key !== "is") {
|
|
104
|
+
const desc = Object.getOwnPropertyDescriptor(subject, key);
|
|
105
|
+
const set = desc && desc.set;
|
|
106
|
+
set.call(subject, data[key], silent === true);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
107
110
|
function prepare(model) {
|
|
108
111
|
let T = model.constructor;
|
|
109
112
|
if (T === Model)
|
|
@@ -142,7 +145,6 @@ function prepare(model) {
|
|
|
142
145
|
}
|
|
143
146
|
}
|
|
144
147
|
function init(model, args) {
|
|
145
|
-
const methods = METHODS.get(model.constructor);
|
|
146
148
|
const state = {};
|
|
147
149
|
STATE.set(model, state);
|
|
148
150
|
args = args.flat().filter((arg) => {
|
|
@@ -153,21 +155,6 @@ function init(model, args) {
|
|
|
153
155
|
addListener(model, () => {
|
|
154
156
|
if (!PARENT.has(model))
|
|
155
157
|
PARENT.set(model, null);
|
|
156
|
-
args.forEach((arg) => {
|
|
157
|
-
const use = typeof arg == "function" ? arg.call(model, model) : arg;
|
|
158
|
-
if (use instanceof Promise)
|
|
159
|
-
use.catch((err) => {
|
|
160
|
-
console.error(`Async error in constructor for ${model}:`);
|
|
161
|
-
console.error(err);
|
|
162
|
-
});
|
|
163
|
-
else if (typeof use == "function")
|
|
164
|
-
addListener(model, use, null);
|
|
165
|
-
else if (typeof use == "object") {
|
|
166
|
-
for (const key in use)
|
|
167
|
-
if (key in model || methods.has(key))
|
|
168
|
-
model[key] = use[key];
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
158
|
for (const key in model) {
|
|
172
159
|
const desc = Object.getOwnPropertyDescriptor(model, key);
|
|
173
160
|
if ("value" in desc) {
|
|
@@ -177,13 +164,25 @@ function init(model, args) {
|
|
|
177
164
|
get() {
|
|
178
165
|
return watch(this, key, state[key]);
|
|
179
166
|
},
|
|
180
|
-
set(value) {
|
|
181
|
-
update(model, key, value);
|
|
167
|
+
set(value, silent) {
|
|
168
|
+
update(model, key, value, silent);
|
|
182
169
|
mayAdopt(model, value);
|
|
183
170
|
}
|
|
184
171
|
});
|
|
185
172
|
}
|
|
186
173
|
}
|
|
174
|
+
args.forEach((arg) => {
|
|
175
|
+
const use = typeof arg == "function" ? arg.call(model, model) : arg;
|
|
176
|
+
if (use instanceof Promise)
|
|
177
|
+
use.catch((err) => {
|
|
178
|
+
console.error(`Async error in constructor for ${model}:`);
|
|
179
|
+
console.error(err);
|
|
180
|
+
});
|
|
181
|
+
else if (typeof use == "function")
|
|
182
|
+
addListener(model, use, null);
|
|
183
|
+
else if (typeof use == "object")
|
|
184
|
+
assign(model, use, true);
|
|
185
|
+
});
|
|
187
186
|
addListener(model, () => {
|
|
188
187
|
for (const [_, value] of model)
|
|
189
188
|
if (value instanceof Model && PARENT.get(value) === model)
|
|
@@ -255,7 +254,7 @@ function update(subject, key, value, arg) {
|
|
|
255
254
|
if (typeof out == "function")
|
|
256
255
|
value = out();
|
|
257
256
|
}
|
|
258
|
-
if (value === previous)
|
|
257
|
+
if (value === previous && value !== void 0)
|
|
259
258
|
return;
|
|
260
259
|
state[key] = value;
|
|
261
260
|
if (arg !== true)
|
|
@@ -276,4 +275,4 @@ export {
|
|
|
276
275
|
uid,
|
|
277
276
|
update
|
|
278
277
|
};
|
|
279
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL21vZGVsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBhZGRMaXN0ZW5lciwgY3JlYXRlRWZmZWN0LCBldmVudCwgT25VcGRhdGUsIHBlbmRpbmcsIFBFTkRJTkdfS0VZUywgd2F0Y2ggfSBmcm9tICcuL2NvbnRyb2wnO1xuXG5jb25zdCBkZWZpbmUgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8qKiBSZWdpc3RlciBmb3IgYWxsIGFjdGl2ZSBtb2RlbHMgdmlhIHN0cmluZyBpZGVudGlmaWVycyAodXN1YWxseSB1bmlxdWUpLiAqL1xuY29uc3QgSUQgPSBuZXcgV2Vha01hcDxNb2RlbCwgc3RyaW5nPigpO1xuXG4vKiogSW50ZXJuYWwgc3RhdGUgYXNzaWduZWQgdG8gbW9kZWxzLiAqL1xuY29uc3QgU1RBVEUgPSBuZXcgV2Vha01hcDxNb2RlbCwgUmVjb3JkPHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdW5rbm93bj4+KCk7XG5cbi8qKiBFeHRlcm5hbCBsaXN0ZW5lcnMgZm9yIGFueSBnaXZlbiBNb2RlbC4gKi9cbmNvbnN0IE5PVElGWSA9IG5ldyBXZWFrTWFwPE1vZGVsLlR5cGUsIFNldDxPblVwZGF0ZT4+KCk7XG5cbi8qKiBQYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcy4gKi9cbmNvbnN0IFBBUkVOVCA9IG5ldyBXZWFrTWFwPE1vZGVsLCBNb2RlbCB8IG51bGw+KCk7XG5cbi8qKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBieSBhIGdpdmVuIHR5cGUuICovXG5jb25zdCBNRVRIT0RTID0gbmV3IFdlYWtNYXA8TW9kZWwuVHlwZSwgTWFwPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IHZvaWQ+PigpO1xuXG4vKiogUmVmZXJlbmNlIGJvdW5kIGluc3RhbmNlIG1ldGhvZHMgdG8gcmVhbCBvbmVzLiAqL1xuY29uc3QgTUVUSE9EID0gbmV3IFdlYWtNYXA8YW55LCBhbnk+KCk7XG5cbmRlY2xhcmUgbmFtZXNwYWNlIE1vZGVsIHtcbiAgLyoqIEFueSB0eXBlIG9mIE1vZGVsLCB1c2luZyBvd24gY2xhc3MgY29uc3RydWN0b3IgYXMgaXRzIGlkZW50aWZpZXIuICovXG4gIHR5cGUgVHlwZTxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPVxuICAgIChhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUKSAmIHR5cGVvZiBNb2RlbDtcblxuICAvKiogQSBNb2RlbCBjb25zdHJ1Y3RvciwgYnV0IHdoaWNoIGlzIG5vdCBhYnN0cmFjdC4gKi9cbiAgdHlwZSBJbml0PFQgZXh0ZW5kcyBNb2RlbCA9IE1vZGVsPiA9XG4gICAgKG5ldyAoLi4uYXJnczogTW9kZWwuQXJnczxUPikgPT4gVCkgJiBPbWl0PHR5cGVvZiBNb2RlbCwgbmV2ZXI+O1xuXG4gIC8qKlxuICAgKiBNb2RlbCBjb25zdHJ1Y3RvciBjYWxsYmFjayAtIGlzIGNhbGxlZCB3aGVuIE1vZGVsIGZpbmlzaGVzIGludGlhbGl6aW5nLlxuICAgKiBSZXR1cm5lZCBmdW5jdGlvbiB3aWxsIHJ1biB3aGVuIG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIHR5cGUgQ2FsbGJhY2s8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID1cbiAgICAodGhpczogVCwgdGhpc0FyZzogVCkgPT4gUHJvbWlzZTx2b2lkPiB8ICgoKSA9PiB2b2lkKSB8IEFzc2lnbjxUPiB8IHZvaWQ7XG5cbiAgLyoqIE1vZGVsIGNvbnN0cnVjdG9yIGFyZ3VtZW50ICovXG4gIHR5cGUgQXJndW1lbnQ8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID0gQXNzaWduPFQ+IHwgQ2FsbGJhY2s8VD4gfCBzdHJpbmcgfCB2b2lkO1xuXG4gIC8qKiBNb2RlbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKi9cbiAgdHlwZSBBcmdzPFQgZXh0ZW5kcyBNb2RlbCA9IGFueT4gPSAoQXJndW1lbnQ8VD4gfCBBcmdzPFQ+KVtdO1xuXG4gIC8qKiBTdWJzZXQgb2YgYGtleW9mIFRgIHdoaWNoIGFyZSBub3QgbWV0aG9kcyBvciBkZWZpbmVkIGJ5IGJhc2UgTW9kZWwgVS4gKiovXG4gIHR5cGUgRmllbGQ8VD4gPSBFeGNsdWRlPGtleW9mIFQsIGtleW9mIE1vZGVsPjtcblxuICAvKiogQW55IHZhbGlkIGtleSBmb3IgbW9kZWwsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gRmllbGQ8VD4uICovXG4gIHR5cGUgRXZlbnQ8VD4gPSBGaWVsZDxUPiB8IChzdHJpbmcgJiB7fSkgfCBudW1iZXIgfCBzeW1ib2w7XG5cbiAgLyoqIE9iamVjdCBvdmVybGF5IHRvIG92ZXJyaWRlIHZhbHVlcyBhbmQgbWV0aG9kcyBvbiBhIG1vZGVsLiAqL1xuICB0eXBlIEFzc2lnbjxUPiA9IHtcbiAgICBbSyBpbiBGaWVsZDxUPl0/OlxuICAgICAgVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIFxuICAgICAgICA/ICh0aGlzOiBULCAuLi5hcmdzOiBBKSA9PiBSXG4gICAgICAgIDogVFtLXTtcbiAgfSAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKiBFeHBvcnQvSW1wb3J0IGNvbXBhdGlibGUgdmFsdWUgZm9yIGEgZ2l2ZW4gcHJvcGVydHkgaW4gYSBNb2RlbC4gKi9cbiAgdHlwZSBFeHBvcnQ8Uj4gPSBSIGV4dGVuZHMgeyBnZXQoKTogaW5mZXIgVCB9ID8gVCA6IFI7XG5cbiAgLyoqIFZhbHVlIGZvciBhIHByb3BlcnR5IG1hbmFnZWQgYnkgYSBtb2RlbC4gKi9cbiAgdHlwZSBWYWx1ZTxUIGV4dGVuZHMgTW9kZWwsIEsgZXh0ZW5kcyBFdmVudDxUPj4gPVxuICAgIEsgZXh0ZW5kcyBrZXlvZiBUID8gRXhwb3J0PFRbS10+IDogdW5rbm93bjtcblxuICB0eXBlIE9uRXZlbnQ8VCBleHRlbmRzIE1vZGVsPiA9XG4gICAgKHRoaXM6IFQsIGtleTogdW5rbm93biwgc291cmNlOiBUKSA9PiAoKCkgPT4gdm9pZCkgfCB2b2lkIHwgbnVsbDtcblxuICB0eXBlIE9uVXBkYXRlPFQgZXh0ZW5kcyBNb2RlbCwgSyBleHRlbmRzIEV2ZW50PFQ+PiA9XG4gICAgKHRoaXM6IFQsIGtleTogSywgdGhpc0FyZzogSykgPT4gdm9pZDtcblxuICAvKipcbiAgICogVmFsdWVzIGZyb20gY3VycmVudCBzdGF0ZSBvZiBnaXZlbiBtb2RlbC5cbiAgICogRGlmZmVycyBmcm9tIGBWYWx1ZXNgIGFzIHZhbHVlcyBoZXJlIHdpbGwgZHJpbGxcbiAgICogaW50byBcInJlYWxcIiB2YWx1ZXMgaGVsZCBieSBleG90aWNzIGxpa2UgcmVmLk9iamVjdC5cbiAgICovXG4gIHR5cGUgU3RhdGU8VD4gPSB7IFtQIGluIEZpZWxkPFQ+XTogRXhwb3J0PFRbUF0+IH07XG5cbiAgLyoqIE9iamVjdCBjb21wZXJhYmxlIHRvIGRhdGEgZm91bmQgaW4gVC4gKi9cbiAgdHlwZSBWYWx1ZXM8VD4gPSB7IFtQIGluIEZpZWxkPFQ+XT86IEV4cG9ydDxUW1BdPiB9O1xuXG4gIC8qKiBFeG90aWMgdmFsdWUsIHdoZXJlIGFjdHVhbCB2YWx1ZSBpcyBjb250YWluZWQgd2l0aGluLiAqL1xuICB0eXBlIFJlZjxUID0gYW55PiA9IHtcbiAgICAobmV4dDogVCk6IHZvaWQ7XG4gICAgY3VycmVudDogVCB8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBzdWJzY3JpYmVkIHRvIHBhcmVudCBhbmQgdXBkYXRlcyB3aGVuIGFjY2Vzc2VkIHByb3BlcnRpZXMgY2hhbmdlLlxuICAgKiBcbiAgICogQHBhcmFtIGN1cnJlbnQgLSBDdXJyZW50IHN0YXRlIG9mIHRoaXMgbW9kZWwuIFRoaXMgaXMgYSBwcm94eSB3aGljaCBkZXRlY3RzIHByb3BlcnRpZXMgd2hpY2hcbiAgICogd2hlcmUgYWNjZXNzZWQsIGFuZCB0aHVzIGRlcGVuZGVkIHVwb24gdG8gc3RheSBjdXJyZW50LlxuICAgKiBcbiAgICogQHBhcmFtIHVwZGF0ZSAtIFNldCBvZiBwcm9wZXJ0aWVzIHdoaWNoIGhhdmUgY2hhbmdlZCwgYW5kIGV2ZW50cyBmaXJlZCwgc2luY2UgbGFzdCB1cGRhdGUuXG4gICAqIFxuICAgKiBAcmV0dXJucyBBIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhpcyBlZmZlY3QgaXMgc3RhbGUuXG4gICAqL1xuICB0eXBlIEVmZmVjdDxUPiA9ICh0aGlzOiBULCBjdXJyZW50OiBULCB1cGRhdGU6IFNldDxFdmVudDxUPj4pID0+XG4gICAgRWZmZWN0Q2FsbGJhY2sgfCBQcm9taXNlPHZvaWQ+IHwgbnVsbCB8IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJuZWQgYnkgZWZmZWN0LiBXaWxsIGJlIGNhbGxlZCB3aGVuIGVmZmVjdCBpcyBzdGFsZS5cbiAgICogXG4gICAqIEBwYXJhbSB1cGRhdGUgLSBgdHJ1ZWAgaWYgdXBkYXRlIGlzIHBlbmRpbmcsIGBmYWxzZWAgZWZmZWN0IGhhcyBiZWVuIGNhbmNlbGxlZCwgYG51bGxgIGlmIG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIHR5cGUgRWZmZWN0Q2FsbGJhY2sgPSAoKHVwZGF0ZTogYm9vbGVhbiB8IG51bGwpID0+IHZvaWQpO1xuXG4gIC8qKlxuICAgKiBQcm9wZXJ0eSBpbml0aWFsaXplciwgd2lsbCBydW4gdXBvbiBpbnN0YW5jZSBjcmVhdGlvbi5cbiAgICogT3B0aW9uYWwgcmV0dXJuZWQgY2FsbGJhY2sgd2lsbCBydW4gd2hlbiBvbmNlIHVwb24gZmlyc3QgYWNjZXNzLlxuICAgKi9cbiAgdHlwZSBJbnN0cnVjdGlvbjxUID0gYW55LCBNIGV4dGVuZHMgTW9kZWwgPSBhbnk+ID1cbiAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBhbGxvdyBmb3IgbnVtYmVycy9zeW1ib2wgcHJvcGVydGllcz9cbiAgICAodGhpczogTSwga2V5OiBFeHRyYWN0PEZpZWxkPE0+LCBzdHJpbmc+LCB0aGlzQXJnOiBNLCBzdGF0ZTogU3RhdGU8TT4pID0+XG4gICAgICBEZXNjcmlwdG9yPFQ+IHwgKChzb3VyY2U6IE0pID0+IFQpIHwgdm9pZDtcblxuICB0eXBlIEdldHRlcjxUPiA9IChzb3VyY2U6IE1vZGVsKSA9PiBUO1xuICB0eXBlIFNldHRlcjxUPiA9ICh2YWx1ZTogVCwgcHJldmlvdXM6IFQpID0+IGJvb2xlYW4gfCB2b2lkIHwgKCgpID0+IFQpO1xuXG4gIHR5cGUgRGVzY3JpcHRvcjxUID0gYW55PiA9IHtcbiAgICBnZXQ/OiBHZXR0ZXI8VD4gfCBib29sZWFuO1xuICAgIHNldD86IFNldHRlcjxUPiB8IGJvb2xlYW47XG4gICAgZW51bWVyYWJsZT86IGJvb2xlYW47XG4gICAgdmFsdWU/OiBUO1xuICB9XG59XG5cbmludGVyZmFjZSBNb2RlbCB7XG4gIC8qKlxuICAgKiBMb29wYmFjayB0byBpbnN0YW5jZSBvZiB0aGlzIG1vZGVsLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGluIGEgc3Vic2NyaWJlZCBjb250ZXh0LFxuICAgKiB0byBrZWVwIHdyaXRlIGFjY2VzcyB0byBgdGhpc2AgYWZ0ZXIgYSBkZXN0cnVjdHVyZS4gWW91IGNhbiB1c2UgaXQgdG8gcmVhZCB2YXJpYWJsZXMgc2lsZW50bHkgYXMgd2VsbC5cbiAgICoqL1xuICBpczogdGhpcztcbn1cblxuYWJzdHJhY3QgY2xhc3MgTW9kZWwge1xuICBjb25zdHJ1Y3RvciguLi5hcmdzOiBNb2RlbC5BcmdzKXtcbiAgICBwcmVwYXJlKHRoaXMpO1xuICAgIGRlZmluZSh0aGlzLCBcImlzXCIsIHsgdmFsdWU6IHRoaXMgfSk7XG4gICAgaW5pdCh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWxsIGN1cnJlbnQgdmFsdWVzIGZyb20gc3RhdGUuIEZsYXR0ZW5zIGFsbCBtb2RlbHMgYW5kIGV4b3RpYyB2YWx1ZXMgcmVjdXJzaXZlbHkuXG4gICAqIFxuICAgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBhbGwgdmFsdWVzIGZyb20gdGhpcyBtb2RlbC5cbiAgICoqL1xuICBnZXQoKTogTW9kZWwuU3RhdGU8dGhpcz47XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgcnVuIGF1dG9tYXRpY2FsbHkgd2hlbiBhY2Nlc3NlZCB2YWx1ZXMgY2hhbmdlLlxuICAgKiBcbiAgICogQHBhcmFtIGVmZmVjdCBGdW5jdGlvbiB0byBydW4sIGFuZCBhZ2FpbiB3aGVuZXZlciBhY2Nlc3NlZCB2YWx1ZXMgY2hhbmdlLlxuICAgKiAgICAgICAgICAgICAgIElmIGVmZmVjdCByZXR1cm5zIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBjaGFuZ2Ugb2NjdXJzIChzeW5jcm9ub3VzbHkpLFxuICAgKiAgICAgICAgICAgICAgIGVmZmVjdCBpcyBjYW5jZWxsZWQsIG9yIHBhcmVudCBtb2RlbCBpcyBkZXN0cm95ZWQuXG4gICAqIEByZXR1cm5zIEZ1bmN0aW9uIHRvIGNhbmNlbCBsaXN0ZW5lci5cbiAgICovXG4gIGdldChlZmZlY3Q6IE1vZGVsLkVmZmVjdDx0aGlzPik6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEdldCB2YWx1ZSBvZiBhIHByb3BlcnR5LlxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IHRvIGdldCB2YWx1ZSBvZi5cbiAgICogQHBhcmFtIHJlcXVpcmVkIC0gSWYgdHJ1ZSwgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAcmV0dXJucyBWYWx1ZSBvZiBwcm9wZXJ0eS5cbiAgICovXG4gIGdldDxUIGV4dGVuZHMgTW9kZWwuRXZlbnQ8dGhpcz4+KGtleTogVCwgcmVxdWlyZWQ/OiBib29sZWFuKTogTW9kZWwuVmFsdWU8dGhpcywgVD47XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdoZW4gYSBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IHRvIHdhdGNoIGZvciB1cGRhdGVzLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gY2FuY2VsIGxpc3RlbmVyLlxuICAgKi9cbiAgZ2V0PFQgZXh0ZW5kcyBNb2RlbC5FdmVudDx0aGlzPj4oa2V5OiBULCBjYWxsYmFjazogTW9kZWwuT25VcGRhdGU8dGhpcywgVD4pOiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBtb2RlbCBpcyBleHBpcmVkLlxuICAgKiBcbiAgICogQHBhcmFtIHN0YXR1cyAtIGBudWxsYCB0byBjaGVjayBpZiBtb2RlbCBpcyBleHBpcmVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbW9kZWwgaXMgZXhwaXJlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBnZXQoc3RhdHVzOiBudWxsKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBtb2RlbCBpcyB0byBiZSBkZXN0cm95ZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKiBAcmV0dXJucyBGdW5jdGlvbiB0byBjYW5jZWwgbGlzdGVuZXIuXG4gICAqL1xuICBnZXQoc3RhdHVzOiBudWxsLCBjYWxsYmFjazogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XG5cbiAgZ2V0KGFyZzE/OiBNb2RlbC5FZmZlY3Q8dGhpcz4gfCBzdHJpbmcgfCBudWxsLCBhcmcyPzogYm9vbGVhbiB8IE1vZGVsLk9uVXBkYXRlPHRoaXMsIGFueT4pe1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzLmlzO1xuXG4gICAgaWYodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKXtcbiAgICAgIGxldCBwZW5kaW5nID0gbmV3IFNldDxNb2RlbC5FdmVudDx0aGlzPj4oKTtcblxuICAgICAgcmV0dXJuIGNyZWF0ZUVmZmVjdChzZWxmLCAocHJveHkpID0+IHtcbiAgICAgICAgY29uc3QgY2IgPSBhcmcxLmNhbGwocHJveHksIHByb3h5LCBwZW5kaW5nKTtcblxuICAgICAgICByZXR1cm4gY2IgPT09IG51bGwgPyBudWxsIDogKCh1cGRhdGUpID0+IHtcbiAgICAgICAgICBwZW5kaW5nID0gUEVORElOR19LRVlTLmdldChzZWxmKSE7XG4gICAgICAgICAgaWYodHlwZW9mIGNiID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIGNiKHVwZGF0ZSk7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgYXJnMSA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgc25hcHNob3Qoc2VsZikgOlxuICAgICAgICB0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIgP1xuICAgICAgICAgIGFkZExpc3RlbmVyKHNlbGYsIGFyZzIsIGFyZzEpIDpcbiAgICAgICAgICBhcmcxID09PSBudWxsID9cbiAgICAgICAgICAgIE9iamVjdC5pc0Zyb3plbihTVEFURS5nZXQoc2VsZikpIDpcbiAgICAgICAgICAgIGZldGNoKHNlbGYsIGFyZzEsIGFyZzIpXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1cGRhdGUgaW4gcHJvZ3Jlc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb2JqZWN0IHdpdGggdXBkYXRlZCB2YWx1ZXMsIGB1bmRlZmluZWRgIGlmIHRoZXJlIG5vIHVwZGF0ZSBpcyBwZW5kaW5nLlxuICAgKiovXG4gIHNldCgpOiBQcm9taXNlTGlrZTxNb2RlbC5FdmVudDx0aGlzPltdPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVXBkYXRlIG11bGl0cGxlIHByb3BlcnRpZXMgYXQgb25jZS4gTWVyZ2VzIGFyZ3VtZW50IHdpdGggY3VycmVudCBzdGF0ZS5cbiAgICogUHJvcGVydGllcyB3aGljaCBhcmUgbm90IG1hbmFnZWQgYnkgdGhpcyBtb2RlbCB3aWxsIGJlIGlnbm9yZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gYXNzaWduIC0gT2JqZWN0IHdpdGggcHJvcGVydGllcyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSBzaWxlbnQgLSBJZiBhbiB1cGRhdGUgZG9lcyBvY2N1ciwgbGlzdGVuZXJzIHdpbGwgbm90IGJlIHJlZnJlc2hlZCBhdXRvbWF0aWNhbGx5LlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyBhbiBhcnJheSBvZiBrZXlzIHVwZGF0ZWQsIGB1bmRlZmluZWRgIChpbW1lZGlhdGVseSkgaWYgYSBub29wLlxuICAgKi9cbiAgc2V0KGFzc2lnbj86IE1vZGVsLkFzc2lnbjx0aGlzPiwgc2lsZW50PzogYm9vbGVhbik6IFByb21pc2VMaWtlPE1vZGVsLkV2ZW50PHRoaXM+W10+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBQdXNoIGFuIHVwZGF0ZS4gVGhpcyB3aWxsIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFzc29jaWF0ZWQgcHJvcGVydHkuXG4gICAqIFxuICAgKiBVc2VmdWwgd2hlcmUgYSBwcm9wZXJ0eSB2YWx1ZSBpbnRlcm5hbGx5IGhhcyBjaGFuZ2VkLCBidXQgdGhlIG9iamVjdCBpcyB0aGUgc2FtZS5cbiAgICogRm9yIGV4YW1wbGU6IEFuIGFycmF5IGhhcyBwdXNoZWQgYSBuZXcgdmFsdWUsIG9yIGEgbmVzdGVkIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIFxuICAgKiBZb3UgY2FuIGFsc28gdXNlIHRoaXMgdG8gZGlzcGF0Y2ggYXJiaXRyYXJ5IGV2ZW50cy5cbiAgICogU3ltYm9scyBhcmUgcmVjb21tZW5kZWQgYXMgbm9uLXByb3BlcnR5IGV2ZW50cywgaG93ZXZlciB5b3UgY2FuIHVzZSBhbnkgc3RyaW5nLlxuICAgKiBJZiBkb2luZyBzbywgYmUgc3VyZSB0byBhdm9pZCBjb2xsaXNpb25zIHdpdGggcHJvcGVydHkgbmFtZXMhIEFuIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXNcbiAgICogdG8gcHJlZml4IGFuIGV2ZW50IHdpdGggXCIhXCIgYW5kL29yIHVzZSBkYXNoLWNhc2UuIGUuZy4gYHNldChcIiFldmVudFwiKWAgb3IgYHNldChcIm15LWV2ZW50XCIpYC5cbiAgICogXG4gICAqIEBwYXJhbSBrZXkgLSBQcm9wZXJ0eSBvciBldmVudCB0byBkaXNwYXRjaC5cbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBhbiBhcnJheSBvZiBrZXlzIHVwZGF0ZWQuXG4gICAqL1xuICBzZXQoa2V5OiBNb2RlbC5FdmVudDx0aGlzPik6IFByb21pc2VMaWtlPE1vZGVsLkV2ZW50PHRoaXM+W10+O1xuXG4gIC8qKlxuICAgKiBDYWxsIGEgZnVuY3Rpb24gd2hlbiB1cGRhdGUgb2NjdXJzLlxuICAgKiBcbiAgICogR2l2ZW4gZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBldmVyeSBhc3NpZ25tZW50ICh3aGljaCBjaGFuZ2VzIHZhbHVlKSBvciBleHBsaWNpdCBgc2V0YC5cbiAgICogXG4gICAqIFRvIHJ1biBsb2dpYyBvbiBmaW5hbCB2YWx1ZSBvbmx5LCBjYWxsYmFjayBtYXkgcmV0dXJuIGEgZnVuY3Rpb24uIFVzaW5nIHRoZSBzYW1lXG4gICAqIGZ1bmN0aW9uIGZvciBvbmUgb3IgbW9yZSBldmVudHMgd2lsbCBlbnN1cmUgaXQgaXMgY2FsbGVkIG9ubHkgd2hlbiBldmVudHMgYXJlIHNldHRsZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdXBkYXRlIG9jY3Vycy5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gcmVtb3ZlIGxpc3RlbmVyLiBXaWxsIHJldHVybiBgdHJ1ZWAgaWYgcmVtb3ZlZCwgYGZhbHNlYCBpZiBpbmFjdGl2ZSBhbHJlYWR5LlxuICAgKiBcbiAgKi9cbiAgc2V0KGNhbGxiYWNrOiBNb2RlbC5PbkV2ZW50PHRoaXM+KTogKCkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2FsbCBhIGZ1bmN0aW9uIHdoZW4gYSBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBVbmxpa2UgYGdldGAsIHRoaXMgY2Fsc2wgc3luY2hyb25vdXNseSBhbmQgd2lsbCBmaXJlIGFzIG1hbnkgdGltZXMgYXMgdGhlIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgdG8gd2F0Y2ggZm9yIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKi9cbiAgc2V0KGtleTogTW9kZWwuRXZlbnQ8dGhpcz4gfCBudWxsLCBjYWxsYmFjazogTW9kZWwuT25FdmVudDx0aGlzPik6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlY2xhcmUgYW4gZW5kIHRvIHVwZGF0ZXMuIFRoaXMgZXZlbnQgaXMgZmluYWwgYW5kIHdpbGwgZnJlZXplIHN0YXRlLlxuICAgKiBUaGlzIGV2ZW50IGNhbiBiZSB3YXRjaGVkIGZvciBhcyB3ZWxsLCB0byBydW4gY2xlYW51cCBsb2dpYyBhbmQgaW50ZXJuYWxseSB3aWxsIHJlbW92ZSBhbGwgbGlzdGVuZXJzLlxuICAgKiBcbiAgICogQHBhcmFtIHN0YXR1cyAtIGBudWxsYCB0byBlbmQgdXBkYXRlcy5cbiAgICovXG4gIHNldChzdGF0dXM6IG51bGwpOiB2b2lkO1xuXG4gIHNldChcbiAgICBhcmcxPzogTW9kZWwuT25FdmVudDx0aGlzPiB8IE1vZGVsLkFzc2lnbjx0aGlzPiB8IE1vZGVsLkV2ZW50PHRoaXM+IHwgbnVsbCxcbiAgICBhcmcyPzogYm9vbGVhbiB8IE1vZGVsLk9uRXZlbnQ8dGhpcz4pe1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXMuaXM7XG5cbiAgICBpZih0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwga2V5ID0+IHtcbiAgICAgICAgaWYodHlwZW9mIGtleSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgIHJldHVybiBhcmcxLmNhbGwoc2VsZiwga2V5LCBzZWxmKTtcbiAgICAgIH0pXG4gICAgICBcbiAgICBpZih0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwga2V5ID0+IHtcbiAgICAgICAgaWYoa2V5ID09PSBhcmcxKVxuICAgICAgICAgIHJldHVybiBhcmcyLmNhbGwoc2VsZiwga2V5LCBzZWxmKTtcbiAgICAgIH0pO1xuXG4gICAgaWYoYXJnMSAmJiB0eXBlb2YgYXJnMSA9PSBcIm9iamVjdFwiKXtcbiAgICAgIGNvbnN0IG1ldGhvZHMgPSBNRVRIT0RTLmdldChzZWxmLmNvbnN0cnVjdG9yIGFzIE1vZGVsLlR5cGUpITtcbiAgICBcbiAgICAgIGZvcihjb25zdCBrZXkgaW4gYXJnMSl7XG4gICAgICAgIGNvbnN0IGJpbmQgPSBtZXRob2RzLmdldChrZXkpO1xuICAgICAgICBpZihiaW5kKVxuICAgICAgICAgIGJpbmQuY2FsbChzZWxmLCBhcmcxW2tleV0pO1xuICAgICAgICBlbHNlIGlmKGtleSBpbiBzZWxmKVxuICAgICAgICAgIGlmKGFyZzIgPT09IHRydWUgfHwgIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc2VsZiwga2V5KT8uc2V0KVxuICAgICAgICAgICAgdXBkYXRlKHNlbGYsIGtleSwgYXJnMVtrZXldLCBhcmcyID09PSB0cnVlKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAoc2VsZiBhcyBhbnkpW2tleV0gPSBhcmcxW2tleV07XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2VcbiAgICAgIGV2ZW50KHNlbGYsIGFyZzEpO1xuXG4gICAgcmV0dXJuIHBlbmRpbmcoc2VsZik7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSBvdmVyIG1hbmFnZWQgcHJvcGVydGllcyBpbiB0aGlzIGluc3RhbmNlIG9mIE1vZGVsLlxuICAgKiBZZWlsZHMgdGhlIGtleSBhbmQgY3VycmVudCB2YWx1ZSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICovXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhdG9yPFtzdHJpbmcsIHVua25vd25dPiB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKFNUQVRFLmdldCh0aGlzLmlzKSEpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIGFjdGl2YXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgbW9kZWwuXG4gICAqIFxuICAgKiAqKkltcG9ydGFudCoqIC0gVW5saWtlIGBuZXcgdGhpcyguLi4pYCAtIHRoaXMgbWV0aG9kIGFsc28gYWN0aXZhdGVzIHN0YXRlLlxuICAgKiBcbiAgICogQHBhcmFtIGFyZ3MgLSBhcmd1bWVudHMgc2VudCB0byBjb25zdHJ1Y3RvclxuICAgKi9cbiAgc3RhdGljIG5ldzxUIGV4dGVuZHMgTW9kZWw+KHRoaXM6IE1vZGVsLkluaXQ8VD4sIC4uLmFyZ3M6IE1vZGVsLkFyZ3M8VD4pe1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgZXZlbnQoaW5zdGFuY2UpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgZXF1aXZhbGVudCBvZiBgeCBpbnN0YW5jZW9mIHRoaXNgLlxuICAgKiBEZXRlcm1pbmVzIGlmIHByb3ZpZGVkIGNsYXNzIGlzIGEgc3VidHlwZSBvZiB0aGlzIG9uZS5cbiAgICogSWYgc28sIGxhbmd1YWdlIHNlcnZlciB3aWxsIG1ha2UgYXZhaWxhYmxlIGFsbCBzdGF0aWNcbiAgICogbWV0aG9kcyBhbmQgcHJvcGVydGllcyBvZiB0aGlzIGNsYXNzLlxuICAgKi9cbiAgc3RhdGljIGlzPFQgZXh0ZW5kcyBNb2RlbC5UeXBlPih0aGlzOiBULCBtYXliZTogdW5rbm93bik6IG1heWJlIGlzIFQge1xuICAgIHJldHVybiBtYXliZSA9PT0gdGhpcyB8fCB0eXBlb2YgbWF5YmUgPT0gXCJmdW5jdGlvblwiICYmIG1heWJlLnByb3RvdHlwZSBpbnN0YW5jZW9mIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBydW4gd2hlbiBhbnkgaW5zdGFuY2Ugb2YgdGhpcyBNb2RlbCBpcyB1cGRhdGVkLiBcbiAgICovXG4gIHN0YXRpYyBvbjxUIGV4dGVuZHMgTW9kZWw+KHRoaXM6IE1vZGVsLlR5cGU8VD4sIGxpc3RlbmVyOiBNb2RlbC5PbkV2ZW50PFQ+KXtcbiAgICBsZXQgbm90aWZ5ID0gTk9USUZZLmdldCh0aGlzKTtcblxuICAgIGlmKCFub3RpZnkpXG4gICAgICBOT1RJRlkuc2V0KHRoaXMsIG5vdGlmeSA9IG5ldyBTZXQpO1xuXG4gICAgbm90aWZ5LmFkZChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gKCkgPT4gbm90aWZ5LmRlbGV0ZShsaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVmaW5lKE1vZGVsLnByb3RvdHlwZSwgXCJ0b1N0cmluZ1wiLCB7XG4gIHZhbHVlKCl7XG4gICAgcmV0dXJuIElELmdldCh0aGlzLmlzKTtcbiAgfVxufSk7XG5cbmRlZmluZShNb2RlbCwgXCJ0b1N0cmluZ1wiLCB7XG4gIHZhbHVlKCl7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxufSk7XG5cbi8qKiBBcHBseSBpbnN0cnVjdGlvbnMgYW5kIGluaGVyaXRlZCBldmVudCBsaXN0ZW5lcnMuIEVuc3VyZSBjbGFzcyBtZXRhZGF0YSBpcyByZWFkeS4gKi9cbmZ1bmN0aW9uIHByZXBhcmUobW9kZWw6IE1vZGVsKXtcbiAgbGV0IFQgPSBtb2RlbC5jb25zdHJ1Y3RvciBhcyBNb2RlbC5UeXBlO1xuXG4gIGlmKFQgPT09IE1vZGVsKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjcmVhdGUgYmFzZSBNb2RlbC5cIik7XG5cbiAgY29uc3QgY2hhaW4gPSBbXSBhcyBNb2RlbC5UeXBlW107XG4gIGxldCBrZXlzID0gbmV3IE1hcDxzdHJpbmcsICh2YWx1ZTogYW55KSA9PiB2b2lkPigpO1xuXG4gIElELnNldChtb2RlbCwgYCR7VH0tJHt1aWQoKX1gKTtcblxuICB3aGlsZShULm5hbWUpe1xuICAgIGZvcihjb25zdCBjYiBvZiBOT1RJRlkuZ2V0KFQpIHx8IFtdKVxuICAgICAgYWRkTGlzdGVuZXIobW9kZWwsIGNiKTtcblxuICAgIGlmKFQgPT09IE1vZGVsKSBicmVhaztcbiAgICBlbHNlIGNoYWluLnVuc2hpZnQoVCk7XG5cbiAgICBUID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKFQpXG4gIH1cblxuICBmb3IoY29uc3QgdHlwZSBvZiBjaGFpbil7XG4gICAgaWYoTUVUSE9EUy5oYXModHlwZSkpe1xuICAgICAga2V5cyA9IE1FVEhPRFMuZ2V0KHR5cGUpITtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIE1FVEhPRFMuc2V0KHR5cGUsIGtleXMgPSBuZXcgTWFwKGtleXMpKTtcblxuICAgIGZvcihjb25zdCBba2V5LCB7IHZhbHVlIH1dIG9mIE9iamVjdC5lbnRyaWVzKFxuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModHlwZS5wcm90b3R5cGUpXG4gICAgKSl7XG4gICAgICBpZighdmFsdWUgfHwga2V5ID09IFwiY29uc3RydWN0b3JcIilcbiAgICAgICAgY29udGludWU7XG4gICAgICBcbiAgICAgIGZ1bmN0aW9uIGJpbmQodGhpczogTW9kZWwsIG1ldGhvZCA9IHZhbHVlKXtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBtZXRob2QuYmluZCh0aGlzLmlzKTtcbiAgICAgICAgXG4gICAgICAgIE1FVEhPRC5zZXQodmFsdWUsIG1ldGhvZCk7XG4gICAgICAgIGRlZmluZSh0aGlzLmlzLCBrZXksIHsgdmFsdWUsIHdyaXRhYmxlOiB0cnVlIH0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBrZXlzLnNldChrZXksIGJpbmQpO1xuICAgICAgZGVmaW5lKHR5cGUucHJvdG90eXBlLCBrZXksIHsgZ2V0OiBiaW5kLCBzZXQ6IGJpbmQgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQXBwbHkgbW9kZWwgYXJndWVtbnRzLCBydW4gY2FsbGJhY2tzIGFuZCBvYnNlcnZlIHByb3BlcnRpZXMuXG4gKiBBY2N1bXVsYXRlIGFuZCBoYW5kbGUgY2xlYW51cCBldmVudHMuXG4gKiovXG5mdW5jdGlvbiBpbml0KG1vZGVsOiBNb2RlbCwgYXJnczogTW9kZWwuQXJncyl7XG4gIGNvbnN0IG1ldGhvZHMgPSBNRVRIT0RTLmdldChtb2RlbC5jb25zdHJ1Y3RvciBhcyBNb2RlbC5UeXBlKSE7XG4gIGNvbnN0IHN0YXRlID0ge30gYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdW5rbm93bj47XG5cbiAgU1RBVEUuc2V0KG1vZGVsLCBzdGF0ZSk7XG5cbiAgYXJncyA9IGFyZ3MuZmxhdCgpLmZpbHRlcihhcmcgPT4ge1xuICAgIGlmKHR5cGVvZiBhcmcgIT0gXCJzdHJpbmdcIilcbiAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgSUQuc2V0KG1vZGVsLCBhcmcpO1xuICB9KTtcblxuICBhZGRMaXN0ZW5lcihtb2RlbCwgKCkgPT4ge1xuICAgIGlmKCFQQVJFTlQuaGFzKG1vZGVsKSlcbiAgICAgIFBBUkVOVC5zZXQobW9kZWwsIG51bGwpO1xuICAgIFxuICAgIGFyZ3MuZm9yRWFjaCgoYXJnKSA9PiB7XG4gICAgICBjb25zdCB1c2UgPSB0eXBlb2YgYXJnID09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IGFyZy5jYWxsKG1vZGVsLCBtb2RlbClcbiAgICAgICAgOiBhcmcgYXMgTW9kZWwuQXNzaWduPE1vZGVsPjtcblxuICAgICAgaWYodXNlIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgdXNlLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgQXN5bmMgZXJyb3IgaW4gY29uc3RydWN0b3IgZm9yICR7bW9kZWx9OmApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICBlbHNlIGlmKHR5cGVvZiB1c2UgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBhZGRMaXN0ZW5lcihtb2RlbCwgdXNlLCBudWxsKVxuICAgICAgZWxzZSBpZih0eXBlb2YgdXNlID09IFwib2JqZWN0XCIpXG4gICAgICAgIGZvcihjb25zdCBrZXkgaW4gdXNlKVxuICAgICAgICAgIGlmKGtleSBpbiBtb2RlbCB8fCBtZXRob2RzLmhhcyhrZXkpKVxuICAgICAgICAgICAgbW9kZWxba2V5IGFzIGtleW9mIE1vZGVsXSA9IHVzZVtrZXldIGFzIGFueTtcbiAgICB9KTtcblxuICAgIGZvcihjb25zdCBrZXkgaW4gbW9kZWwpe1xuICAgICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobW9kZWwsIGtleSkhO1xuXG4gICAgICBpZihcInZhbHVlXCIgaW4gZGVzYyl7XG4gICAgICAgIHVwZGF0ZShtb2RlbCwga2V5LCBkZXNjLnZhbHVlLCB0cnVlKTtcbiAgICAgICAgZGVmaW5lKG1vZGVsLCBrZXksIHtcbiAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgIGdldCgpe1xuICAgICAgICAgICAgcmV0dXJuIHdhdGNoKHRoaXMsIGtleSwgc3RhdGVba2V5XSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQodmFsdWUpe1xuICAgICAgICAgICAgdXBkYXRlKG1vZGVsLCBrZXksIHZhbHVlKTtcbiAgICAgICAgICAgIG1heUFkb3B0KG1vZGVsLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRMaXN0ZW5lcihtb2RlbCwgKCkgPT4ge1xuICAgICAgZm9yKGNvbnN0IFtfLCB2YWx1ZV0gb2YgbW9kZWwpXG4gICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgTW9kZWwgJiYgUEFSRU5ULmdldCh2YWx1ZSkgPT09IG1vZGVsKVxuICAgICAgICAgIHZhbHVlLnNldChudWxsKTtcbiAgXG4gICAgICBPYmplY3QuZnJlZXplKHN0YXRlKTtcbiAgICB9LCBudWxsKTtcbiAgXG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtYXlBZG9wdChwYXJlbnQ6IE1vZGVsLCBjaGlsZDogdW5rbm93bil7XG4gIGlmKGNoaWxkIGluc3RhbmNlb2YgTW9kZWwgJiYgIVBBUkVOVC5oYXMoY2hpbGQpKXtcbiAgICBQQVJFTlQuc2V0KGNoaWxkLCBwYXJlbnQpO1xuICAgIGV2ZW50KGNoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmZXRjaChzdWJqZWN0OiBNb2RlbCwgcHJvcGVydHk6IHN0cmluZywgcmVxdWlyZWQ/OiBib29sZWFuKXtcbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuICBcbiAgaWYocHJvcGVydHkgaW4gc3RhdGUgfHwgcmVxdWlyZWQgPT09IGZhbHNlKXtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YXRlW3Byb3BlcnR5XTtcblxuICAgIGlmKHZhbHVlICE9PSB1bmRlZmluZWQgfHwgIXJlcXVpcmVkKVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYCR7c3ViamVjdH0uJHtwcm9wZXJ0eX0gaXMgbm90IHlldCBhdmFpbGFibGUuYCk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBhZGRMaXN0ZW5lcihzdWJqZWN0LCBrZXkgPT4ge1xuICAgICAgaWYoa2V5ID09PSBwcm9wZXJ0eSl7XG4gICAgICAgIHJlc29sdmUoc3RhdGVba2V5XSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZihrZXkgPT09IG51bGwpXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYCR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhyb3cgT2JqZWN0LmFzc2lnbihwcm9taXNlLCB7XG4gICAgdG9TdHJpbmc6ICgpID0+IFN0cmluZyhlcnJvciksXG4gICAgbmFtZTogXCJTdXNwZW5zZVwiLFxuICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgc3RhY2s6IGVycm9yLnN0YWNrXG4gIH0pO1xufVxuXG4vKiogQ3VycmVudGx5IGFjY3VtdWxhdGluZyBleHBvcnQuIFN0b3JlcyByZWFsIHZhbHVlcyBvZiBwbGFjZWhvbGRlciBwcm9wZXJ0aWVzIHN1Y2ggYXMgcmVmKCkgb3IgY2hpbGQgbW9kZWxzLiAqL1xubGV0IEVYUE9SVDogTWFwPGFueSwgYW55PiB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gc25hcHNob3Q8VCBleHRlbmRzIE1vZGVsPihtb2RlbDogVCk6IE1vZGVsLlN0YXRlPFQ+IHtcbiAgY29uc3QgdmFsdWVzID0ge30gYXMgYW55O1xuICBsZXQgaXNOb3RSZWN1cnNpdmU7XG5cbiAgaWYoIUVYUE9SVCl7XG4gICAgaXNOb3RSZWN1cnNpdmUgPSB0cnVlO1xuICAgIEVYUE9SVCA9IG5ldyBNYXAoW1ttb2RlbCwgdmFsdWVzXV0pO1xuICB9XG5cbiAgZm9yKGxldCBba2V5LCB2YWx1ZV0gb2YgbW9kZWwpe1xuICAgIGlmKEVYUE9SVC5oYXModmFsdWUpKVxuICAgICAgdmFsdWUgPSBFWFBPUlQuZ2V0KHZhbHVlKTtcbiAgICBlbHNlIGlmKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIFwiZ2V0XCIgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmdldCA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgRVhQT1JULnNldCh2YWx1ZSwgdmFsdWUgPSB2YWx1ZS5nZXQoKSk7XG5cbiAgICB2YWx1ZXNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgaWYoaXNOb3RSZWN1cnNpdmUpXG4gICAgRVhQT1JUID0gdW5kZWZpbmVkO1xuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZTxUPihcbiAgc3ViamVjdDogTW9kZWwsXG4gIGtleTogc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLFxuICB2YWx1ZTogVCxcbiAgYXJnPzogYm9vbGVhbiB8IE1vZGVsLlNldHRlcjxUPil7XG5cbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuXG4gIGlmKE9iamVjdC5pc0Zyb3plbihzdGF0ZSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byB1cGRhdGUgJHtTdHJpbmcoa2V5KX0gYnV0ICR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApO1xuXG4gIGNvbnN0IHByZXZpb3VzID0gc3RhdGVba2V5XSBhcyBUO1xuXG4gIGlmKHR5cGVvZiBhcmcgPT0gXCJmdW5jdGlvblwiKXtcbiAgICBjb25zdCBvdXQgPSBhcmcuY2FsbChzdWJqZWN0LCB2YWx1ZSwgcHJldmlvdXMpO1xuXG4gICAgaWYob3V0ID09PSBmYWxzZSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGlmKHR5cGVvZiBvdXQgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgdmFsdWUgPSBvdXQoKTtcbiAgfVxuXG4gIGlmKHZhbHVlID09PSBwcmV2aW91cylcbiAgICByZXR1cm47XG5cbiAgc3RhdGVba2V5XSA9IHZhbHVlO1xuXG4gIGlmKGFyZyAhPT0gdHJ1ZSlcbiAgICBldmVudChzdWJqZWN0LCBrZXkpO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogUmFuZG9tIGFscGhhbnVtYmVyaWMgb2YgbGVuZ3RoIDY7IGFsd2F5cyBzdGFydHMgd2l0aCBhIGxldHRlci4gKi9cbmZ1bmN0aW9uIHVpZCgpe1xuICByZXR1cm4gKDAuMjc4ICsgTWF0aC5yYW5kb20oKSAqIDAuNzIyKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDgpLnRvVXBwZXJDYXNlKCk7XG59XG5cbmV4cG9ydCB7XG4gIGV2ZW50LFxuICBmZXRjaCxcbiAgbWF5QWRvcHQsXG4gIE1FVEhPRCxcbiAgTW9kZWwsXG4gIFBBUkVOVCxcbiAgU1RBVEUs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
|
|
278
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL21vZGVsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBhZGRMaXN0ZW5lciwgY3JlYXRlRWZmZWN0LCBldmVudCwgT25VcGRhdGUsIHBlbmRpbmcsIFBFTkRJTkdfS0VZUywgd2F0Y2ggfSBmcm9tICcuL2NvbnRyb2wnO1xuXG5jb25zdCBkZWZpbmUgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbi8qKiBSZWdpc3RlciBmb3IgYWxsIGFjdGl2ZSBtb2RlbHMgdmlhIHN0cmluZyBpZGVudGlmaWVycyAodXN1YWxseSB1bmlxdWUpLiAqL1xuY29uc3QgSUQgPSBuZXcgV2Vha01hcDxNb2RlbCwgc3RyaW5nPigpO1xuXG4vKiogSW50ZXJuYWwgc3RhdGUgYXNzaWduZWQgdG8gbW9kZWxzLiAqL1xuY29uc3QgU1RBVEUgPSBuZXcgV2Vha01hcDxNb2RlbCwgUmVjb3JkPHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCwgdW5rbm93bj4+KCk7XG5cbi8qKiBFeHRlcm5hbCBsaXN0ZW5lcnMgZm9yIGFueSBnaXZlbiBNb2RlbC4gKi9cbmNvbnN0IE5PVElGWSA9IG5ldyBXZWFrTWFwPE1vZGVsLlR5cGUsIFNldDxPblVwZGF0ZT4+KCk7XG5cbi8qKiBQYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcy4gKi9cbmNvbnN0IFBBUkVOVCA9IG5ldyBXZWFrTWFwPE1vZGVsLCBNb2RlbCB8IG51bGw+KCk7XG5cbi8qKiBMaXN0IG9mIG1ldGhvZHMgZGVmaW5lZCBieSBhIGdpdmVuIHR5cGUuICovXG5jb25zdCBNRVRIT0RTID0gbmV3IFdlYWtNYXA8TW9kZWwuVHlwZSwgTWFwPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IHZvaWQ+PigpO1xuXG4vKiogUmVmZXJlbmNlIGJvdW5kIGluc3RhbmNlIG1ldGhvZHMgdG8gcmVhbCBvbmVzLiAqL1xuY29uc3QgTUVUSE9EID0gbmV3IFdlYWtNYXA8YW55LCBhbnk+KCk7XG5cbmRlY2xhcmUgbmFtZXNwYWNlIE1vZGVsIHtcbiAgLyoqIEFueSB0eXBlIG9mIE1vZGVsLCB1c2luZyBvd24gY2xhc3MgY29uc3RydWN0b3IgYXMgaXRzIGlkZW50aWZpZXIuICovXG4gIHR5cGUgVHlwZTxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPVxuICAgIChhYnN0cmFjdCBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBUKSAmIHR5cGVvZiBNb2RlbDtcblxuICAvKiogQSBNb2RlbCBjb25zdHJ1Y3RvciwgYnV0IHdoaWNoIGlzIG5vdCBhYnN0cmFjdC4gKi9cbiAgdHlwZSBJbml0PFQgZXh0ZW5kcyBNb2RlbCA9IE1vZGVsPiA9XG4gICAgKG5ldyAoLi4uYXJnczogTW9kZWwuQXJnczxUPikgPT4gVCkgJiBPbWl0PHR5cGVvZiBNb2RlbCwgbmV2ZXI+O1xuXG4gIC8qKlxuICAgKiBNb2RlbCBjb25zdHJ1Y3RvciBjYWxsYmFjayAtIGlzIGNhbGxlZCB3aGVuIE1vZGVsIGZpbmlzaGVzIGludGlhbGl6aW5nLlxuICAgKiBSZXR1cm5lZCBmdW5jdGlvbiB3aWxsIHJ1biB3aGVuIG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIHR5cGUgQ2FsbGJhY2s8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID1cbiAgICAodGhpczogVCwgdGhpc0FyZzogVCkgPT4gUHJvbWlzZTx2b2lkPiB8ICgoKSA9PiB2b2lkKSB8IEFzc2lnbjxUPiB8IHZvaWQ7XG5cbiAgLyoqIE1vZGVsIGNvbnN0cnVjdG9yIGFyZ3VtZW50ICovXG4gIHR5cGUgQXJndW1lbnQ8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID0gQXNzaWduPFQ+IHwgQ2FsbGJhY2s8VD4gfCBzdHJpbmcgfCB2b2lkO1xuXG4gIC8qKiBNb2RlbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMgKi9cbiAgdHlwZSBBcmdzPFQgZXh0ZW5kcyBNb2RlbCA9IGFueT4gPSAoQXJndW1lbnQ8VD4gfCBBcmdzPFQ+KVtdO1xuXG4gIC8qKiBTdWJzZXQgb2YgYGtleW9mIFRgIHdoaWNoIGFyZSBub3QgbWV0aG9kcyBvciBkZWZpbmVkIGJ5IGJhc2UgTW9kZWwgVS4gKiovXG4gIHR5cGUgRmllbGQ8VD4gPSBFeGNsdWRlPGtleW9mIFQsIGtleW9mIE1vZGVsPjtcblxuICAvKiogQW55IHZhbGlkIGtleSBmb3IgbW9kZWwsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gRmllbGQ8VD4uICovXG4gIHR5cGUgRXZlbnQ8VD4gPSBGaWVsZDxUPiB8IChzdHJpbmcgJiB7fSkgfCBudW1iZXIgfCBzeW1ib2w7XG5cbiAgLyoqIE9iamVjdCBvdmVybGF5IHRvIG92ZXJyaWRlIHZhbHVlcyBhbmQgbWV0aG9kcyBvbiBhIG1vZGVsLiAqL1xuICB0eXBlIEFzc2lnbjxUPiA9IHtcbiAgICBbSyBpbiBGaWVsZDxUPl0/OlxuICAgICAgVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIFxuICAgICAgICA/ICh0aGlzOiBULCAuLi5hcmdzOiBBKSA9PiBSXG4gICAgICAgIDogVFtLXTtcbiAgfSAmIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8qKiBFeHBvcnQvSW1wb3J0IGNvbXBhdGlibGUgdmFsdWUgZm9yIGEgZ2l2ZW4gcHJvcGVydHkgaW4gYSBNb2RlbC4gKi9cbiAgdHlwZSBFeHBvcnQ8Uj4gPSBSIGV4dGVuZHMgeyBnZXQoKTogaW5mZXIgVCB9ID8gVCA6IFI7XG5cbiAgLyoqIFZhbHVlIGZvciBhIHByb3BlcnR5IG1hbmFnZWQgYnkgYSBtb2RlbC4gKi9cbiAgdHlwZSBWYWx1ZTxUIGV4dGVuZHMgTW9kZWwsIEsgZXh0ZW5kcyBFdmVudDxUPj4gPVxuICAgIEsgZXh0ZW5kcyBrZXlvZiBUID8gRXhwb3J0PFRbS10+IDogdW5rbm93bjtcblxuICB0eXBlIE9uRXZlbnQ8VCBleHRlbmRzIE1vZGVsPiA9XG4gICAgKHRoaXM6IFQsIGtleTogdW5rbm93biwgc291cmNlOiBUKSA9PiAoKCkgPT4gdm9pZCkgfCB2b2lkIHwgbnVsbDtcblxuICB0eXBlIE9uVXBkYXRlPFQgZXh0ZW5kcyBNb2RlbCwgSyBleHRlbmRzIEV2ZW50PFQ+PiA9XG4gICAgKHRoaXM6IFQsIGtleTogSywgdGhpc0FyZzogSykgPT4gdm9pZDtcblxuICAvKipcbiAgICogVmFsdWVzIGZyb20gY3VycmVudCBzdGF0ZSBvZiBnaXZlbiBtb2RlbC5cbiAgICogRGlmZmVycyBmcm9tIGBWYWx1ZXNgIGFzIHZhbHVlcyBoZXJlIHdpbGwgZHJpbGxcbiAgICogaW50byBcInJlYWxcIiB2YWx1ZXMgaGVsZCBieSBleG90aWNzIGxpa2UgcmVmLk9iamVjdC5cbiAgICovXG4gIHR5cGUgU3RhdGU8VD4gPSB7IFtQIGluIEZpZWxkPFQ+XTogRXhwb3J0PFRbUF0+IH07XG5cbiAgLyoqIE9iamVjdCBjb21wZXJhYmxlIHRvIGRhdGEgZm91bmQgaW4gVC4gKi9cbiAgdHlwZSBWYWx1ZXM8VD4gPSB7IFtQIGluIEZpZWxkPFQ+XT86IEV4cG9ydDxUW1BdPiB9O1xuXG4gIC8qKiBFeG90aWMgdmFsdWUsIHdoZXJlIGFjdHVhbCB2YWx1ZSBpcyBjb250YWluZWQgd2l0aGluLiAqL1xuICB0eXBlIFJlZjxUID0gYW55PiA9IHtcbiAgICAobmV4dDogVCk6IHZvaWQ7XG4gICAgY3VycmVudDogVCB8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBzdWJzY3JpYmVkIHRvIHBhcmVudCBhbmQgdXBkYXRlcyB3aGVuIGFjY2Vzc2VkIHByb3BlcnRpZXMgY2hhbmdlLlxuICAgKiBcbiAgICogQHBhcmFtIGN1cnJlbnQgLSBDdXJyZW50IHN0YXRlIG9mIHRoaXMgbW9kZWwuIFRoaXMgaXMgYSBwcm94eSB3aGljaCBkZXRlY3RzIHByb3BlcnRpZXMgd2hpY2hcbiAgICogd2hlcmUgYWNjZXNzZWQsIGFuZCB0aHVzIGRlcGVuZGVkIHVwb24gdG8gc3RheSBjdXJyZW50LlxuICAgKiBcbiAgICogQHBhcmFtIHVwZGF0ZSAtIFNldCBvZiBwcm9wZXJ0aWVzIHdoaWNoIGhhdmUgY2hhbmdlZCwgYW5kIGV2ZW50cyBmaXJlZCwgc2luY2UgbGFzdCB1cGRhdGUuXG4gICAqIFxuICAgKiBAcmV0dXJucyBBIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhpcyBlZmZlY3QgaXMgc3RhbGUuXG4gICAqL1xuICB0eXBlIEVmZmVjdDxUPiA9ICh0aGlzOiBULCBjdXJyZW50OiBULCB1cGRhdGU6IFNldDxFdmVudDxUPj4pID0+XG4gICAgRWZmZWN0Q2FsbGJhY2sgfCBQcm9taXNlPHZvaWQ+IHwgbnVsbCB8IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJuZWQgYnkgZWZmZWN0LiBXaWxsIGJlIGNhbGxlZCB3aGVuIGVmZmVjdCBpcyBzdGFsZS5cbiAgICogXG4gICAqIEBwYXJhbSB1cGRhdGUgLSBgdHJ1ZWAgaWYgdXBkYXRlIGlzIHBlbmRpbmcsIGBmYWxzZWAgZWZmZWN0IGhhcyBiZWVuIGNhbmNlbGxlZCwgYG51bGxgIGlmIG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIHR5cGUgRWZmZWN0Q2FsbGJhY2sgPSAoKHVwZGF0ZTogYm9vbGVhbiB8IG51bGwpID0+IHZvaWQpO1xuXG4gIC8qKlxuICAgKiBQcm9wZXJ0eSBpbml0aWFsaXplciwgd2lsbCBydW4gdXBvbiBpbnN0YW5jZSBjcmVhdGlvbi5cbiAgICogT3B0aW9uYWwgcmV0dXJuZWQgY2FsbGJhY2sgd2lsbCBydW4gd2hlbiBvbmNlIHVwb24gZmlyc3QgYWNjZXNzLlxuICAgKi9cbiAgdHlwZSBJbnN0cnVjdGlvbjxUID0gYW55LCBNIGV4dGVuZHMgTW9kZWwgPSBhbnk+ID1cbiAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBhbGxvdyBmb3IgbnVtYmVycy9zeW1ib2wgcHJvcGVydGllcz9cbiAgICAodGhpczogTSwga2V5OiBFeHRyYWN0PEZpZWxkPE0+LCBzdHJpbmc+LCB0aGlzQXJnOiBNLCBzdGF0ZTogU3RhdGU8TT4pID0+XG4gICAgICBEZXNjcmlwdG9yPFQ+IHwgKChzb3VyY2U6IE0pID0+IFQpIHwgdm9pZDtcblxuICB0eXBlIEdldHRlcjxUPiA9IChzb3VyY2U6IE1vZGVsKSA9PiBUO1xuICB0eXBlIFNldHRlcjxUPiA9ICh2YWx1ZTogVCwgcHJldmlvdXM6IFQpID0+IGJvb2xlYW4gfCB2b2lkIHwgKCgpID0+IFQpO1xuXG4gIHR5cGUgRGVzY3JpcHRvcjxUID0gYW55PiA9IHtcbiAgICBnZXQ/OiBHZXR0ZXI8VD4gfCBib29sZWFuO1xuICAgIHNldD86IFNldHRlcjxUPiB8IGJvb2xlYW47XG4gICAgZW51bWVyYWJsZT86IGJvb2xlYW47XG4gICAgdmFsdWU/OiBUO1xuICB9XG59XG5cbmludGVyZmFjZSBNb2RlbCB7XG4gIC8qKlxuICAgKiBMb29wYmFjayB0byBpbnN0YW5jZSBvZiB0aGlzIG1vZGVsLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGluIGEgc3Vic2NyaWJlZCBjb250ZXh0LFxuICAgKiB0byBrZWVwIHdyaXRlIGFjY2VzcyB0byBgdGhpc2AgYWZ0ZXIgYSBkZXN0cnVjdHVyZS4gWW91IGNhbiB1c2UgaXQgdG8gcmVhZCB2YXJpYWJsZXMgc2lsZW50bHkgYXMgd2VsbC5cbiAgICoqL1xuICBpczogdGhpcztcbn1cblxuYWJzdHJhY3QgY2xhc3MgTW9kZWwge1xuICBjb25zdHJ1Y3RvciguLi5hcmdzOiBNb2RlbC5BcmdzKXtcbiAgICBwcmVwYXJlKHRoaXMpO1xuICAgIGRlZmluZSh0aGlzLCBcImlzXCIsIHsgdmFsdWU6IHRoaXMgfSk7XG4gICAgaW5pdCh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdWxsIGN1cnJlbnQgdmFsdWVzIGZyb20gc3RhdGUuIEZsYXR0ZW5zIGFsbCBtb2RlbHMgYW5kIGV4b3RpYyB2YWx1ZXMgcmVjdXJzaXZlbHkuXG4gICAqIFxuICAgKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBhbGwgdmFsdWVzIGZyb20gdGhpcyBtb2RlbC5cbiAgICoqL1xuICBnZXQoKTogTW9kZWwuU3RhdGU8dGhpcz47XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgcnVuIGF1dG9tYXRpY2FsbHkgd2hlbiBhY2Nlc3NlZCB2YWx1ZXMgY2hhbmdlLlxuICAgKiBcbiAgICogQHBhcmFtIGVmZmVjdCBGdW5jdGlvbiB0byBydW4sIGFuZCBhZ2FpbiB3aGVuZXZlciBhY2Nlc3NlZCB2YWx1ZXMgY2hhbmdlLlxuICAgKiAgICAgICAgICAgICAgIElmIGVmZmVjdCByZXR1cm5zIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIHdoZW4gYSBjaGFuZ2Ugb2NjdXJzIChzeW5jcm9ub3VzbHkpLFxuICAgKiAgICAgICAgICAgICAgIGVmZmVjdCBpcyBjYW5jZWxsZWQsIG9yIHBhcmVudCBtb2RlbCBpcyBkZXN0cm95ZWQuXG4gICAqIEByZXR1cm5zIEZ1bmN0aW9uIHRvIGNhbmNlbCBsaXN0ZW5lci5cbiAgICovXG4gIGdldChlZmZlY3Q6IE1vZGVsLkVmZmVjdDx0aGlzPik6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEdldCB2YWx1ZSBvZiBhIHByb3BlcnR5LlxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IHRvIGdldCB2YWx1ZSBvZi5cbiAgICogQHBhcmFtIHJlcXVpcmVkIC0gSWYgdHJ1ZSwgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlLlxuICAgKiBAcmV0dXJucyBWYWx1ZSBvZiBwcm9wZXJ0eS5cbiAgICovXG4gIGdldDxUIGV4dGVuZHMgTW9kZWwuRXZlbnQ8dGhpcz4+KGtleTogVCwgcmVxdWlyZWQ/OiBib29sZWFuKTogTW9kZWwuVmFsdWU8dGhpcywgVD47XG5cbiAgLyoqXG4gICAqIFJ1biBhIGZ1bmN0aW9uIHdoZW4gYSBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IHRvIHdhdGNoIGZvciB1cGRhdGVzLlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gY2FuY2VsIGxpc3RlbmVyLlxuICAgKi9cbiAgZ2V0PFQgZXh0ZW5kcyBNb2RlbC5FdmVudDx0aGlzPj4oa2V5OiBULCBjYWxsYmFjazogTW9kZWwuT25VcGRhdGU8dGhpcywgVD4pOiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBtb2RlbCBpcyBleHBpcmVkLlxuICAgKiBcbiAgICogQHBhcmFtIHN0YXR1cyAtIGBudWxsYCB0byBjaGVjayBpZiBtb2RlbCBpcyBleHBpcmVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbW9kZWwgaXMgZXhwaXJlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBnZXQoc3RhdHVzOiBudWxsKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBtb2RlbCBpcyB0byBiZSBkZXN0cm95ZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKiBAcmV0dXJucyBGdW5jdGlvbiB0byBjYW5jZWwgbGlzdGVuZXIuXG4gICAqL1xuICBnZXQoc3RhdHVzOiBudWxsLCBjYWxsYmFjazogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XG5cbiAgZ2V0KGFyZzE/OiBNb2RlbC5FZmZlY3Q8dGhpcz4gfCBzdHJpbmcgfCBudWxsLCBhcmcyPzogYm9vbGVhbiB8IE1vZGVsLk9uVXBkYXRlPHRoaXMsIGFueT4pe1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzLmlzO1xuXG4gICAgaWYodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKXtcbiAgICAgIGxldCBwZW5kaW5nID0gbmV3IFNldDxNb2RlbC5FdmVudDx0aGlzPj4oKTtcblxuICAgICAgcmV0dXJuIGNyZWF0ZUVmZmVjdChzZWxmLCAocHJveHkpID0+IHtcbiAgICAgICAgY29uc3QgY2IgPSBhcmcxLmNhbGwocHJveHksIHByb3h5LCBwZW5kaW5nKTtcblxuICAgICAgICByZXR1cm4gY2IgPT09IG51bGwgPyBudWxsIDogKCh1cGRhdGUpID0+IHtcbiAgICAgICAgICBwZW5kaW5nID0gUEVORElOR19LRVlTLmdldChzZWxmKSE7XG4gICAgICAgICAgaWYodHlwZW9mIGNiID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICAgIGNiKHVwZGF0ZSk7XG4gICAgICAgIH0pXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgYXJnMSA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgc25hcHNob3Qoc2VsZikgOlxuICAgICAgICB0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIgP1xuICAgICAgICAgIGFkZExpc3RlbmVyKHNlbGYsIGFyZzIsIGFyZzEpIDpcbiAgICAgICAgICBhcmcxID09PSBudWxsID9cbiAgICAgICAgICAgIE9iamVjdC5pc0Zyb3plbihTVEFURS5nZXQoc2VsZikpIDpcbiAgICAgICAgICAgIGZldGNoKHNlbGYsIGFyZzEsIGFyZzIpXG4gICAgKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1cGRhdGUgaW4gcHJvZ3Jlc3MuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgb2JqZWN0IHdpdGggdXBkYXRlZCB2YWx1ZXMsIGB1bmRlZmluZWRgIGlmIHRoZXJlIG5vIHVwZGF0ZSBpcyBwZW5kaW5nLlxuICAgKiovXG4gIHNldCgpOiBQcm9taXNlTGlrZTxNb2RlbC5FdmVudDx0aGlzPltdPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVXBkYXRlIG11bGl0cGxlIHByb3BlcnRpZXMgYXQgb25jZS4gTWVyZ2VzIGFyZ3VtZW50IHdpdGggY3VycmVudCBzdGF0ZS5cbiAgICogUHJvcGVydGllcyB3aGljaCBhcmUgbm90IG1hbmFnZWQgYnkgdGhpcyBtb2RlbCB3aWxsIGJlIGlnbm9yZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gYXNzaWduIC0gT2JqZWN0IHdpdGggcHJvcGVydGllcyB0byB1cGRhdGUuXG4gICAqIEBwYXJhbSBzaWxlbnQgLSBJZiBhbiB1cGRhdGUgZG9lcyBvY2N1ciwgbGlzdGVuZXJzIHdpbGwgbm90IGJlIHJlZnJlc2hlZCBhdXRvbWF0aWNhbGx5LlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyBhbiBhcnJheSBvZiBrZXlzIHVwZGF0ZWQsIGB1bmRlZmluZWRgIChpbW1lZGlhdGVseSkgaWYgYSBub29wLlxuICAgKi9cbiAgc2V0KGFzc2lnbj86IE1vZGVsLkFzc2lnbjx0aGlzPiwgc2lsZW50PzogYm9vbGVhbik6IFByb21pc2VMaWtlPE1vZGVsLkV2ZW50PHRoaXM+W10+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBQdXNoIGFuIHVwZGF0ZS4gVGhpcyB3aWxsIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFzc29jaWF0ZWQgcHJvcGVydHkuXG4gICAqIFxuICAgKiBVc2VmdWwgd2hlcmUgYSBwcm9wZXJ0eSB2YWx1ZSBpbnRlcm5hbGx5IGhhcyBjaGFuZ2VkLCBidXQgdGhlIG9iamVjdCBpcyB0aGUgc2FtZS5cbiAgICogRm9yIGV4YW1wbGU6IEFuIGFycmF5IGhhcyBwdXNoZWQgYSBuZXcgdmFsdWUsIG9yIGEgbmVzdGVkIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIFxuICAgKiBZb3UgY2FuIGFsc28gdXNlIHRoaXMgdG8gZGlzcGF0Y2ggYXJiaXRyYXJ5IGV2ZW50cy5cbiAgICogU3ltYm9scyBhcmUgcmVjb21tZW5kZWQgYXMgbm9uLXByb3BlcnR5IGV2ZW50cywgaG93ZXZlciB5b3UgY2FuIHVzZSBhbnkgc3RyaW5nLlxuICAgKiBJZiBkb2luZyBzbywgYmUgc3VyZSB0byBhdm9pZCBjb2xsaXNpb25zIHdpdGggcHJvcGVydHkgbmFtZXMhIEFuIGVhc3kgd2F5IHRvIGRvIHRoaXMgaXNcbiAgICogdG8gcHJlZml4IGFuIGV2ZW50IHdpdGggXCIhXCIgYW5kL29yIHVzZSBkYXNoLWNhc2UuIGUuZy4gYHNldChcIiFldmVudFwiKWAgb3IgYHNldChcIm15LWV2ZW50XCIpYC5cbiAgICogXG4gICAqIEBwYXJhbSBrZXkgLSBQcm9wZXJ0eSBvciBldmVudCB0byBkaXNwYXRjaC5cbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZlcyBhbiBhcnJheSBvZiBrZXlzIHVwZGF0ZWQuXG4gICAqL1xuICBzZXQoa2V5OiBNb2RlbC5FdmVudDx0aGlzPik6IFByb21pc2VMaWtlPE1vZGVsLkV2ZW50PHRoaXM+W10+O1xuXG4gIC8qKlxuICAgKiBDYWxsIGEgZnVuY3Rpb24gd2hlbiB1cGRhdGUgb2NjdXJzLlxuICAgKiBcbiAgICogR2l2ZW4gZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBldmVyeSBhc3NpZ25tZW50ICh3aGljaCBjaGFuZ2VzIHZhbHVlKSBvciBleHBsaWNpdCBgc2V0YC5cbiAgICogXG4gICAqIFRvIHJ1biBsb2dpYyBvbiBmaW5hbCB2YWx1ZSBvbmx5LCBjYWxsYmFjayBtYXkgcmV0dXJuIGEgZnVuY3Rpb24uIFVzaW5nIHRoZSBzYW1lXG4gICAqIGZ1bmN0aW9uIGZvciBvbmUgb3IgbW9yZSBldmVudHMgd2lsbCBlbnN1cmUgaXQgaXMgY2FsbGVkIG9ubHkgd2hlbiBldmVudHMgYXJlIHNldHRsZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdXBkYXRlIG9jY3Vycy5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gcmVtb3ZlIGxpc3RlbmVyLiBXaWxsIHJldHVybiBgdHJ1ZWAgaWYgcmVtb3ZlZCwgYGZhbHNlYCBpZiBpbmFjdGl2ZSBhbHJlYWR5LlxuICAgKiBcbiAgKi9cbiAgc2V0KGNhbGxiYWNrOiBNb2RlbC5PbkV2ZW50PHRoaXM+KTogKCkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2FsbCBhIGZ1bmN0aW9uIHdoZW4gYSBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBVbmxpa2UgYGdldGAsIHRoaXMgY2Fsc2wgc3luY2hyb25vdXNseSBhbmQgd2lsbCBmaXJlIGFzIG1hbnkgdGltZXMgYXMgdGhlIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgdG8gd2F0Y2ggZm9yIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKi9cbiAgc2V0KGtleTogTW9kZWwuRXZlbnQ8dGhpcz4gfCBudWxsLCBjYWxsYmFjazogTW9kZWwuT25FdmVudDx0aGlzPik6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlY2xhcmUgYW4gZW5kIHRvIHVwZGF0ZXMuIFRoaXMgZXZlbnQgaXMgZmluYWwgYW5kIHdpbGwgZnJlZXplIHN0YXRlLlxuICAgKiBUaGlzIGV2ZW50IGNhbiBiZSB3YXRjaGVkIGZvciBhcyB3ZWxsLCB0byBydW4gY2xlYW51cCBsb2dpYyBhbmQgaW50ZXJuYWxseSB3aWxsIHJlbW92ZSBhbGwgbGlzdGVuZXJzLlxuICAgKiBcbiAgICogQHBhcmFtIHN0YXR1cyAtIGBudWxsYCB0byBlbmQgdXBkYXRlcy5cbiAgICovXG4gIHNldChzdGF0dXM6IG51bGwpOiB2b2lkO1xuXG4gIHNldChcbiAgICBhcmcxPzogTW9kZWwuT25FdmVudDx0aGlzPiB8IE1vZGVsLkFzc2lnbjx0aGlzPiB8IE1vZGVsLkV2ZW50PHRoaXM+IHwgbnVsbCxcbiAgICBhcmcyPzogYm9vbGVhbiB8IE1vZGVsLk9uRXZlbnQ8dGhpcz4pe1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXMuaXM7XG5cbiAgICBpZih0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwga2V5ID0+IHtcbiAgICAgICAgaWYodHlwZW9mIGtleSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgIHJldHVybiBhcmcxLmNhbGwoc2VsZiwga2V5LCBzZWxmKTtcbiAgICAgIH0pXG4gICAgICBcbiAgICBpZih0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwga2V5ID0+IHtcbiAgICAgICAgaWYoa2V5ID09PSBhcmcxKVxuICAgICAgICAgIHJldHVybiBhcmcyLmNhbGwoc2VsZiwga2V5LCBzZWxmKTtcbiAgICAgIH0pO1xuXG4gICAgaWYoYXJnMSAmJiB0eXBlb2YgYXJnMSA9PSBcIm9iamVjdFwiKVxuICAgICAgYXNzaWduKHNlbGYsIGFyZzEsIGFyZzIgPT09IHRydWUpO1xuICAgIGVsc2VcbiAgICAgIGV2ZW50KHNlbGYsIGFyZzEpO1xuXG4gICAgcmV0dXJuIHBlbmRpbmcoc2VsZik7XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSBvdmVyIG1hbmFnZWQgcHJvcGVydGllcyBpbiB0aGlzIGluc3RhbmNlIG9mIE1vZGVsLlxuICAgKiBZZWlsZHMgdGhlIGtleSBhbmQgY3VycmVudCB2YWx1ZSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICovXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhdG9yPFtzdHJpbmcsIHVua25vd25dPiB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKFNUQVRFLmdldCh0aGlzLmlzKSEpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIGFjdGl2YXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgbW9kZWwuXG4gICAqIFxuICAgKiAqKkltcG9ydGFudCoqIC0gVW5saWtlIGBuZXcgdGhpcyguLi4pYCAtIHRoaXMgbWV0aG9kIGFsc28gYWN0aXZhdGVzIHN0YXRlLlxuICAgKiBcbiAgICogQHBhcmFtIGFyZ3MgLSBhcmd1bWVudHMgc2VudCB0byBjb25zdHJ1Y3RvclxuICAgKi9cbiAgc3RhdGljIG5ldzxUIGV4dGVuZHMgTW9kZWw+KHRoaXM6IE1vZGVsLkluaXQ8VD4sIC4uLmFyZ3M6IE1vZGVsLkFyZ3M8VD4pe1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgZXZlbnQoaW5zdGFuY2UpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgZXF1aXZhbGVudCBvZiBgeCBpbnN0YW5jZW9mIHRoaXNgLlxuICAgKiBEZXRlcm1pbmVzIGlmIHByb3ZpZGVkIGNsYXNzIGlzIGEgc3VidHlwZSBvZiB0aGlzIG9uZS5cbiAgICogSWYgc28sIGxhbmd1YWdlIHNlcnZlciB3aWxsIG1ha2UgYXZhaWxhYmxlIGFsbCBzdGF0aWNcbiAgICogbWV0aG9kcyBhbmQgcHJvcGVydGllcyBvZiB0aGlzIGNsYXNzLlxuICAgKi9cbiAgc3RhdGljIGlzPFQgZXh0ZW5kcyBNb2RlbC5UeXBlPih0aGlzOiBULCBtYXliZTogdW5rbm93bik6IG1heWJlIGlzIFQge1xuICAgIHJldHVybiBtYXliZSA9PT0gdGhpcyB8fCB0eXBlb2YgbWF5YmUgPT0gXCJmdW5jdGlvblwiICYmIG1heWJlLnByb3RvdHlwZSBpbnN0YW5jZW9mIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBydW4gd2hlbiBhbnkgaW5zdGFuY2Ugb2YgdGhpcyBNb2RlbCBpcyB1cGRhdGVkLiBcbiAgICovXG4gIHN0YXRpYyBvbjxUIGV4dGVuZHMgTW9kZWw+KHRoaXM6IE1vZGVsLlR5cGU8VD4sIGxpc3RlbmVyOiBNb2RlbC5PbkV2ZW50PFQ+KXtcbiAgICBsZXQgbm90aWZ5ID0gTk9USUZZLmdldCh0aGlzKTtcblxuICAgIGlmKCFub3RpZnkpXG4gICAgICBOT1RJRlkuc2V0KHRoaXMsIG5vdGlmeSA9IG5ldyBTZXQpO1xuXG4gICAgbm90aWZ5LmFkZChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gKCkgPT4gbm90aWZ5LmRlbGV0ZShsaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVmaW5lKE1vZGVsLnByb3RvdHlwZSwgXCJ0b1N0cmluZ1wiLCB7XG4gIHZhbHVlKCl7XG4gICAgcmV0dXJuIElELmdldCh0aGlzLmlzKTtcbiAgfVxufSk7XG5cbmRlZmluZShNb2RlbCwgXCJ0b1N0cmluZ1wiLCB7XG4gIHZhbHVlKCl7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGFzc2lnbihzdWJqZWN0OiBNb2RlbCwgZGF0YTogTW9kZWwuQXNzaWduPE1vZGVsPiwgc2lsZW50PzogYm9vbGVhbil7XG4gIGNvbnN0IG1ldGhvZHMgPSBNRVRIT0RTLmdldChzdWJqZWN0LmNvbnN0cnVjdG9yIGFzIE1vZGVsLlR5cGUpITtcbiAgICBcbiAgZm9yKGNvbnN0IGtleSBpbiBkYXRhKXtcbiAgICBjb25zdCBiaW5kID0gbWV0aG9kcy5nZXQoa2V5KTtcbiAgICBpZihiaW5kKVxuICAgICAgYmluZC5jYWxsKHN1YmplY3QsIGRhdGFba2V5XSk7XG4gICAgZWxzZSBpZihrZXkgaW4gc3ViamVjdCAmJiBrZXkgIT09IFwiaXNcIil7XG4gICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzdWJqZWN0LCBrZXkpITtcbiAgICAgIGNvbnN0IHNldCA9IGRlc2MgJiYgZGVzYy5zZXQgYXMgKHZhbHVlOiBhbnksIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG5cbiAgICAgIHNldC5jYWxsKHN1YmplY3QsIGRhdGFba2V5XSwgc2lsZW50ID09PSB0cnVlKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFwcGx5IGluc3RydWN0aW9ucyBhbmQgaW5oZXJpdGVkIGV2ZW50IGxpc3RlbmVycy4gRW5zdXJlIGNsYXNzIG1ldGFkYXRhIGlzIHJlYWR5LiAqL1xuZnVuY3Rpb24gcHJlcGFyZShtb2RlbDogTW9kZWwpe1xuICBsZXQgVCA9IG1vZGVsLmNvbnN0cnVjdG9yIGFzIE1vZGVsLlR5cGU7XG5cbiAgaWYoVCA9PT0gTW9kZWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNyZWF0ZSBiYXNlIE1vZGVsLlwiKTtcblxuICBjb25zdCBjaGFpbiA9IFtdIGFzIE1vZGVsLlR5cGVbXTtcbiAgbGV0IGtleXMgPSBuZXcgTWFwPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IHZvaWQ+KCk7XG5cbiAgSUQuc2V0KG1vZGVsLCBgJHtUfS0ke3VpZCgpfWApO1xuXG4gIHdoaWxlKFQubmFtZSl7XG4gICAgZm9yKGNvbnN0IGNiIG9mIE5PVElGWS5nZXQoVCkgfHwgW10pXG4gICAgICBhZGRMaXN0ZW5lcihtb2RlbCwgY2IpO1xuXG4gICAgaWYoVCA9PT0gTW9kZWwpIGJyZWFrO1xuICAgIGVsc2UgY2hhaW4udW5zaGlmdChUKTtcblxuICAgIFQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoVClcbiAgfVxuXG4gIGZvcihjb25zdCB0eXBlIG9mIGNoYWluKXtcbiAgICBpZihNRVRIT0RTLmhhcyh0eXBlKSl7XG4gICAgICBrZXlzID0gTUVUSE9EUy5nZXQodHlwZSkhO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgTUVUSE9EUy5zZXQodHlwZSwga2V5cyA9IG5ldyBNYXAoa2V5cykpO1xuXG4gICAgZm9yKGNvbnN0IFtrZXksIHsgdmFsdWUgfV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0eXBlLnByb3RvdHlwZSlcbiAgICApKXtcbiAgICAgIGlmKCF2YWx1ZSB8fCBrZXkgPT0gXCJjb25zdHJ1Y3RvclwiKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIFxuICAgICAgZnVuY3Rpb24gYmluZCh0aGlzOiBNb2RlbCwgbWV0aG9kID0gdmFsdWUpe1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG1ldGhvZC5iaW5kKHRoaXMuaXMpO1xuICAgICAgICBcbiAgICAgICAgTUVUSE9ELnNldCh2YWx1ZSwgbWV0aG9kKTtcbiAgICAgICAgZGVmaW5lKHRoaXMuaXMsIGtleSwgeyB2YWx1ZSwgd3JpdGFibGU6IHRydWUgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGtleXMuc2V0KGtleSwgYmluZCk7XG4gICAgICBkZWZpbmUodHlwZS5wcm90b3R5cGUsIGtleSwgeyBnZXQ6IGJpbmQsIHNldDogYmluZCB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBseSBtb2RlbCBhcmd1ZW1udHMsIHJ1biBjYWxsYmFja3MgYW5kIG9ic2VydmUgcHJvcGVydGllcy5cbiAqIEFjY3VtdWxhdGUgYW5kIGhhbmRsZSBjbGVhbnVwIGV2ZW50cy5cbiAqKi9cbmZ1bmN0aW9uIGluaXQobW9kZWw6IE1vZGVsLCBhcmdzOiBNb2RlbC5BcmdzKXtcbiAgY29uc3Qgc3RhdGUgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCB1bmtub3duPjtcblxuICBTVEFURS5zZXQobW9kZWwsIHN0YXRlKTtcblxuICBhcmdzID0gYXJncy5mbGF0KCkuZmlsdGVyKGFyZyA9PiB7XG4gICAgaWYodHlwZW9mIGFyZyAhPSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBJRC5zZXQobW9kZWwsIGFyZyk7XG4gIH0pO1xuXG4gIGFkZExpc3RlbmVyKG1vZGVsLCAoKSA9PiB7XG4gICAgaWYoIVBBUkVOVC5oYXMobW9kZWwpKVxuICAgICAgUEFSRU5ULnNldChtb2RlbCwgbnVsbCk7XG5cbiAgICBmb3IoY29uc3Qga2V5IGluIG1vZGVsKXtcbiAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG1vZGVsLCBrZXkpITtcblxuICAgICAgaWYoXCJ2YWx1ZVwiIGluIGRlc2Mpe1xuICAgICAgICB1cGRhdGUobW9kZWwsIGtleSwgZGVzYy52YWx1ZSwgdHJ1ZSk7XG4gICAgICAgIGRlZmluZShtb2RlbCwga2V5LCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBnZXQoKXtcbiAgICAgICAgICAgIHJldHVybiB3YXRjaCh0aGlzLCBrZXksIHN0YXRlW2tleV0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgc2V0KHZhbHVlLCBzaWxlbnQ/OiBib29sZWFuKXtcbiAgICAgICAgICAgIHVwZGF0ZShtb2RlbCwga2V5LCB2YWx1ZSwgc2lsZW50KTtcbiAgICAgICAgICAgIG1heUFkb3B0KG1vZGVsLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgYXJncy5mb3JFYWNoKChhcmcpID0+IHtcbiAgICAgIGNvbnN0IHVzZSA9IHR5cGVvZiBhcmcgPT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gYXJnLmNhbGwobW9kZWwsIG1vZGVsKVxuICAgICAgICA6IGFyZyBhcyBNb2RlbC5Bc3NpZ248TW9kZWw+O1xuXG4gICAgICBpZih1c2UgaW5zdGFuY2VvZiBQcm9taXNlKVxuICAgICAgICB1c2UuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBBc3luYyBlcnJvciBpbiBjb25zdHJ1Y3RvciBmb3IgJHttb2RlbH06YCk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9KTtcbiAgICAgIGVsc2UgaWYodHlwZW9mIHVzZSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIGFkZExpc3RlbmVyKG1vZGVsLCB1c2UsIG51bGwpXG4gICAgICBlbHNlIGlmKHR5cGVvZiB1c2UgPT0gXCJvYmplY3RcIilcbiAgICAgICAgYXNzaWduKG1vZGVsLCB1c2UsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgYWRkTGlzdGVuZXIobW9kZWwsICgpID0+IHtcbiAgICAgIGZvcihjb25zdCBbXywgdmFsdWVdIG9mIG1vZGVsKVxuICAgICAgICBpZih2YWx1ZSBpbnN0YW5jZW9mIE1vZGVsICYmIFBBUkVOVC5nZXQodmFsdWUpID09PSBtb2RlbClcbiAgICAgICAgICB2YWx1ZS5zZXQobnVsbCk7XG4gIFxuICAgICAgT2JqZWN0LmZyZWV6ZShzdGF0ZSk7XG4gICAgfSwgbnVsbCk7XG4gIFxuICAgIHJldHVybiBudWxsO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWF5QWRvcHQocGFyZW50OiBNb2RlbCwgY2hpbGQ6IHVua25vd24pe1xuICBpZihjaGlsZCBpbnN0YW5jZW9mIE1vZGVsICYmICFQQVJFTlQuaGFzKGNoaWxkKSl7XG4gICAgUEFSRU5ULnNldChjaGlsZCwgcGFyZW50KTtcbiAgICBldmVudChjaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmV0Y2goc3ViamVjdDogTW9kZWwsIHByb3BlcnR5OiBzdHJpbmcsIHJlcXVpcmVkPzogYm9vbGVhbil7XG4gIGNvbnN0IHN0YXRlID0gU1RBVEUuZ2V0KHN1YmplY3QpITtcbiAgXG4gIGlmKHByb3BlcnR5IGluIHN0YXRlIHx8IHJlcXVpcmVkID09PSBmYWxzZSl7XG4gICAgY29uc3QgdmFsdWUgPSBzdGF0ZVtwcm9wZXJ0eV07XG5cbiAgICBpZih2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8ICFyZXF1aXJlZClcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGAke3N1YmplY3R9LiR7cHJvcGVydHl9IGlzIG5vdCB5ZXQgYXZhaWxhYmxlLmApO1xuICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgYWRkTGlzdGVuZXIoc3ViamVjdCwga2V5ID0+IHtcbiAgICAgIGlmKGtleSA9PT0gcHJvcGVydHkpe1xuICAgICAgICByZXNvbHZlKHN0YXRlW2tleV0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYoa2V5ID09PSBudWxsKVxuICAgICAgICByZWplY3QobmV3IEVycm9yKGAke3N1YmplY3R9IGlzIGRlc3Ryb3llZC5gKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRocm93IE9iamVjdC5hc3NpZ24ocHJvbWlzZSwge1xuICAgIHRvU3RyaW5nOiAoKSA9PiBTdHJpbmcoZXJyb3IpLFxuICAgIG5hbWU6IFwiU3VzcGVuc2VcIixcbiAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgIHN0YWNrOiBlcnJvci5zdGFja1xuICB9KTtcbn1cblxuLyoqIEN1cnJlbnRseSBhY2N1bXVsYXRpbmcgZXhwb3J0LiBTdG9yZXMgcmVhbCB2YWx1ZXMgb2YgcGxhY2Vob2xkZXIgcHJvcGVydGllcyBzdWNoIGFzIHJlZigpIG9yIGNoaWxkIG1vZGVscy4gKi9cbmxldCBFWFBPUlQ6IE1hcDxhbnksIGFueT4gfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHNuYXBzaG90PFQgZXh0ZW5kcyBNb2RlbD4obW9kZWw6IFQpOiBNb2RlbC5TdGF0ZTxUPiB7XG4gIGNvbnN0IHZhbHVlcyA9IHt9IGFzIGFueTtcbiAgbGV0IGlzTm90UmVjdXJzaXZlO1xuXG4gIGlmKCFFWFBPUlQpe1xuICAgIGlzTm90UmVjdXJzaXZlID0gdHJ1ZTtcbiAgICBFWFBPUlQgPSBuZXcgTWFwKFtbbW9kZWwsIHZhbHVlc11dKTtcbiAgfVxuXG4gIGZvcihsZXQgW2tleSwgdmFsdWVdIG9mIG1vZGVsKXtcbiAgICBpZihFWFBPUlQuaGFzKHZhbHVlKSlcbiAgICAgIHZhbHVlID0gRVhQT1JULmdldCh2YWx1ZSk7XG4gICAgZWxzZSBpZih2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiBcImdldFwiIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5nZXQgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIEVYUE9SVC5zZXQodmFsdWUsIHZhbHVlID0gdmFsdWUuZ2V0KCkpO1xuXG4gICAgdmFsdWVzW2tleV0gPSB2YWx1ZTtcbiAgfVxuXG4gIGlmKGlzTm90UmVjdXJzaXZlKVxuICAgIEVYUE9SVCA9IHVuZGVmaW5lZDtcblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh2YWx1ZXMpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGU8VD4oXG4gIHN1YmplY3Q6IE1vZGVsLFxuICBrZXk6IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCxcbiAgdmFsdWU6IFQsXG4gIGFyZz86IGJvb2xlYW4gfCBNb2RlbC5TZXR0ZXI8VD4pe1xuXG4gIGNvbnN0IHN0YXRlID0gU1RBVEUuZ2V0KHN1YmplY3QpITtcblxuICBpZihPYmplY3QuaXNGcm96ZW4oc3RhdGUpKVxuICAgIHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gdXBkYXRlICR7U3RyaW5nKGtleSl9IGJ1dCAke3N1YmplY3R9IGlzIGRlc3Ryb3llZC5gKTtcblxuICBjb25zdCBwcmV2aW91cyA9IHN0YXRlW2tleV0gYXMgVDtcblxuICBpZih0eXBlb2YgYXJnID09IFwiZnVuY3Rpb25cIil7XG4gICAgY29uc3Qgb3V0ID0gYXJnLmNhbGwoc3ViamVjdCwgdmFsdWUsIHByZXZpb3VzKTtcblxuICAgIGlmKG91dCA9PT0gZmFsc2UpXG4gICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICBpZih0eXBlb2Ygb3V0ID09IFwiZnVuY3Rpb25cIilcbiAgICAgIHZhbHVlID0gb3V0KCk7XG4gIH1cblxuICBpZih2YWx1ZSA9PT0gcHJldmlvdXMgJiYgdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICByZXR1cm47XG5cbiAgc3RhdGVba2V5XSA9IHZhbHVlO1xuXG4gIGlmKGFyZyAhPT0gdHJ1ZSlcbiAgICBldmVudChzdWJqZWN0LCBrZXkpO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogUmFuZG9tIGFscGhhbnVtYmVyaWMgb2YgbGVuZ3RoIDY7IGFsd2F5cyBzdGFydHMgd2l0aCBhIGxldHRlci4gKi9cbmZ1bmN0aW9uIHVpZCgpe1xuICByZXR1cm4gKDAuMjc4ICsgTWF0aC5yYW5kb20oKSAqIDAuNzIyKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDgpLnRvVXBwZXJDYXNlKCk7XG59XG5cbmV4cG9ydCB7XG4gIGV2ZW50LFxuICBmZXRjaCxcbiAgbWF5QWRvcHQsXG4gIE1FVEhPRCxcbiAgTW9kZWwsXG4gIFBBUkVOVCxc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
|
package/dist/index.d.ts
CHANGED
|
@@ -295,6 +295,13 @@ declare namespace ref {
|
|
|
295
295
|
(next: T | null): void;
|
|
296
296
|
/** Current value held by this reference. */
|
|
297
297
|
current: T | null;
|
|
298
|
+
/**
|
|
299
|
+
* Subscribe to changes of this reference.
|
|
300
|
+
*
|
|
301
|
+
* @param callback - Callback to invoke with the current value when it changes.
|
|
302
|
+
* @returns Unsubscribe function to stop listening to changes.
|
|
303
|
+
*/
|
|
304
|
+
get(callback: (value: T) => void): () => void;
|
|
298
305
|
/** Retrieve current value. */
|
|
299
306
|
get(): T | null;
|
|
300
307
|
}
|
package/dist/index.js
CHANGED
|
@@ -255,19 +255,9 @@ var Model = class {
|
|
|
255
255
|
if (key2 === arg1)
|
|
256
256
|
return arg2.call(self, key2, self);
|
|
257
257
|
});
|
|
258
|
-
if (arg1 && typeof arg1 == "object")
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
const bind = methods.get(key2);
|
|
262
|
-
if (bind)
|
|
263
|
-
bind.call(self, arg1[key2]);
|
|
264
|
-
else if (key2 in self)
|
|
265
|
-
if (arg2 === true || !Object.getOwnPropertyDescriptor(self, key2)?.set)
|
|
266
|
-
update(self, key2, arg1[key2], arg2 === true);
|
|
267
|
-
else
|
|
268
|
-
self[key2] = arg1[key2];
|
|
269
|
-
}
|
|
270
|
-
} else
|
|
258
|
+
if (arg1 && typeof arg1 == "object")
|
|
259
|
+
assign(self, arg1, arg2 === true);
|
|
260
|
+
else
|
|
271
261
|
event(self, arg1);
|
|
272
262
|
return pending(self);
|
|
273
263
|
}
|
|
@@ -320,6 +310,19 @@ define(Model, "toString", {
|
|
|
320
310
|
return this.name;
|
|
321
311
|
}
|
|
322
312
|
});
|
|
313
|
+
function assign(subject, data, silent) {
|
|
314
|
+
const methods = METHODS.get(subject.constructor);
|
|
315
|
+
for (const key2 in data) {
|
|
316
|
+
const bind = methods.get(key2);
|
|
317
|
+
if (bind)
|
|
318
|
+
bind.call(subject, data[key2]);
|
|
319
|
+
else if (key2 in subject && key2 !== "is") {
|
|
320
|
+
const desc = Object.getOwnPropertyDescriptor(subject, key2);
|
|
321
|
+
const set2 = desc && desc.set;
|
|
322
|
+
set2.call(subject, data[key2], silent === true);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
323
326
|
function prepare(model) {
|
|
324
327
|
let T = model.constructor;
|
|
325
328
|
if (T === Model)
|
|
@@ -358,7 +361,6 @@ function prepare(model) {
|
|
|
358
361
|
}
|
|
359
362
|
}
|
|
360
363
|
function init(model, args) {
|
|
361
|
-
const methods = METHODS.get(model.constructor);
|
|
362
364
|
const state = {};
|
|
363
365
|
STATE.set(model, state);
|
|
364
366
|
args = args.flat().filter((arg) => {
|
|
@@ -369,21 +371,6 @@ function init(model, args) {
|
|
|
369
371
|
addListener(model, () => {
|
|
370
372
|
if (!PARENT.has(model))
|
|
371
373
|
PARENT.set(model, null);
|
|
372
|
-
args.forEach((arg) => {
|
|
373
|
-
const use2 = typeof arg == "function" ? arg.call(model, model) : arg;
|
|
374
|
-
if (use2 instanceof Promise)
|
|
375
|
-
use2.catch((err) => {
|
|
376
|
-
console.error(`Async error in constructor for ${model}:`);
|
|
377
|
-
console.error(err);
|
|
378
|
-
});
|
|
379
|
-
else if (typeof use2 == "function")
|
|
380
|
-
addListener(model, use2, null);
|
|
381
|
-
else if (typeof use2 == "object") {
|
|
382
|
-
for (const key2 in use2)
|
|
383
|
-
if (key2 in model || methods.has(key2))
|
|
384
|
-
model[key2] = use2[key2];
|
|
385
|
-
}
|
|
386
|
-
});
|
|
387
374
|
for (const key2 in model) {
|
|
388
375
|
const desc = Object.getOwnPropertyDescriptor(model, key2);
|
|
389
376
|
if ("value" in desc) {
|
|
@@ -393,13 +380,25 @@ function init(model, args) {
|
|
|
393
380
|
get() {
|
|
394
381
|
return watch(this, key2, state[key2]);
|
|
395
382
|
},
|
|
396
|
-
set(value) {
|
|
397
|
-
update(model, key2, value);
|
|
383
|
+
set(value, silent) {
|
|
384
|
+
update(model, key2, value, silent);
|
|
398
385
|
mayAdopt(model, value);
|
|
399
386
|
}
|
|
400
387
|
});
|
|
401
388
|
}
|
|
402
389
|
}
|
|
390
|
+
args.forEach((arg) => {
|
|
391
|
+
const use2 = typeof arg == "function" ? arg.call(model, model) : arg;
|
|
392
|
+
if (use2 instanceof Promise)
|
|
393
|
+
use2.catch((err) => {
|
|
394
|
+
console.error(`Async error in constructor for ${model}:`);
|
|
395
|
+
console.error(err);
|
|
396
|
+
});
|
|
397
|
+
else if (typeof use2 == "function")
|
|
398
|
+
addListener(model, use2, null);
|
|
399
|
+
else if (typeof use2 == "object")
|
|
400
|
+
assign(model, use2, true);
|
|
401
|
+
});
|
|
403
402
|
addListener(model, () => {
|
|
404
403
|
for (const [_, value] of model)
|
|
405
404
|
if (value instanceof Model && PARENT.get(value) === model)
|
|
@@ -471,7 +470,7 @@ function update(subject, key2, value, arg) {
|
|
|
471
470
|
if (typeof out == "function")
|
|
472
471
|
value = out();
|
|
473
472
|
}
|
|
474
|
-
if (value === previous)
|
|
473
|
+
if (value === previous && value !== void 0)
|
|
475
474
|
return;
|
|
476
475
|
state[key2] = value;
|
|
477
476
|
if (arg !== true)
|
|
@@ -698,18 +697,18 @@ function get(arg0, arg1) {
|
|
|
698
697
|
if (typeof arg0 == "symbol")
|
|
699
698
|
throw new Error(`Attempted to use an instruction result (probably use or get) as computed source for ${subject}.${key2}. This is not allowed.`);
|
|
700
699
|
if (Model.is(arg0)) {
|
|
701
|
-
let
|
|
700
|
+
let assign3 = function(value) {
|
|
702
701
|
if (typeof arg1 == "function")
|
|
703
702
|
value.get((x) => arg1(x, key2));
|
|
704
703
|
update(subject, key2, value);
|
|
705
704
|
};
|
|
706
|
-
var
|
|
705
|
+
var assign2 = assign3;
|
|
707
706
|
const hasParent = PARENT.get(subject);
|
|
708
707
|
if (!hasParent && arg1 === true)
|
|
709
708
|
throw new Error(`${subject} may only exist as a child of type ${arg0}.`);
|
|
710
709
|
else if (hasParent) {
|
|
711
710
|
if (hasParent instanceof arg0) {
|
|
712
|
-
|
|
711
|
+
assign3(hasParent);
|
|
713
712
|
return {};
|
|
714
713
|
} else if (arg1 === true)
|
|
715
714
|
throw new Error(`New ${subject} created as child of ${hasParent}, but must be instanceof ${arg0}.`);
|
|
@@ -717,7 +716,7 @@ function get(arg0, arg1) {
|
|
|
717
716
|
Context.get(subject, (context2) => {
|
|
718
717
|
const model = context2.get(arg0);
|
|
719
718
|
if (model)
|
|
720
|
-
|
|
719
|
+
assign3(model);
|
|
721
720
|
else if (arg1 !== false)
|
|
722
721
|
throw new Error(`Required ${arg0} not found in context for ${subject}.`);
|
|
723
722
|
});
|
|
@@ -779,6 +778,7 @@ var { defineProperty, defineProperties } = Object;
|
|
|
779
778
|
function ref(arg, arg2) {
|
|
780
779
|
return use((key2, subject, state) => {
|
|
781
780
|
let value = {};
|
|
781
|
+
const method = (key3) => (callback) => callback ? addListener(subject, () => callback(state[key3]), key3) : state[key3];
|
|
782
782
|
if (arg === subject)
|
|
783
783
|
subject.get(() => {
|
|
784
784
|
for (const key3 in state)
|
|
@@ -792,12 +792,14 @@ function ref(arg, arg2) {
|
|
|
792
792
|
}
|
|
793
793
|
});
|
|
794
794
|
else {
|
|
795
|
-
const get2 = ()
|
|
795
|
+
const get2 = method(key3);
|
|
796
796
|
const set2 = (value2) => {
|
|
797
797
|
update(subject, key3, value2);
|
|
798
798
|
};
|
|
799
|
-
|
|
800
|
-
|
|
799
|
+
defineProperties(set2, {
|
|
800
|
+
current: { get: get2, set: set2 },
|
|
801
|
+
get: { value: get2 }
|
|
802
|
+
});
|
|
801
803
|
defineProperty(value, key3, { value: set2 });
|
|
802
804
|
}
|
|
803
805
|
});
|
|
@@ -805,7 +807,7 @@ function ref(arg, arg2) {
|
|
|
805
807
|
throw new Error("ref instruction does not support object which is not 'this'");
|
|
806
808
|
else {
|
|
807
809
|
let unset;
|
|
808
|
-
const get2 = ()
|
|
810
|
+
const get2 = method(key2);
|
|
809
811
|
const set2 = (value2) => {
|
|
810
812
|
if (!update(subject, key2, value2) || !arg)
|
|
811
813
|
return;
|
|
@@ -835,7 +837,9 @@ function ref(arg, arg2) {
|
|
|
835
837
|
// src/instruction/set.ts
|
|
836
838
|
function set(value, argument) {
|
|
837
839
|
return use((key2, subject) => {
|
|
838
|
-
const property = {
|
|
840
|
+
const property = {
|
|
841
|
+
enumerable: false
|
|
842
|
+
};
|
|
839
843
|
if (typeof value == "function" || value instanceof Promise) {
|
|
840
844
|
let init4 = function() {
|
|
841
845
|
if (typeof value == "function")
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/control.ts","../src/model.ts","../src/context.ts","../src/instruction/use.ts","../src/instruction/get.ts","../src/instruction/ref.ts","../src/instruction/set.ts","../src/instruction/has.ts"],"sourcesContent":["export { get } from './instruction/get';\nexport { ref } from './instruction/ref';\nexport { set } from './instruction/set';\nexport { use } from './instruction/use';\nexport { has } from './instruction/has';\n\nexport { Model, Model as default } from './model';\nexport { createEffect, createProxy, addListener } from './control';\nexport { Context } from './context';","import type { Model } from \"./model\";\n\n/**\n * Update callback function.\n * \n * @param key -\n * - `string` - property which has updated.\n * - `false` - a normal update has completed.\n * - `true` - initial event; instance is ready.\n * - `null` - terminal event; instance is expired.\n * @param source - Instance of Model for which update has occured.\n */\ntype OnUpdate<T extends Model = any> = \n (this: T, key: unknown, source: T) => (() => void) | null | void;\n\ntype OnAccess<T extends Model = any, R = unknown> =\n (from: T, key: string | number, value: R) => unknown;\n\ntype Effect<T extends Model> = (this: T, proxy: T) =>\n ((update: boolean | null) => void) | Promise<void> | null | void;\n\ntype Event = number | string | null | boolean | symbol;\n\n/** Placeholder event determines if model is initialized or not. */\nconst onReady = () => null;\n\nconst LISTENERS = new WeakMap<Model, Map<OnUpdate, Set<Event> | undefined>>();\n\n/** Events pending for a given object. */\nconst PENDING = new WeakMap<Model, Set<Event>>();\n\n/** Update register. */\nconst PENDING_KEYS = new WeakMap<Model, Set<string | number | symbol>>();\n\n/** Central event dispatch. Bunches all updates to occur at same time. */\nconst DISPATCH = new Set<() => void>();\n\nconst OBSERVER = new WeakMap<Model, OnAccess>();\n\nfunction addListener<T extends Model>(subject: T, callback: OnUpdate<T>, select?: Event){\n let listeners = LISTENERS.get(subject)!;\n\n if(!listeners)\n LISTENERS.set(subject, listeners = new Map([[onReady, undefined]]));\n\n const filter = select === undefined ? undefined : new Set([select]);\n\n if(!listeners.has(onReady) && !filter)\n callback.call(subject, true, subject);\n\n listeners.set(callback, filter);\n\n return () => listeners.delete(callback);\n}\n\nfunction emit(model: Model, key: Event): void {\n const listeners = LISTENERS.get(model)!;\n const notReady = listeners.has(onReady);\n\n if(key === true && !notReady)\n return;\n\n let pending = PENDING.get(model);\n\n if(pending){\n pending.add(key);\n return;\n }\n\n PENDING.set(model, pending = new Set(notReady ? [true, key] : [key]));\n\n for(const key of pending)\n for(const [callback, filter] of listeners)\n if(!filter || filter.has(key)){\n const after = callback.call(model, key, model);\n\n if(after)\n enqueue(after);\n\n else if(after === null)\n listeners.delete(callback);\n }\n\n if(key === null)\n listeners.clear();\n \n PENDING.delete(model);\n}\n\nfunction event(\n subject: Model,\n key?: string | number | symbol | null,\n silent?: boolean){\n\n if(key === null)\n return emit(subject, key);\n\n if(!key)\n return emit(subject, true);\n\n let pending = PENDING_KEYS.get(subject);\n\n if(!pending){\n PENDING_KEYS.set(subject, pending = new Set());\n\n if(!silent)\n enqueue(() => {\n emit(subject, false);\n PENDING_KEYS.delete(subject)\n })\n }\n\n pending.add(key);\n\n if(!silent)\n emit(subject, key);\n}\n\nfunction pending<T extends Model>(subject: T){\n if(PENDING_KEYS.has(subject))\n return <PromiseLike<Model.Event<T>[]>> {\n then: (res) => new Promise<any>(res => {\n const remove = addListener(subject, key => {\n if(key !== true){\n remove();\n return res.bind(null, Array.from(PENDING_KEYS.get(subject)!));\n }\n });\n }).then(res)\n }\n}\n\nfunction enqueue(eventHandler: (() => void)){\n if(!DISPATCH.size)\n setTimeout(() => {\n DISPATCH.forEach(event => {\n try {\n event();\n }\n catch(err){\n console.error(err);\n }\n });\n DISPATCH.clear();\n }, 0);\n\n DISPATCH.add(eventHandler);\n}\n\nfunction createProxy<T extends Model>(from: T, observer: OnAccess<T>){\n const proxy = Object.create(from) as T;\n OBSERVER.set(proxy, observer);\n return proxy;\n}\n\nfunction watch(from: any, key: string | number, value?: any){\n const access = OBSERVER.get(from);\n return access ? access(from, key, value) : value;\n}\n\n/**\n * Create a side-effect which will update whenever values accessed change.\n * Callback is called immediately and whenever values are stale.\n * \n * @param target - Instance of Model to observe.\n * @param callback - Function to invoke when values change.\n * @param requireValues - If `true` will throw if accessing a value which is `undefined`.\n */\nfunction createEffect<T extends Model>(target: T, callback: Effect<Required<T>>, requireValues: true): () => void;\nfunction createEffect<T extends Model>(target: T, callback: Effect<T>, recursive?: boolean): () => void;\nfunction createEffect<T extends Model>(target: T, callback: Effect<T>, argument?: boolean){\n const listeners = LISTENERS.get(target)!;\n\n let unset: ((update: boolean | null) => void) | undefined;\n let reset: (() => void) | null | undefined;\n\n function invoke(){\n let stale: boolean | undefined;\n\n const subscriber = createProxy(target, access);\n\n LISTENERS.set(subscriber, listeners);\n\n function onUpdate() {\n if (stale)\n return null;\n\n stale = true;\n\n if (reset && unset) {\n unset(true);\n unset = undefined;\n }\n\n return reset;\n }\n\n function access(from: Model, key: string | number, value: any) {\n if(value === undefined && argument)\n throw new Error(`${from}.${key} is required in this context.`);\n\n const listeners = LISTENERS.get(from)!;\n let listener = listeners.get(onUpdate);\n\n if(!listener)\n listeners.set(onUpdate, listener = new Set);\n\n listener.add(key);\n\n const nested = LISTENERS.get(value);\n\n if(nested)\n LISTENERS.set(\n value = createProxy(value, access),\n nested\n );\n\n return value;\n }\n\n try {\n const ctx = context(argument === false)\n const ret = callback.call(subscriber, subscriber);\n const flush = ctx();\n\n reset = ret === null ? null : invoke;\n unset = key => {\n if(typeof ret == \"function\")\n ret(key);\n\n flush();\n }\n }\n catch(err){\n if(err instanceof Promise){\n reset = undefined;\n err.then(invoke);\n }\n else\n throw err;\n }\n }\n\n function cleanup(){\n if(unset)\n unset(false);\n\n reset = null;\n };\n\n if(EffectContext && argument !== false)\n EffectContext.add(cleanup);\n\n addListener(target, key => {\n if(key === true)\n invoke();\n\n else if(!reset)\n return reset;\n\n if(key === null && unset)\n unset(null);\n });\n \n return cleanup;\n}\n\nlet EffectContext: Set<() => void> | undefined;\n\nexport function context(ignore?: boolean){\n if(ignore)\n return () => () => {};\n\n const current = EffectContext;\n const ctx = EffectContext = new Set;\n\n return () => {\n EffectContext = current;\n \n return () => {\n ctx.forEach(fn => fn());\n }\n }\n}\n\nexport {\n addListener,\n createEffect,\n createProxy,\n event,\n OnUpdate,\n PENDING_KEYS,\n pending,\n watch\n}","import { addListener, createEffect, event, OnUpdate, pending, PENDING_KEYS, watch } from './control';\n\nconst define = Object.defineProperty;\n\n/** Register for all active models via string identifiers (usually unique). */\nconst ID = new WeakMap<Model, string>();\n\n/** Internal state assigned to models. */\nconst STATE = new WeakMap<Model, Record<string | number | symbol, unknown>>();\n\n/** External listeners for any given Model. */\nconst NOTIFY = new WeakMap<Model.Type, Set<OnUpdate>>();\n\n/** Parent-child relationships. */\nconst PARENT = new WeakMap<Model, Model | null>();\n\n/** List of methods defined by a given type. */\nconst METHODS = new WeakMap<Model.Type, Map<string, (value: any) => void>>();\n\n/** Reference bound instance methods to real ones. */\nconst METHOD = new WeakMap<any, any>();\n\ndeclare namespace Model {\n /** Any type of Model, using own class constructor as its identifier. */\n type Type<T extends Model = Model> =\n (abstract new (...args: any[]) => T) & typeof Model;\n\n /** A Model constructor, but which is not abstract. */\n type Init<T extends Model = Model> =\n (new (...args: Model.Args<T>) => T) & Omit<typeof Model, never>;\n\n /**\n * Model constructor callback - is called when Model finishes intializing.\n * Returned function will run when model is destroyed.\n */\n type Callback<T extends Model = Model> =\n (this: T, thisArg: T) => Promise<void> | (() => void) | Assign<T> | void;\n\n /** Model constructor argument */\n type Argument<T extends Model = Model> = Assign<T> | Callback<T> | string | void;\n\n /** Model constructor arguments */\n type Args<T extends Model = any> = (Argument<T> | Args<T>)[];\n\n /** Subset of `keyof T` which are not methods or defined by base Model U. **/\n type Field<T> = Exclude<keyof T, keyof Model>;\n\n /** Any valid key for model, including but not limited to Field<T>. */\n type Event<T> = Field<T> | (string & {}) | number | symbol;\n\n /** Object overlay to override values and methods on a model. */\n type Assign<T> = {\n [K in Field<T>]?:\n T[K] extends (...args: infer A) => infer R \n ? (this: T, ...args: A) => R\n : T[K];\n } & Record<string, unknown>;\n\n /** Export/Import compatible value for a given property in a Model. */\n type Export<R> = R extends { get(): infer T } ? T : R;\n\n /** Value for a property managed by a model. */\n type Value<T extends Model, K extends Event<T>> =\n K extends keyof T ? Export<T[K]> : unknown;\n\n type OnEvent<T extends Model> =\n (this: T, key: unknown, source: T) => (() => void) | void | null;\n\n type OnUpdate<T extends Model, K extends Event<T>> =\n (this: T, key: K, thisArg: K) => void;\n\n /**\n * Values from current state of given model.\n * Differs from `Values` as values here will drill\n * into \"real\" values held by exotics like ref.Object.\n */\n type State<T> = { [P in Field<T>]: Export<T[P]> };\n\n /** Object comperable to data found in T. */\n type Values<T> = { [P in Field<T>]?: Export<T[P]> };\n\n /** Exotic value, where actual value is contained within. */\n type Ref<T = any> = {\n (next: T): void;\n current: T | null;\n }\n\n /**\n * A callback function which is subscribed to parent and updates when accessed properties change.\n * \n * @param current - Current state of this model. This is a proxy which detects properties which\n * where accessed, and thus depended upon to stay current.\n * \n * @param update - Set of properties which have changed, and events fired, since last update.\n * \n * @returns A callback function which will be called when this effect is stale.\n */\n type Effect<T> = (this: T, current: T, update: Set<Event<T>>) =>\n EffectCallback | Promise<void> | null | void;\n\n /**\n * A callback function returned by effect. Will be called when effect is stale.\n * \n * @param update - `true` if update is pending, `false` effect has been cancelled, `null` if model is destroyed.\n */\n type EffectCallback = ((update: boolean | null) => void);\n\n /**\n * Property initializer, will run upon instance creation.\n * Optional returned callback will run when once upon first access.\n */\n type Instruction<T = any, M extends Model = any> =\n // TODO: Should this allow for numbers/symbol properties?\n (this: M, key: Extract<Field<M>, string>, thisArg: M, state: State<M>) =>\n Descriptor<T> | ((source: M) => T) | void;\n\n type Getter<T> = (source: Model) => T;\n type Setter<T> = (value: T, previous: T) => boolean | void | (() => T);\n\n type Descriptor<T = any> = {\n get?: Getter<T> | boolean;\n set?: Setter<T> | boolean;\n enumerable?: boolean;\n value?: T;\n }\n}\n\ninterface Model {\n /**\n * Loopback to instance of this model. This is useful when in a subscribed context,\n * to keep write access to `this` after a destructure. You can use it to read variables silently as well.\n **/\n is: this;\n}\n\nabstract class Model {\n constructor(...args: Model.Args){\n prepare(this);\n define(this, \"is\", { value: this });\n init(this, args);\n }\n\n /**\n * Pull current values from state. Flattens all models and exotic values recursively.\n * \n * @returns Object with all values from this model.\n **/\n get(): Model.State<this>;\n\n /**\n * Run a function which will run automatically when accessed values change.\n * \n * @param effect Function to run, and again whenever accessed values change.\n * If effect returns a function, it will be called when a change occurs (syncronously),\n * effect is cancelled, or parent model is destroyed.\n * @returns Function to cancel listener.\n */\n get(effect: Model.Effect<this>): () => void;\n\n /**\n * Get value of a property.\n * \n * @param key - Property to get value of.\n * @param required - If true, will throw an error if property is not available.\n * @returns Value of property.\n */\n get<T extends Model.Event<this>>(key: T, required?: boolean): Model.Value<this, T>;\n\n /**\n * Run a function when a property is updated.\n * \n * @param key - Property to watch for updates.\n * @param callback - Function to call when property is updated.\n * @returns Function to cancel listener.\n */\n get<T extends Model.Event<this>>(key: T, callback: Model.OnUpdate<this, T>): () => void;\n\n /**\n * Check if model is expired.\n * \n * @param status - `null` to check if model is expired.\n * @returns `true` if model is expired, `false` otherwise.\n */\n get(status: null): boolean;\n\n /**\n * Callback when model is to be destroyed.\n * \n * @param callback - Function to call when model is destroyed.\n * @returns Function to cancel listener.\n */\n get(status: null, callback: () => void): () => void;\n\n get(arg1?: Model.Effect<this> | string | null, arg2?: boolean | Model.OnUpdate<this, any>){\n const self = this.is;\n\n if(typeof arg1 == \"function\"){\n let pending = new Set<Model.Event<this>>();\n\n return createEffect(self, (proxy) => {\n const cb = arg1.call(proxy, proxy, pending);\n\n return cb === null ? null : ((update) => {\n pending = PENDING_KEYS.get(self)!;\n if(typeof cb == \"function\")\n cb(update);\n })\n });\n }\n\n return (\n arg1 === undefined ?\n snapshot(self) :\n typeof arg2 == \"function\" ?\n addListener(self, arg2, arg1) :\n arg1 === null ?\n Object.isFrozen(STATE.get(self)) :\n fetch(self, arg1, arg2)\n )\n }\n\n /**\n * Get update in progress.\n *\n * @returns Promise which resolves object with updated values, `undefined` if there no update is pending.\n **/\n set(): PromiseLike<Model.Event<this>[]> | undefined;\n\n /**\n * Update mulitple properties at once. Merges argument with current state.\n * Properties which are not managed by this model will be ignored.\n * \n * @param assign - Object with properties to update.\n * @param silent - If an update does occur, listeners will not be refreshed automatically.\n * @returns Promise resolving an array of keys updated, `undefined` (immediately) if a noop.\n */\n set(assign?: Model.Assign<this>, silent?: boolean): PromiseLike<Model.Event<this>[]> | undefined;\n\n /**\n * Push an update. This will not change the value of associated property.\n * \n * Useful where a property value internally has changed, but the object is the same.\n * For example: An array has pushed a new value, or a nested property is updated.\n * \n * You can also use this to dispatch arbitrary events.\n * Symbols are recommended as non-property events, however you can use any string.\n * If doing so, be sure to avoid collisions with property names! An easy way to do this is\n * to prefix an event with \"!\" and/or use dash-case. e.g. `set(\"!event\")` or `set(\"my-event\")`.\n * \n * @param key - Property or event to dispatch.\n * @returns Promise resolves an array of keys updated.\n */\n set(key: Model.Event<this>): PromiseLike<Model.Event<this>[]>;\n\n /**\n * Call a function when update occurs.\n * \n * Given function is called for every assignment (which changes value) or explicit `set`.\n * \n * To run logic on final value only, callback may return a function. Using the same\n * function for one or more events will ensure it is called only when events are settled.\n * \n * @param callback - Function to call when update occurs.\n * @returns Function to remove listener. Will return `true` if removed, `false` if inactive already.\n * \n */\n set(callback: Model.OnEvent<this>): () => boolean;\n\n /**\n * Call a function when a property is updated.\n * Unlike `get`, this calsl synchronously and will fire as many times as the property is updated.\n * \n * @param key - Property to watch for updates.\n * @param callback - Function to call when property is updated.\n */\n set(key: Model.Event<this> | null, callback: Model.OnEvent<this>): () => boolean;\n\n /**\n * Declare an end to updates. This event is final and will freeze state.\n * This event can be watched for as well, to run cleanup logic and internally will remove all listeners.\n * \n * @param status - `null` to end updates.\n */\n set(status: null): void;\n\n set(\n arg1?: Model.OnEvent<this> | Model.Assign<this> | Model.Event<this> | null,\n arg2?: boolean | Model.OnEvent<this>){\n\n const self = this.is;\n\n if(typeof arg1 == \"function\")\n return addListener(self, key => {\n if(typeof key == \"string\")\n return arg1.call(self, key, self);\n })\n \n if(typeof arg2 == \"function\")\n return addListener(self, key => {\n if(key === arg1)\n return arg2.call(self, key, self);\n });\n\n if(arg1 && typeof arg1 == \"object\"){\n const methods = METHODS.get(self.constructor as Model.Type)!;\n \n for(const key in arg1){\n const bind = methods.get(key);\n if(bind)\n bind.call(self, arg1[key]);\n else if(key in self)\n if(arg2 === true || !Object.getOwnPropertyDescriptor(self, key)?.set)\n update(self, key, arg1[key], arg2 === true);\n else\n (self as any)[key] = arg1[key];\n }\n }\n else\n event(self, arg1);\n\n return pending(self);\n }\n\n /**\n * Iterate over managed properties in this instance of Model.\n * Yeilds the key and current value for each property.\n */\n [Symbol.iterator](): Iterator<[string, unknown]> {\n return Object.entries(STATE.get(this.is)!)[Symbol.iterator]();\n }\n\n /**\n * Create and activate a new instance of this model.\n * \n * **Important** - Unlike `new this(...)` - this method also activates state.\n * \n * @param args - arguments sent to constructor\n */\n static new<T extends Model>(this: Model.Init<T>, ...args: Model.Args<T>){\n const instance = new this(...args);\n event(instance);\n return instance;\n }\n\n /**\n * Static equivalent of `x instanceof this`.\n * Determines if provided class is a subtype of this one.\n * If so, language server will make available all static\n * methods and properties of this class.\n */\n static is<T extends Model.Type>(this: T, maybe: unknown): maybe is T {\n return maybe === this || typeof maybe == \"function\" && maybe.prototype instanceof this;\n }\n\n /**\n * Register a callback to run when any instance of this Model is updated. \n */\n static on<T extends Model>(this: Model.Type<T>, listener: Model.OnEvent<T>){\n let notify = NOTIFY.get(this);\n\n if(!notify)\n NOTIFY.set(this, notify = new Set);\n\n notify.add(listener);\n\n return () => notify.delete(listener);\n }\n}\n\ndefine(Model.prototype, \"toString\", {\n value(){\n return ID.get(this.is);\n }\n});\n\ndefine(Model, \"toString\", {\n value(){\n return this.name;\n }\n});\n\n/** Apply instructions and inherited event listeners. Ensure class metadata is ready. */\nfunction prepare(model: Model){\n let T = model.constructor as Model.Type;\n\n if(T === Model)\n throw new Error(\"Cannot create base Model.\");\n\n const chain = [] as Model.Type[];\n let keys = new Map<string, (value: any) => void>();\n\n ID.set(model, `${T}-${uid()}`);\n\n while(T.name){\n for(const cb of NOTIFY.get(T) || [])\n addListener(model, cb);\n\n if(T === Model) break;\n else chain.unshift(T);\n\n T = Object.getPrototypeOf(T)\n }\n\n for(const type of chain){\n if(METHODS.has(type)){\n keys = METHODS.get(type)!;\n continue;\n }\n\n METHODS.set(type, keys = new Map(keys));\n\n for(const [key, { value }] of Object.entries(\n Object.getOwnPropertyDescriptors(type.prototype)\n )){\n if(!value || key == \"constructor\")\n continue;\n \n function bind(this: Model, method = value){\n const value = method.bind(this.is);\n \n METHOD.set(value, method);\n define(this.is, key, { value, writable: true });\n \n return value;\n }\n\n keys.set(key, bind);\n define(type.prototype, key, { get: bind, set: bind });\n }\n }\n}\n\n/**\n * Apply model arguemnts, run callbacks and observe properties.\n * Accumulate and handle cleanup events.\n **/\nfunction init(model: Model, args: Model.Args){\n const methods = METHODS.get(model.constructor as Model.Type)!;\n const state = {} as Record<string | number | symbol, unknown>;\n\n STATE.set(model, state);\n\n args = args.flat().filter(arg => {\n if(typeof arg != \"string\")\n return true;\n\n ID.set(model, arg);\n });\n\n addListener(model, () => {\n if(!PARENT.has(model))\n PARENT.set(model, null);\n \n args.forEach((arg) => {\n const use = typeof arg == \"function\"\n ? arg.call(model, model)\n : arg as Model.Assign<Model>;\n\n if(use instanceof Promise)\n use.catch(err => {\n console.error(`Async error in constructor for ${model}:`);\n console.error(err);\n });\n else if(typeof use == \"function\")\n addListener(model, use, null)\n else if(typeof use == \"object\")\n for(const key in use)\n if(key in model || methods.has(key))\n model[key as keyof Model] = use[key] as any;\n });\n\n for(const key in model){\n const desc = Object.getOwnPropertyDescriptor(model, key)!;\n\n if(\"value\" in desc){\n update(model, key, desc.value, true);\n define(model, key, {\n configurable: false,\n get(){\n return watch(this, key, state[key]);\n },\n set(value){\n update(model, key, value);\n mayAdopt(model, value);\n }\n });\n }\n }\n\n addListener(model, () => {\n for(const [_, value] of model)\n if(value instanceof Model && PARENT.get(value) === model)\n value.set(null);\n \n Object.freeze(state);\n }, null);\n \n return null;\n });\n}\n\nfunction mayAdopt(parent: Model, child: unknown){\n if(child instanceof Model && !PARENT.has(child)){\n PARENT.set(child, parent);\n event(child);\n }\n}\n\nfunction fetch(subject: Model, property: string, required?: boolean){\n const state = STATE.get(subject)!;\n \n if(property in state || required === false){\n const value = state[property];\n\n if(value !== undefined || !required)\n return value;\n }\n\n const error = new Error(`${subject}.${property} is not yet available.`);\n const promise = new Promise<any>((resolve, reject) => {\n addListener(subject, key => {\n if(key === property){\n resolve(state[key]);\n return null;\n }\n\n if(key === null)\n reject(new Error(`${subject} is destroyed.`));\n });\n });\n\n throw Object.assign(promise, {\n toString: () => String(error),\n name: \"Suspense\",\n message: error.message,\n stack: error.stack\n });\n}\n\n/** Currently accumulating export. Stores real values of placeholder properties such as ref() or child models. */\nlet EXPORT: Map<any, any> | undefined;\n\nfunction snapshot<T extends Model>(model: T): Model.State<T> {\n const values = {} as any;\n let isNotRecursive;\n\n if(!EXPORT){\n isNotRecursive = true;\n EXPORT = new Map([[model, values]]);\n }\n\n for(let [key, value] of model){\n if(EXPORT.has(value))\n value = EXPORT.get(value);\n else if(value && typeof value == \"object\" && \"get\" in value && typeof value.get === \"function\")\n EXPORT.set(value, value = value.get());\n\n values[key] = value;\n }\n\n if(isNotRecursive)\n EXPORT = undefined;\n\n return Object.freeze(values);\n}\n\nfunction update<T>(\n subject: Model,\n key: string | number | symbol,\n value: T,\n arg?: boolean | Model.Setter<T>){\n\n const state = STATE.get(subject)!;\n\n if(Object.isFrozen(state))\n throw new Error(`Tried to update ${String(key)} but ${subject} is destroyed.`);\n\n const previous = state[key] as T;\n\n if(typeof arg == \"function\"){\n const out = arg.call(subject, value, previous);\n\n if(out === false)\n return false;\n\n if(typeof out == \"function\")\n value = out();\n }\n\n if(value === previous)\n return;\n\n state[key] = value;\n\n if(arg !== true)\n event(subject, key);\n\n return true;\n}\n\n/** Random alphanumberic of length 6; always starts with a letter. */\nfunction uid(){\n return (0.278 + Math.random() * 0.722).toString(36).substring(2, 8).toUpperCase();\n}\n\nexport {\n event,\n fetch,\n mayAdopt,\n METHOD,\n Model,\n PARENT,\n STATE,\n uid,\n update,\n}","import { addListener } from './control';\nimport { event, Model, PARENT, uid } from './model';\n\nconst LOOKUP = new WeakMap<Model, Context | ((got: Context) => void)[]>();\nconst KEYS = new Map<symbol | Model.Type, symbol>();\n\nfunction key(T: Model.Type | symbol, upstream?: boolean): symbol {\n let K = KEYS.get(T);\n\n if(!K)\n KEYS.set(T, K = Symbol(\n typeof T == \"symbol\" ? \"get \" + T.description : String(T)\n ));\n \n return upstream ? key(K) : K;\n}\n\nfunction keys(from: Model.Type, upstream?: boolean){\n const keys = new Set<symbol>();\n\n do {\n keys.add(key(from, upstream));\n }\n while((from = Object.getPrototypeOf(from)) !== Model);\n\n return keys;\n}\n\ndeclare namespace Context {\n type Multiple<T extends Model> = {\n [key: string | number]: Model.Init<T> | T;\n };\n\n type Accept<T extends Model = Model> = T | Model.Init<T> | Multiple<T>;\n\n type Expect<T extends Model = Model> = (model: T) => (() => void) | void;\n}\n\ninterface Context {\n [key: symbol]: Model | Context.Expect | null | undefined;\n}\n\nclass Context {\n static get<T extends Model>(on: Model, callback: ((got: Context) => void)): void;\n static get<T extends Model>(on: Model): Context | undefined;\n static get({ is }: Model, callback?: (got: Context) => void){\n const waiting = LOOKUP.get(is);\n\n if(waiting instanceof Context){\n if(callback)\n callback(waiting);\n\n return waiting;\n }\n\n if(callback)\n if(waiting) \n waiting.push(callback);\n else \n LOOKUP.set(is, [callback]);\n }\n\n public id!: string;\n\n protected layer = new Map<string | number, Model | Model.Type>();\n protected cleanup = new Set<() => void>();\n\n constructor(inputs?: Context.Accept){\n if(inputs)\n this.include(inputs);\n }\n\n /** Run callback when a specified type is registered to a **child** context. */\n public has<T extends Model>(Type: Model.Type<T>, callback: (model: T) => void){\n Object.defineProperty(this, key(Type, true), { value: callback, configurable: true });\n }\n\n /** Find specified type registered to a parent context. Returns undefined if none are found. */\n public get<T extends Model>(Type: Model.Type<T>, require: true): T;\n public get<T extends Model>(Type: Model.Type<T>, require?: boolean): T | undefined;\n public get<T extends Model>(Type: Model.Type<T>, require?: boolean){\n const result = this[key(Type)];\n\n if(result === null)\n throw new Error(`Did find ${Type} in context, but multiple were defined.`);\n\n if(result)\n return result as T;\n\n if(require)\n throw new Error(`Could not find ${Type} in context.`);\n }\n\n public push(inputs?: Context.Accept){\n const next = Object.create(this) as this;\n\n this.cleanup = new Set([() => next.pop(), ...this.cleanup]);\n\n next.layer = new Map();\n next.cleanup = new Set();\n\n if(inputs)\n next.include(inputs);\n\n return next;\n }\n\n public pop(){\n for(const key of Object.getOwnPropertySymbols(this))\n delete (this as any)[key];\n\n this.cleanup.forEach(cb => cb());\n this.cleanup.clear();\n this.layer.clear();\n }\n\n public include<T extends Model>(\n inputs: Context.Accept<T>,\n forEach?: Context.Expect<T>\n ){\n const init = new Map<Model, boolean>();\n\n if(typeof inputs == \"function\" || inputs instanceof Model)\n inputs = { [forEach ? 0 : this.layer.size]: inputs };\n\n Object.entries(inputs).forEach(([K, V]: [string, Model | Model.Init<Model>]) => {\n if(Model.is(V) || V instanceof Model){\n const exists = this.layer.get(K);\n \n if(!exists){\n const instance = this.add(V);\n \n this.layer.set(K, V);\n init.set(instance, true);\n }\n // Context must force-reset because inputs are no longer safe.\n else if(exists !== V){ \n this.pop();\n this.id = uid();\n this.include(inputs);\n }\n\n return;\n }\n\n throw new Error(\n `Context may only include instance or class \\`extends Model\\` but got ${\n K == '0' || K == V ? V : `${V} (as '${K}')`\n }.`\n );\n })\n\n for(const [model, explicit] of init){\n model.set();\n\n if(explicit && forEach)\n forEach(model as T);\n\n for(const [_key, value] of model)\n if(PARENT.get(value as Model) === model){\n this.add(value as Model, true);\n init.set(value as Model, false);\n }\n }\n }\n\n protected add<T extends Model>(\n input: T | Model.Init<T>,\n implicit?: boolean){\n\n const cleanup = new Set<() => void>();\n let T: Model.Type<T>;\n let I: T;\n\n if(typeof input == \"function\"){\n T = input;\n I = new input() as T;\n }\n else {\n T = input.constructor as Model.Type<T>;\n I = input;\n }\n\n keys(T, true).forEach(K => {\n const expects = this[K] as Context.Expect | undefined;\n \n if(!expects)\n return;\n \n addListener(I, event => {\n if(event === true){\n const callback = expects(I);\n \n if(callback)\n cleanup.add(callback);\n }\n\n return null;\n }) \n });\n\n keys(T).forEach(K => {\n const value = this.hasOwnProperty(K) ? null : I;\n\n if(value || this[K] !== I && !implicit)\n Object.defineProperty(this, K, {\n configurable: true,\n value\n });\n });\n\n this.cleanup.add(() => {\n cleanup.forEach(cb => cb());\n\n if(I !== input)\n event(I, null);\n })\n\n const waiting = LOOKUP.get(I);\n \n if(waiting instanceof Array)\n waiting.forEach(cb => cb(this));\n\n LOOKUP.set(I, this);\n\n return I;\n }\n}\n\nexport { Context }","import { watch } from '../control';\nimport { fetch, mayAdopt, Model, PARENT, STATE, update } from '../model';\n\nconst INSTRUCTION = new Map<symbol, Model.Instruction>();\n\nfunction use <T> (instruction: Model.Instruction<T>): T extends void ? unknown : T;\n\nfunction use <T extends Model> (Type: Model.Init<T>, required: false): T | undefined;\n\nfunction use <T extends Model> (Type: Model.Init<T>, ready?: (i: T) => void): T;\n\nfunction use(\n arg1: Model.Init | Model.Instruction,\n arg2?: ((i: Model) => void) | boolean){\n\n const token = Symbol(\"instruction\");\n\n if(Model.is(arg1))\n arg1 = child(arg1, arg2);\n\n INSTRUCTION.set(token, arg1);\n return token;\n}\n\nfunction child(\n type: Model.Init<Model>,\n arg2?: ((i: Model) => void) | boolean\n): Model.Instruction<any, any> {\n return (key, subject) => {\n function set(next: Model | undefined){\n if(next ? !(next instanceof type) : arg2 !== false)\n throw new Error(`${subject}.${key} expected Model of type ${type} but got ${next && next.constructor}.`);\n\n update(subject, key, next);\n\n if(next && typeof arg2 == \"function\")\n arg2(next);\n\n return false;\n }\n\n const value = new type();\n\n set(value);\n PARENT.set(value, subject);\n value.set();\n\n return { set };\n }\n}\n\nfunction init(this: Model){\n const state = STATE.get(this)!;\n\n for(const key in this){\n const { value } = Object.getOwnPropertyDescriptor(this, key)!;\n const instruction = INSTRUCTION.get(value);\n\n if(!instruction){\n mayAdopt(this, value);\n continue;\n }\n\n INSTRUCTION.delete(value);\n delete (this as any)[key];\n\n const output = instruction.call(this, key, this, state);\n\n if(!output)\n continue;\n\n const desc = typeof output == \"object\" ? output : { get: output };\n\n if(\"value\" in desc)\n state[key] = desc.value;\n\n const model = this;\n\n Object.defineProperty(model, key, {\n enumerable: desc.enumerable !== false,\n get(this: Model){\n return watch(this, key, \n typeof desc.get == \"function\"\n ? desc.get(this)\n : fetch(model, key, desc.get)\n );\n },\n set(next){\n if(desc.set === false)\n throw new Error(`${model}.${key} is read-only.`);\n\n update(model, key, next, desc.set);\n }\n })\n }\n\n return null;\n}\n\nModel.on(init);\n\nexport { use }","import { Context } from '../context';\nimport { createEffect } from '../control';\nimport { fetch, METHOD, Model, PARENT, event, update } from '../model';\nimport { use } from './use';\n\ntype Type<T extends Model> = Model.Type<T> & typeof Model;\n\nconst STALE = new WeakSet<() => void>();\n\ndeclare namespace get {\n type Compute<T, S = any> = (on: S, key: string) => T;\n\n type Factory<T, S = any> = (this: S, key: string, thisArg: S) => T;\n\n type Source<T extends Model = Model> = (resolve: (x: T) => void) => void;\n\n type Effect<T> = (model: T, key: string) => (() => void) | void;\n}\n\n/**\n * Fetches and assigns the controller which spawned this host.\n * When parent assigns an instance via `use()` directive, it\n * will be made available to child upon this request.\n *\n * @param Type - Type of controller compatible with this class. \n * @param expectParent - If true, will throw if Model is created without a parent.\n */\nfunction get <T extends Model> (Type: Model.Type<T>, asParent?: true): T;\n\n/**\n * Fetches and assigns the controller which spawned this host.\n * When parent assigns an instance via `use()` directive, it\n * will be made available to child upon this request.\n *\n * @param Type - Type of controller compatible with this class. \n * @param required - If false, property may be undefined. Otherwise will throw suspense.\n */\nfunction get <T extends Model> (Type: Model.Type<T>, required?: false): T | undefined;\n\n/**\n * Implement a computed value from a foreign model. Output will be generated by provided function,\n * where the foreign model will be passed to that function.\n * \n * @param source - Type of Model to fetch for computation.\n * @param compute - Compute function. Will update automatically as input values change.\n */\nfunction get <T extends Model> (Type: Model.Type<T>, effect: get.Effect<T>): T;\n\n/**\n * Implement a computed value; output will be generated by provided function.\n *\n * @param source - Source model from which computed value will be a subscriber.\n * @param compute - Compute function. Bound to a subscriber-proxy of source, returns output value. Will update automatically as input values change.\n */\nfunction get <R, T extends Model> (source: T, compute: get.Compute<R, T>): R;\n\n/**\n * Implement a computed value; output is returned by function from provided factory.\n * \n * Factory is bound to owner of property.\n *\n * @param compute - Factory function to generate a getter to subscribe dependancies.\n */\nfunction get <R, T> (compute: get.Factory<R, T>): R;\n \nfunction get<R, T extends Model>(\n arg0: T | get.Factory<R, T> | Type<T>,\n arg1?: Function | boolean){\n\n return use((key, subject, state) => {\n if(typeof arg0 == \"symbol\")\n throw new Error(`Attempted to use an instruction result (probably use or get) as computed source for ${subject}.${key}. This is not allowed.`)\n\n if(Model.is(arg0)){\n const hasParent = PARENT.get(subject) as T;\n\n // TODO: notify on discovered context \n function assign(value: T) {\n if (typeof arg1 == \"function\")\n value.get(x => (arg1 as Function)(x, key));\n\n update(subject, key, value);\n }\n\n if(!hasParent && arg1 === true)\n throw new Error(`${subject} may only exist as a child of type ${arg0}.`);\n else if(hasParent)\n if(hasParent instanceof arg0){\n assign(hasParent);\n return {}\n }\n else if(arg1 === true)\n throw new Error(`New ${subject} created as child of ${hasParent}, but must be instanceof ${arg0}.`);\n \n Context.get(subject, (context) => {\n const model = context.get(arg0);\n\n if(model)\n assign(model);\n else if(arg1 !== false)\n throw new Error(`Required ${arg0} not found in context for ${subject}.`)\n });\n\n return {\n get: arg1 !== false\n };\n }\n \n let from = subject;\n \n if(arg0 instanceof Model){\n from = arg0;\n }\n else {\n const fn = METHOD.get(arg0) || arg0;\n arg1 = ((p, k) => fn.call(p, k, p)) as get.Effect<T>;\n }\n\n const source: get.Source<T> = resolve => resolve(from);\n const getter = arg1 as get.Compute<R, T>;\n\n let reset: (() => void) | undefined;\n let isAsync: boolean;\n let proxy: any;\n\n function connect(model: Model){\n reset = createEffect(model, current => {\n proxy = current;\n\n if(!(key in state) || STALE.delete(compute))\n compute(!reset);\n\n return (didUpdate) => {\n if(didUpdate){\n STALE.add(compute);\n event(subject, key, true);\n }\n };\n }, false)\n }\n\n function compute(initial?: boolean){\n let next: R | undefined;\n\n try {\n next = getter.call(proxy, proxy, key);\n }\n catch(err){\n console.warn(`An exception was thrown while ${initial ? \"initializing\" : \"refreshing\"} ${subject}.${key}.`)\n\n if(initial)\n throw err;\n\n console.error(err);\n }\n\n update(subject, key, next, !isAsync);\n }\n\n return () => {\n if(!proxy){\n source(connect);\n isAsync = true;\n }\n\n if(STALE.delete(compute))\n compute();\n\n return fetch(subject, key, !proxy) as T;\n }\n })\n}\n\nexport { get };","import { context } from '../control';\nimport { Model, update } from '../model';\nimport { use } from './use';\n\nconst { defineProperty, defineProperties } = Object;\n\ndeclare namespace ref {\n type Callback<T> = (argument: T) =>\n ((next: T | null) => void) | Promise<void> | void | boolean;\n\n interface Object<T = any> {\n (next: T | null): void;\n\n /** Current value held by this reference. */\n current: T | null;\n\n /** Retrieve current value. */\n get(): T | null;\n }\n\n /** Object with references to all managed values of `T`. */\n\n /** Object with references to all managed values of `T`. */\n type Proxy<T extends Model> =\n & { [P in Model.Field<T>]-?: Object<T[P]> }\n & { get(): T };\n\n type CustomProxy<T extends Model, R> =\n & { [P in Model.Field<T>]-?: R }\n & { get(): T };\n}\n\n/**\n * Creates an object with references to all managed values.\n * Each property is a function to set value in state when invoked.\n *\n * *Properties are simultaneously a ref-function and ref-object, use as needed.*\n *\n * @param target - Source model from which to reference values.\n */\nfunction ref <T extends Model> (target: T): ref.Proxy<T>;\n\n/**\n * Creates an object with values based on managed values.\n * Each property will invoke mapper function on first access supply\n * the its return value going forward.\n *\n * @param target - Source model from which to reference values.\n * @param mapper - Function producing the placeholder value for any given property.\n */\nfunction ref <O extends Model, R>\n (target: O, mapper: (key: Model.Field<O>) => R): ref.CustomProxy<O, R>;\n\n/**\n * Creates a ref-compatible property.\n * Will persist value, and updates to this are made part of controller event-stream.\n *\n * *Output is simultaneously a ref-function and ref-object, use as needed.*\n *\n * @param callback - Optional callback to synchronously fire when reference is first set or does update.\n */\nfunction ref <T> (callback?: ref.Callback<T>): ref.Object<T>;\n\n/**\n * Creates a ref-compatible property.\n * Will persist value, and updates to this are made part of controller event-stream.\n *\n * *Output is simultaneously a ref-function and ref-object, use as needed.*\n *\n * @param callback - Optional callback to synchronously fire when reference is first set or does update.\n * @param ignoreNull - Default `true`. If `false`, will still callback with `null`.\n */\nfunction ref <T> (callback: ref.Callback<T | null>, ignoreNull: boolean): ref.Object<T>;\n\nfunction ref<T>(\n arg?: ref.Callback<T> | Model,\n arg2?: ((key: string) => any) | boolean){\n\n return use<T>((key, subject, state) => {\n let value = {};\n\n if(arg === subject)\n subject.get(() => {\n for(const key in state)\n if(typeof arg2 == \"function\")\n defineProperty(value, key, {\n configurable: true,\n get(){\n const out = arg2(key);\n defineProperty(value, key, { value: out });\n return out;\n }\n })\n else {\n const get = () => state[key];\n const set = (value: unknown) => {\n update(subject, key, value)\n };\n \n defineProperty(set, \"current\", { get, set });\n defineProperty(set, \"get\", { value: get });\n defineProperty(value, key, { value: set });\n }\n })\n\n else if(typeof arg == \"object\")\n throw new Error(\"ref instruction does not support object which is not 'this'\");\n\n else {\n let unset: ((next: T) => void) | undefined;\n\n const get = () => state[key];\n const set = (value?: any) => {\n if(!update(subject, key, value) || !arg)\n return;\n\n if(unset)\n unset = void unset(value);\n \n if(value === null && arg2 !== false)\n return;\n\n const ctx = context();\n const out = arg.call(subject, value);\n const flush = ctx();\n\n unset = key => {\n if(typeof out == \"function\")\n out(key);\n\n flush();\n }\n };\n \n state[key] = null;\n value = defineProperties(set, {\n current: { get, set },\n get: { value: get }\n }) as ref.Object<T>;\n }\n\n defineProperty(subject, key, { value });\n })\n}\n\nexport { ref }","import { context } from '../control';\nimport { Model, event, update } from '../model';\nimport { use } from './use';\n\ndeclare namespace set {\n type Callback<T, S = any> = (this: S, next: T, previous: T) =>\n ((next: T) => void) | Promise<any> | void | boolean;\n\n type Factory<T, S = any> = (this: S, key: string) => Promise<T> | T;\n}\n\n/**\n * Set property as `undefined` but required.\n * \n * Property cannot be accessed until it is defined. If accessed while undefined, a hybrid\n * `Promise`/`Error` (aka: [Suspense](https://reactjs.org/docs/concurrent-mode-suspense.html)) will be thrown.\n */\nfunction set <T = any>(): T;\n\n/**\n * Set property with a factory function.\n * \n * Run factory only if/when accessed. Value will be undefined until\n * factory resolves, which will also dispatch an update for the property.\n */\nfunction set <T> (factory: set.Factory<T> | Promise<T>, required: false): T | undefined;\n\n/**\n * Set property with a factory function.\n *\n * If async, property cannot be accessed until resolves, yeilding a result.\n * If accessed while still processing, React Suspense will be thrown.\n *\n * @param factory - Callback run to derrive property value.\n * @param required - If true run factory immediately on creation, otherwise on access.\n */\nfunction set <T> (factory: set.Factory<T> | Promise<T>, required?: boolean): T;\n\n/**\n * Set a property with empty placeholder and/or update callback.\n * \n * @param value - Starting value for property. If undefined, suspense will be thrown on access, until value is set and accepted by callback.\n * @param onUpdate - Callback run when property is set. If returns false, update is not accepted and property will keep previous value.\n */\nfunction set <T> (value: T | undefined, onUpdate?: set.Callback<T>): T;\n\nfunction set <T> (\n value?: set.Factory<T> | Promise<T> | T,\n argument?: set.Callback<any> | boolean){\n\n return use<T>((key, subject) => {\n const property: Model.Descriptor = {};\n\n if(typeof value == \"function\" || value instanceof Promise){\n function init(){\n if(typeof value == \"function\")\n try {\n value = attempt(value.bind(subject, key));\n }\n catch(err){\n console.warn(`Generating initial value for ${subject}.${key} failed.`);\n throw err;\n }\n\n property.get = argument === true;\n\n if(value instanceof Promise){\n value\n .then(value => {\n update(subject, key, value);\n return value;\n })\n .catch(err => {\n event(subject, key);\n property.get = () => { throw err };\n })\n }\n else\n update(subject, key, value);\n\n if(0 in arguments)\n return subject[key];\n }\n\n if(argument)\n init();\n else\n property.get = init;\n }\n else if(value !== undefined)\n property.value = value;\n\n if(typeof argument == \"function\"){\n let unset: ((next: T) => void) | undefined;\n\n property.set = function(this: any, value: any, previous: any){\n const ctx = context();\n const out = argument.call(this, value, previous);\n const flush = ctx();\n\n if(out === false)\n return out;\n\n if(typeof unset == \"function\")\n unset(value);\n\n unset = (next: T) => {\n if(typeof out == \"function\")\n out(next);\n\n flush();\n }\n }\n }\n else\n property.set = value => {\n property.get = undefined;\n update(subject, key, value);\n }\n\n return property;\n })\n}\n\nfunction attempt(fn: () => any): any {\n function retry(err: unknown){\n if(err instanceof Promise)\n return err.then(compute);\n else\n throw err;\n }\n\n function compute(): any {\n try {\n const output = fn();\n\n return output instanceof Promise\n ? output.catch(retry)\n : output;\n }\n catch(err){\n return retry(err);\n }\n }\n\n return compute();\n}\n\nexport { set }","import { context } from '../control';\nimport { Context } from '../context';\nimport { Model, update } from '../model';\nimport { use } from './use';\n\nconst APPLY = new WeakMap<Model, (model: Model) => (() => void) | boolean | void>();\n\ndeclare namespace has {\n type Callback<T = any> = (model: T, recipient: Model) => void | boolean | (() => void);\n}\n\nfunction has <T extends Model> (type: Model.Type<T>, callback?: has.Callback<T>): readonly T[];\nfunction has (callback?: has.Callback): readonly Model[];\n \nfunction has <T extends Model> (\n arg1?: Model.Type<T> | has.Callback<Model>,\n arg2?: has.Callback<T>){\n\n return use<T[]>((key, subject) => {\n const applied = new Set<Model>();\n const reset = () => {\n update(subject, key, Object.freeze(Array.from(applied)));\n }\n\n if(Model.is(arg1))\n Context.get(subject, ctx => {\n ctx.has(arg1, model => {\n const ctx = context();\n let remove: (() => void) | void | undefined;\n let disconnect: (() => void) | undefined;\n \n if(applied.has(model))\n return;\n \n const notify = APPLY.get(model);\n \n if(notify){\n const after = notify(subject);\n \n if(after === false)\n return;\n \n if(typeof after == \"function\")\n disconnect = after;\n }\n \n if(typeof arg2 == \"function\"){\n const done = arg2(model, subject);\n \n if(done === false)\n return false;\n \n remove = () => {\n if(typeof done == \"function\")\n done();\n }\n }\n\n const flush = ctx();\n \n applied.add(model);\n reset();\n \n const done = () => { \n flush();\n ignore();\n \n applied.delete(model);\n reset();\n \n if(disconnect)\n disconnect();\n \n if(typeof remove == \"function\")\n remove();\n\n remove = undefined;\n }\n \n const ignore = model.set(null, done);\n \n return done;\n })\n });\n else {\n if(APPLY.has(subject))\n throw new Error(`'has' callback can only be used once per model.`);\n\n APPLY.set(subject, recipient => {\n let remove: (() => void) | boolean | void;\n\n if(arg1){\n remove = arg1(recipient, subject);\n \n if(remove === false)\n return false;\n }\n\n applied.add(recipient);\n reset();\n\n return () => {\n applied.delete(recipient);\n reset();\n\n if(typeof remove == \"function\")\n remove();\n }\n });\n }\n\n return { value: [] };\n })\n}\n\nexport { has }"],"mappings":"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","names":["key","pending","res","event","listeners","pending","update","key","keys","bind","value","use","child","keys","require","key","init","event","key","set","init","key","assign","context","key","get","set","value","key","init","value","key","ctx","done"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/control.ts","../src/model.ts","../src/context.ts","../src/instruction/use.ts","../src/instruction/get.ts","../src/instruction/ref.ts","../src/instruction/set.ts","../src/instruction/has.ts"],"sourcesContent":["export { get } from './instruction/get';\nexport { ref } from './instruction/ref';\nexport { set } from './instruction/set';\nexport { use } from './instruction/use';\nexport { has } from './instruction/has';\n\nexport { Model, Model as default } from './model';\nexport { createEffect, createProxy, addListener } from './control';\nexport { Context } from './context';","import type { Model } from \"./model\";\n\n/**\n * Update callback function.\n * \n * @param key -\n * - `string` - property which has updated.\n * - `false` - a normal update has completed.\n * - `true` - initial event; instance is ready.\n * - `null` - terminal event; instance is expired.\n * @param source - Instance of Model for which update has occured.\n */\ntype OnUpdate<T extends Model = any> = \n (this: T, key: unknown, source: T) => (() => void) | null | void;\n\ntype OnAccess<T extends Model = any, R = unknown> =\n (from: T, key: string | number, value: R) => unknown;\n\ntype Effect<T extends Model> = (this: T, proxy: T) =>\n ((update: boolean | null) => void) | Promise<void> | null | void;\n\ntype Event = number | string | null | boolean | symbol;\n\n/** Placeholder event determines if model is initialized or not. */\nconst onReady = () => null;\n\nconst LISTENERS = new WeakMap<Model, Map<OnUpdate, Set<Event> | undefined>>();\n\n/** Events pending for a given object. */\nconst PENDING = new WeakMap<Model, Set<Event>>();\n\n/** Update register. */\nconst PENDING_KEYS = new WeakMap<Model, Set<string | number | symbol>>();\n\n/** Central event dispatch. Bunches all updates to occur at same time. */\nconst DISPATCH = new Set<() => void>();\n\nconst OBSERVER = new WeakMap<Model, OnAccess>();\n\nfunction addListener<T extends Model>(subject: T, callback: OnUpdate<T>, select?: Event){\n let listeners = LISTENERS.get(subject)!;\n\n if(!listeners)\n LISTENERS.set(subject, listeners = new Map([[onReady, undefined]]));\n\n const filter = select === undefined ? undefined : new Set([select]);\n\n if(!listeners.has(onReady) && !filter)\n callback.call(subject, true, subject);\n\n listeners.set(callback, filter);\n\n return () => listeners.delete(callback);\n}\n\nfunction emit(model: Model, key: Event): void {\n const listeners = LISTENERS.get(model)!;\n const notReady = listeners.has(onReady);\n\n if(key === true && !notReady)\n return;\n\n let pending = PENDING.get(model);\n\n if(pending){\n pending.add(key);\n return;\n }\n\n PENDING.set(model, pending = new Set(notReady ? [true, key] : [key]));\n\n for(const key of pending)\n for(const [callback, filter] of listeners)\n if(!filter || filter.has(key)){\n const after = callback.call(model, key, model);\n\n if(after)\n enqueue(after);\n\n else if(after === null)\n listeners.delete(callback);\n }\n\n if(key === null)\n listeners.clear();\n \n PENDING.delete(model);\n}\n\nfunction event(\n subject: Model,\n key?: string | number | symbol | null,\n silent?: boolean){\n\n if(key === null)\n return emit(subject, key);\n\n if(!key)\n return emit(subject, true);\n\n let pending = PENDING_KEYS.get(subject);\n\n if(!pending){\n PENDING_KEYS.set(subject, pending = new Set());\n\n if(!silent)\n enqueue(() => {\n emit(subject, false);\n PENDING_KEYS.delete(subject)\n })\n }\n\n pending.add(key);\n\n if(!silent)\n emit(subject, key);\n}\n\nfunction pending<T extends Model>(subject: T){\n if(PENDING_KEYS.has(subject))\n return <PromiseLike<Model.Event<T>[]>> {\n then: (res) => new Promise<any>(res => {\n const remove = addListener(subject, key => {\n if(key !== true){\n remove();\n return res.bind(null, Array.from(PENDING_KEYS.get(subject)!));\n }\n });\n }).then(res)\n }\n}\n\nfunction enqueue(eventHandler: (() => void)){\n if(!DISPATCH.size)\n setTimeout(() => {\n DISPATCH.forEach(event => {\n try {\n event();\n }\n catch(err){\n console.error(err);\n }\n });\n DISPATCH.clear();\n }, 0);\n\n DISPATCH.add(eventHandler);\n}\n\nfunction createProxy<T extends Model>(from: T, observer: OnAccess<T>){\n const proxy = Object.create(from) as T;\n OBSERVER.set(proxy, observer);\n return proxy;\n}\n\nfunction watch(from: any, key: string | number, value?: any){\n const access = OBSERVER.get(from);\n return access ? access(from, key, value) : value;\n}\n\n/**\n * Create a side-effect which will update whenever values accessed change.\n * Callback is called immediately and whenever values are stale.\n * \n * @param target - Instance of Model to observe.\n * @param callback - Function to invoke when values change.\n * @param requireValues - If `true` will throw if accessing a value which is `undefined`.\n */\nfunction createEffect<T extends Model>(target: T, callback: Effect<Required<T>>, requireValues: true): () => void;\nfunction createEffect<T extends Model>(target: T, callback: Effect<T>, recursive?: boolean): () => void;\nfunction createEffect<T extends Model>(target: T, callback: Effect<T>, argument?: boolean){\n const listeners = LISTENERS.get(target)!;\n\n let unset: ((update: boolean | null) => void) | undefined;\n let reset: (() => void) | null | undefined;\n\n function invoke(){\n let stale: boolean | undefined;\n\n const subscriber = createProxy(target, access);\n\n LISTENERS.set(subscriber, listeners);\n\n function onUpdate() {\n if (stale)\n return null;\n\n stale = true;\n\n if (reset && unset) {\n unset(true);\n unset = undefined;\n }\n\n return reset;\n }\n\n function access(from: Model, key: string | number, value: any) {\n if(value === undefined && argument)\n throw new Error(`${from}.${key} is required in this context.`);\n\n const listeners = LISTENERS.get(from)!;\n let listener = listeners.get(onUpdate);\n\n if(!listener)\n listeners.set(onUpdate, listener = new Set);\n\n listener.add(key);\n\n const nested = LISTENERS.get(value);\n\n if(nested)\n LISTENERS.set(\n value = createProxy(value, access),\n nested\n );\n\n return value;\n }\n\n try {\n const ctx = context(argument === false)\n const ret = callback.call(subscriber, subscriber);\n const flush = ctx();\n\n reset = ret === null ? null : invoke;\n unset = key => {\n if(typeof ret == \"function\")\n ret(key);\n\n flush();\n }\n }\n catch(err){\n if(err instanceof Promise){\n reset = undefined;\n err.then(invoke);\n }\n else\n throw err;\n }\n }\n\n function cleanup(){\n if(unset)\n unset(false);\n\n reset = null;\n };\n\n if(EffectContext && argument !== false)\n EffectContext.add(cleanup);\n\n addListener(target, key => {\n if(key === true)\n invoke();\n\n else if(!reset)\n return reset;\n\n if(key === null && unset)\n unset(null);\n });\n \n return cleanup;\n}\n\nlet EffectContext: Set<() => void> | undefined;\n\nexport function context(ignore?: boolean){\n if(ignore)\n return () => () => {};\n\n const current = EffectContext;\n const ctx = EffectContext = new Set;\n\n return () => {\n EffectContext = current;\n \n return () => {\n ctx.forEach(fn => fn());\n }\n }\n}\n\nexport {\n addListener,\n createEffect,\n createProxy,\n event,\n OnUpdate,\n PENDING_KEYS,\n pending,\n watch\n}","import { addListener, createEffect, event, OnUpdate, pending, PENDING_KEYS, watch } from './control';\n\nconst define = Object.defineProperty;\n\n/** Register for all active models via string identifiers (usually unique). */\nconst ID = new WeakMap<Model, string>();\n\n/** Internal state assigned to models. */\nconst STATE = new WeakMap<Model, Record<string | number | symbol, unknown>>();\n\n/** External listeners for any given Model. */\nconst NOTIFY = new WeakMap<Model.Type, Set<OnUpdate>>();\n\n/** Parent-child relationships. */\nconst PARENT = new WeakMap<Model, Model | null>();\n\n/** List of methods defined by a given type. */\nconst METHODS = new WeakMap<Model.Type, Map<string, (value: any) => void>>();\n\n/** Reference bound instance methods to real ones. */\nconst METHOD = new WeakMap<any, any>();\n\ndeclare namespace Model {\n /** Any type of Model, using own class constructor as its identifier. */\n type Type<T extends Model = Model> =\n (abstract new (...args: any[]) => T) & typeof Model;\n\n /** A Model constructor, but which is not abstract. */\n type Init<T extends Model = Model> =\n (new (...args: Model.Args<T>) => T) & Omit<typeof Model, never>;\n\n /**\n * Model constructor callback - is called when Model finishes intializing.\n * Returned function will run when model is destroyed.\n */\n type Callback<T extends Model = Model> =\n (this: T, thisArg: T) => Promise<void> | (() => void) | Assign<T> | void;\n\n /** Model constructor argument */\n type Argument<T extends Model = Model> = Assign<T> | Callback<T> | string | void;\n\n /** Model constructor arguments */\n type Args<T extends Model = any> = (Argument<T> | Args<T>)[];\n\n /** Subset of `keyof T` which are not methods or defined by base Model U. **/\n type Field<T> = Exclude<keyof T, keyof Model>;\n\n /** Any valid key for model, including but not limited to Field<T>. */\n type Event<T> = Field<T> | (string & {}) | number | symbol;\n\n /** Object overlay to override values and methods on a model. */\n type Assign<T> = {\n [K in Field<T>]?:\n T[K] extends (...args: infer A) => infer R \n ? (this: T, ...args: A) => R\n : T[K];\n } & Record<string, unknown>;\n\n /** Export/Import compatible value for a given property in a Model. */\n type Export<R> = R extends { get(): infer T } ? T : R;\n\n /** Value for a property managed by a model. */\n type Value<T extends Model, K extends Event<T>> =\n K extends keyof T ? Export<T[K]> : unknown;\n\n type OnEvent<T extends Model> =\n (this: T, key: unknown, source: T) => (() => void) | void | null;\n\n type OnUpdate<T extends Model, K extends Event<T>> =\n (this: T, key: K, thisArg: K) => void;\n\n /**\n * Values from current state of given model.\n * Differs from `Values` as values here will drill\n * into \"real\" values held by exotics like ref.Object.\n */\n type State<T> = { [P in Field<T>]: Export<T[P]> };\n\n /** Object comperable to data found in T. */\n type Values<T> = { [P in Field<T>]?: Export<T[P]> };\n\n /** Exotic value, where actual value is contained within. */\n type Ref<T = any> = {\n (next: T): void;\n current: T | null;\n }\n\n /**\n * A callback function which is subscribed to parent and updates when accessed properties change.\n * \n * @param current - Current state of this model. This is a proxy which detects properties which\n * where accessed, and thus depended upon to stay current.\n * \n * @param update - Set of properties which have changed, and events fired, since last update.\n * \n * @returns A callback function which will be called when this effect is stale.\n */\n type Effect<T> = (this: T, current: T, update: Set<Event<T>>) =>\n EffectCallback | Promise<void> | null | void;\n\n /**\n * A callback function returned by effect. Will be called when effect is stale.\n * \n * @param update - `true` if update is pending, `false` effect has been cancelled, `null` if model is destroyed.\n */\n type EffectCallback = ((update: boolean | null) => void);\n\n /**\n * Property initializer, will run upon instance creation.\n * Optional returned callback will run when once upon first access.\n */\n type Instruction<T = any, M extends Model = any> =\n // TODO: Should this allow for numbers/symbol properties?\n (this: M, key: Extract<Field<M>, string>, thisArg: M, state: State<M>) =>\n Descriptor<T> | ((source: M) => T) | void;\n\n type Getter<T> = (source: Model) => T;\n type Setter<T> = (value: T, previous: T) => boolean | void | (() => T);\n\n type Descriptor<T = any> = {\n get?: Getter<T> | boolean;\n set?: Setter<T> | boolean;\n enumerable?: boolean;\n value?: T;\n }\n}\n\ninterface Model {\n /**\n * Loopback to instance of this model. This is useful when in a subscribed context,\n * to keep write access to `this` after a destructure. You can use it to read variables silently as well.\n **/\n is: this;\n}\n\nabstract class Model {\n constructor(...args: Model.Args){\n prepare(this);\n define(this, \"is\", { value: this });\n init(this, args);\n }\n\n /**\n * Pull current values from state. Flattens all models and exotic values recursively.\n * \n * @returns Object with all values from this model.\n **/\n get(): Model.State<this>;\n\n /**\n * Run a function which will run automatically when accessed values change.\n * \n * @param effect Function to run, and again whenever accessed values change.\n * If effect returns a function, it will be called when a change occurs (syncronously),\n * effect is cancelled, or parent model is destroyed.\n * @returns Function to cancel listener.\n */\n get(effect: Model.Effect<this>): () => void;\n\n /**\n * Get value of a property.\n * \n * @param key - Property to get value of.\n * @param required - If true, will throw an error if property is not available.\n * @returns Value of property.\n */\n get<T extends Model.Event<this>>(key: T, required?: boolean): Model.Value<this, T>;\n\n /**\n * Run a function when a property is updated.\n * \n * @param key - Property to watch for updates.\n * @param callback - Function to call when property is updated.\n * @returns Function to cancel listener.\n */\n get<T extends Model.Event<this>>(key: T, callback: Model.OnUpdate<this, T>): () => void;\n\n /**\n * Check if model is expired.\n * \n * @param status - `null` to check if model is expired.\n * @returns `true` if model is expired, `false` otherwise.\n */\n get(status: null): boolean;\n\n /**\n * Callback when model is to be destroyed.\n * \n * @param callback - Function to call when model is destroyed.\n * @returns Function to cancel listener.\n */\n get(status: null, callback: () => void): () => void;\n\n get(arg1?: Model.Effect<this> | string | null, arg2?: boolean | Model.OnUpdate<this, any>){\n const self = this.is;\n\n if(typeof arg1 == \"function\"){\n let pending = new Set<Model.Event<this>>();\n\n return createEffect(self, (proxy) => {\n const cb = arg1.call(proxy, proxy, pending);\n\n return cb === null ? null : ((update) => {\n pending = PENDING_KEYS.get(self)!;\n if(typeof cb == \"function\")\n cb(update);\n })\n });\n }\n\n return (\n arg1 === undefined ?\n snapshot(self) :\n typeof arg2 == \"function\" ?\n addListener(self, arg2, arg1) :\n arg1 === null ?\n Object.isFrozen(STATE.get(self)) :\n fetch(self, arg1, arg2)\n )\n }\n\n /**\n * Get update in progress.\n *\n * @returns Promise which resolves object with updated values, `undefined` if there no update is pending.\n **/\n set(): PromiseLike<Model.Event<this>[]> | undefined;\n\n /**\n * Update mulitple properties at once. Merges argument with current state.\n * Properties which are not managed by this model will be ignored.\n * \n * @param assign - Object with properties to update.\n * @param silent - If an update does occur, listeners will not be refreshed automatically.\n * @returns Promise resolving an array of keys updated, `undefined` (immediately) if a noop.\n */\n set(assign?: Model.Assign<this>, silent?: boolean): PromiseLike<Model.Event<this>[]> | undefined;\n\n /**\n * Push an update. This will not change the value of associated property.\n * \n * Useful where a property value internally has changed, but the object is the same.\n * For example: An array has pushed a new value, or a nested property is updated.\n * \n * You can also use this to dispatch arbitrary events.\n * Symbols are recommended as non-property events, however you can use any string.\n * If doing so, be sure to avoid collisions with property names! An easy way to do this is\n * to prefix an event with \"!\" and/or use dash-case. e.g. `set(\"!event\")` or `set(\"my-event\")`.\n * \n * @param key - Property or event to dispatch.\n * @returns Promise resolves an array of keys updated.\n */\n set(key: Model.Event<this>): PromiseLike<Model.Event<this>[]>;\n\n /**\n * Call a function when update occurs.\n * \n * Given function is called for every assignment (which changes value) or explicit `set`.\n * \n * To run logic on final value only, callback may return a function. Using the same\n * function for one or more events will ensure it is called only when events are settled.\n * \n * @param callback - Function to call when update occurs.\n * @returns Function to remove listener. Will return `true` if removed, `false` if inactive already.\n * \n */\n set(callback: Model.OnEvent<this>): () => boolean;\n\n /**\n * Call a function when a property is updated.\n * Unlike `get`, this calsl synchronously and will fire as many times as the property is updated.\n * \n * @param key - Property to watch for updates.\n * @param callback - Function to call when property is updated.\n */\n set(key: Model.Event<this> | null, callback: Model.OnEvent<this>): () => boolean;\n\n /**\n * Declare an end to updates. This event is final and will freeze state.\n * This event can be watched for as well, to run cleanup logic and internally will remove all listeners.\n * \n * @param status - `null` to end updates.\n */\n set(status: null): void;\n\n set(\n arg1?: Model.OnEvent<this> | Model.Assign<this> | Model.Event<this> | null,\n arg2?: boolean | Model.OnEvent<this>){\n\n const self = this.is;\n\n if(typeof arg1 == \"function\")\n return addListener(self, key => {\n if(typeof key == \"string\")\n return arg1.call(self, key, self);\n })\n \n if(typeof arg2 == \"function\")\n return addListener(self, key => {\n if(key === arg1)\n return arg2.call(self, key, self);\n });\n\n if(arg1 && typeof arg1 == \"object\")\n assign(self, arg1, arg2 === true);\n else\n event(self, arg1);\n\n return pending(self);\n }\n\n /**\n * Iterate over managed properties in this instance of Model.\n * Yeilds the key and current value for each property.\n */\n [Symbol.iterator](): Iterator<[string, unknown]> {\n return Object.entries(STATE.get(this.is)!)[Symbol.iterator]();\n }\n\n /**\n * Create and activate a new instance of this model.\n * \n * **Important** - Unlike `new this(...)` - this method also activates state.\n * \n * @param args - arguments sent to constructor\n */\n static new<T extends Model>(this: Model.Init<T>, ...args: Model.Args<T>){\n const instance = new this(...args);\n event(instance);\n return instance;\n }\n\n /**\n * Static equivalent of `x instanceof this`.\n * Determines if provided class is a subtype of this one.\n * If so, language server will make available all static\n * methods and properties of this class.\n */\n static is<T extends Model.Type>(this: T, maybe: unknown): maybe is T {\n return maybe === this || typeof maybe == \"function\" && maybe.prototype instanceof this;\n }\n\n /**\n * Register a callback to run when any instance of this Model is updated. \n */\n static on<T extends Model>(this: Model.Type<T>, listener: Model.OnEvent<T>){\n let notify = NOTIFY.get(this);\n\n if(!notify)\n NOTIFY.set(this, notify = new Set);\n\n notify.add(listener);\n\n return () => notify.delete(listener);\n }\n}\n\ndefine(Model.prototype, \"toString\", {\n value(){\n return ID.get(this.is);\n }\n});\n\ndefine(Model, \"toString\", {\n value(){\n return this.name;\n }\n});\n\nfunction assign(subject: Model, data: Model.Assign<Model>, silent?: boolean){\n const methods = METHODS.get(subject.constructor as Model.Type)!;\n \n for(const key in data){\n const bind = methods.get(key);\n if(bind)\n bind.call(subject, data[key]);\n else if(key in subject && key !== \"is\"){\n const desc = Object.getOwnPropertyDescriptor(subject, key)!;\n const set = desc && desc.set as (value: any, silent?: boolean) => void;\n\n set.call(subject, data[key], silent === true);\n }\n }\n}\n\n/** Apply instructions and inherited event listeners. Ensure class metadata is ready. */\nfunction prepare(model: Model){\n let T = model.constructor as Model.Type;\n\n if(T === Model)\n throw new Error(\"Cannot create base Model.\");\n\n const chain = [] as Model.Type[];\n let keys = new Map<string, (value: any) => void>();\n\n ID.set(model, `${T}-${uid()}`);\n\n while(T.name){\n for(const cb of NOTIFY.get(T) || [])\n addListener(model, cb);\n\n if(T === Model) break;\n else chain.unshift(T);\n\n T = Object.getPrototypeOf(T)\n }\n\n for(const type of chain){\n if(METHODS.has(type)){\n keys = METHODS.get(type)!;\n continue;\n }\n\n METHODS.set(type, keys = new Map(keys));\n\n for(const [key, { value }] of Object.entries(\n Object.getOwnPropertyDescriptors(type.prototype)\n )){\n if(!value || key == \"constructor\")\n continue;\n \n function bind(this: Model, method = value){\n const value = method.bind(this.is);\n \n METHOD.set(value, method);\n define(this.is, key, { value, writable: true });\n \n return value;\n }\n\n keys.set(key, bind);\n define(type.prototype, key, { get: bind, set: bind });\n }\n }\n}\n\n/**\n * Apply model arguemnts, run callbacks and observe properties.\n * Accumulate and handle cleanup events.\n **/\nfunction init(model: Model, args: Model.Args){\n const state = {} as Record<string | number | symbol, unknown>;\n\n STATE.set(model, state);\n\n args = args.flat().filter(arg => {\n if(typeof arg != \"string\")\n return true;\n\n ID.set(model, arg);\n });\n\n addListener(model, () => {\n if(!PARENT.has(model))\n PARENT.set(model, null);\n\n for(const key in model){\n const desc = Object.getOwnPropertyDescriptor(model, key)!;\n\n if(\"value\" in desc){\n update(model, key, desc.value, true);\n define(model, key, {\n configurable: false,\n get(){\n return watch(this, key, state[key]);\n },\n set(value, silent?: boolean){\n update(model, key, value, silent);\n mayAdopt(model, value);\n }\n });\n }\n }\n \n args.forEach((arg) => {\n const use = typeof arg == \"function\"\n ? arg.call(model, model)\n : arg as Model.Assign<Model>;\n\n if(use instanceof Promise)\n use.catch(err => {\n console.error(`Async error in constructor for ${model}:`);\n console.error(err);\n });\n else if(typeof use == \"function\")\n addListener(model, use, null)\n else if(typeof use == \"object\")\n assign(model, use, true);\n });\n\n addListener(model, () => {\n for(const [_, value] of model)\n if(value instanceof Model && PARENT.get(value) === model)\n value.set(null);\n \n Object.freeze(state);\n }, null);\n \n return null;\n });\n}\n\nfunction mayAdopt(parent: Model, child: unknown){\n if(child instanceof Model && !PARENT.has(child)){\n PARENT.set(child, parent);\n event(child);\n }\n}\n\nfunction fetch(subject: Model, property: string, required?: boolean){\n const state = STATE.get(subject)!;\n \n if(property in state || required === false){\n const value = state[property];\n\n if(value !== undefined || !required)\n return value;\n }\n\n const error = new Error(`${subject}.${property} is not yet available.`);\n const promise = new Promise<any>((resolve, reject) => {\n addListener(subject, key => {\n if(key === property){\n resolve(state[key]);\n return null;\n }\n\n if(key === null)\n reject(new Error(`${subject} is destroyed.`));\n });\n });\n\n throw Object.assign(promise, {\n toString: () => String(error),\n name: \"Suspense\",\n message: error.message,\n stack: error.stack\n });\n}\n\n/** Currently accumulating export. Stores real values of placeholder properties such as ref() or child models. */\nlet EXPORT: Map<any, any> | undefined;\n\nfunction snapshot<T extends Model>(model: T): Model.State<T> {\n const values = {} as any;\n let isNotRecursive;\n\n if(!EXPORT){\n isNotRecursive = true;\n EXPORT = new Map([[model, values]]);\n }\n\n for(let [key, value] of model){\n if(EXPORT.has(value))\n value = EXPORT.get(value);\n else if(value && typeof value == \"object\" && \"get\" in value && typeof value.get === \"function\")\n EXPORT.set(value, value = value.get());\n\n values[key] = value;\n }\n\n if(isNotRecursive)\n EXPORT = undefined;\n\n return Object.freeze(values);\n}\n\nfunction update<T>(\n subject: Model,\n key: string | number | symbol,\n value: T,\n arg?: boolean | Model.Setter<T>){\n\n const state = STATE.get(subject)!;\n\n if(Object.isFrozen(state))\n throw new Error(`Tried to update ${String(key)} but ${subject} is destroyed.`);\n\n const previous = state[key] as T;\n\n if(typeof arg == \"function\"){\n const out = arg.call(subject, value, previous);\n\n if(out === false)\n return false;\n\n if(typeof out == \"function\")\n value = out();\n }\n\n if(value === previous && value !== undefined)\n return;\n\n state[key] = value;\n\n if(arg !== true)\n event(subject, key);\n\n return true;\n}\n\n/** Random alphanumberic of length 6; always starts with a letter. */\nfunction uid(){\n return (0.278 + Math.random() * 0.722).toString(36).substring(2, 8).toUpperCase();\n}\n\nexport {\n event,\n fetch,\n mayAdopt,\n METHOD,\n Model,\n PARENT,\n STATE,\n uid,\n update,\n}","import { addListener } from './control';\nimport { event, Model, PARENT, uid } from './model';\n\nconst LOOKUP = new WeakMap<Model, Context | ((got: Context) => void)[]>();\nconst KEYS = new Map<symbol | Model.Type, symbol>();\n\nfunction key(T: Model.Type | symbol, upstream?: boolean): symbol {\n let K = KEYS.get(T);\n\n if(!K)\n KEYS.set(T, K = Symbol(\n typeof T == \"symbol\" ? \"get \" + T.description : String(T)\n ));\n \n return upstream ? key(K) : K;\n}\n\nfunction keys(from: Model.Type, upstream?: boolean){\n const keys = new Set<symbol>();\n\n do {\n keys.add(key(from, upstream));\n }\n while((from = Object.getPrototypeOf(from)) !== Model);\n\n return keys;\n}\n\ndeclare namespace Context {\n type Multiple<T extends Model> = {\n [key: string | number]: Model.Init<T> | T;\n };\n\n type Accept<T extends Model = Model> = T | Model.Init<T> | Multiple<T>;\n\n type Expect<T extends Model = Model> = (model: T) => (() => void) | void;\n}\n\ninterface Context {\n [key: symbol]: Model | Context.Expect | null | undefined;\n}\n\nclass Context {\n static get<T extends Model>(on: Model, callback: ((got: Context) => void)): void;\n static get<T extends Model>(on: Model): Context | undefined;\n static get({ is }: Model, callback?: (got: Context) => void){\n const waiting = LOOKUP.get(is);\n\n if(waiting instanceof Context){\n if(callback)\n callback(waiting);\n\n return waiting;\n }\n\n if(callback)\n if(waiting) \n waiting.push(callback);\n else \n LOOKUP.set(is, [callback]);\n }\n\n public id!: string;\n\n protected layer = new Map<string | number, Model | Model.Type>();\n protected cleanup = new Set<() => void>();\n\n constructor(inputs?: Context.Accept){\n if(inputs)\n this.include(inputs);\n }\n\n /** Run callback when a specified type is registered to a **child** context. */\n public has<T extends Model>(Type: Model.Type<T>, callback: (model: T) => void){\n Object.defineProperty(this, key(Type, true), { value: callback, configurable: true });\n }\n\n /** Find specified type registered to a parent context. Returns undefined if none are found. */\n public get<T extends Model>(Type: Model.Type<T>, require: true): T;\n public get<T extends Model>(Type: Model.Type<T>, require?: boolean): T | undefined;\n public get<T extends Model>(Type: Model.Type<T>, require?: boolean){\n const result = this[key(Type)];\n\n if(result === null)\n throw new Error(`Did find ${Type} in context, but multiple were defined.`);\n\n if(result)\n return result as T;\n\n if(require)\n throw new Error(`Could not find ${Type} in context.`);\n }\n\n public push(inputs?: Context.Accept){\n const next = Object.create(this) as this;\n\n this.cleanup = new Set([() => next.pop(), ...this.cleanup]);\n\n next.layer = new Map();\n next.cleanup = new Set();\n\n if(inputs)\n next.include(inputs);\n\n return next;\n }\n\n public pop(){\n for(const key of Object.getOwnPropertySymbols(this))\n delete (this as any)[key];\n\n this.cleanup.forEach(cb => cb());\n this.cleanup.clear();\n this.layer.clear();\n }\n\n public include<T extends Model>(\n inputs: Context.Accept<T>,\n forEach?: Context.Expect<T>\n ){\n const init = new Map<Model, boolean>();\n\n if(typeof inputs == \"function\" || inputs instanceof Model)\n inputs = { [forEach ? 0 : this.layer.size]: inputs };\n\n Object.entries(inputs).forEach(([K, V]: [string, Model | Model.Init<Model>]) => {\n if(Model.is(V) || V instanceof Model){\n const exists = this.layer.get(K);\n \n if(!exists){\n const instance = this.add(V);\n \n this.layer.set(K, V);\n init.set(instance, true);\n }\n // Context must force-reset because inputs are no longer safe.\n else if(exists !== V){ \n this.pop();\n this.id = uid();\n this.include(inputs);\n }\n\n return;\n }\n\n throw new Error(\n `Context may only include instance or class \\`extends Model\\` but got ${\n K == '0' || K == V ? V : `${V} (as '${K}')`\n }.`\n );\n })\n\n for(const [model, explicit] of init){\n model.set();\n\n if(explicit && forEach)\n forEach(model as T);\n\n for(const [_key, value] of model)\n if(PARENT.get(value as Model) === model){\n this.add(value as Model, true);\n init.set(value as Model, false);\n }\n }\n }\n\n protected add<T extends Model>(\n input: T | Model.Init<T>,\n implicit?: boolean){\n\n const cleanup = new Set<() => void>();\n let T: Model.Type<T>;\n let I: T;\n\n if(typeof input == \"function\"){\n T = input;\n I = new input() as T;\n }\n else {\n T = input.constructor as Model.Type<T>;\n I = input;\n }\n\n keys(T, true).forEach(K => {\n const expects = this[K] as Context.Expect | undefined;\n \n if(!expects)\n return;\n \n addListener(I, event => {\n if(event === true){\n const callback = expects(I);\n \n if(callback)\n cleanup.add(callback);\n }\n\n return null;\n }) \n });\n\n keys(T).forEach(K => {\n const value = this.hasOwnProperty(K) ? null : I;\n\n if(value || this[K] !== I && !implicit)\n Object.defineProperty(this, K, {\n configurable: true,\n value\n });\n });\n\n this.cleanup.add(() => {\n cleanup.forEach(cb => cb());\n\n if(I !== input)\n event(I, null);\n })\n\n const waiting = LOOKUP.get(I);\n \n if(waiting instanceof Array)\n waiting.forEach(cb => cb(this));\n\n LOOKUP.set(I, this);\n\n return I;\n }\n}\n\nexport { Context }","import { watch } from '../control';\nimport { fetch, mayAdopt, Model, PARENT, STATE, update } from '../model';\n\nconst INSTRUCTION = new Map<symbol, Model.Instruction>();\n\nfunction use <T> (instruction: Model.Instruction<T>): T extends void ? unknown : T;\n\nfunction use <T extends Model> (Type: Model.Init<T>, required: false): T | undefined;\n\nfunction use <T extends Model> (Type: Model.Init<T>, ready?: (i: T) => void): T;\n\nfunction use(\n arg1: Model.Init | Model.Instruction,\n arg2?: ((i: Model) => void) | boolean){\n\n const token = Symbol(\"instruction\");\n\n if(Model.is(arg1))\n arg1 = child(arg1, arg2);\n\n INSTRUCTION.set(token, arg1);\n return token;\n}\n\nfunction child(\n type: Model.Init<Model>,\n arg2?: ((i: Model) => void) | boolean\n): Model.Instruction<any, any> {\n return (key, subject) => {\n function set(next: Model | undefined){\n if(next ? !(next instanceof type) : arg2 !== false)\n throw new Error(`${subject}.${key} expected Model of type ${type} but got ${next && next.constructor}.`);\n\n update(subject, key, next);\n\n if(next && typeof arg2 == \"function\")\n arg2(next);\n\n return false;\n }\n\n const value = new type();\n\n set(value);\n PARENT.set(value, subject);\n value.set();\n\n return { set };\n }\n}\n\nfunction init(this: Model){\n const state = STATE.get(this)!;\n\n for(const key in this){\n const { value } = Object.getOwnPropertyDescriptor(this, key)!;\n const instruction = INSTRUCTION.get(value);\n\n if(!instruction){\n mayAdopt(this, value);\n continue;\n }\n\n INSTRUCTION.delete(value);\n delete (this as any)[key];\n\n const output = instruction.call(this, key, this, state);\n\n if(!output)\n continue;\n\n const desc = typeof output == \"object\" ? output : { get: output };\n\n if(\"value\" in desc)\n state[key] = desc.value;\n\n const model = this;\n\n Object.defineProperty(model, key, {\n enumerable: desc.enumerable !== false,\n get(this: Model){\n return watch(this, key, \n typeof desc.get == \"function\"\n ? desc.get(this)\n : fetch(model, key, desc.get)\n );\n },\n set(next){\n if(desc.set === false)\n throw new Error(`${model}.${key} is read-only.`);\n\n update(model, key, next, desc.set);\n }\n })\n }\n\n return null;\n}\n\nModel.on(init);\n\nexport { use }","import { Context } from '../context';\nimport { createEffect } from '../control';\nimport { fetch, METHOD, Model, PARENT, event, update } from '../model';\nimport { use } from './use';\n\ntype Type<T extends Model> = Model.Type<T> & typeof Model;\n\nconst STALE = new WeakSet<() => void>();\n\ndeclare namespace get {\n type Compute<T, S = any> = (on: S, key: string) => T;\n\n type Factory<T, S = any> = (this: S, key: string, thisArg: S) => T;\n\n type Source<T extends Model = Model> = (resolve: (x: T) => void) => void;\n\n type Effect<T> = (model: T, key: string) => (() => void) | void;\n}\n\n/**\n * Fetches and assigns the controller which spawned this host.\n * When parent assigns an instance via `use()` directive, it\n * will be made available to child upon this request.\n *\n * @param Type - Type of controller compatible with this class. \n * @param expectParent - If true, will throw if Model is created without a parent.\n */\nfunction get <T extends Model> (Type: Model.Type<T>, asParent?: true): T;\n\n/**\n * Fetches and assigns the controller which spawned this host.\n * When parent assigns an instance via `use()` directive, it\n * will be made available to child upon this request.\n *\n * @param Type - Type of controller compatible with this class. \n * @param required - If false, property may be undefined. Otherwise will throw suspense.\n */\nfunction get <T extends Model> (Type: Model.Type<T>, required?: false): T | undefined;\n\n/**\n * Implement a computed value from a foreign model. Output will be generated by provided function,\n * where the foreign model will be passed to that function.\n * \n * @param source - Type of Model to fetch for computation.\n * @param compute - Compute function. Will update automatically as input values change.\n */\nfunction get <T extends Model> (Type: Model.Type<T>, effect: get.Effect<T>): T;\n\n/**\n * Implement a computed value; output will be generated by provided function.\n *\n * @param source - Source model from which computed value will be a subscriber.\n * @param compute - Compute function. Bound to a subscriber-proxy of source, returns output value. Will update automatically as input values change.\n */\nfunction get <R, T extends Model> (source: T, compute: get.Compute<R, T>): R;\n\n/**\n * Implement a computed value; output is returned by function from provided factory.\n * \n * Factory is bound to owner of property.\n *\n * @param compute - Factory function to generate a getter to subscribe dependancies.\n */\nfunction get <R, T> (compute: get.Factory<R, T>): R;\n \nfunction get<R, T extends Model>(\n arg0: T | get.Factory<R, T> | Type<T>,\n arg1?: Function | boolean){\n\n return use((key, subject, state) => {\n if(typeof arg0 == \"symbol\")\n throw new Error(`Attempted to use an instruction result (probably use or get) as computed source for ${subject}.${key}. This is not allowed.`)\n\n if(Model.is(arg0)){\n const hasParent = PARENT.get(subject) as T;\n\n // TODO: notify on discovered context \n function assign(value: T) {\n if (typeof arg1 == \"function\")\n value.get(x => (arg1 as Function)(x, key));\n\n update(subject, key, value);\n }\n\n if(!hasParent && arg1 === true)\n throw new Error(`${subject} may only exist as a child of type ${arg0}.`);\n else if(hasParent)\n if(hasParent instanceof arg0){\n assign(hasParent);\n return {}\n }\n else if(arg1 === true)\n throw new Error(`New ${subject} created as child of ${hasParent}, but must be instanceof ${arg0}.`);\n \n Context.get(subject, (context) => {\n const model = context.get(arg0);\n\n if(model)\n assign(model);\n else if(arg1 !== false)\n throw new Error(`Required ${arg0} not found in context for ${subject}.`)\n });\n\n return {\n get: arg1 !== false\n };\n }\n \n let from = subject;\n \n if(arg0 instanceof Model){\n from = arg0;\n }\n else {\n const fn = METHOD.get(arg0) || arg0;\n arg1 = ((p, k) => fn.call(p, k, p)) as get.Effect<T>;\n }\n\n const source: get.Source<T> = resolve => resolve(from);\n const getter = arg1 as get.Compute<R, T>;\n\n let reset: (() => void) | undefined;\n let isAsync: boolean;\n let proxy: any;\n\n function connect(model: Model){\n reset = createEffect(model, current => {\n proxy = current;\n\n if(!(key in state) || STALE.delete(compute))\n compute(!reset);\n\n return (didUpdate) => {\n if(didUpdate){\n STALE.add(compute);\n event(subject, key, true);\n }\n };\n }, false)\n }\n\n function compute(initial?: boolean){\n let next: R | undefined;\n\n try {\n next = getter.call(proxy, proxy, key);\n }\n catch(err){\n console.warn(`An exception was thrown while ${initial ? \"initializing\" : \"refreshing\"} ${subject}.${key}.`)\n\n if(initial)\n throw err;\n\n console.error(err);\n }\n\n update(subject, key, next, !isAsync);\n }\n\n return () => {\n if(!proxy){\n source(connect);\n isAsync = true;\n }\n\n if(STALE.delete(compute))\n compute();\n\n return fetch(subject, key, !proxy) as T;\n }\n })\n}\n\nexport { get };","import { addListener, context } from '../control';\nimport { Model, update } from '../model';\nimport { use } from './use';\n\nconst { defineProperty, defineProperties } = Object;\n\ndeclare namespace ref {\n type Callback<T> = (argument: T) =>\n ((next: T | null) => void) | Promise<void> | void | boolean;\n\n interface Object<T = any> {\n (next: T | null): void;\n\n /** Current value held by this reference. */\n current: T | null;\n\n /** \n * Subscribe to changes of this reference.\n * \n * @param callback - Callback to invoke with the current value when it changes.\n * @returns Unsubscribe function to stop listening to changes.\n */\n get(callback: (value: T) => void): () => void;\n\n /** Retrieve current value. */\n get(): T | null;\n }\n\n /** Object with references to all managed values of `T`. */\n\n /** Object with references to all managed values of `T`. */\n type Proxy<T extends Model> =\n & { [P in Model.Field<T>]-?: Object<T[P]> }\n & { get(): T };\n\n type CustomProxy<T extends Model, R> =\n & { [P in Model.Field<T>]-?: R }\n & { get(): T };\n}\n\n/**\n * Creates an object with references to all managed values.\n * Each property is a function to set value in state when invoked.\n *\n * *Properties are simultaneously a ref-function and ref-object, use as needed.*\n *\n * @param target - Source model from which to reference values.\n */\nfunction ref <T extends Model> (target: T): ref.Proxy<T>;\n\n/**\n * Creates an object with values based on managed values.\n * Each property will invoke mapper function on first access supply\n * the its return value going forward.\n *\n * @param target - Source model from which to reference values.\n * @param mapper - Function producing the placeholder value for any given property.\n */\nfunction ref <O extends Model, R>\n (target: O, mapper: (key: Model.Field<O>) => R): ref.CustomProxy<O, R>;\n\n/**\n * Creates a ref-compatible property.\n * Will persist value, and updates to this are made part of controller event-stream.\n *\n * *Output is simultaneously a ref-function and ref-object, use as needed.*\n *\n * @param callback - Optional callback to synchronously fire when reference is first set or does update.\n */\nfunction ref <T> (callback?: ref.Callback<T>): ref.Object<T>;\n\n/**\n * Creates a ref-compatible property.\n * Will persist value, and updates to this are made part of controller event-stream.\n *\n * *Output is simultaneously a ref-function and ref-object, use as needed.*\n *\n * @param callback - Optional callback to synchronously fire when reference is first set or does update.\n * @param ignoreNull - Default `true`. If `false`, will still callback with `null`.\n */\nfunction ref <T> (callback: ref.Callback<T | null>, ignoreNull: boolean): ref.Object<T>;\n\nfunction ref<T>(\n arg?: ref.Callback<T> | Model,\n arg2?: ((key: string) => any) | boolean){\n\n return use<T>((key, subject, state) => {\n let value = {};\n const method = (key: string) =>\n (callback?: (value: T) => void) => callback\n ? addListener(subject, () => callback(state[key]), key)\n : state[key];\n\n if(arg === subject)\n subject.get(() => {\n for(const key in state)\n if(typeof arg2 == \"function\")\n defineProperty(value, key, {\n configurable: true,\n get(){\n const out = arg2(key);\n defineProperty(value, key, { value: out });\n return out;\n }\n })\n else {\n const get = method(key);\n const set = (value: unknown) => {\n update(subject, key, value)\n };\n\n defineProperties(set, {\n current: { get, set },\n get: { value: get }\n });\n\n defineProperty(value, key, { value: set });\n }\n })\n\n else if(typeof arg == \"object\")\n throw new Error(\"ref instruction does not support object which is not 'this'\");\n\n else {\n let unset: ((next: T) => void) | undefined;\n\n const get = method(key);\n const set = (value?: any) => {\n if(!update(subject, key, value) || !arg)\n return;\n\n if(unset)\n unset = void unset(value);\n \n if(value === null && arg2 !== false)\n return;\n\n const ctx = context();\n const out = arg.call(subject, value);\n const flush = ctx();\n\n unset = key => {\n if(typeof out == \"function\")\n out(key);\n\n flush();\n }\n };\n \n state[key] = null;\n value = defineProperties(set, {\n current: { get, set },\n get: { value: get }\n }) as ref.Object<T>;\n }\n\n defineProperty(subject, key, { value });\n })\n}\n\nexport { ref }","import { context } from '../control';\nimport { Model, event, update } from '../model';\nimport { use } from './use';\n\ndeclare namespace set {\n type Callback<T, S = any> = (this: S, next: T, previous: T) =>\n ((next: T) => void) | Promise<any> | void | boolean;\n\n type Factory<T, S = any> = (this: S, key: string) => Promise<T> | T;\n}\n\n/**\n * Set property as `undefined` but required.\n * \n * Property cannot be accessed until it is defined. If accessed while undefined, a hybrid\n * `Promise`/`Error` (aka: [Suspense](https://reactjs.org/docs/concurrent-mode-suspense.html)) will be thrown.\n */\nfunction set <T = any>(): T;\n\n/**\n * Set property with a factory function.\n * \n * Run factory only if/when accessed. Value will be undefined until\n * factory resolves, which will also dispatch an update for the property.\n */\nfunction set <T> (factory: set.Factory<T> | Promise<T>, required: false): T | undefined;\n\n/**\n * Set property with a factory function.\n *\n * If async, property cannot be accessed until resolves, yeilding a result.\n * If accessed while still processing, React Suspense will be thrown.\n *\n * @param factory - Callback run to derrive property value.\n * @param required - If true run factory immediately on creation, otherwise on access.\n */\nfunction set <T> (factory: set.Factory<T> | Promise<T>, required?: boolean): T;\n\n/**\n * Set a property with empty placeholder and/or update callback.\n * \n * @param value - Starting value for property. If undefined, suspense will be thrown on access, until value is set and accepted by callback.\n * @param onUpdate - Callback run when property is set. If returns false, update is not accepted and property will keep previous value.\n */\nfunction set <T> (value: T | undefined, onUpdate?: set.Callback<T>): T;\n\nfunction set <T> (\n value?: set.Factory<T> | Promise<T> | T,\n argument?: set.Callback<any> | boolean){\n\n return use<T>((key, subject) => {\n const property: Model.Descriptor = {\n enumerable: false\n };\n\n if(typeof value == \"function\" || value instanceof Promise){\n function init(){\n if(typeof value == \"function\")\n try {\n value = attempt(value.bind(subject, key));\n }\n catch(err){\n console.warn(`Generating initial value for ${subject}.${key} failed.`);\n throw err;\n }\n\n property.get = argument === true;\n\n if(value instanceof Promise){\n value\n .then(value => {\n update(subject, key, value);\n return value;\n })\n .catch(err => {\n event(subject, key);\n property.get = () => { throw err };\n })\n }\n else\n update(subject, key, value);\n\n if(0 in arguments)\n return subject[key];\n }\n\n if(argument)\n init();\n else\n property.get = init;\n }\n else if(value !== undefined)\n property.value = value;\n\n if(typeof argument == \"function\"){\n let unset: ((next: T) => void) | undefined;\n\n property.set = function(this: any, value: any, previous: any){\n const ctx = context();\n const out = argument.call(this, value, previous);\n const flush = ctx();\n\n if(out === false)\n return out;\n\n if(typeof unset == \"function\")\n unset(value);\n\n unset = (next: T) => {\n if(typeof out == \"function\")\n out(next);\n\n flush();\n }\n }\n }\n else\n property.set = value => {\n property.get = undefined;\n update(subject, key, value);\n }\n\n return property;\n })\n}\n\nfunction attempt(fn: () => any): any {\n function retry(err: unknown){\n if(err instanceof Promise)\n return err.then(compute);\n else\n throw err;\n }\n\n function compute(): any {\n try {\n const output = fn();\n\n return output instanceof Promise\n ? output.catch(retry)\n : output;\n }\n catch(err){\n return retry(err);\n }\n }\n\n return compute();\n}\n\nexport { set }","import { context } from '../control';\nimport { Context } from '../context';\nimport { Model, update } from '../model';\nimport { use } from './use';\n\nconst APPLY = new WeakMap<Model, (model: Model) => (() => void) | boolean | void>();\n\ndeclare namespace has {\n type Callback<T = any> = (model: T, recipient: Model) => void | boolean | (() => void);\n}\n\nfunction has <T extends Model> (type: Model.Type<T>, callback?: has.Callback<T>): readonly T[];\nfunction has (callback?: has.Callback): readonly Model[];\n \nfunction has <T extends Model> (\n arg1?: Model.Type<T> | has.Callback<Model>,\n arg2?: has.Callback<T>){\n\n return use<T[]>((key, subject) => {\n const applied = new Set<Model>();\n const reset = () => {\n update(subject, key, Object.freeze(Array.from(applied)));\n }\n\n if(Model.is(arg1))\n Context.get(subject, ctx => {\n ctx.has(arg1, model => {\n const ctx = context();\n let remove: (() => void) | void | undefined;\n let disconnect: (() => void) | undefined;\n \n if(applied.has(model))\n return;\n \n const notify = APPLY.get(model);\n \n if(notify){\n const after = notify(subject);\n \n if(after === false)\n return;\n \n if(typeof after == \"function\")\n disconnect = after;\n }\n \n if(typeof arg2 == \"function\"){\n const done = arg2(model, subject);\n \n if(done === false)\n return false;\n \n remove = () => {\n if(typeof done == \"function\")\n done();\n }\n }\n\n const flush = ctx();\n \n applied.add(model);\n reset();\n \n const done = () => { \n flush();\n ignore();\n \n applied.delete(model);\n reset();\n \n if(disconnect)\n disconnect();\n \n if(typeof remove == \"function\")\n remove();\n\n remove = undefined;\n }\n \n const ignore = model.set(null, done);\n \n return done;\n })\n });\n else {\n if(APPLY.has(subject))\n throw new Error(`'has' callback can only be used once per model.`);\n\n APPLY.set(subject, recipient => {\n let remove: (() => void) | boolean | void;\n\n if(arg1){\n remove = arg1(recipient, subject);\n \n if(remove === false)\n return false;\n }\n\n applied.add(recipient);\n reset();\n\n return () => {\n applied.delete(recipient);\n reset();\n\n if(typeof remove == \"function\")\n remove();\n }\n });\n }\n\n return { value: [] };\n })\n}\n\nexport { has }"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACwBA,IAAM,UAAU,MAAM;AAEtB,IAAM,YAAY,oBAAI,QAAsD;AAG5E,IAAM,UAAU,oBAAI,QAA2B;AAG/C,IAAM,eAAe,oBAAI,QAA8C;AAGvE,IAAM,WAAW,oBAAI,IAAgB;AAErC,IAAM,WAAW,oBAAI,QAAyB;AAE9C,SAAS,YAA6B,SAAY,UAAuB,QAAe;AACtF,MAAI,YAAY,UAAU,IAAI,OAAO;AAErC,MAAG,CAAC;AACF,cAAU,IAAI,SAAS,YAAY,oBAAI,IAAI,CAAC,CAAC,SAAS,MAAS,CAAC,CAAC,CAAC;AAEpE,QAAM,SAAS,WAAW,SAAY,SAAY,oBAAI,IAAI,CAAC,MAAM,CAAC;AAElE,MAAG,CAAC,UAAU,IAAI,OAAO,KAAK,CAAC;AAC7B,aAAS,KAAK,SAAS,MAAM,OAAO;AAEtC,YAAU,IAAI,UAAU,MAAM;AAE9B,SAAO,MAAM,UAAU,OAAO,QAAQ;AACxC;AAEA,SAAS,KAAK,OAAcA,MAAkB;AAC5C,QAAM,YAAY,UAAU,IAAI,KAAK;AACrC,QAAM,WAAW,UAAU,IAAI,OAAO;AAEtC,MAAGA,SAAQ,QAAQ,CAAC;AAClB;AAEF,MAAIC,WAAU,QAAQ,IAAI,KAAK;AAE/B,MAAGA,UAAQ;AACT,IAAAA,SAAQ,IAAID,IAAG;AACf;AAAA,EACF;AAEA,UAAQ,IAAI,OAAOC,WAAU,IAAI,IAAI,WAAW,CAAC,MAAMD,IAAG,IAAI,CAACA,IAAG,CAAC,CAAC;AAEpE,aAAUA,QAAOC;AACf,eAAU,CAAC,UAAU,MAAM,KAAK;AAC9B,UAAG,CAAC,UAAU,OAAO,IAAID,IAAG,GAAE;AAC5B,cAAM,QAAQ,SAAS,KAAK,OAAOA,MAAK,KAAK;AAE7C,YAAG;AACD,kBAAQ,KAAK;AAAA,iBAEP,UAAU;AAChB,oBAAU,OAAO,QAAQ;AAAA,MAC7B;AAEJ,MAAGA,SAAQ;AACT,cAAU,MAAM;AAElB,UAAQ,OAAO,KAAK;AACtB;AAEA,SAAS,MACP,SACAA,MACA,QAAiB;AAEjB,MAAGA,SAAQ;AACT,WAAO,KAAK,SAASA,IAAG;AAE1B,MAAG,CAACA;AACF,WAAO,KAAK,SAAS,IAAI;AAE3B,MAAIC,WAAU,aAAa,IAAI,OAAO;AAEtC,MAAG,CAACA,UAAQ;AACV,iBAAa,IAAI,SAASA,WAAU,oBAAI,IAAI,CAAC;AAE7C,QAAG,CAAC;AACF,cAAQ,MAAM;AACZ,aAAK,SAAS,KAAK;AACnB,qBAAa,OAAO,OAAO;AAAA,MAC7B,CAAC;AAAA,EACL;AAEA,EAAAA,SAAQ,IAAID,IAAG;AAEf,MAAG,CAAC;AACF,SAAK,SAASA,IAAG;AACrB;AAEA,SAAS,QAAyB,SAAW;AAC3C,MAAG,aAAa,IAAI,OAAO;AACzB,WAAuC;AAAA,MACrC,MAAM,CAAC,QAAQ,IAAI,QAAa,CAAAE,SAAO;AACrC,cAAM,SAAS,YAAY,SAAS,CAAAF,SAAO;AACzC,cAAGA,SAAQ,MAAK;AACd,mBAAO;AACP,mBAAOE,KAAI,KAAK,MAAM,MAAM,KAAK,aAAa,IAAI,OAAO,CAAE,CAAC;AAAA,UAC9D;AAAA,QACF,CAAC;AAAA,MACH,CAAC,EAAE,KAAK,GAAG;AAAA,IACb;AACJ;AAEA,SAAS,QAAQ,cAA2B;AAC1C,MAAG,CAAC,SAAS;AACX,eAAW,MAAM;AACf,eAAS,QAAQ,CAAAC,WAAS;AACxB,YAAI;AACF,UAAAA,OAAM;AAAA,QACR,SACM,KAAI;AACR,kBAAQ,MAAM,GAAG;AAAA,QACnB;AAAA,MACF,CAAC;AACD,eAAS,MAAM;AAAA,IACjB,GAAG,CAAC;AAEN,WAAS,IAAI,YAAY;AAC3B;AAEA,SAAS,YAA6B,MAAS,UAAsB;AACnE,QAAM,QAAQ,OAAO,OAAO,IAAI;AAChC,WAAS,IAAI,OAAO,QAAQ;AAC5B,SAAO;AACT;AAEA,SAAS,MAAM,MAAWH,MAAsB,OAAY;AAC1D,QAAM,SAAS,SAAS,IAAI,IAAI;AAChC,SAAO,SAAS,OAAO,MAAMA,MAAK,KAAK,IAAI;AAC7C;AAYA,SAAS,aAA8B,QAAW,UAAqB,UAAmB;AACxF,QAAM,YAAY,UAAU,IAAI,MAAM;AAEtC,MAAI;AACJ,MAAI;AAEJ,WAAS,SAAQ;AACf,QAAI;AAEJ,UAAM,aAAa,YAAY,QAAQ,MAAM;AAE7C,cAAU,IAAI,YAAY,SAAS;AAEnC,aAAS,WAAW;AAClB,UAAI;AACF,eAAO;AAET,cAAQ;AAER,UAAI,SAAS,OAAO;AAClB,cAAM,IAAI;AACV,gBAAQ;AAAA,MACV;AAEA,aAAO;AAAA,IACT;AAEA,aAAS,OAAO,MAAaA,MAAsB,OAAY;AAC7D,UAAG,UAAU,UAAa;AACxB,cAAM,IAAI,MAAM,GAAG,IAAI,IAAIA,IAAG,+BAA+B;AAE/D,YAAMI,aAAY,UAAU,IAAI,IAAI;AACpC,UAAI,WAAWA,WAAU,IAAI,QAAQ;AAErC,UAAG,CAAC;AACF,QAAAA,WAAU,IAAI,UAAU,WAAW,oBAAI,KAAG;AAE5C,eAAS,IAAIJ,IAAG;AAEhB,YAAM,SAAS,UAAU,IAAI,KAAK;AAElC,UAAG;AACD,kBAAU;AAAA,UACR,QAAQ,YAAY,OAAO,MAAM;AAAA,UACjC;AAAA,QACF;AAEF,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,MAAM,QAAQ,aAAa,KAAK;AACtC,YAAM,MAAM,SAAS,KAAK,YAAY,UAAU;AAChD,YAAM,QAAQ,IAAI;AAElB,cAAQ,QAAQ,OAAO,OAAO;AAC9B,cAAQ,CAAAA,SAAO;AACb,YAAG,OAAO,OAAO;AACf,cAAIA,IAAG;AAET,cAAM;AAAA,MACR;AAAA,IACF,SACM,KAAI;AACR,UAAG,eAAe,SAAQ;AACxB,gBAAQ;AACR,YAAI,KAAK,MAAM;AAAA,MACjB;AAEE,cAAM;AAAA,IACV;AAAA,EACF;AAEA,WAAS,UAAS;AAChB,QAAG;AACD,YAAM,KAAK;AAEb,YAAQ;AAAA,EACV;AAAC;AAED,MAAG,iBAAiB,aAAa;AAC/B,kBAAc,IAAI,OAAO;AAE3B,cAAY,QAAQ,CAAAA,SAAO;AACzB,QAAGA,SAAQ;AACT,aAAO;AAAA,aAED,CAAC;AACP,aAAO;AAET,QAAGA,SAAQ,QAAQ;AACjB,YAAM,IAAI;AAAA,EACd,CAAC;AAED,SAAO;AACT;AAEA,IAAI;AAEG,SAAS,QAAQ,QAAiB;AACvC,MAAG;AACD,WAAO,MAAM,MAAM;AAAA,IAAC;AAEtB,QAAM,UAAU;AAChB,QAAM,MAAM,gBAAgB,oBAAI;AAEhC,SAAO,MAAM;AACX,oBAAgB;AAEhB,WAAO,MAAM;AACX,UAAI,QAAQ,QAAM,GAAG,CAAC;AAAA,IACxB;AAAA,EACF;AACF;;;ACzRA,IAAM,SAAS,OAAO;AAGtB,IAAM,KAAK,oBAAI,QAAuB;AAGtC,IAAM,QAAQ,oBAAI,QAA0D;AAG5E,IAAM,SAAS,oBAAI,QAAmC;AAGtD,IAAM,SAAS,oBAAI,QAA6B;AAGhD,IAAM,UAAU,oBAAI,QAAuD;AAG3E,IAAM,SAAS,oBAAI,QAAkB;AAmHrC,IAAe,QAAf,MAAqB;AAAA,EACnB,eAAe,MAAiB;AAC9B,YAAQ,IAAI;AACZ,WAAO,MAAM,MAAM,EAAE,OAAO,KAAK,CAAC;AAClC,SAAK,MAAM,IAAI;AAAA,EACjB;AAAA,EAqDA,IAAI,MAA2C,MAA2C;AACxF,UAAM,OAAO,KAAK;AAElB,QAAG,OAAO,QAAQ,YAAW;AAC3B,UAAIK,WAAU,oBAAI,IAAuB;AAEzC,aAAO,aAAa,MAAM,CAAC,UAAU;AACnC,cAAM,KAAK,KAAK,KAAK,OAAO,OAAOA,QAAO;AAE1C,eAAO,OAAO,OAAO,OAAQ,CAACC,YAAW;AACvC,UAAAD,WAAU,aAAa,IAAI,IAAI;AAC/B,cAAG,OAAO,MAAM;AACd,eAAGC,OAAM;AAAA,QACb;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WACE,SAAS,SACP,SAAS,IAAI,IACb,OAAO,QAAQ,aACb,YAAY,MAAM,MAAM,IAAI,IAC5B,SAAS,OACP,OAAO,SAAS,MAAM,IAAI,IAAI,CAAC,IAC/B,MAAM,MAAM,MAAM,IAAI;AAAA,EAEhC;AAAA,EAkEA,IACE,MACA,MAAqC;AAErC,UAAM,OAAO,KAAK;AAElB,QAAG,OAAO,QAAQ;AAChB,aAAO,YAAY,MAAM,CAAAC,SAAO;AAC9B,YAAG,OAAOA,QAAO;AACf,iBAAO,KAAK,KAAK,MAAMA,MAAK,IAAI;AAAA,MACpC,CAAC;AAEH,QAAG,OAAO,QAAQ;AAChB,aAAO,YAAY,MAAM,CAAAA,SAAO;AAC9B,YAAGA,SAAQ;AACT,iBAAO,KAAK,KAAK,MAAMA,MAAK,IAAI;AAAA,MACpC,CAAC;AAEH,QAAG,QAAQ,OAAO,QAAQ;AACxB,aAAO,MAAM,MAAM,SAAS,IAAI;AAAA;AAEhC,YAAM,MAAM,IAAI;AAElB,WAAO,QAAQ,IAAI;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,CAAC,OAAO,QAAQ,IAAiC;AAC/C,WAAO,OAAO,QAAQ,MAAM,IAAI,KAAK,EAAE,CAAE,EAAE,OAAO,QAAQ,EAAE;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,OAA6C,MAAoB;AACtE,UAAM,WAAW,IAAI,KAAK,GAAG,IAAI;AACjC,UAAM,QAAQ;AACd,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,GAAkC,OAA4B;AACnE,WAAO,UAAU,QAAQ,OAAO,SAAS,cAAc,MAAM,qBAAqB;AAAA,EACpF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,GAAyC,UAA2B;AACzE,QAAI,SAAS,OAAO,IAAI,IAAI;AAE5B,QAAG,CAAC;AACF,aAAO,IAAI,MAAM,SAAS,oBAAI,KAAG;AAEnC,WAAO,IAAI,QAAQ;AAEnB,WAAO,MAAM,OAAO,OAAO,QAAQ;AAAA,EACrC;AACF;AAEA,OAAO,MAAM,WAAW,YAAY;AAAA,EAClC,QAAO;AACL,WAAO,GAAG,IAAI,KAAK,EAAE;AAAA,EACvB;AACF,CAAC;AAED,OAAO,OAAO,YAAY;AAAA,EACxB,QAAO;AACL,WAAO,KAAK;AAAA,EACd;AACF,CAAC;AAED,SAAS,OAAO,SAAgB,MAA2B,QAAiB;AAC1E,QAAM,UAAU,QAAQ,IAAI,QAAQ,WAAyB;AAE7D,aAAUA,QAAO,MAAK;AACpB,UAAM,OAAO,QAAQ,IAAIA,IAAG;AAC5B,QAAG;AACD,WAAK,KAAK,SAAS,KAAKA,IAAG,CAAC;AAAA,aACtBA,QAAO,WAAWA,SAAQ,MAAK;AACrC,YAAM,OAAO,OAAO,yBAAyB,SAASA,IAAG;AACzD,YAAMC,OAAM,QAAQ,KAAK;AAEzB,MAAAA,KAAI,KAAK,SAAS,KAAKD,IAAG,GAAG,WAAW,IAAI;AAAA,IAC9C;AAAA,EACF;AACF;AAGA,SAAS,QAAQ,OAAa;AAC5B,MAAI,IAAI,MAAM;AAEd,MAAG,MAAM;AACP,UAAM,IAAI,MAAM,2BAA2B;AAE7C,QAAM,QAAQ,CAAC;AACf,MAAIE,QAAO,oBAAI,IAAkC;AAEjD,KAAG,IAAI,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE;AAE7B,SAAM,EAAE,MAAK;AACX,eAAU,MAAM,OAAO,IAAI,CAAC,KAAK,CAAC;AAChC,kBAAY,OAAO,EAAE;AAEvB,QAAG,MAAM,MAAO;AAAA,QACX,OAAM,QAAQ,CAAC;AAEpB,QAAI,OAAO,eAAe,CAAC;AAAA,EAC7B;AAEA,aAAU,QAAQ,OAAM;AACtB,QAAG,QAAQ,IAAI,IAAI,GAAE;AACnB,MAAAA,QAAO,QAAQ,IAAI,IAAI;AACvB;AAAA,IACF;AAEA,YAAQ,IAAI,MAAMA,QAAO,IAAI,IAAIA,KAAI,CAAC;AAEtC,eAAU,CAACF,MAAK,EAAE,MAAM,CAAC,KAAK,OAAO;AAAA,MACnC,OAAO,0BAA0B,KAAK,SAAS;AAAA,IACjD,GAAE;AAIA,UAASG,QAAT,SAA2B,SAAS,OAAM;AACxC,cAAMC,SAAQ,OAAO,KAAK,KAAK,EAAE;AAEjC,eAAO,IAAIA,QAAO,MAAM;AACxB,eAAO,KAAK,IAAIJ,MAAK,EAAE,OAAAI,QAAO,UAAU,KAAK,CAAC;AAE9C,eAAOA;AAAA,MACT;AAPS,iBAAAD;AAHT,UAAG,CAAC,SAASH,QAAO;AAClB;AAWF,MAAAE,MAAK,IAAIF,MAAKG,KAAI;AAClB,aAAO,KAAK,WAAWH,MAAK,EAAE,KAAKG,OAAM,KAAKA,MAAK,CAAC;AAAA,IACtD;AAAA,EACF;AACF;AAMA,SAAS,KAAK,OAAc,MAAiB;AAC3C,QAAM,QAAQ,CAAC;AAEf,QAAM,IAAI,OAAO,KAAK;AAEtB,SAAO,KAAK,KAAK,EAAE,OAAO,SAAO;AAC/B,QAAG,OAAO,OAAO;AACf,aAAO;AAET,OAAG,IAAI,OAAO,GAAG;AAAA,EACnB,CAAC;AAED,cAAY,OAAO,MAAM;AACvB,QAAG,CAAC,OAAO,IAAI,KAAK;AAClB,aAAO,IAAI,OAAO,IAAI;AAExB,eAAUH,QAAO,OAAM;AACrB,YAAM,OAAO,OAAO,yBAAyB,OAAOA,IAAG;AAEvD,UAAG,WAAW,MAAK;AACjB,eAAO,OAAOA,MAAK,KAAK,OAAO,IAAI;AACnC,eAAO,OAAOA,MAAK;AAAA,UACjB,cAAc;AAAA,UACd,MAAK;AACH,mBAAO,MAAM,MAAMA,MAAK,MAAMA,IAAG,CAAC;AAAA,UACpC;AAAA,UACA,IAAI,OAAO,QAAiB;AAC1B,mBAAO,OAAOA,MAAK,OAAO,MAAM;AAChC,qBAAS,OAAO,KAAK;AAAA,UACvB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,QAAQ,CAAC,QAAQ;AACpB,YAAMK,OAAM,OAAO,OAAO,aACtB,IAAI,KAAK,OAAO,KAAK,IACrB;AAEJ,UAAGA,gBAAe;AAChB,QAAAA,KAAI,MAAM,SAAO;AACf,kBAAQ,MAAM,kCAAkC,KAAK,GAAG;AACxD,kBAAQ,MAAM,GAAG;AAAA,QACnB,CAAC;AAAA,eACK,OAAOA,QAAO;AACpB,oBAAY,OAAOA,MAAK,IAAI;AAAA,eACtB,OAAOA,QAAO;AACpB,eAAO,OAAOA,MAAK,IAAI;AAAA,IAC3B,CAAC;AAED,gBAAY,OAAO,MAAM;AACvB,iBAAU,CAAC,GAAG,KAAK,KAAK;AACtB,YAAG,iBAAiB,SAAS,OAAO,IAAI,KAAK,MAAM;AACjD,gBAAM,IAAI,IAAI;AAElB,aAAO,OAAO,KAAK;AAAA,IACrB,GAAG,IAAI;AAEP,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,SAAS,QAAeC,QAAe;AAC9C,MAAGA,kBAAiB,SAAS,CAAC,OAAO,IAAIA,MAAK,GAAE;AAC9C,WAAO,IAAIA,QAAO,MAAM;AACxB,UAAMA,MAAK;AAAA,EACb;AACF;AAEA,SAAS,MAAM,SAAgB,UAAkB,UAAmB;AAClE,QAAM,QAAQ,MAAM,IAAI,OAAO;AAE/B,MAAG,YAAY,SAAS,aAAa,OAAM;AACzC,UAAM,QAAQ,MAAM,QAAQ;AAE5B,QAAG,UAAU,UAAa,CAAC;AACzB,aAAO;AAAA,EACX;AAEA,QAAM,QAAQ,IAAI,MAAM,GAAG,OAAO,IAAI,QAAQ,wBAAwB;AACtE,QAAM,UAAU,IAAI,QAAa,CAAC,SAAS,WAAW;AACpD,gBAAY,SAAS,CAAAN,SAAO;AAC1B,UAAGA,SAAQ,UAAS;AAClB,gBAAQ,MAAMA,IAAG,CAAC;AAClB,eAAO;AAAA,MACT;AAEA,UAAGA,SAAQ;AACT,eAAO,IAAI,MAAM,GAAG,OAAO,gBAAgB,CAAC;AAAA,IAChD,CAAC;AAAA,EACH,CAAC;AAED,QAAM,OAAO,OAAO,SAAS;AAAA,IAC3B,UAAU,MAAM,OAAO,KAAK;AAAA,IAC5B,MAAM;AAAA,IACN,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,EACf,CAAC;AACH;AAGA,IAAI;AAEJ,SAAS,SAA0B,OAA0B;AAC3D,QAAM,SAAS,CAAC;AAChB,MAAI;AAEJ,MAAG,CAAC,QAAO;AACT,qBAAiB;AACjB,aAAS,oBAAI,IAAI,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC;AAAA,EACpC;AAEA,WAAQ,CAACA,MAAK,KAAK,KAAK,OAAM;AAC5B,QAAG,OAAO,IAAI,KAAK;AACjB,cAAQ,OAAO,IAAI,KAAK;AAAA,aAClB,SAAS,OAAO,SAAS,YAAY,SAAS,SAAS,OAAO,MAAM,QAAQ;AAClF,aAAO,IAAI,OAAO,QAAQ,MAAM,IAAI,CAAC;AAEvC,WAAOA,IAAG,IAAI;AAAA,EAChB;AAEA,MAAG;AACD,aAAS;AAEX,SAAO,OAAO,OAAO,MAAM;AAC7B;AAEA,SAAS,OACP,SACAA,MACA,OACA,KAAgC;AAEhC,QAAM,QAAQ,MAAM,IAAI,OAAO;AAE/B,MAAG,OAAO,SAAS,KAAK;AACtB,UAAM,IAAI,MAAM,mBAAmB,OAAOA,IAAG,CAAC,QAAQ,OAAO,gBAAgB;AAE/E,QAAM,WAAW,MAAMA,IAAG;AAE1B,MAAG,OAAO,OAAO,YAAW;AAC1B,UAAM,MAAM,IAAI,KAAK,SAAS,OAAO,QAAQ;AAE7C,QAAG,QAAQ;AACT,aAAO;AAET,QAAG,OAAO,OAAO;AACf,cAAQ,IAAI;AAAA,EAChB;AAEA,MAAG,UAAU,YAAY,UAAU;AACjC;AAEF,QAAMA,IAAG,IAAI;AAEb,MAAG,QAAQ;AACT,UAAM,SAASA,IAAG;AAEpB,SAAO;AACT;AAGA,SAAS,MAAK;AACZ,UAAQ,QAAQ,KAAK,OAAO,IAAI,OAAO,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,EAAE,YAAY;AAClF;;;ACzlBA,IAAM,SAAS,oBAAI,QAAqD;AACxE,IAAM,OAAO,oBAAI,IAAiC;AAElD,SAAS,IAAI,GAAwB,UAA4B;AAC/D,MAAI,IAAI,KAAK,IAAI,CAAC;AAElB,MAAG,CAAC;AACF,SAAK,IAAI,GAAG,IAAI;AAAA,MACd,OAAO,KAAK,WAAW,SAAS,EAAE,cAAc,OAAO,CAAC;AAAA,IAC1D,CAAC;AAEH,SAAO,WAAW,IAAI,CAAC,IAAI;AAC7B;AAEA,SAAS,KAAK,MAAkB,UAAmB;AACjD,QAAMO,QAAO,oBAAI,IAAY;AAE7B,KAAG;AACD,IAAAA,MAAK,IAAI,IAAI,MAAM,QAAQ,CAAC;AAAA,EAC9B,UACO,OAAO,OAAO,eAAe,IAAI,OAAO;AAE/C,SAAOA;AACT;AAgBA,IAAM,UAAN,MAAM,SAAQ;AAAA,EAyBZ,YAAY,QAAwB;AAHpC,SAAU,QAAQ,oBAAI,IAAyC;AAC/D,SAAU,UAAU,oBAAI,IAAgB;AAGtC,QAAG;AACD,WAAK,QAAQ,MAAM;AAAA,EACvB;AAAA,EAzBA,OAAO,IAAI,EAAE,GAAG,GAAU,UAAkC;AAC1D,UAAM,UAAU,OAAO,IAAI,EAAE;AAE7B,QAAG,mBAAmB,UAAQ;AAC5B,UAAG;AACD,iBAAS,OAAO;AAElB,aAAO;AAAA,IACT;AAEA,QAAG;AACD,UAAG;AACD,gBAAQ,KAAK,QAAQ;AAAA;AAErB,eAAO,IAAI,IAAI,CAAC,QAAQ,CAAC;AAAA,EAC/B;AAAA;AAAA,EAaO,IAAqB,MAAqB,UAA6B;AAC5E,WAAO,eAAe,MAAM,IAAI,MAAM,IAAI,GAAG,EAAE,OAAO,UAAU,cAAc,KAAK,CAAC;AAAA,EACtF;AAAA,EAKO,IAAqB,MAAqBC,UAAkB;AACjE,UAAM,SAAS,KAAK,IAAI,IAAI,CAAC;AAE7B,QAAG,WAAW;AACZ,YAAM,IAAI,MAAM,YAAY,IAAI,yCAAyC;AAE3E,QAAG;AACD,aAAO;AAET,QAAGA;AACD,YAAM,IAAI,MAAM,kBAAkB,IAAI,cAAc;AAAA,EACxD;AAAA,EAEO,KAAK,QAAwB;AAClC,UAAM,OAAO,OAAO,OAAO,IAAI;AAE/B,SAAK,UAAU,oBAAI,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG,GAAG,KAAK,OAAO,CAAC;AAE1D,SAAK,QAAQ,oBAAI,IAAI;AACrB,SAAK,UAAU,oBAAI,IAAI;AAEvB,QAAG;AACD,WAAK,QAAQ,MAAM;AAErB,WAAO;AAAA,EACT;AAAA,EAEO,MAAK;AACV,eAAUC,QAAO,OAAO,sBAAsB,IAAI;AAChD,aAAQ,KAAaA,IAAG;AAE1B,SAAK,QAAQ,QAAQ,QAAM,GAAG,CAAC;AAC/B,SAAK,QAAQ,MAAM;AACnB,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA,EAEO,QACL,QACA,SACD;AACC,UAAMC,QAAO,oBAAI,IAAoB;AAErC,QAAG,OAAO,UAAU,cAAc,kBAAkB;AAClD,eAAS,EAAE,CAAC,UAAU,IAAI,KAAK,MAAM,IAAI,GAAG,OAAO;AAErD,WAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,MAA2C;AAC9E,UAAG,MAAM,GAAG,CAAC,KAAK,aAAa,OAAM;AACnC,cAAM,SAAS,KAAK,MAAM,IAAI,CAAC;AAE/B,YAAG,CAAC,QAAO;AACT,gBAAM,WAAW,KAAK,IAAI,CAAC;AAE3B,eAAK,MAAM,IAAI,GAAG,CAAC;AACnB,UAAAA,MAAK,IAAI,UAAU,IAAI;AAAA,QACzB,WAEQ,WAAW,GAAE;AACnB,eAAK,IAAI;AACT,eAAK,KAAK,IAAI;AACd,eAAK,QAAQ,MAAM;AAAA,QACrB;AAEA;AAAA,MACF;AAEA,YAAM,IAAI;AAAA,QACR,wEACE,KAAK,OAAO,KAAK,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,IACzC;AAAA,MACF;AAAA,IACF,CAAC;AAED,eAAU,CAAC,OAAO,QAAQ,KAAKA,OAAK;AAClC,YAAM,IAAI;AAEV,UAAG,YAAY;AACb,gBAAQ,KAAU;AAEpB,iBAAU,CAAC,MAAM,KAAK,KAAK;AACzB,YAAG,OAAO,IAAI,KAAc,MAAM,OAAM;AACtC,eAAK,IAAI,OAAgB,IAAI;AAC7B,UAAAA,MAAK,IAAI,OAAgB,KAAK;AAAA,QAChC;AAAA,IACJ;AAAA,EACF;AAAA,EAEU,IACR,OACA,UAAmB;AAEnB,UAAM,UAAU,oBAAI,IAAgB;AACpC,QAAI;AACJ,QAAI;AAEJ,QAAG,OAAO,SAAS,YAAW;AAC5B,UAAI;AACJ,UAAI,IAAI,MAAM;AAAA,IAChB,OACK;AACH,UAAI,MAAM;AACV,UAAI;AAAA,IACN;AAEA,SAAK,GAAG,IAAI,EAAE,QAAQ,OAAK;AACzB,YAAM,UAAU,KAAK,CAAC;AAEtB,UAAG,CAAC;AACF;AAEF,kBAAY,GAAG,CAAAC,WAAS;AACtB,YAAGA,WAAU,MAAK;AAChB,gBAAM,WAAW,QAAQ,CAAC;AAE1B,cAAG;AACD,oBAAQ,IAAI,QAAQ;AAAA,QACxB;AAEA,eAAO;AAAA,MACT,CAAC;AAAA,IACH,CAAC;AAED,SAAK,CAAC,EAAE,QAAQ,OAAK;AACnB,YAAM,QAAQ,KAAK,eAAe,CAAC,IAAI,OAAO;AAE9C,UAAG,SAAS,KAAK,CAAC,MAAM,KAAK,CAAC;AAC5B,eAAO,eAAe,MAAM,GAAG;AAAA,UAC7B,cAAc;AAAA,UACd;AAAA,QACF,CAAC;AAAA,IACL,CAAC;AAED,SAAK,QAAQ,IAAI,MAAM;AACrB,cAAQ,QAAQ,QAAM,GAAG,CAAC;AAE1B,UAAG,MAAM;AACP,cAAM,GAAG,IAAI;AAAA,IACjB,CAAC;AAED,UAAM,UAAU,OAAO,IAAI,CAAC;AAE5B,QAAG,mBAAmB;AACpB,cAAQ,QAAQ,QAAM,GAAG,IAAI,CAAC;AAEhC,WAAO,IAAI,GAAG,IAAI;AAElB,WAAO;AAAA,EACT;AACF;;;AChOA,IAAM,cAAc,oBAAI,IAA+B;AAQvD,SAAS,IACP,MACA,MAAsC;AAEtC,QAAM,QAAQ,OAAO,aAAa;AAElC,MAAG,MAAM,GAAG,IAAI;AACd,WAAO,MAAM,MAAM,IAAI;AAEzB,cAAY,IAAI,OAAO,IAAI;AAC3B,SAAO;AACT;AAEA,SAAS,MACP,MACA,MAC6B;AAC7B,SAAO,CAACC,MAAK,YAAY;AACvB,aAASC,KAAI,MAAwB;AACnC,UAAG,OAAO,EAAE,gBAAgB,QAAQ,SAAS;AAC3C,cAAM,IAAI,MAAM,GAAG,OAAO,IAAID,IAAG,2BAA2B,IAAI,YAAY,QAAQ,KAAK,WAAW,GAAG;AAEzG,aAAO,SAASA,MAAK,IAAI;AAEzB,UAAG,QAAQ,OAAO,QAAQ;AACxB,aAAK,IAAI;AAEX,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,IAAI,KAAK;AAEvB,IAAAC,KAAI,KAAK;AACT,WAAO,IAAI,OAAO,OAAO;AACzB,UAAM,IAAI;AAEV,WAAO,EAAE,KAAAA,KAAI;AAAA,EACf;AACF;AAEA,SAASC,QAAiB;AACxB,QAAM,QAAQ,MAAM,IAAI,IAAI;AAE5B,aAAUF,QAAO,MAAK;AACpB,UAAM,EAAE,MAAM,IAAI,OAAO,yBAAyB,MAAMA,IAAG;AAC3D,UAAM,cAAc,YAAY,IAAI,KAAK;AAEzC,QAAG,CAAC,aAAY;AACd,eAAS,MAAM,KAAK;AACpB;AAAA,IACF;AAEA,gBAAY,OAAO,KAAK;AACxB,WAAQ,KAAaA,IAAG;AAExB,UAAM,SAAS,YAAY,KAAK,MAAMA,MAAK,MAAM,KAAK;AAEtD,QAAG,CAAC;AACF;AAEF,UAAM,OAAO,OAAO,UAAU,WAAW,SAAS,EAAE,KAAK,OAAO;AAEhE,QAAG,WAAW;AACZ,YAAMA,IAAG,IAAI,KAAK;AAEpB,UAAM,QAAQ;AAEd,WAAO,eAAe,OAAOA,MAAK;AAAA,MAChC,YAAY,KAAK,eAAe;AAAA,MAChC,MAAgB;AACd,eAAO;AAAA,UAAM;AAAA,UAAMA;AAAA,UACjB,OAAO,KAAK,OAAO,aACf,KAAK,IAAI,IAAI,IACb,MAAM,OAAOA,MAAK,KAAK,GAAG;AAAA,QAChC;AAAA,MACF;AAAA,MACA,IAAI,MAAK;AACP,YAAG,KAAK,QAAQ;AACd,gBAAM,IAAI,MAAM,GAAG,KAAK,IAAIA,IAAG,gBAAgB;AAEjD,eAAO,OAAOA,MAAK,MAAM,KAAK,GAAG;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,MAAM,GAAGE,KAAI;;;AC5Fb,IAAM,QAAQ,oBAAI,QAAoB;AA0DtC,SAAS,IACP,MACA,MAA0B;AAE1B,SAAO,IAAI,CAACC,MAAK,SAAS,UAAU;AAClC,QAAG,OAAO,QAAQ;AAChB,YAAM,IAAI,MAAM,uFAAuF,OAAO,IAAIA,IAAG,wBAAwB;AAE/I,QAAG,MAAM,GAAG,IAAI,GAAE;AAIhB,UAASC,UAAT,SAAgB,OAAU;AACxB,YAAI,OAAO,QAAQ;AACjB,gBAAM,IAAI,OAAM,KAAkB,GAAGD,IAAG,CAAC;AAE3C,eAAO,SAASA,MAAK,KAAK;AAAA,MAC5B;AALS,UAAAC;AAHT,YAAM,YAAY,OAAO,IAAI,OAAO;AAUpC,UAAG,CAAC,aAAa,SAAS;AACxB,cAAM,IAAI,MAAM,GAAG,OAAO,sCAAsC,IAAI,GAAG;AAAA,eACjE;AACN,YAAG,qBAAqB,MAAK;AAC3B,UAAAA,QAAO,SAAS;AAChB,iBAAO,CAAC;AAAA,QACV,WACQ,SAAS;AACf,gBAAM,IAAI,MAAM,OAAO,OAAO,wBAAwB,SAAS,4BAA4B,IAAI,GAAG;AAAA;AAEtG,cAAQ,IAAI,SAAS,CAACC,aAAY;AAChC,cAAM,QAAQA,SAAQ,IAAI,IAAI;AAE9B,YAAG;AACD,UAAAD,QAAO,KAAK;AAAA,iBACN,SAAS;AACf,gBAAM,IAAI,MAAM,YAAY,IAAI,6BAA6B,OAAO,GAAG;AAAA,MAC3E,CAAC;AAED,aAAO;AAAA,QACL,KAAK,SAAS;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,OAAO;AAEX,QAAG,gBAAgB,OAAM;AACvB,aAAO;AAAA,IACT,OACK;AACH,YAAM,KAAK,OAAO,IAAI,IAAI,KAAK;AAC/B,aAAQ,CAAC,GAAG,MAAM,GAAG,KAAK,GAAG,GAAG,CAAC;AAAA,IACnC;AAEA,UAAM,SAAwB,aAAW,QAAQ,IAAI;AACrD,UAAM,SAAS;AAEf,QAAI;AACJ,QAAI;AACJ,QAAI;AAEJ,aAAS,QAAQ,OAAa;AAC5B,cAAQ,aAAa,OAAO,aAAW;AACrC,gBAAQ;AAER,YAAG,EAAED,QAAO,UAAU,MAAM,OAAO,OAAO;AACxC,kBAAQ,CAAC,KAAK;AAEhB,eAAO,CAAC,cAAc;AACpB,cAAG,WAAU;AACX,kBAAM,IAAI,OAAO;AACjB,kBAAM,SAASA,MAAK,IAAI;AAAA,UAC1B;AAAA,QACF;AAAA,MACF,GAAG,KAAK;AAAA,IACV;AAEA,aAAS,QAAQ,SAAkB;AACjC,UAAI;AAEJ,UAAI;AACF,eAAO,OAAO,KAAK,OAAO,OAAOA,IAAG;AAAA,MACtC,SACM,KAAI;AACR,gBAAQ,KAAK,iCAAiC,UAAU,iBAAiB,YAAY,IAAI,OAAO,IAAIA,IAAG,GAAG;AAE1G,YAAG;AACD,gBAAM;AAER,gBAAQ,MAAM,GAAG;AAAA,MACnB;AAEA,aAAO,SAASA,MAAK,MAAM,CAAC,OAAO;AAAA,IACrC;AAEA,WAAO,MAAM;AACX,UAAG,CAAC,OAAM;AACR,eAAO,OAAO;AACd,kBAAU;AAAA,MACZ;AAEA,UAAG,MAAM,OAAO,OAAO;AACrB,gBAAQ;AAEV,aAAO,MAAM,SAASA,MAAK,CAAC,KAAK;AAAA,IACnC;AAAA,EACF,CAAC;AACH;;;ACvKA,IAAM,EAAE,gBAAgB,iBAAiB,IAAI;AA8E7C,SAAS,IACP,KACA,MAAwC;AAExC,SAAO,IAAO,CAACG,MAAK,SAAS,UAAU;AACrC,QAAI,QAAQ,CAAC;AACb,UAAM,SAAS,CAACA,SACd,CAAC,aAAkC,WAC/B,YAAY,SAAS,MAAM,SAAS,MAAMA,IAAG,CAAC,GAAGA,IAAG,IACpD,MAAMA,IAAG;AAEf,QAAG,QAAQ;AACT,cAAQ,IAAI,MAAM;AAChB,mBAAUA,QAAO;AACf,cAAG,OAAO,QAAQ;AAChB,2BAAe,OAAOA,MAAK;AAAA,cACzB,cAAc;AAAA,cACd,MAAK;AACH,sBAAM,MAAM,KAAKA,IAAG;AACpB,+BAAe,OAAOA,MAAK,EAAE,OAAO,IAAI,CAAC;AACzC,uBAAO;AAAA,cACT;AAAA,YACF,CAAC;AAAA,eACE;AACH,kBAAMC,OAAM,OAAOD,IAAG;AACtB,kBAAME,OAAM,CAACC,WAAmB;AAC9B,qBAAO,SAASH,MAAKG,MAAK;AAAA,YAC5B;AAEA,6BAAiBD,MAAK;AAAA,cACpB,SAAS,EAAE,KAAAD,MAAK,KAAAC,KAAI;AAAA,cACpB,KAAK,EAAE,OAAOD,KAAI;AAAA,YACpB,CAAC;AAED,2BAAe,OAAOD,MAAK,EAAE,OAAOE,KAAI,CAAC;AAAA,UAC3C;AAAA,MACJ,CAAC;AAAA,aAEK,OAAO,OAAO;AACpB,YAAM,IAAI,MAAM,6DAA6D;AAAA,SAE1E;AACH,UAAI;AAEJ,YAAMD,OAAM,OAAOD,IAAG;AACtB,YAAME,OAAM,CAACC,WAAgB;AAC3B,YAAG,CAAC,OAAO,SAASH,MAAKG,MAAK,KAAK,CAAC;AAClC;AAEF,YAAG;AACD,kBAAQ,KAAK,MAAMA,MAAK;AAE1B,YAAGA,WAAU,QAAQ,SAAS;AAC5B;AAEF,cAAM,MAAM,QAAQ;AACpB,cAAM,MAAM,IAAI,KAAK,SAASA,MAAK;AACnC,cAAM,QAAQ,IAAI;AAElB,gBAAQ,CAAAH,SAAO;AACb,cAAG,OAAO,OAAO;AACf,gBAAIA,IAAG;AAET,gBAAM;AAAA,QACR;AAAA,MACF;AAEA,YAAMA,IAAG,IAAI;AACb,cAAQ,iBAAiBE,MAAK;AAAA,QAC5B,SAAS,EAAE,KAAAD,MAAK,KAAAC,KAAI;AAAA,QACpB,KAAK,EAAE,OAAOD,KAAI;AAAA,MACpB,CAAC;AAAA,IACH;AAEA,mBAAe,SAASD,MAAK,EAAE,MAAM,CAAC;AAAA,EACxC,CAAC;AACH;;;AChHA,SAAS,IACP,OACA,UAAuC;AAEvC,SAAO,IAAO,CAACI,MAAK,YAAY;AAC9B,UAAM,WAA6B;AAAA,MACjC,YAAY;AAAA,IACd;AAEA,QAAG,OAAO,SAAS,cAAc,iBAAiB,SAAQ;AACxD,UAASC,QAAT,WAAe;AACb,YAAG,OAAO,SAAS;AACjB,cAAI;AACF,oBAAQ,QAAQ,MAAM,KAAK,SAASD,IAAG,CAAC;AAAA,UAC1C,SACM,KAAI;AACR,oBAAQ,KAAK,gCAAgC,OAAO,IAAIA,IAAG,UAAU;AACrE,kBAAM;AAAA,UACR;AAEF,iBAAS,MAAM,aAAa;AAE5B,YAAG,iBAAiB,SAAQ;AAC1B,gBACG,KAAK,CAAAE,WAAS;AACb,mBAAO,SAASF,MAAKE,MAAK;AAC1B,mBAAOA;AAAA,UACT,CAAC,EACA,MAAM,SAAO;AACZ,kBAAM,SAASF,IAAG;AAClB,qBAAS,MAAM,MAAM;AAAE,oBAAM;AAAA,YAAI;AAAA,UACnC,CAAC;AAAA,QACL;AAEE,iBAAO,SAASA,MAAK,KAAK;AAE5B,YAAG,KAAK;AACN,iBAAO,QAAQA,IAAG;AAAA,MACtB;AA5BS,UAAAC;AA8BT,UAAG;AACD,QAAAA,MAAK;AAAA;AAEL,iBAAS,MAAMA;AAAA,IACnB,WACQ,UAAU;AAChB,eAAS,QAAQ;AAEnB,QAAG,OAAO,YAAY,YAAW;AAC/B,UAAI;AAEJ,eAAS,MAAM,SAAoBC,QAAY,UAAc;AAC3D,cAAM,MAAM,QAAQ;AACpB,cAAM,MAAM,SAAS,KAAK,MAAMA,QAAO,QAAQ;AAC/C,cAAM,QAAQ,IAAI;AAElB,YAAG,QAAQ;AACT,iBAAO;AAET,YAAG,OAAO,SAAS;AACjB,gBAAMA,MAAK;AAEb,gBAAQ,CAAC,SAAY;AACnB,cAAG,OAAO,OAAO;AACf,gBAAI,IAAI;AAEV,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEE,eAAS,MAAM,CAAAA,WAAS;AACtB,iBAAS,MAAM;AACf,eAAO,SAASF,MAAKE,MAAK;AAAA,MAC5B;AAEF,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,QAAQ,IAAoB;AACnC,WAAS,MAAM,KAAa;AAC1B,QAAG,eAAe;AAChB,aAAO,IAAI,KAAK,OAAO;AAAA;AAEvB,YAAM;AAAA,EACV;AAEA,WAAS,UAAe;AACtB,QAAI;AACF,YAAM,SAAS,GAAG;AAElB,aAAO,kBAAkB,UACrB,OAAO,MAAM,KAAK,IAClB;AAAA,IACN,SACM,KAAI;AACR,aAAO,MAAM,GAAG;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,QAAQ;AACjB;;;AC/IA,IAAM,QAAQ,oBAAI,QAAgE;AASlF,SAAS,IACP,MACA,MAAuB;AAEvB,SAAO,IAAS,CAACC,MAAK,YAAY;AAChC,UAAM,UAAU,oBAAI,IAAW;AAC/B,UAAM,QAAQ,MAAM;AAClB,aAAO,SAASA,MAAK,OAAO,OAAO,MAAM,KAAK,OAAO,CAAC,CAAC;AAAA,IACzD;AAEA,QAAG,MAAM,GAAG,IAAI;AACd,cAAQ,IAAI,SAAS,SAAO;AAC1B,YAAI,IAAI,MAAM,WAAS;AACrB,gBAAMC,OAAM,QAAQ;AACpB,cAAI;AACJ,cAAI;AAEJ,cAAG,QAAQ,IAAI,KAAK;AAClB;AAEF,gBAAM,SAAS,MAAM,IAAI,KAAK;AAE9B,cAAG,QAAO;AACR,kBAAM,QAAQ,OAAO,OAAO;AAE5B,gBAAG,UAAU;AACX;AAEF,gBAAG,OAAO,SAAS;AACjB,2BAAa;AAAA,UACjB;AAEA,cAAG,OAAO,QAAQ,YAAW;AAC3B,kBAAMC,QAAO,KAAK,OAAO,OAAO;AAEhC,gBAAGA,UAAS;AACV,qBAAO;AAET,qBAAS,MAAM;AACb,kBAAG,OAAOA,SAAQ;AAChB,gBAAAA,MAAK;AAAA,YACT;AAAA,UACF;AAEA,gBAAM,QAAQD,KAAI;AAElB,kBAAQ,IAAI,KAAK;AACjB,gBAAM;AAEN,gBAAM,OAAO,MAAM;AACjB,kBAAM;AACN,mBAAO;AAEP,oBAAQ,OAAO,KAAK;AACpB,kBAAM;AAEN,gBAAG;AACD,yBAAW;AAEb,gBAAG,OAAO,UAAU;AAClB,qBAAO;AAET,qBAAS;AAAA,UACX;AAEA,gBAAM,SAAS,MAAM,IAAI,MAAM,IAAI;AAEnC,iBAAO;AAAA,QACT,CAAC;AAAA,MACH,CAAC;AAAA,SACE;AACH,UAAG,MAAM,IAAI,OAAO;AAClB,cAAM,IAAI,MAAM,iDAAiD;AAEnE,YAAM,IAAI,SAAS,eAAa;AAC9B,YAAI;AAEJ,YAAG,MAAK;AACN,mBAAS,KAAK,WAAW,OAAO;AAEhC,cAAG,WAAW;AACZ,mBAAO;AAAA,QACX;AAEA,gBAAQ,IAAI,SAAS;AACrB,cAAM;AAEN,eAAO,MAAM;AACX,kBAAQ,OAAO,SAAS;AACxB,gBAAM;AAEN,cAAG,OAAO,UAAU;AAClB,mBAAO;AAAA,QACX;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,OAAO,CAAC,EAAE;AAAA,EACrB,CAAC;AACH;","names":["key","pending","res","event","listeners","pending","update","key","set","keys","bind","value","use","child","keys","require","key","init","event","key","set","init","key","assign","context","key","get","set","value","key","init","value","key","ctx","done"]}
|
package/package.json
CHANGED