@decohere/crucible 0.0.1-dev.3 → 0.0.1-dev.31
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/commonjs/src/const.js +33 -0
- package/commonjs/src/decorators/index.js +21 -0
- package/commonjs/src/decorators/inject.decorator.js +27 -0
- package/commonjs/src/decorators/injectable.dectorator.js +16 -0
- package/commonjs/src/index.js +22 -0
- package/commonjs/src/models/registration-key.model.js +31 -0
- package/commonjs/src/models/service-registration.model.js +30 -0
- package/commonjs/src/services/crucible-builder.js +68 -0
- package/commonjs/src/services/crucible.js +165 -0
- package/commonjs/src/services/index.js +21 -0
- package/commonjs/src/services/service-registry.js +50 -0
- package/commonjs/src/types/errors.js +29 -0
- package/commonjs/src/types/index.js +20 -0
- package/commonjs/src/types/types.js +6 -0
- package/{src → es6/src}/decorators/inject.decorator.js +2 -2
- package/es6/src/services/crucible.js +155 -0
- package/package.json +3 -3
- package/types/src/const.d.ts +9 -0
- package/types/src/decorators/index.d.ts +2 -0
- package/types/src/decorators/inject.decorator.d.ts +5 -0
- package/types/src/decorators/injectable.dectorator.d.ts +1 -0
- package/types/src/index.d.ts +3 -0
- package/types/src/models/registration-key.model.d.ts +7 -0
- package/types/src/models/service-registration.model.d.ts +11 -0
- package/types/src/services/crucible-builder.d.ts +26 -0
- package/types/src/services/crucible.d.ts +31 -0
- package/types/src/services/index.d.ts +2 -0
- package/types/src/services/service-registry.d.ts +16 -0
- package/types/src/types/errors.d.ts +6 -0
- package/types/src/types/index.d.ts +1 -0
- package/types/src/types/types.d.ts +1 -0
- package/src/services/crucible.js +0 -133
- package/tests/container.spec.js +0 -259
- /package/{src → es6/src}/const.js +0 -0
- /package/{src → es6/src}/decorators/index.js +0 -0
- /package/{src → es6/src}/decorators/injectable.dectorator.js +0 -0
- /package/{src → es6/src}/index.js +0 -0
- /package/{src → es6/src}/models/registration-key.model.js +0 -0
- /package/{src → es6/src}/models/service-registration.model.js +0 -0
- /package/{src → es6/src}/services/crucible-builder.js +0 -0
- /package/{src → es6/src}/services/index.js +0 -0
- /package/{src → es6/src}/services/service-registry.js +0 -0
- /package/{src → es6/src}/types/errors.js +0 -0
- /package/{src → es6/src}/types/index.js +0 -0
- /package/{src → es6/src}/types/types.js +0 -0
package/tests/container.spec.js
DELETED
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
function _ts_add_disposable_resource(env, value, async) {
|
|
2
|
-
if (value !== null && value !== void 0) {
|
|
3
|
-
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
-
var dispose, inner;
|
|
5
|
-
if (async) {
|
|
6
|
-
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
-
dispose = value[Symbol.asyncDispose];
|
|
8
|
-
}
|
|
9
|
-
if (dispose === void 0) {
|
|
10
|
-
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
-
dispose = value[Symbol.dispose];
|
|
12
|
-
if (async) inner = dispose;
|
|
13
|
-
}
|
|
14
|
-
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
-
if (inner) dispose = function() {
|
|
16
|
-
try {
|
|
17
|
-
inner.call(this);
|
|
18
|
-
} catch (e) {
|
|
19
|
-
return Promise.reject(e);
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
env.stack.push({
|
|
23
|
-
value: value,
|
|
24
|
-
dispose: dispose,
|
|
25
|
-
async: async
|
|
26
|
-
});
|
|
27
|
-
} else if (async) {
|
|
28
|
-
env.stack.push({
|
|
29
|
-
async: true
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
return value;
|
|
33
|
-
}
|
|
34
|
-
function _ts_dispose_resources(env) {
|
|
35
|
-
var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
36
|
-
var e = new Error(message);
|
|
37
|
-
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
38
|
-
};
|
|
39
|
-
return (_ts_dispose_resources = function _ts_dispose_resources(env) {
|
|
40
|
-
function fail(e) {
|
|
41
|
-
env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
42
|
-
env.hasError = true;
|
|
43
|
-
}
|
|
44
|
-
var r, s = 0;
|
|
45
|
-
function next() {
|
|
46
|
-
while(r = env.stack.pop()){
|
|
47
|
-
try {
|
|
48
|
-
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
49
|
-
if (r.dispose) {
|
|
50
|
-
var result = r.dispose.call(r.value);
|
|
51
|
-
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
|
|
52
|
-
fail(e);
|
|
53
|
-
return next();
|
|
54
|
-
});
|
|
55
|
-
} else s |= 1;
|
|
56
|
-
} catch (e) {
|
|
57
|
-
fail(e);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
61
|
-
if (env.hasError) throw env.error;
|
|
62
|
-
}
|
|
63
|
-
return next();
|
|
64
|
-
})(env);
|
|
65
|
-
}
|
|
66
|
-
import { CrucibleBuilder } from "../src/index.js";
|
|
67
|
-
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
68
|
-
class Disposable {
|
|
69
|
-
[Symbol.dispose]() {
|
|
70
|
-
this.dispose();
|
|
71
|
-
}
|
|
72
|
-
dispose() {}
|
|
73
|
-
}
|
|
74
|
-
class Singleton {
|
|
75
|
-
nonce;
|
|
76
|
-
constructor(){
|
|
77
|
-
this.nonce = getRandomInt();
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
describe("CrucibleBuilder", ()=>{
|
|
81
|
-
let builder;
|
|
82
|
-
beforeEach(()=>{
|
|
83
|
-
vi.clearAllMocks();
|
|
84
|
-
builder = new CrucibleBuilder();
|
|
85
|
-
});
|
|
86
|
-
describe("Factories", ()=>{
|
|
87
|
-
const FACTORY_KEY = "MY_FACTORY";
|
|
88
|
-
// using a spy for the factory changes the type
|
|
89
|
-
// this is the only way to ensure the factory is actually called
|
|
90
|
-
it("should support arrow functions", ()=>{
|
|
91
|
-
const builder = new CrucibleBuilder();
|
|
92
|
-
const expected = {
|
|
93
|
-
field: "fieldValue"
|
|
94
|
-
};
|
|
95
|
-
const factory = ()=>expected;
|
|
96
|
-
builder.registerRequestScoped(FACTORY_KEY, factory);
|
|
97
|
-
const container = builder.build();
|
|
98
|
-
const actual = container.resolve(FACTORY_KEY);
|
|
99
|
-
expect(actual).toEqual(expected);
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
describe("Dispose", ()=>{
|
|
103
|
-
const dispose = vi.spyOn(Disposable.prototype, "dispose");
|
|
104
|
-
it("should dispose the child scope", ()=>{
|
|
105
|
-
{
|
|
106
|
-
const env = {
|
|
107
|
-
stack: [],
|
|
108
|
-
error: void 0,
|
|
109
|
-
hasError: false
|
|
110
|
-
};
|
|
111
|
-
try {
|
|
112
|
-
const builder = new CrucibleBuilder();
|
|
113
|
-
builder.registerRequestScoped(Disposable);
|
|
114
|
-
const container = builder.build();
|
|
115
|
-
const scope = _ts_add_disposable_resource(env, container.beginScope(), false);
|
|
116
|
-
scope.resolve(Disposable);
|
|
117
|
-
} catch (e) {
|
|
118
|
-
env.error = e;
|
|
119
|
-
env.hasError = true;
|
|
120
|
-
} finally{
|
|
121
|
-
_ts_dispose_resources(env);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
expect(dispose).toHaveBeenCalled();
|
|
125
|
-
});
|
|
126
|
-
it("should dispose root container without recursive self-disposal", ()=>{
|
|
127
|
-
const builder = new CrucibleBuilder();
|
|
128
|
-
const container = builder.build();
|
|
129
|
-
container.resolve("LIFETIME_SCOPE");
|
|
130
|
-
expect(()=>container[Symbol.dispose]()).not.toThrow();
|
|
131
|
-
});
|
|
132
|
-
// it("should support n level scoped?", () => {
|
|
133
|
-
// const builder = new CrucibleBuilder();
|
|
134
|
-
// builder.registerRequestScoped(Disposable);
|
|
135
|
-
// const container = builder.build();
|
|
136
|
-
// using scope = container.beginScope();
|
|
137
|
-
// });
|
|
138
|
-
});
|
|
139
|
-
describe("Singletons", ()=>{
|
|
140
|
-
it("should resolve singleton from the root scope", ()=>{
|
|
141
|
-
// this checks that the same singleton is resolved in all child scopes
|
|
142
|
-
const builder = new CrucibleBuilder();
|
|
143
|
-
builder.registerSingleton(Singleton);
|
|
144
|
-
const container = builder.build();
|
|
145
|
-
const child = container.beginScope();
|
|
146
|
-
const inst1 = container.resolve(Singleton);
|
|
147
|
-
const inst2 = child.resolve(Singleton);
|
|
148
|
-
const manualInst = new Singleton();
|
|
149
|
-
expect(inst1).toBe(inst2);
|
|
150
|
-
expect(manualInst).not.toEqual(inst1);
|
|
151
|
-
expect(manualInst).not.toEqual(inst2);
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
describe("registerRequestScoped", ()=>{
|
|
155
|
-
it("should resolve the same instance in the same scope", ()=>{
|
|
156
|
-
builder.registerRequestScoped(Disposable);
|
|
157
|
-
const container = builder.build();
|
|
158
|
-
const childA = container.beginScope(getRandomInt().toString());
|
|
159
|
-
const serviceA = childA.resolve(Disposable);
|
|
160
|
-
const serviceB = childA.resolve(Disposable);
|
|
161
|
-
expect(serviceA).toBe(serviceB);
|
|
162
|
-
});
|
|
163
|
-
it("should resolve a new instance per scope", ()=>{
|
|
164
|
-
builder.registerRequestScoped(Disposable);
|
|
165
|
-
const container = builder.build();
|
|
166
|
-
const childA = container.beginScope(generateScopeId());
|
|
167
|
-
const serviceA = childA.resolve(Disposable);
|
|
168
|
-
const childB = container.beginScope(generateScopeId());
|
|
169
|
-
const serviceB = childB.resolve(Disposable);
|
|
170
|
-
expect(serviceA).not.toBe(serviceB);
|
|
171
|
-
});
|
|
172
|
-
});
|
|
173
|
-
describe("beginScope", ()=>{
|
|
174
|
-
it("should support n level isolated scopes", ()=>{
|
|
175
|
-
builder.registerRequestScoped(Disposable);
|
|
176
|
-
const container = builder.build();
|
|
177
|
-
const childA = container.beginScope(generateScopeId());
|
|
178
|
-
const gandchildA = childA.beginScope(generateScopeId());
|
|
179
|
-
const serviceChildA = childA.resolve(Disposable);
|
|
180
|
-
const serviceGandchildA = gandchildA.resolve(Disposable);
|
|
181
|
-
expect(serviceChildA).not.toBe(serviceGandchildA);
|
|
182
|
-
});
|
|
183
|
-
it("should not dispose the child scope if parent is disposed", ()=>{
|
|
184
|
-
builder.registerRequestScoped(Disposable);
|
|
185
|
-
const container = builder.build();
|
|
186
|
-
let grandChild;
|
|
187
|
-
{
|
|
188
|
-
const env = {
|
|
189
|
-
stack: [],
|
|
190
|
-
error: void 0,
|
|
191
|
-
hasError: false
|
|
192
|
-
};
|
|
193
|
-
try {
|
|
194
|
-
const child = _ts_add_disposable_resource(env, container.beginScope(generateScopeId()), false);
|
|
195
|
-
grandChild = child.beginScope(generateScopeId());
|
|
196
|
-
} catch (e) {
|
|
197
|
-
env.error = e;
|
|
198
|
-
env.hasError = true;
|
|
199
|
-
} finally{
|
|
200
|
-
_ts_dispose_resources(env);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
expect(()=>grandChild.resolve(Disposable)).not.toThrow();
|
|
204
|
-
});
|
|
205
|
-
it("should throw if resolving singleton owned by root if roto scope disposed", ()=>{
|
|
206
|
-
builder.registerSingleton(Singleton);
|
|
207
|
-
let child;
|
|
208
|
-
{
|
|
209
|
-
const env = {
|
|
210
|
-
stack: [],
|
|
211
|
-
error: void 0,
|
|
212
|
-
hasError: false
|
|
213
|
-
};
|
|
214
|
-
try {
|
|
215
|
-
const container = _ts_add_disposable_resource(env, builder.build(), false);
|
|
216
|
-
child = container.beginScope(generateScopeId());
|
|
217
|
-
} catch (e) {
|
|
218
|
-
env.error = e;
|
|
219
|
-
env.hasError = true;
|
|
220
|
-
} finally{
|
|
221
|
-
_ts_dispose_resources(env);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
expect(()=>child.resolve(Singleton)).toThrow();
|
|
225
|
-
});
|
|
226
|
-
it("should dispose if exception is throw", ()=>{
|
|
227
|
-
builder.registerRequestScoped(Disposable);
|
|
228
|
-
let containerRef;
|
|
229
|
-
try {
|
|
230
|
-
const env = {
|
|
231
|
-
stack: [],
|
|
232
|
-
error: void 0,
|
|
233
|
-
hasError: false
|
|
234
|
-
};
|
|
235
|
-
try {
|
|
236
|
-
const container = _ts_add_disposable_resource(env, builder.build(), false);
|
|
237
|
-
containerRef = container;
|
|
238
|
-
throw "ERROR";
|
|
239
|
-
} catch (e) {
|
|
240
|
-
env.error = e;
|
|
241
|
-
env.hasError = true;
|
|
242
|
-
} finally{
|
|
243
|
-
_ts_dispose_resources(env);
|
|
244
|
-
}
|
|
245
|
-
} catch {}
|
|
246
|
-
expect(()=>containerRef.resolve(Disposable)).toThrow();
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
});
|
|
250
|
-
function generateScopeId() {
|
|
251
|
-
return getRandomInt().toString();
|
|
252
|
-
}
|
|
253
|
-
function getRandomInt() {
|
|
254
|
-
const min = Math.ceil(0);
|
|
255
|
-
const max = Math.floor(10_000);
|
|
256
|
-
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NydWNpYmxlL3Rlc3RzL2NvbnRhaW5lci5zcGVjLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHR5cGUgQ3J1Y2libGUsIENydWNpYmxlQnVpbGRlciwgdHlwZSBMaWZldGltZVNjb3BlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZVwiO1xuaW1wb3J0IHsgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSBcInZpdGVzdFwiO1xuXG5jbGFzcyBEaXNwb3NhYmxlIHtcblx0cHVibGljIFtTeW1ib2wuZGlzcG9zZV0oKSB7XG5cdFx0dGhpcy5kaXNwb3NlKCk7XG5cdH1cblx0cHVibGljIGRpc3Bvc2UoKSB7fVxufVxuXG5jbGFzcyBTaW5nbGV0b24ge1xuXHRwdWJsaWMgbm9uY2U6IG51bWJlcjtcblx0cHVibGljIGNvbnN0cnVjdG9yKCkge1xuXHRcdHRoaXMubm9uY2UgPSBnZXRSYW5kb21JbnQoKTtcblx0fVxufVxuXG5kZXNjcmliZShcIkNydWNpYmxlQnVpbGRlclwiLCAoKSA9PiB7XG5cdGxldCBidWlsZGVyOiBDcnVjaWJsZUJ1aWxkZXI7XG5cdGJlZm9yZUVhY2goKCkgPT4ge1xuXHRcdHZpLmNsZWFyQWxsTW9ja3MoKTtcblx0XHRidWlsZGVyID0gbmV3IENydWNpYmxlQnVpbGRlcigpO1xuXHR9KTtcblxuXHRkZXNjcmliZShcIkZhY3Rvcmllc1wiLCAoKSA9PiB7XG5cdFx0dHlwZSBGYWN0b3J5UmVzcG9uc2UgPSB7IGZpZWxkOiBcImZpZWxkVmFsdWVcIiB9O1xuXHRcdGNvbnN0IEZBQ1RPUllfS0VZID0gXCJNWV9GQUNUT1JZXCI7XG5cdFx0Ly8gdXNpbmcgYSBzcHkgZm9yIHRoZSBmYWN0b3J5IGNoYW5nZXMgdGhlIHR5cGVcblx0XHQvLyB0aGlzIGlzIHRoZSBvbmx5IHdheSB0byBlbnN1cmUgdGhlIGZhY3RvcnkgaXMgYWN0dWFsbHkgY2FsbGVkXG5cdFx0aXQoXCJzaG91bGQgc3VwcG9ydCBhcnJvdyBmdW5jdGlvbnNcIiwgKCkgPT4ge1xuXHRcdFx0Y29uc3QgYnVpbGRlciA9IG5ldyBDcnVjaWJsZUJ1aWxkZXIoKTtcblx0XHRcdGNvbnN0IGV4cGVjdGVkOiBGYWN0b3J5UmVzcG9uc2UgPSB7IGZpZWxkOiBcImZpZWxkVmFsdWVcIiB9O1xuXHRcdFx0Y29uc3QgZmFjdG9yeSA9ICgpID0+IGV4cGVjdGVkO1xuXHRcdFx0YnVpbGRlci5yZWdpc3RlclJlcXVlc3RTY29wZWQ8RmFjdG9yeVJlc3BvbnNlPihGQUNUT1JZX0tFWSwgZmFjdG9yeSk7XG5cdFx0XHRjb25zdCBjb250YWluZXIgPSBidWlsZGVyLmJ1aWxkKCk7XG5cdFx0XHRjb25zdCBhY3R1YWwgPSBjb250YWluZXIucmVzb2x2ZShGQUNUT1JZX0tFWSk7XG5cdFx0XHRleHBlY3QoYWN0dWFsKS50b0VxdWFsKGV4cGVjdGVkKTtcblx0XHR9KTtcblx0fSk7XG5cblx0ZGVzY3JpYmUoXCJEaXNwb3NlXCIsICgpID0+IHtcblx0XHRjb25zdCBkaXNwb3NlID0gdmkuc3B5T24oRGlzcG9zYWJsZS5wcm90b3R5cGUsIFwiZGlzcG9zZVwiKTtcblxuXHRcdGl0KFwic2hvdWxkIGRpc3Bvc2UgdGhlIGNoaWxkIHNjb3BlXCIsICgpID0+IHtcblx0XHRcdHtcblx0XHRcdFx0Y29uc3QgYnVpbGRlciA9IG5ldyBDcnVjaWJsZUJ1aWxkZXIoKTtcblx0XHRcdFx0YnVpbGRlci5yZWdpc3RlclJlcXVlc3RTY29wZWQoRGlzcG9zYWJsZSk7XG5cdFx0XHRcdGNvbnN0IGNvbnRhaW5lciA9IGJ1aWxkZXIuYnVpbGQoKTtcblx0XHRcdFx0dXNpbmcgc2NvcGUgPSBjb250YWluZXIuYmVnaW5TY29wZSgpO1xuXHRcdFx0XHRzY29wZS5yZXNvbHZlKERpc3Bvc2FibGUpO1xuXHRcdFx0fVxuXG5cdFx0XHRleHBlY3QoZGlzcG9zZSkudG9IYXZlQmVlbkNhbGxlZCgpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgZGlzcG9zZSByb290IGNvbnRhaW5lciB3aXRob3V0IHJlY3Vyc2l2ZSBzZWxmLWRpc3Bvc2FsXCIsICgpID0+IHtcblx0XHRcdGNvbnN0IGJ1aWxkZXIgPSBuZXcgQ3J1Y2libGVCdWlsZGVyKCk7XG5cdFx0XHRjb25zdCBjb250YWluZXIgPSBidWlsZGVyLmJ1aWxkKCk7XG5cdFx0XHRjb250YWluZXIucmVzb2x2ZShcIkxJRkVUSU1FX1NDT1BFXCIpO1xuXG5cdFx0XHRleHBlY3QoKCkgPT4gY29udGFpbmVyW1N5bWJvbC5kaXNwb3NlXSgpKS5ub3QudG9UaHJvdygpO1xuXHRcdH0pO1xuXG5cdFx0Ly8gaXQoXCJzaG91bGQgc3VwcG9ydCBuIGxldmVsIHNjb3BlZD9cIiwgKCkgPT4ge1xuXHRcdC8vIFx0Y29uc3QgYnVpbGRlciA9IG5ldyBDcnVjaWJsZUJ1aWxkZXIoKTtcblx0XHQvLyBcdGJ1aWxkZXIucmVnaXN0ZXJSZXF1ZXN0U2NvcGVkKERpc3Bvc2FibGUpO1xuXHRcdC8vIFx0Y29uc3QgY29udGFpbmVyID0gYnVpbGRlci5idWlsZCgpO1xuXHRcdC8vIFx0dXNpbmcgc2NvcGUgPSBjb250YWluZXIuYmVnaW5TY29wZSgpO1xuXG5cdFx0Ly8gfSk7XG5cdH0pO1xuXG5cdGRlc2NyaWJlKFwiU2luZ2xldG9uc1wiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgcmVzb2x2ZSBzaW5nbGV0b24gZnJvbSB0aGUgcm9vdCBzY29wZVwiLCAoKSA9PiB7XG5cdFx0XHQvLyB0aGlzIGNoZWNrcyB0aGF0IHRoZSBzYW1lIHNpbmdsZXRvbiBpcyByZXNvbHZlZCBpbiBhbGwgY2hpbGQgc2NvcGVzXG5cdFx0XHRjb25zdCBidWlsZGVyID0gbmV3IENydWNpYmxlQnVpbGRlcigpO1xuXHRcdFx0YnVpbGRlci5yZWdpc3RlclNpbmdsZXRvbihTaW5nbGV0b24pO1xuXHRcdFx0Y29uc3QgY29udGFpbmVyID0gYnVpbGRlci5idWlsZCgpO1xuXHRcdFx0Y29uc3QgY2hpbGQgPSBjb250YWluZXIuYmVnaW5TY29wZSgpO1xuXHRcdFx0Y29uc3QgaW5zdDEgPSBjb250YWluZXIucmVzb2x2ZShTaW5nbGV0b24pO1xuXHRcdFx0Y29uc3QgaW5zdDIgPSBjaGlsZC5yZXNvbHZlKFNpbmdsZXRvbik7XG5cdFx0XHRjb25zdCBtYW51YWxJbnN0ID0gbmV3IFNpbmdsZXRvbigpO1xuXHRcdFx0ZXhwZWN0KGluc3QxKS50b0JlKGluc3QyKTtcblx0XHRcdGV4cGVjdChtYW51YWxJbnN0KS5ub3QudG9FcXVhbChpbnN0MSk7XG5cdFx0XHRleHBlY3QobWFudWFsSW5zdCkubm90LnRvRXF1YWwoaW5zdDIpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcInJlZ2lzdGVyUmVxdWVzdFNjb3BlZFwiLCAoKSA9PiB7XG5cdFx0aXQoXCJzaG91bGQgcmVzb2x2ZSB0aGUgc2FtZSBpbnN0YW5jZSBpbiB0aGUgc2FtZSBzY29wZVwiLCAoKSA9PiB7XG5cdFx0XHRidWlsZGVyLnJlZ2lzdGVyUmVxdWVzdFNjb3BlZChEaXNwb3NhYmxlKTtcblx0XHRcdGNvbnN0IGNvbnRhaW5lciA9IGJ1aWxkZXIuYnVpbGQoKTtcblx0XHRcdGNvbnN0IGNoaWxkQSA9IGNvbnRhaW5lci5iZWdpblNjb3BlKGdldFJhbmRvbUludCgpLnRvU3RyaW5nKCkpO1xuXHRcdFx0Y29uc3Qgc2VydmljZUEgPSBjaGlsZEEucmVzb2x2ZShEaXNwb3NhYmxlKTtcblx0XHRcdGNvbnN0IHNlcnZpY2VCID0gY2hpbGRBLnJlc29sdmUoRGlzcG9zYWJsZSk7XG5cdFx0XHRleHBlY3Qoc2VydmljZUEpLnRvQmUoc2VydmljZUIpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgcmVzb2x2ZSBhIG5ldyBpbnN0YW5jZSBwZXIgc2NvcGVcIiwgKCkgPT4ge1xuXHRcdFx0YnVpbGRlci5yZWdpc3RlclJlcXVlc3RTY29wZWQoRGlzcG9zYWJsZSk7XG5cdFx0XHRjb25zdCBjb250YWluZXIgPSBidWlsZGVyLmJ1aWxkKCk7XG5cdFx0XHRjb25zdCBjaGlsZEEgPSBjb250YWluZXIuYmVnaW5TY29wZShnZW5lcmF0ZVNjb3BlSWQoKSk7XG5cdFx0XHRjb25zdCBzZXJ2aWNlQSA9IGNoaWxkQS5yZXNvbHZlKERpc3Bvc2FibGUpO1xuXHRcdFx0Y29uc3QgY2hpbGRCID0gY29udGFpbmVyLmJlZ2luU2NvcGUoZ2VuZXJhdGVTY29wZUlkKCkpO1xuXHRcdFx0Y29uc3Qgc2VydmljZUIgPSBjaGlsZEIucmVzb2x2ZShEaXNwb3NhYmxlKTtcblx0XHRcdGV4cGVjdChzZXJ2aWNlQSkubm90LnRvQmUoc2VydmljZUIpO1xuXHRcdH0pO1xuXHR9KTtcblxuXHRkZXNjcmliZShcImJlZ2luU2NvcGVcIiwgKCkgPT4ge1xuXHRcdGl0KFwic2hvdWxkIHN1cHBvcnQgbiBsZXZlbCBpc29sYXRlZCBzY29wZXNcIiwgKCkgPT4ge1xuXHRcdFx0YnVpbGRlci5yZWdpc3RlclJlcXVlc3RTY29wZWQoRGlzcG9zYWJsZSk7XG5cdFx0XHRjb25zdCBjb250YWluZXIgPSBidWlsZGVyLmJ1aWxkKCk7XG5cdFx0XHRjb25zdCBjaGlsZEEgPSBjb250YWluZXIuYmVnaW5TY29wZShnZW5lcmF0ZVNjb3BlSWQoKSk7XG5cdFx0XHRjb25zdCBnYW5kY2hpbGRBID0gY2hpbGRBLmJlZ2luU2NvcGUoZ2VuZXJhdGVTY29wZUlkKCkpO1xuXHRcdFx0Y29uc3Qgc2VydmljZUNoaWxkQSA9IGNoaWxkQS5yZXNvbHZlKERpc3Bvc2FibGUpO1xuXHRcdFx0Y29uc3Qgc2VydmljZUdhbmRjaGlsZEEgPSBnYW5kY2hpbGRBLnJlc29sdmUoRGlzcG9zYWJsZSk7XG5cdFx0XHRleHBlY3Qoc2VydmljZUNoaWxkQSkubm90LnRvQmUoc2VydmljZUdhbmRjaGlsZEEpO1xuXHRcdH0pO1xuXG5cdFx0aXQoXCJzaG91bGQgbm90IGRpc3Bvc2UgdGhlIGNoaWxkIHNjb3BlIGlmIHBhcmVudCBpcyBkaXNwb3NlZFwiLCAoKSA9PiB7XG5cdFx0XHRidWlsZGVyLnJlZ2lzdGVyUmVxdWVzdFNjb3BlZChEaXNwb3NhYmxlKTtcblx0XHRcdGNvbnN0IGNvbnRhaW5lciA9IGJ1aWxkZXIuYnVpbGQoKTtcblx0XHRcdGxldCBncmFuZENoaWxkOiBDcnVjaWJsZTtcblx0XHRcdHtcblx0XHRcdFx0dXNpbmcgY2hpbGQgPSBjb250YWluZXIuYmVnaW5TY29wZShnZW5lcmF0ZVNjb3BlSWQoKSk7XG5cdFx0XHRcdGdyYW5kQ2hpbGQgPSBjaGlsZC5iZWdpblNjb3BlKGdlbmVyYXRlU2NvcGVJZCgpKTtcblx0XHRcdH1cblx0XHRcdGV4cGVjdCgoKSA9PiBncmFuZENoaWxkLnJlc29sdmUoRGlzcG9zYWJsZSkpLm5vdC50b1Rocm93KCk7XG5cdFx0fSk7XG5cblx0XHRpdChcInNob3VsZCB0aHJvdyBpZiByZXNvbHZpbmcgc2luZ2xldG9uIG93bmVkIGJ5IHJvb3QgaWYgcm90byBzY29wZSBkaXNwb3NlZFwiLCAoKSA9PiB7XG5cdFx0XHRidWlsZGVyLnJlZ2lzdGVyU2luZ2xldG9uKFNpbmdsZXRvbik7XG5cdFx0XHRsZXQgY2hpbGQ6IExpZmV0aW1lU2NvcGU7XG5cdFx0XHR7XG5cdFx0XHRcdHVzaW5nIGNvbnRhaW5lciA9IGJ1aWxkZXIuYnVpbGQoKTtcblx0XHRcdFx0Y2hpbGQgPSBjb250YWluZXIuYmVnaW5TY29wZShnZW5lcmF0ZVNjb3BlSWQoKSk7XG5cdFx0XHR9XG5cblx0XHRcdGV4cGVjdCgoKSA9PiBjaGlsZC5yZXNvbHZlKFNpbmdsZXRvbikpLnRvVGhyb3coKTtcblx0XHR9KTtcblxuXHRcdGl0KFwic2hvdWxkIGRpc3Bvc2UgaWYgZXhjZXB0aW9uIGlzIHRocm93XCIsICgpID0+IHtcblx0XHRcdGJ1aWxkZXIucmVnaXN0ZXJSZXF1ZXN0U2NvcGVkKERpc3Bvc2FibGUpO1xuXHRcdFx0bGV0IGNvbnRhaW5lclJlZjogQ3J1Y2libGU7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR1c2luZyBjb250YWluZXIgPSBidWlsZGVyLmJ1aWxkKCk7XG5cdFx0XHRcdGNvbnRhaW5lclJlZiA9IGNvbnRhaW5lcjtcblx0XHRcdFx0dGhyb3cgXCJFUlJPUlwiO1xuXHRcdFx0fSBjYXRjaCB7fVxuXG5cdFx0XHRleHBlY3QoKCkgPT4gY29udGFpbmVyUmVmLnJlc29sdmUoRGlzcG9zYWJsZSkpLnRvVGhyb3coKTtcblx0XHR9KTtcblx0fSk7XG59KTtcblxuZnVuY3Rpb24gZ2VuZXJhdGVTY29wZUlkKCkge1xuXHRyZXR1cm4gZ2V0UmFuZG9tSW50KCkudG9TdHJpbmcoKTtcbn1cblxuZnVuY3Rpb24gZ2V0UmFuZG9tSW50KCkge1xuXHRjb25zdCBtaW4gPSBNYXRoLmNlaWwoMCk7XG5cdGNvbnN0IG1heCA9IE1hdGguZmxvb3IoMTBfMDAwKTtcblx0cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XG59XG4iXSwibmFtZXMiOlsiQ3J1Y2libGVCdWlsZGVyIiwiYmVmb3JlRWFjaCIsImRlc2NyaWJlIiwiZXhwZWN0IiwiaXQiLCJ2aSIsIkRpc3Bvc2FibGUiLCJTeW1ib2wiLCJkaXNwb3NlIiwiU2luZ2xldG9uIiwibm9uY2UiLCJnZXRSYW5kb21JbnQiLCJidWlsZGVyIiwiY2xlYXJBbGxNb2NrcyIsIkZBQ1RPUllfS0VZIiwiZXhwZWN0ZWQiLCJmaWVsZCIsImZhY3RvcnkiLCJyZWdpc3RlclJlcXVlc3RTY29wZWQiLCJjb250YWluZXIiLCJidWlsZCIsImFjdHVhbCIsInJlc29sdmUiLCJ0b0VxdWFsIiwic3B5T24iLCJwcm90b3R5cGUiLCJzY29wZSIsImJlZ2luU2NvcGUiLCJ0b0hhdmVCZWVuQ2FsbGVkIiwibm90IiwidG9UaHJvdyIsInJlZ2lzdGVyU2luZ2xldG9uIiwiY2hpbGQiLCJpbnN0MSIsImluc3QyIiwibWFudWFsSW5zdCIsInRvQmUiLCJjaGlsZEEiLCJ0b1N0cmluZyIsInNlcnZpY2VBIiwic2VydmljZUIiLCJnZW5lcmF0ZVNjb3BlSWQiLCJjaGlsZEIiLCJnYW5kY2hpbGRBIiwic2VydmljZUNoaWxkQSIsInNlcnZpY2VHYW5kY2hpbGRBIiwiZ3JhbmRDaGlsZCIsImNvbnRhaW5lclJlZiIsIm1pbiIsIk1hdGgiLCJjZWlsIiwibWF4IiwiZmxvb3IiLCJyYW5kb20iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsU0FBd0JBLGVBQWUsUUFBNEIsa0JBQXFCO0FBQ3hGLFNBQVNDLFVBQVUsRUFBRUMsUUFBUSxFQUFFQyxNQUFNLEVBQUVDLEVBQUUsRUFBRUMsRUFBRSxRQUFRLFNBQVM7QUFFOUQsTUFBTUM7SUFDRSxDQUFDQyxPQUFPQyxPQUFPLENBQUMsR0FBRztRQUN6QixJQUFJLENBQUNBLE9BQU87SUFDYjtJQUNPQSxVQUFVLENBQUM7QUFDbkI7QUFFQSxNQUFNQztJQUNFQyxNQUFjO0lBQ3JCLGFBQXFCO1FBQ3BCLElBQUksQ0FBQ0EsS0FBSyxHQUFHQztJQUNkO0FBQ0Q7QUFFQVQsU0FBUyxtQkFBbUI7SUFDM0IsSUFBSVU7SUFDSlgsV0FBVztRQUNWSSxHQUFHUSxhQUFhO1FBQ2hCRCxVQUFVLElBQUlaO0lBQ2Y7SUFFQUUsU0FBUyxhQUFhO1FBRXJCLE1BQU1ZLGNBQWM7UUFDcEIsK0NBQStDO1FBQy9DLGdFQUFnRTtRQUNoRVYsR0FBRyxrQ0FBa0M7WUFDcEMsTUFBTVEsVUFBVSxJQUFJWjtZQUNwQixNQUFNZSxXQUE0QjtnQkFBRUMsT0FBTztZQUFhO1lBQ3hELE1BQU1DLFVBQVUsSUFBTUY7WUFDdEJILFFBQVFNLHFCQUFxQixDQUFrQkosYUFBYUc7WUFDNUQsTUFBTUUsWUFBWVAsUUFBUVEsS0FBSztZQUMvQixNQUFNQyxTQUFTRixVQUFVRyxPQUFPLENBQUNSO1lBQ2pDWCxPQUFPa0IsUUFBUUUsT0FBTyxDQUFDUjtRQUN4QjtJQUNEO0lBRUFiLFNBQVMsV0FBVztRQUNuQixNQUFNTSxVQUFVSCxHQUFHbUIsS0FBSyxDQUFDbEIsV0FBV21CLFNBQVMsRUFBRTtRQUUv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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|